この記事では、統計解析ソフトのRで決定木分析を実践する方法について解説します。
私が業務で分類問題に直面したら、まず決定木分析を実施します。
私がこれまで経験から学んだことを皆さんに共有します。
これから決定木に挑戦される方にとって役に立つ情報満載です。
是非、最後までお読みいただければと思います。
決定木とは
決定木とは目的変数を分類するルールを木構造で表したものです。
決定木の例です。

これは製造業のデータを想定した例です。
ある製品の品質検査結果(OK/NG)を分類する決定木です。
圧力が0.3Mpa以上、且つ加熱温度が800℃未満の条件下で製造された製品はNGとなる確率(24/25)が高いことが分かります。
※上記データは架空のものです。
特徴
決定木の特徴は、なんといっても分析結果の可読性が高いことです!
分析結果の可読性が高いということはつまり…
- ドメイン知識に基づいた分析結果の妥当性チェックが可能
- 課題解決のための意思決定スピードが早くなる
分析の目的は分析結果に基づき、課題を解決するための意思決定を行うことです。
分類ルールが木構造で可視化される決定木は分析結果をそのまま意思決定に活用しやすい分析手法と言えます。
決定木の代表的なメリットとデメリットを下に記載します。
メリット
- 分析結果の可読性が高い
- 説明変数にカテゴリカル変数と数値変数が混在してもOK
- スケーリングが必要ない
デメリット
- 線形性のあるデータに弱い
- 過学習しやすい
過学習になりやすいということは未知のデータに対する予測能力(汎化性能)が低いということです。
汎化性能を上げる工夫の1つに木の剪定があります。これは後程説明します。
Rでの実装
Rにはさまざまな決定木のライブラリが存在しますが、今回は代表的なrpartををご紹介します。
データはタイタニック号の乗客属性データを使用します。
データは下のボタンからダウンロードできます。
今回はビジネス的な側面は無視し、タイタニック沈没事故で生存できたのはどんな属性を持った乗客かを分析していきます。
ライブラリの準備
まずは、 決定木分析に必要なライブラリを準備します。
「rpart」はCARTという分類アルゴリズムが実装されたライブラリです。
分析結果を可視化するためのライブラリ については、「rpart.plot」と「partykit」の2種類をご紹介します。
#ライブラリの準備 install.packages("rpart") install.packages("rpart.plot") install.packages("partykit") library(rpart) library(rpart.plot) library(partykit)
データの準備
ローカルに保存したタイタニックのデータをRにインポートします。
#タイタニック号の乗客データをインポート df <- read.csv("C:/Users/user/Documents/R_Study/Titanic Data.csv",header = T) head(df)

head関数で上のような結果が返ってきたらOKです。
「age」は乗客の年齢ですが、2行目に0.9167という値が入っています。
これはおかしなデータなので本来であれば、代表値で置き換えるか行ごと削除した方が良さそうですが、今回は無視して進みます。
データの定義は以下の通りです。

「survived」を目的変数とし、分析していきます。
データの確認
まずはsummary関数でデータの要約統計量を確認します。
#データの確認 summary(df)

目的変数「survived」 の内訳は死亡者数が809、生存者数が500ということが分かります。
また、「age」に注目すると、NA’sが263となっています。
NA’sは欠損値の数を意味しています。予測のための分析であれば、欠損値を補完するなどの特徴量エンジニアリングを実施すべきですが、今回は予測することが目的ではないので実施しません。
決定木の作成
rpartで決定木を作成するコード例は以下の通りです。
#決定木の作成 tree <- rpart(survived ~ . ,data=df, method = "class")
「survived ~ . 」 モデル式を表しており、survived を目的変数とし、そのほか全てのカラムを説明変数に設定しています。
「data = 」オプションにはデータセット名を指定します。
「method = 」には目的変数が変数型に応じて設定します。
今回は目的変数がカテゴリカルな変数なので ” class “と指定します。
分析結果のサマリを確認
summary関数で分析結果のサマリを確認します。
#分析結果のサマリーを確認 summary(tree)

サマリで特に見るべきなのは、variable importance(変数の重要度)です。
sex(性別)が1番重要度が高いことが分かります。
変数の重要度が高いほど、クラスを効率よく分類させる変数と思ってください。
variable importance の下に各ノードの分類ルールが記述されていますが、 分類ルールは決定木をプロットした方が分かりやすいです。
分析結果のプロット
2種類の決定木プロットをご紹介します。
お好みで使い分けてください。
rpart.plot
rpart.plotライブラリを有効化すれば使えます。
#決定木のプロット(1) rpart.plot(tree)

