통계

가설검정에 사용하는 분포 선택 및 통계적 검정법

장수우 2024. 11. 6. 23:11

1. 정규 분포 (Normal Distribution)와 Z-검정, t-검정

정규 분포는 데이터를 분석할 때 가장 널리 쓰이며, Z-검정과 t-검정 같은 기법에 사용됩니다.

  • Z-검정:
    표본 크기가 크고 모집단의 분산이 알려진 경우, Z-검정을 통해 두 평균을 비교합니다.
    표본 평균이 정규분포를 따르는 가정하에 정규분포의 Z-분포를 사용합니다.
  • t-검정:
    표본 크기가 작거나 모집단의 분산을 모를 때 t-분포를 사용하여 평균 차이를 검정합니다.
    주로 두 집단 간 평균 차이 검정(독립표본 t-검정)이나 같은 집단에서의 평균 차이(대응표본 t-검정)에 사용됩니다.
    ex) 특정 제품에 대한 고객 만족도가 이전과 달라졌는지 확인하기 위해 t-검정을 통해 두 집단의 평균 만족도를 비교
from scipy.stats import norm

# 가설 설정
# 귀무가설: 제품의 평균 무게는 500g이다.
# 대립가설: 제품의 평균 무게는 500g이 아니다.

# 샘플 데이터
sample_mean = 505  # 샘플 평균
population_mean = 500  # 모집단 평균
std_dev = 10  # 모집단의 표준편차
n = 30  # 샘플 크기

# Z-통계량 계산
z_score = (sample_mean - population_mean) / (std_dev / (n ** 0.5))
p_value = 2 * (1 - norm.cdf(abs(z_score)))

print(f"Z-통계량: {z_score}")
print(f"P-값: {p_value}")
### Z-통계량이 유의 수준을 초과하면 귀무가설을 기각하여 평균 무게가 500g이 아니라고 결론 내릴 수 있습니다.
## Z-통계량: 2.7386127875258306
## P-값: 0.0061698993205441255

2. 카이제곱 분포 (Chi-Square Distribution)와 카이제곱 검정

카이제곱 분포는 범주형 데이터 간의 독립성 검정이나 적합도 검정에 사용됩니다.

  • 적합도 검정:
    데이터가 특정 분포(예: 정규분포, 균일분포 등)에 적합한지를 검정합니다.
  • 독립성 검정:
    두 범주형 변수 간의 독립성을 검정하여, 변수 간의 관계가 통계적으로 유의미한지 판단합니다.
from scipy.stats import chi2_contingency

# 구매 여부와 상품 유형에 대한 교차표
data = [[10, 20], [15, 25]]  # [[구매 안 함, 구매] for 상품 1, 상품 2]

# 카이제곱 독립성 검정 수행
chi2, p_value, dof, expected = chi2_contingency(data)

print(f"카이제곱 통계량: {chi2}")
print(f"P-값: {p_value}")
## 카이제곱 통계량: 0.011666666666666653
## P-값: 0.9139858996305869

 

3. t-분포 (t-Distribution)와 t-검정

t-분포는 표본 크기가 작고 모집단의 분산을 모를 때 주로 평균을 비교하는 검정에서 사용됩니다.

  • 단일표본 t-검정:
    표본의 평균이 특정 값과 유의미한 차이가 있는지 검정합니다.
  • 독립표본 t-검정:
    두 집단의 평균 차이가 유의미한지 검정할 때 사용됩니다.
  • 대응표본 t-검정:
    같은 집단의 두 조건에서의 평균 차이가 유의미한지 검정합니다.
from scipy.stats import ttest_ind

# 두 그룹의 체중 감소량 데이터
group1 = [4.5, 5.1, 3.8, 6.2, 5.4]
group2 = [3.1, 4.2, 3.5, 4.9, 3.8]

# t-검정 수행
t_stat, p_value = ttest_ind(group1, group2)

print(f"t-통계량: {t_stat}")
print(f"P-값: {p_value}")

## t-통계량: 2.1572774865200244
## P-값: 0.06305630920183006

4. 포아송 분포 (Poisson Distribution)와 포아송 검정

포아송 분포는 일정 시간 동안 사건이 발생하는 횟수를 모델링하며, 이벤트 발생 횟수의 차이를 검정할 때 사용됩니다.

  • 포아송 검정: 주어진 시간이나 공간 내에서 사건 발생 횟수가 두 그룹에서 차이가 있는지 검정합니다.
