1. 한국 복지패널 데이터 분석
🐬 분석은 2단계로 진행
< 1단계 : 변수 검토 및 전처리 >
- 분석에 활용할 변수를 전처리
- 변수의 특징을 파악하고 이상치와 결측치를 정제한 다음, 변수의 값을 다루기 편하게 바꿈
- 전처리는 분석에 활용할 변수 각각 진행.
< 2단계 : 변수 간 관계 분석 >
- 전처리를 완료하면 본격적으로 변수 간 관계를 파악하는 분석을 함
- 데이터를 요약한 표와 데이터의 특징을 쉽게 이해할 수 있는 그래프를 만든 다음 분석 결과를 해석
1) 데이터 준비하기
📌 Koweps_hpwc14_2019_beta2.sav : 2020년에 발간된 복지패널 데이터로 6,331가구, 14,418명의 정보를 담고 있음
2) 패키지 설치 및 로드하기
📌 데이터 파일은 통계 분석 소프트웨어인 SPSS 전용파일
📌 pyreadstat 패키지를 설치하면 pandas 패키지의 함수를 이용해 SPSS, SAS, STATA 등 다양한 통계 분석 소프트웨어의 데이터 파일을 불러올 수 있다.
pip install pyreadstat
3) 데이터 불러오기
👾 데이터 원본은 복구할 상황을 대비해 그대로 두고 복사본을 만들어 분석에 활용
import pandas as pd
import numpy as np
import seaborn as sns
import pyreadstat
raw_welfare = pd.read_spss('../input/Koweps_hpwc14_2019_beta2.sav')
# 복사본 만들기
welfare = raw_welfare.copy()
4) 데이터 검토
👾 데이터의 구조와 특징을 파악
# 앞부분, 뒷부분 출력
welfare.head()
# 행, 열 개수 출력
welfare.shape # (14418, 830)
# 변수 속성 출력
welfare.info()
'''
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 14418 entries, 0 to 14417
Columns: 830 entries, h14_id to h14_pers_income5
dtypes: float64(826), object(4)
memory usage: 91.3+ MB
'''
# 요약 통계량
welfare.describe()
5) 변수명 바꾸기
👾 복지패널 데이터와 같은 대규모 데이터는 변수의 수가 많고 변수명이 코드로 되어 있어 전체 구조를 한 눈에 파악하기 어려움
👾 규모가 큰 데이터는 데이터 전체를 한 번에 파악하기보다 변수명을 쉬운 단어로 바꾼 다음 분석에 사용할 변수를 살펴봐야 함
⚡️ 규모가 큰 조사 자료는 데이터의 특징을 설명해 놓은 코드북 codebook을 함께 제공
⚡️ 코드북에는 코드로 된 변수명과 값의 의미가 설명되어 있음
⚡️ 코드북을 보면 데이터의 특징이 어떠한지 감을 잡을 수 있고, 분석에 어떤 변수를 활용할지, 분석 방향의 아이디어를 얻을 수 있음
⚡️ 코드북의 파일명은 Koweps_Codebook_2019.xlsx
# 코드북을 참고해 분석에 사용할 변수 7개의 이름을 알기 쉬운 단어로 바꿈.
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'}) # 지역 코드
welfare.columns
'''
Index(['h14_id', 'h14_ind', 'h14_sn', 'h14_merkey', 'h_new', 'h14_cobf',
'p14_wsc', 'p14_wsl', 'p14_wgc', 'p14_wgl',
...
'wc14_64', 'wc14_65', 'wc14_5aq4', 'wc14_5aq5', 'wc14_5aq6',
'h14_pers_income1', 'h14_pers_income2', 'h14_pers_income3',
'h14_pers_income4', 'h14_pers_income5'],
dtype='object', length=830)
'''
6) 복사본 저장
welfare.to_csv('../output/Koweps_hpwc14_2019_beta2_step_01.csv', mode='w', index=False)
2. 성별에 따른 월급 차이 - 성별에 따라 월급이 다를까?
< 분석 절차 >
· 1단계 : 변수 검토 및 전처리
성별 / 월급
· 2단계 : 변수 간 관계 분석
성별 월급 평균표 만들기 / 그래프 만들기
1) 성별 변수 검토 및 전처리하기
a. 변수 검토하기
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
welfare = pd.read_csv ('../output/Koweps_hpwc14_2019_beta2_step_01.csv')
welfare.head()
# sex 성별 변수의 타입을 파악
welfare['sex'].dtypes # dtype('float64')
# value_counts()를 이용해 각 범주마다 몇 명이 있는지 알아봄
welfare['sex'].value_counts()
'''
sex
2.0 7913
1.0 6505
Name: count, dtype: int64
'''
b. 전처리하기
· 코드북을 보면 성별 변수의 값이 1이면 남자, 2면 여자를 의미. 모른다고 답하거나 응답하지 않으면 9로 입력
· 이 정보를 바탕으로 데이터에 이상치가 있는지 검토하고, 분석할 때 제거하기 편하도록 NaN을 부여해 결측치 처리
➡️ 즉 값이 9인 경우 성별을 알 수 없어 분석에서 제외해야 하므로 결측 처리
# 이상치 확인
welfare['sex'].value_counts()
# 1, 2만 있고 9나 다른 값이 없으니 이상치를 결측 처리하는 절차를 건너뛰어도 됨
# 만일 이상치가 있으면 이상치를 결측 처리한 후에 다음 결측치 확인
# 이상치 결측 처리
# sex 열에서 9인 값을 NaN으로 변경
welfare['sex'] = np.where(welfare['sex'] == 9, np.nan, welfare['sex'])
-> '9'인 값이 존재하면 np.nan 값이 들어가게 되고, 아니면 원래 값이 들어가게 됨
# 결측치 확인
welfare['sex'].isna().sum() # 0
💡 np.where(condition, T, F) : 조건에 해당하는 값이면 'T', 해당하지 않는 값이면 'F' 가 기입되게 된다.
# 성별이 1, 2로 되어 있어, 값의 의미를 이해하기 쉽도록 문자 male과 female로 변경
# 변경 후 잘 반영이 되었는지 value_counts()와 countplot()을 이용해
# 바꾼 값이 잘 반영이 됐는지 출력 결과를 확인
# 성별 항목 이름 부여
welfare['sex'] = np.where(welfare['sex'] == 1, 'male', 'female')
#-> 1이면 male, 아니면 female 기입되게 된다.
welfare['sex'].value_counts()
'''
sex
female 7913
male 6505
Name: count, dtype: int64
'''
# 빈도 막대 그래프 만들기
sns.countplot(data=welfare, x='sex')
plt.show()
3. 월급 변수 검토 및 전처리하기
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
welfare = pd.read_csv('../output/Koweps_hpwc14_2019_beta2_step_02.csv')
welfare['sex'].head()
'''
0 female
1 male
2 male
3 male
4 female
Name: sex, dtype: object
'''
1) 변수 검토하기
📍 코드북을 보면 월급은 '일한 달의 평균 임금'을 의미하며 1만원 단위로 기록
▶️ 변수 이름은 income
📍 성별은 범주 변수이므로 df.value_counts()를 이용해 범주별 빈도를 확인하면 특징을 파악할 수 있음
📍 월급은 연속 변수이므로 df.value_acount()을 이용하면 너무 많은 항목이 출력되어 알아보기 어려움
welfare['income'].dtypes # dtype('float64')
# 요약 통계량 구하기
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
'''
✏️ 출력 결과를 보면 float64 타입이고, 0~1892만원의 값을 지님
✏️ 150~345 만원에 가장 많이 분포하고 평균은 268만원, 중앙값은 평균보다 작은 220만원으로 전반적으로 낮은 쪽에 치우침
➡️ 월급이 평균값보다 낮은 사람이 50% 이상
# 히스토그램을 만들어 분포를 확인
sns.histplot(data=welfare, x='income') # 히스토그램 만들기
plt.show()
2) 전처리 하기
📍 코드북을 보면 월급은 만원 단위로 되어 있고, '모름/무응답'은 9999
welfare['income'].describe() # 이상치 확인
welfare['income'].isna().sum() # # 결측치 확인 14418 - 4534 = 9884
# 9884
✏️ 출력 결과를 보면 최소값은 0 ~ 1,892이고 결측치 9,884개가 있음
▶️ 즉 9999가 입력된 데이터는 없음
# 이상치 결측 처리
welfare['income'] = np.where(welfare['income'] == 9999, np.nan, welfare['income'])
# 결측치 확인
print(welfare['income'].isna().sum())
# 9884
4. 성별에 따른 월급 차이 분석
1) 성별 월급 평균표 만들기
📍 income 결측치 제거 : dropna(subset=['income'])
📍 sex별 분리 : groupby('sex', as_index=False)
📍 income 평균 구하기 : agg(mean_income=('income', 'mean')
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
welfare = pd.read_csv('../output/Koweps_hpwc14_2019_beta2_step_02.csv')
sex_income = welfare.dropna(subset=['income'])
sex_income = sex_income.groupby('sex', as_index=False)
sex_income = sex_income.agg(mean_income=('income', 'mean'))
sex_income
'''
sex mean_income
0 female 186.293096
1 male 349.037571
'''
✏️ 평균 남자 월급은 349만원, 여자 월급은 186만원으로, 남성이 여성보다 약 163만원이 많음
2) 그래프 만들기
📍 분석 결과를 쉽게 이해할 수 있도록 성별 월급 평균표를 이용해 막대 그래프로 만듦
# 막대 그래프 만들기
sns.barplot(data=sex_income, x='sex', y='mean_income')
plt.show()
5. 나이와 월급의 관계 - 몇 살 때 월급을 가장 많이 받을까?
< 분석 절차 >
· 1단계 : 변수 검토 및 전처리
나이 / 월급
· 2단계 : 변수 간 관계 분석
나이에 따른 월급 평균표 만들기 / 그래프 만들기
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
welfare = pd.read_csv('../output/Koweps_hpwc14_2019_beta2_step_02.csv')
welfare['birth'].head()
'''
0 1945.0
1 1948.0
2 1942.0
3 1962.0
4 1963.0
Name: birth, dtype: float64
'''
1) 나이 변수 검토 및 전처리하기
a. 변수 검토하기
📍 나이 변수는 없고 태어난 연도 변수만 있음. 따라서 태어난 연도 변수를 기반으로 나이 변수를 만들어야 함
welfare['birth'].dtypes
# dtype('float64')
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
'''
sns.histplot(data = welfare, x = 'birth') # 히스토그램 만들기
plt.show()
b. 전처리
📍 코드북을 보면 태어난 연도는 '모름/무응답'일 경우 9999로 코딩, 이 정보를 바탕으로 전처리
welfare['birth'].describe() # 이상치 확인
welfare['birth'].isna().sum() # 결측치 확인
# 0
# 이상치와 결측치가 없으므로 파생변수를 만드는 단계로 넘어감
# 만일 이상치가 발견되면 아래와 같이 전처리한 다음 분석을 진행
# 이상치 결측 처리
welfare['birth'] = np.where(welfare['birth'] == 9999, np.nan, welfare['birth'])
# 결측치 확인
welfare['birth'].isna().sum() # 0
c. 파생변수 만들기 - 나이
📍 2019년에 조사가 진행됐으니 2019에서 태어난 연도를 뺀 다음 1을 더해 나이를 구함
📍 df.assign(kwargs) : DataFrame에 새 열을 할당하는 메서드.
kwargs : 새열이름 = 내용 형식으로 입력되는 키워드. 콤마(,)를 통해 여러개를 입력.
# 나이 변수 만들기
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')
# 변경된 자료 저장
welfare.to_csv('../output/Koweps_hpwc14_2019_beta2_step_03.csv', mode='w', index=False)
6. 나이와 월급의 관계 분석
1) 나이에 따른 월급_평균표 만들기
📍 income 결측치 제거 : dropna(subset=['income'])
📍 age별 분리 : groupby('age')
📍 income 평균 구하기 : agg(mean_income=('income', 'mean'))
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
welfare = pd.read_csv('../output/Koweps_hpwc14_2019_beta2_step_03.csv')
age_income = welfare.dropna(subset=['income']).groupby('age').agg(mean_income=('income', 'mean'))
age_income.head()
'''
mean_income
age
19.0 162.000000
20.0 121.333333
21.0 136.400000
22.0 123.666667
23.0 179.676471
'''
2) 그래프 만들기
📍 평균표를 이용해 그래프 작성, x축을 나이, y축을 월급으로 지정해 나이에 따른 월급의 변화를 나타낸 선 그래프 만듦
# 선 그래프 만들기
sns.lineplot(data=age_income, x='age', y='mean_income')
plt.show()
[ 내용 참고 : IT 학원 강의 ]
'Programming Language > Python' 카테고리의 다른 글
[Python] Folium 라이브러리 | 지도 시각화, 마커, 단계구분도 (0) | 2024.03.15 |
---|---|
[Python] Seaborn | 선 그래프 line chart (0) | 2024.03.15 |
[Python] Seaborn | 상자 수염 Box Plot 그래프 (1) | 2024.03.15 |
[Python] Seaborn | 산점도 그래프 - scatter plot (0) | 2024.03.15 |
[Python] Seaborn | 산점도 그래프 - Strip plot (0) | 2024.03.15 |