清水理史の「イニシャルB」

面倒な「ダミーデータ作成」をChatGPTに任せる〜Code Interpreterの限界までリアリティを追求した作業の記録

ChatGPTで生成したおにぎり屋のダミーPOSデータ。「嘘が多い」との声もあるChatGPTだが、それなら「それっぽいダミーデータ」作りも得意なはずだ

 「嘘が多い」という失望の声が聞こえてくることもあるChatGPT。個人的には使い方次第で何とでもなると思っているが、嘘が多いと感じるなら、逆にその嘘をトコトン追求してみてはどうだろうか?

 今回は、ChatGPTのCode Interpreterを利用して、ダミーデータを作成する方法を紹介する。アイテムの種類や客の嗜好、店舗ごとの特徴などの細かな設定をこれでもかと詰め込んだ上で、架空の店舗と架空の客が織りなす、とっておきの嘘ストーリー、いやダミーPOSデータを作成してみよう。

ダミーデータもChatGPTなら一発!?

 ダミーデータの作成ほど憂鬱な作業はない。

 筆者も、書籍に掲載する画面キャプチャをする際、Excelなどの「それっぽい」画面を撮影するためだけに、わざわざダミーデータでグラフを作成することがある。

 本筋の作業ではないので、グラフならOKだろうと適当に値を入力するのだが、「年度末の値が低いのはおかしい」だの「今は男女比を考慮してほしい」だの、ごくまれに映り込むだけのグラフの変更を、とても熱心に要求してくる相手があらわれることがある。

 というわけで、ダミーデータの作成はイヤな思い出しかないのだが、そんな悩みももはやなくなりそうだ。

 以前の回でも取り上げた、ChatGPTのPython実行環境であるCode Interpreterを利用すると、ほしいデータを言葉で説明するだけで、さっとダミーデータを作成してくれる。しかも、この機能、使い込むほどに凝ったデータが出来上がるのが面白い。

 条件を次々に追加しても、複雑な計算を駆使して、こちらのリクエストにできるかぎり応えてくれる。調子に乗って思いつくストーリーをどんどん伝えていくと、それらも取り入れて、凝ったデータが出来上がってくる。

 適当な値の「嘘」データでいいはずが、あたかも、どこかに実在しているかのような、リアリティを持ったデータが出来上がってくるのは、実に興味深い。

 もしかすると、あなたが何気なくウェブで見かけたExcelの画面にあるグラフも、「近所に幼稚園があって、水曜の午後だけ、早帰りのお迎え客で女性と子供の来客数が増える」とか、そんなストーリーが、ひっそりと盛り込まれているかもしれない。

条件を伝えてダミーデータを作成する

 それでは、実際にダミーデータを作ってみよう。

 今回、作成するのは、架空の「おにぎり」販売店のPOSデータだ。最近では、さまざまなデータがオープンデータとして公開され、いろいろな分析などがしやすい環境が整ってきたが、小売業のPOSデータに関しては、公開されている例がほとんどない。直感的に理解しやすく、分析のサンプルとして身近なので、もっとオープンなデータが増えてほしいのだが、なかなかそうもいかないようだ。

 なので、自作するダミーデータの例として、うってつけと言える。まずはシンプルに「仮想のPOSデータを作って」とCode Interpreterに依頼すると、下の画面このようなデータができあがる。

条件を何も指定しなくてもそこそこのデータが作れる

 これだけでも、単純な例としては悪くない。データ分析の練習で、単純なグラフを作ったり、表を整えたりといった用途には十分耐えるだろう。

 続いて、次のように、より詳細なデータを与えて作成してもらうことにした。まず、プロンプトとして、POSデータを作成してほしいことに加えて、コードが長くなりすぎないように工夫することを伝える。これを伝えないと、複雑な処理を依頼したときにコードが長すぎて途中で切れてしまったり、エラーで実行できなったりする。

 そして、ポイントとなる情報を追記する。店舗の基本情報として店舗名や営業時間、アイテム数などを伝え、最後に出力情報として期間や項目などを伝えればいい。実際に入力したプロンプトは以下だ。

次条件を考慮して、仮想的な小売店舗の売り上げPOSデータを作成してください。ただし、コードが長くなりすぎないように工夫してください。

