본문 바로가기
IT,SW,Data,Cloud,코딩/Python

20230617 빅분기 3유형 가설검정 t-test, one-way ANOVA

by 착실하게 2023. 6. 17.
반응형

수치형 데이터는 T-검정 ( 모평균 가설검정)

1) 단일표본 t-test (one-sample t-test)

2) 독립표본 t-test (two sample t-test, independent t-test) 

3) 대응(쌍체)표본 t-test (paired t-test) 

 

관련 라이브러리는 scipy 사용

https://docs.scipy.org/doc/scipy/reference/stats.html

 

Statistical functions (scipy.stats) — SciPy v1.10.1 Manual

Statistical functions (scipy.stats) This module contains a large number of probability distributions, summary and frequency statistics, correlation functions and statistical tests, masked statistics, kernel density estimation, quasi-Monte Carlo functionali

docs.scipy.org

 

one-sample t-test, two-sample t-test, paired t-test

수치형 데이터. 평균 비교.

import pandas as pd 
from scipy import stats 

##########################################
# one-sample t-test 

df = pd.DataFrame({
    "하루 커피 몇 잔":[3,2,1,3,2,3,4,1,1,1,2,3,4,4,3,3,3,2,2,2]
})
# print(df.head(3))


# 귀무가설: 평균 2 와 같다. 
# 대립가설: 평균 2 보다 크다. 

result = stats.ttest_1samp(df["하루 커피 몇 잔"],2,alternative = "greater")

print(result.statistic)
print(result.pvalue)

# 귀무가설: 평균 2 와 같다. 
# 대립가설: 평균 2 보다 작다. 

result = stats.ttest_1samp(df["하루 커피 몇 잔"],2,alternative = "less")
print(result)

# 귀무가설: 평균 2 와 같다. 
# 대립가설: 평균 2 와 다르다. 

result = stats.ttest_1samp(df["하루 커피 몇 잔"],2,alternative = "two-sided")
print(result)


result = stats.ttest_1samp(df["하루 커피 몇 잔"],2 )
print(result)

print("=======================")
##########################################
# 독립표본 t-test. independent t-test. two-sample t-test 
# 두 모집단의 평균 비교 

# 정규분포를 따른 다는 가정
df = pd.DataFrame({
    "Agroup":[80,69,78,88,100,85,83,81,80,91,95,59,59,49,69,39,49,59,90,90,91,93,79,78,68,58,78,88,88],
    "Bgroup":[78,86,83,91,90,87,85,82,88,100,78,88,78,58,100,97,76,81,90,85,78,91,84,81,80,78,68,68,69]
})
df.head(3)

# 귀무가설과 대립가설1 
# 귀무가설. A집단과 B집단 시험점수 평균은 같다. 
# 대립가설. A집단이 B집단보다 평균점수가 작다. 
# 유의수준 0.05


#Agroup과 Bgroup의 모분산이 같을 때 
#디폴트값은 equal_var=True 
result = stats.ttest_ind(df['Agroup'],df['Bgroup'],alternative='less')
print(result)

#Agroup과 Bgroup의 모분산이 다를 때 
result = stats.ttest_ind(df['Agroup'],df['Bgroup'],alternative='less',equal_var=False)
print(result)


# 귀무가설과 대립가설2
# 귀무가설 (H0) A집단과 B집단 시험평균점수는 같다
# 대립가설 (H1) A집단이 B집단보다 시험평균점수가 크다 
# 유의수준 0.05

# (1) 두 집단의 모분산이 같을 때

result = stats.ttest_ind(df['Agroup'],df['Bgroup'],alternative='greater',equal_var=True)
print(result)  # 귀무가설 기각하지 못했다

# (2) 두 집단의 모분산이 다를 때 
result = stats.ttest_ind(df['Agroup'],df['Bgroup'],alternative='greater',equal_var=False)
print(result) # 귀무가설 기각하지 못했다


# 귀무가설과 대립가설3
# 귀무가설 (H0) A집단과 B집단 시험평균점수는 같다
# 대립가설 (H1) A집단과 B집단 시험평균점수는 다르다 
# 유의수준 0.05

result = stats.ttest_ind(df['Agroup'],df['Bgroup'],alternative='two-sided',equal_var=True)
print(result) # 유의수준 0.05에서 귀무가설 기각하지 못했다

result = stats.ttest_ind(df['Agroup'],df['Bgroup'],alternative='two-sided',equal_var=False)
print(result) # 유의수준 0.05에서 귀무가설 기각하지 못했다


