개발언어 사용자 분석 - 데이터 시각화 3

dpwl·2024년 6월 22일

Data Analysis with Python

목록 보기
14/48

1. 데이터 시각화

11)

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)}
color_map
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=[colaor_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()

np.linspace() 함수는 NumPy에서 사용되는 함수 중 하나로, 지정된 범위 내에서 등간격으로 일정 개수의 값을 생성한다.

np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None, axis=0)
# start: 시작 값
# stop: 종료 값
# num: 생성할 값의 개수 (기본값은 50)
# endpoint: True로 설정하면 종료 값도 포함된다. False로 설정하면 종료 값은 포함되지 않습니다. (기본값은 True)
# retstep: True로 설정하면 간격(step) 반환 (기본값은 False)
# dtype: 배열의 데이터 타입 지정 (기본값은 None)
# axis: 연산을 수행할 축 지정 (기본값은 0)

np.linspace(0, 1, len(unique_devtypes))와 같이 사용하면 0부터 1까지의 범위에서 len(unique_devtypes) 개의 값이 생성된다. 이 값들은 시작과 끝을 포함하며, 등간격으로 배치됩니다. 따라서 이 함수는 주어진 범위 내에서 일정 개수의 등간격 값을 생성하는 데 사용됩니다.

12)

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

  • plt.hist() 함수: 히스토그램을 그린다.

    • bins 매개변수: 히스토그램의 막대 개수를 설정한다.
    • color 매개변수: 히스토그램의 색상을 지정한다.
    • edgecolor 매개변수는 히스토그램 막대의 테두리 색상을 지정한다.
  • plt.ticklabel_format(style='plain', axis='x'): x축의 숫자 형식을 일반 형식으로 설정한다. 이렇게 하면 숫자가 지수 형식이 아닌 일반 숫자로 표시된다.

plt.ticklabel_format() 함수는 Matplotlib에서 눈금의 숫자 형식을 설정하는 함수이다. 이 함수를 사용하면 그래프의 x축 또는 y축에 표시되는 숫자의 형식을 지수 형식(exponential format)이나 일반 형식(plain format) 등으로 조절할 수 있다.

plt.ticklabel_format(style='스타일', axis='축')
# style: 눈금의 숫자 형식을 지정한다. 'sci'는 지수 형식을, 'plain'은 일반 형식을 의미한다.
# axis: 형식을 적용할 축을 지정한다. 'x'는 x축을, 'y'는 y축을 의미한다.

참고:

  • 지수 연산어떤 값을 특정 지수로 거듭제곱하는 연산을 말한다. 이 연산은 대체로 데이터를 빠르게 증가시키거나 줄이는 데 사용된다.

예를 들어, 2의 3승(2^3)은 다음과 같이 계산된다.

2^3 = 2x2x2 = 8

  • 밑(base): 2

  • 지수(exponent): 3

  • 로그 연산지수 연산의 역과정으로, 어떤 값을 특정 밑(base)의 로그 값으로 변환하는 연산을 말한다. 로그를 사용하면 데이터의 범위를 줄이고 큰 값들을 작게 만들어준다.

예를 들어, 10을 밑으로 1000의 로그를 계산하면 다음과 같다.

log10(1000) = 3

즉, 10^3 = 1000 이므로 log10(1000) = 3이 된다.

이러한 연산을 통해 데이터의 범위를 줄이고 분석을 더 쉽게 할 수 있다. 특히 데이터의 분포가 한쪽으로 치우쳐져 있거나 값의 범위가 매우 넓을 때 유용하다.

아래는 이상치를 제거하지 않고 로그 변환을 통해 그래프 그리는 방법이다.

np.log1p()
# log1p(x) == log(x+1)

np.log1p() 함수는 주어진 배열 또는 값에 대해 자연로그(로그의 밑이 자연상수 e인 로그)를 취한 후 1을 더한 값을 반환한다. 이 함수는 주로 데이터의 로그 변환에 사용되며, 데이터에 1을 더해줌으로써 0 또는 음수인 경우에도 로그를 취할 수 있도록 한다.