###基本情報
- 新宿店、町田店、横浜店の3店舗
- 営業時間は通常店舗は7:00~20:00。
- 1日の平均来客数は新宿店100人、町田店は30人、横浜店は60人
- 1人あたりの購入アイテム数の平均は、朝は1.2個、昼は2.5個、夕は2.8個
- アイテムは「ツナマヨ(200円)」「こんぶ(180円)」「いくら(420円)」「チャーシュー(300円)」「高菜(250円)」の5種類
- 一人の客は異なるアイテムを組み合わせて合計で1~3個を購入する。稀に同じアイテムを複数購入する人もいる。

###出力情報
- 期間は2023年7月24日(月曜日)から7月30日(日曜日)までの1週間
- データの項目は「トランザクションID、取引ID、日時、曜日、店舗、性別、年齢層、購入アイテム、単価、個数、小計、支払方法」としてください。
- 年齢層は「子供(1-18歳)」、「若者(18-35歳)」、「中高年(36-55歳)」、「高齢者(56歳以上)」に分類してください。
- 支払方法は「現金」、「クレジット」、「デビット」のいずれかにします。
- 曜日は英語を使ってください
- 作成したデータはExcel形式でダウンロード可能な状態で出力してください。
- 同じ顧客による購入をグループ化するために1人の顧客につき1つの取引IDを割り当てます。顧客が複数回来店する場合は、新たな取引IDを割り当ててください。

処理中の様子。これくらいの条件なら時間もかからないし、エラーも発生しない

 こうして作成されたデータが次の表だ。店名やアイテム名などが入力され、かなりリアリティが出てきた。ちょっとしたセミナーや社内研修などのサンプルとして使えそうだ。

出力されたデータ

データにストーリーを持たせる

 上記のデータでも十分に使えそうだが、せっかくなので、もう少し工夫してみる。具体的には上記のプロンプトに、以下のようなさらに店舗特性とアイテム特性という条件を追記する。店舗特性は店舗がどのような立地なのか、どの層の客が多いのかといった情報で、アイテム特性は各アイテムがどの層に人気があるのかという情報だ。

###店舗特性情報
- 新宿店は都心型基幹店舗、町田店は郊外型大型店舗、横浜店は百貨店テナント
- 営業時間は通常店舗は7:00~20:00。百貨店テナントは10:00~21:00
- ピークは昼のランチ需要が最も高いが、都心型は朝食需要も高い、郊外店舗は夕食需要が高い
- 都心型は平日の売上が高い。土日は休業。客層はサラリーマン中心。朝は男性が多く、昼は若い女性が多い
- 郊外型は木曜休業。週末の売り上げが多く、家族向けに複数アイテムをまとめ買いする傾向がある
- 百貨店テナントは休業なし。金曜から土曜の売上が多く、客層は高齢層

###アイテム特性情報
- アイテムは「ツナマヨ」は万人受け、「こんぶ」「高菜」は高い年齢層に人気、「いくら」は女性に人気、「チャーシュー」は20~40代の男性に人気

 先ほどの出力は、購入数が完全にランダムだったが、この条件を付け加えることで、店舗や時間帯を考慮した「重み」を使って値を決定してくれるようになる。ここまでの情報が生成されれば、なかなか現実的なデータと言ってもよさそうだ。

きちんと与えられた情報を考慮して処理してくれる
生成されたコード。各店舗で時間帯ごとの客層の重みが考慮されている

 ただし、このあたりから望み通りの結果が得られるとは限らなくもなってくる。ChatGPTの場合、実行プロセスや生成されるコードが毎回変わるため、データが多くなりすぎたり、少なくなりすぎたり、特定の条件が無視されたりと、いろいろな事態が発生することがある。

 この例も、以下のように項目が勝手にまとめられているうえ、生成されたデータ数もやけに少なくなってしまうケースがあった。条件を複数指定する場合は、データの中身を確認しつつ、何度か繰り返しChatGPTに生成を依頼する必要があるだろう。

生成されたデータ。見出しがややこしかったのが悪かったがトランザクションIDと取引IDがまとめられてしまった

条件が増えるとエラーとの格闘になる

 最後に、以下のような、より複雑な条件を追加してみる。閉店1時間前の割引、さらに近隣の特殊な状況によって発生する特別な顧客増だ。

