티스토리 뷰

반응형
welfare['age_range'].value_counts()

우리가 첫 번 째로 분석할 데이터는 '한국복지패널 데이터"를 분석하는 것이다.

 

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단계 변수 검토 및 전처리


분석에 활용할 변수를 전처리합니다. 변수의 특징을 파악하고 이상치와 결측치를 정제한 다음 변수의 값을 다루기 편하게 바꿉니다. 전처리는 분석에 활용할 변수 각각 진행합니다. 예를 들어 ‘성별에 따른 월급 차이’를 분석한다면 성별, 월급 두 변수를 각각 전처리합니다.

 

2단계 변수 간 관계 분석


전처리를 완료하면 본격적으로 변수 간 관계를 파악하는 분석을 합니다. 데이터를 요약한 표와 데이터의 특징을 쉽게 이해할 수 있는 그래프를 만든 다음 분석 결과를 해석합니다

 

1.성별에 따른 월급 차이 - 성별에 따라 월급이 다를까?

1) 전처리하기 (성별과 월급만 전처리하면 됨)

 

1-1) 변수 검토 하기 (성별)

 

'sex'(성별)  의 변수 타입 파악하고 범주마다 몇 명이 있는 지 알아보자

welfare['sex'].value_counts()

2.0 7913
1.0 6505
Name: sex, dtype: int64

 

- 보면 1,2 의 값만 있고 9의 값은 없기에 이상치값은 없으므로 이상치제거 절차는 넘어가자

 

# 성별 항목 이름 부여
welfare['sex'] = np.where(welfare['sex'] == 1, 'male', 'female')
# 빈도 구하기
welfare['sex'].value_counts()

 

또 한 위 코드처럼 1, 2, 값은 컬럼 으로 쓴다면 헷갈 릴 수 있기에 male , female로 바꿔주자.

 

sns.countplot( data =welfare , x = 'sex' , hue = 'sex')

 


1-2) 변수 검토 하기 (월급)

'income'(월급) 의 변수 타입 파악하고 범주를 그래프를 통해서 파악해보자.

sns.histplot( data = welfare , x = 'income')

welfare['income'].describe()

count 4534.000000
mean 268.455007
std 198.021206
min 0.000000
25% 150.000000
50% 220.000000
75% 345.750000
max 1892.000000
Name: income, dtype: float64

 

1-2 결측치 확인

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

이후 결측치를 확인해보자 . 총 9884로나온다.( 직업이 없어서 월급을 받지 않은 응답자가 있는 것이다. ) 

 


1-3 이상치 확인

이상치응답은 9999로 고정 되어 있다. 근데 max 값에 9999가 없으므로 이상치는 없기에 넘어가자.

이제 전처리가 끝났으니 성별별 월급상관관계를 월급평균을 통해서 표형태로 만들어보자.

 

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

 

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

 

결론 : 출력된 그래프를 보면 남성의 월급이 여성의 두 배 가까울 정도로 많습니다.

 

1.나이에 따른 월급 관계 - 몇 살 때 월급이 가장 많을까?

 

1) 전처리하기 (성별과 월급만 전처리하면 됨)

'agg'(나이) 의 변수 타입 파악하고 범주마다 몇 명이 있는 지 알아보자

sns.histplot(data = welfare , x ='birth')

-모름/무응답일 경우 9999로 나타나기에 9999데이터는 위에서 봤을 때 없으므로 이상치는 존재하지 않는다.

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

 0

 

-결측치 또한 존재하지 않는다. 

 

다음단계는 파생변수를 만드는 단계로 넘어갈 것이다. 현재 컬럼이 birth로 되어있기에 x변수를 보기가 어렵다. 그래서 나이변수값으로 바꿔주자

welfare = welfare.assign(age = 2019 - welfare['birth'] + 1 ) # 나이 변수 만들기
welfare['age'].describe() # 요약 통계량 구하기

 

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

결론:현재 40대 중반에 가장 월급을  많이 받고 이후 60대 넘어서 부터 월급이 줄어드는 것을 볼 수 있다. 

 

3.연령대 및 성별 월급 차이 - 성별 월급 차이는 연령대별로 다를까?

