Data Science by R and Python

統計学を、広く、深く、わかりやすく。

戦略構築に活かす決定木 -Decision Tree-

今日のテーマ「決定木(けっていぎ)」

決定木は、統計の手法の中でも非常によく用いられる手法です。昨日、相談を受けていろいろ勉強したこともあるので、勉強した内容をここにまとめてみようと思います。まずは、決定木の説明と、どのようなケースで用いることができるのかをみていきます。最後に、具体的な使い方を書くので、実際にやってみたい人は最後まで読んでいただければ。

決定木ってどんなもの?

f:id:tomoshige_n:20140720163316j:plain
決定木は全体集団を説明変数を用いて段階的にグループ分けすることで、個体を分類していくような方法です。その結果、上の画像のような「木」ができるので、決定木といわれます。この他決定木のことを「分類木」といったりもします。
*1

決定木を用いるシチュエーション

では、決定木を用いると、どんなメリットが存在するのかを考えましょう。一般的に集団を2つのグループに分類する場合には「ロジスティック回帰」と呼ばれる方法がよく用いられます。これは、統計的には目的変数にベルヌーイ分布を仮定し、一般化線形モデルという枠組みで議論される手法です。
この手法は大雑把に説明すると「説明変数の線形結合」によって、クラスに属する確率の対数オッズを回帰するため「あるデータがどちらのグループに属するのか」は基本的に線形結合で求めるしかありません。

イメージを説明すれば、ある新商品に対してアンケートをとり、様々な質問項目(年齢・年収・健康への意識・・・など)と、購買意志(アンケートで購買すると答えたグループ、購買しないと答えたグループ)をデータとして得たとします。その場合、ある人が購買する確率はロジスティック回帰では以下の式で求めることができます。

(クラス1に属する確率) = 年齢×回帰係数1 + 年収×回帰係数2 + ....

ですが、これではクラスになる確率しかわからないですし、どのような属性を持つ顧客が買ってくれやすそうかなどの市場分析におけるターゲティングを行う場合にはとても不便なのです。

そこで、回帰木の登場です。回帰木を用いると結果は次のように表されます。
例1:全体集合の中で、年齢が50歳以上、年収が400万円〜600万円、健康への関心が5段階中3以上の人は600人いますが、その中で購買意志があると答えた人は「480人」います
例2:全体集合の中で、年齢が30歳未満、年収が400万円以下、健康への関心が5段階中3以上の人は200人いますが、その中で購買意志があると答えた人は「40人」います

このような結果を見れば、購入意志がありそうな層というのは「年齢が50歳以上、年収が400万円〜600万円、健康への関心が5段階中3以上の人」という人だろうという予想がつき、この層の顧客が商品のターゲットになりそうだということが理解できます。その結果、重点的に調査したり、インタビューするなどができるようになります。つまり、決定木を用いることは商品のターゲティングを助けることにつながります。

さて、ここまでで決定木を利用すると良さそうなシチュエーションがわかっていただけたと思います。
学生がビジネスコンテストなどで行っているアンケート調査から、実際の現場で新商品を開発する際の手助けになりそうです。
では、ここからは具体的な決定木の使い方を見ていきましょう。

決定木の使い方

さて、どうやって決定木を使おうかという話になります。まず、エクセルを捨てましょう。Excel VBAなどで調べればもしかしたら出てくるかもしれませんが、さすがに決定木をエクセルで実行するのはキツいです。ここはRに頼りましょう。

Rのインストールなどは、過去のブログに書いています。
あと、ここも参考になります。
http://mjin.doshisha.ac.jp/iwanami/R/index.pdf
*2

Rの上での操作

今回は、実際のデータを読み込むなどの操作はせずに、Rの中に入っているデータを用いて解析をしましょう。
Rの中にはデフォルトで「Titanic」というデータが入っています。まずは、Rで次のコマンドを打ってください。

data(Titanic)
dat = data.frame(Titanic)
dat

すると、こんな風に表示されるはずです。(※長いので一部だけ表示させています)

  Class    Sex   Age Survived Freq
1   1st   Male Child       No    0
2   2nd   Male Child       No    0
3   3rd   Male Child       No   35
4  Crew   Male Child       No    0
5   1st Female Child       No    0
6   2nd Female Child       No    0

データと各変数について説明しましょう。このデータはタイタニック号が座礁して沈むときに、どういう人が生き残り、誰が死んでしまったのか、そしてその数は何人かを表しています。次に変数名の説明です。

  • Class:乗客の客室のグレードです。(1stが一番高級です。Crewは船員です)
  • Sex:乗客の性別です(男性と女性です)
  • Age:ここでは年齢区分です(Child, Adultという分け方です。子供か、大人か)
  • Survived:今回の目的変数です(生存か、死亡かを表します。YESは生存、Noは死亡です)
  • Freq:何人いたのかを表す変数です(35になっているのは、3rdの客室で、男性で、子供で、死んでしまった人が35人いるという意味です)

ただ、実はこのままだと結果が見づらいので次のような操作をします。そのためにいくつかパッケージをインストールしておきましょう。使うパッケージは"epitools"というものです。インストールしたら次のようにコマンドを打ってください。

library(epitools)
dat=expand.table(Titanic)
head(dat)