print("=======================")
##########################################
# 3. 대응(쌍체) 표본 paired t-test 
# 동일한 대상에게 첫번째 관측 -> 두번째 관측
# 전후비교
# 오른쪽과 왼쪽 

# 정규분포를 따른 다는 가정
df = pd.DataFrame({
    "pre":[80,69,78,88,100,85,83,81,80,91,95,59,59,49,69,39,49,59,90,90,91,93,79,78,68,58,78,88,88],
    "post":[78,86,83,91,90,87,85,82,88,100,78,88,78,58,100,97,76,81,90,85,78,91,84,81,80,78,68,68,69]
})
# df.head(3)

# 귀무가설과 대립가설1
# 귀무가설: (전 - 후) 평균 = 0 
# 대립가설: (전 - 후) 평균 < 0 
# 유의수준: 0.05 

result = stats.ttest_rel(df['pre'],df['post'],alternative='less')
print(result) #귀무가설기각. 대립가설채택.



# 귀무가설과 대립가설2
# 귀무가설: (전 - 후) 평균 = 0 
# 대립가설: (전 - 후) 평균 > 0 
# 유의수준: 0.05 

result = stats.ttest_rel(df['pre'],df['post'],alternative='greater')
print(result) # 귀무가설을 기각하지 못한다 




# 귀무가설과 대립가설3
# 귀무가설: (전 - 후) 평균 = 0 
# 대립가설: (전 - 후) 평균 != 0 
# 유의수준: 0.05 
result = stats.ttest_rel(df['pre'],df['post'],alternative='two-sided')
print(result) # 귀무가설을 기각하지 못한다

 

 

독립성 검정. chi-square 

두 범주형 변수의 관련성. 

독립적인지 아닌지.

chi A chi continuous random variable 
chi2 A chi-squared continuous random variable 
chisquare Calculate a one-way chi-square test 
chi2_contingency Chi-square test of independence of variables in a contingency table.
friedmanchisquare Compute the Friedman test for repeated samples 

 

 

import pandas as pd 
# from scipy import stats 
from scipy.stats import chi2_contingency

# 독립성 검정.
# 두개의 범주형 변수의 관련성 비교. 독립적인지 아닌지. 

# 귀무가설: A와 B는 독립이다. 
# 대립가설: A와 B는 독립이 아니다.

# 유의수준: 0.05 

df = pd.DataFrame([[50,60],[25,40]])
print(df)
#      B1, B2 
# A1 : 50, 60 
# A2 : 25, 40 

result=chi2_contingency(df)
print(result) 

stat, pv, dof, expected_freq = chi2_contingency(df)
print(round(stat,2))
print(round(pv,4))
# 통계적으로 유의하지 않다. 
# A와 B는 독립이라는 귀무가설을 기각하지 못했다. 
# A와 B는 독립이 아니라고 할 수 없다. 

# correction=True/False 
#연속성 수정(Yates's correction for continuity): 기본값은 True.

statistic, pvalue, dof, expected_freq = chi2_contingency(df,correction=False)
print(round(stat,2))
print(round(pv,4))

# 아래부분은 강의에는 없었는데 찾아보니 chisquare, friedmanchisquare도 있어서 일단 메모
# print("=====================================")
# from scipy.stats import chisquare 
# result = chisquare(df)
# print(result)

 

 

import pandas as pd

a = pd.read_csv('data/blood_pressure.csv', index_col=0)

from scipy.stats import (ttest_1samp, ttest_ind, ttest_rel)

df1 = pd.DataFrame({
	'col1' : [1,2,3,4,5],
	'col2' : [345,765,234,456,34]
})

result = ttest_1samp(df1.col1,7,alternative='two-sided')
print(result)

result = ttest_ind(df1.col1,df1.col2,alternative='two-sided',equal_var=True)
print(result)

result = ttest_ind(df1.col1,df1.col2,alternative='two-sided',equal_var=False)
print(result)

result = ttest_rel(df1.col1,df1.col2,alternative='two-sided')
print(result)


############################################
from scipy.stats import chi2_contingency

df = pd.DataFrame([[50,60],[25,40]])
result = chi2_contingency(df)
print(result)

 

분산분석. one-way ANOVA 

 

