見出し画像

ノーコードAIツールで予測するたこ焼き屋さんの客層|第5回 データの偏りを改善する

こんにちは!ヒューマノーム研究所でインターンをしている佐藤です。

このたこ焼き屋の記事も5回目となりました!
第4回までは、本題に入る前にたこ焼きエピソードを入れていましたが、第5回ともなると流石にネタ切れになりました…。無念。

この連載では、たこ焼き屋の売り上げデータについて、当社が開発するHumanome CatData(以下CatData)を使って分析を進めてきました。

  • 第1回では、天気と販売数や客層と販売数など、いろんなパターンの相関関係を見て、考察(妄想)をしました。今回の記事で利用しているデータの詳細や傾向は、第1回の記事を参考にしてください。

  • 第2回では、たこやきの販売数を予測するための学習用テーブルを作成し、学習する時にモデルが何の要素を重要視しているのかについて確認しました。

  • 第3回では、第2回で作成したAIモデルを使って、たこやきの販売数を予測しました。このモデルは現場で使うには無理があり、実用性に欠けていることが分かりました。

  • 第4回では、第3回のモデルの実用性を改善するため、お客さんが買う前には知ることが出来ない”n_negi(ねぎたこやきの販売数)”のデータを削除して学習・予測しました。

このたこやきシリーズは下記URLからまとめ読みできます。

今回は、偏りのある天気データが予測精度に悪影響を及ぼしているのではないか?と考え、天気データをランダムにして学習・予測をしていきます! 前回同様、学習・予習の詳しい手順は第2回、第3回で行ったため、今回は省略します。

CatDataをつかうと、この連載でご紹介しているような、データの前処理・可視化・AIモデルの学習や予測などが、プログラムを書かずに行えます。ぜひお試しください。

天気データの並び替えとデータ整理

前回までで解析してきたデータは、天気(weather)の列を見ると”sunny(晴れ)”→”cloudy(曇り)”→”rainy(雨)”の順で並んでいることが分かります。

学習データとテストデータに分割する際、”ID”の番号順で1〜1350を「学習データ」、1351以降を「テストデータ」としました。その結果、学習テーブルには雨の日のデータが無く、予測テーブルには晴れの日のデータが無い状況が起きてしまいました。

これでは、晴れの日と雨の日で予測結果に差が生じてしまう可能性があります。そこで今回は、データをランダムにして再度、学習を行い、どの天気でも予測を実行したときに、精度が高くなるように改善します。

また、データの内容が重複している列(後述)が見られました。同じ意味を持つ列が存在すると、学習の際に余計な計算が増えたり、選択する手法によっては精度に悪い影響がでるため、それらを整理した上で、学習・予測を行っていきたいと思います。

1. 行をランダムに入れ替え

CatDataの「アクションセットの編集」では、行データをランダムにすることができません。そのため、たこ焼きのデータをExcel、またはGoogleスプレッドシートで行をランダムに入れ替えた後、CatDataに読み込ませます。

私は以下の方法でGoogleスプレッドシートを編集しました(図1)。参考にしていただければ幸いです。

  1. 列名を除く全てのセルを選択

  2. 上のデータタブから「範囲をランダム化」を選択

  3. 後で分割する際に行数をわかりやすくするため、IDの左側に列を追加し、列名を”Number”に設定

  4. “Number”の列に1~1800までの数字を入れる

図1 Googleスプレッドシートの編集方法

2. 重複データの選別と学習

再度CatDataのホーム画面に戻り、ランダム化したデータを「テーブルの新規作成」から読み込ませ、以下の設定で学習を行います。

  1. 可視化テーブルにて、”Number”を”1〜1350”に設定

  2. ”ID”、”sales”、”sales_takoyaki”、”sales_negi”、”n_pack”、”n_negi”、”sunny”、”cloudy”、”rainy”、”single”、”couple”、”family”、”customer_code”、”Number”を削除

  3. 複製したのち、利用目的を「学習」にする

  4. 「前処理:アクションセットの編集」にて、テーブルの名前を変更

1の操作をするときに”Number”ではなく”ID”で”1〜1350”と設定してしまうと、せっかくランダムにしたデータが元通りになってしまいます。そうすると学習データの天気列から雨の日のデータが無くなってしまうため、注意が必要です。

“weather”列と”sunny”・”cloudy”・”rainy”列は双方が紐づいているデータです。例えば、”weather”でsunnyと表記されていると、”sunny”の列には1と表記されており、データの意味が重複していることが分かります(図2)。

図2 意味が重複しているデータ

このため、“weather”か”sunny”・”cloudy”・”rainy”のどちらかを削除しても学習する上で大きな妨げにはならないと考えられます。

このデータでは、天気と同じような、異なるデータ間の意味の重複が、 ”customer_class” と ”customer_code” ・”single” ・ ”couple”・”family”にも起こっています。

