빅데이터 분석가 양성과정/Python

'한국인의 삶 파악하기' 분석

분석가 황규진 2024. 7. 10. 10:32

'한국인의 삶 파악하기' 분석

 

데이터 준비하기

 

Doit_Python/Data at main · youngwoos/Doit_Python

<Do it! 쉽게 배우는 파이썬 데이터 분석> 저장소. Contribute to youngwoos/Doit_Python development by creating an account on GitHub.

github.com

 

  • 2020년에 발간된 복지 패널 데이터로, 6331가구, 14418명의 정보를 담고 있다.

패키지 설치 및 데이터 로드

pip install pyreadstat
raw_welfare = pd.read_spss('./Koweps_hpwc14_2019_beta2.sav')
welfare = raw_welfare
welfare  

 

 

데이터 변수 검토 및 전처리

welfare.shape

(14418, 830)

  • 규모가 큰 데이터는 데이터 전체를 한 번에 파악하기 보다 변수 명을 쉬운 단어로 바꾼 다음 사용할 변수(열)를 하나 씩 살펴 봐야함
    • 변수 명 바꾸기
      welfare = welfare.rename( columns = {
          'h14_g3':'sex',              # 성별
          'h14_g4':'birth',            # 태어난 연도
          'h14_g10':'marrige_type',    # 혼인 상태
          'h14_g11':'religion',        # 종교
          'p1402_8aq1':'income',       # 월급
          'h14_eco9':'code_job',       # 직업 코드
          'h14_reg7':'code_region'     # 지역 코드
      })
      ​

성별에 따른 월급 차이

성별 변수 검토 및 전처리

welfare['sex'].dtypes

dtype('float64')

  • 성별 변수의 값이 1이면 남자, 2이면 여자, 모르면 9 이므로 이상치를 결측 처리해준다.
welfare['sex'].value_counts()

2.0 7913

1.0 6505

Name: sex, dtype: int64

welfare['sex'] = np.where(welfare['sex']==9, np.nan, welfare['sex'])
welfare['sex'].isna().sum()
  • 1 또는 2를 이해하기 쉽도록 ‘male’과 ‘female’로 바꿔준다.
    welfare['sex'] = np.where(welfare['sex']==1, 'male', 'female')
    welfare['sex'].value_counts()
    
    female 7913
    male 6505
    Name: sex, dtype: int64

월급 변수 검토 및 전처리

result = welfare.groupby('sex').agg(mean_income = ('income','mean'))
result

 

나이와 월급의 관계

나이 전처리

welfare['birth'].dtypes

dtype('float64')

welfare['birth'].isna().sum()

0

welfare['birth'].describe()

count 14418.000000

mean 1969.280205

std 24.402250

min 1907.000000

25% 1948.000000

50% 1968.000000

75% 1990.000000

max 2018.000000

Name: birth, dtype: float64

welfare = welfare.assign(age = 2019 - welfare['birth'] +1)
welfare['age'].describe()

count 14418.000000

mean 50.719795

std 24.402250

min 2.000000

25% 30.000000

50% 52.000000

75% 72.000000

max 113.000000

Name: age, dtype: float64

 

  • 나이 시각화
    sns.histplot(data = welfare, x = 'age')

월급 전처리

age_income = welfare.dropna(subset = ['income']).groupby('age').agg(mean_income = ('income','mean'))
age_income.head()

  • 나이와 월급 시각화
    sns.lineplot(data = age_income, x = 'age', y='mean_income')

연령대에 따른 월급 차이

초년층(young) 30세 미만
중년층(middle) 30~60세 미만
노년층(old) 60세 이상

변수 검토 및 전처리

welfare = welfare.assign(ageg = np.where(welfare['age'] < 30,'young',
                                         np.where(welfare['age'] < 60, 'middle','old')))
welfare['ageg'].value_counts()

old 5955

middle 4963

young 3500

Name: ageg, dtype: int64

agege_income = welfare.dropna(subset = ['income']).groupby('agege',as_index = False).agg(mean_income = ('income', 'mean'))
agege_income

sns.barplot(data = agege_income, x = 'agege', y = 'mean_income',order = ['10대','20대','30대','40대','50대','60대','노년'])

시각화

sns.countplot(data = welfare, x = 'ageg')

연령대 별 월급 평균 표 만들기

ageg_income = welfare.dropna(subset = ['income']).groupby('ageg').agg(mean_income = ('income', 'mean'))
ageg_income

 

연령대 및 성별 월급 차이

sex_income = welfare.dropna(subset = ['income']).groupby(['ageg','sex'],as_index = False).agg(mean_income=('income','mean'))
sex_income

sns.barplot(data = sex_income, x = 'ageg',y = 'mean_income',hue='sex',order=['young','middle','old'])

age_sex_income = welfare.dropna(subset=['income']).groupby(['age','sex'],as_index = False).agg(mean_income=('income','mean'))
age_sex_income

sns.lineplot(data = age_sex_income, x = 'age',y='mean_income',hue='sex')

 

직업 별 월급 차이

welfare['code_job'].dtypes

dtype('float64')

 

Doit_Python/Data/Koweps_Codebook_2019.xlsx at main · youngwoos/Doit_Python

<Do it! 쉽게 배우는 파이썬 데이터 분석> 저장소. Contribute to youngwoos/Doit_Python development by creating an account on GitHub.

github.com

list_job = pd.read_excel('./Koweps_Codebook_2019.xlsx',sheet_name = '직종코드')
list_job.head()

list_job.shape

(156, 2)

 

합치기 : merge

welfare = welfare.merge(list_job,how='left',on='code_job')
welfare[['code_job','job']]

welfare.dropna(subset=['code_job'])[['code_job','job']]

직업 별 평균 월급

job_income =  welfare.dropna(subset = ['job','income']).groupby('job',as_index = False).agg(mean_income = ('income','mean'))
job_income

시각화

import matplotlib as plt
plt.rcParams.update({'font.family':'Malgun Gothic'})
sns.barplot(data = job_Top10, x = 'mean_income', y = 'job')

 

성별 직업 빈도

job_income =  welfare.dropna(subset = ['job','income']).groupby(['job','sex'],as_index = False).agg(mean_income = ('income','mean'))
fe_j = job_income.query('sex == "female"')
m_j = job_income.query('sex == "male"')
fe_j_TOP10 = fe_j.sort_values('mean_income', ascending=False).head(10)
fe_j_TOP10

m_f_TOP10 = m_j.sort_values('mean_income',ascending=False).head(10)
m_f_TOP10

sns.barplot(data = m_f_TOP10, x = 'mean_income', y = 'job', hue = 'sex')

sns.barplot(data = fe_j_TOP10, x = 'mean_income', y = 'job', hue = 'sex')