7-1. 한국복지패널 데이터 분석(1)

🔗 'Do it! 쉽게 배우는 파이썬 데이터 분석' 책을 기반으로 JupyterLab 환경에서 학습한 내용입니다 _φ(๑╹╹๑)

 

📌 데이터 분석 준비


  • 2020년에 발간된 한국복지패널 데이터 다운로드
  • 아나콘다 프롬프트에 pip install pyreadstat 명령어를 입력하여 pyreadstat 패키지 설치
    • pyreadstat 패키지: pandas 패키지로 통계 분석 소프트웨어(SPSS, SAS, STAT 등)의 데이터 파일을 불러올 수 있도록 하는 패키지
    • pyreadstat 패키지 설치가 필요한 이유: 한국복지패널 데이터는 통계 분석 소프트웨어인 SPSS 전용 파일
  • 데이터를 불러온 후, 코드북을 참고하여 변수명을 변경
    • 코드북: 데이터의 특징을 설명해 놓은 자료로, 코드로 된 변수명과 값의 의미가 설명되어 있음

분석에 사용할 변수에 대한 코드북 내용 정리본

# 사용할 패키지 로드
import pandas as pd
import numpy as np
import seaborn as sns
# 데이터 불러오기
raw_welfare = pd.read_spss('Koweps_hpwc14_2019_beta2.sav')
# 원본데이터 유지하고 분석하기 위한 데이터 복사
welfare = raw_welfare.copy()

# 변수명 변경
welfare = welfare.rename(columns = {'h14_g3': 'sex',
                                   'h14_g4': 'birth',
                                   'h14_g10': 'marriage_type',
                                   'h14_g11': 'religion',
                                   'p1402_8aq1': 'income',
                                   'h14_eco9': 'code_job',
                                   'h14_reg7': 'code_region'})

 

 

 

📌 데이터 분석 절차


  1. 사용할 변수 검토
    1. 변수 타입 확인: dtypes 활용
    2. 전처리 전략을 수립하기 위해 값의 특징과 이상치/극단치 확인: 범주형 자료인 경우 value_counts(), 연속형 자료인 경우 describe() 함수 활용 
    3. 결측치 확인: isna().sum() 함수 활용
  2. 변수 전처리
    1. 분석 과정에서 다루기 편하게 변경
    2. 이상치/극단치를 결측치로 대체
  3. 결측 행을 제거한 후, 변수 간의 관계 분석

 

 

 

📌성별에 따른 월급 차이


  • 성별 변수 검토 및 전처리
# 타입 확인
welfare['sex'].dtypes

# 값의 특징 및 이상치 확인 (1: 남자, 2: 여자, 9: 모름/무응답)
welfare['sex'].value_counts()

"""
결과 해석
1. 값이 1, 2로만 구성되어 있어 이상치 존재하지 않는다.
2. 값에 9가 존재하는 경우, 분석에서 제외해야 하므로 아래 코드를 통해 결측치로 변경해야 한다.
welfare['sex'] = np.where(welfare['sex'] == 9, np.nan, welfare['sex'])
"""

# 결측치 확인
welfare['sex'].isna().sum() # 결과: 결측치 존재 X

# 값의 의미를 이해하기 쉽도록 변수 값 1인 경우 male로 2인 경우 female로 변경 (값 의미: 코드북 참고)
welfare['sex'] = np.where(welfare['sex'] == 1, 'male', 'female')

# 값 변경 확인
welfare['sex'].value_counts()

 

  • 월급(일한 달의 월 평균 임금) 변수 검토 및 전처리
# 타입 확인
welfare['income'].dtypes

# 값의 특징 및 이상치/극단치 확인
welfare['income'].describe()

"""
결과 해석
1. 평균값(mean) 268만원, 중앙값(50%) 220만원으로 전반적으로 낮은 값 쪽으로 치우쳐져 있다.
2. 양 극단 25% 씩을 제외한 나머지 보통의 50%가 150 ~ 345만원에 분포한다.
3. 0 ~ 1892만원으로 구성되어 있어 모름/무응답에 해당하는 9999는 존재하지 않는다.
4. 근로자들의 월급 만을 비교하기 위해 값이 0인 경우를 결측치로 변경한다.
* 값이 0인 경우를 책에서는 결측치로 여기는 것 같은데, 0은 값이 있는 상태이고, 결측치는 값이 없는 상태로 나는 서로 다른 값이라고 판단
"""

# 히스토그램으로 분포 확인: 0~250만원에 가장 밀집
sns.histplot(data = welfare, x = 'income')

 

# 결측치 확인
welfare['income'].isna().sum() # 결과: 9884개

# 0으로 된 값 개수 확인
(welfare['income'] == 0).sum() # 결과: 7개

# 0 → 결측치로 대체
welfare['income'] = np.where(welfare['income'] == 0, np.nan, welfare['income'])

# 결측치 개수 확인
welfare['income'].isna().sum() # 결과: 9991(= 9884 + 7)

 

  • 성별 월급 평균 확인
welfare_sex_income = welfare.dropna(subset = ['income'])\
.groupby('sex', as_index = False)\
.agg(mean_income = ('income', 'mean'))

welfare_sex_income

# 막대 그래프 그리기
sns.barplot(data = welfare_sex_income, x = 'sex', y = 'mean_income', hue = 'sex')

 

  • 분석 결과
    • 남성이 여성보다 월급을 평균 약 163만원 더 많이 받는다.

 

 

 

