【ウーバーイーツ】自己組織化マップを使ってみたが、【沖縄市】
本を読んでいたところ、以下の文章を見つけた。
自己組織化マップ (SOM:Self-Organizing Map)はコホネン(T,Kohonen)により提案されたニューラルネットワークアルゴリズムで、高次元データを2次元平面上へ非線形射影するデータ解析方法である。
高次元データを2次元に変換するという文面から、今までやってきた主成分分析や因子分析に似た分析方法と予想できる。
しかし、実際にやってみたところ、よく分からない結果になってしまった。反省の意味も込めて、書き留めておく。
参考書籍・資料
主な参考箇所 10 自己組織化マップ
概要
扱うデータの確認
↓
自己組織化マップを作成する
使用するデータ
使用するデータは、私の配達データ。
期間は、2021年5月10日~10月31日。
上記期間の総配達件数は、1528件。※ ダブルピックも1件とカウント。
扱うデータの確認
参考書籍では以下のようなデータを使って、自己組織化マップを作成していた。
Sepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species | |
1 | 5.1 | 3.5 | 1.4 | 0.2 | setosa |
2 | 4.9 | 3 | 1.4 | 0.2 | setosa |
3 | 4.7 | 3.2 | 1.3 | 0.2 | setosa |
… | … | … | … | … | … |
51 | 7 | 3.2 | 4.7 | 1.4 | versicolor |
52 | 6.4 | 3.2 | 4.5 | 1.5 | versicolor |
… | … | … | … | … | … |
101 | 6.3 | 3.3 | 6 | 2.5 | virginica |
102 | 5.8 | 2.7 | 5.1 | 1.9 | virginica |
5列目のSpeciesがカテゴリー変数となっており、1~4列目のデータの特徴とSpeciesが関係している。つまり、1~4列目のデータを見れば、自ずとSpeciesが分かる(予想できる)というわけだ。
上記表と同じようなデータをウーバーイーツの配達データから抜き出す必要がある。
ざっくり表を作成すると以下のようになる。
量的変数A | 量的変数B | 量的変数C | カテゴリー変数 | |
1 | ||||
2 |
量的変数AとBとCでカテゴリー変数を予想できるようなデータを持ってこなければならない。
配達データの中の分かりやすいカテゴリー変数は、”店舗”となる。カテゴリー変数を店舗とするならば、店舗に関わるデータの中から、量的変数を見つける必要がある。で、その量的変数は店舗によって差がなければいけない。
ということで、適当に量的変数を絞って店舗データを作ってみた。
※以下表は、配達単価平均でソート済み
店舗 | 配達単価平均 | ベース料金平均 | 配達調整金平均 |
マクドナルド コザ十字路店 | 488 | 131 | 308 |
マクドナルド 具志川メインシテイ店 | 488 | 132 | 379 |
スターバックスコーヒー具志川メインシティ店 | 510 | 138 | 306 |
ほっともっと 赤道店 | 523 | 146 | 335 |
A&W 美里店 | 608 | 164 | 334 |
吉野家 うるま志林川店 | 622 | 157 | 397 |
ペリペリチキン | 634 | 171 | 362 |
カレーハウス CoCo壱番屋 沖縄美里 | 680 | 165 | 324 |
CORE CURRY 美原本店 | 697 | 170 | 348 |
らあめん花月嵐 美里 | 805 | 204 | 483 |
3つの変数で見ると、「マクドナルド コザ十字路店」と「らあめん花月嵐 美里」の差が大きいと分かる。
上記2店舗のみの配達データを扱う。
合計配達単価 | ベース料金 | 配達調整金 | 店舗 | |
1 | 301 | 127 | 207 | マクドナルド コザ十字路店 |
2 | 329 | 132 | 219 | マクドナルド コザ十字路店 |
… | … | … | … | … |
62 | 406 | 150 | 284 | らあめん花月嵐 美里 |
… | … | … | … | … |
参考書籍と同じようなデータができあがった。
自己組織化マップの作成
パッケージkohonenを使うことで、自己組織化マップを作成できるらしい。
参考書籍にならって、自己組織化マップを作成してみる。
install.packages("kohonen") library(kohonen) set.seed(10) gr<-somgrid(topo="hexagonal",xdim=10,ydim=7) data <- read.table("clipboard") data.som <- som(as.matrix(data),gr,rlen=200) plot(data.som,type="codes")
結果、以下の図が表示された。
参考書籍には、この図の見方について特に記述されていなかった。が、以下のことはなんとなく読み取れる。
・円グラフ?の大きさやその中の割合で位置が分けられている
・円グラフ?を構成している色付けされた部分が3つの変数を表している
図の妥当性については、このように書かれてあった。
機械学習における問題点の1つは、学習の回数である。関数somのデフォルトでは学習回数が100に設定されている。この回数が用いるデータにおいて十分であるかを考察する必要がある。その考察には、学習過程を記録したグラフを用いた方が便利である。学習過程を記録したグラフは上記に用いた関数plotに、引数type=”change”を用いる。作成される折れ線は、横軸は学習回数、縦軸は各個体とユニットとの距離の平均値である。学習が始まった段階では、距離の平均値が大きいが、その値が学習の回数に伴って減少する。その平均値が減少し安定した値になるまでの学習回数が必要となる。
さっそく、上記にある学習過程を見てみる。
学習回数200↓
回数が増えるにつれて、徐々に縦軸の値が小さくなり、振れ幅も小さくなっていることが分かる。この図を見る限り、学習回数は200回で十分のように見える。
が、せっかくなので、学習回数を極端に増やしてやってみる。
学習回数1000↓
回数が増えるにつれての挙動は、学習回数200の場合と変わらなかった。ただ、学習回数800回あたりで急に縦軸の値が下がっていた。このことから、学習回数1000回の方が適切と判断しても良いかもしれない。しかし、学習回数が多すぎると上記のような(学習後半で大きく下がる現象)グラフになることも考えられる。
ちなみに、学習回数1000のときの図はこちら↓
さらに学習回数を増やして、やってみる。
学習回数10000↓
学習回数100000↓
1000回の学習回数のときと同じように、学習の後半で急に下がる現象があった。学習回数をやみくもに増やしてはいけない空気を感じた。
ということで、今回の場合は学習回数200の結果が比較的良いものと思っておく。
参考書籍を読み進めていくと、パッケージsomを使って、自己組織化マップを作成できると知った。
パッケージsomを使ってみる。
install.packages("som") set.seed(80) library(som) data <- read.table("clipboard") #標準化済みデータを読み込み lab <- read.table("clipboard",header = TRUE) lab$store <- as.factor(lab$store) data <- as.matrix(data) data.som2 <- som(data, xdim=6,ydim=5) plot(data.som2)
結果、以下の図が表示された。
まったく分からん。。一旦無視して、先に進む。
散布図で表現する方法があった。やってみる。
ransu <- cbind(rnorm(nrow(data),0,0.13),rnorm(nrow(data),0,0.13)) out.new<-data.som2$visual[,1:2] +0.5+ransu plot(out.new[,1:2],col=c(2:4)[unclass(lab$store)],pch=c(1:3) [unclass(lab$store)])
結果、以下の図が表示された。
丸と三角がカテゴリー変数(店舗)を表している。上記図から丸の店舗が左側に、三角の店舗が右側に偏っていると分かる。
まとめ
今回は、2店舗の配達データで自己組織化マップを作成してみた。結果的に、2店舗の配達データの偏りを図で表現できた。が、理解不能の図や単語がいくつかあり、今までの知識でカバーできない部分があった。
今後、「ニューラルネットワークアルゴリズム」や「機械学習」などを含む分野を学ぶ必要がある。
コメント