자주쓰는 모듈 구성

statsmodels
│
├── 01 사후분석
│   │
│   └──stats
│       └── multicomp
│           ├── MultiComparison
│           │   └── allpairtest
│           └── pairwise_tukeyhsd
│
├── 02 시계열분석
│   │
│   ├── graphics.tsaplots
│   │   ├── plot_acf
│   │   └── plot_pacf
│   └── tsa
│       ├── arima_model
│       │   └── ARIMA
│       └── statesplace.sarimax
│           └── SARIMAX
│
├── 03 ANOVA (scipy모듈과 함께써야 모두 커버가능, 이분산 anova의 경우 pingouin모듈의 welch_anova를 사용)
│   │
│   ├── 다원분산분석 or 이원분산분석
│   └── 일원분산분석
│       └── stats.anova
│           └── anova_lm
│
└── 04 회귀분석
    │
    └── formula.api
        └── ols

 

세 집단 이상 검정 (independent)

정규성 만족, 등분산 만족 : one-way anova
정규성 만족, 등분산 불만족 : welch’s anova
정규성 불만족 : kruskal-wallis H test

 

 1. x1,x2,x3의 변수들의 평균의 차이가 존재하는지 검정하라. 차이가 존재한다면 사후 분석까지 진행하라.

# 데이터 로드
import pandas as pd 
import matplotlib.pyplot as plt
df = pd.read_csv('https://raw.githubusercontent.com/Datamanim/datarepo/main/scipy/anova.csv')

data = df.x1
data2 = df.x2
data3 = df.x3

# 시각화
fig,ax = plt.subplots(1, 2, figsize = (12, 4))
ax[0].hist(data,alpha = 0.3, bins = 30, label = 'x1')
ax[0].hist(data2,alpha = 0.3, bins = 30, label = 'x2')
ax[0].hist(data3,alpha = 0.3, bins = 30, label = 'x3')
ax[0].legend()
labels = ['x1', 'x2', 'x3']
lst = [data,data2,data3]
ax[1].boxplot(lst, labels = labels) 
plt.show()

# 정규성 검정
from scipy.stats import shapiro
print(shapiro(data))
print(shapiro(data2))
print(shapiro(data3))
if (shapiro(data)[1] >= 0.05) & (shapiro(data2)[1] >= 0.05) & (shapiro(data3)[1] >= 0.05):
    print('모든 변수가 정규성을 만족')
else:
    print('정규성을 만족하지 않음')
    
# 등분산 검정
from scipy.stats import levene
statistic, p_value = levene(data, data2, data3)
print(levene(data, data2, data3))
if p_value < 0.05:
    print('귀무가설 기각 → 변수들의 분산이 동일하다고 할 수 없음')
else:
    print('귀무가설 기각 → 변수들의 분산이 동일하다고 할 수 있음')

# ANOVA
from scipy.stats import f_oneway
statistic, p_value = f_oneway(data, data2, data3)
print(f_oneway(data, data2, data3))
if p_value < 0.05:
    print('귀무가설 기각 → 변수들의 평균에 차이가 있다고 할 수 있음')
else:
    print('귀무가설 기각 → 변수들의 평균에 차이가 있다고 할 수 없음')
    
# 사후검정
# 방법1) tukey's HSD
from statsmodels.stats.multicomp import pairwise_tukeyhsd
posthoc = pairwise_tukeyhsd(dfm.value, dfm.variable, alpha = 0.05)
print(posthoc)
# 시각화
fig = posthoc.plot_simultaneous()
plt.show()
# 방법2) 봉페로니 교정
from statsmodels.sandbox.stats.multicomp import MultiComparison
import scipy.stats

