サンプル プレイス ID を使用して Places Insights データを検証する

このドキュメントでは、Places Insights のサンプル Place IDs データを使用して、Place Count Functions とターゲット Place Details ルックアップを併用して結果の信頼性を高める方法について説明します。

このパターンの詳細なリファレンス実装については、こちらの説明ノートブックをご覧ください。

ロンドンの場所の密度ヒートマップ。個々のマーカーが重ねて表示され、統計データが検証されています。

アーキテクチャ パターン

このアーキテクチャ パターンを使用すると、高度な統計分析とグラウンド トゥルース検証のギャップを埋めるための再現可能なワークフローを実現できます。BigQuery のスケールと Places API の精度を組み合わせることで、 分析結果を自信を持って検証できます。これは、データの信頼性が最も重要なサイトの選択、競合他社の分析、市場調査に特に役立ちます。

このパターンの中心となるのは、次の 4 つの重要なステップです。

  1. 大規模な分析を実行する: BigQuery で Place Count FunctionPlaces Insights の機能)を使用して 、都市や地域全体など、広範囲の場所データを分析します。
  2. サンプルを分離して抽出する: 集計結果から関心のある領域(高密度の「ホットスポット」など)を特定し、関数によって提供される sample_place_ids を抽出します。
  3. グラウンド トゥルースの詳細を取得する: 抽出した Place ID を使用して、Place Details API をターゲット呼び出しを行い、各場所の豊富な現実世界の詳細情報を取得します。
  4. 組み合わせた可視化を作成する: 詳細な場所データを最初の高度な統計マップの上に重ねて、集計された数が実際の状況を反映していることを視覚的に検証します。

ソリューションのワークフロー

このワークフローを使用すると、マクロレベルの傾向とミクロレベルの事実のギャップを埋めることができます。まず、広範な統計ビューから始め、具体的な現実世界の例でデータを検証するために戦略的にドリルダウンします。

Places Insights を使用して場所の密度を大規模に分析する

最初のステップは、状況を大まかに把握することです。何千もの個々のスポット(POI)を取得する代わりに、1 つのクエリを実行して統計概要を取得できます。

この場合は、Places Insights の PLACES_COUNT_PER_H3 関数 が最適です。この関数は、POI の数を六角形のグリッド システム (H3)に集計します。これにより、特定の条件(営業中の 高評価のレストランなど)に基づいて、 密度が高いエリアと低いエリアをすばやく特定できます。

クエリの例を次に示します。検索エリアの地理情報を提供する必要があります。Overture Maps Data BigQuery 一般公開データセットなどのオープン データセットを使用して、地理的な境界データを取得できます。

頻繁に使用されるオープン データセットの境界については、独自のプロジェクトのテーブルにマテリアライズすることをおすすめします。これにより、BigQuery の費用が大幅に削減され、クエリのパフォーマンスが向上します。

-- This query counts all highly-rated, operational restaurants
-- across a large geography, grouping them into H3 cells.
SELECT *
FROM
  `places_insights___gb.PLACES_COUNT_PER_H3`(
    JSON_OBJECT(
      'geography', your_defined_geography,
      'h3_resolution', 8,
      'types', ['restaurant'],
      'business_status', ['OPERATIONAL'],
      'min_rating', 3.5
    )
  );

ブランド ID でフィルタリングして検証する

特定のブランドの数とサンプル Place ID を検証する場合は、brand_ids フィルタを使用してブランド ID のリストを指定します。

ターゲット ブランドのブランド ID を取得するには、BigQuery の brands テーブルに対してクエリを実行します。

SELECT id, name
FROM `YOUR_PROJECT.places_insights___us.brands`
WHERE LOWER(name) LIKE "%starbucks%";

ターゲット ブランド ID(スターバックスの場合は "1413758728321880760" など)を取得したら、brand_ids フィルタ配列に渡します。

SELECT *
FROM
  `places_insights___us.PLACES_COUNT_PER_H3`(
    JSON_OBJECT(
      'geography', your_defined_geography,
      'h3_resolution', 8,
      'brand_ids', ["1413758728321880760"]
    )
  );

ステップ 3 のグラウンド トゥルース検証では、場所が一般的なカテゴリに一致することを確認する代わりに、正規表現一致を使用して、Place Details API から返された表示名を想定されるブランド名とプログラムで比較できます。たとえば、response.display_name.text フィールドを比較できます。

このクエリの出力は、H3 セルのテーブルと各セル内の場所の数を示します。これは、密度ヒートマップの基礎となります。

h3_cell_index、count、sample_place_ids の列を示す BigQuery クエリ結果のテーブル。

ホットスポットを分離してサンプル Place ID を抽出する

PLACES_COUNT_PER_H3 関数の結果は、sample_place_ids の配列も返します。レスポンスの要素ごとに最大 250 個の Place ID が返されます。これらの ID は、集計された統計情報から、その統計情報に寄与する個々の場所へのリンクです。

システムは、最初のクエリから最も関連性の高いセルを特定できます。 たとえば、カウントが最も多い上位 20 個のセルを選択できます。次に、これらのホットスポットから、sample_place_ids を 1 つのリストに統合します。 このリストは、最も関連性の高いエリアから最も興味深い POI の厳選されたサンプルを表し、ターゲット検証の準備が整います。

