반응형
수치형 데이터는 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
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보다 커서, 귀무가설 기각할수 없다. 즉, 등분산 검정 만족함.
반응형
'IT,SW,Data,Cloud,코딩 > Python' 카테고리의 다른 글
20230620 넘파이 ceil, floor, trunc (0) | 2023.06.21 |
---|---|
20230619 lightgbm (0) | 2023.06.19 |
20230619 빅분기 공부 5회 기출 유형 (0) | 2023.06.19 |
20230617 빅분기 4회 기출유형 제2유형 (0) | 2023.06.17 |
20230616 빅분기공부 (0) | 2023.06.17 |
20230615 머신러닝 공부, 시험환경 꿀팁 등 (0) | 2023.06.15 |
20230614 kaggle 따라치기 - 타이타닉 튜토리얼 (0) | 2023.06.14 |
20230614 하이퍼 파라메터 튜닝 - 랜덤포레스트, xgboost (0) | 2023.06.14 |
댓글