Python 데이터 분석
Python 데이터분석 기초 33 - 실습 예제 2, 3,4) 단일 표본 t 검정 (one-sample t- test)
코딩탕탕
2022. 11. 7. 17:45
실습 예제 2)
# 실습 예제 2) 단일표본 t 검정 (one-sample t-test)
# 귀무 : 어느 한 집단의 자료들 평균은 0이다.
# 대립 : 어느 한 집단의 자료들 평균은 0이 아니다.
np.random.seed(1)
mu = 0
n = 10
x = stats.norm(mu).rvs(n) # 랜덤한 데이터 10개 생성
print(x, np.array(x).mean()) # -0.0971408
# sns.displot(x, kde=True, rug = True) # kde = 선, rug = 밑의 그래프
# plt.show()
result2 = stats.ttest_1samp(x, popmean = mu)
# result2 = stats.ttest_1samp(x, popmean = 0.9)
print('result2 : statistic(t-value) : {}, p-value : {}'.format(result2[0], result2[1]))
# 해석 : p-value : 0.8121703589172078 > 0.05 이므로 귀무가설 채택. 어느 한 집단의 자료들 평균은 0이다.
<console>
[ 1.62434536 -0.61175641 -0.52817175 -1.07296862 0.86540763 -2.3015387
1.74481176 -0.7612069 0.3190391 -0.24937038] -0.09714089080609985
result2 : statistic(t-value) : -2.511903862200501, p-value : 0.033206859534901594
실습 예제 3)
하나의 집단에 대한 표본평균이, 예측된 평균과 차이가 있는지 검증
# 실습 예제 3)
# A중학교 1학년 1반 학생들의 시험결과가 담긴 파일을 읽어 처리 (국어 점수 평균검정) student.csv
# 귀무 : A중학교 1학년 1반 학생들의 국어 점수 평균은 80이다.
# 대립 : A중학교 1학년 1반 학생들의 국어 점수 평균은 80이 아니다.
data = pd.read_csv('../testdata/student.csv')
print(data.head(3))
# 집단이 국어 하나이다.
print(data.국어.mean()) # 72.9 vs 80.0 차이?
result3 = stats.ttest_1samp(data.국어, popmean = 80)
print('result3 : statistic(t-value) : {}, p-value : {}'.format(result3[0], result3[1]))
# 해석 : p-value : 0.19856051824785262 > 0.05 이므로 귀무가설 채택. A중학교 1학년 1반 학생들의 국어 점수 평균은 80이다.
<console>
이름 국어 영어 수학
0 박치기 90 85 55
1 홍길동 70 65 80
2 김치국 92 95 76
72.9
result3 : statistic(t-value) : -1.3321801667713213, p-value : 0.19856051824785262
실습 예제 4)
여아 신생아 몸무게의 평균 검정 수행 babyboom.csv 여아 신생아의 몸무게는 평균이 2800(g)으로 알려져 왔으나 이보다 더 크다는 주장이 나왔다. 표본으로 여아 18명을 뽑아 체중을 측정하였다고 할 때 새로운 주장이 맞는지 검정해 보자.
# 실습 예제 4)
# 여아 신생아 몸무게의 평균 검정 수행 babyboom.csv
# 여아 신생아의 몸무게는 평균이 2800(g)으로 알려져 왔으나 이보다 더 크다는 주장이 나왔다.
# 표본으로 여아 18명을 뽑아 체중을 측정하였다고 할 때 새로운 주장이 맞는지 검정해 보자.
# 귀무 : 여아 신생아 몸무게의 평균은 2800(g)이다.
# 대립 : 여아 신생아 몸무게의 평균은 2800(g)이 아니다.
babyData = pd.read_csv('../testdata/babyboom.csv')
print(babyData.head(3))
# print(babyData.describe())
fdata = babyData[babyData.gender == 1] # 여아는 1, 남아는 2로 가정
print(fdata, ' ', len(fdata))
# print(fdata.describe())
print(np.mean(fdata.weight)) # 3132.44 vs 2800 차이?
# 정규분포 확인
# sns.distplot(fdata.iloc[:,2], kde=True)
# plt.show()
# stats.probplot(fdata.iloc[:,2], plot=plt) # Q-Q plot
# plt.show()
# print('정규성 :', stats.shapiro(fdata.iloc[:,2])) # pvalue=0.017984 < 0.05 이므로 정규성 만족 못함. 데이터에 문제가 있을 수 있으나 공부 중이니 그대로 진행.
result4 = stats.ttest_1samp(fdata.weight, popmean = 2800)
print('result4 : statistic(t-value) : {}, p-value : {}'.format(result4[0], result4[1]))
# p-value : 0.03926 < 0.05 이므로 귀무가설 기각. 여아 신생아 몸무게의 평균은 2800(g)이 아니다.
# ... 증가해서 뭐가 어쩌구 저쩌구...
<console>
time gender weight minutes
0 5 1 3837 5
1 104 1 3334 64
2 118 2 3554 78
time gender weight minutes
0 5 1 3837 5
1 104 1 3334 64
5 405 1 2208 245
6 407 1 1745 247
12 814 1 2576 494
13 909 1 3208 549
15 1049 1 3746 649
16 1053 1 3523 653
21 1406 1 3430 846
22 1407 1 3480 847
23 1433 1 3116 873
24 1446 1 3428 886
28 1742 1 2184 1062
30 1825 1 2383 1105
36 2010 1 3500 1210
41 2217 1 3866 1337
42 2327 1 3542 1407
43 2355 1 3278 1435 18
3132.4444444444443
result4 : statistic(t-value) : 2.233187669387536, p-value : 0.03926844173060218
검정만으로 끝나는 것이 아니라, 검정의 결과를 바탕으로 무언가를 설명할 수 있어야 된다.