comp = MultiComparison(dfm.value, dfm.variable)
result = comp.allpairtest(scipy.stats.ttest_ind, method = 'bonf')
print(result[0])
[output]
ShapiroResult(statistic=0.9979789853096008, pvalue=0.27395427227020264) ShapiroResult(statistic=0.9979418516159058, pvalue=0.2591271996498108) ShapiroResult(statistic=0.9987621307373047, pvalue=0.7300694584846497)
모든 변수가 정규성을 만족
LeveneResult(statistic=2.71270174202054, pvalue=0.06652021922816238)
귀무가설 기각 → 변수들의 분산이 동일하다고 할 수 있음
F_onewayResult(statistic=209.88499932318638, pvalue=4.919152988455592e-86)
귀무가설 기각 → 변수들의 평균에 차이가 있다고 할 수 있음

 

 2. x1,x2,x3의 변수들의 평균의 차이가 존재하는지 검정하라.

# 데이터 로드
import pandas as pd 
import matplotlib.pyplot as plt
df = pd.read_csv('https://raw.githubusercontent.com/Datamanim/datarepo/main/scipy/anova2.csv')

data = df.x1
data2 = df.x2
data3 = df.x3

# 시각화
fig,ax = plt.subplots(1, 2, figsize = (12, 4))
ax[0].hist(data,alpha = 0.3, bins = 30, label = 'x1')
ax[0].hist(data2,alpha = 0.3, bins = 30, label = 'x2')
ax[0].hist(data3,alpha = 0.3, bins = 30, label = 'x3')
ax[0].legend()
labels = ['x1', 'x2', 'x3']
lst = [data,data2,data3]
ax[1].boxplot(lst, labels = labels) 
plt.show()

# 정규성 검정
from scipy.stats import shapiro
print(shapiro(data))
print(shapiro(data2))
print(shapiro(data3))
if (shapiro(data)[1] > 0.05) & (shapiro(data2)[1] > 0.05) & (shapiro(data3)[1] > 0.05):
    print('모든 변수가 정규성을 만족')
else:
    print('정규성을 만족하지 않음')
    
# 등분산 검정
from scipy.stats import levene
statistic, p_value = levene(data, data2, data3)
print(levene(data, data2, data3))
if p_value <= 0.05:
    print('귀무가설 기각 → 변수들의 분산이 동일하다고 할 수 없음')
else:
    print('귀무가설 기각 → 변수들의 분산이 동일하다고 할 수 있음')

# ANOVA
from scipy.stats import f_oneway
statistic, p_value = f_oneway(data, data2, data3)
print(f_oneway(data, data2, data3))
if p_value < 0.05:
    print('귀무가설 기각 → 변수들의 평균에 차이가 있다고 할 수 있음')
else:
    print('귀무가설 기각 → 변수들의 평균에 차이가 있다고 할 수 없음')
[output]
ShapiroResult(statistic=0.9886645078659058, pvalue=0.5584133863449097) ShapiroResult(statistic=0.9924368858337402, pvalue=0.8519019484519958) ShapiroResult(statistic=0.9848724007606506, pvalue=0.31092315912246704)
모든 변수가 정규성을 만족
LeveneResult(statistic=1.845797549925243, pvalue=0.15970603203147626)
귀무가설 기각 → 변수들의 분산이 동일하다고 할 수 있음
F_onewayResult(statistic=2.386152612702158, pvalue=0.09374426938585023)
귀무가설 기각 → 변수들의 평균에 차이가 있다고 할 수 없음

 

3. target 변수들에 의해 value값들의 평균의 차이가 존재하는지 검정하라.

# 데이터 로드
import pandas as pd 
import matplotlib.pyplot as plt
df = pd.read_csv('https://raw.githubusercontent.com/Datamanim/datarepo/main/scipy/anova8.csv')

data = df[df.target == 'a'].value
data2 = df[df.target == 'b'].value
data3 = df[df.target == 'c'].value

# 시각화
fig,ax = plt.subplots(1, 2, figsize = (12, 4))
ax[0].hist(data, alpha = 0.3, bins = 30, label = 'a')
ax[0].hist(data2, alpha = 0.3, bins = 30, label = 'b')
ax[0].hist(data3, alpha = 0.3, bins = 30, label = 'c')
ax[0].legend()
labels = ['a', 'b', 'c']
lst = [data, data2, data3]
ax[1].boxplot(lst, labels = labels) 
plt.show()