from scipy.stats import poisson

# 가설 설정
# 매장의 평균 방문 횟수와 온라인 상점의 평균 방문 횟수를 비교
mean_store_visits = 20  # 매장에서의 평균 방문 횟수
mean_online_visits = 15  # 온라인 상점에서의 평균 방문 횟수

# 포아송 분포로 P-값 계산
p_value_store = poisson.cdf(mean_store_visits - 1, mean_online_visits)
p_value_online = 1 - poisson.cdf(mean_store_visits, mean_online_visits)

print(f"매장 방문과 온라인 방문 비교 (P-값): {p_value_store}")
print(f"온라인 방문과 매장 방문 비교 (P-값): {p_value_online}")

## 매장 방문과 온라인 방문 비교 (P-값): 0.8752187849674751
## 온라인 방문과 매장 방문 비교 (P-값): 0.08297091003146029

 

5. F-분포 (F-Distribution)와 분산 분석 (ANOVA)

F-분포는 여러 그룹의 평균 차이를 검정할 때 사용됩니다.
F-분포를 사용한 ANOVA는 두 개 이상의 그룹의 평균이 동일한지를 평가할 때 유용합니다.

  • 일원분산분석 (One-Way ANOVA):
    하나의 요인에 대해 여러 그룹 간 평균 차이가 있는지 검정합니다.
  • 이원분산분석 (Two-Way ANOVA):
    두 개 이상의 요인에 대해 그룹 간 평균 차이를 검정하고, 요인 간 상호작용을 분석할 수 있습니다.
from scipy.stats import f_oneway

# 세 그룹의 성적 데이터
program1 = [75, 78, 74, 81, 79]
program2 = [82, 85, 88, 90, 86]
program3 = [70, 73, 69, 72, 68]

# 일원 분산 분석 수행
f_stat, p_value = f_oneway(program1, program2, program3)

print(f"F-통계량: {f_stat}")
print(f"P-값: {p_value}")

## F-통계량: 43.128440366972455
## P-값: 3.3182540943653166e-06

 

6. 다항 분포 (Multinomial Distribution)와 다항 로지스틱 회귀

다항 분포는 여러 범주가 있는 데이터에서 각 범주별로 발생할 확률을 모델링할 때 사용됩니다.

  • 다항 로지스틱 회귀:
    범주형 종속 변수의 여러 가지 값을 예측하기 위해 사용합니다. 다항 분포를 가정하고, 각 범주에 속할 확률을 계산합니다.
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# 데이터 로드 (Iris 데이터셋)
iris = load_iris()
X = iris.data  # 꽃의 특성 (길이, 너비 등)
y = iris.target  # 꽃의 품종 (0, 1, 2)

# 데이터 분할 (학습 세트와 테스트 세트)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 다항 로지스틱 회귀 모델 학습 (다중 클래스 설정)
model = LogisticRegression(multi_class='multinomial', solver='lbfgs', max_iter=200)
model.fit(X_train, y_train)

# 테스트 세트에 대한 예측
y_pred = model.predict(X_test)

# 정확도 출력
accuracy = accuracy_score(y_test, y_pred)
print(f"다항 로지스틱 회귀 모델의 정확도: {accuracy * 100:.2f}%")

7. 지수 분포 (Exponential Distribution)와 생존 분석

지수 분포는 사건 간의 시간 간격을 모델링하며, 생존 분석에서 사건이 발생할 때까지의 시간(생존 시간)을 모델링할 때 유용합니다.

import numpy as np
from scipy.stats import expon

# 가설 설정
# 귀무가설: 시스템 고장 시간이 평균적으로 같다.

# 시스템 고장 시간 데이터
failures = np.random.exponential(scale=2.0, size=10)  # scale = 평균 고장 시간

# 지수 분포로 고장 시간 검정
mean_failure_time = failures.mean()
p_value = expon.cdf(mean_failure_time, scale=2.0)  # scale을 평균 고장 시간으로 설정

print(f"평균 고장 시간: {mean_failure_time}")
print(f"P-값: {p_value}")

## 평균 고장 시간: 1.8509409236895547
## P-값: 0.6036550899518068
반응형