Python 데이터 분석

Python 데이터분석 기초 34 - 서로 독립인 두 집단의 평균 차이 검정(independent samples t-test), 정규성, 등분산성

코딩탕탕 2022. 11. 8. 12:19

 

 

예제 1)

# 두 집단의 가설검정 – 실습 시 분산을 알지 못하는 것으로 한정하겠다.
# * 서로 독립인 두 집단의 평균 차이 검정(independent samples t-test)
# 남녀의 성적, A반과 B반의 키, 경기도와 충청도의 소득 따위의 서로 독립인 두 집단에서 얻은 표본을 독립표본(two sample)이라고 한다.

from scipy import stats
import pandas as pd
from numpy import average

# 실습) 남녀 두 집단 간 파이썬 시험의 평균 차이 검정
male = [75, 85, 100, 72.5, 86.5]
female = [63.2, 76, 52, 100, 70]

# 귀무 : 남녀 두 집단 간 파이썬 시험의 평균에 차이가 없다.
# 대립 : 남녀 두 집단 간 파이썬 시험의 평균에 차이가 있다.

print(average(male), ' ', average(female)) # 83.8   72.24
print(83.8 - 72.24) # 11.560

two_sample = stats.ttest_ind(male, female) # 두 개의 표본에 대한 t-test 실시
print(two_sample)
# Ttest_indResult(statistic=1.233193127514512, pvalue=0.2525076844853278)
# 해석 : pvalue = 0.25250768 > 0.05 이므로 귀무가설 채택


<console>
83.8   72.24
11.560000000000002
Ttest_indResult(statistic=1.233193127514512, pvalue=0.2525076844853278)

 

예제 2)

# 실습) 두 가지 교육방법에 따른 평균시험 점수에 대한 검정 수행 two_sample.csv'
data = pd.read_csv("../testdata/two_sample.csv")
print(data.head(3), len(data))

# 귀무 : 두 가지 교육방법에 따른 평균시험 점수에 차이가 없다.
# 대립 : 두 가지 교육방법에 따른 평균시험 점수에 차이가 있다.

ms = data[['method', 'score']]
print(ms)
# 교육방법별로 데이터 분리
m1 = ms[ms['method'] == 1]
m2 = ms[ms['method'] == 2]

score1 = m1['score']
score2 = m2['score']
print(score1)
print(score2)
print(score1.isnull().sum()) # 0
print(score2.isnull().sum()) # 2 NaN : 제거, 0, 평균으로 대체

sco1 = score1.fillna(score1.mean()) 
sco2 = score2.fillna(score2.mean()) # NaN를 평균으로 대체
print(sco2.isnull().sum())

# 정규성 검정
import matplotlib.pyplot as plt
import seaborn as sns
# sns.histplot(sco1, kde=True, color='r')
# sns.histplot(sco2, kde=True, color='b')
# plt.show()

# 정규성
print(stats.shapiro(sco1).pvalue) # 0.3679903745651245 > 0.05 정규성 만족
print(stats.shapiro(sco2).pvalue) # 0.6714189648628235 > 0.05 정규성 만족

# 등분산성
print(stats.levene(sco1, sco2).pvalue)   # 0.4568427112977609 > 0.05 등분산성 만족, 표본이 30개 이상일 경우 사용(모수 검정)
print(stats.fligner(sco1, sco2).pvalue)  # 0.44323735267062647 > 0.05 등분산성 만족, 표본이 30개 이상일 경우 사용(모수 검정)
print(stats.bartlett(sco1, sco2).pvalue) # 0.26789717886602216 > 0.05 등분산성 만족, 표본이 30개 미만일 경우 사용(비모수 검정)

result = stats.ttest_ind(sco1, sco2) # 정규성 만족, 등분산성 만족
print('t-value:%.5f, p-value:%.5f'%result) # t-value:-0.19649, p-value:0.84505
# 해석 : p-value : 0.86309 > 0.05 이므로 귀무 채택. 두 가지 교육방법에 따른 평균시험 점수에 차이가 없다.

print('참고 ---------')
result = stats.ttest_ind(sco1, sco2, equal_var=True) # 정규성 만족, 등분산성 만족
print('t-value:%.5f, p-value:%.5f'%result)

result = stats.ttest_ind(sco1, sco2, equal_var=False) # 정규성 만족, 등분산성 불만족
print('t-value:%.5f, p-value:%.5f'%result)

# result2 = stats.wilcoxon(sco1, sco2) # 정규성을 만족하지 않는 경우 # ValueError: The samples x and y must have the same length.
result2 = stats.mannwhitneyu(sco1, sco2)
print('t-value:%.5f, p-value:%.5f'%result2)


<console>
   no  gender  method  survey  score
0   1       1       1       1    5.1
1   2       1       2       0    NaN
2   3       1       1       1    4.7 50
    method  score
0        1    5.1
1        2    NaN
2        1    4.7
3        2    NaN
4        1    5.4
5        2    4.4
6        2    4.9
7        1    5.2
8        2    4.3
9        2    5.8
10       1    5.7
11       2    5.1
12       2    5.3
13       2    5.4
14       1    5.1
15       1    4.8
16       1    4.1
17       1    4.8
18       1    5.2
19       1    4.7
20       1    4.4
21       1    5.2
22       1    5.3
23       1    6.1
24       1    6.3
25       1    4.1
26       1    5.3
27       1    5.1
28       1    3.8
29       1    5.6
30       1    5.3
31       1    6.4
32       1    5.5
33       1    4.7
34       2    3.9
35       2    3.3
36       2    5.6
37       1    5.6
38       1    6.2
39       1    5.9
40       1    3.4
41       2    6.3
42       1    6.4
43       2    6.8
44       1    5.2
45       2    5.5
46       1    5.8
47       2    5.4
48       2    6.7
49       1    5.2
0     5.1
2     4.7
4     5.4
7     5.2
10    5.7
14    5.1
15    4.8
16    4.1
17    4.8
18    5.2
19    4.7
20    4.4
21    5.2
22    5.3
23    6.1
24    6.3
25    4.1
26    5.3
27    5.1
28    3.8
29    5.6
30    5.3
31    6.4
32    5.5
33    4.7
37    5.6
38    6.2
39    5.9
40    3.4
42    6.4
44    5.2
46    5.8
49    5.2
Name: score, dtype: float64
1     NaN
3     NaN
5     4.4
6     4.9
8     4.3
9     5.8
11    5.1
12    5.3
13    5.4
34    3.9
35    3.3
36    5.6
41    6.3
43    6.8
45    5.5
47    5.4
48    6.7
Name: score, dtype: float64
0
2
0
0.3679903745651245
0.6714189648628235
0.4568427112977609
0.44323735267062647
0.26789717886602216
t-value:-0.19649, p-value:0.84505
참고 ---------
t-value:-0.19649, p-value:0.84505
t-value:-0.18204, p-value:0.85693
t-value:261.00000, p-value:0.69678

 

문제 2번 정규성 검사

 

 

등분산성 : 등분산성 조건을 충족하는지 확인하기 위해서는 scipy에서 제공하는 검정을 주로 사용한다.

                 하지만 등분산성 조건을 충족하지 못하더라도 t-test를 사용할 수 있기는 하다. 

 

 - bartlett : scipy.stats.bartlett

 - fligner : scipy.stats.fligner

 - levene : scipy.stats.levene

 

등분산성은 집단 간의 비교를 할때만 검정한다.

 

 

참고

 

Daum 카페

 

cafe.daum.net