# 정규성 검정
from scipy.stats import shapiro
print(shapiro(data))
print(shapiro(data2))
print(shapiro(data3))
if (shapiro(data)[1] > 0.05) & (shapiro(data2)[1] > 0.05) & (shapiro(data3)[1] > 0.05):
    print('모든 변수가 정규성을 만족')
else:
    print('정규성을 만족하지 않음')
    
# 정규성을 만족하지 않으므로 비모수 검정인 kruskal 검정
from scipy.stats import kruskal
statistic, p_value = kruskal(data, data2, data3)
print(kruskal(data, data2, data3))

if p_value < 0.05:
    print('귀무가설 기각 → 변수들의 평균에 차이가 있다고 할 수 있음')
else:
    print('귀무가설 기각 → 변수들의 평균에 차이가 있다고 할 수 없음')
[output]
ShapiroResult(statistic=0.9666392207145691, pvalue=0.012299093417823315) ShapiroResult(statistic=0.9713972210884094, pvalue=0.10934212058782578) ShapiroResult(statistic=0.9651247262954712, pvalue=0.41566193103790283)
정규성을 만족하지 않음
KruskalResult(statistic=6.9277037668798584, pvalue=0.03130893110123)
귀무가설 기각 → 변수들의 평균에 차이가 있다고 할 수 있음

 

4. target 변수들에 의해 value값들의 평균의 차이가 존재하는지 검정하라.

# 데이터 로드
import pandas as pd 
import matplotlib.pyplot as plt
df = pd.read_csv('https://raw.githubusercontent.com/Datamanim/datarepo/main/scipy/anova10.csv')

data = df[df.target == 'a'].value
data2 = df[df.target == 'b'].value
data3 = df[df.target == 'c'].value

# 시각화
fig,ax = plt.subplots(1, 2, figsize = (12, 4))
ax[0].hist(data, alpha = 0.3, bins = 30, label = 'a')
ax[0].hist(data2, alpha = 0.3, bins = 30, label = 'b')
ax[0].hist(data3, alpha = 0.3, bins = 30, label = 'c')
ax[0].legend()
labels = ['a', 'b', 'c']
lst = [data,data2,data3]
ax[1].boxplot(lst, labels = labels) 
plt.show()

# 정규성 검정
from scipy.stats import shapiro
print(shapiro(data))
print(shapiro(data2))
print(shapiro(data3))
if (shapiro(data)[1] > 0.05) & (shapiro(data2)[1] > 0.05) & (shapiro(data3)[1] > 0.05):
    print('모든 변수가 정규성을 만족')
else:
    print('정규성을 만족하지 않음')
    
# 등분산 검정
from scipy.stats import levene
statistic, p_value = levene(data, data2, data3)
print(levene(data, data2, data3))
if p_value <= 0.05:
    print('귀무가설 기각 → 변수들의 분산이 동일하다고 할 수 없음')
else:
    print('귀무가설 기각 → 변수들의 분산이 동일하다고 할 수 있음')

# 정규성은 만족하나 등분산성은 만족하지 않으므로 welch test로 검정
import pingouin as pg
test_result = pg.welch_anova(dv = 'value', between = 'target', data = df)
display(test_result)
if test_result['p-unc'].values[0] < 0.05:
    print('귀무가설 기각 → 변수들의 평균에 차이가 있다고 할 수 있음')
else:
    print('귀무가설 기각 → 변수들의 평균에 차이가 있다고 할 수 없음')
[output]
ShapiroResult(statistic=0.9835560917854309, pvalue=0.2487850785255432) ShapiroResult(statistic=0.9923046231269836, pvalue=0.9479172825813293) ShapiroResult(statistic=0.9523518681526184, pvalue=0.19537365436553955)
모든 변수가 정규성을 만족
LeveneResult(statistic=4.530341210288782, pvalue=0.011923468290294024)
귀무가설 기각 → 변수들의 분산이 동일하다고 할 수 없음

귀무가설 기각 → 변수들의 평균에 차이가 있다고 할 수 없음

 


출처: https://www.datamanim.com/dataset/96_statsmodels/statsmodels.html

+ Recent posts