そこで今回は、”sunny”、 ”cloudy”、 ”rainy” に加え、 ”single”、 ”couple”、 ”family”、 ”customer_code”も削除します。
ややこしいですが、データを見ながら整理していきましょう。7つの列を削除することで、残っている列の数が5つになっているはずです。
また、「テーブルの名前を変更」の操作は”n_negi”を削除したテーブルと間違えないように行いました。

それでは、学習画面に進み、「予測対象の列」を"n_takoyaki"に設定し、学習します!

結果、学習データの精度は0.74308、テストデータの精度は0.73077となりました。第2回で作成したモデルより精度は下がってしまったものの、良いモデルができました(図3)。

図3 天気をランダムにしたデータの学習結果

変数の重要性も確認します。
上から順に”customer_class_single”、”weather_sunny”と続いていることから、お客様が1人で来るのか? 天気が晴れなのか? が重要だと分かります(図4)。
これだったら、お客様が買う時までに、店員さんが顧客データをAIに入力できそうですね。

図4 天気をランダムにしたデータの変数の重要度

3. 予測

学習と変数の重要度がわかったところで、次の手順で予測データを準備し、先程のモデルで予測をしていこうと思います!

  1. 可視化テーブルで”Number”を”1〜1350”から、”1351〜1800”に再度設定

  2. ”ID”、”sales”、”sales_takoyaki”、”sales_negi”、”n_pack”、”n_negi”、”sunny”、”cloudy”、”rainy”、”single”、”couple”、”family”、”customer_code”、”Number”を削除

  3. 複製し、利用目的を「予測」にする

  4. 「予測する値 : n_takoyaki」にする

  5. 先ほど学習させたモデルを選択し、「予測の開始」をクリック

予測用データの整理・削除は、"n_negi"を削除した時(2. 重複データの選別と学習)と同じ操作を行います。ここで削除する列は、先ほどの学習で削除した列と同じものを削除してください。そうしないと予測ができなくなる場合があります。

それでは、「予測結果」をクリックし、モデルの評価を確認します。今回のデータでは精度が0.77556でした(図5)。テストデータと比べると0.04ほど上がっていますね。

図5 天気列をランダム化したデータでの予測

“n_negi”を削除しただけのデータを使ったモデルでは、ほとんどのお客さんが1個買うと予測していましたが、今回のモデルは2個買った組を5組、0個買った組を69組、正しく判定することができているようです。

しかし、1個買うと予測した組が実際は2個買っていたり、0個買うと予測した組が実際は1個買うと予測されています。実際より少なく予想されている組が、52+46=98組もいました。このモデルのいう通りにたこ焼きを用意すると在庫があっという間になくなってしまうので、余分に用意する必要がありそうですね。

絶妙に使いにくいモデルになってしまいました。

今回、不要だと考えられるデータを削除したところ、前回の記事で作成したモデルの精度である0.77778と大きな違いが発生しませんでした。このことから、今回利用した手法(RandomForest)では、データを扱う上で同義であるデータのどれかを削除しても問題なさそうだと言えます。

意味が重複しているデータや現場で事前に把握することが難しいデータの扱いは様々ありますが、今回は他の列と内容が重複している列の削除や学習データの偏りがなくなるようデータのランダム化を行いました。データをそのまま学習・予測するのではなく、学習時にデータの偏りがない状態にすることでモデルの精度や実用性の向上につながります。

終わりに

今回は、同義の列を削除し、天気列のデータがバランス良くなるように行をランダム化したデータで学習・予測を行っていきました。

データを扱い始めた時は、整理するのにも少しドキドキしますが、どんどんやっていくうちに慣れると思います。私も、初めは「これであってる?大丈夫?」と思いながらやっていました笑。皆さんも、安心してデータを学習できるよう、データを整理してみることをオススメします!(...とはいえ、元データが無くなると失敗したことに後から気づいた場合に戻せなくなってしまうので、きちんと元データは別の場所に残しておいてくださいね。)

※ 筆者紹介
佐藤 美結(慶應義塾大学環境情報学部4年):クマムシの生態に興味があります。好きなものはポケモンです。機械学習、プログラミングを一昨年から学び始めました。
---
私たちは、ワークショップのTAや機械学習ツールの使い方の紹介記事を執筆しています。今後も、AI構築の実際についてご紹介していきますので、お読みいただけると嬉しいです!

データ解析・AI構築の初学者向け自習テキスト

表データを利用したAI学習テキスト(Humanome CatData

画像・動画を利用したAI学習テキスト(Humanome Eyes


AI・DX・データサイエンスについてのご質問・共同研究等についてはお気軽にお問い合わせ下さい!


いいなと思ったら応援しよう!