가설 검정

1. 통계적 가설 검정

`모집단의 특성에 대한 가설에 대한 통계적 유의성 검정 - 통계적 유의성 -> 확률적으로 봐서 단순한 우연이 아님

과정

  1. 귀무 가설 대립 가설 설정
  2. 검정 통계량 설정
  3. 기각역 설정
  4. 검정통계량 계산
  5. 의사 결정

가설 검정 오류

제 1종 오류 : 참인데 거짓이라 함

제 2종 오류 : 거짓인데 참

p-value : 귀무 가설이 맞다고 가정할 때 얻은 결과와 다른 결과가 관측될 확률, 귀무 가설을 기각할 근거가 됨.


1
from scipy.stats import *

T 검정

1
2
3
# 단일 표본 검정
ttest_1samp(ser_1, popmean = 5)
# pvalue가 대략적으로 0.05 미만이면기각
Ttest_1sampResult(statistic=-2.499999999999999, pvalue=0.04652823228416732)
1
2
# 대응 표본 검정
ttest_rel(ser_1, ser_2)
Ttest_relResult(statistic=-1.219715097075045, pvalue=0.2683379268893624)
1
2
# 독립 표본 검정(등분산 X)
ttest_ind(ser_1, ser_2, equal_var = False)
Ttest_indResult(statistic=-1.684024198163435, pvalue=0.11958234592838302)

독립성 검정(카이제곱 검정)

1
2
3
4
5
6
df_chi2 = pd.DataFrame({"ID": ["A", "A", "A", "A", "A", "B", "B", "B", "B", "B"],
                        "YN": ["Y", "N", "N", "Y", "N", "Y", "Y", "N", "Y", "Y"]})

df_crosstab = pd.crosstab(df_chi2["ID"], df_chi2["YN"])
chi2_contingency(df_crosstab)
# 통계량, P-VALUE, DF, 기대도수
(0.41666666666666663,
 0.5186050164287255,
 1,
 array([[2., 3.],
        [2., 3.]]))
1
df_crosstab 

YN N Y
ID
A 3 2
B 1 4

정규성

정규성을 만족하는지 확인하는 방법은 shapiro, kstest, qqplot 등이 있다.

1
2
3
4
5

ser_nor = pd.Series([4, 2, 5, 6, 7, 4, 5, 2, 6, 1, 3, 0, 15])
from scipy.stats import shapiro
shapiro(ser_nor)
# 통계량, p-value, 0.05이상이어야 정규성을 만족한다 할 수 있음.
(0.8451933264732361, 0.02470559999346733)

정규성 검정은 샘플 개수에 대해 민감한 편이므로 여러 방면으로 확인해 보는 것이 좋다.

등분산성

정규성을 만족하는 경우와 아닌 경우

1
2
3
4
5
6
# 표본이 정규성

ser_1 = pd.Series([2, 5, 3, 4, 6, 2, 3])
ser_2 = pd.Series([7, 3, 6, 5, 2, 6, 7])

bartlett(ser_1, ser_2)
BartlettResult(statistic=0.3574441170696212, pvalue=0.549929145265077)
1
2
# 표본이 정규 X
levene(ser_1, ser_2)
LeveneResult(statistic=0.1666666666666668, pvalue=0.6902818588864357)


일원분산분석(Anova)

셋 이상의 그룹에서 차이가 존재하는지 확인

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
ser_1 = pd.Series([2, 5, 3, 4, 6, 2, 3])
ser_2 = pd.Series([7, 3, 6, 5, 2, 6, 7])
ser_3 = pd.Series([9, 11, 4, 8, 2, 15, 3])

df_aov = pd.DataFrame([ser_1, ser_2, ser_3]).transpose().melt()

from statsmodels.formula.api import ols
from statsmodels.stats.anova import anova_lm

formula = "value ~ C(variable)" # C() 범주형 변수임을 명시
lm = ols(formula, df_aov).fit()
anova_lm(lm)
# p-value 0.05이하여야 유의미한 차이가 있다고 할 수 있음.

df sum_sq mean_sq F PR(>F)
C(variable) 2.0 52.666667 26.333333 2.783557 0.088449
Residual 18.0 170.285714 9.460317 NaN NaN

사후 검정

1
2
3
from statsmodels.stats.multicomp import pairwise_tukeyhsd
print(pairwise_tukeyhsd(df_aov["value"], df_aov["variable"]))
# reject가 true면 차이 있음
Multiple Comparison of Means - Tukey HSD, FWER=0.05
===================================================
group1 group2 meandiff p-adj   lower  upper  reject
---------------------------------------------------
     0      1   1.5714 0.6082 -2.6229 5.7658  False
     0      2   3.8571 0.0746 -0.3372 8.0515  False
     1      2   2.2857 0.3675 -1.9087 6.4801  False
---------------------------------------------------


상관분석

연속형 변수 간에 선형 관계 파악

1
2
df = pd.DataFrame([ser_1, ser_2, ser_3]).T
pd.plotting.scatter_matrix(df);

image

1
2
3
4
print(pearsonr(df.iloc[:,0], df.iloc[:,1]))
print(pearsonr(df.iloc[:,1], df.iloc[:,2]))
print(pearsonr(df.iloc[:,0], df.iloc[:,2]))
# 상관계수, p-value, 0.05미만이면 유의한 상관성이 있다고 봄
(-0.9359709753334592, 0.0019245719846704063)
(0.13695501944225102, 0.7696722723761817)
(-0.4136643973298085, 0.3562507831530036)
  • 스피어만 : 두 변수 순위의 단조 관련성을 측정. 변수의 분포가 심각하게 정규성을 벗어나거나 순위형 자료일 때 사용
1
2
# 스피어만 상관계수를 dataframe으로 보기
df.corr(method = 'spearman')

image

비선형 관계를 보려면 시각화 해보는 게 좋음

updatedupdated2021-03-242021-03-24
Load Comments?