레이블이 T검정인 게시물을 표시합니다. 모든 게시물 표시
레이블이 T검정인 게시물을 표시합니다. 모든 게시물 표시

2016년 2월 4일 목요일

카이제곱 검정 실습

본문은 기 작성한 “T-Test 검정 실습”에 대한 확장된 내용을 카이제곱 검정과 함께 다룬다.

모수 검정은 표본 평균과 표본 분산을 이용하는 방법이 있다.

표본 평균의 차이를 이용하는 방법
T 분포, Z 분포
표본 분산의 차이를 이용하는 방법
F 분포, 카이제곱 분포

T-Test와 카이제곱의 공식이다.

T-TEST 공식
    ( 표본평균1 - 표본평균2 ) /  Sqrt( 표본분산1 / 표본개수1 + 표본분산2 / 표본개수2  )

카이제곱 공식
    Sum( ( 표본값 - 기대값 )**2 / 기대값 )

구현 시 주의 사항은
T-TEST 검정에서 표본분산을 구할 때는 "베셀의 수정"에 따라 표본개수에서 1개를 제외한다.
파이썬(numpy)에서는 np.var( 표본, ddof=1 )로 구할 수 있다.

핵심은
표본의 평균의 비교하는 것이 유용한가? 표본의 분산을 비교하는 것이 유용한가? 이다.
예를 들면 주사위가 잘 만들어 졌는지 검정하기 위해서 주사위를 던저서 나오는 눈금의 수를 표본으로 카이제곱 검정을 한다면 어떤가?
주사위를 60번 던졌을때 각 눈금의 기대치는 10회 이다. ( 60번 / 정6면체 )
SUM( 표본 값 (X) - 기대치 (10) )**2 / 기대치 (10) )

참고

자유도 ( Degree of Freedom, DoF)
모집단의 정보를 주는 독립적인 표본 자료의 수

DDOF (Delta Degree of Freedom, DDoF)
자유도 = 표본의 수 (N) - DDOF

베셀의 수정 ( Bessel’s Correction )
표본 관찰의 수 n이 표본 분산이나 표본 표준편차의 공식에서 n-1로 사용되는 것을 말한다.
표본의 수 n이 매우 클때는 문제가 없으나 n이 작을 때는 베셀의 수정을 통해서 모집단의 분산이나 표준편차의 추정에 발생하는 편중을 바로 잡는다.

샘플 데이터 만들기
D1 = stats.norm.rvs(loc=100,scale=1,size=50)
평균 100 편차 1인 표본 수 50개를 랜덤하게 만든다.

T-Test 함수의 사용 방법
# 표본 집단의 평균을 모집단의 평균과 비교
stats.ttest_1samp(D1, 100)
=>
( D1.mean() - 100 ) / np.sqrt(np.var(D1 - 100, ddof=1) / len(D1))
* ddof=1은 variance를 구할때, n - ddof ( n - 1) 을 뜻한다.

# 표본 집단의 비교
stats.ttest_rel(D1, D2)
=>
( D1.mean() - D2.mean() ) / np.sqrt(np.var(D1 - D2 ,ddof=1 ) / (len(D1)))

# 독립적인 표본 집단의 비교
stats.ttest_ind(D1, D2)
=>
( D1.mean() - D2.mean() ) / np.sqrt( (np.var(D1 ,ddof=1 ) / (len(D1))) + (np.var(D2 ,ddof=1 ) / (len(D2))))

카이제곱 함수의 사용방법
# D1의 평균의 분산
stats.chisquare(f_obs=D1)
=>
exp = D1.mean()
sum([ ( i - exp ) ** 2 / exp for i in D1 ])

# 표본 집단의 비교
stats.chisquare(f_obs=D1, f_exp=D2)
=>
sum(( D1 - D2 ) ** 2 / D2)

* D1, D2는 numpy의 array 타입을 사용했다.


커버 사진 (Knime)

2016년 1월 19일 화요일

가설 검정을 위한 scipy 라이브러리 모음

통계적 추론의 가설 검정을 위해 사용한 scipy 라이브러리를 정리한다.

scipy는 과학 기술 컴퓨팅을 다루는 과학자, 분석가, 엔지니어링이 사용하는 오픈소스 파이썬 라이브러리 이다. matplotlib, SymPy, Pandas와 같이 NumPy를 기반으로 사용된다.

T 검정

scipy.stats.ttest_1samp 
Calculates the T-test for the mean of ONE group of scores.

scipy.stats.ttest_ind
Calculates the T-test for the means of TWO INDEPENDENT samples of scores.
This is a two-sided test for the null hypothesis that 2 independent samples have identical average (expected) values. This test assumes that the populations have identical variances by default.

scipy.stats.ttest_rel
Calculates the T-test on TWO RELATED samples of scores, a and b.
This is a two-sided test for the null hypothesis that 2 related or repeated samples have identical average (expected) values.


정규성 검정

scipy.stats.kstest
Perform the Kolmogorov-Smirnov test for goodness of fit.
D(max distance)

scipy.stats.shapiro
Perform the Shapiro-Wilk test for normality.
The Shapiro-Wilk test tests the null hypothesis that the data was drawn from a normal distribution.


