今回のお題

前提

今回の演習を行うパソコンでは,前回の演習が実行済みであることを前提とする. 前回とは別のパソコンで行う場合には,Rのプロクシの設定データの読み込みなどを実行しておくこと.

Rの準備

今回はrpartパッケージを使うので,以下の1行を実行して,インストールしておく. これは,1台のパソコンでは1度だけ実行すれば良い.

install.packages(c("tree", "rpart"), dependencies=TRUE)

rpartパッケージの読み込みは,Rを起動する度に毎回,実行する必要がある.

library(rpart)

データの準備

tic.sub中の変数V86を,0と1の2値から,「契約あり(contract)」と「契約なし(no contract)」という文字列に変換しておく.

tic.sub.2 <- tic.sub
tic.sub.2$V86 <- as.character(tic.sub$V86)
tic.sub.2$V86[tic.sub$V86==0] <- "no contract"
tic.sub.2$V86[tic.sub$V86==1] <- "contract"
tic.sub.2$V86 <- as.factor(tic.sub.2$V86)

決定木分析

決定木分析の実施にはrpart()という関数を用いる.

tic.rpart <- rpart(V86~.,
                   data=tic.sub.2)

結果を表示すると,

tic.rpart

次のように,何も分割されないはずである.

n= 5822 

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

1) root 5822 348 no contract (0.05977327 0.94022673) *

このデータは, 

table(tic.sub.2$V86)

により“contract”と“no contract”を数えさせると,

   contract no contract 
        348        5474 

と,契約数が6%弱である.そのため,デフォルトの決定木分析の設定では,これ以上は分割しない. そこで,rpartの制御変数を,幾つか変更して,更に分割させることを試みる.

tic.rpart <- rpart(V86~.,
                   data=tic.sub.2,
                   control=c(cp=0.002))
summary(tic.rpart)
par(cex=0.8)
plot(tic.rpart, uniform=T, branch=0.6, margin=0.05)
text(tic.rpart, all=T, use.n=T)
par(cex=1.0)

これは,cpという複雑さを指定する制御変数をデフォルトの0.05から,0.002まで小さくしてみた場合である.

この描き方では,ノードには囲みはないが,分割点に左右の条件が示され,分割の下には契約あり(contract)と契約なし(no contract)のヒストグラムと, 数字(contract/no contract)が記されている.それぞれのノードの「契約成功率」もしくは「契約成功のオッズ」は,各自で検討すること.

途中の行のcex=0.8は,プロットの中の文字の大きさを変更している. cex=1.0がデフォルトで,0.8は少し小さめ,という指定になる. グラフを作成し終えたら,1.0に戻しておく.

分割を決める制御変数には

rpart.controlの引数意味デフォルト値
minsplitノードの分割を試みる最小のレコード数20
minbucket終端ノードのレコード数の最小値round(minsplit/3)
cp決定木の複雑さを調整するパラメータ0.05
maxdepth決定木の最大の深さ30

などがある.他にも,

rpart.controlの引数意味デフォルト値
maxcompetethe number of competitor splits retained in the output4
maxsurrogatethe number of surrogate splits retained in the output5
usesurrrogatehow to use surrogates in the splitting process2
xvalnumber of cross-validations10
surrogatestylecontrols the selection of a best surrogate0

などがあるが,このデータの分析では使わない.

さて複雑度を0.001に小さくすると,より複雑な木が得られる. ノード数が増えるので,字が小さくなる.

tic.rpart <- rpart(V86~.,
                   data=tic.sub.2, 
                   control=c(minsplit=5, 
                             cp=0.001))
summary(tic.rpart)
par(cex=0.5)
plot(tic.rpart, uniform=T, branch=0.6, margin=0.05)
text(tic.rpart, all=T, use.n=T)
par(cex=1.0)

など.