import scipy.stats as stats
import numpy as np
import matplotlib.pyplot as plt
import math
import matplotlib
matplotlib.rcParams['font.family']='Malgun Gothic'
matplotlib.rcParams['axes.unicode_minus'] = False
지난 시간 복습용 연습문제
- 표본 : 20명의 벤처기업 경영자 혈압 평균 135, 표준편차 25
- 일반인의 혈압 평균 115인 경우 벤처기업 경영자의 혈압이 일반인보다 높은지 아닌지 검정하시오
- (양측 검정) 95%
Solution
- 표본 : 20명의 벤처기업 경영자 혈압 평균 135, 표준편차 25
- 일반인의 혈압 평균 115인 경우 벤처기업경영자의 혈압이 일반인보다 높은지 아닌지 검정하시오
- (양측 검정) 95%
rv = stats.norm( 0, 1 )
mu = 115
n = 20
xbar = 135
sigma = 25
zscore = ( xbar - mu ) / (sigma/(math.sqrt( n )) )
p = 2*(1 - rv.cdf(zscore))
alpha = 0.05
if p < alpha:
print('reject H0')
else:
print('not reject H0')
p
[OUT] :
reject H0
0.00034661935113455833
결론 : p_value<0.025 이므로 귀무가설 기각
t검정
1-Sample T-test(단일 표본 t-검정)
전체 학생들 중 20명의 학생들을 추려 키를 재서 전체 학생들의 평균 키가 175cm인지 아닌지 알아보고 싶다.
- 귀무가설: 학생들의 평균 키가 175cm이다.
- 대립 가설: 학생들의 평균 키가 175cm가 아니다.
np.random.seed(1)
height = 180+ np.random.normal(0, 5, 20 )
height
[OUT] :
array([188.12172682, 176.94121793, 177.35914124, 174.63515689,
184.32703815, 168.49230652, 188.72405882, 176.1939655 ,
181.59519548, 178.75314812, 187.31053969, 169.69929645,
178.38791398, 178.07972823, 185.66884721, 174.50054366,
179.13785896, 175.61070791, 180.21106873, 182.91407607])
tTestResult = stats.ttest_1samp(height,175)
print(tTestResult) # p-value 0.002 : 95%,99% 확률 모두 귀무가설 기각
[OUT] :
Ttest_1sampResult(statistic=3.434767428066461, pvalue=0.00277711459981648)
결론 : p-value가 0.003으로, 기각역을 p <0.05로 설정했을 때 귀무가설을 기각한다. 즉 귀무가설이 참일 때(학생들의 실제 평균 키가 175cm일 때) 위와 같은 표본을 얻을 확률이 0.003으로, 학생들의 평균 키는 175cm가 아니라고 할 수 있다.
Unpaired T-test(독립 표본 t-검정) : 서로 다른 두 집단
집단 1과 집단 2에서 각각 20명의 학생들을 추려, 각 집단의 키가 같은지, 다른지 알아보고 싶다.
- 귀무가설: 두 집단의 평균 키는 같다.
- 대립 가설: 두 집단의 평균 키는 같지 않다.(양측 검정)
독립 표본
- 등분산 가정 두 집단
- 이분산 가정 두 집단
- 등분산 여부는 F검정으로 확인
np.random.seed(1)
group1Heights = 170+ np.random.normal(0, 5, 20 )
group2Heights = 175+ np.random.normal(0, 10, 20 )
group1Heights # 평균 170, 편차 5
[OUT] :
array([178.12172682, 166.94121793, 167.35914124, 164.63515689,
174.32703815, 158.49230652, 178.72405882, 166.1939655 ,
171.59519548, 168.75314812, 177.31053969, 159.69929645,
168.38791398, 168.07972823, 175.66884721, 164.50054366,
169.13785896, 165.61070791, 170.21106873, 172.91407607])
group2Heights # 평균 175, 편차 10
[OUT] :
array([163.99380823, 186.4472371 , 184.01590721, 180.02494339,
184.00855949, 168.16272141, 173.77109774, 165.64230566,
172.3211192 , 180.30355467, 168.08339248, 171.03246473,
168.128273 , 166.54794359, 168.28753869, 174.87335401,
163.82689651, 177.34415698, 191.59802177, 182.42044161])
# 등분산 가정
r1 = stats.ttest_ind(group1Heights,group2Heights) # default는 등분산 가정
print(r1.pvalue) # 0.05보다 작으므로 귀무가설 기각. 두 집단 평균키는 같지않다
[OUT] :
0.025249639899591222
# 이분산 가정
r1 = stats.ttest_ind(group1Heights,group2Heights,equal_var=False)
print(r1.pvalue) # 0.05보다 작으므로 귀무가설 기각. 두 집단 평균키는 같지않다
[OUT] :
0.025992343643634945
Paired T-test(대응 표본 t-검정)
동일한 집단의 사전, 사후 평균 비교 다이어트 약을 복용한 사람들 중 20명을 추려 복용 전/후의 체중 차이가 유의미한지 알아보고 싶다.
- 귀무가설: 복용 전/후의 체중 차이가 없다.
- 대립 가설: 복용 전/후의 체중 차이가 있다.
np.random.seed(1)
#before treatment : mean 60, standard deviation 5
beforeWeights = [60 + np.random.normal(0, 5) for _ in range(20)]
#after treatment : mean 0.99-fold decrease, standard deviation 0.02
afterWeights = [w * np.random.normal(0.99, 0.02) for w in beforeWeights]
beforeWeights
[OUT] :
[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]
afterWeights
[OUT] :
[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]
t2 = stats.ttest_rel(beforeWeights,afterWeights)
print(t2.pvalue) # pvalue<0.05 : 귀무가설 기각 : 효과가 있다
[OUT] :
0.008871163766572827
카이제곱 검정
- 카이제곱 분포에 기초한 통계적 방법
- 관찰된 빈도가 기대 빈도와 의미 있게 다른지의 여부를 검증하기 위해 사용되는 검증방법
- 자료가 빈도로 주어졌을 때, 특히 명목 척도 자료의 분석에 이용
- 질적 자료와 질적 자료 간에 서로 통계적으로 관계가 있는지 판단하는 검정
- 단일 표본의 모집단이 정규분포를 따르며 분산을 미리 알고 있는 경우에 적용된다.
예제 1
A : 결혼식을 한다고 할 때 200명쯤 올 것이다. 하는 것은 기대치이고, 결혼식 당일 220명이 왔다. 는 관찰치이다.
B : 집들이를 한다고 할 때 20명이 올 것이다. 하는 것은 기대치이고, 집들이 당일 40명이 왔다. 는 관찰치이다.
A와 B 경우의 기대치-관찰치 차이는 20으로 똑같다. 하지만 정말 같은 차이일까?
제곱한 것에 대해 기대치로 나누어주었다.
결혼식:(220−200)^2/20=2
집들이:(40−20)^2/20=20
이런 경우 "당황되는 정도"는 집들이가 10배 정도 클 것이다.
Chi-square:
이 값이 0에 가까워지면 귀무가설을 지지하고, 0보다 아주 많이 크다면 대립 가설을 지지한다.
귀무:당황하지 않는다 대립:당황한다
예제 2
제품의 판매량 비율은 다음과 같습니다. A 56%, B 12%, C 32%
그런데, 특정 지역에 제품 A, B, C의 보유대수를 조사하니, 각각 324대, 78대, 261대였습니다.
이 자료로 다음과 같이 관찰 빈도와 기대 빈도를 만들 수 있다.
- 귀무가설 H0는 관찰 빈도는 기대 빈도와 같다.
- 대립 가설 H1은 관찰 빈도는 기대 빈도와 다르다.
from pandas import DataFrame
xo, xe = [324, 78, 261], [371, 80, 212]
xc = DataFrame([xo, xe], columns=['Item A', 'Item B', 'Item C'],
index=['관찰', '기대'])
xc
ax = xc.plot(kind='bar', title='Number of Items', figsize=(8, 6))
ax.set_ylabel('value')
plt.grid(color='darkgray')
plt.show()
print(xo,xe)
[OUT] :
0.00034661935113455833
from scipy.stats import chisquare
result = chisquare(xo, f_exp=xe)
result.pvalue # 귀무가설 기각. 대립가설 채택
[OUT] :
0.00017254977751013492
F검정
등분산 여부를 검정
등분산 검정(test of equal variances)은 두 집단 혹은 세 집단 이상 사이에 산포도(대표적인 산포도로 분산이 있음) 차이가 있는지를 통계적인 방법으로 검정하는 것으로, 두 집단 이상의 분산 차이를 검정할 때 사용할 수 있다. 즉, 각 집단이 갖는 분산이 같은 것을 귀무가설로, 차이가 있는 것을 대립 가설로 하여 검정하는 방법이다.
귀무가설(𝐻0):σ1^2=σ2^2=…=σ𝑛^2(모집단 간의 분산은 같다.)2(모집단간의분산은같다.)
대립 가설(1):σ𝑖^2≠σ𝑗^2(모집단 간의 분산은 다르다.)2(모집단간의분산은다르다.)
F 검정(F test)은 두 집단 간에 분산의 차이가 있는지를 통계적인 방법으로 검정하며 회귀모형 해석 등에도 많이 사용된다.
어떤 지역에서 동일한 제품을 판매하고 직원 수도 동일한 두 가게를 가정하였다. 두 가게가 포함된 상권을 조사하는 과정에서, 두 가게의 일별 매출의 변동을 통해 상권을 이해하고자 한다. 같은 지역에서 객관적인 조건이 같은 두 가게인데, 과연 이 두 곳의 일별 매출 값의 분산은 같을까 아니면 다를까? 우리는 등분산 검정, 그중에서도 F 검정을 통해 이를 분석할 수 있다. 두 가게의 매출 값에 대해서 다음과 같이 가설을 세워보자.
귀무가설(H0): σ12 = σ22(두 가게의 매출 값의 분산은 같다.)
대립 가설(H1): σ12 ≠ σ22(두 가게의 매출 값의 분산은 다르다.)
F 검정의 결과, 귀무가설이 기각된다면 우리는 객관적으로 동일한 조건을 갖는 두 가게의 매출 값 분산이 통계적으로 다르다고 할 수 있다.
#남녀의 영어 성적에 대한 분산 분석
from scipy.stats import f_oneway
boy = np.array( [46,47,58,47,27,58,56,26,47,25] )
girl= np.array( [78,57,31,28,67,77,36,57,36,57] )
#영화의 광고 전후에 대한 선호도
bf = np.array([11,14,18,21,26,28,37,45,48,60,64] )
af = np.array([13,15,17,18,19,23,25,28,29,36,37])
print( f_oneway( boy, girl) ) # 분산 같다. 귀무가설 채택
print( f_oneway( bf, af)) # 분산 같다. 귀무가설 채택
[OUT] :
F_onewayResult(statistic=1.4591624718860445, pvalue=0.24269553293319618)
F_onewayResult(statistic=2.835186691980833, pvalue=0.10776455501678371)
review
- t검정 잘 알아두기
'코딩으로 익히는 Python > 통계' 카테고리의 다른 글
[Python] 8. 이산확률분포 (4) | 2021.01.18 |
---|---|
[Python] 6. 표준정규분포(z검정,t검정) (0) | 2021.01.18 |
[Python] 5. 모집단과 표본 : 모평균 추정, 중심극한정리 (0) | 2021.01.17 |
[Python] 4. 회귀 : cost(mse) test, gradient, scipy.stats 예제 (0) | 2021.01.17 |
[Python] 3. 공분산, 상관계수 (0) | 2021.01.17 |