📌 나이와 월급의 관계


  • 월급 변수 검토 및 전처리
    • 위의 '성별에 따른 월급 차이 분석'에서 진행

 

  • 나이 변수 검토 및 전처리
# 타입 확인
welfare['birth'].dtypes

# 값의 특징 및 이상치/극단치 확인
welfare['birth'].describe()

# 결측치 확인
welfare['birth'].isna().sum()

# 기존 나이 변수 값이 년도로 구성되어 있으므로 조사한 년도인 2019년 기준 나이로 변환
welfare = welfare.assign(age = 2019 - welfare['birth'] + 1)

 

  • 나이별 월급 평균 확인
welfare_age_income = welfare.dropna(subset = ['income'])\
.groupby('age', as_index = False)\
.agg(mean_income = ('income', 'mean')

welfare_age_income

# 나이별 월급 평균 선그래프 생성
sns.lineplot(data = welfare_age_income, x = 'age', y = 'mean_income')

 

  • 분석 결과
    • 20대 초반에 월급을 평균 150만원 가량 받고 이후 지속해서 증가하는 추세를 보인다.
    • 40대에 평균 350만원 가량으로 가장 많이 받고 지속해서 감소하다가 60대 후반부터는 20대보다 낮은 월급을 받는다.

 

 

 

📌 연령대에 따른 월급 차이


  • 월급 변수 검토 및 전처리
    • 위의 '성별에 따른 월급 차이 분석'에서 진행

 

  • 연령대 변수 검토 및 전처리
범주 기준
초년층 30세 미만
중년층 30 ~ 59세
노년층 60세 이상
# 나이대별 파생변수 생성
welfare = welfare.assign(ageg = np.where(welfare['age'] < 30, 'young', np.where(welfare['age'] < 60, 'middle', 'old')))

welfare['ageg'].value_counts()

 

  • 연령대별 월급 평균 확인
welfare_ageg_income = welfare.dropna(subset = ['income'])\
.groupby('ageg', as_index = False)\
.agg(mean_income = ('income', 'mean'))

welfare_ageg_income

# 연령대별 월급 평균 막대 그래프 생성
sns.barplot(data = welfare_ageg_income, x = 'ageg', y = 'mean_income', order = ['young', 'middle', 'old'], hue = 'ageg')

 

  • 분석 결과
    • 중년층이 평균 330만원 정도로 가장 많은 월급을 받는다.
    • 노년층은 평균 140만원으로, 초년층이 받는 195만원보다 적다.

 

 

 

📌 연령대 및 성별 월급 차이


  • 연령대 변수 검토 및 전처리
    • 위의 '연령대에 따른 월급 차이 분석'에서 진행
  • 성별 변수 검토 및 전처리
    • 위의 '성별에 따른 월급 차이 분석'에서 진행
  • 월급 변수 검토 및 전처리
    • 위의 '성별에 따른 월급 차이 분석'에서 진행

 

  • 연령대 및 성별 월급 평균 확인
welfare_ageg_sex_income = welfare.dropna(subset = ['income'])\
.groupby(['ageg', 'sex'], as_index = False)\
.agg(mean_income = ('income', 'mean'))

welfare_ageg_sex_income

# 연령대 및 성별 월급 막대 그래프 생성
sns.barplot(data = welfare_ageg_sex_income, x = 'ageg', y = 'mean_income', order = ['young', 'middle', 'old'], hue = 'sex')

 

  • 분석 결과
    • 초년에는 성별에 따른 월급 차이가 크지 않다.
    • 중년에는 성별에 따른 월급 차이가 크게 벌어져 남성이 평균 179만 원가량 더 많이 번다.
    • 노년에는 성별에 따른 월급 차이가 중년에 비해 줄어들지만, 여전히 남성이 평균 114만원 가량 더 많이 번다.
    • 앞서 연령대별 월급 차이를 분석한 결과 노년층이 초년층보다 월급을 적게 버는 경우는 주로 여성에서만 나타난다.
    • 앞서 연령대별 월급 차이를 분석한 결과 중년층이 초년층보다 월급을 많이 버는 경우는 주로 남성에서 나타난다.

 

 

 

📌 나이 및 성별 월급 차이


  • 나이 변수 검토 및 전처리
    • 위의 '나이와 월급의 관계' 분석에서 진행
  • 성별 변수 검토 및 전처리
    • 위의 '성별에 따른 월급 차이' 분석에서 진행
  • 월급 변수 검토 및 전처리
    • 위의 '성별에 따른 월급 차이' 분석에서 진행

 

  • 나이 및 성별 월급 평균 확인
welfare_age_sex = welfare.dropna(subset = ['income'])\
.groupby(['age', 'sex'], as_index = False)\
.agg(mean_income = ('income', 'mean'))

welfare_age_sex

# 나이 및 성별 월급 평균 선 그래프 생성
sns.lineplot(data = welfare_age_sex, x = 'age', y = 'mean_income', hue = 'sex')

 

  • 분석 결과
    • 남성의 월급은 평균 50세 전후까지 증가하다가 50대 후반부터 급격하게 감소한다.
    • 여성의 월급은 평균 30세 초반까지 약간 증가하다가 이후로는 완만하게 감소한다.
    • 성별 월급 격차는 평균 30대 중반부터 벌어지다가 50대에 가장 크게 벌어지고, 이후 점점 줄어들어 80대가 되면 비슷해진다.