'한국인의 삶 파악하기' 분석
데이터 준비하기
- 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’로 바꿔준다.
female 7913welfare['sex'] = np.where(welfare['sex']==1, 'male', 'female') welfare['sex'].value_counts()
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')
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')
'빅데이터 분석가 양성과정 > Python' 카테고리의 다른 글
인구 공공 데이터 (시각화) (0) | 2024.07.10 |
---|---|
기온 공공 데이터 (2) | 2024.07.10 |
데이터 가공하기 (0) | 2024.07.10 |
외부 데이터 활용 (0) | 2024.07.10 |
판다스 활용 (0) | 2024.07.10 |