첫 번째 코드 블록은 개발 언어 빈도(lang_frequency)와 선호 언어 빈도(prflang_frequency)를 시각화한 예시입니다.
python
복사
plt.figure(figsize=standard_figsize)
plt.barh(width=lang_frequency.values,
y=np.arange(len(lang_frequency)),
tick_label=lang_frequency.index,
alpha=0.7)
for idx, lang in enumerate(lang_frequency):
prflang_count = prflang_frequency.loc[lang]
plt.barh(y=idx, width=prflang_count, color='salmon')
plt.barh를 사용하여 가로 막대(bar)를 시각화합니다.alpha=0.7로 막대의 투명도를 조절하여 데이터가 겹칠 때도 비교가 쉽게 만들었습니다.lang_frequency)와 선호 언어 빈도(prflang_frequency)를 겹쳐서 시각화함으로써, 한눈에 어떤 언어가 많이 사용되고 어떤 언어가 선호되는지 비교할 수 있습니다.DATA_DEVS) 필터링 후 상위 10개 언어 시각화다음 코드에서는 데이터 분석 관련 직군에 속하는 개발자의 응답만 필터링하여, 이들이 사용하는 언어의 상위 10개를 뽑아 시각화합니다.
python
복사
data_lang_df = lang_df[lang_df['DevType'].isin(DATA_DEVS)]
data_prflang_df = prflang_df[lang_df['DevType'].isin(DATA_DEVS)]
data_lang_frequency = data_lang_df['LanguageHaveWorkedWith'].value_counts(ascending=True)
data_prflang_frequency = data_prflang_df['LanguageHaveWorkedWith'].value_counts(ascending=True)
data_top10_lang = data_lang_frequency.nlargest(10).sort_values(ascending=True)
data_top10_prflang = data_prflang_frequency.nlargest(10).sort_values(ascending=True)
fig, ax = plt.subplots(1,2,figsize=(20,10))
ax[0].barh(width=data_top10_lang.values, y=data_top10_lang.index)
ax[0].set_title('데이터 관련 직군')
ax[1].barh(width=data_top10_prflang.values, y=data_top10_prflang.index)
ax[1].set_title('데이터 관련 직군')
plt.show()
lang_df와 prflang_df에서 데이터 직군에 해당하는 행만 추출(isin(DATA_DEVS))한 뒤, value_counts()로 언어 사용 빈도를 구했습니다..nlargest(10)을 통해 가장 많이 사용(또는 선호)되는 10개 언어를 추출했습니다.ax[0]에는 데이터 직군이 실제로 많이 사용하는 언어 상위 10개를, ax[1]에는 데이터 직군이 선호하는 언어 상위 10개를 시각화했습니다.데이터 관련 직군(DATA_DEVS) 각각에 대해 상위 10개 언어 사용 빈도를 세분화하여 시각화했습니다.
python
복사
plt.figure(figsize=standard_figsize)
for idx, dev_type in enumerate(DATA_DEVS):
filtered_data_lang_df = data_lang_df[data_lang_df['DevType']==dev_type]
data_lang_frequency = filtered_data_lang_df['LanguageHaveWorkedWith'].value_counts()
data_lang_frequency_top10 = data_lang_frequency[data_lang_frequency.index.isin(data_top10_lang.index)]
values = [data_lang_frequency_top10[lang] for lang in data_top10_lang.index]
plt.bar(height=values, x=data_top10_lang)
plt.show()
DATA_DEVS 리스트에 있는 각 직군별로 필터링한 뒤, 해당 직군에서 상위 10개 언어가 얼마나 사용되는지를 막대 그래프 형태로 그리고 있습니다.data_lang_frequency_top10에는 이미 추출해둔 data_top10_lang.index만 필터링하여, 흔히 많이 사용되는 10개 언어가 실제 각 직군에서 몇 건씩 있는지 비교할 수 있습니다.plt.subplot 또는 plt.bar(..., position=..., width=...) 등을 활용).이번에는 언어별로 어떤 직군이 많이 포함되는지를 살펴봅니다. 특정 직군(예: 풀스택, 백엔드)은 제외한 뒤, 언어와 직군의 쌍으로 그룹화하여 언어별 Top 3 직군을 분석했습니다.
python
복사
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)
LanguageHaveWorkedWith)와 직군(DevType)**을 기준으로 ResponseId(응답 수)를 집계(count)하여, 각 언어를 사용하는 개발자가 어떤 직군인지 함께 알 수 있게 합니다.ascending=[True, False])에 따라 언어별로 Count가 높은 직군부터 볼 수 있도록 하였습니다.grouped_df_sorted.groupby('LanguageHaveWorkedWith').head(3)는 언어별로 상위 3개 직군을 뽑아냅니다.이후, 언어별로 추출한 직군 Top3를 시각화하기 위해 막대그래프를 그립니다.
python
복사
...
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))
...
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']])
y_positions는 언어별로 새로운 그룹이 시작되는 y축 위치를 설정하기 위해 사용합니다.plt.barh로 막대를 그리고, 막대 끝부분에 텍스트(DevType (비율 %))를 표시하여 직군과 해당 직군의 언어 비율 정보를 함께 보여줍니다.plt.legend를 사용해 막대의 색상을 직군별로 구분하여 표시할 수 있습니다.이제 개발자 연봉 데이터를 comp_df라는 별도 데이터프레임으로부터 가져와 분석합니다. 연봉은 CompTotalKrw(만원) 열에 있으며, 아래 코드를 통해 연봉의 전체 분포를 먼저 살펴봅니다.
python
복사
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('개발자 연봉 분포')
plt.show()
plt.hist로 50구간(bins=50)으로 나누어 개발자 연봉이 어떻게 분포되는지 알 수 있습니다.np.log1p)을 통해 분포를 보다 정규분포와 유사한 형태로 만들 수도 있습니다.python
복사
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('개발자 연봉 분포 (로그 변환)')
plt.show()
연봉(comp_df)과 언어 데이터(lang_df)를 ResponseId 기준으로 병합(pd.merge)하여 언어별 연봉 통계를 구할 수 있습니다.
python
복사
merged_df = pd.merge(lang_df, comp_df[['ResponseId', 'CompTotalKrw(만원)']], on='ResponseId', how='inner')
median_salary_by_lang = merged_df.groupby('LanguageHaveWorkedWith')[COMP_KRW].median().sort_values(ascending=True).reset_index()
python
복사
plt.figure(figsize=standard_figsize)
plt.barh(y=median_salary_by_lang['LanguageHaveWorkedWith'], width=median_salary_by_lang[COMP_KRW])
plt.xlabel('연봉 중간값')
plt.ylabel('개발 언어')
plt.title('개발 언어별 연봉 중간값')
plt.xticks(np.arange(0, median_salary_by_lang[COMP_KRW].values.max()+1000, 1000), rotation=45)
plt.grid(axis='x', linestyle='--', alpha=0.7)
plt.show()
python
복사
unique_lang = merged_df['LanguageHaveWorkedWith'].dropna().unique()
plt.figure(figsize=standard_figsize)
box = plt.boxplot(
[merged_df[merged_df['LanguageHaveWorkedWith'] == lang][COMP_KRW] for lang in unique_lang],
vert=False,
showfliers=False,
showmeans=True,
meanline=True,
labels=unique_lang,
patch_artist=True,
boxprops={'facecolor':'teal'}
)
plt.setp(box['medians'], color='white')
plt.setp(box['means'], color='yellow', linewidth=1)
plt.show()
vert=False로 설정하여 가로 방향 박스플롯을 그리고, 각 언어 이름(labels=unique_lang)을 y축 레이블로 설정했습니다.showfliers=False로 이상치(Outliers) 표시를 생략할 수 있습니다(이상치가 너무 많아 가독성이 떨어질 때 사용).마지막으로, 직군(DevType) 별로 연봉을 분석합니다.
python
복사
median_salary_by_devtype = merged_df.groupby('DevType')[COMP_KRW].median().sort_values(ascending=True).reset_index()
python
복사
draw_median_salary_barh(df=median_salary_by_devtype, target='DevType', title='직군별 연봉', ylabel='개발언어')
python
복사
draw_salary_boxplot(df=merged_df, target='DevType', title='연봉 분포', ylabel='개발언어', showfliers=False)
lang_frequency와 prflang_frequency 간의 비교로, 개발자들이 실제 많이 사용하는 언어와 선호하는 언어의 차이를 알 수 있었습니다.DATA_DEVS)만 필터링하여 사용 언어 상위 10개를 뽑아 보면, 주로 Python, SQL, R 등이 상위권에 자리할 가능성이 높습니다.이렇게 개발 언어, 선호 언어, 직군, 그리고 연봉을 종합적으로 분석하면,
스터디나 프로젝트 때에는 이 과정을 확장하여, 프론트엔드, 백엔드, 풀스택, 모바일, 데브옵스 등 더 다양한 직군으로 세분화하거나, 경력(Experience) 정보를 추가로 분석해보면 더욱 실질적인 인사이트를 얻을 수 있을 것입니다.
plt.barh vs plt.bar: 데이터 종류에 따라 가독성을 높이기 위해 가로/세로 막대 그래프를 선택합니다. 긴 라벨(예: 언어 이름)이 많을 때는 가로 막대가 편합니다.groupby)와 집계 함수(count, median, sum): Pandas에서 데이터 분석 시 가장 자주 쓰이는 방법 중 하나로, 차원(컬럼)을 기준으로 데이터 분류하고, 집계 값(합계, 평균, 중앙값, 건수 등)을 구해볼 수 있습니다.np.log1p): 연봉처럼 극단적으로 큰 값이 혼재된 분포를 시각화하거나 통계 분석할 때, 데이터의 치우침(skewness)을 줄여 비교 가능성을 높이기 위해 자주 사용됩니다.