2025년 2학기 계량분석 강의자료

11주차: 단순선형회귀모형의 이해

1. 회귀분석의 개념



2. 단순선형회귀식

$$ Y = a + bX + \epsilon $$

👉 직선 방정식 형태로, **데이터의 추세선**을 의미


3. 최소제곱법

👉 이 방법으로 구해진 회귀식이 “가장 잘 맞는 직선”이 됨


4. 결정계수 ($R^2$)

**해석 예시:**


5. 수업 정리 & 토론

단순선형회귀분석 실습


1. 실습 목표


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)

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 출력 항목)


5. 회귀선 시각화

# 회귀선 그리기
sns.regplot(x='공부시간', y='정답수', data=df, ci=None, line_kws={'color':'red'})
plt.title('공부시간과 정답수 회귀선')
plt.xlabel('공부시간(시간)')
plt.ylabel('정답수(개)')
plt.show()

**해석**: 그래프에서 빨간 직선이 **최적 회귀선**


6. 정리 & 토론

3. 모형 유의성 검정 및 결과 해석


1. 회귀분석표(ANOVA)와 F-검정


2. 독립변수에 대한 t-검정


3. Python 코드 결과 예시 해석

R-squared: 0.963
F-statistic: 156.6, Prob (F-statistic): 0.000
coef (공부시간): 0.6974
P>|t| (공부시간): 0.000

**정리**

4. 회귀모형의 예측 활용 실습


1. 예측의 개념


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()

**정리**

질의응답 및 요약


1. 회귀분석의 한계


2. 종합 요약


3. 질의응답