পপুলেশন ডায়নামিক্স ইনসাইটস এমবেডিংগুলি ব্যবহার করুন

গ্রাউন্ড ট্রুথ ডেটা প্রস্তুত করুন

পপুলেশন ডাইনামিক্স এমবেডিংস ব্যবহার করার জন্য, আপনার গ্রাউন্ড ট্রুথ ডেটাকে একটি সমর্থিত ভৌগোলিক সীমানায় একত্রিত করতে হবে। যেহেতু বিশ্বব্যাপী প্রশাসনিক সীমানার ধরন ভিন্ন ভিন্ন হয়, তাই আপনি সার্বজনীন গাণিতিক গ্রিড সিস্টেম (যেমন S2 সেল) অথবা স্থানীয় প্রশাসনিক অঞ্চল (যেমন কাউন্টি বা জেলা, যা নির্দিষ্ট দেশের ডেটাসেটের উপর নির্ভর করে) ব্যবহার করে আপনার ডেটা বিন্যস্ত করতে পারেন।

বিকল্প ১: বিদ্যমান মডেলে এমবেডিং অন্তর্ভুক্ত করুন

  • বিদ্যমান মডেল-ভিত্তিক গ্রাউন্ড ট্রুথ প্রস্তুত করুন: একটি বিদ্যমান মডেলকে উন্নত করতে এমবেডিংগুলিকে ভূ-স্থানিক কোভেরিয়েট হিসাবে ব্যবহার করুন।
  • একটি ত্রুটি সংশোধন মডেলকে প্রশিক্ষণ দিন: একটি বিদ্যমান মডেলকে উন্নত করুন, যেখানে এমবেডিংগুলোকে এমন একটি মডেলে একীভূত করা হয় যা মূল মডেলের আউটপুট, প্রত্যাশিত মান বা গ্রাউন্ড ট্রুথ এবং এমবেডিং গ্রহণ করে একটি নতুন ত্রুটি সংশোধন মডেল শেখে।

বিকল্প ২: নির্দিষ্ট ব্যবহারের ক্ষেত্র অনুযায়ী সমন্বয় করুন

  • একটি পূর্বাভাস মডেল নির্বাচন করুন: পূর্বাভাসের জন্য GBDT, MLP বা লিনিয়ার-এর মতো যেকোনো মডেল ব্যবহার করা যেতে পারে।
  • পূর্বাভাসের জন্য এমবেডিং ব্যবহার করুন: পূর্বাভাসের নির্ভুলতা বাড়াতে, অন্যান্য প্রাসঙ্গিক তথ্যের পাশাপাশি পপুলেশন ডাইনামিক্স এমবেডিং-কে ইনপুট ফিচার হিসেবে ব্যবহার করুন।

কাস্টম সীমানা একত্রীকরণ

আপনার গ্রাউন্ড ট্রুথ ডেটাতে যদি পোস্টাল কোড, ড্রাইভ-টাইম আইসোক্রোন বা ট্রেড এরিয়ার মতো কাস্টম পলিগন ব্যবহার করা হয়, তাহলে আপনি বাউন্ডারি অ্যাগ্রিগেশন করতে পারেন। এই প্রক্রিয়াটি টার্গেট পলিগনের জন্য একাধিক S2 সেল ভেক্টরকে একত্রিত করে একটি একক উপস্থাপনা তৈরি করে। সঠিক ওয়েটিং মেথডোলজি বেছে নিলে তা নিশ্চিত করে যে অ্যাগ্রিগেটেড এমবেডিং আপনার ডাউনস্ট্রিম মডেলিং লক্ষ্যগুলোকে সঠিকভাবে প্রতিফলিত করে।

খুচরা দোকানের কর্মক্ষমতা বা ভোক্তা আচরণের মডেলিংয়ের মতো মানব-কেন্দ্রিক ব্যবহারের ক্ষেত্রে জনসংখ্যা-ভারযুক্ত সমষ্টি ব্যবহার করুন।

জনসংখ্যাতাত্ত্বিক তথ্যের জন্য এলাকা-ভিত্তিক স্থানিক একত্রীকরণ ব্যবহার করলে তা আপনার মেশিন লার্নিং বৈশিষ্ট্যগুলোকে বিকৃত করতে পারে। এটি তখন ঘটে যখন জনবসতিহীন এলাকা, যেমন পার্ক, শিল্পাঞ্চল বা জলাশয়, প্রকৃত বাসিন্দাদের প্রোফাইলকে বিকৃত করে।

এর সমাধান করতে, আপনি BigQuery-তে জনসংখ্যা-ভারিত গড় (population-weighted average) করতে পারেন। এই পদ্ধতিটি প্রতিটি ছেদকারী S2 সেল সেগমেন্টের সঠিক ঘনত্ব গণনা করার জন্য উচ্চ-রেজোলিউশনের জনসংখ্যাতাত্ত্বিক ডেটাসেট, যেমন আর্থ ইঞ্জিন ডেটা ক্যাটালগের (Earth Engine Data Catalog) WorldPop, ব্যবহার করে

