[後編] 新入社員の歓迎ランチが不安すぎて、Google Maps APIで最強の店リストを作って武装した話
- Ryota Isono
- 15 時間前
- 読了時間: 7分
プロローグ:前回のあらすじ
「2月が怖い...」 中途入社の若手社員との初ランチという、逃れられない「慣わし」に怯える私(データおじさん)。
恐怖に耐えかねた私は、スマートに回答するために、技術力で武装することを決意した。そう、これは私にとっての「本能寺の変」なのだ。
信長( =中途入社の若手社員)様:「どこかいいランチのお店(=茶器)はあるか?」
そう問われた際に、もしも私がコンビニ弁当(=駄作)を差し出せば、その場で手打ちにされるだろう。かといって、行列店で長時間待たせれば、「手際が悪い」と叱責され、やはり手打ちだ。 逃げ場はない。
ならば、やるしかない。 私は技術力という名の火縄銃で武装することを決意した。 Google Maps APIからデータを徴収し、BigQueryという火薬庫に蓄え、万全の陣を敷く。
「敵は本能寺(初ランチ)にあり!」(?)
私は決意の炎を燃やし、さらなる準備を整えるのであった...
第1章:Looker Studioで武装
データはBigQueryに入った。しかし、ここで冷静になって考えてみてほしい。
この地に初めて来られた信長様(=若手社員)に、「この書物( = BigQueryコンソール)に周辺全ての茶屋が記されております。お好きな店をお選び( SELECT )ください 」などと言い放ったらどうなるか?
…即刻、打首だ。
きっと猿(秀吉)ならば、もっと上手いことやるに違いない。まだだ。
そこで取り出したるは ”Looker Studio” 。南蛮(?)より持ち込まれた便利な可視化ツールだ。
これでBigQueryに入れたデータをダッシュボード化し、目的の店を探しやすくするのだ。

※. 表示されている店舗情報はダミーデータ
もちろん、評価や価格帯でフィルタすることも可能だ。うむ、我ながら完璧だ、これでもう恐れるものは何もない!
…。
何もない…ないはずなのだが、何かが気になる…。
猿だ、ヤツの顔が浮かぶ。信長様の草履を懐で暖めておくヤツだ。ヤツならまたもやもっと上手くやってくるに違いないのだ。
クソ、なんとも忌々しいヤツめ。まだ準備を終えるわけには行かない。
...そこで、私は考えた。リストを見て「ここ良さそう!」となった瞬間、間髪入れずにルート案内を開始させたい。
もたもたして会話が途切れるのは致命的だ。そもそも私ことデータおじさんはそんなに会話が得意ではない。
相手が信長様(20代のキラキラ若手社員)となると尚更だ。少しでも変なことを言おうもんなら、即刻ハラスメント認定という名の打首にされてしまう。
そこでLooker Studio の計算フィールドで魔法のボタン(” ここへ行く🚀 ”)を作成した。

これはGoogle Mapへのリンク形式になっており、クリックするとGoogle Mapに遷移し、オフィスから目的の店までのルート案内が開始されるのだ。
※. 計算フィールドで指定している place_id は、Place APIでの店舗情報取得時についてくる店舗ユニークキーのようなもの

※. 画像はポケモンカフェまでのルート。弊社オフィスの隣ビルにあります。
素晴らしいホスピタリティ。これで、あったか草履(?)の完成じゃ!!見たか、猿め!
第2章:禁断のBigQuery ML
最終確認のため、改めて出来上がったダッシュボードを操作していると、あることに気付く。
まずは評価が高い店でフィルタする、当たり前だ。しかし、その結果リストされた店は全て価格帯が高い店ばかりだ。ステーキ、寿司、フレンチ...
それもそうだ。価格帯の高さと評価はある程度比例するハズだ。しかし、これでは困ったことになる。
わたしことデータおじさん(光秀)は、小遣い制なのだ。¥4,000のランチなぞ、単騎で敵軍勢に突っ込むような無謀な行為だ。こちとら、月々¥30,000でやりくりしとるんじゃい!!
...落ち着け、仕切り直しだ。もうひと手間加えよう。単に評価順に並べるだけでは使えない。
私のためにも「ここ穴場ですよ」と、高評価かつお手頃な価格の店が提案できてこそプロだ。(何のだ?)
ただし、評価と価格帯をフィルタするだけではつまらない。レビュー数が少ない高評価とレビュー数の多い高評価では信頼度が違う。
私は ここで、BigQuery ML(機械学習) を利用することにした。SQLだけで、MLモデルの構築ができ、簡単に予測や分類を行うことができるのだ。
今回は K-means クラスタリング を使って、店舗を自動的にグループ分けし、人智を超えた「気づき」を得るのだ。ここまで来たらトコトンやってやる!
※.K-means クラスタリングとは、データの中から似たもの同士をグループ(クラスタ)に分ける、機械学習の代表的な手法です。
CREATE OR REPLACE MODEL
`プロジェクトID.データセット名.lunch_clusters`
OPTIONS(model_type='kmeans', num_clusters=4) AS
SELECT
rating,
review_count,
IFNULL(price_level, 1) AS price_level -- NULLは1(安価)とみなす
FROM
`プロジェクトID.データセット名.テーブル名`上記SQLをBigQuery上で実行し、4つのグループ(クラスタ)に分類するモデル作成する。
結果はこちら。