各ノードがどのクラスに分類されているかが色で判断できるのがrpart.plotの良い点です。
プロットから、女性に比べて男性は生存率が低いことが分かります。
「体力のある男性が救助役を担い、救助の際に亡くなってしまった」という仮説が立てられます。
as.party
partykitライブラリが提供するプロットです。
#決定木のプロット(2) plot(as.party(tree))

葉ノードに分類されたデータのクラスの比率がグラフで表現され、分類の良さを確認しやすいのが良い点です。
葉ノードとは、下にノードを持たないノードのことです。
ここで、サマリで変数の重要度が1番高かったのは変数sex(性別)だったことを思い出してください。
プロットから、変数sexが根ノード(1番上のノード)の分類ルールに使われているのが分かります。
重要度が高い変数ほど、序盤の分類ルールに使われやすいです。
木の剪定
決定木モデルは、木の枝を成長させながらデータの分類精度を向上させます。
ただし、そのモデル作成に使用していない未知のデータについて精度が良い保証はありません。
決定木モデルでデータを当てはめるときには、成長しすぎた枝を刈り取る必要があり、これを剪定といいます。
上で見た木はやや複雑です。
cp (complexity parameter) を調整することで剪定ができます。
cpの確認にはplotcpが便利です。plotcp は、複雑パラメター cpと木の深さの関係をグラフで示します。
#cp(決定木の複雑度)の確認 plotcp(tree)

cp選択基準の1つが下記です。
xerror が「xerror の最小値に標準偏差を足した値 」を初めて下回るときのcp
plotcpのグラフの点線は xerror の最小値に標準偏差を足した値 0.57131862 を示しており、これを初めて下回るcpは0.013であることが分かります。
xerror の最小値に標準偏差を足した値 は、サマリで出力されたcp一覧からも計算することができます。

cpで木の剪定を実施します。
#cpの調整 tree.cp <- prune(tree,cp=0.013) #木を剪定する plot(as.party(tree.cp)) #剪定した木をプロット

剪定した結果、すっきりした木になり、可読性も上がりました。
右端の葉ノードから、チケットクラスが高い女性客が多く生き残ったことが分かります。
モデルの評価
決定木モデルの作成に使用したデータに対する分類精度を確認します。
分類精度を評価する際は、混同行列を作成しましょう。
#モデルによる予測値 titanic.pre <- data.frame(round(predict(tree.cp, df))) #0/1をdied/survivedに変換する関数を定義 num2char <- function(survived){ ifelse(survived == 1,"survive","died") } #関数の実行 titanic.pre$survived <- num2char(titanic.pre$survived) #予測精度を確認 (tab <- table(titanic.pre[,2], df$survived)) #混同行列 sum(diag(tab)) / sum(tab) #分類精度

混同行列から、diedを正しく分類できた件数は697、survivedは360であることが分かります。
分類精度は、(正しく分類できた件数)÷(サンプル数)=0.8074866です。
データの約80%が正しく分類できました。
分析の目的によって着目すべき評価指標が異なります。
これに関しては今後の記事で取り上げたいと思います。
【注意】未知のデータを予測するモデルを評価する場合は、モデル作成に使用していないデータに対する分類精度を評価しましょう。
まとめ
最後までお読みいただき、ありがとうございます。
分析結果の説明性が高い決定木は、ビジネス課題の解決に使いやすいツールです。
是非、試してみてください。
本記事に関するご指摘、ご質問がございましたら、Twitterにてお気軽にメッセージをください。
Twitterアカウント:@data_nava
Twitterでも統計学、機械学習について発信しておりますので、フォローいただけると嬉しいです!
データ分析について学びたい方にオススメの講座
【DataMix】データサイエンティスト育成コース


この講座は、未経験の方であってもデータサイエンティストのエントリー職として仕事に就けるレベルにまで引き上げることを目的とした講座です。
データサイエンティストに必要な知識やスキル、考え方を実践的に学ぶことができる約6か月間のプログラムです。
【DataMix】データサイエンティスト育成コースで学べる知識・スキル
・機械学習・統計学に関する基礎知識
・PythonとRによるプログラミング
・自然言語処理
・画像処理(Deep Learning)
・データサイエンスPJの進め方
コメント