표본크기가 작고, 모표준편차가 다를 때의 모평균 차에 대한 추론¶
수록 문제 참고
import numpy as np
from scipy import stats
def make_t_data(n,desired_mean,desired_std):
df = n - 1
# 1. t분포에서 표본 추출 (평균 0, 표준편차 1)
sample = stats.t.rvs(df=df, size=n)
# 2. 표본의 평균과 표본 표준편차 계산
sample_mean = np.mean(sample)
sample_std = np.std(sample, ddof=1)
# 3. 표본을 원하는 평균과 표본 표준편차로 변환
sample_scaled = (sample - sample_mean) / sample_std * desired_std + desired_mean
return sample_scaled
A=make_t_data(13,2.4,0.72)
B=make_t_data(11,2.15,0.35)
# 검정 통계량 구하기
confidence_level = 0.95
alpha=1-confidence_level
df = np.min([len(A),len(B)]) - 1 # 작은 것의 자유도를 선택
# ---------------------------------
# t.ppf : t-분포의 누적 확률(CDF)에 대응하는 검정통계량을 구하는 함수
t_crit = stats.t.ppf(1 - alpha/2, df)
nA=A.mean()
nB=B.mean()
sA=A.std(ddof=1)
sB=B.std(ddof=1)
t_= (nA-nB) / (sA**2/len(A) + sB**2/len(B))**0.5
print('s_pool')
print(t_crit,'>',t_,'is',t_crit>t_)
# 양측검정 p값
p_value = 2 * (1 - stats.t.cdf(abs(t_), df))
print(f"t-statistic: {t_:.3f}, p-value: {p_value:.3f}")
# ---------------------------------
# scipy.stats.ttest_ind 사용
t_stat, p_value = stats.ttest_ind(A, B, alternative='two-sided', equal_var=False) # equal_var=False로 하면 Welch's t-test를 사용
print('\nttest_ind')
print(f"t-statistic: {t_stat:.3f}, p-value: {p_value:.3f}")
if p_value < 0.05:
print("A와 B는 다름")
else:
print("A와 B는 같음")
s_pool 2.2281388519649385 > 1.106874432753606 is True t-statistic: 1.107, p-value: 0.294 ttest_ind t-statistic: 1.107, p-value: 0.283 A와 B는 같음
import matplotlib.pyplot as plt
# 예시: 자유도, 유의수준, t-검정 통계량
# df = 10
# alpha = 0.05
# 임계값 (양측)
t_crit = stats.t.ppf(1 - alpha/2, df)
t_ = 2.3 # 예시로 t-값 입력(실제 검정값으로 대체)
# x축 범위
x = np.linspace(-4, 4, 500)
y = stats.t.pdf(x, df)
plt.figure(figsize=(8, 5))
plt.plot(x, y, label=f't-distribution (df={df})', color='black')
# 기각역 채우기
plt.fill_between(x, y, where=(x <= -t_crit), color='red', alpha=0.3, label='Rejection region')
plt.fill_between(x, y, where=(x >= t_crit), color='red', alpha=0.3)
# 임계값 선
plt.axvline(-t_crit, color='red', linestyle='dashed', label=f'-t_crit = {(-t_crit):.2f}')
plt.axvline(t_crit, color='red', linestyle='dashed', label=f't_crit = {t_crit:.2f}')
# 실제 t-값 위치
plt.axvline(t_stat, color='blue', linestyle='dashed', label=f't_stat = {t_stat:.2f}')
plt.title('t-distribution with rejection regions')
plt.xlabel('t')
plt.ylabel('Density')
plt.legend()
plt.grid(True)
plt.show()

댓글 영역