실습 - 데이터 시각화 - 언어별 주요 직군

Ryan·2025년 1월 24일

Python/Pandas

목록 보기
5/23

1. 개발 언어 빈도 분석 & 선호 언어 데이터 시각화

첫 번째 코드 블록은 개발 언어 빈도(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)를 겹쳐서 시각화함으로써, 한눈에 어떤 언어가 많이 사용되고 어떤 언어가 선호되는지 비교할 수 있습니다.

2. 데이터 직군(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_dfprflang_df에서 데이터 직군에 해당하는 행만 추출(isin(DATA_DEVS))한 뒤, value_counts()로 언어 사용 빈도를 구했습니다.
  • .nlargest(10)을 통해 가장 많이 사용(또는 선호)되는 10개 언어를 추출했습니다.
  • ax[0]에는 데이터 직군이 실제로 많이 사용하는 언어 상위 10개를, ax[1]에는 데이터 직군이 선호하는 언어 상위 10개를 시각화했습니다.

3. 데이터 직군별 상세 비교

데이터 관련 직군(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=...) 등을 활용).

4. 언어별 주요 직군 분석

이번에는 언어별로 어떤 직군이 많이 포함되는지를 살펴봅니다. 특정 직군(예: 풀스택, 백엔드)은 제외한 뒤, 언어와 직군의 쌍으로 그룹화하여 언어별 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를 사용해 막대의 색상을 직군별로 구분하여 표시할 수 있습니다.

5. 연봉 분포 분석

이제 개발자 연봉 데이터를 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)으로 나누어 개발자 연봉이 어떻게 분포되는지 알 수 있습니다.
  • 대체로 연봉 분포가 오른쪽 꼬리가 긴(right-skewed) 형태일 수 있어, 로그 변환(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()

6. 언어별 연봉 중간값 & 분포

연봉(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()

6.1 언어별 중간값

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()
  • 언어별 연봉의 중앙값을 가로 막대 그래프로 시각화했습니다.
  • 다소 간단한 통계이지만, 각 언어를 사용하는 개발자들의 연봉 수준을 비교하는 기초 지표가 됩니다.

6.2 언어별 연봉 분포(Boxplot)

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()
  • *박스플롯(Boxplot)을 이용해, 각 언어를 사용하는 개발자 연봉의 분포(사분위수, 최솟값, 최댓값, 중앙값, 평균 등)**를 한눈에 파악할 수 있습니다.
  • vert=False로 설정하여 가로 방향 박스플롯을 그리고, 각 언어 이름(labels=unique_lang)을 y축 레이블로 설정했습니다.
  • showfliers=False이상치(Outliers) 표시를 생략할 수 있습니다(이상치가 너무 많아 가독성이 떨어질 때 사용).

7. 직군별 연봉 중간값 & 분포

마지막으로, 직군(DevType) 별로 연봉을 분석합니다.

python
복사
median_salary_by_devtype = merged_df.groupby('DevType')[COMP_KRW].median().sort_values(ascending=True).reset_index()

7.1 직군별 연봉 중간값

python
복사
draw_median_salary_barh(df=median_salary_by_devtype, target='DevType', title='직군별 연봉', ylabel='개발언어')
  • 직군별 중앙값을 막대그래프로 그려서, 어떤 직군의 중앙값이 상대적으로 높은지 확인합니다.

7.2 직군별 연봉 분포(Boxplot)

python
복사
draw_salary_boxplot(df=merged_df, target='DevType', title='연봉 분포', ylabel='개발언어', showfliers=False)
  • 박스플롯을 통해 직군별 연봉 분포(사분위, 평균, 중앙값 등)가 어떻게 다른지 확인할 수 있습니다.

결론 및 정리

  1. 언어 사용 & 선호도
    • lang_frequencyprflang_frequency 간의 비교로, 개발자들이 실제 많이 사용하는 언어선호하는 언어의 차이를 알 수 있었습니다.
  2. 데이터 분석 직군
    • 데이터 직군(DATA_DEVS)만 필터링하여 사용 언어 상위 10개를 뽑아 보면, 주로 Python, SQL, R 등이 상위권에 자리할 가능성이 높습니다.
    • 각 데이터 직군별로 선호 언어, 실제 사용 언어 빈도를 함께 보면, 전문성이나 도구별 필요성 등을 파악할 수 있습니다.
  3. 언어별 주요 직군
    • 특정 언어가 주로 사용되는 직군은 무엇인지, 각 언어별로 상위 3개 직군을 골라봄으로써, 언어-직군 간 관계를 빠르게 알 수 있습니다.
    • 예: JavaScript가 웹 프론트엔드 쪽에서 많이 쓰이는지, Python이 데이터 분석이나 AI, 머신러닝 관련 직군에서 많이 쓰이는지를 확인 가능.
  4. 연봉 분석
    • 전체 연봉 분포는 오른쪽 꼬리가 긴 형태(몇몇 고연봉으로 인한 분포의 치우침)가 있을 수 있으며, 로그 변환으로 이를 시각화할 수 있습니다.
    • 언어별/직군별로 중앙값과 박스플롯을 살펴보면, 어떤 언어 혹은 직군이 상대적으로 연봉이 높은 경향이 있는지를 알 수 있습니다.

이렇게 개발 언어, 선호 언어, 직군, 그리고 연봉을 종합적으로 분석하면,

  • 현재 시장에서 어떤 언어와 직군이 주류인지,
  • 데이터 직군처럼 특정 영역에서 중요한 언어가 무엇인지,
  • 연봉 분포가 어떤 형태로 나타나며, 특정 기술스택에서 연봉이 더 높은 경향이 있는지등을 파악할 수 있습니다.

스터디나 프로젝트 때에는 이 과정을 확장하여, 프론트엔드, 백엔드, 풀스택, 모바일, 데브옵스 등 더 다양한 직군으로 세분화하거나, 경력(Experience) 정보를 추가로 분석해보면 더욱 실질적인 인사이트를 얻을 수 있을 것입니다.


참고 팁

  • plt.barh vs plt.bar: 데이터 종류에 따라 가독성을 높이기 위해 가로/세로 막대 그래프를 선택합니다. 긴 라벨(예: 언어 이름)이 많을 때는 가로 막대가 편합니다.
  • 그룹화(groupby)와 집계 함수(count, median, sum): Pandas에서 데이터 분석 시 가장 자주 쓰이는 방법 중 하나로, 차원(컬럼)을 기준으로 데이터 분류하고, 집계 값(합계, 평균, 중앙값, 건수 등)을 구해볼 수 있습니다.
  • 로그 변환(np.log1p): 연봉처럼 극단적으로 큰 값이 혼재된 분포를 시각화하거나 통계 분석할 때, 데이터의 치우침(skewness)을 줄여 비교 가능성을 높이기 위해 자주 사용됩니다.
  • 박스플롯(Boxplot): 어떤 범위의 값들이 많이 분포하는지, 이상치(outlier) 가 있는지 등을 한 번에 파악하는 데 유용합니다.
  • 막대그래프 레이블 및 범례 처리: 색상, 라벨, 범례(legend)를 활용해 가독성을 높일 수 있습니다.

0개의 댓글