Data Analysis & ML/Python을 활용한 통계분석

[통계분석] 표본추출과 T-Test

YSY^ 2020. 12. 19. 16:59

해당 포스팅에서는 Python을 활용하여 표본을 추출하고 T-Test를 진행합니다.

표본추출

import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
iris = load_iris()

df = pd.DataFrame(data=iris.data, columns=iris.feature_names)
df['target'] = iris.target

층화임의추출

  • 모집단이 이일적인 몇개의 계층으로 이루어져있을때 모든계층으로부터 원소를 임읠 추출하여 각 계층을 고루 대표할 수 있도록 랜덤하게 표본을 추출하는 방법
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = \
train_test_split(iris.data,#input data(feature)
                 iris.target, #output data(label)
                 test_size=0.2, #테스트 셋의 비율(전체중 20%, 기본:0.25)
                 stratify = iris.target, #각 class들을 같은 비율로 나눈다.
                 random_state=1 #random 시드값
                )

 

T-Test

일표본(단일표본) T-Test

  • 단일모집단에서 관심이 있는 연속형변수의 평균값을 특정기준값과 비교할때 사용
  • 모집단 평균과 일부집단의 편균비교
  • 귀무가설 : 차이가 없음
  • 대립가설 : 차이가 있음
# 정규성 검정
from scipy.stats import shapiro

# 알려진 평균
mu = 25

# 수집된 표본
data = [35,40,12,15,21,14,46,10,28,48,16,30,32,48,31,22,12,39,19,25]

# 정규성 검정
shapiro(data) 
# ShapiroResult(statistic=0.9335052371025085, pvalue=0.1803210973739624)

# 자유도
print(len(data)-1) # 19
from scipy.stats import ttest_1samp
ttest_1samp(data, mu) # p value가 0.05보다 크기때문에 귀무가설을 기각할수없음 -> 평균 25
# Ttest_1sampResult(statistic=0.7687155636314738, pvalue=0.4515123595472501)

대응표본 T-Test

  • 한 집단의 두개 변수의 점수 비교
  • 귀무가설 : 한집단의 사전, 사후 점수차이는 없음
  • 대립가설 : 한집단의 사전, 사후 점수차이가 있음
x1 = [.430,.266,.567,.531,.707,.716,.651,.589,.469,.723]
x2 = [.415,.238,.390,.410,.605,.609,.632,.523,.411,.612]


import matplotlib.pyplot as plt
%matplotlib inline

plt.figure(figsize=(6, 6))
plt.grid()
plt.boxplot([x1, x2])
plt.xlabel('when')
plt.ylabel('score')
plt.title('Box Plot')
plt.grid()
plt.show()

정규성 및 등분산성 검정

# 정규성 검사
from scipy.stats import shapiro

normal1 = shapiro(x1)
normal2 = shapiro(x2)
print(normal1, normal2) #p-Value가 둘다 0.05보다 크기때문에 정규성에 문제 없음
# ShapiroResult(statistic=0.928533136844635, pvalue=0.39620575308799744) ShapiroResult(statistic=0.8750206828117371, pvalue=0.08990474045276642)
# 등분산성 구하기(Levene test)
from scipy.stats import levene

levene(x1, x2)
# LeveneResult(statistic=0.0030014695285592624, pvalue=0.9568528070428306)
# 등분산성 구하기(Bartlett test)

from scipy.stats import bartlett

bartlett(x1, x2) #p-Value가 0.05보다 크므로 등분산성 있음
# BartlettResult(statistic=0.1364681869732803, pvalue=0.7118176678579515)
# 대응표본 T검정
from scipy.stats import ttest_rel

ttest_rel(x1, x2)#p-Value가 0.05보다 작으믈 귀무가설 기각 -> 두 그룹의 평균차이는 통계적으로 유의함
# Ttest_relResult(statistic=4.772148651603281, pvalue=0.0007546007653856079)

독립표본 T-Test

  • 독립적인 두 집단의 평균 비교
  • 귀무가설 : 두집단의 평균 차이 없음
  • 대립가설 : 두집단의 평균 차이 있음
from sklearn.datasets import load_iris
iris = load_iris()

df = pd.DataFrame(data=iris.data, columns=iris.feature_names)
df['target'] = iris.target
x1 = np.array(df.iloc[:,0][0:50])
x2 = np.array(df.iloc[:,0][50:100])
import matplotlib.pyplot as plt
%matplotlib inline

plt.figure(figsize=(6, 6))
plt.grid()
plt.boxplot([x1, x2])
plt.xlabel('species')
plt.ylabel('sepal')
plt.title('Iris Box Plot')

plt.show()

정규성 및 등분산성 검정

# 정규성 검정
normal1 = shapiro(x1)
normal2 = shapiro(x2)
print(normal1, normal2)  #두개다 p-value가 0.05이상이므로 정규성 만족
# ShapiroResult(statistic=0.9776989221572876, pvalue=0.4595281183719635) ShapiroResult(statistic=0.9778355956077576, pvalue=0.46473264694213867)
#등분산성 검정
from scipy.stats import levene, ttest_ind, bartlett
levene(x1, x2) #p-value가 0.05보다 작으므로 등분산성을 만족하지 못함
# LeveneResult(statistic=8.172720533728683, pvalue=0.005195521631017526)

bartlett(x1, x2) #p-value가 0.05보다 작으므로 등분산성을 만족하지 못함
# BartlettResult(statistic=6.891726740802407, pvalue=0.008659557933880048)
# 등분산성을 만족하지 않으면 독립t검정을 수행한다!!
ttest_ind(x1, x2, equal_var=False) #p-Value가 0.05보다 작기 때문에 2개 그룹의 평균은 통계적으로 유의한 차이가 있다.
# Ttest_indResult(statistic=-10.52098626754911, pvalue=3.746742613983842e-17)
728x90
반응형