pandas DataFrame を使用して Python で BigQuery の結果を処理する場合、これらの ID を抽出するロジックは簡単です。

# Assume 'results_df' is a pandas DataFrame from your BigQuery query.

# 1. Identify the 20 busiest H3 cells by sorting and taking the top results.
top_hotspots_df = results_df.sort_values(by='count', ascending=False).head(20)

# 2. Extract and flatten the lists of sample_place_ids from these hotspots.
# The .explode() function creates a new row for each ID in the lists.
all_sample_ids = top_hotspots_df['sample_place_ids'].explode()

# 3. Create a final list of unique Place IDs to verify.
place_ids_to_verify = all_sample_ids.unique().tolist()

print(f"Consolidated {len(place_ids_to_verify)} unique Place IDs for spot-checking.")

他のプログラミング言語を使用する場合も同様のロジックを適用できます。

Places API でグラウンド トゥルースの詳細を取得する

Place ID の統合リストを使用して、大規模な分析から特定のデータ取得に移行します。これらの ID を使用して、各サンプル ロケーションの詳細情報を Place Details API にクエリします。

これは重要な検証ステップです。Places Insights は、あるエリアにレストランが何軒 あるかを教えてくれますが、Places API は、レストランの名前、正確な住所、緯度/経度、ユーザー評価、Google マップ上の場所への直接リンクなど、どのレストランであるかを教えてくれます。これにより、サンプルデータが充実し、抽象的な ID が具体的な検証可能な場所に変わります。

Place Details API から利用可能なデータの完全なリストと、取得に関連する費用については、API ドキュメントをご覧ください。

Python クライアント ライブラリを使用して特定の ID に対して Places API にリクエストを送信すると、次のようになります。詳しくは、Places API(新しい)クライアント ライブラリ の例 をご覧ください。

# A request to fetch details for a single Place ID.
request = {"name": f"places/{place_id}"}

# Define the fields you want returned in the response as a comma-separated string.
fields_to_request = "formattedAddress,location,displayName,googleMapsUri"

# The response contains ground truth data.
response = places_client.get_place(
    request=request,
    metadata=[("x-goog-fieldmask", fields_to_request)]
)

このリクエストのフィールドは、2 つの異なる課金 SKU からデータを取得します。

1 つの Place Details リクエストに複数の SKU のフィールドが含まれている場合、リクエスト全体が最上位の SKU の料金で課金されます。したがって、この特定の呼び出しは Place Details Pro リクエストとして課金されます。

費用を管理するには、常に FieldMask を使用して、アプリケーションに必要なフィールドのみをリクエストします。

検証用の組み合わせた可視化を作成する

最後のステップは、両方のデータセットを 1 つのビューにまとめることです。これにより、最初の分析をすぐに直感的にスポットチェックできます。 ビジュアリゼーションには次の 2 つのレイヤが必要です。

  1. ベースレイヤ: 最初の PLACES_COUNT_PER_H3 の結果から生成されたコロプレスマップまたはヒートマップ。地理情報全体の場所の密度を示します。
  2. 最上位レイヤ: 各サンプル POI の個々のマーカーのセット。前のステップで Places API から取得した正確な座標を使用してプロットされます。

この組み合わせたビューを構築するロジックは、次の疑似コードの例で表されます。

# Assume 'h3_density_data' is your aggregated data from Step 1.
# Assume 'detailed_places_data' is your list of place objects from Step 3.

# Create the base choropleth map from the H3 density data.
# The 'count' column determines the color of each hexagon.
combined_map = create_choropleth_map(
    data=h3_density_data,
    color_by_column='count'
)

# Iterate through the detailed place data to add individual markers.
for place in detailed_places_data:
    # Construct the popup information with key details and a link.
    popup_html = f"""
    <b>{place.name}</b><br>
    Address: {place.address}<br>
    <a href="{place.google_maps_uri}" target="_blank">View on Maps</a>
    """

    # Add a marker for the current place to the base map.
    combined_map.add_marker(
        location=[place.latitude, place.longitude],
        popup=popup_html,
        tooltip=place.name
    )

# Display the final map with both layers.
display(combined_map)

特定のグラウンド トゥルース マーカーを高度な密度マップに重ねることで、ホットスポットとして特定されたエリアに、分析対象の場所が実際に高密度で含まれていることをすぐに確認できます。この視覚的な確認により、データドリブンな結論に対する信頼性が大幅に高まります。

まとめ

このアーキテクチャ パターンは、大規模な地理空間分析情報を検証するための堅牢で効率的な方法を提供します。Places Insights を活用して広範でスケーラブルな分析を行い、Place Details API を使用してターゲットを絞ったグラウンド トゥルース検証を行うことで、強力なフィードバック ループを作成できます。これにより、小売店のサイトの選択やロジスティクス計画など、戦略的な意思決定が、統計的に有意であるだけでなく、検証可能な正確なデータに基づいていることを保証できます。

次のステップ

  • 他の Place Count Functions を調べて、さまざまな分析上の質問にどのように回答できるかを確認します。
  • Places API ドキュメント を確認して、リクエストして分析をさらに充実させることができる他のフィールドを見つけます。

寄稿者

Henrik Valve | DevX エンジニア