জনসংখ্যা-ভারযুক্ত ওয়ার্কফ্লো-এর একটি সম্পূর্ণ বাস্তবায়ন উদাহরণ দেখতে, ইন্টারেক্টিভ নোটবুকটি চালান।

২. ক্ষেত্রফল-ভারিত গড়

পরিবেশগত বা ভৌত ব্যবহারের ক্ষেত্রে, এর পরিবর্তে এলাকা-ভিত্তিক সমষ্টি ব্যবহার করুন। এটি ভূমি ব্যবহার বিশ্লেষণ, নির্মিত পরিবেশ সমীক্ষা বা অবকাঠামো পরিকল্পনার জন্য উপযোগী, যেখানে জনসংখ্যার বণ্টন নির্বিশেষে অঞ্চলগুলোর মূল্যায়ন করতে হয়।

এই পরিস্থিতিগুলোতে, মানব জনসংখ্যার ঘনত্বের চেয়ে ভৌতিক ভূখণ্ডের পরিমাণ বেশি প্রাসঙ্গিক। এটি নিশ্চিত করে যে বহুভুজের সীমানার ভেতরের প্রতিটি বর্গ কিলোমিটার সমষ্টিগত ভেক্টরে সমানভাবে অবদান রাখে।

এই পদ্ধতিতে, প্রতিটি উপাদান S2 সেলের এম্বেডিং ভেক্টরকে টার্গেট পলিগনের মধ্যে তার দ্বারা আচ্ছাদিত ভৌগোলিক পৃষ্ঠের ক্ষেত্রফল দ্বারা ভারযুক্ত করা হয়।

ভূ-স্থানিক কার্যক্রম এবং S2 সেল রূপান্তর

Population Dynamics Insights তার প্রাথমিক স্থানিক একক হিসেবে S2 সেল লেভেল 12 টোকেন (যা geo_id কলামে ৭-অক্ষরের হেক্সাডেসিমাল স্ট্রিং হিসেবে সংরক্ষিত থাকে) ব্যবহার করে। আপনি BigQuery-এর বিল্ট-ইন জিওগ্রাফি ফাংশন ব্যবহার করে পয়েন্ট স্থানাঙ্ক বা কাস্টম স্থানিক সীমানাকে সংশ্লিষ্ট S2 সেল টোকেনে রূপান্তর করতে পারেন। ভিজ্যুয়ালাইজেশনের জন্য S2 সেল টোকেনকে পলিগন জ্যামিতিতে রূপান্তর করতে, আপনি ক্লায়েন্ট-সাইড লাইব্রেরি ব্যবহার করতে পারেন। আরও তথ্যের জন্য, "Get S2 cell geometry from an S2 Level 12 hex token " দেখুন।

পয়েন্টের স্থানাঙ্ককে S2 লেভেল 12 হেক্স টোকেনে রূপান্তর করুন

Population Dynamics Insights-এর geo_id কলামের সাথে lat/lng পয়েন্ট স্থানাঙ্ক মেলানোর জন্য, BigQuery-এর S2_CELLIDFROMPOINT ফাংশনটি ST_GEOGPOINT সাথে একত্রে ব্যবহার করুন।

BigQuery S2 সেল আইডিগুলোকে সাইনড INT64 ভ্যালু হিসেবে সংরক্ষণ করে, যার ফলে নির্দিষ্ট কিছু অঞ্চলের সেল আইডিগুলো নেগেটিভ ইন্টিজার হিসেবে ইভ্যালুয়েট হয়। নিচের উদাহরণগুলোতে, আমরা TO_S2_HEX নামে একটি হেল্পার ফাংশন সংজ্ঞায়িত করেছি, যা S2 জিওমেট্রি স্পেসিফিকেশন অনুযায়ী ইন্টিজারটিকে একটি স্ট্যান্ডার্ড হেক্সাডেসিমাল টোকেনে রূপান্তর করে এবং শেষের শূন্যগুলো বাদ দেয়।

নিম্নলিখিত কোয়েরিটি টাইমস স্কোয়ার, নিউ ইয়র্ক সিটির (অক্ষাংশ 40.75796 , দ্রাঘিমাংশ -73.98554 ) বিন্দু স্থানাঙ্ককে তার সংশ্লিষ্ট S2 লেভেল 12 হেক্স টোকেনে রূপান্তর করে:

CREATE TEMP FUNCTION TO_S2_HEX(s2_int INT64) RETURNS STRING AS (
  RTRIM(FORMAT('%x%015x', (s2_int >> 60) & 0xF, s2_int & 0x0FFFFFFFFFFFFFFF), '0')
);