로드 변환은 데이터의 분포를 정규분포에 가깝게 만들거나 데이터의 범위를 줄이는 등의 목적으로 사용된다. 특히 이상치가 있는 경우 로그 변환을 적용하면 이상치의 영향을 줄일 수 있다.

예를 들어, 아래는 주어진 데이터에 로그 변환을 적용하여 그래프를 그리는 코드이다.

import numpy as np
import matplotlib.pyplot as plt

# 주어진 데이터 (예: 연봉 데이터)
data = [10000, 20000, 30000, 40000, 50000, 60000, 70000, 80000, 90000, 100000]

# 데이터에 로그 변환 적용
transformed_data = np.log1p(data)

# 그래프 그리기
plt.hist(transformed_data, bins=10, color='skyblue', edgecolor='black')
plt.title('로그 변환된 데이터의 분포', fontsize=15)
plt.xlabel('로그(연봉)', fontsize=12)
plt.ylabel('빈도', fontsize=12)
plt.grid(True)
plt.show()

13)

log_comp_sr = np.log1p(comp_sr)

plt.figure(figsize=(10, 5))

plt.hist(log_comp_sr, bins=50, color='teal', edgecolor='black')

plt.title('개발자 연봉 분포(KRW) - 로그 변환', fontsize=15, fontweight='bold')
plt.xlabel('연봉(만원)', fontweight='bold')
plt.ylabel('응답자 수', fontweight='bold')
plt.grid(True)
plt.show()

plt.grid(True)는 그래프에 격자 라인을 표시하는 역할을 한다. 격자 라인은 주로 데이터의 분포를 시각적으로 파악하는 데 도움이 된다.

예를 들어, 히스토그램의 경우 데이터의 분포를 보다 명확하게 확인할 수 있다. 격자 라인이 있으면 각 막대의 높이를 더 정확하게 읽을 수 있다.

14)

merged_df = pd.merge(lang_df, comp_df[['Id', 'TotalKrw(만원)']], on='Id', how='inner')
  • pd.merge(): 두 데이터프레임을 병합하는 함수이다.
  • on 매개변수: 두 데이터프레임을 합칠 때 기준이 되는 열을 지정한다.
  • how 매개변수: 병합 방법을 지정한다.
    • 'left': 왼쪽 데이터프레임의 모든 행을 유지하면서 오른쪽 데이터프레임과 병합한다. 오른쪽 데이터프레임에 해당하는 값이 없는 경우에는 NaN으로 채운다.
    • 'right': 오른쪽 데이터프레임의 모든 행을 유지하면서 왼쪽 데이터프레임과 병합한다. 왼쪽 데이터프레임에 해당하는 값이 없는 경우에는 NaN으로 채운다.
    • 'inner': 교집합을 수행하여 두 데이터프레임에서 공통된 값만을 병합한다.
    • 'outer': 합집합을 수행하여 두 데이터프레임의 모든 값을 포함한다. 공통된 값이 없는 경우에는 NaN으로 채운다.

15)

plt.figure(figsize=(10, 20))

plt.barh(y=median_salary_by_lang['LanguageHaveWorkedWith'], width=median_salary_by_lang[COMP_KRW])

plt.title('개발 언어별 연봉 중간값', fontsize=15, fontweight='bold')
plt.xlabel('연봉 중간값 (KRW, 만원)', fontweight='bold')
plt.ylabel('개발 언어', fontweight='bold')
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()

위의 코드를 그대로 함수화 작업을 하면 다음과 같이 나타낼 수 있다.

def draw_median_salary_barh(df, target, title, ylabel, figsize=(10, 10)):
    plt.figure(figsize=figsize)
    plt.barh(y=df[target], width=df[COMP_KRW])

    plt.title(title, fontsize=15, fontweight='bold')
    plt.xlabel('연봉 중간값 (KRW, 만원)', fontweight='bold')
    plt.ylabel(ylabel, 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()

함수화된 코드를 사용하면 코드를 재사용하기 쉽고 가독성도 높일 수 있다.

profile
거북선통통통통

0개의 댓글