filtered_df = lang_df[(lang_df['DevType'] != 'Developer, full-stack')&(lang_df['DevType'] != 'Developer, back-end')]
grouped_df = filtered_df.groupby(['LanguageHaveWorkedWith','DevType'])['ResponseId'].count().reset_index(name='Count')
grouped_df_sorted = grouped_df.sort_values(['LanguageHaveWorkedWith','Count'],ascending=[True,False])
top3_devtypes_by_lang = grouped_df_sorted.groupby('LanguageHaveWorkedWith').head(3)
top3_devtypes_by_lang_sorted = top3_devtypes_by_lang.sort_values(['LanguageHaveWorkedWith','Count'],ascending=[False,True]).reset_index(drop=True)
total_count_by_lang = grouped_df.groupby('LanguageHaveWorkedWith')['Count'].sum().reset_index(name='TotalCount')
top3_devtypes_by_lang_with_total = pd.merge(top3_devtypes_by_lang_sorted,total_count_by_lang,on='LanguageHaveWorkedWith')
top3_devtypes_by_lang_with_total['Percentage'] = (top3_devtypes_by_lang_with_total['Count']/top3_devtypes_by_lang_with_total['TotalCount']) * 100
top3_devtypes_by_lang_with_total
y_positions = []
current_language = None
for idx,row in top3_devtypes_by_lang_sorted.iterrows():
if current_language != row['LanguageHaveWorkedWith']:
current_language = row['LanguageHaveWorkedWith']
y_positions.append((current_language,idx+2))
y_labels, y_ticks = zip(*y_positions)
unique_devtypes = top3_devtypes_by_lang['DevType'].unique()
colors = plt.cm.viridis(np.linspace(0,1,len(unique_devtypes)))
color_map = {devtype: color for devtype,color in zip(unique_devtypes, colors)}
plt.figure(figsize=(15,30))
top3_dev_bars = plt.barh(y=top3_devtypes_by_lang_sorted.index,
width=top3_devtypes_by_lang_sorted['Count'],
color=[color_map.get(devtype)for devtype in top3_devtypes_by_lang_sorted['DevType']])
plt.yticks(y_ticks,y_labels)
for bar, (devtype,percentage) in zip(top3_dev_bars,top3_devtypes_by_lang_with_total[['DevType','Percentage']].values):
plt.text(x=bar.get_width(),y=bar.get_y()+bar.get_height()/2,s=f'{devtype} ({percentage:.2f}%)',va='center',ha='left',fontsize=10)
plt.legend([plt.Rectangle(xy=(0,0),width=1,height=1,color=color_map[devtype])for devtype in unique_devtypes],
unique_devtypes,
title="DevTypes",
loc='upper right')
plt.show()
comp_sr = comp_df['CompTotalKrw(만원)']
plt.figure(figsize=(10,5))
plt.hist(comp_sr,bins=50,color='teal',edgecolor='black')
plt.ticklabel_format(style='plain',axis='x')
plt.title('개발자 연봉 분포(KRW)',fontsize=15, fontweight='bold')
plt.xlabel('연봉(만원)',fontweight='bold')
plt.ylabel('응답자 수',fontweight='bold')
plt.grid(True)
plt.show()
log_comp_sr = np.log1p(comp_sr)
plt.figure(figsize=(10,5))
plt.hist(log_comp_sr,bins=50,color='teal',edgecolor='black')
plt.ticklabel_format(style='plain',axis='x')
plt.title('개발자 연봉 분포(KRW) - 로그 변환',fontsize=15, fontweight='bold')
plt.xlabel('연봉(만원)',fontweight='bold')
plt.ylabel('응답자 수',fontweight='bold')
plt.grid(True)
plt.show()
merged_df = pd.merge(lang_df,comp_df[['ResponseId','CompTotalKrw(만원)']],on='ResponseId',how='inner')
merged_df.info()
median_salary_by_lang = merged_df.groupby('LanguageHaveWorkedWith')[COMP_KRW].median().sort_values(ascending=True).reset_index()
draw_median_salary_barh(df=median_salary_by_lang,target='LanguageHaveWorkedWith',title='개발 언어별 연봉 중간값',ylabel='개발언어')
draw_salary_boxplot(df=merged_df,target='LanguageHaveWorkedWith',title='언어별 연봉 분포(KRW) - 이상치 제외',ylabel='개발언어')
median_salary_by_devtype = merged_df.groupby('DevType')[COMP_KRW].median().sort_values(ascending=True).reset_index()
draw_median_salary_barh(df=median_salary_by_devtype,target='DevType',title='개발 직군별 연봉 중간값',ylabel='개발 직군')
draw_salary_boxplot(df=merged_df,target='DevType',title='직군별 연봉 분포(KRW)',ylabel='개발 직군',showfliers=False)
그래프 그릴때 사용된 함수
standard_figsize = (20,20)
def draw_median_salary_barh (df,target,title,ylabel,figsize=standard_figsize):
plt.figure(figsize=figsize)
plt.barh(y=df[target],width=df[COMP_KRW])
plt.xlabel('연봉 중간값 (KRW,만원)',fontweight='bold')
plt.ylabel(ylabel,fontweight='bold')
plt.title(title,fontsize=15,fontweight='bold')
plt.xticks(np.arange(0,df[COMP_KRW].values.max()+1000,1000),rotation=45)
plt.grid(axis='x',linestyle='--', alpha=0.7)
plt.show()
def draw_salary_boxplot (df,target,title,ylabel,showfliers=False,figsize=standard_figsize):
label_values = df[target].dropna().unique()
plt.figure(figsize=figsize)
box = plt.boxplot([df[df[target]==value][COMP_KRW] for value in label_values],
vert=False,
showfliers=showfliers,
showmeans=True,
meanline=True,
labels=label_values,
patch_artist=True,
boxprops={'facecolor':'teal'})
plt.setp(box['medians'],color='white')
plt.setp(box['means'],color='yellow', linewidth=1)
plt.title(title,fontsize=15,fontweight='bold')
plt.xlabel('연봉(만원)',fontweight='bold')
plt.ylabel(ylabel,fontweight='bold')
plt.ticklabel_format(style='plain', axis='x')
plt.show()
축구 선수 데이터 분석
import pandas as pd
players_path = './data/players.csv'
players_valuation_path = './data/player_valuations.csv'
players = pd.read_csv(players_path)
players_valuation = pd.read_csv(players_valuation_path)
print(players.info())
print(players_valuation.info())
display(players.head())
display(players_valuation.head())
print(players.columns)
print(players_valuation.columns)
columns = ['player_id', 'first_name', 'last_name', 'name', 'last_season', 'current_club_id', 'player_code', 'country_of_birth', 'city_of_birth', 'country_of_citizenship', 'date_of_birth', 'sub_position', 'position']
players = players[columns]
print(players.isna().sum(), '\n')
print(players_valuation.isna().sum())
players[players['country_of_citizenship'].isna()]
players[players['date_of_birth'].isna()].head()
players.dropna(inplace = True)
print(players.isna().sum())