연령대를 30대이하는 'young' 59세 이하는 'middle' 60세이상은 'old'로 나누어 보자.

welfare = welfare.assign(age_range = np.where(welfare['age'] < 30,'young',
                                     np.where(welfare['age'] <= 59, 'middle',
                                                                     'old')))
                                                                     
                                                                 
                                                                 
welfare['age_range'].value_counts()
age_range
old       5955
middle    4963
young     3500
Name: count, dtype: int64

 

1). 연령대 및 성별 월급 평균표 만들기

# 연령대 및 성별 평균표 만들기
sex_income = \
 welfare.dropna(subset = ['income']) \
 .groupby(['ageg', 'sex'], as_index = False) \
 .agg(mean_income = ('income', 'mean'))

sns.lineplot(data = sex_income , x = 'age_range' , y = 'mean_income', oreder = ['young', 'middle', 'old'])

3-1 연령대별이 아니라 나이대별로 더 세세하게 분석해보자. 

sex_age = welfare.dropna(subset = ['income']) \
  .groupby(['age', 'sex'], as_index = False) \
  .agg(mean_income = ('income', 'mean'))
sex_age.head()
# 선 그래프 만들기
sns.lineplot(data = sex_age, x = 'age', y = 'mean_income', hue = 'sex')
s.lineplot(data = sex_age, x = 'age', y = 'mean_income', hue = 'seㅌ')

결론:남성의 월급은 50게 전후까지 증가하다가 급격하게 감소하고 여성은 30세 초반까지 약간 증가하다가 이후로는 완만하게 감소한다. 성별 월급 격차는 30대 중반부터 벌어지다가 50대에 가장 크게 벌어지고 점점 줄어들어 80대에 비슷한 수준이됨

 

4.직업별 월급 차이 - 어떤 직업이 월급을 가장 많이 받을까?

welfare['code_job'].value_counts()
code_job
611.0    962
941.0    391
521.0    354
312.0    275
873.0    236
        ... 
784.0      2
122.0      2
861.0      1
423.0      1
872.0      1
Name: count, Length: 150, dtype: int64

위코드를 보면 이렇게 출력 값이 코드별로 count가 되어 나오는 것을 알 수 있다. 그러므로 아래의 코드를 통해 직종코드 sheet 에서 list_job이라는 컬럼을 생성해준다.

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

이후 원래 있던 welfare 데이터 프레임에   code_job 컬럼 바로 옆에 list_job 컬럼을 merge 해준다.

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

근데 결측치 값이 많으므로 바로 제거 해서 출력 할 수 있도록 하자.

# code_job 결측치 제거하고 code_job, job 출력
welfare.dropna(subset = ['code_job'])[['code_job', 'job']].head()

어차피 code_job이 nan 값이면 job도 nan 값이므로 code_job의 컬럼을 기준으로 제거 하면 됩니다.

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

이후 직업별 로 평균 임금데이터 가있는 프레임을 만들어주자 각 job, income 컬럼의 결측치를 제거해주고 job으로 묶어주고 데이터 값은 평균소득으로 설정하고 출력하자

 

그리고 우리가 알고 싶은 것은 소득 상위 10종 직업과 소득 하위 10종 직업이다. 

 

top10 = job_income.sort_values('mean_income', ascending = False).head(10)
bottom10 = job_income.sort_values('mean_income').head(10)
sns.barplot(data = top10 , y = 'job', x ='mean_income', hue = 'job')

 

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

 

만약에 바차트가 잘 안나올 경우에는 한글 때문에 깨지는 것이다. 아래의 코드로 설정을 하고 가자

# 맑은 고딕 폰트 설정
import matplotlib.pyplot as plt
plt.rcParams.update({'font.family' : 'Malgun Gothic'})

 

 


결론: 의료 진료 전문가’는 ‘기타 돌봄·보건 및 개인 생활 서비스 종사자’의 열 배가 넘는 월급을 받는 것을 알 수 있다.

 

다음 분석은 소득 분석이 아니라 성별등 직업 관련된 데이터등으로 분석을 해보겠다.

 

반응형