###特別情報
- 閉店1時間前は売り残しをしたくないためセールを実施。全アイテム100円引きで購入できる。このため、この時間のみ客数が増える
- 町田店の近くには幼稚園があり毎週水曜日は幼稚園のお迎え帰りのため、11:00~12:00の間のみ若者女性と子供の来客数が倍増する。

 ここまで条件を追加すると、Code Interpreterでの実行がかなり困難になる。単純に、処理しなければならない項目が増えるとコードが長くなり、それがCode Interpreterの環境の制限にひっかかってエラーになってしまうのだ。

 Code Interpreterは、一見すると万能のように思えるが、使い込むとその欠点も見えてくる。例えば、コードが途中で切れたり、日本語フォントを扱えなかったり、エラーを再開しようとして冒頭で定義したライブラリや関数を参照できなくなったり、処理が長くなりすぎてタイムアウトしてしまったりと、いろいろな事態が発生する。もちろん、先ほどと同じように、条件が無視されたりすることもある。

 筆者も、上記の全ての条件を含むプロンプトで望み通りのデータが生成されるまでに、何度も試行錯誤を繰り返す必要があり、GPT-4の利用制限(3時間で50メッセージ)に何度もひっかかり、結局、この検証も数日にわたって実施することになった。

 最終的な結論としては、根気よく繰り返すしかない。

 というわけで、何とか成功した結果が以下のようになる。処理のステップを見ていこう。

これまでのプロンプトを全てつなげて質問

 成功した処理では、大きく2段階に分けて処理が実行された。最初は、データを生成するためのパラメータとルールの設定のみ行う。店舗情報やアイテムなどの情報を、指定した条件で定義している。

1段階目の処理。パラメーターとルールの定義
1段階目のコード。プロンプトの情報をコード内で定義している

 続いて、2段階目として上記のコードを使って、実際のデータを生成するためのループを実行するという流れだ。一気に全て処理しようとすると、Code Interpreterのコードの長さの制限を受けてしまうので、それをうまく回避しているように思える。

ループを回して値を生成する
2段階目のコード

 この結果、生成されたのが次のデータだ。こちらの指定した形式で生成されており、最後に追加した特別条件もしっかり反映されている(町田店の水曜11:00台の来客が多い)。

生成されたデータ

データの検証ももちろんCode Interpreterで

 もちろん、データが望み通りできているかどうかもCode Interpreterで確認できる。作成されたファイルをアップロードして次のように依頼すればいい。

このデータは、おにぎりを販売する3つの店舗のPOSデータです。町田店の時間あたりの来客数の違いを曜日ごとに確認するためのヒートマップを生成して表示してください。ただし、回答は日本語で表示し、グラフのみ見出しや項目は英語に翻訳してください。

 これで、次のようなヒートマップが生成される。なお、実際の処理では、時刻欄がないため日付から生成すること、木曜日のデータがない(定休日)なので省くことなどが提案され、その処理が入る。

生成されたヒートマップ。特別情報として記載した水曜の11時、閉店前1時間のセールの情報が反映されている
新宿店の時間帯の売上データ。都心型店舗として指定した「朝は男性が多く、昼は若い女性が多い」という条件も反映されている

いろいろなダミーデータが作れるが、惜しい点もある

 このように、ChatGPTのCode Interpreterを利用すると、こちらの思い通りのデータを生成することができる。もう、ダミーデータの生成に苦労しないだろう。

 しかしながら、実行環境のサンドボックスが、現状は使えるライブラリが限られていたり、日本語対応が完全でなかったり、コードの長さやタイムアウトなどの制限があったりする点が実に惜しい。こうした制限がなければ、いくらでもストーリーを膨らませてデータを生成できるので、もっといろいろなことで楽しめそうだ。

 もちろん、高度なデータが作れるようになると、真贋の判定がしにくくなることが問題になるかもしれないが、個人的には、こうして生成されたデータを「嘘」や「騙し」と単純に断じてしまうのはもったいのと感じる。誰でもデータにストーリーを込めることが可能になり、またそのストーリーをデータから探ることができるようになったのだから、こうした状況をとことん楽しみたいところだ。

清水 理史

製品レビューなど幅広く執筆しているが、実際に大手企業でネットワーク管理者をしていたこともあり、Windowsのネットワーク全般が得意ジャンル。最新刊「できるWindows 11」ほか多数の著書がある。