의사결정 트리 (Decison Tree)
결정 트리(decision tree)는 의사 결정 규칙과 그 결과들을 트리 구조로 도식화한 의사 결정 지원 도구의 일종이다.
모델 학습 시 각 변수마다 중요도(feature importance)를 계산한다.
출처 : https://data-make.tistory.com/75
출처 : https://ko.wikipedia.org/wiki/결정_트리
조건부 추론 트리 (Conditional Inference Tree)
조건부 추론 트리는 의사결정 트리(Decision Tree) + 통계적 유의성 확인(변수의 유의성)이 가능한 수치를 제공해주는 Tree다.
의사결정 나무 알고리즘에서 발생하는 두 가지 단점 해결
- 통계적 유의성에 대한 판단 없이 노드를 분할하면서 생기는 과적합 문제 극복
- 다양한 값으로 분할 가능한 변수가 다른 변수에 비해 선호되는 문제
통계적으로 칼럼 별 중요도를 파악.
중요도가 큰 변수를 트리의 상위에 배치하여 인과관계를 조금 더 정확하게 판별할 수 있다.
출처 : https://data-make.tistory.com/80
예시 1
==========
준비
df <- read.csv('car_house.csv', stringsAsFactors = TRUE)
str(df)
head(df)Code language: PHP (php)
필요한 데이터를 로드하여 df에 저장
install.packages("caret")
install.packages("party")
install.packages("e1071")Code language: JavaScript (javascript)
실습에 필요한 패키지 설치
- caret : Classification And Regression Training. 예측 모델을 만들기 위한 프로세스를 간소화하는 일련의 함수입니다.
- party : 재귀 파티셔닝을 위한 계산 툴 박스다. 패키지의 핵심은 ctree()다. (조건부 추론 트리)
- e1071 : 확률과 통계에 대한 기타 함수를 포함. 없어도 되지만 간혹 오류가 생겨서 일단 설치해봄.
출처 : https://topepo.github.io/caret/
출처 : https://cran.r-project.org/web/packages/party/index.html
출처 : https://cran.r-project.org/web/packages/e1071/index.html
library(caret)
library(party)
실습에 필요한 패키지 라이브러리 로드
set.seed(2000)Code language: JavaScript (javascript)
랜덤 추출을 위한 값 배정
재현 가능한 랜덤값을 얻기 위해서 필요하다. (ex. 마크 맵 시드 번호)
파티션 생성
intrain <- createDataPartition(y=df$MARRY, p = 0.7, list = FALSE)Code language: HTML, XML (xml)
70%와 30%로 나누겠다. (하나는 모델 생성에, 하나는 모델 평가에 사용할 예정)
데이터를 MARRY 기준으로 70%를 랜덤 추출한다.
partition은 intrain에 저장함.
![]() | ![]() |
train <- df[intrain,]
# 위 단계에서 추출한 데이터를 train에 저장 (전체의 70%)
test <- df[-intrain,]
# train에 저장되지 않은 나머지 값을 저장 (전체의 30%)Code language: CSS (css)
![]() | ![]() |
df[infrain,]에 ,가 없으면 안 된다.
그러면 ,는 무슨 의미인가?
예시로 사용할 df_midterm은 아래와 같다.

