본문 바로가기

코딩으로 익히는 Python/통계

[Python] 7. t검정,카이제곱 검정,F검정

728x90
반응형
SMALL
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으로 똑같다. 하지만 정말 같은 차이일까?

제곱한 것에 대해 기대치로 나누어주었다.
:(220200)^2/20=2
:(4020)^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검정 잘 알아두기
728x90
반응형
LIST