Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 | 31 |
Tags
- 파이썬을파이썬답게
- mes
- 논문
- Pycaret
- 카카오
- Overleaf
- MAPE
- TypeError
- PAPER
- Alignments
- Tire
- 프로그래머스
- n_neighbors
- 코테
- 논문editor
- 논문작성
- iNT
- python 갯수세기
- Scienceplots
- knn
- Mae
- KAKAO
- 에러해결
- RMES
- 스택
- 평가지표
- n_sample
- SMAPE
- Python
- mMAPE
Archives
- Today
- Total
EunGyeongKim
카이제곱을 이용한 차이 검정 (성별,직업군별 소득차이 검정) 본문
In [1]:
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from matplotlib import rcParams
from matplotlib import font_manager, rc
%matplotlib inline
from scipy.stats import chi2
import scipy.stats as stats
import random
pd.options.display.float_format = '{:, .1f}'.format # 소숫점 첫째자리까지 출력
성별 : 1 남자, 2 여성 직업별 코드
- 관리자
- 전문가 및 관련 종사사
- 사무종사자
- 서비스종사자
- 판매종사자
- 농입어업 숙련종사자
- 기능원 및 관련 기능 종사자
- 장치, 기계조적 및 조립 종사자
- 단순노무 종사자 A. 군인
In [2]:
path = '/content/2020_가구마스터_20230320_21294.csv'
df = pd.read_csv(path, encoding='CP949')
In [3]:
columns = ['조사연도', '수도권여부', 'MD제공용_가구고유번호', '가구주_성별코드', '가구주_만연령', '가구원수', '가구주_교육정도_학력코드', '가구주_혼인상태코드', '순자산', '부채', '처분가능소득(보완)[경상소득(보완)-비소비지출(보완)]', '가구주_산업대분류코드', '가구주_직업대분류코드', '입주형태코드']
df = df[columns].copy()
df.rename(columns={'조사연도':'year','수도권여부':'metro','MD제공용_가구고유번호':'id','가구주_성별코드':'sex','가구주_만연령':'age','가구원수':'number','가구주_교육정도_학력코드':'education','가구주_혼인상태코드':'marriage','순자산':'asset','부채':'debt','처분가능소득(보완)[경상소득(보완)-비소비지출(보완)]':'income','가구주_산업대분류코드':'industry','가구주_직업대분류코드':'job','입주형태코드':'house'}, inplace=True)
In [4]:
df1 = df[['sex', 'job']]
df1 = df1.dropna()
df2 = df1.drop(df1[(df.job=='A')].index) # 군인 직업군 제외 (대부분이 남성이라)
cross_tab1 = pd.crosstab(df.sex, df2.job, margins = True) # 성별 관측도수
cross_tab1
<ipython-input-4-1843a5571d26>:3: UserWarning: Boolean Series key will be reindexed to match DataFrame index.
df2 = df1.drop(df1[(df.job=='A')].index) # 군인 직업군 제외 (대부분이 남성이라)
Out[4]:
job | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | All |
---|---|---|---|---|---|---|---|---|---|---|
sex | ||||||||||
1 | 316 | 1623 | 1644 | 558 | 882 | 1020 | 1379 | 1832 | 1318 | 10572 |
2 | 12 | 420 | 315 | 601 | 323 | 197 | 76 | 87 | 586 | 2617 |
All | 328 | 2043 | 1959 | 1159 | 1205 | 1217 | 1455 | 1919 | 1904 | 13189 |
In [5]:
# 추청되는 기대도수를 구하기 위해 총인원, 직업별 및 성별인원 구하기
tot = cross_tab1.iloc[-1,1] # total number 13,189
j_1 = cross_tab1.iloc[-1,0]
j_2 = cross_tab1.iloc[-1,1]
j_3 = cross_tab1.iloc[-1,2]
j_4 = cross_tab1.iloc[-1,3]
j_5 = cross_tab1.iloc[-1,4]
j_6 = cross_tab1.iloc[-1,5]
j_7 = cross_tab1.iloc[-1,6]
j_8 = cross_tab1.iloc[-1,7]
j_9 = cross_tab1.iloc[-1,8]
s_1 = cross_tab1.iloc[0,1] # 남성인원
s_2 = cross_tab1.iloc[1,1] # 여성인원
In [6]:
#총 인원에서 직업 코드별, 성별 비율 바탕으로 기대 도수 구하기
p_j1 = j_1 / tot
p_j2 = j_2 / tot
p_j3 = j_3 / tot
p_j4 = j_4 / tot
p_j5 = j_5 / tot
p_j6 = j_6 / tot
p_j7 = j_7 / tot
p_j8 = j_8 / tot
p_j9 = j_9 / tot
p_s1 = s_1 / tot
p_s2 = s_2 / tot
In [11]:
cross_tab2 = pd.crosstab(df2.sex, df2.job, margins=True)
cross_tab2.iloc[0,0] = round(tot * p_s1 * p_j1, 0)
cross_tab2.iloc[0,1] = round(tot * p_s1 * p_j2, 0)
cross_tab2.iloc[0,2] = round(tot * p_s1 * p_j3, 0)
cross_tab2.iloc[0,3] = round(tot * p_s1 * p_j4, 0)
cross_tab2.iloc[0,4] = round(tot * p_s1 * p_j5, 0)
cross_tab2.iloc[0,5] = round(tot * p_s1 * p_j6, 0)
cross_tab2.iloc[0,6] = round(tot * p_s1 * p_j7, 0)
cross_tab2.iloc[0,7] = round(tot * p_s1 * p_j8, 0)
cross_tab2.iloc[0,8] = round(tot * p_s1 * p_j9, 0)
cross_tab2.iloc[0,9] = round(sum(cross_tab2.iloc[0, 0:9]), 0)
cross_tab2.iloc[1,0] = round(tot * p_s2 * p_j1, 0)
cross_tab2.iloc[1,1] = round(tot * p_s2 * p_j2, 0)
cross_tab2.iloc[1,2] = round(tot * p_s2 * p_j3, 0)
cross_tab2.iloc[1,3] = round(tot * p_s2 * p_j4, 0)
cross_tab2.iloc[1,4] = round(tot * p_s2 * p_j5, 0)
cross_tab2.iloc[1,5] = round(tot * p_s2 * p_j6, 0)
cross_tab2.iloc[1,6] = round(tot * p_s2 * p_j7, 0)
cross_tab2.iloc[1,7] = round(tot * p_s2 * p_j8, 0)
cross_tab2.iloc[1,8] = round(tot * p_s2 * p_j9, 0)
cross_tab2.iloc[1,9] = round(sum(cross_tab2.iloc[1, 0:9]), 0)
cross_tab2
Out[11]:
job | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | All |
---|---|---|---|---|---|---|---|---|---|---|
sex | ||||||||||
1 | 261 | 1623 | 1556 | 921 | 957 | 967 | 1156 | 1524 | 1513 | 10478 |
2 | 67 | 420 | 403 | 238 | 248 | 250 | 299 | 395 | 391 | 2711 |
All | 328 | 2043 | 1959 | 1159 | 1205 | 1217 | 1455 | 1919 | 1904 | 13189 |
In [13]:
cross_tab3 = pd.crosstab(df2.sex, df2.job, margins=True)
num_rows = cross_tab3.shape[0]
num_cols = cross_tab3.shape[1]
for i in range(num_rows):
for j in range(num_cols):
cross_tab3.iloc[i,j] = (cross_tab1.iloc[i,j] - cross_tab2.iloc[i,j])
cross_tab3
Out[13]:
job | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | All |
---|---|---|---|---|---|---|---|---|---|---|
sex | ||||||||||
1 | 55 | 0 | 88 | -363 | -75 | 53 | 223 | 308 | -195 | 94 |
2 | -55 | 0 | -88 | 363 | 75 | -53 | -223 | -308 | 195 | -94 |
All | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
In [15]:
# 관측도수와 기대되는 도수의 차이가 우연인지, 실질적인지 판단하기 위하여 카이제곱 통계량 구하기
t00 = (cross_tab1.iloc[0,0] -cross_tab2.iloc[0,0]) ** 2/cross_tab2.iloc[0,0]
chi_square=[]
for i in range(num_rows):
for j in range(num_cols):
t = (cross_tab1.iloc[i,j] - cross_tab2.iloc[i,j]) ** 2 / cross_tab2.iloc[i,j]
chi_square.append(t)
dof = (num_rows-1) *(num_cols-1)
test_value = sum(chi_square)
round(test_value, 2)
Out[15]:
1458.59
In [20]:
# 해당 카이제곱 통계량에 대한 p값 구하기
from scipy.stats import chi2
import scipy.stats as stats
import matplotlib.pyplot as plt
x = np.arange(0, 50, .05)
plt.plot(x, stats.chi2.pdf(x, df = dof), color ='r', lw =2)
plt.show()
p_value = 1-stats.chi2.cdf(test_value, dof)
print(p_value)
0.0
카이제곱 통계량이 1487보다 큰 면적은 0. p-value 는 0 이므로 귀무가설(성별, 직업군별 소득차이는 우연이다) 기각
'기타 공부 > 금융' 카테고리의 다른 글
[논문 정리]Reassessment of the Weather Effect: Stock Prices and Wall Street Weather (1) | 2024.02.10 |
---|---|
불황과 호황 예측(로짓 알고리즘) (0) | 2023.03.27 |
차이 검정 (30대 1인 가구주 성별에 따른소득차이 검정) (0) | 2023.03.21 |
차이 검정 (가구주 직업별 소득 차이 검정) (0) | 2023.03.21 |
표본추출(가구평균소득에 대한 신뢰구간구하기) (0) | 2023.03.20 |
Comments