취뽀 기록

#열심히 살자 #취업 #공부

Python

[Python][한국복지패널데이터] 주제 1_성별에 따른 월급 차이

hyunnn_00 2023. 6. 8. 17:41

데이터 분석 준비

# 한글 폰트 설치
!sudo apt-get install -y fonts-nanum
!sudo fc-cache -fv
!rm ~/.cache/matplotlib -rf
# 메뉴 - 런타임 - 런타임 다시 시작

# 라이브러리 불러오기
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

import warnings
warnings.filterwarnings('ignore')

# 한글 폰트 설정
plt.rc("font", family = "NanumGothic")

# 데이터 준비
raw_welfare = pd.read_csv('/content/drive/MyDrive/hana1/data/welfare_2015.csv')

# 사본 저장
welfare = raw_welfare.copy()

# 데이터 살펴보기
# 데이터 앞부분, 뒷부분 확인
print(welfare) # 데이터프레임은 자동으로 앞부분과 뒷부분을 보여줌
print(welfare.head())
print(welfare.tail())

# 행, 열 개수
welfare.shape

# 데이터 속성
welfare.info()

# 데이터 요약 통계량
welfare.describe()

# 변수명 변경
welfare = welfare.rename(columns = {'h10_g3'	: 'sex',
                                    'h10_g4'	: 'birth_year',
                                    'h10_g10' :	'marital_status',
                                    'h10_g11' :	'religion',
                                    'h10_eco9' : 'job_code',
                                    'p1002_8aq1'	: 'income',
                                    'h10_reg7' : 'region_code'
                                    })

welfare.describe()

주제 1

성별에 따른 월급 차이 - ‘성별에 따라 월급이 다를까?’

  • 분석에 사용할 변수 확인
  • 변수 검토 및 전처리하기
  • 성별에 따른 월급 차이 분석하기
    • 성별 월급 평균표 만들기
    • 그래프 만들기

데이터 전처리

# 성별에 따른 월급 차이
# 성별 변수 검토
welfare['sex'].dtypes

데이터 타입을 확인한 결과 성별의 데이터 타입이 int(정수형)임을 알 수 있었다.

 

빈도표로 자세히 확인해보자

# 범주형 변수 => 빈도표
welfare['sex'].value_counts()

 

# 9 => 모름 / 미응답 등으로 이상치 => NAN
welfare['sex'] = np.where(welfare['sex'] == 9, np.nan, welfare['sex'])

# 이상치, 결측치 확인
welfare['sex'].value_counts(dropna = False)

 

성별이 1 => 남자. 2 => 여자 이므로 9는 이상치(잘못된 값)으로 판단

따라서, 9의 값을 np.where 함수를 통해 NaN 값으로 바꿔주기

 

# 1 => 남자, 2 => 여자, NAN => NAN
welfare['sex'] = np.where(welfare['sex'].isnull() == True, np.nan,
                          np.where(welfare['sex'] == 1, 'male', 'female'))

# 이상치, 결측치 확인
welfare['sex'].value_counts(dropna = False)

 

 

위처럼 결과가 바뀌었다.

 

# 결측치 확인
welfare['sex'].isnull().sum()

결측치 확인 결과 0개

 

# 문자열 nan을 NAN으로 변환
welfare['sex'] = np.where(welfare['sex'] == 'nan', np.nan, welfare['sex'])

# 이상치, 결측치 확인
welfare['sex'].value_counts(dropna = False)

welfare['sex']의 값이 'nan'인 값에 대해 넘파이의 np.nan 함수를 통해 실제 nan 값으로 바꿔주기

=> NaN 개수 1개

 

# 빈도 막대그래프
sns.countplot(x = 'sex', data = welfare)
plt.show()

seaborn의 countplot 함수로 남성과 여성의 수 확인

=> 여성이 더 많음을 확인 가능

 


# 월급 변수 검토
welfare['income'].dtypes

 

# 연속형 변수 => 요약통계량
welfare['income'].describe()

 

welfare 데이터의 income 변수는 연속형 변수이므로 요약통계량 집계 가능

=> 평균은 243인데 비해 max 값이 9999로 매우 큰 값 => 이상치로 판단

 

# 전처리
# 이상치, 결측치 확인
welfare['income'].value_counts(dropna = False)
# 9999 => 모름 / 미응답 등으로 이상치 => NAN
# NaN => 123035개

 

welfare['income'].describe()
# 0 => NaN

 

# 9999 => 모름 / 미응답 등으로 이상치 => NAN
welfare['income'] = np.where(welfare['income'] == 9999, np.nan, welfare['income'])

# 이상치, 결측치 확인
welfare['income'].value_counts(dropna = False)
# NaN => 12036개

# 0 => NaN
welfare['income'] = np.where(welfare['income'] == 0, np.nan, welfare['income'])

# 이상치, 결측치 확인
welfare['income'].value_counts(dropna = False)
# NaN => 12050개

 

# 히스토그램
sns.histplot(x = 'income', data = welfare).set(xlim = (0, 1000))
plt.show()

 

데이터 분석

# 성별에 따른 평균 월급의 차이
welfare.info()

 

# NaN 이 없는 데이터
welfare.dropna(subset = ['sex', 'income'])

 

# 테스트 내용을 종합하여 해결
sex_income = welfare.dropna(subset = ['sex', 'income'])\\
                    .groupby('sex', as_index = False)\\
                    .agg(mean_income = ('income', 'mean'))
sex_income

 

# 시각화 = 막대그래프
sns.barplot(x = 'sex', y = 'mean_income', data = sex_income)

그래프 확인 결과 남성의 평균 수입이 여성의 평균 수입의 거의 2배임을 확인할 수 있다.