すると、次のように表示されるはずです。

>head(dat)
  Class  Sex   Age Survived
1   1st Male Child      Yes
2   1st Male Child      Yes
3   1st Male Child      Yes
4   1st Male Child      Yes
5   1st Male Child      Yes
6   1st Male Adult       No

これは、expand.tableによって「生存者がFreqにまとめられていたものを分解した」という操作です。わかりにくければ気にせずに下に進んでください。

今回は、このデータを用いて、どのような属性のひとが生き残り、どのような属性の人がなくなってしまったのかを確認していきます。決定木を用いるためには、rpartという関数を用いることになります。この関数は、パッケージに入っているので上にあるパッケージから"mvpart"という名前のパッケージをインストールしてください。インストールしたら、次のようにコマンドを打ち込みます

library(mvpart)
#rpartという関数は決定木をつくるための関数です。
result = rpart(Survived~Class+Sex+Age,data=dat, method="class")
#結果の確認
result

すると、次のような結果が返ってきます。

> result
n= 2201 

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

 1) root 2201 711 No (0.6769650 0.3230350)  
   2) Sex=Male 1731 367 No (0.7879838 0.2120162)  
     4) Age=Adult 1667 338 No (0.7972406 0.2027594) *
     5) Age=Child 64  29 No (0.5468750 0.4531250)  
      10) Class=3rd 48  13 No (0.7291667 0.2708333) *
      11) Class=1st,2nd 16   0 Yes (0.0000000 1.0000000) *
   3) Sex=Female 470 126 Yes (0.2680851 0.7319149)  
     6) Class=3rd 196  90 No (0.5408163 0.4591837) *
     7) Class=1st,2nd,Crew 274  20 Yes (0.0729927 0.9270073) *

これは、実は木の構成がどのようになっているのかを表しています。ただ、このままではわかりにくいですよね。なので、これがどんな木なのかを図示してみます。図示に使うパッケージは"rpart.plot"です。インストールしたら、次のようにコマンドを打ちましょう。

library(rpart.plot)
prp(result, type=2, extra=102,nn=TRUE, fallen.leaves=TRUE, faclen=0, varlen=0,shadow.col="grey", branch.lty=3, cex = 1.2, split.cex=1.2,under.cex = 1.2)

すると、次のような図がかけますね!
f:id:tomoshige_n:20140720180200p:plain

ここで、各箱の上の方に1),2),と番号が付いているはずですが、これについては先ほど確認したresultの中にある1)の番号に対応しています。わかりやすいですね。では、最後に解釈をしましょう。
今回は一番右下の7番ボックスに注目します。

まず、1番ボックスから、7番ボックスに行くまでに、いくつかの分岐がありますね。この条件に対してYESなら左、NOなら右側に分類されるようになっています。一番右端ってことは、全ての条件分岐でNOとなったようなグループです。

まず、一番最初の分岐は「男性」ですか?という質問です。7番の箱は右側ですから、NOと答えたということになりますので、7番の箱は「女性」であるということがわかります。
そして、次の分岐は3番ボックスです。そこでは「クラスが3rdですか?」という質問です。客室が3rdという一番下のグレードなら左、そうではなければ右です。右ということはクラスが1st ,2nd, Crewということになります。

よって、7番ボックスは女性で、クラスが1st ,2nd, Crewの人が入っているということになります。そして、生存率は下の結果をみて (0.0729927 0.9270073) となっている右側です。つまり、このような人は約93%が生存するということがわかりました。

7) Class=1st,2nd,Crew 274  20 Yes (0.0729927 0.9270073) *

まとめ

ここまでで、決定木についての説明は終わりです。最後にまとめ。今回はTitianicの例を用いて、決定木を用いると、どのような人が生存するのかがよく理解できることがわかりました。今回の例で生存・死亡の部分を「購買」「非購買」という風に置き換えれば、戦略構築に活かせることも理解できますね。ぜひ、決定木を一度触ってみてください。

追記1

実は、決定木を使うときは、このあとに木の剪定という操作を行う必要があります。木が複雑になり過ぎたりした場合に回帰木の枝を切り落として見通しを良くする作業です。これについては、また時間があるときに書くことにします。

追記2

決定木を使う際に、もう1つ重要なことはどのような基準で「閾値」を選ぶのかということがあります。おそらく、デフォルトはジニー係数というものを基準に選んでいて、この他にもエントロピーを基準とした考え方もあります。この基準を変えると、木の構造が変化するので、きちんと実行するならこの辺りまで意識をする必要があるでしょう。

追記3

決定木の最後の注意として、決定木の構造はデータが少し変わるだけで大きく変わる繊細なものであるということを覚えておく必要があります。

参考文献

  • 藤井 良宜(2010), カテゴリカルデータ解析 (Rで学ぶデータサイエンス 1)
  • C.M.Bishop(2008), Pattern Recognition and Machine Learning, Springer
  • 決定木 - Wikipedia

*1:目的変数がカテゴリカルな場合は決定木ですが、目的変数が連続量の場合には「回帰木」と呼ばれます。ただし、今回は決定木をみていくので、気にせず読み飛ばしてください。

*2:ただ、インストールは本当に簡単なので、苦労しないはずです。