오늘은 어제 배운 선형회귀와 로지스틱 회귀에 대해 실습을 진행했다. 실습을 하면서 나는 그동안 추론통계로써 회귀분석을 배웠었는데, 머신러닝 지도학습의 일부로써 회귀분석을 배우게 되니 그 간극이 어떤 것인지 의문이 들었다. 그래서 오늘은 이 둘이 어떻게 다르고, 같은 회귀 호멜임에도 목적과 해석이 어떻게 달라지는지 정리해보려고 한다.
Ⅰ. 통계적 회귀 vs 머신러닝 회귀
선형회귀나 로지스틱 회귀는 수학적으로는 동일한 모델이다. 하지만 "왜 쓰는지" 목적이 완전히 다르기 때문에, (1) 모델을 어떻게 학습하고, (2) 어떤 지표를 중점으로 확인하며, (3) 결과는 어떻게 해석하는지가 달라진다.
| 구분 | 통계적 회귀 (인과추론) | 머신러닝 회귀 (지도학습) |
| 목적 |
|
|
| 데이터 활용 |
|
|
| 결과 해석 |
|
|
Ⅱ. 로지스틱 회귀 실습 (인과추론, 머신러닝)
정리한 통계적 회귀와 머신러닝 회귀의 개념을 바탕으로 통계적 회귀와 머신러닝 회귀에 대한 실습을 logistic regression을 활용해 진행해 보았다.
1. 데이터 준비
ChatGPT를 활용해 예제 데이터를 만들어 달라고 한 뒤 실습을 해 보았다.
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
import statsmodels.api as sm
from sklearn.metrics import accuracy_score, roc_auc_score, confusion_matrix
# 예제 데이터: 20명 고객, 구매 여부 예측
np.random.seed(42)
df = pd.DataFrame({
'age': np.random.randint(20, 60, 20),
'income': np.random.randint(40000, 100000, 20),
'ad_click': np.random.randint(0, 2, 20), # 광고 클릭 여부
'purchase': np.random.randint(0, 2, 20) # 구매 여부 (0/1)
})

각 컬럼의 분포와 컬럼 간 상관분석도 진행해 보았다.
# 히스토그램을 통한 데이터 분포 살펴보기
df.hist(bins=20, figsize=(12, 6), color='green')
plt.tight_layout()
plt.show()

# 특성 간 상관 관계 확인하기
corr_matrix = df.corr()
plt.figure(figsize=(6, 4))
# 삼각형 형식으로 보여주기
mask = np.triu(np.ones_like(corr_matrix, dtype=bool))
sns.heatmap(corr_matrix,annot=True, cmap='BrBG', linewidths=0.5, mask=mask, fmt=".2f") # 조건(mask) 적용
plt.show()

