ここでは、決定木の目的変数が連続値である場合の回帰木について、R言語の「rpart」パッケージを用いて簡単に見ていく。

まずは必要となるパッケージのインストールとロードを行う。「rpart」パッケージは決定木を行うためのものだが、「rpart.plot」と「partykit」パッケージは結果を視覚的に表示するために使うので、あらかじめインストールとロードをしておく。


> install.packages("rpart")
> install.packages("rpart.plot")
> install.packages("partykit")
> library(rpart)
> library(rpart.plot)
> library(partykit)

サンプルデータとして、「rpart」パッケージに含まれる「cu.summary」を使わせていただいた。


> head(cu.summary)
                Price Country Reliability Mileage  Type
Acura Integra 4 11950   Japan Much better      NA Small
Dodge Colt 4     6851   Japan              NA Small
Dodge Omni 4     6995     USA  Much worse      NA Small
Eagle Summit 4   8895     USA      better      33 Small
Ford Escort   4  7402     USA       worse      33 Small
Ford Festiva 4   6319   Korea      better      37 Small

決定木を実行するには、rpart関数を用いる。目的変数が連続値であれば、自動的に回帰木として扱われる。同様に、目的変数がカテゴリ値ならば分類木として扱われる。


> rt <- rpart(Price ~ Mileage + Type + Country, data = cu.summary)
> print(rt)
n= 117 

node), split, n, deviance, yval
      * denotes terminal node

   1) root 117 7407473000 15743.460  
     2) Type=Compact,Small,Sporty,Van 80 3322389000 13035.010  
       4) Country=Brazil,France,Japan,Japan/USA,Korea,Mexico,USA 69 1426421000 11555.160  
         8) Type=Small 21   50309830  7629.048 *
         9) Type=Compact,Sporty,Van 48  910790000 13272.830  
           18) Country=Japan/USA,Mexico,USA 29  482343500 12241.550 *
           19) Country=France,Japan 19  350528000 14846.890 *
       5) Country=Germany,Sweden 11  797004200 22317.730 *
     3) Type=Large,Medium 37 2229351000 21599.570  
       6) Country=France,Korea,USA 25 1021102000 18697.280  
         12) Type=Medium 18  741101600 17607.440 *
	     13) Type=Large 7  203645100 21499.710 *
       7) Country=England,Germany,Japan,Sweden 12  558955000 27646.000 *

この結果をもっと視覚的に分かりやすいグラフとして表示してみる。まずは、標準のplot関数を用いてみる。


> par(xpd = NA)
> plot(rt, branch = 0.8, margin = 0.05)
> text(rt, use.n = TRUE, all = TRUE)

decision-tree-regression-tree-rpart

次に、「rpart.plot」パッケージのrpart.plot関数を用いてみる。


> rpart.plot(rt, type = 1, uniform = TRUE, extra = 1, under = 1, faclen = 0)

decision-tree-regression-tree-rpart.plot

最後に、「partykit」パッケージのas.party関数用いてデータを変換したものをplot関数に用いてみる。


> plot(as.party(rt))

decision-tree-regression-tree-rpart-party

これらのグラフはそれぞれ見栄えが異なるので、気に入ったものを使えばよいと思うが、「partkit」パッケージを用いたものが、比較的誰にでもわかりやすいように感じる。

次に剪定を考えるため、printcp関数と、plotcp関数を実行してみる。


> printcp(rt)

Regression tree:
rpart(formula = Price ~ Mileage + Type + Country, data = cu.summary)

Variables actually used in tree construction:
[1] Country Type   

Root node error: 7407472615/117 = 63311732

n= 117 

        CP nsplit rel error  xerror    xstd
1 0.250522      0   1.00000 1.01365 0.15804
2 0.148359      1   0.74948 0.90282 0.16685
3 0.087654      2   0.60112 0.79992 0.15733
4 0.062818      3   0.51347 0.65730 0.11368
5 0.010519      4   0.45065 0.55595 0.10363
6 0.010308      5   0.44013 0.57370 0.10665
7 0.010000      6   0.42982 0.57370 0.10665

> plotcp(rt)

decision-tree-regression-tree-rpart-cp

plotcp関数の結果から剪定の基準をcp=0.026として、再度決定木を行うと以下のようになる。


