의사결정나무(Decision Tree)
입력변수의 조건에 따라 데이터를 순차적으로 나누고, 마지막 끝마디에서 범주 또는 수치를 예측하는 나무형 모형입니다.
범주형 결과 예측
예: 관광상품 구매 / 비구매
연속형 결과 예측
예: 예상 지출액(원)
교재 408~414쪽을 한 번에 학습할 수 있도록 핵심 개념과 계산 원리를 그림·비교표·예제로 정리했습니다. 마지막에는 기출 21~23번을 직접 풀고 해설을 확인할 수 있습니다.
입력변수의 조건에 따라 데이터를 순차적으로 나누고, 마지막 끝마디에서 범주 또는 수치를 예측하는 나무형 모형입니다.
| 알고리즘 | 핵심 분리기준 | 특징 | 기억할 키워드 |
|---|---|---|---|
| CART Classification and Regression Trees | 분류: 지니 불순도 회귀: 제곱오차 감소 등 | 이진 분기를 기본으로 분류·회귀 모두 지원 | Gini / 회귀 |
| C4.5 | 정보이득비율(Gain Ratio) | 엔트로피 기반 정보이득을 정규화한 분리기준 | Entropy / Gain Ratio |
| C5.0 | 정보이득비율 계열 | C4.5를 개선한 분류 알고리즘; 속도·규칙화 등 발전 | C4.5 개선 |
| CHAID | 카이제곱 검정 등 통계적 유의성 | 범주 병합과 다지 분기가 가능 | χ² / p값 |
각 마디에서 좋은 분리규칙을 선택하여 재귀적으로 분할합니다.
정지규칙에 도달하면 중단일반화에 불리하거나 지나치게 복잡한 가지를 제거합니다.
과대적합·복잡도 감소검증·시험 데이터, 교차검증, 분류 성능 등을 확인합니다.
예: 정확도, 위험도표, 이익도표결정규칙을 이해하고 새로운 관측값에 적용합니다.
규칙 설명과 실제 활용이진 분류나무에서 최적 분할은 부모마디 불순도에서 자식마디의 표본비율 가중 평균 불순도를 뺀 값이 최대가 되는 방식으로 선택합니다.
위 관광상품 예시의 10명(구매 6, 비구매 4)을 만족도 기준으로 나누면:
아래 수치는 교육용 예시입니다. 각 자식마디의 구매·비구매 인원을 변경하면 부모 불순도, 분리 후 불순도, 감소량이 즉시 바뀝니다.
| 목표변수 유형 | 주요 분리기준 | 올바른 선택 원리 |
|---|---|---|
| 범주형(분류) | 지니 불순도 / 엔트로피 / 카이제곱 검정 등 | 지니·엔트로피는 가중 불순도 감소가 큰 분할. CHAID류는 통계적 유의성 활용. |
| 연속형(회귀) | 분산 또는 제곱오차(SSE) 감소, 분산분석 검정 등 | 분리 후 제곱오차 감소가 큰 분할을 우선한다. |
나무를 성장시키는 도중 일정 조건을 만족하면 더 이상 분할하지 않습니다.
예: maxdepth, minsplit, minbucket
상대적으로 크게 성장시킨 나무에서 과도하거나 효과가 약한 하위 가지를 제거합니다.
예: R rpart::prune()
나무의 예측오차(또는 불순도 기반 손실) R(T)에 끝마디 개수에 비례한 복잡도 벌점을 더하여 나무 크기를 제어합니다. α가 커질수록 단순한 나무를 선호합니다.
# 1. 데이터 및 패키지
# install.packages("rpart") # 미설치 시 최초 1회
library(rpart)
data(iris)
set.seed(2026)
idx <- sample(seq_len(nrow(iris)), size = 0.7 * nrow(iris))
train <- iris[idx, ]
test <- iris[-idx, ]
# 2. 분류나무 생성: Species는 범주형 목표변수
fit <- rpart(Species ~ ., data = train, method = "class",
control = rpart.control(cp = 0.001,
minsplit = 10,
maxdepth = 5))
# 3. 나무 확인
plot(fit, uniform = TRUE, margin = 0.1)
text(fit, use.n = TRUE, cex = 0.8)
printcp(fit) # 교차검증 오류 및 복잡도 매개변수
plotcp(fit)
# 4. 교차검증 오류가 가장 작은 CP 사용
cp_best <- fit$cptable[which.min(fit$cptable[, "xerror"]), "CP"]
fit_pruned <- prune(fit, cp = cp_best)
# 5. 시험자료 성능
pred <- predict(fit_pruned, newdata = test, type = "class")
confusion <- table(Actual = test$Species, Predicted = pred)
print(confusion)
accuracy <- mean(pred == test$Species)
print(accuracy)
# 최종 나무 시각화
plot(fit_pruned, uniform = TRUE, margin = 0.1)
text(fit_pruned, use.n = TRUE, cex = 0.8)Species는 품종을 나타내는 범주형 목표변수이며, 나머지 꽃받침·꽃잎 측정값으로 품종을 분류합니다. cp는 CART 나무의 복잡도를 제어합니다. 이 예제는 학습용 무작위 분할이므로 결과 정확도는 실제 실행 환경과 분할에 따라 달라질 수 있습니다.이미 성장한 의사결정나무에서 일반화에 불리한 가지를 제거하여 과대적합을 줄이는 방법입니다.
나무는 전체 데이터를 포함하는 뿌리마디에서 시작해 분리규칙을 적용하면서 자식마디로 내려가는 방식입니다. 따라서 상향식이라는 표현이 틀렸습니다.
① 지니 지수는 불순도 지표, ③ 분기 기준은 데이터를 나누는 조건, ④ 가지치기는 복잡도를 제어하는 절차로 모두 의사결정나무의 핵심 개념입니다.