# 일원배치법. 분산분석. one-way ANOVA 
# 관측치가 3개 이상일 때 활용
# 그룹 간의 평균차이를 비교하기 위해 사용되는 통계적 검정 
# 양측 검정만 있음. 방향이 없음. alternative 파라메터 없음.
# 검정: F-value
# 귀무가설: 세 그룹 간의 평균 차이가 없다. 모평균의 차이가 없다. 
# 대립가설: 세 그룹 간의 평균 차이가 있다. 모평균이 모두 같지는 않다. 
# 단, 각 그룹의 데이터는 정규성을 만족하고, 그룹간의 등분산성은 동일하다. 

################################################################
# 데이터 생성 (실행)
import pandas as pd
group_A = [78, 85, 92, 88, 76, 81, 80, 79, 83, 89, 91, 87]
group_B = [77, 74, 84, 82, 79, 80, 85, 88, 81, 76, 78, 83]
group_C = [79, 78, 72, 75, 74, 76, 73, 68, 71, 75, 79, 72]

pd.DataFrame({
    'group_A':group_A,
    'group_B':group_B,
    'group_C':group_C
}).to_csv("oneway.csv", index=False)

df = pd.read_csv('oneway.csv')

################################################################
# one-way ANOVA. 분산분석 수행.
import pandas as pd 
from scipy.stats import f_oneway

f,p = f_oneway(df['group_A'],df['group_B'],df['group_C'])

print(f)
print(p)

print(round(f,2))
print(format(p,'.6f'))

#평균의 차이가 있다.

 

정규성 검정. 등분산성 검정. 

p-value 가 크면 정규성 검정 만족. 정규성을 따름

p-value가 크면 그룹 간 분산이 동일함. 등분산성 검정을 만족. 

# 일원배치법. 분산분석. one-way ANOVA 
# 관측치가 3개 이상일 때 활용
# 그룹 간의 평균차이를 비교하기 위해 사용되는 통계적 검정 
# 양측 검정만 있음. 방향이 없음. alternative 파라메터 없음.
# 검정: F-value
# 귀무가설: 세 그룹 간의 평균 차이가 없다. 모평균의 차이가 없다. 
# 대립가설: 세 그룹 간의 평균 차이가 있다. 모평균이 모두 같지는 않다. 
# 단, 각 그룹의 데이터는 정규성을 만족하고, 그룹간의 등분산성은 동일하다. 

################################################################
# 데이터 생성 (실행)
import pandas as pd
group_A = [78, 85, 92, 88, 76, 81, 80, 79, 83, 89, 91, 87]
group_B = [77, 74, 84, 82, 79, 80, 85, 88, 81, 76, 78, 83]
group_C = [79, 78, 72, 75, 74, 76, 73, 68, 71, 75, 79, 72]

pd.DataFrame({
    'group_A':group_A,
    'group_B':group_B,
    'group_C':group_C
}).to_csv("oneway.csv", index=False)

df = pd.read_csv('oneway.csv')

################################################################
# one-way ANOVA. 분산분석 수행.
import pandas as pd 
from scipy.stats import f_oneway

f,p = f_oneway(df['group_A'],df['group_B'],df['group_C'])

print(f)
print(p)

print(round(f,2))
print(format(p,'.6f')) #평균의 차이가 있다. 

#######################################
# 일원배치법 사용의 전제조건: 각 그룹의 데이터는 정규분포를 따르고 등분산을 가진다. 
# 만약, 정규성 검정 만족하는지, 등분산성 검정 만족하는지 묻는다면? 
# t-test, one-way ANOVA 모두 물어볼 수 있는 부분임. 

# 정규성 검정? shapiro
# 주어진 데이터가 정규 분포를 따르는지 확인
# 귀무가설: 정규분포를 따른다. 
# 대립가설: 정규분포를 따르지 않는다. 

from scipy.stats import shapiro 
a = shapiro(df['group_A'])
b = shapiro(df['group_B'])
c = shapiro(df['group_C'])
print('shapiro',a,b,c,sep='\n') # 세개 다 pvalue가 0.05보다 커서, 귀무가설 기각할수 없다. 즉, 정규분포 따른다.

# 등분산성 검정? levene 
# 그룹 간 분산이 동일한지 확인하는 검정. 
# 귀무가설: 각 그룹 데이터는 등분산을 가진다. 
# 대립가설: 하나 이상의 그룹이 등분산을 가지지 않는다. 

from scipy.stats import levene
result = levene(df['group_A'],df['group_B'],df['group_C'])
print(result) # pvalue가 0.05보다 커서, 귀무가설 기각할수 없다. 즉, 등분산 검정 만족함.

 

반응형

댓글