⚙️ Tech/ML

[자격증] 빅데이터분석기사 실기 작업형3 정리

fiftyline 2025. 6. 9. 11:24

 

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 예측구간 상한