통계
가설검정에 사용하는 분포 선택 및 통계적 검정법
장수우
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
반응형