1. 회귀분석의 개념
- 정의: 두 변수 간의 관계를 분석하여, 독립변수(X)가 종속변수(Y)에 어떤 영향을 미치는지 설명하고 예측하는 방법
- 인과적 관점: 상관분석은 “같이 움직이는 정도”만 알려주지만, 회귀분석은 **한 변수가 다른 변수에 미치는 영향**까지 분석 가능
- 예시:
- 공부시간(X)이 늘어나면 시험점수(Y)가 얼마나 증가하는가?
- 광고비(X)가 매출액(Y)에 얼마나 영향을 주는가?
2. 단순선형회귀식
$$ Y = a + bX + \epsilon $$
- $Y$: 종속변수 (예측하려는 변수)
- $X$: 독립변수 (설명 변수)
- $a$ (절편): X=0일 때 Y의 예상값
- $b$ (기울기): X가 1 단위 증가할 때 Y가 변하는 정도
- $\epsilon$ (오차항): 회귀식으로 설명되지 않는 요인
👉 직선 방정식 형태로, **데이터의 추세선**을 의미
3. 최소제곱법
- **원리**: 실제 데이터 점들과 회귀선 사이의 **잔차(오차)** 제곱합이 최소가 되도록 직선을 찾는 것
- **잔차(residual)** = 실제값(Y) - 예측값($\hat{Y}$)
- **왜 제곱합을 최소화할까?**
- 양수/음수 오차가 상쇄되지 않도록
- 큰 오차에 더 큰 패널티를 주기 위해
👉 이 방법으로 구해진 회귀식이 “가장 잘 맞는 직선”이 됨
4. 결정계수 ($R^2$)
- **정의**: 회귀모형이 종속변수 변동을 얼마나 설명하는지 비율로 나타낸 값
- **범위**: 0 ~ 1
- $R^2 = 0$: 설명력 없음 (X가 Y를 전혀 설명 못 함)
- $R^2 = 1$: 완벽한 설명력 (모든 점이 직선 위에 있음)
**해석 예시:**
- $R^2 = 0.85$ → 독립변수 X가 종속변수 Y의 변동 85%를 설명
5. 수업 정리 & 토론
- **정리**
- 단순선형회귀는 X와 Y의 직선적 관계를 분석하는 방법
- 최소제곱법으로 가장 잘 맞는 회귀선을 찾음
- $R^2$ 값으로 모형의 설명력을 평가
- **토론 질문:**
- $R^2$ 값이 높다고 해서 반드시 좋은 모형이라고 말할 수 있을까?
- 실제 데이터에서 회귀선으로 설명되지 않는 요인($\epsilon$)에는 어떤 것들이 있을까?
단순선형회귀분석 실습
1. 실습 목표
- 공부시간(독립변수)이 시험 정답 수(종속변수)에 미치는 영향을 분석
- 단순선형회귀식을 구축하고, 모형 해석 방법($a$, $b$, $R^2$, p-value) 학습
2. 데이터 준비
import pandas as pd
data = {
'공부시간': [1, 3, 4, 6, 8, 9, 11, 14],
'정답수': [1, 2, 4, 4, 5, 7, 8, 9]
}
df = pd.DataFrame(data)
print(df)
- **설명 변수(X)**: 공부시간
- **종속 변수(Y)**: 정답 수
3. 산점도 시각화
import matplotlib.pyplot as plt
import seaborn as sns
plt.figure(figsize=(8, 6))
sns.scatterplot(x='공부시간', y='정답수', data=df, s=100)
plt.title('공부시간과 정답수 간의 관계')
plt.xlabel('공부시간(시간)')
plt.ylabel('정답수(개)')
plt.grid(True)
plt.show()
**해석**: **공부시간이 늘수록 정답 수도 증가**하는 경향 → 양의 관계
4. 단순선형회귀분석 수행
import statsmodels.api as sm
# X(독립변수)에 상수항 추가
X = sm.add_constant(df['공부시간'])
y = df['정답수']
# OLS(최소제곱법) 회귀 적합
model = sm.OLS(y, X).fit()
# 결과 요약 출력
print(model.summary())
결과 해석 (model.summary 출력 항목)
- coef (회귀계수)
- const(절편, a): 공부시간이 0일 때 예상 정답 수
- 공부시간(기울기, b): 공부시간 1시간 증가 시 정답 수 증가량
- R-squared (결정계수): 모형의 설명력 (0~1 사이, 1에 가까울수록 설명력 높음)
- P>|t| (p-value)
- 회귀계수가 유의한지 검정
- p < 0.05 → 통계적으로 유의
5. 회귀선 시각화
# 회귀선 그리기
sns.regplot(x='공부시간', y='정답수', data=df, ci=None, line_kws={'color':'red'})
plt.title('공부시간과 정답수 회귀선')
plt.xlabel('공부시간(시간)')
plt.ylabel('정답수(개)')
plt.show()
**해석**: 그래프에서 빨간 직선이 **최적 회귀선**
6. 정리 & 토론
- 단순선형회귀는 **X와 Y의 선형적 관계**를 수식으로 나타냄
- 최소제곱법으로 잔차 제곱합을 최소화하는 직선을 찾음
- **$R^2$**으로 설명력, **p-value**로 통계적 유의성 확인
- **토론 질문:**
- 공부시간이 많으면 무조건 정답 수가 늘어난다고 해석할 수 있을까?
- 회귀식이 설명하지 못하는 부분(오차항 $\epsilon$)에는 어떤 요인들이 있을까?
3. 모형 유의성 검정 및 결과 해석
1. 회귀분석표(ANOVA)와 F-검정
- **목적**: 회귀모형 전체가 유의한지 확인
- **가설**
- 귀무가설($H_0$): 회귀모형은 유의하지 않다 → 독립변수가 종속변수에 영향 없음
- 연구가설($H_a$): 회귀모형은 유의하다 → 독립변수가 종속변수에 영향 있음
- **출력 해석 (
statsmodels)**- `F-statistic` → 모형 적합성 검정 통계량
- `Prob (F-statistic)` → p-값
- **판정**: p < 0.05 → 귀무가설 기각 → 모형은 통계적으로 유의
2. 독립변수에 대한 t-검정
- **목적**: 각 독립변수가 종속변수에 유의한 영향을 주는지 확인
- **가설 (예: 공부시간)**
- 귀무가설($H_0$): $b=0$ (공부시간은 정답 수에 영향 없음)
- 연구가설($H_a$): $b \neq 0$ (공부시간은 정답 수에 영향 있음)
- **출력 해석 (
statsmodels)**- `coef` → 회귀계수 값 ($b$)
- `P>|t|` → 개별 변수의 p-값
- **판정**: p < 0.05 → 귀무가설 기각 → 해당 독립변수는 통계적으로 유의
3. Python 코드 결과 예시 해석
R-squared: 0.963
F-statistic: 156.6, Prob (F-statistic): 0.000
coef (공부시간): 0.6974
P>|t| (공부시간): 0.000
- **$R^2$ = 0.963**
- → 공부시간이 정답 수 변동의 약 **96.3%**를 설명 (설명력이 매우 높음)
- **F-검정**: p-값 = 0.000 < 0.05
- → 회귀모형 전체가 통계적으로 유의
- **t-검정 (공부시간)**
- `coef` = 0.6974
- → 공부시간이 1시간 늘어나면 정답 수가 평균 **0.6974개 증가**
- `P>|t|` = 0.000 < 0.05
- → 공부시간은 시험 정답 수에 **통계적으로 유의한 영향**을 미침
- `coef` = 0.6974
**정리**
- **F-검정**: 모형 전체의 유의성 평가
- **t-검정**: 개별 독립변수의 유의성 평가
- **해석 요약**:
- 공부시간이 시험 정답 수를 매우 잘 설명한다 ($R^2=0.963$).
- 모형은 통계적으로 유의하다 (F-검정).
- 공부시간은 유의한 독립변수다 (t-검정).
4. 회귀모형의 예측 활용 실습
1. 예측의 개념
- 단순선형회귀식: $$ \hat{Y} = a + bX $$
- **예측**은 학습된 회귀계수($a$, $b$)를 이용하여 **새로운 X 값에 대해 Y 값을 추정**하는 과정
- 실제로는 시험 점수 예측, 매출 예측, 성적 예측 등 다양한 응용 가능
2. Python 실습: 새로운 값 예측
import pandas as pd
import statsmodels.api as sm
# 데이터 (재사용)
data = {
'공부시간': [1, 3, 4, 6, 8, 9, 11, 14],
'정답수': [1, 2, 4, 4, 5, 7, 8, 9]
}
df = pd.DataFrame(data)
X = sm.add_constant(df['공부시간'])
y = df['정답수']
model = sm.OLS(y, X).fit()
# 1) 공부시간=10시간일 때 예상 정답 수
new_X = pd.DataFrame({'const':[1], '공부시간':[10]})
pred = model.get_prediction(new_X)
print(pred.summary_frame(alpha=0.05)) # 95% 신뢰구간까지 출력
출력 예시
| mean (예측값) | mean_ci_lower | mean_ci_upper |
|---|---|---|
| 7.97 | 7.1 | 8.8 |
**해석**: 공부시간이 **10시간**일 때 예상 정답 수는 약 **8개**, 95% 신뢰구간은 **7.1 ~ 8.8개**
3. 여러 값 예측
# 여러 값 예측 (예: 5시간, 10시간, 12시간 공부했을 때)
new_data = pd.DataFrame({'const':[1,1,1], '공부시간':[5, 10, 12]})
preds = model.get_prediction(new_data).summary_frame(alpha=0.05)
print(preds[['mean', 'mean_ci_lower', 'mean_ci_upper']])
**결과**: 각 공부시간에 따른 예상 정답 수와 신뢰구간 제시
4. 시각화
import matplotlib.pyplot as plt
import seaborn as sns
# 원 데이터 산점도 + 회귀선
sns.regplot(x='공부시간', y='정답수', data=df, ci=None, line_kws={'color':'red'})
# 새로운 예측점 표시
for x_val, y_val in zip([5, 10, 12], preds['mean']):
plt.scatter(x_val, y_val, color='blue', s=100, marker='X')
plt.text(x_val+0.2, y_val, f"{y_val:.1f}", fontsize=10)
plt.title("회귀모형을 활용한 예측")
plt.xlabel("공부시간(시간)")
plt.ylabel("정답수(개)")
plt.show()
- 산점도 위에 회귀선(빨간색)
- 예측값(X 마커) 표시 → 시각적으로 해석 가능
**정리**
- 회귀분석은 단순히 관계 설명뿐 아니라 **새로운 데이터 예측**에도 활용 가능
- 예측값에는 항상 **불확실성(신뢰구간)**이 존재
- $R^2$이 높아도, 데이터 범위를 벗어난 **외삽 예측**은 주의 필요
- **토론 질문:**
- 공부시간이 30시간일 때 정답 수를 예측하면 결과가 신뢰할 수 있을까?
- 왜 데이터 범위를 벗어난 예측은 위험할까?
질의응답 및 요약
1. 회귀분석의 한계
- **선형 가정**
- 단순선형회귀는 X와 Y 사이의 관계가 **직선(선형)**이라고 가정
- 실제 데이터는 곡선 관계, 다변량 요인 등 더 복잡할 수 있음
- **변수 누락 문제**
- 중요한 설명 변수를 포함하지 않으면 **편향된 결과** 발생
- 예: 공부시간 말고도 **수면시간, 집중력** 등이 시험 점수에 영향을 줄 수 있음
- **이상치(Outlier) 민감성**
- 몇 개의 극단적인 데이터가 회귀선 전체에 큰 영향을 줄 수 있음
- **인과관계 한계**
- 회귀분석은 **상관된 관계**를 보여주지만, 이것만으로 **원인-결과**를 단정할 수 없음
2. 종합 요약
- **단순선형회귀 개념**: 독립변수(X) → 종속변수(Y)에 미치는 영향 분석
- **회귀식**: $Y = a + bX + \epsilon$
- **최소제곱법**으로 최적의 직선을 추정
- **$R^2$**: 설명력, 값이 높을수록 모델이 데이터를 잘 설명
- **모형 유의성 검정**:
- F-검정 → 모형 전체 유의성
- t-검정 → 개별 독립변수 유의성
- **예측 활용**: 새로운 X 값에 대해 Y 값을 추정, 다만 데이터 범위 밖에서는 주의
3. 질의응답
- **예상 질문 예시:**
- **“R² 값이 높으면 항상 좋은 모형인가요?”**
- → 아닙니다. 과적합 문제나 변수 누락 가능성도 고려해야 합니다.
- **“데이터가 곡선 형태일 때는 어떻게 하나요?”**
- → 다항회귀, 비선형회귀, 혹은 다른 머신러닝 기법을 고려합니다.
- **“상관분석과 회귀분석 차이는 무엇인가요?”**
- → 상관은 관계의 강도/방향만, 회귀는 영향력과 예측까지 분석합니다.
- **“R² 값이 높으면 항상 좋은 모형인가요?”**