등분산 검정 (equal variances)

scipy.stats.levene
Perform Levene test for equal variances.
The Levene test tests the null hypothesis that all input samples are from populations with equal variances. Levene’s test is an alternative to Bartlett’s test bartlett in the case where there are significant deviations from normality.

scipy.stats.bartlett
Perform Bartlett’s test for equal variances
Bartlett’s test tests the null hypothesis that all input samples are from populations with equal variances. For samples from significantly non-normal populations, Levene’s test levene is more robust.


신뢰 구간 (confidence interval)

scipy.stats.bayes_mvs(<데이터>, alpha=<신뢰도>)

T-Test 검정 실습

본문은 먼저 작성한 T 검정 방법을 통한 실습 내용을 다룬다.

먼저 샘플 데이터를 생성한다.

100명의 학생 (남학생 40, 여학생 60)의 성적 표본을 만들었다.

데이터 샘플 4개이다.
genderscore1score2
12M79.10212278.820603
31M81.70105178.597056
52F80.87003682.106735
28M80.09334081.895030

상세 보기 내용이다.
score1score2
count100.000000100.000000
mean79.48151580.947656
std2.0918501.954426
min73.46330376.973637
25%78.07064379.708372
50%79.72120280.781994
75%80.68171882.232054
max86.46994986.001438

다음은 가설을 세우고 검정하는 과정이다.

과목(score2)에서 남학생(M)과 여학생(F) 점수 분포에 차이가 있을 것으로 추론을 하였고,
다음과 같은 가설을 세웠다.

  • 귀무가설 H0: 남학생 점수 = 여학생 점수
  • 대립가설 H1: 남학생 점수 != 여학생 점수

유의 수준은 0.05로 정했다.

이해를 돕기 위해 플롯을 통해서 데이터를 시각화 해 보았다.

두개의 독립된 표본을 가짐으로 독립표본 T 검정 방법을 통해 결과를 추출한다.
Ttest_indResult(statistic=-4.8233119946622285, pvalue=5.1783040057372635e-06)

p-value < 0.05 (유의 수준) 임으로 귀무가설은 기각되고, 대립가설을 받아 들인다.
남학생과 여학생 점수에는 유의한 차이가 있는 것으로 볼 수 있다.


참고 - 검정 테스트 코드들

# 단일표본 T 검정
stats.ttest_1samp(<독립표본 1>, 80)
>>Ttest_1sampResult(statistic=0.38968001242188899, pvalue=0.6976102219750262)

# 독립표본 T 검정
stats.ttest_ind(<독립표본 1>, <독립표본 2>)
>>Ttest_indResult(statistic=-4.8233119946622285, pvalue=5.1783040057372635e-06)

# 대응표본 T 검정
stats.ttest_rel(<대응표본 1>, <대응표본 2>)
>>Ttest_relResult(statistic=-2.7629453241484772, pvalue=0.0068304073158760937)

# 대응표본을 단일표본 T 검정으로 푸는 방법
stats.ttest_1samp(<대응표본 1> - <대응표본 2>, 0)
>>Ttest_relResult(statistic=-2.7629453241484772, pvalue=0.0068304073158760937)

# 히스토그램과 정규 분포 그래프 그리는 방법
ax = figure(figsize=(6,3)).add_subplot(111)
test = sort(M)
fit = stats.norm.pdf(test, np.mean(test), np.std(test))
ax.plot(test,fit)
ax.hist(test,normed=True,bins=20)

# 표본 만들기 (mean, standard deviation, count)
stats.norm.rvs(loc=<평균>,scale=<표준편차>,size=<건수>)


T-Test 검정 방법

추론을 통해 가설을 세웠다면, 검정을 통해서 유의성을 확인하게 된다.
본문은 여러 방법 중에 하나인 T 검정을 사용하는 방법을 다룬다.

표본 종류별 T 검증

단일표본 T 검정
독립표본 T 검정
대응표본 T 검정
정의
표본과 모집단의 평균차이 분석
독립된 두 표본의 평균 차이 분석
짝을 이룬 데이터의 평균 변화의 분석
가정
정규성, 등분산성
정규성, 등분산성
정규성
귀무가설 (H0)
H0: μA=μ
H0: μA=μ
H0: μA=μ
대립가설 (H1)
H1: μB≠μ
H1: μB≠μ
H1: μB≠μ
비모수
X
Mann-Whitney 검정
Wilcoxon 순위합 부호 검정
파이썬 라이브러리
scipy.stats.ttest_1samp
scipy.stats.ttest_ind
scipy.stats.mannwhitneyu

scipy.stats.ttest_rel
scipy.stats.wilcoxon

표본 수에 따른 정규성 확인
표본수 > 30 : 중심극한정리에 의해 정규성을 가지는 것으로 가정할 수 있다.
30 > 표본수 > 10 : 정규성 검정이 필요하다.
10 > 표본수 : 정규성을 인정 받을 수 없음으로 비모수적인 통계 방법 사용한다.

정규성 검정 방법
Kolmogorov-Smirnov test
Sapiro-Wilks test

등분산성 검증 방법
Levene test
Bartlett’s test