【ウーバーイーツ】配達データで決定木を作成してみた【沖縄市】
※決定木を使いたかっただけの記事
参考書籍・資料

主な参考箇所 15 ツリーモデル
概要
扱うデータの確認
↓
決定木について調べる
↓
決定木の作成
使用するデータ
使用するデータは、私の配達データ。
期間は、2021年5月10日~10月31日。
上記期間の総配達件数は、1528件。※ ダブルピックも1件とカウント。
扱うデータの確認
3店舗の配達データを扱う。
合計配達単価 | ベース料金 | 配達調整金 | 店舗 | |
1 | 301 | 127 | 207 | マクドナルド コザ十字路店(A) |
2 | 329 | 132 | 219 | マクドナルド コザ十字路店(A) |
… | … | … | … | … |
62 | 406 | 150 | 284 | らあめん花月嵐 美里(B) |
… | … | … | … | … |
135 | 632 | 185 | 230 | A&W 美里店(C) |
… | … | … | … | … |
上記3店舗の配達データ概要は以下。
店舗 | 配達単価平均 | ベース料金平均 | 配達調整金平均 |
マクドナルド コザ十字路店 | 488 | 131 | 308 |
A&W 美里店 | 608 | 164 | 334 |
らあめん花月嵐 美里 | 805 | 204 | 483 |
決定木について
決定木について調べてみたところ、以下の文章を見つけた。
ツリーモデル(tree-basedmodel)は回帰分析、判別分析の1つの方法であり、回帰問題では回帰木(regression tree)、分類問題では分類木(classification tree)あるいは決定木 (decision tree)と呼ばれている。
ツリーモデルでは説明変数の値を何らかの規準をもとに分岐させ、判別 ・予測のモデルを構築する。分岐の過程は木構造で図示することができ、またIF-THENのような簡潔なルールで表すことができる。ツリーモデルは理解しやすいことから、その応用が急速に広がっている。
”回帰分析、判別分析の1つの方法”、”ツリーモデルは理解しやすい”という文章から、これまでにやってきた回帰分析と判別分析をより分かりやすく表現するのがツリーモデルといえそう。
とりあえず、ツリーモデルの1つである決定木を作成してみる。
決定木の作成
決定木が分類問題を扱うのなら、変数Xが○○以上ならA、未満ならBのような結果になると予想できる。
書籍にならって、決定木を作成してみる。
data <- read.table("clipboard",header = TRUE) data$store <- as.factor(data$store) library(rpart) set.seed(1) data.rp <- rpart(store~.,data=data) print(data.rp,digits=2) plot(data.rp, uniform=T, branch=0.5, margin=0.1) text(data.rp, use.n=T, all=T)
結果、以下の図が表示された。
見方の解説は、こちらの記事が分かりやすかった。
可視化した決定木の見方を解説します【ジニ係数で不純度を測る】 | mi-chan-nel | みっちゃんねる
上記記事を参考に、図の一部を解釈してみる。
ベース料金が146.5未満かどうかが最初の分岐となり、未満であれば左のノードに進む。このノードの中身は、ベース料金146.5未満の配達データが集められる。その内訳は、Aが55個、Bが8個、Cが22個となる。最も多いAが記載される。ベース料金が146.5以上の場合、右側のノードに進む。
このように、図の解釈もシンプルで分かりやすい。が、最初の分岐の右側が若干複雑になっていて見づらい。
ここで、参考書籍を読み返すと、以下の文章があった。
ここで注目してほしいのは複雑さのパラメータcp=0.01である。関数printcpで出力された結果のうちCPが最も小さいのは0.01である。つまり、cpは木の成長をコントロールする1つのパラメータである。
cpを適切な値にすることで、より良い決定木が作成できると予想できる。cpの決め方については、このように記述されていた。
交差確認のエラーが最小のところで切るのであれば CP=0.005,nsplit=6のところになり、Min+1SEを規準とすれば交差確認エラー 0.10 + 0.03 = 0.13の前後で木を剪定することになる。Min+1SEの判断を助けるツー ルとして関数plotcpがある。その使用例を次に示す。
………
図の中の点線がMin+1SEの線である。横軸がcp値であり、縦軸が交差確認のエラーになる。枝切りは点線を最小に下回る点のところを目安とする。よって、枝切りのcp値は0.094が目安である。この値を目安として剪定を行う関数pruneによる枝切りの例を次に示す。得られる結果は iris.rpと同じである。
さっそく、やってみる。
まずは、現状確認。
>printcp(data.rp) Classification tree: rpart(formula = store ~ ., data = data) Variables actually used in tree construction: [1] ベース料金 配達調整金 Root node error: 117/190 = 0.61579 n= 190 CP nsplit rel error xerror xstd 1 0.401709 0 1.00000 1.00000 0.057305 2 0.076923 1 0.59829 0.62393 0.057305 3 0.012821 2 0.52137 0.58974 0.056657 4 0.010000 4 0.49573 0.62393 0.057305
cpはデフォルトで0.01となっている。そのため、上記の結果はcp=0.01で切られていると分かる。このcpの適切な値を調べるため、関数plotcpを使ってみる。
plotcp(data.rp)
結果、以下の図が表示された。
書籍を参考にcpの値を決めるとなると、おそらく0.18になる。
cp=0.18で決定木を再度作成してみる。
data.rp2 <- prune(data.rp,cp=0.180) plot(data.rp2, uniform=T, branch=0.5, margin=0.1) text(data.rp2, use.n=T, all=T)
結果、以下の図が表示された。
最初の分岐のみとなり、変数もベース料金のみ使用された。
結果的に、最もシンプルな形となった。
まとめ
今回は、配達データで決定木を作成してみた。
結果、今回の分析項目で分かったことは下記の1つ。
コメント