SELECT
  'Times Square, NYC' AS location_name,
  TO_S2_HEX(S2_CELLIDFROMPOINT(ST_GEOGPOINT(-73.98554, 40.75796), level => 12)) AS geo_id;

latitude এবং longitude কলাম সহ একটি বিদ্যমান পয়েন্ট টেবিলকে যোগদানযোগ্য S2 টোকেনে রূপান্তর করতে:

CREATE TEMP FUNCTION TO_S2_HEX(s2_int INT64) RETURNS STRING AS (
  RTRIM(FORMAT('%x%015x', (s2_int >> 60) & 0xF, s2_int & 0x0FFFFFFFFFFFFFFF), '0')
);

SELECT
  store_id,
  TO_S2_HEX(S2_CELLIDFROMPOINT(ST_GEOGPOINT(longitude, latitude), level => 12)) AS geo_id
FROM
  `your-project.internal_data.store_locations`;

একটি বহুভুজের জন্য আচ্ছাদনকারী S2 লেভেল 12 সেল টোকেন তৈরি করুন।

আপনার ডেটাতে যদি কাস্টম এলাকার সীমানা (যেমন WKT বা GeoJSON ফরম্যাটে ট্রেড এরিয়া, ডেলিভারি জোন বা পোস্টাল কোড) ব্যবহৃত হয়, তাহলে ST_GEOGFROM ব্যবহার করে টেক্সট রিপ্রেজেন্টেশনটিকে একটি GEOGRAPHY রূপান্তর করুন এবং সমস্ত ছেদকারী S2 লেভেল 12 সেল এক্সট্র্যাক্ট করতে S2_COVERINGCELLIDS ব্যবহার করুন।

নিম্নলিখিত কোয়েরিটি মিডটাউন ম্যানহাটনের একটি কাস্টম পলিগন জুড়ে থাকা সমস্ত S2 লেভেল 12 হেক্স টোকেন বের করে আনে:

CREATE TEMP FUNCTION TO_S2_HEX(s2_int INT64) RETURNS STRING AS (
  RTRIM(FORMAT('%x%015x', (s2_int >> 60) & 0xF, s2_int & 0x0FFFFFFFFFFFFFFF), '0')
);

WITH CustomBoundary AS (
  SELECT ST_GEOGFROM('POLYGON((-73.99 40.75, -73.97 40.75, -73.97 40.76, -73.99 40.76, -73.99 40.75))') AS geom
)
SELECT
  TO_S2_HEX(s2_id) AS geo_id
FROM
  CustomBoundary,
  UNNEST(S2_COVERINGCELLIDS(geom, min_level => 12, max_level => 12)) AS s2_id;

একটি S2 লেভেল 12 হেক্স টোকেন থেকে S2 সেলের জ্যামিতি পান

BigQuery GIS ফাংশনগুলো একমুখী রূপান্তরকারী (জ্যামিতি → S2 সেল আইডি) এবং এতে একটি S2 সেল টোকেনকে বহুভুজ GEOGRAPHY রূপান্তর করার কোনো ফাংশন অন্তর্ভুক্ত নেই। ভিজ্যুয়ালাইজেশন বা স্থানিক বিশ্লেষণের জন্য একটি S2 সেল টোকেনের বহুভুজ জ্যামিতি পেতে, পাইথনের একটি ক্লায়েন্ট-সাইড লাইব্রেরি ব্যবহার করুন, যেমন s2sphere যা একটি ৭-অক্ষরের S2 সেল টোকেনকে তার সীমানার স্থানাঙ্কে ডিকোড করে, এবং shapely যা Folium-এর মতো ম্যাপিং টুলের জন্য একটি বহুভুজ তৈরি করে।

import s2sphere
from shapely.geometry import Polygon

def s2_token_to_polygon(s2_token: str) -> Polygon:
    """Converts a 7-character S2 cell token into a Shapely Polygon."""
    cell_id = s2sphere.CellId.from_token(s2_token)
    cell = s2sphere.Cell(cell_id)

    # Extract the 4 corner vertices of the S2 cell
    vertices = []
    for i in range(4):
        vertex = cell.get_vertex(i)
        lat_lng = s2sphere.LatLng.from_point(vertex)
        vertices.append((lat_lng.lng().degrees, lat_lng.lat().degrees))

    # Close the polygon loop
    vertices.append(vertices[0])
    return Polygon(vertices)

# Example: Get boundary for S2 token '549056f'
cell_polygon = s2_token_to_polygon('549056f')
print(cell_polygon.wkt)

কোয়েরির উদাহরণ

your-project.your_dataset.embeddings_table এর জায়গায় আপনার আসল প্রজেক্ট, ডেটাসেট এবং টার্গেট টেবিলের নাম বসান।

