2021. 2. 5. 21:55ㆍ교육과정/KOSMO
키워드 : Scipy / 카이제곱 검정 / 독립표본 t-검정 / 대응표본 t-검정 / ANOVA 분석 /
****
1.
모형에 입력 변수 선정¶
1- 카이제곱 검정 (Chi-square Test )
` 이산형 변수 - 이산형 변수
` 성별과 구매여부 사이에 유의한 관계가 있는가
2- 독립표본t검정 (t-Test) : 이분류 모형의 경우
` 이산형 변수(2그룹) - 연속형 변수
` 체중과 구매여부 사이에 유의한 관계가 있는가
( 구매자와 비구매자의 평균 체중이 다른가? )
3- 분산분석 (ANOVA ) : 다분류 모형의 경우
` 이산형 변수(3그룹이상 ) - 연속형 변수
` 체중과 고객등급 사이에 유의한 관계가 있는가?
( 고객등급에 따라 평균 체중에 크게 다른가? )
카이제곱 검정¶
: 이산형과 이산형 변수가 서로 상관관계가 있는지 확인
- 귀무가설 : 두 데이터는 상관관계가 없다
-
대립가설 : 두 데이터는 상관관계가 있다 (내가 주장하고 싶은 가설)
- p-value < 0.05 : 귀무가설 기각, 대립가설 채택
-
p-value > 0.05 : 귀무가설 채택, 대립가설 기각
p-value가 0.05보다 작으면 통계적으로 의미가 있어서 내가 주장하고 싶은 가설인 대립가설을 채택한다
[참고] 가설검정
- 귀무가설과 대립가설
ex) 우리 대표 메뉴의 소고기 함량이 20g임을 증명하고자 한다면, "모든 접시에 소고기 함량이 20g이 아니다"는 귀무가설에 두고 이에 20g에 미달됨이 없을 입증하여 이 가설을 기각함으로써 내가 입증하고픈 "우리 대표 메뉴의 소고기 함량은 20g이다"를 증명한다
from scipy import stats
data1=[4,6,15,10, 9, 11] # 관측치
data2=[10,10,10,10,10,10] # 기대치
#----------------------------------------
# 두 데이터가 관계가 있을까???
result = stats.chisquare(data1, data2)
result
# --> 결과가 2개 도출되므로, 각각 다른 변수로 받는게 낫다.
Power_divergenceResult(statistic=7.8999999999999995, pvalue=0.16183361839504742)
stats, pvalue = stats.chisquare(data1, data2)
print(stats)
print(pvalue)
7.8999999999999995
0.16183361839504742
[ 가설 ]
- 귀무가설 : 두 데이터는 관계가 없다.
- 대립가설 : 두 데이터는 관계가 있다. ( 내가 주장하고 싶은 가설 )
p-value < 0.05 : 귀무가설 기각, 대립가설 채택
p-value > 0.05 : 귀무가설 채택, 대립가설 기각
- p_value 가 0.16으로 0.05보다는 크다.
- 귀무가설 채택, 대립가설 기각
[ 결론 ] 두 데이터는 관계가 없음은 통계적으로 유의하다.
t-test : ttest_1samp(data, 175)¶
전체 학생 중에서 20명의 학생들을 선택하여 전체 학생들의 평균키가 170cm 인지 확인한다.
- 귀무가설 : 학생들의 평균키가 175cm이다.
- 대립가설 : 학생들의 평균키가 175cm가 아니다
import numpy as np
from scipy import stats
np.random.seed(2) # 랜덤 결과가 동일하게 나오도록
# np.random.normal(0,5) : 평균 0, 표준편차 5인 난수
# for 에 _ 대신 변수명 아무거나 입력해도 되지만 그 변수를 사용하지 않기에 _로 표시해도 된다
# heights = [ 180 + np.random.normal(0,5) for _ in range(20)]
heights = [ 180 + np.random.(0,5) for _ in range(20)]
print(heights)
[177.91621076297264, 179.71866586386835, 169.31901952165774, 188.20135404202495, 171.0328220740257, 175.79126317171898, 182.51440708579022, 173.77355956696385, 174.7102389056883, 175.45496192536575, 182.75727022273213, 191.46104006407478, 180.207696964992, 174.4103727744324, 182.69529160290395, 177.01920150096765, 179.90434751739426, 185.87500609750145, 176.2606452535307, 180.04512625486663]
temp = [ 180 + a for a in range(20) ]
temp = [ 180 + np.random.normal(0,5) for _ in range(20) ]
#----------------------------------------
stats, pvalue = stats.ttest_1samp(heights, 175)
print(stats)
print(pvalue)
3.434767428066461
0.00277711459981648
[ 결론 ] 95% 신뢰 수준에서 p_value가 0.05보다 작기 때문에 통계적으로 유의하다고 할 수 있다.
(정규분포에 의하므로 신뢰수준 95%)
- p_value가 0.0027 으로 0.05보다 작다.
- 귀무가설 기각, 대립가설 채택
학생들의 평균키는 175가 아니라고 통계학적으로 볼 수 있다.
독립표본 t-검정¶
: 독립된 2개의 표본이 다르지 확인 : ttest_ind(group1, group2)
전체 학생 중에서 각각 20명의 학생들을 선택한 2개의 그룹에서 평균키가 같은지 다른지 확인한다
- 귀무가설 : 학생들의 평균키는 같다
- 대립가설 : 학생들의 평균키는 같지 않다
import numpy as np
from scipy import stats
np.random.seed(2) # 랜덤 결과가 동일하게 나오도록
group1 = [180 + np.random.normal(0,5) for _ in range(20)] # np.random.normal(0,5) : 평균 0, 표준편차 5인 난수
print(group1)
group2 = [175 + np.random.normal(0,10) for _ in range(20)]
print(group2)
# 평균확인 - 평균은 비슷하다 하더라고 통계적으로 유의미하다고 할 수 없다
print('group1의 평균 :', np.mean(group1))
print('group2의 평균 :', np.mean(group2))
[177.91621076297264, 179.71866586386835, 169.31901952165774, 188.20135404202495, 171.0328220740257, 175.79126317171898, 182.51440708579022, 173.77355956696385, 174.7102389056883, 175.45496192536575, 182.75727022273213, 191.46104006407478, 180.207696964992, 174.4103727744324, 182.69529160290395, 177.01920150096765, 179.90434751739426, 185.87500609750145, 176.2606452535307, 180.04512625486663]
[166.21892106759657, 173.43565829615378, 177.56570452001296, 165.1122095123038, 171.61178033970805, 172.638159691474, 168.62344987515698, 163.12387713614714, 160.78782772695874, 173.4650480432305, 172.30943039783986, 197.31366788886604, 150.65232423478955, 176.1272650481665, 178.70444536663234, 188.59633862672595, 180.01857206781312, 166.55786296170137, 175.00009761471597, 180.42352572149028]
group1의 평균 : 178.95342505867364
group2의 평균 : 172.91430830687418
#----------------------------------------
stats, pvalue = stats.ttest_ind(group1, group2)
print(stats)
print(pvalue)
2.142941903861293
0.03858357345158148
[ 결론 ] 95% 신뢰 수준에서 p_value가 0.05보다 작기 때문에 통계적으로 유의하다고 할 수 있다. (정규분포에 의하므로 신뢰수준 95%)
p_value가 0.038 으로 0.05보다 작다.
귀무가설 기각, 대립가설 채택
두 그룹의 평균키는 같지 않다고 통계학적으로 볼 수 있다.
대응표본 t검정 : ttest_rel(group1, group2)¶
다이어트 약을 복용한 사람들 중 20명을 선택하여 복용 전후의 체중 차이가 유의미한지 알고 싶다
- 귀무가설 : 복용 전후의 체중 차이가 없다
- 대립가설 : 복용 전후의 체중 차이가 있다
import numpy as np
from scipy import stats
np.random.seed(1)
# 복용전 : 평균 60, 표준편자 5
before = [ 60 + np.random.normal(0,5) for _ in range(20 )]
print(before)
# 복용후 : 복용전체중 * 0.99, 표준편차 0.02
after = [ w * np.random.normal(0.99, 0.02) for w in before]
print(after)
[68.1217268183162, 56.94121793174962, 57.359141238682724, 54.63515688921915, 64.3270381466234, 48.492306515598585, 68.7240588210824, 56.19396549552449, 61.59519548028549, 58.75314812261295, 67.31053968522487, 49.69929645251173, 58.38791397993246, 58.07972822665792, 65.66884721167719, 54.500543663429845, 59.13785896224782, 55.61070791039314, 60.21106873357797, 62.914076068579114]
[65.94098797171107, 57.67544499710449, 57.819839215935254, 54.63788246116392, 64.84275566541605, 47.34427263203588, 67.86790793112998, 54.58033393455883, 60.64923115285458, 58.78881770728494, 65.70631311881824, 48.80793606499072, 57.001583230054315, 56.517144665313666, 64.13055954741337, 53.94173367626836, 57.224973536332286, 55.315321289307555, 61.60772730564428, 63.218635763189475]
#--------------------------------------------------------
stats, pvalue = stats.ttest_rel(before, after)
print(stats)
print(pvalue)
2.9154993563693186
0.008871163766572827
[ 결론 ]
95% 신뢰 수준에서 p_value가 0.05보다 작기 때문에 통계적으로 유의하다고 할 수 있다.
(정규분포에 의하므로 신뢰수준 95%)
p_value가 0.008 으로 0.05보다 작다.
귀무가설 기각, 대립가설 채택
다이어트 약이 체중에 영향을 줄 수 있다는 가설은 통계적으로 유의미하다.
ANOVA 분석¶
김부장은 4개의 각기 다른 신입사원 교육훈련 기법의 효과성을 평가하고자 한다.
새로 입사한 32명의 신입사원에게 4가지 기법을 임의로 적용시켜 교육을 시켰다.
한달간의 훈련기간이 끝난 후 표준 시험을 쳤을 때
4개의 교육훈련 기법간 차이가 있는지 알고 싶다
- 귀무가설 : 4개의 교육훈련 기법간의 차이가 없다
- 대립가설 : 4개의 교육훈련 기법간의 차이가 있다
import scipy.stats as stats
import urllib
import matplotlib.pyplot as plt
%matplotlib inline
a = [66, 74, 82, 75, 73, 97, 78, 98]
b = [72, 89, 69, 74, 79, 88, 84, 63]
c = [61, 62, 63, 64, 65, 66, 67, 68]
d = [84, 82, 78, 71, 69, 68, 67, 66]
# 평균비교
print('a 평균 :', np.mean(a))
print('a 평균 :', np.mean(b))
print('a 평균 :', np.mean(c))
print('a 평균 :', np.mean(d))
# 그래프
plot_data = [a, b, c, d]
ax = plt.boxplot(plot_data)
plt.show()
a 평균 : 80.375
a 평균 : 77.25
a 평균 : 64.5
a 평균 : 73.125
#------------------------------------------------------------
stats, pvalue = stats.f_oneway(a,b,c,d)
print(pvalue)
0.004321604568907253
[ 결론 ]
pvalue가 0.05보다 작으므로, 95% 신뢰수준에서 유의미하다고 볼 수 있어서
귀무가설인 " 4개의 교육훈련 기법 간의 차이가 없다." 를 기각한다.
2. 크몽데이터 로그 분석