iBetter Books
수정

단순 선형 회귀분석

상관분석이 "관계가 있는가"를 묻는다면, 회귀분석은 "얼마나 변하는가"를 답합니다. 한 변수(독립변수)로 다른 변수(종속변수)를 예측하는 직선 방정식을 찾는 것이 단순 선형 회귀분석입니다.

회귀분석의 아이디어

무게(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 해석 → 예측)는 다중 회귀와 로지스틱 회귀에서도 동일하게 쓰입니다.