샘플 장소 ID를 사용하여 Places Insights 데이터 검증

이 문서에서는 장소 통계의 샘플 장소 ID 데이터를 사용하여 장소 수 함수와 타겟팅된 장소 세부정보 조회를 함께 사용하여 결과에 대한 신뢰도를 높이는 방법을 알아봅니다.

통계 데이터를 검증하기 위해 개별 마커가 오버레이된 런던의 장소 밀도 히트맵

건축 패턴

이 아키텍처 패턴은 높은 수준의 통계 분석과 그라운드 트루스 검증 간의 격차를 해소하기 위한 반복 가능한 워크플로를 제공합니다. BigQuery의 확장성과 Places API의 정확성을 결합하여 분석 결과를 확실하게 검증할 수 있습니다. 이는 데이터에 대한 신뢰가 가장 중요한 사이트 선택, 경쟁업체 분석, 시장 조사에 특히 유용합니다.

이 패턴의 핵심에는 네 가지 주요 단계가 포함됩니다.

  1. 대규모 분석 실행: BigQuery의 장소 통계에서 장소 수 함수를 사용하여 도시 또는 지역 전체와 같은 넓은 지리적 범위에 걸쳐 장소 데이터를 분석합니다.
  2. 샘플 격리 및 추출: 관심 영역 (예: 집계된 결과에서 밀도가 높은 '핫스팟'을 식별하고 함수에서 제공하는 sample_place_ids를 추출합니다.
  3. 정답 세부정보 가져오기: 추출된 장소 ID를 사용하여 장소 세부정보 API에 타겟팅된 호출을 실행하여 각 장소의 풍부한 실제 세부정보를 가져옵니다.
  4. 결합된 시각화 만들기: 초기 개요 통계 지도 위에 세부적인 장소 데이터를 레이어링하여 집계된 수가 실제 상황을 반영하는지 시각적으로 확인합니다.

솔루션 워크플로

이 워크플로를 사용하면 거시적 추세와 미시적 사실 간의 격차를 해소할 수 있습니다. 광범위한 통계적 관점에서 시작하여 구체적인 실제 사례로 데이터를 확인하기 위해 전략적으로 드릴다운합니다.

Places Insights로 대규모 장소 밀도 분석

첫 번째 단계는 전반적인 상황을 파악하는 것입니다. 수천 개의 개별 관심 장소 (POI)를 가져오는 대신 단일 쿼리를 실행하여 통계 요약을 가져올 수 있습니다.

이 경우 Places Insights PLACES_COUNT_PER_H3 함수가 적합합니다. 관심 장소 수를 육각형 그리드 시스템(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
    )
  );

이 쿼리의 출력은 H3 셀과 각 셀 내 장소 수를 보여주는 표를 제공하며, 이는 밀도 히트맵의 기반이 됩니다.

h3_cell_index, count, sample_place_ids 열을 보여주는 BigQuery 쿼리 결과 테이블

핫스팟 격리 및 샘플 장소 ID 추출

PLACES_COUNT_PER_H3 함수의 결과는 sample_place_ids 배열도 반환하며, 응답의 요소당 최대 250개의 장소 ID가 있습니다. 이러한 ID는 집계된 통계에서 통계에 기여하는 개별 장소로 연결되는 링크입니다.

시스템은 먼저 초기 질문에서 가장 관련성이 높은 셀을 식별할 수 있습니다. 예를 들어 개수가 가장 많은 상위 20개 셀을 선택할 수 있습니다. 그런 다음 이러한 핫스팟에서 sample_place_ids를 단일 목록으로 통합합니다. 이 목록은 가장 관련성 높은 지역에서 가장 흥미로운 관심 장소의 선별된 샘플을 나타내며, 타겟팅된 인증을 준비할 수 있도록 지원합니다.

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로 그라운드 트루스 세부정보 가져오기

통합된 장소 ID 목록을 사용하여 이제 대규모 분석에서 특정 데이터 검색으로 전환합니다. 이 ID를 사용하여 장소 세부정보 API에 각 샘플 위치에 관한 자세한 정보를 쿼리합니다.

이 단계는 매우 중요한 검증 단계입니다. Places 통계에서는 특정 지역에 몇 개의 레스토랑이 있는지 알려주지만, Places API는 어떤 레스토랑인지 알려주며 이름, 정확한 주소, 위도/경도, 사용자 평점, Google 지도의 위치로 연결되는 직접 링크까지 제공합니다. 이렇게 하면 샘플 데이터가 풍부해져 추상적인 ID가 검증 가능한 구체적인 장소로 바뀝니다.

Place Details API에서 사용할 수 있는 데이터의 전체 목록과 검색과 관련된 비용은 API 문서를 검토하세요. FieldMask은 API에서 반환되는 데이터를 제어하기 위해 요청에 설정됩니다.

Python 클라이언트 라이브러리를 사용하여 특정 ID에 대해 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 = "displayName,formattedAddress,location,googleMapsUri"

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

자세한 내용은 Places API (New) 클라이언트 라이브러리 예시를 참고하세요.

검증을 위한 결합된 시각화 만들기

마지막 단계는 두 데이터 세트를 하나의 뷰로 통합하는 것입니다. 이를 통해 초기 분석을 즉각적이고 직관적으로 검사할 수 있습니다. 시각화에는 두 개의 레이어가 있어야 합니다.

  1. 기본 레이어: 초기 PLACES_COUNT_PER_H3 결과에서 생성된 등치선도 또는 히트맵으로, 지리적 위치 전반의 장소 전체 밀도를 보여줍니다.
  2. 상단 레이어: 이전 단계에서 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를 활용하여 타겟팅된 정답 검증을 수행하면 강력한 피드백 루프를 만들 수 있습니다. 이를 통해 소매업체 사이트 선택이나 물류 계획 등 전략적 결정을 내릴 때 통계적으로 유의미할 뿐만 아니라 검증 가능한 정확한 데이터를 기반으로 할 수 있습니다.

다음 단계

  • 다른 장소 개수 함수를 살펴보고 다양한 분석 질문에 어떻게 답할 수 있는지 확인하세요.
  • Places API 문서를 검토하여 분석을 더욱 풍부하게 하기 위해 요청할 수 있는 다른 필드를 확인하세요.

참여자

헨리크 밸브 | DevX 엔지니어