카테고리 없음

[TIL 69일차] 통계 검정 - 모수적 방법

_한량 2025. 3. 3. 18:47
태블로란?

 

[목차]

  1. 정규성 검정

[주요내용]

 1. 정규성 검정

  • H_o : 데이터가 정규분포를 따른다.
  • H_1 : 데이터가 정규분포를 따르지 않는다.
  1. shapiro-wilk : 작은 표본(n≤ 50) 에 적합
  2. Kolmogorov-Smirnov: 표본이 클 때 사용, shaprio보다 덜 랑력
#정규성 검정 - Shapiro-Wilk
from scipy.stats import shapiro
statistic, p_value = shapiro(data)

#정규성 검정 - Kolmogorov-Smirnov 검정 
from scipy.stats import kstest
statistic, p_value = kstest(data, 'norm')

print(f"Test Statistic: {statistic}")
print(f"p-value: {p_value}")

if p_value > alpha:
    print("정규성을 따른다고 볼 수 있습니다.")
else:
    print("정규성을 따른다고 볼 수 없습니다.")
  • 시각화 예제
from scipy.stats import shapiro, probplot
import matplotlib.pyplot as plt
import seaborn as sns

man = df3[df3['성별'] =='남']['급여']
woman = df3[df3['성별'] =='여']['급여']

# Shapiro-Wilk test
statistic_m, p_value_m = shapiro(man)
statistic_w, p_value_w = shapiro(woman)

# Figure 생성
plt.figure(figsize=(12, 6))

# 1. 남성 그룹 히스토그램과 Q-Q plot
plt.subplot(2, 2, 1)
sns.histplot(man, kde=True, label='man', color='blue')
plt.title(f'Man Salary Distribution\nShapiro p-value: {p_value_m:.3f}')
plt.legend()

plt.subplot(2, 2, 2)
probplot(man, dist="norm", plot=plt)
plt.title('Man Q-Q Plot')

# 2. 여성 그룹 히스토그램과 Q-Q plot
plt.subplot(2, 2, 3)
sns.histplot(woman, kde=True, label='woman', color='green')
plt.title(f'Woman Salary Distribution\nShapiro p-value: {p_value_w:.3f}')
plt.legend()

plt.subplot(2, 2, 4)
probplot(woman, dist="norm", plot=plt)
plt.title('Woman Q-Q Plot')

plt.tight_layout()
plt.show()
  • 등분산 검정
  • H_o: 두 집단의 분산이 같다.
  • H_1 : 두 집단의 분산이 다르다.
    1. Levene: 여러 그룹의 분산이 동일한지 검정, 정규성 검정 필요하지 않음
    2. Bartlett: 데이터가 정규 분포를 따른다는 가정, 정규성이 만족될때 Leven보다 검정력 높음
    3. fligner:
from scipy.stats import levene, bartlett, fligner

statistic, p_value = levene(data1, data2)
# statistic, p_value = bartlett(data1, data2)
# statistic, p_value = fligner(data1, data2)
  • 일표본 t 검정
    • H_o:표본의 평균이 특정 값과 같다.
    • H_1: 표본의 평균의 특정 값과 같지 않다.
  • 이표본 t 검정
    • H_o: 두 집단의 평균이 같다.
    • H_1: 두 집단의 평균이 다르다.
# 독립표본 t 검정
from scipy.stats import ttest_ind,ttest_rel
# 등분산성을 만족하는 경우
statistic, p_value = ttest_ind(data1, data2, equal_var=True)
# 등분산성을 만족하지 않는 경우
# statistic, p_value = ttest_ind(data1, data2, equal_var=False)

#대응표본 t검정
# statistic, p_value = ttest_rel(data_before, data_after)

print(statistic, p_value)
  • 분산 분석
    • 목적: 그룹간 분산과그룹내 분산을 비교
    • H_0: 모든 그룹의 평균값이 같다.
    • H_1: 적어도 하나 그룹의 평균값이 다른 그룹과 다르다.
import pandas as pd
import numpy as np

# 그룹별 데이터 생성 (예시 데이터)
np.random.seed(123)

group_A = np.random.normal(loc=50, scale=5, size=30)
group_B = np.random.normal(loc=55, scale=5, size=30)
group_C = np.random.normal(loc=60, scale=5, size=30)

# 데이터 프레임 생성
df = pd.DataFrame({
    'score': np.concatenate([group_A, group_B, group_C]),
    'group': ['A'] * 30 + ['B'] * 30 + ['C'] * 30
})

import statsmodels.api as sm
from statsmodels.formula.api import ols

# ANOVA 모델 생성
model = ols('score ~ C(group)', data=df).fit()

# 분산분석표 생성
anova_table = sm.stats.anova_lm(model, typ=2)

# 결과 출력
print(anova_table)
  • 사후 분석
    • Tukey’s HSD 검정
from statsmodels.stats.multicomp import pairwise_tukeyhsd

# 일원분산분석의 사후분석 예시
tukey_result = pairwise_tukeyhsd(endog=df['score'], groups=df['group'], alpha=0.05)

print(tukey_result)
  • two-way anova
import statsmodels.api as sm
from statsmodels.formula.api import ols

# 이원분산분석 모델 생성 (교호작용 포함)
model = ols('값 ~ C(요인1) * C(요인2)', data=df).fit()

# 분산분석표 생성
anova_table = sm.stats.anova_lm(model, typ=2)
# 결과 출력
print(anova_table)
  • Welch Anova
    • 목적: 그룹 간의 등분산성이 가정이 필요없는 경우 사용
    • H_0: 모든 그룹의 평균이 같다.
    • H_1: 적어도 하나 그룹의 평균값이 다른 그룹과 다르다.