> rt2 <- rpart(Price ~ Mileage + Type + Country, data = cu.summary, cp = 0.026)
> print(rt2)
n= 117 

node), split, n, deviance, yval
      * denotes terminal node

  1) root 117 7407473000 15743.460  
    2) Type=Compact,Small,Sporty,Van 80 3322389000 13035.010  
      4) Country=Brazil,France,Japan,Japan/USA,Korea,Mexico,USA 69 1426421000 11555.160  
        8) Type=Small 21   50309830  7629.048 *
        9) Type=Compact,Sporty,Van 48  910790000 13272.830 *
      5) Country=Germany,Sweden 11  797004200 22317.730 *
    3) Type=Large,Medium 37 2229351000 21599.570  
      6) Country=France,Korea,USA 25 1021102000 18697.280 *
      7) Country=England,Germany,Japan,Sweden 12  558955000 27646.000 *

decision-tree-regression-tree-rpart-cp-prune

predict関数を用いると、予測が可能となる。ここでは、簡単のため、cu.summaryデータを二分割したものを用いる。


> train <- cu.summary[1:100,]
> test <- cu.summary[101:112,]
> rtp <- rpart(Price ~ Mileage + Type + Country, data = train)
> p <- predict(rtp, newdata = test)
> print(p)
          Buick Electra V6          Buick Le Sabre V6 
                  11981.79                   11981.79 
      Cadillac Brougham V8       Cadillac De Ville V8 
                  11981.79                   11981.79 
      Chevrolet Caprice V8 Ford LTD Crown Victoria V8 
                  11981.79                   11981.79 
       Lincoln Town Car V8         Chevrolet Astro V6 
                  11981.79                   11981.79 
   Chevrolet Lumina APV V6            Dodge Caravan 4 
                  11981.79                   11981.79 
    Dodge Grand Caravan V6           Ford Aerostar V6 
                  11981.79                   11981.79 

関連する記事

  • R ggplotに回帰直線の式を表示する方法R ggplotに回帰直線の式を表示する方法 R言語のggplotにおいて、グラフに回帰直線の式を表示する方法をお伝えします。 ggplotのグラフに回帰直線の式を表示する方法はいくつかあります。 ここでは最も簡単と思われるggpmiscパッケージを用いて回帰直線の式を表示する方法をお伝えします。 環境 今回の作業環境をsessionInfo()関数で確認しておきます。 > […]
  • R K-means法のクラスタ数を機械的に決定する方法R K-means法のクラスタ数を機械的に決定する方法 K-means法(K平均法)を用いてクラスタリングする場合は、あらかじめクラスタ数を指定しなければならない。 このときのクラスタ数をどのように決めてよいか迷ったことはないだろうか。 ここでは、K-means法のクラスタ数を機械的に決定する方法をお伝えする。 K-means法のクラスタ数を機械的に決定するために用いるのが、Gap統計量である。 Gap統計量を用いたク […]
  • 経営戦略を導き出すための簡単な時系列分析の方法経営戦略を導き出すための簡単な時系列分析の方法 売上高のような時系列データをただ眺めていても、経営戦略を導き出すための示唆を得ることは難しい。 ここでは、売上高のような時系列データを時間に比例する部分と時間に比例しない部分とに分けてとらえると、どのような示唆を得ることができるのかをお伝えする。 この時間に比例する部分と時間に比例しない部分に分けるというのは、変動損益計算書に似ている。 変動損益計算書とは、 […]
  • 商品開発に役立つコンジョイント分析の仕方商品開発に役立つコンジョイント分析の仕方 コンジョイント分析とは、顧客が商品やサービスの持つ複数の属性について、どの点を重要視しているかを探る調査手法だ。例えば、あなたがパソコンを購入する場合を考えてみて欲しい。スペックだけで購入を決定しているだろうか。また、デザインだけで購入を決定しているだろうか。おそらくそうでないはずだ。パソコンは非常に多種多様な製品が市場に出回っているため、何点かに購入候補を絞ってその中から選 […]
  • R言語 CRAN Task View:薬物動態データの解析R言語 CRAN Task View:薬物動態データの解析 CRAN Task View: Analysis of Pharmacokinetic Dataの英語での説明文をGoogle翻訳を使用させていただき機械的に翻訳したものを掲載しました。 Maintainer: Bill Denney Contact: wdenney at […]
決定木 – 回帰木