今回は60件とデータが少量であり大差がないものもあるが、各クラスタに勝手に名前をつける。
クラスタ1: 高評価・多レビュー・高価格 → 「接待・高級店」(歓迎ランチには不向き)
クラスタ2: 中評価・極小レビュー → 「ギャンブル要素大」(冒険者向け)
クラスタ3: 高評価・少レビュー・中価格 → 「隠れた名店(穴場)!!」
クラスタ4: 中評価・多レビュー・低価格 → 「行列必至の鉄板店」(並ぶのがダルい)結果、今回狙いたいのはクラスタ3の「隠れた名店」クラスタとなる。このクラスタ情報をSQLに組み込み、Looker Studioダッシュボードに情報として追加する。
CREATE OR REPLACE TABLE
`プロジェクトID.データセット名.map_view_ml` AS
WITH clustered_data AS (
SELECT
* EXCEPT(nearest_centroids_distance)
FROM
ML.PREDICT(
MODEL `プロジェクトID.データセット名.lunch_clusters`,
(SELECT * FROM
`プロジェクトID.データセット名.テーブル名`)
)
)
SELECT
*,
CASE CENTROID_ID
WHEN 1 THEN '💎 高級店(給料日後)'
WHEN 2 THEN '💀 ギャンブル要素大(自己責任)'
WHEN 3 THEN '🕵️ 隠れた名店(狙い目)'
WHEN 4 THEN '👑 鉄板人気店(並ぶ覚悟)'
ELSE 'その他'
END AS ai_tag
FROM
clustered_dataクラスタ情報を追加したダッシュボードはこちら。もちろんフィルタも可能だ。

ソート順もターゲットの「隠れた名店」(勝手に命名)をトップに。まだ世間に見つかっていない名店。これで舞台は整った。勝利は私の手の中にある。
第3章(最終章):データおじさん、散る...
2月某日、決戦の時(11:55)、PCセットアップやオリエンテーションが終わり、静寂が破られた。
チームのメンバーが立ち上がり、少し緊張した面持ちで口を開く。 私の緊張が伝わってしまったのか。申し訳ない。
メンバー:「そろそろ、お昼ですね」
データおじさん:「( 時は今!)」
私はあらかじめ開いておいたダッシュボードのフィルタにカーソルを合わせる。心臓の鼓動が早まる。天下は目の前だ。
データおじさん:「あ、あのさ...」
その時だった。
「あそこの店行こうよ!」
私の背後に座っていたベテラン社員が、疾風の如く席を立った。彼女は新入社員の手を迷いなく引き、連れ出そうとしている。
そうだ……忘れていた。うちには 「ランチ奉行」がいるのだった。 Googleマップには載らない独自の目線、店主との密約(コネ)、そして長年「足で稼いだ」リアルなデータベースを持つ猛者だ。
私のクラウド上のデータなど、彼女の「ランチ見聞力」の前では赤子に等しい。
その店は私のダッシュボード上にもある。ただ、クラスタは「行列必至の鉄板人気店」に分類されている。
データおじさん:「いや、そこ評価高いんだけど、結構人気で並びそうなんだよね...」
ランチ奉行:「ちょっと並ぶけど、喋ってればすぐだし!」
その一言に、私は膝から崩れ落ちた。
その圧倒的な「信頼と実績のアナログ・レコメンド」。 そして「並ぶ時間すらコミュニケーションにする」という陽キャのスタンス。 私が積み上げたクラウド技術とダッシュボードは、その輝きの前に霧散した...
「行きたいです!」と笑顔で去っていく二人。
エピローグ
残された私のモニターには、ランチ奉行が連れて行った定食屋(評価4.2、レビュー数1500強(圧倒的評価数)、距離30m)が虚しくプロットされていた。
「是非もなし……」
私は静かに、ブラウザを閉じた。 私の三日天下どころか、0秒天下は終わった。
「(……さて、今日の私の兵糧(ランチ)は、この評価4.5のパン屋にするか)」
本能寺は燃えていた。私の心の中で。

![[前編] 新入社員の歓迎ランチが不安すぎて、Google Maps APIで最強の店リストを作って武装した話](https://static.wixstatic.com/media/nsplsh_764a736a2d68674f454730~mv2_d_4954_3303_s_4_2.jpg/v1/fill/w_980,h_653,al_c,q_85,usm_0.66_1.00_0.01,enc_avif,quality_auto/nsplsh_764a736a2d68674f454730~mv2_d_4954_3303_s_4_2.jpg)

コメント