top of page

[後編] 新入社員の歓迎ランチが不安すぎて、Google Maps APIで最強の店リストを作って武装した話

  • 執筆者の写真: Ryota Isono
    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のパン屋にするか)」

本能寺は燃えていた。私の心の中で。




コメント


Image by George Kedenburg III

NEWS

bottom of page