食べログのpythonスクレイピングと分析 #16 遺伝的アルゴリズムを試す② ~全体で遺伝的アルゴリズムを試す~(北海道編)

スポンサーリンク
tech系(python)
スポンサーリンク

前回は遺伝的アルゴリズムを使って駄菓子屋を例にデモをしてみました。

今回は実践編で、実際の北海道のレストランのデータを使用して遺伝的アルゴリズムを試してみます。

今回やること

今回することはデモで行ったことと同様です。

遺伝的アルゴリズムを使って、食べログのスコアを高くして、価格帯を低くするようにしたら、どこに収束するのかということを求めます。

ざっくり結果

多分今回の試みは失敗です。

遺伝的アルゴリズムで求めた解は、平均値と中央値よりも悪いです。

実践

ランチ

まずはランチから。

コードに関しては前回のデモをご確認ください。

各種設定

パラメータは

  • 交叉率:0.7
  • 突然変異率:0.001
  • 世代数:501

です。

突然変異率に関しては既存のお店のデータを使ってできるだけ求めたかったので低めに設定しています。

また、突然変異の範囲は

スコアが2~4で、価格帯が1(“~¥999”)~7.5(“¥6,000~¥7,999”)

でお店を発生させるようにしました。

あまりにも価格帯やスコアがあり得ないお店は出ないようにしています。

実行結果

実行結果は以下のようになりました。

  • 評価値:2.920183785571726
  • 価格帯:3.7081947813433542

価格帯は以下のように「\~999」を1として比率で設けています。

ですので、価格帯は以下のように数値を割り振っています。

"~¥999" → 1
"¥1,000~¥1,999" → 2
"¥2,000~¥2,999" → 3
"¥3,000~¥3,999" → 4
"¥4,000~¥4,999" → 5
"¥5,000~¥5,999" → 6
"¥6,000~¥7,999" → 7.5
"¥8,000~¥9,999" → 10
"¥10,000~¥14,999" → 14
"¥15,000~¥19,999" → 19.5
"¥20,000~¥29,999" → 28
"¥30,000~¥39,999" → 39
"¥40,000~¥49,999" → 50
"¥50,000~¥59,999" → 61
"¥60,000~¥79,999" → 77.5
"¥80,000~¥99,999" → 100
"¥100,000~" → 111

以上より、今回の実行結果は評価値が2.92より大きく、価格帯が”¥2,000~¥2,999″以下であればコスパは良い事を意味しています。

いや、それ、結構なお店に当てはまるやん…。

そうなんです。もしかしてと思って全体の価格帯の平均値と中央値を調べましたが、以下のような値になりました。

  • 平均値:1.625
  • 中央値:1.0

価格は全体の実際の値が安くなります。

つまり、平均値、中央値よりも金額は高いところに最適解が出ています。

スコアの平均値と中央値は

  • 平均値:3.23
  • 中央値:3.2

スコアも実際の値の方が高いです。

これって、平均値と中央値を基準にした方がコスパがよいか判断できるんじゃないか…。

ヒートマップは以下のようになっていました。(バーの値が世代が増える毎に増えていっていることに注意してください。本当に参考程度に)

100世代ぐらいまで収束はある特定のところに収束していますが、そこからずれていってますね。

一応、ディナーの結果も見てみます。

ディナー

次にディナーです。

各種設定

パラメータは

  • 交叉率:0.7
  • 突然変異率:0.001
  • 世代数:501

でランチと同じです。

突然変異の範囲は

スコアが2~4で、価格帯が3(“¥2,000~¥2,999”)~7.5(“¥6,000~¥7,999”)

でお店を発生させるようにしました。

こちらもあまりにも価格帯やスコアがあり得ないお店は出ないようにしています。

実行結果

実行結果は以下のようにになりました。

Best individual is [3.0436252728712163, 5.24987899776162]

実行結果からディナーは評価値が3.04より大きく、価格帯が”¥4,000~¥4,999″以下であればコスパは良い事を意味しています。

まさかと思って確認しました、価格帯とスコアの平均値と中央値。

価格帯の平均値と中央値は以下。

  • 平均値:3.726
  • 中央値:3.0

どちらも求めた結果より安いですね。

スコアの平均値と中央値は以下。

  • 平均値:3.253
  • 中央値:3.22

どちらも求めたスコアよりも高いですね。

ディナーの結果も平均値と中央値を使った方が、コスパの良いレストランが見つかるじゃないかという結論になりました...。😫

一応、ヒートマップの推移も載せておきます。

まとめ

今回は遺伝的アルゴリズムで価格帯とスコアの最適値を求めました。

結果は平均値か中央値を使えばよいという結論になりました。

まあ失敗ですね。

少し考察してみると、今回の問題点はジャンルごとに分けて調べていないので、様々な価格帯が入交り、最適解にたどり着きづらいデータ群だったように思えます。

もし、改善点を挙げて次回、再度挑戦する場合は、ジャンルを分けてそれぞに対して遺伝的アルゴリズムを用いた最適解を求めたいですね。

今回はここまでにしましょう…。ではまた👋👋👋


タイトルとURLをコピーしました