빅데이터 분석기사 실기 3유형 (2) — 회귀분석·로지스틱·카이제곱
3유형 마무리. statsmodels로 선형회귀·로지스틱 회귀를 돌리고, 카이제곱 검정으로 범주형 데이터를 분석하는 법까지.
3유형 (1)에서 평균 비교 검정을 다뤘다면, 이번 글은 관계 분석. 변수 간의 관계, 범주 간의 독립성. 통계 시험의 마지막 영역이다.
회귀분석 — 변수 간의 관계를 수식으로
단순선형회귀
한 독립변수가 종속변수에 미치는 영향.
y = β0 + β1·x + ε
import statsmodels.api as sm
X = df[["x"]]
y = df["y"]
X = sm.add_constant(X) # 절편(β0) 추가
model = sm.OLS(y, X).fit()
print(model.summary())
sm.add_constant를 빼먹으면 절편 없는 회귀(원점 통과)가 된다. 반드시 추가.
summary() 출력에서 보는 4가지
| 위치 | 의미 |
|---|---|
| coef | 회귀계수 (β값) |
| P>|t| | 각 계수의 p-value (개별 유의성) |
| R-squared | 결정계수 (0~1, 모형 설명력) |
| Prob (F-statistic) | 모형 전체의 p-value |
다중선형회귀
독립변수가 여러 개일 때.
X = df[["x1", "x2", "x3"]]
y = df["y"]
X = sm.add_constant(X)
model = sm.OLS(y, X).fit()
print(model.summary())
# 결과에서 값 뽑기
print(model.params) # 계수
print(model.pvalues) # 각 계수 p-value
print(model.rsquared) # R²
print(model.rsquared_adj) # 수정 R²
예측
new_X = pd.DataFrame({
"const": [1],
"x1": [3],
"x2": [5],
})
print(model.predict(new_X))
단골 출제 패턴
"x1의 회귀계수와 그 p-value를 구하시오."
beta = model.params["x1"]
pval = model.pvalues["x1"]
print(round(beta, 4), round(pval, 4))
"결정계수(R²)를 소수점 넷째자리까지 구하시오."
print(round(model.rsquared, 4))
로지스틱 회귀 — 이진 분류를 회귀로
종속변수가 0/1 같은 이진일 때 쓴다. 모델은 회귀지만 분류 문제다.
P(y=1) = 1 / (1 + exp(-(β0 + β1·x1 + ...)))
statsmodels로 적합
import statsmodels.api as sm
X = df[["x1", "x2"]]
y = df["target"] # 0/1
X = sm.add_constant(X)
model = sm.Logit(y, X).fit()
print(model.summary())
summary 핵심
| 위치 | 의미 |
|---|---|
| coef | 로그-오즈에 대한 계수 |
| P>|z| | 각 계수의 p-value |
| Pseudo R-squ. | 모형 적합도 (McFadden 등) |
Odds Ratio (자주 출제)
회귀계수 β를 exp(β) 로 변환하면 오즈비(Odds Ratio).
"x1이 1 증가할 때 y=1의 오즈가 몇 배가 되는가?"
import numpy as np
odds_ratio = np.exp(model.params)
print(odds_ratio)
예측 확률
prob = model.predict(X) # P(y=1)
pred = (prob >= 0.5).astype(int)
카이제곱 검정 — 범주형 데이터 분석
T-검정·ANOVA가 평균 비교라면, 카이제곱은 빈도 비교.
(1) 적합도 검정 (Goodness of Fit)
"관측된 분포가 기대 분포와 같은가?"
예: 주사위가 공정한지 — 각 면이 1/6 비율로 나오는가?
from scipy import stats
observed = [10, 12, 9, 11, 13, 5] # 관측 빈도
expected = [10, 10, 10, 10, 10, 10] # 기대 빈도 (합이 같아야 함)
chi2, p = stats.chisquare(f_obs=observed, f_exp=expected)
print(f"chi2 = {chi2:.4f}, p = {p:.4f}")
(2) 독립성 검정 (Independence)
"두 범주형 변수가 서로 독립인가?"
예: 성별과 흡연 여부가 독립인가?
H0: 두 변수는 독립이다
H1: 두 변수는 독립이 아니다 (관련이 있다)
# 교차표 만들기
table = pd.crosstab(df["gender"], df["smoke"])
print(table)
# 카이제곱 독립성 검정
chi2, p, dof, expected = stats.chi2_contingency(table)
print(f"chi2 = {chi2:.4f}")
print(f"p = {p:.4f}")
print(f"자유도 = {dof}")
print("기대빈도 표:")
print(expected)
답안 예시
table = pd.crosstab(df["gender"], df["smoke"])
chi2, p, dof, exp = stats.chi2_contingency(table)
print(f"카이제곱 통계량: {round(chi2, 4)}")
print(f"p-value : {round(p, 4)}")
print(f"자유도 : {dof}")
if p < 0.05:
print("결론: 귀무가설 기각. 두 변수는 독립이 아니다 (관련 있음).")
else:
print("결론: 귀무가설 채택. 두 변수는 독립이라고 볼 수 있다.")
(3) 동질성 검정
수식과 코드는 독립성 검정과 동일 (chi2_contingency).
관점만 다르다. 독립성은 "두 변수의 관계", 동질성은 "여러 집단의 분포가 같은가".
정규성·등분산성 검정 정리 (3유형 전반에서 자주)
from scipy import stats
# Shapiro-Wilk: 표본이 작을 때(n<5000) 정규성 검정
stat, p = stats.shapiro(df["x"])
# Anderson-Darling: 표본이 클 때
stats.anderson(df["x"])
# Kolmogorov-Smirnov: 분포 비교
stats.kstest(df["x"], "norm")
# Levene: 등분산성
stats.levene(g1, g2)
# Bartlett: 등분산성 (정규성 가정 강함)
stats.bartlett(g1, g2)
시험에서 "정규성 검정 후 적절한 검정을 선택하라"는 패턴은 거의 단골이다.
상관계수 — 회귀 전후로 자주
Pearson (선형, 정규성 가정)
corr, p = stats.pearsonr(df["x"], df["y"])
Spearman (순위 기반, 비모수)
corr, p = stats.spearmanr(df["x"], df["y"])
Kendall (작은 표본)
corr, p = stats.kendalltau(df["x"], df["y"])
"두 변수의 상관계수와 그 유의성"을 구하라 → 위 함수 중 하나로 한 줄.
3유형 답안 작성 황금 패턴
1. 데이터 적재 + 변수 확인
2. (필요시) 정규성 / 등분산성 검정
3. 적절한 검정 수행
4. 통계량, p-value 출력 (소수점 자리수 맞추기)
5. 결론 한 문장 (귀무가설 기각/채택)
통합 예시 — 회귀 답안
import pandas as pd
import statsmodels.api as sm
df = pd.read_csv("data.csv")
X = df[["x1", "x2"]]
y = df["y"]
X = sm.add_constant(X)
model = sm.OLS(y, X).fit()
# (a) x1 회귀계수
print("x1 계수:", round(model.params["x1"], 4))
# (b) x1 p-value
print("x1 p-value:", round(model.pvalues["x1"], 4))
# (c) 결정계수
print("R²:", round(model.rsquared, 4))
# (d) 결론
if model.pvalues["x1"] < 0.05:
print("x1은 유의수준 0.05에서 유의미한 변수다.")
else:
print("x1은 유의수준 0.05에서 유의미하다고 보기 어렵다.")
시험 직전 한 줄 요약 (전체 3유형)
| 상황 | 함수 |
|---|---|
| 한 집단 평균 vs 기준값 | ttest_1samp |
| 두 독립 집단 평균 | ttest_ind |
| 같은 대상 전후 | ttest_rel |
| 셋 이상 집단 평균 | f_oneway |
| 사후검정 | pairwise_tukeyhsd |
| 정규성 | shapiro |
| 등분산성 | levene |
| 두 수치의 상관 | pearsonr / spearmanr |
| 선형회귀 | sm.OLS |
| 로지스틱 회귀 | sm.Logit |
| 적합도 | chisquare |
| 독립성 / 동질성 | chi2_contingency |
| 비모수 (T 대안) | mannwhitneyu, wilcoxon, kruskal |
정리
- 3유형은 공식이 아니라 분기 트리다. "데이터 형태 + 가설"이 검정 종류를 결정한다.
- statsmodels의
OLS/Logit, scipy의chi2_contingency까지가 회귀·범주의 절반 이상이다. - 유의수준 0.05 와 p-value 의 관계만 흔들리지 않으면 결론 한 줄은 자동이다.
- 답안에는 통계량 + p-value + 결론 세 가지를 모두 적는다. 셋 중 하나라도 빠지면 부분점수다.
여기까지가 빅데이터 분석기사 실기 핵심 정리. 1유형 (1·2) · 2유형 (1·2) · 3유형 (1·2) 여섯 편을 시험 전에 한 번 더 훑어두면, 합격선 60점은 충분히 안정권 이다.