아이티윌_데이터 분석 55기/강의내용 필기_통계 및 분석

#10 10일차_분류분석

ecosso 2026. 4. 24. 16:52

01 분류분석 (Classification)


 

01 분류분석 (Classification)

y가 수치형인지, 범주형인지에 따라 분석방법이 달라진다.

y가 수치형인 경우 회귀분석, 범주형인 경우 분류분석을 수행한다.

 

 [ 의사결정나무 ]
 - 단 한 개의 트리 구조를 사용하여 Y를 분류하는 모델링 기법
 - 비통계 모델(통계적 가정이 필요 없음)

 장점)
 - 간편, 쉽고 빠름 -> 해석이 용이
 - 과적합이 되기 쉬움

 단점)
 - 과적합 되기 쉬움
 - 평가척도를 통게적, 확률적으로 해석 불가

 학습과정)
 1. 성장
 - 불순도 감소량을 기준으로 최족의 분리 기준을 찾아서 가지를 형성함
 - 리프노드로 갈수록 불순도가 낮아지도록 성장

 2. 정지규칙
 - 더 이상 분할을 하지 않는 규칙(현재 노드가 마지막 노드가 되도록 하는 기준)
 1) maxdepth : 트리의 높이를 직접적으로 제한
 2) minbucket : 최소가지치기기준 (오분류개수 기준) - defalut : 7 (오분류개수가 7개 이상이면 추가 분리 진행)
# minbucket 이 작아지면 최소기준점을 낮게 만들기 때문에 추가 분리가 된다. depth가 큰 tree가 형성되며 복잡도가 증가한다.
# minbucket 이 작아지면 최소기준점을 높게 만들기 때문에 분리가 적게 진행된다. depth가 작은 tree가 형성되며 복잡도가 감소한다.

 3. 가지치기
 - 트리 depth 조절
 - cp table을 사용하여 적절한 가지의 수준 결정
 - 복잡도 제어 목적 사용 -> 일반화 성능 향상 목적

 [ 예제 - 의사결정나무를 사용한 분류분석 (iris) ]
 목표 : iris의 speices(y)를 정확하게 예측하는 분류모형 생성
 1. 데이터 탐색
 1) 기술통계량

> summary(iris)
  Sepal.Length    Sepal.Width     Petal.Length    Petal.Width          Species  
 Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100   setosa    :50  
 1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300   versicolor:50  
 Median :5.800   Median :3.000   Median :4.350   Median :1.300   virginica :50  
 Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199                  
 3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800                  
 Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500 

 

 2) 시각화
2-1) 교차산점도 : 상관관계, y분류의 직접적인 변수 확인
plot(iris[,-5], col = iris$Species)

2-2) 이상치
boxplot(iris[,-5])

 2. 데이터 처리
 변수 변환, 변수 선택, 스케일링, ...
 tree 기반 모델의 장점은 스케일링을 고려하지 않아도 됨

 3. 모델링
 1) 훈련 / 평가 데이터 분리 (7:3)

sample(1:45, 6)
sample(1:45, 6, replace =  T) # 같은 숫자가 여러번 나와도 될 때 

set.seed(0)
rn <- sample(1:nrow(iris), nrow(iris) * 0.7)
iris_train <- iris[rn, ]
iris_test <-iris[-rn, ]


 2) 학습
install.packages('rpart')
library(rpart)

rpart(formula = ,  # y ~ x 
      data = ,     # 데이터 이름
      control = )  # 매개변수 (하이퍼파라미터 전달)

m1 <- rpart(Species ~ .,iris_train)
m1

node), split, n, loss, yval, (yprob)
* denotes terminal node

 노드번호), 분리기준, 총개수, 오분류개수, y 대표값, (각 클래스별 확률)
 * 마지막 노드


1) root 105 67 setosa (0.36190476 0.33333333 0.30476190)  
# 1번 노드) 루트노드, 105개(train), setosa 비율, versicolor 비율, virginica 비율
# setosa 비율이 가장 높기 때문에 집단의 이름이 setosa가 됨

2) Petal.Length< 2.35 38  0 setosa (1.00000000 0.00000000 0.00000000) *
# 2번 노드) (질문) Petal.Length가 2.35보다 작은 쪽
# 38개가 옴. (1번노드의 105개 중 38개의 Petal.Length가 2.35보다 작음)
# 오분류율 0, setosa만 있기 때문에 집단의 이름은 setosa가 되며 불순도가 0이기 때문에 종료.
  
    3) Petal.Length>=2.35 67 32 versicolor (0.00000000 0.52238806 0.47761194)  
6) Petal.Width< 1.75 37  3 versicolor (0.00000000 0.91891892 0.08108108) *
  7) Petal.Width>=1.75 30  1 virginica (0.00000000 0.03333333 0.96666667) *
  
# 3) 모델결과 시각화
plot(m1)
text(m1, cex = 0.7)

install.packages('rpart.plot')
library(rpart.plot)
prp(m1,           # 모델이름
    type = 4,     # 트리스타일
    extra = 3)    # 2: 정분류개수, 3: 오분류개수