Python 데이터 분석

t-test 검정 문제(1) 정규성 확인

코딩탕탕 2022. 11. 8. 17:14

 

[two-sample t 검정 : 문제1] 

다음 데이터는 동일한 상품의 포장지 색상에 따른 매출액에 대한 자료이다. 

포장지 색상에 따른 제품의 매출액에 차이가 존재하는지 검정하시오.

   blue : 70 68 82 78 72 68 67 68 88 60 80

   red : 60 65 55 58 67 59 61 68 77 66 66

 

작성자 코드

# [two-sample t 검정 : 문제1] 
# 다음 데이터는 동일한 상품의 포장지 색상에 따른 매출액에 대한 자료이다. 
# 포장지 색상에 따른 제품의 매출액에 차이가 존재하는지 검정하시오.

import numpy as np
import scipy.stats as stats
import pandas as pd
import matplotlib.pyplot as plt

# 귀무 : 포장지 색상에 따른 제품의 매출액에 차이가 없다.
# 대립 : 포장지 색상에 따른 제품의 매출액에 차이가 있다.

blue = [70, 68, 82, 78, 72, 68, 67, 68, 88, 60, 80]
red = [60, 65, 55, 58, 67, 59, 61, 68, 77, 66, 66]

print(np.mean(blue), ' ', np.mean(red)) # 72.8181 vs 63.81818

print(stats.shapiro(blue)) # pvalue=0.51023 > 0.05 이므로 정규성 만족
print(stats.shapiro(red))  # pvalue=0.53479 > 0.05 이므로 정규성 만족

two_sample = stats.ttest_ind(blue, red) # 두 개의 표본에 대한 t-test 실시
print(two_sample)
# Ttest_indResult(statistic=2.9280203225212174, pvalue=0.008316545714784403
# 해석 : pvalue = 0.00831 < 0.05 이므로 귀무 기각.  포장지 색상에 따른 제품의 매출액에 차이가 있다.




<console>
72.81818181818181   63.81818181818182
ShapiroResult(statistic=0.9391219615936279, pvalue=0.5102316737174988)
ShapiroResult(statistic=0.9412071704864502, pvalue=0.534792423248291)
Ttest_indResult(statistic=2.9280203225212174, pvalue=0.008316545714784403)

 

다른 방법 코드

import numpy as np
import scipy.stats as stats
import pandas as pd
import matplotlib.pyplot as plt
from numpy import average

# [two-sample t 검정 : 문제1] 
# 다음 데이터는 동일한 상품의 포장지 색상에 따른 매출액에 대한 자료이다. 
# 포장지 색상에 따른 제품의 매출액에 차이가 존재하는지 검정하시오.

blue = [70, 68, 82, 78, 72, 68, 67, 68, 88, 60, 80]
red = [60, 65, 55, 58, 67, 59, 61, 68, 77, 66, 66]

# 귀무 : 동일한 상품의 포장지 색상에 따른 제품의 매출액 차이가 없다.
# 대립 : 동일한 상품의 포장지 색상에 따른 제품의 매출액 차이가 있다.

print(average(blue), ' ', average(red))   # 72.81  63.81  
print(72.81 - 63.81)   # 차이 : 9.0
two_sample1 = stats.ttest_ind(blue, red)  # 두 개의 표본에 대한 t-test 실시
print(two_sample1) # statistic=2.9280203225212174, pvalue=0.008316545714784403
#===========================================================================================
# 해석 : pvalue=0.00831 < 0.05 보다 작으므로 귀무가설 기각. 동일한 상품의 포장지 색상에 따른 제품의 매출액 차이가 있다.
#===========================================================================================


<console>
72.81818181818181   63.81818181818182
9.0
Ttest_indResult(statistic=2.9280203225212174, pvalue=0.008316545714784403)

 

 

 

[two-sample t 검정 : 문제2]  

아래와 같은 자료 중에서 남자와 여자를 각각 15명씩 무작위로 비복원 추출하여 혈관 내의 콜레스테롤 양에 차이가 있는지를 검정하시오.

  남자 : 0.9 2.2 1.6 2.8 4.2 3.7 2.6 2.9 3.3 1.2 3.2 2.7 3.8 4.5 4 2.2 0.8 0.5 0.3 5.3 5.7 2.3 9.8

  여자 : 1.4 2.7 2.1 1.8 3.3 3.2 1.6 1.9 2.3 2.5 2.3 1.4 2.6 3.5 2.1 6.6 7.7 8.8 6.6 6.4

 

랜덤으로 15개를 뽑아야 하기 때문에 random 함수를 사용한다.

 

# [two-sample t 검정 : 문제2]  
# 아래와 같은 자료 중에서 남자와 여자를 각각 15명씩 무작위로 비복원 추출하여 혈관 내의 콜레스테롤 양에 차이가 있는지를 검정하시오.

# 귀무 : 혈관 내의 콜레스테롤 양에 차이가 없다.
# 대립 : 혈관 내의 콜레스테롤 양에 차이가 있는 있다.
  
man = [0.9, 2.2, 1.6, 2.8, 4.2, 3.7, 2.6, 2.9, 3.3, 1.2, 3.2, 2.7, 3.8, 4.5, 4, 2.2, 0.8, 0.5, 0.3, 5.3, 5.7, 2.3, 9.8]
woman = [1.4, 2.7, 2.1, 1.8, 3.3, 3.2, 1.6, 1.9, 2.3, 2.5, 2.3, 1.4, 2.6, 3.5, 2.1, 6.6, 7.7, 8.8, 6.6, 6.4]

import random
random.seed(123)
man = random.sample(man, 15)     # 무작위로 15명 비복원 추출
woman = random.sample(woman, 15) # 무작위로 15명 비복원 추출

print(np.mean(man), ' ', np.mean(woman)) # 3.22 vs 3.27

print(stats.shapiro(man))    # pvalue=0.0376 < 0.05 이므로 정규성 불만족
print(stats.shapiro(woman))  # pvalue=0.0014 < 0.05 이므로 정규성 불만족

# two_sample2 = stats.ttest_ind(man, woman) # 두 개의 표본에 대한 t-test 실시, 정규성 만족이 아니기 때문에 이 방법은 안 된다.
# print(two_sample2)

print(stats.wilcoxon(man, woman)) # 정규성 만족이 안 될 때 이 방법을 사용한다.
# statistic=59.0, pvalue=0.97796630859375
# 해석 : pvalue=0.97796 > 0.05 이므로 귀무 채택. 혈관 내의 콜레스테롤 양에 차이가 없다.




<console>
3.220000000000001   3.273333333333334
ShapiroResult(statistic=0.873214602470398, pvalue=0.0376255065202713)
ShapiroResult(statistic=0.7687029838562012, pvalue=0.0014988253824412823)
WilcoxonResult(statistic=59.0, pvalue=0.97796630859375)

중요! 정규성 불만족일 경우에는 stats.wilcoxon() 함수를 사용하여 pvalue를 계산한다. 불만족이 나올 수도 있으니 정규성 검사는 꼭 필요하다.

 

정규성을 만족하지 않는 경우 두 가지 방법이 있다.

result2 = stats.wilcoxon(sco1, sco2)
result2 = stats.mannwhitneyu(sco1, sco2)