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

검정만으로 끝나는 것이 아니라, 검정의 결과를 바탕으로 무언가를 설명할 수 있어야 된다.