2. 독립변수, 종속변수, 가설 설정
X = df[['age', 'income', 'ad_click']]
y = df['purchase']
로지스틱 회귀를 사용할 것이기 때문에 종속변수(y)는 이분형 변수인 '구매 여부', 독립변수(X)는 '나이, 수입, 광고 클릭 여부'로 설정하였다. 그러고 세운 가설은 다음과 같다:
- H₀ (귀무가설) : 모든 독립변수(나이, 수입, 광고 클릭 여부)는 구매 여부에 영향을 미치지 않는다.
- H₁ (대립가설) : 적어도 하나의 독립변수는 구매 여부에 유의한 영향을 미친다.
3. 추론통계 로지스틱 회귀
# statsmodels 사용, 전체 데이터 사용
X_causal = sm.add_constant(X) # 절편 추가
causal_model = sm.Logit(y, X_causal).fit()
print("\n=== 인과추론용 로지스틱 회귀 ===")
print(causal_model.summary())
인과추론 로지스틱 회귀 모델을 summary한 결과는 다음과 같다:
Optimization terminated successfully.
Current function value: 0.441234
Iterations 7
=== 인과추론용 로지스틱 회귀 ===
Logit Regression Results
==============================================================================
Dep. Variable: purchase No. Observations: 20
Model: Logit Df Residuals: 16
Method: MLE Df Model: 3
Date: Thu, 11 Dec 2025 Pseudo R-squ.: 0.3444
Time: 21:35:14 Log-Likelihood: -8.8247
converged: True LL-Null: -13.460
Covariance Type: nonrobust LLR p-value: 0.02590
==============================================================================
coef std err z P>|z| [0.025 0.975]
------------------------------------------------------------------------------
const -2.5189 3.474 -0.725 0.468 -9.328 4.290
age 0.0812 0.057 1.423 0.155 -0.031 0.193
income -2.009e-05 3.52e-05 -0.571 0.568 -8.91e-05 4.89e-05
ad_click 2.6404 1.350 1.956 0.050 -0.005 5.286
==============================================================================
인과추론 로지스틱 회귀에서 중점적으로 확인해야 할 지표는 LLR p-value, coef, P>|z| 값이다.
(1) LLR p-value
이 지표는 회귀모델이 통계적으로 믿을만한지를 나타내는 지표이다. LLR p-value가 0.0259 < 0.05 이므로 전체적으로 모델은 유의하다고 할 수 있다. 즉, 적어도 하나의 변수는 구매 여부에 의미있는 영향을 준다는 것을 의미한다.
(2) coef 및 P>|z|
이 지표들은 각각의 독립변수의 효과 크기와 그에 대한 유의성을 나타내는 지표이다. 로지스틱 분석 결과 coef는 로그 오즈를 계산한 결과이기 때문에 coef에 지수를 취해주는게 일반적이다. 그래야 오즈 값을 알 수 있기 때문이다. 일단 보여지는 수치들로 해석을 해보면, ad_click (광고 클릭 여부)가 가장 유의한 영향을 미치는 것을 확인할 수 있었다(데이터 수가 애초에 너무 작아 유의한 결과가 유의하지 않게 즉, 경계선상에 있게 나왔을 가능성 있음).
=> 즉, "광고 클릭을 하면 구매할 로그오즈가 2.6404만큼 증가한다."고 해석할 수 있다.
4. 머신러닝 로지스틱 회귀
머신러닝에서 로지스틱 회귀를 사용할 때는 모델 학습과 평가 과정이 필수적이다. 단순히 데이터를 넣고 결과를 보는 것이 아니라, 모델이 실제로 얼마나 잘 예측하는지를 확인해야 하기 때문이다. 이를 위해 train /test split 과정을 거친다.
(1) Train / Test Split
- 전체 데이터를 훈련용(train)과 시험용(test)으로 나눔
- 훈련용 데이터로 모델을 학습시키고, 시험용 데이터로 예측 성능을 평가함
| 지표 | 내용 | 범위 | 참고 | |
| Accuracy | 전체 샘플 중 맞게 예측한 비율 | 0 ~ 1 | 가장 직관적, 불균형 데이터는 주의 필요 |
|
| Confusion Matrix |
Precision (정밀도) | Positive 예측 중 실제 Positive 비율 TP / (TP + FP) |
0 ~ 1 | FP가 중요한 경우 활용, 높아질수록 FP (1종 오류) 감소 |
| Recall (재현율) |
실제 Positive 중 맞게 예측한 비율 TP / (TP + FN) |
0 ~ 1 | FN이 중요한 경우 활용, 높아질수록 FN (2종 오류) 감소 |
|
| F1 Score | Precision과 Recall의 조화 평균 | 0 ~ 1 | Precision과 Recall 균형 고려 | |
| ROC AUC | ROC 곡선 아래 면적 | 0.5 ~ 1 | 1에 가까울수록 성능 좋음 | |
(2) max_iter (최대 반복 횟수)
- 로지스틱 회귀는 최대 우도 추정(MLE, Maximum Likelihood Estimation) 방식으로 계수를 찾음
- 이 과정에서 최적화 알고리즘이 반복하면서 수렴함
- max_iter 는 이러한 반복의 최대 횟수를 지정하는 옵션으로, 기본값은 100임
- 최대 반복 횟수가 너무 작으면 최적화가 완료되지 않아 오류가 발생할 수 있음
# 70% 훈련, 30% 테스트
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 로지스틱 회귀 모델 학습
ml_model = LogisticRegression(max_iter=1000)
ml_model.fit(X_train, y_train)
# 예측 및 평가
y_pred = ml_model.predict(X_test)
y_prob = ml_model.predict_proba(X_test)[:, 1]
print("=== 머신러닝용 로지스틱 회귀 ===")
print("Accuracy:", accuracy_score(y_test, y_pred))
print("ROC AUC:", roc_auc_score(y_test, y_prob))
print("Confusion Matrix:\n", confusion_matrix(y_test, y_pred))
print("Coefficients (참고용):", ml_model.coef_)
print("Intercept:", ml_model.intercept_)
머신러닝 로지스틱 회귀 분석 결과는 다음과 같다:
=== 머신러닝용 로지스틱 회귀 ===
Accuracy: 0.6666666666666666
ROC AUC: 0.4
Confusion Matrix:
[[0 1]
[1 4]]
Coefficients (참고용): [[ 8.28231136e-02 -5.13494417e-05 6.54173512e-01]]
Intercept: [0.02798984]
(3) Accuracy
값이 0.6667로 테스트 데이터에서 모델이 전체 샘플의 약 66.7%를 맞게 예측했다고 해석할 수 있다.
(4) ROC AUC
ROCU AUC는 0.5가 랜덤 예측을 의미하는데 값이 0.4가 나왔다. 이는 랜덤보다 성능이 낮음을 의미하고, 모델이 실제 Positive / Negative 를 잘 구분하지 못한다고 볼 수 있다.
(5) Confusion Matrix
| 실제 Negative | 실제 Positive | |
| 예측 Negative | 0 | 1 |
| 예측 Positive | 1 | 4 |
- TP (True Positive) : 실제 Positive를 맞게 예측한 개수 → 4
- TN (True Negative) : 실제 Negative를 맞게 예측한 건 없음 → 0
- FP (False Positive, 1종 오류) : Negative를 Positive로 잘못 예측한 개수 → 1
- FN (False Negative, 2종 오류) : Positive를 Negative로 놓친 개수 → 1
(6) Precision (정밀도) & Recall (재현율)
| 지표 | 계산식 | 해석 |
| Precision (정밀도) | TP / (TP + FP) = 4 / (4+1) = 0.8 | 모델이 Positive라고 예측한 경우 80%는 실제로 Positive → 거짓 경보 (FP)가 20% |
| Recall (재현율, Sensitivity) | TP / (TP + FN) = 4 / (4+1) = 0.8 | 실제 Positive 중에서 모델이 80%를 맞게 예측 → 실제 사건을 놓치는 비율 (FN) 20% |
정리하면, 이 모델은 Positive 예측 성능(Precision)과 실제 Positive 포착력(Recall)이 동일하게 0.8이지만, TN=0으로 Negative 예측은 거의 실패했다고 볼 수 있다.
마무리
처음엔 회귀모델이 추론통계에서도 쓰이고 머신러닝에서도 쓰인다는 흐름이 이해가 잘 되지 않았는데 정리를 하고 나니까 목적에 맞게 쓰임이 변형될 수 있다는 걸 알게되었다. 아직은 분석 결과를 혼자 해석하는게 쉽지 않지만 이번 정리가 프로젝트 때 도움이 되면 좋겠다.
'Data_10기' 카테고리의 다른 글
| 머신러닝 비지도학습 - 클러스터링 (0) | 2025.12.16 |
|---|---|
| 머신러닝 지도학습 방법 - kNN, RF, XGBoost (0) | 2025.12.15 |
| Python 머신러닝(회귀분석) 및 SQL 비상관/상관 쿼리 (0) | 2025.12.10 |
| Logistic Regression 및 SQL 코드카타 (1) | 2025.12.09 |
| Python Standard (표준화 vs 정규화) 및 SQL 코드카타 (0) | 2025.12.08 |