R 에서 의사결정나무 (Decision Tree) 를 간단하게 그려봤다

g1_grade, g1_type 의 값에 따라 succeeded 가 결정된다고 가정하고
이를 위한 예제용 데이터를 만들어봤다

의사결정 나무를 그리는 코드는 여기를 참고해서 만들어봤음 : http://www.statmethods.net/advstats/cart.html

코드 예제에서 rpart method=“anova” 로 되어있는데, 그렇게 그렸더니 원하는 결과가 나오지 않아서
박장시님 도움으로 rpart method=“class” 라고 써야한다는 것과 rattle package 에 대해 배움! - 장시님, 감사 (_ _)



# install prerequisite packages
# 이건 처음에 한번만 하면 됨
install.packages("rpart")
install.packages("rpart.plot")
install.packages("rattle")



# load library of rpart
library(rpart)
library(rpart.plot)
library(rattle)


# make sample data
df <- data.frame(g1_grade=3, g1_type=1, succeeded=1, seq=1:1000)
df <- rbind(df, data.frame(g1_grade=3, g1_type=3, succeeded=0, seq=1:800))
df <- rbind(df, data.frame(g1_grade=3, g1_type=2, succeeded=0, seq=1:900))
df <- rbind(df, data.frame(g1_grade=3, g1_type=1, succeeded=0, seq=1:100))
df <- rbind(df, data.frame(g1_grade=2, g1_type=1, succeeded=1, seq=1:100))
df <- rbind(df, data.frame(g1_grade=2, g1_type=1, succeeded=0, seq=1:800))
df <- rbind(df, data.frame(g1_grade=2, g1_type=2, succeeded=0, seq=1:800))
df <- rbind(df, data.frame(g1_grade=2, g1_type=2, succeeded=1, seq=1:100))
df <- rbind(df, data.frame(g1_grade=2, g1_type=3, succeeded=1, seq=1:200))
df <- rbind(df, data.frame(g1_grade=2, g1_type=3, succeeded=0, seq=1:900))

# show structure of df
str(df)
'data.frame': 5700 obs. of 4 variables:
$ g1_grade : num 3 3 3 3 3 3 3 3 3 3 ...
$ g1_type : num 1 1 1 1 1 1 1 1 1 1 ...
$ succeeded: num 1 1 1 1 1 1 1 1 1 1 ...
$ seq : int 1 2 3 4 5 6 7 8 9 10 ...

# make decision tree
tree <- rpart(succeeded ~ g1_type + g1_grade, data = df,
               method = "class", control = rpart.control(minsplit = 10))


# draw it with just simple plot!
plot(tree)
text(tree, use.n=TRUE, all=TRUE, cex=.8)

# check working directory
getwd()

# create post script file to export tree to pdf
post(tree, file = "tree.ps", title = "How to success")

# draw it with fancy tree!
fancyRpartPlot(tree)




그림들은 모두 같은 그림이고 포장만 좀 다르다.
fancyRpartPlot 이 가장 보기 좋다!

데이터를 해석해보자면,

* 전체 데이터 중 75% 는 succeeded = 0, 25% 는 succeeded = 1
     이게 조금 헛갈릴 수 있는데, 각 노드의 두번째 줄에 표시된 값이
     평가 대상 변수의 분포 비율이라고 보면 됨

* 1번 -> 2번 : 65% 가 넘어갔음. 이 데이터는 g1_type = {2, 3}.
     succeeded 분포는 0 이 92%, 1 이 8% 로,
     이를 통해 g1_type 이 2, 3 인 데이터는 succeeded = 1 이 될 확률이 8% 밖에 안된다고 볼 수 있음

* 1번 -> 3번 : 35% 가 넘어갔음. g1_type = 1
     succeeded 분포는 0 이 45%, 1 이 55% 로,
     g1_grade 기준으로 분기가 또 이루어짐

     * 3번 -> 6번 : 3번 조건인 데이터 중 (전체의 35%),
          전체의 16% 에 해당하는 데이터가 g1_grade < 2.5
          이를 통해 g1_type = 1 && g1_grade < 2.5 인 경우 succeeded = 1 이 될 확률이 11% 

     * 3번 -> 7번 : 3번 조건인 데이터 중 (전체의 35%),
          전체의 19% 에 해당하는 데이터가 g1_grade >= 2.5
          이를 통해 g1_type = 1 && g1_grade >= 2.5 인 경우 succeeded = 1 이 될 확률이 91% 

목적상 succeeded = 1 을 원한다면,
데이터의 g1_type = 1 로 만드는 것이 가장 큰 도움이 되고, 그 다음으로 g1_grade 를 2.5 이상으로 만들어야 함

의사결정 나무에 대해 살짝 알아봤는데,
코드 작성 없이 데이터 만으로 의사결정 나무를 만들어주고 시각화 해주는 R 이 매력적으로 느껴짐!



R 에서 MySQL 에 접속해서 SELECT 한 결과로 보고서를 그려보자

JOIN 이 가능하니, MySQL 에 로그를 넣어놓으면 가공하기 더 좋을 것 같다

참고로 아래 그래프는 우리 데이터에서 grade 별 count 에 대한 graph!



# load libraries for access and draw
library ("DBI")
library ("RMySQL")
library ("ggplot2")


# connect to database server
conn = dbConnect(MySQL(), user=’user', password=‘password', dbname=‘dbname', host=‘host')

# get table list
dbListTables(conn)

# query table content
rs = dbSendQuery(conn, "SELECT * FROM table")

# fetch and make data frame from ResultSet
table = fetch(rs)

# get column names
names(table)

# prepare plot for drawing
d = ggplot(table, aes(factor(column)))

# draw simple bar
d + geom_bar()

# release ResultSet resource
dbClearResult(rs)

# release DB Connection resource
dbDisconnect(conn)



+ Recent posts