안녕 난 df_midterm
> df_midterm[1] # 1번 열(세로줄)
english
1 90
2 80
3 60
4 70
> df_midterm[1,] # 1번 행(가로줄)
english math sum1
90 50 140
> df_midterm[1,1] # 1번 행 & 1번 열
[1] 90
> df_midterm[,1] # 1번 열(세로줄)을 가로로 나열
[1] 90 80 60 70Code language: CSS (css)
R에서 데이터 프레임을 인덱싱하는 방법이 따로 있는 것 같다. (참고 : https://ordo.tistory.com/10)
필요하면 외우자.
어쩔 수 없다.
트리 생성
partymod <- ctree(MARRY~., data = train)Code language: HTML, XML (xml)
dicision tree를 작성하기 위해 ctree 기능을 활용하여 작성.
MARRY를 기준으로 트리를 작성하고 partymod에 결과를 저장함.
MARRY~.: 파일에 포함되는 모든 항목 사용MARRY~ MONEY+HOUSE: 특정 항목 MARRY, MONEY, HOUSE만 사용.
plot(partymod)
화면에 트리를 출력

위에서부터 결혼에 영향을 많이 주는 요소다.
AGE가 31세보다 적은 지 많은지가 결혼 여부에 가장 큰 영향을 준다.
또 나이가 26세보다 적고 많은지, 나이가 39세보다 많고 적은 지, 돈을 300보다 많이 버는지 적게 버는지가 결혼에 영향을 준다.
테스트
partypred <- predict(partymod, test)
이전에 30%의 데이터를 따로 test에 넣어놓았다.
이를 이용하여 partymod와 비슷한 결괏값을 가질지 시험해보자.
작성된 트리를 test 데이터에 적용하여 예측을 실시하고 결괏값을 partypred에 저장
confusionMatrix(partypred, test$MARRY)Code language: PHP (php)
예측한 결과(partypred)와 실제 정답(test$MARRY)의 유사도 측정

table(partypred, test$MARRY)Code language: PHP (php)
예측 결과와 실제 정답 간의 오차 확인

예측은 no가 53명, yes가 246명이다.
실제로는 no가 89명, yes가 210명이다.
잘못 예측된 값은 yes지만 no로 예측한 10명과 no지만 yes로 예측한 46명이다.
참고 : ctree함수로 작성한 의사결정나무 결과 해석
예시 2
자취를 한다면 어떤 요인이 중요하게 작용하는지 알아보자.
library(caret)
library(party)
df2 <- read.csv('home_std2.csv', stringsAsFactors = TRUE)
set.seed(2000)
intrain2 <- createDataPartition(y=df2$형태, p = 0.7, list = FALSE)
train2 <- df2[intrain2,]
# 위 단계에서 추출한 데이터를 train2에 저장 (전체의 70%)
test2 <- df2[-intrain2,]
# train2에 저장되지 않은 나머지 값을 저장 (전체의 30%)
partymod2 <- ctree(형태~., data = train2)
plot(partymod2)Code language: PHP (php)

한글 깨짐 ㅅㄱ. 아 제발요…
partypred2 <- predict(partymod2, test2)
confusionMatrix(partypred2, test2$형태)
table(partypred2, test2$형태)
예시 3
library(caret)
library(party)
df3 <- read.csv('volunteer.csv', stringsAsFactors = TRUE)
set.seed(2000)
intrain3 <- createDataPartition(y=df3$봉사활동, p = 0.7, list = FALSE)
train3 <- df3[intrain3,]
# 위 단계에서 추출한 데이터를 train2에 저장 (전체의 70%)
test3 <- df3[-intrain3,]
# train2에 저장되지 않은 나머지 값을 저장 (전체의 30%)
partymod3 <- ctree(봉사활동~., data = train3)
plot(partymod3)Code language: PHP (php)
폰트 깨짐
Rstudio에서 폰트를 사용할 수 있게 설치하겠다.
install.packages('extrafont')
library(extrafont)
fonts() # 현재 사용할 수 있는 폰트 이름
fonttable() # 현재 사용할 수 있는 폰트 자세한 정보
font_import()
# font_import(pattern = "AppleGothic") 특정 폰트만 선택Code language: PHP (php)
No Font Name Skipping이라고 뜨면서 오류가 발생한다.
이에 extrafont가 아닌 showtext를 사용해서 font를 가져오자.
install.packages('showtext')
library('showtext')Code language: JavaScript (javascript)
font_families() # 사용가능한 폰트 조회Code language: PHP (php)
font_add_google('Nanum Gothic', 'Nanum Gothic')
# 'Nanum Gothic' 글꼴을 설치하고, 이를 'Nanum Gothic'으로 부르겠다.
showtext_auto()Code language: PHP (php)
par(family = "Nanum Gothic")Code language: JavaScript (javascript)

정의는 승리한다!
출처 : https://funnystatistics.tistory.com/18




