1. T-test, wilcoxon
from scipy import stats
# ===== 단일 표본 ===== #
# 정규성 검정
stats.shapiro(df['무게'])
# 기각(p < 0.05), 비모수검정
stats.wilcoxon(df['무게']-75, alternative = "less")
# 채택(p > 0.05), t-test
t_stat, p_value = stats.ttest_1samp(scores, 75, alternative='greater') # scores-mu > 0 단측
# ===== 독립 표본(두 평균 비교) ===== #
# 정규성 검정
stats.shapiro(A)
stats.shapiro(B)
# 기각(p < 0.05), 비모수검정
stats.mannwhitneyu(A,B,alternative="")
# 등분산 검정
stats.levene(A, B)
# t-test
t_stat, p_value = stats.ttest_ind(A, B, equal_var=True) # 등분산 여부 True/False
t_stat, p_value = ttest_ind(A, B, alternative='greater') # A-B > 0 단측
# ===== 대응 표본 ===== #
# 정규성 검정
stats.shapiro(df['before'] - df['after'])
# 기각(p < 0.05), 비모수검정
stats.wilcoxon(df['before'], df['after'], alternative = "less")
# 채택(p > 0.05), t-test
t_stat, p_value = stats.ttest_rel(after, before, alternative="less") # after-before < 0 단측
print(f"검정통계량: {t_stat}")
print(f"p-value: {p_value}")
alpha = 0.05
if p_value < alpha:
print("귀무가설 기각. 모평균은 75보다 크다고 할 수 있다")
print("귀무가설 기각. 두 평균이 다르다고 할 수 있다")
else:
print("귀무가설 채택. 모평균은 75보다 크다고 할 수 없다")
print("귀무가설 채택. 두 평균이 다르다고 할 수 없다")
2. ANOVA
from scipy import stats
# One-way
f_value, p_value = stats.f_oneway(groupA, groupB, groupC)
f_value, p_value = stats.f_oneway(df_wide['GroupA'], df_wide['GroupB'], df_wide['GroupC'])
# One-way & Two-way
import statsmodels.api as sm
import statsmodels.formula.api as smf
model = smf.ols('종속 ~ C(독립1) * C(독립2)', data=df).fit() # 교호작용 포함(1 + 2 + 1:2)
sm.stats.anova_lm(model)
3. χ²
# ===== 독립성 검정 (두 변수간 연관성) ===== #
# 교차표
from scipy.stats import chi2_contingency
observed = np.array([[120, 480],
[143, 407]])
observed = pd.crosstab(df['변수1'], df['변수2'])
chi2, p, dof, expected = chi2_contingency(observed)
print("카이제곱 통계량:", chi2)
print("p값:", p)
print("자유도:", dof)
print("기대값(기대빈도):\n", expected)
if p < 0.05:
print("두 변수는 독립이 아님 (연관 있음)")
else:
print("두 변수는 독립이 아니라고 할 수 없음 (연관 없음)")
# ===== 적합도 검정 (관측분포가 기대분포와 같은지) ===== #
# 빈도
from scipy.stats import chisquare
observed = [30, 60, 50, 40, 20]
expected = [200 * 0.20, 200 * 0.30, 200 * 0.25, 200 * 0.15, 200 * 0.10]
chisquare(f_obs=observed, f_exp=expected)
4. 회귀
# ===== 다중선형회귀 ===== #
import statsmodels.formula.api as smf
model_full = smf.ols('y ~ x1 + x2 + x3 + x4', data = df).fit()
model_full.summary()
# 새 데이터로 예측
new_df = pd.DataFrame({'x1': [5],'x2': [12],'x3': [10],'x4': [3]})
model_full.predict(new_df)
# 잔차 및 잔차 표준편차
model_full.resid
model_full.resid.std()
# 신뢰구간 및 예측구간
model.conf_int(alpha=0.05) # 계수 신뢰구간
model_full.get_prediction(new_df).summary_frame(alpha=0.03) # 예측 97%신뢰수준
# ===== 로지스틱회귀 ===== #
import statsmodels.formula.api as smf
formula = 'Survived ~ C(Pclass) + Gender + SibSp + Parch'
model = smf.logit(formula, data = df).fit()
np.exp(model.params['col1']) # col1의 오즈비
1/np.exp(model.params['C(salary_level)[T.low]']) #high(default)의 low 대비 오즈비
prob = model.predict(test) # predict-> 확률값
pred = (prob>0.5).astype(int) # 1/0 변환
model.summary()
model.llf * -2 # 잔차이탈도
컬럼명 | 설명 |
mean | 예측된 y 값 |
mean_ci_lower | 신뢰구간 하한 (β 기반) |
mean_ci_upper | 신뢰구간 상한 |
obs_ci_lower | 예측구간 하한 (새 관측값 y) |
obs_ci_upper | 예측구간 상한 |
'⚙️ Tech > ML' 카테고리의 다른 글
[자격증] 빅데이터분석기사 실기 작업형2 정리 (0) | 2025.06.09 |
---|---|
[자격증] 빅데이터분석기사 실기 작업형1 정리 (0) | 2025.06.08 |
[ML] 최적화 기법 (경사 하강법, SGD, 미니배치경사하강법, 모멘텀, RMSprop, Adam, 베이지안 최적화) (0) | 2025.02.16 |
[ML] 최적화란? (0) | 2025.02.16 |
[ML/python] 앙상블 (voting, bagging, boosting, stacking, 랜덤포레스트, XGBoost, LightGBM) (0) | 2025.02.15 |