단순 선형 회귀분석
상관분석이 "관계가 있는가"를 묻는다면, 회귀분석은 "얼마나 변하는가"를 답합니다. 한 변수(독립변수)로 다른 변수(종속변수)를 예측하는 직선 방정식을 찾는 것이 단순 선형 회귀분석입니다.
회귀분석의 아이디어
무게(wt)가 늘어날 때 연비(mpg)가 얼마나 줄어드는지 알고 싶습니다. 모든 데이터 포인트를 가장 잘 설명하는 직선, 즉 잔차(실제값 - 예측값)의 제곱합을 최소화하는 직선을 찾습니다. 이것이 최소제곱법(Ordinary Least Squares, OLS)입니다.
예측 모형은 이렇게 씁니다.
mpg = β₀ + β₁ × wt + ε
β₀ : 절편 (wt = 0일 때의 mpg, 현실적 의미 없는 경우도 있음)
β₁ : 기울기 (wt가 1 증가할 때 mpg의 변화량)
ε : 오차항
lm()으로 모형 적합하기
# lm(종속변수 ~ 독립변수, data = 데이터프레임)
model <- lm(mpg ~ wt, data = mtcars)
model
Call:
lm(formula = mpg ~ wt, data = mtcars)
Coefficients:
(Intercept) wt
37.285 -5.344
# 해석
# mpg = 37.285 + (-5.344) × wt
# wt가 1,000 lbs 증가할 때마다 연비가 평균 5.344 mpg 감소한다
summary()로 상세 결과 읽기
lm()의 결과를 summary()로 확인하면 통계적 유의성과 모형 적합도를 한눈에 볼 수 있습니다.
summary(model)
Call:
lm(formula = mpg ~ wt, data = mtcars)
Residuals:
Min 1Q Median 3Q Max
-4.5432 -2.3647 -0.1252 1.4096 6.8727
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 37.2851 1.8776 19.858 < 2e-16 ***
wt -5.3445 0.5591 -9.559 1.29e-10 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 3.046 on 30 degrees of freedom
Multiple R-squared: 0.7528, Adjusted R-squared: 0.7446
F-statistic: 91.38 on 1 and 30 DF, p-value: 1.294e-10
각 항목을 읽는 법입니다.
# Estimate : 추정된 계수 (β₀, β₁)
# Std. Error: 계수의 표준오차 — 작을수록 추정이 정밀
# t value : Estimate / Std. Error
# Pr(>|t|) : p-value — 0.05 미만이면 통계적으로 유의함
# *** p < 0.001, ** p < 0.01, * p < 0.05
# Residual standard error : 잔차의 표준편차 — 예측 오차의 평균적 크기
# Multiple R-squared (R²) : 0.7528 → 모형이 종속변수 분산의 75.3%를 설명함
# F-statistic p-value : 모형 전체의 유의성
R²(결정계수) 이해하기
R²은 0에서 1 사이 값으로, 1에 가까울수록 모형이 데이터를 잘 설명합니다.
# R²의 의미
# R² = 0.75 → 독립변수(wt)가 종속변수(mpg) 변동의 75%를 설명
# 나머지 25%는 모형에 포함되지 않은 다른 요인들
# 직접 계산해보기
y_hat <- fitted(model) # 예측값
y_bar <- mean(mtcars$mpg) # 종속변수 평균
y <- mtcars$mpg # 실제값
SS_tot <- sum((y - y_bar)^2) # 전체 변동
SS_res <- sum((y - y_hat)^2) # 설명되지 않은 변동
SS_reg <- SS_tot - SS_res # 설명된 변동
R2 <- SS_reg / SS_tot
R2 # 0.7528328
predict()로 예측하기
모형이 완성되면 새로운 값에 대한 예측이 가능합니다.
# 단일 값 예측
new_data <- data.frame(wt = 3.5)
predict(model, newdata = new_data)
# [1] 18.5793
# wt = 3.5 (3,500 lbs)인 자동차의 예측 연비는 약 18.6 mpg
# 신뢰구간 포함 예측
predict(model, newdata = new_data, interval = "confidence")
# fit lwr upr
# 1 18.5793 17.48275 19.67585
# 95% 신뢰구간: 17.5 ~ 19.7 mpg
# 예측구간 — 개별 관측값의 범위 (신뢰구간보다 넓음)
predict(model, newdata = new_data, interval = "prediction")
# fit lwr upr
# 1 18.5793 12.37138 24.78723
# 여러 값 한번에 예측
new_cars <- data.frame(wt = c(2.0, 2.5, 3.0, 3.5, 4.0, 4.5))
predictions <- predict(model, newdata = new_cars, interval = "confidence")
cbind(new_cars, predictions)
회귀선을 그래프로 표현하기
library(ggplot2)
ggplot(mtcars, aes(x = wt, y = mpg)) +
geom_point(color = "steelblue", size = 3, alpha = 0.7) +
geom_smooth(method = "lm", se = TRUE,
color = "tomato", fill = "salmon", alpha = 0.2) +
labs(
title = "단순 선형 회귀: 무게 → 연비",
subtitle = "mpg = 37.29 - 5.34 × wt (R² = 0.75, p < 0.001)",
x = "차체 무게 (1000 lbs)",
y = "연비 (mpg)"
) +
theme_classic()
# 예측구간 시각화
pred_df <- predict(model, interval = "prediction") |> as.data.frame()
mtcars_pred <- cbind(mtcars, pred_df)
ggplot(mtcars_pred, aes(x = wt, y = mpg)) +
geom_ribbon(aes(ymin = lwr, ymax = upr),
fill = "lightblue", alpha = 0.4) +
geom_line(aes(y = fit), color = "tomato", linewidth = 1) +
geom_point(color = "steelblue", size = 2.5) +
labs(title = "회귀선과 95% 예측구간",
x = "차체 무게 (1000 lbs)", y = "연비 (mpg)") +
theme_classic()
모형에서 값 꺼내기
# 계수 추출
coef(model)
# (Intercept) wt
# 37.28513 -5.34448
# 잔차 추출 (실제값 - 예측값)
residuals(model)
resid(model) # 동일, 짧은 버전
# 적합값(예측값) 추출
fitted(model)
# broom 패키지 — 깔끔한 데이터프레임으로 변환
# install.packages("broom") # 최초 1회만 실행
library(broom)
tidy(model) # 계수 테이블 (tibble)
glance(model) # R², AIC 등 모형 요약
augment(model) # 원데이터 + 예측값 + 잔차 등 추가
단순 선형 회귀는 기초이지만, 이 흐름 자체(모형 적합 → summary 해석 → 예측)는 다중 회귀와 로지스틱 회귀에서도 동일하게 쓰입니다.