SQL: এমবেডিংগুলি আনুন

এই কোয়েরিটি আপনার প্রোভিশন করা ডেটাসেটের S2 সেলগুলোর জন্য এমবেডিং ভেক্টর এবং অ্যাডমিনিস্ট্রেটিভ মেটাডেটা পুনরুদ্ধার করে।

SELECT
  geo_id,
  administrative_area_level_1_name AS state,
  administrative_area_level_2_name AS county,
  features -- The 330-dim vector
FROM
  `your-project.your_dataset.embeddings_table`
LIMIT 10;

SQL: অনুরূপ অবস্থান খুঁজুন

এই কোয়েরিটি বাহ্যিক ডেটার প্রয়োজন ছাড়াই আচরণগতভাবে অনুরূপ অবস্থানগুলি শনাক্ত করে।

এটি কোসাইন সিমিলারিটি গণনা করতে ML.DISTANCE ফাংশন ব্যবহার করে এবং একটি টার্গেট S2 সেলের জন্য সেরা ম্যাচগুলো ফেরত দেয়। এই পদ্ধতিটি সম্প্রসারণ পরিকল্পনার বিভিন্ন পরিস্থিতিতে সহায়তা করে, যেমন—একটি সফল বিদ্যমান অবস্থানের প্রোফাইলের উপর ভিত্তি করে কোথায় একটি নতুন স্টোর খোলা হবে তা নির্ধারণ করা।

মানচিত্রে S2 সেলগুলো দেখার জন্য, আপনাকে অবশ্যই S2 সেল আইডি-কে তার সংশ্লিষ্ট পলিগন জ্যামিতির সাথে রূপান্তর বা যুক্ত করতে হবে, কারণ এই ডেটাসেটটি অক্ষাংশ এবং দ্রাঘিমাংশ বিন্দুর পরিবর্তে S2 সেল টোকেন ব্যবহার করে।

WITH TargetLocation AS (
  SELECT features AS target_vector
  FROM `your-project.your_dataset.embeddings_table`
  -- Replace with your target S2 hex token (e.g., '80ead45')
  WHERE geo_id = 'YOUR_TARGET_S2_TOKEN'
)

SELECT
  t.geo_id,
  t.administrative_area_level_1_name AS state,
  t.administrative_area_level_2_name AS county,
  -- Calculate Similarity (1.0 is identical, 0.0 is dissimilar)
  (1 - ML.DISTANCE(t.features, p.target_vector, 'COSINE')) AS similarity_score
FROM
  `your-project.your_dataset.embeddings_table` t,
  TargetLocation p
WHERE
  t.geo_id != 'YOUR_TARGET_S2_TOKEN' -- Exclude the target itself
ORDER BY
  similarity_score DESC
LIMIT 20;

SQL: গ্রাহকের ডেটা যুক্ত করুন

এই উদাহরণটি দেখায় কিভাবে বিহেভিওরাল এমবেডিং ব্যবহার করে আপনার নিজস্ব অভ্যন্তরীণ ডেটা (যেমন, একটি স্টোর পারফরম্যান্স টেবিল) সমৃদ্ধ করা যায়। নিশ্চিত করুন যে আপনার অভ্যন্তরীণ ডেটাতে মিলে যাওয়া S2 সেল টোকেন (হেক্স স্ট্রিং) অন্তর্ভুক্ত রয়েছে।

SELECT
  store.store_id,
  store.s2_token,
  store.total_revenue,
  embeddings.features AS pdfm_vector
FROM
  `your-project.internal_data.store_performance` AS store
JOIN
  `your-project.your_dataset.embeddings_table` AS embeddings
ON
  -- Join based on the S2 hex token string
  store.s2_token = embeddings.geo_id

পাইথন: মেশিন লার্নিংয়ের জন্য ডেটা লোড করা

এমবেডিংগুলো BigQuery অ্যারে হিসেবে সংরক্ষিত থাকে। ML লাইব্রেরিতে এগুলো ব্যবহার করার জন্য, আপনাকে অবশ্যই কলামটিকে একটি NumPy ম্যাট্রিক্সে রূপান্তর করতে হবে।

from google.cloud import bigquery
import numpy as np
import pandas as pd

client = bigquery.Client()

query = """
    SELECT
        geo_id,
        features -- Returns as a list of floats
    FROM
        `your-project.your_dataset.embeddings_table`
    LIMIT 1000
"""

# 1. Load data into DataFrame
df = client.query(query).to_dataframe()

# 2. Convert the 'features' column (Series of Lists) into a Matrix (2D Array)
X_matrix = np.stack(df['features'].values)

print(f"Data Loaded. Matrix Shape: {X_matrix.shape}")
# Output: Data Loaded. Matrix Shape: (1000, 330)