ভূমিকা
এই ডকুমেন্টে বর্ণনা করা হয়েছে কিভাবে Places Insights ডেটাসেট, BigQuery-তে থাকা পাবলিক জিওস্পেশিয়াল ডেটা এবং Place Details API-কে একত্রিত করে একটি সাইট সিলেকশন সলিউশন তৈরি করা যায়।

উপরের মানচিত্রটি গুগল ক্লাউড নেক্সট ২০২৫-এ প্রদত্ত একটি ডেমোর ফলাফল তুলে ধরেছে, যা ইউটিউবে দেখা যাবে । আপনি উদাহরণ নোটবুকটি ব্যবহার করে এই ফলাফলগুলো তৈরি করতে ব্যবহৃত কোডটি চালাতে পারেন।
ব্যবসায়িক চ্যালেঞ্জ
ধরুন, আপনার একটি সফল কফি শপের চেইন আছে এবং আপনি নেভাডার মতো একটি নতুন রাজ্যে আপনার ব্যবসা প্রসারিত করতে চান, যেখানে আপনার কোনো উপস্থিতি নেই। একটি নতুন শাখা খোলা একটি বড় বিনিয়োগ, এবং সফলতার জন্য তথ্যের উপর ভিত্তি করে সিদ্ধান্ত নেওয়া অত্যন্ত গুরুত্বপূর্ণ। আপনি শুরুই বা করবেন কোথা থেকে?
এই নির্দেশিকাটি একটি নতুন কফি শপের জন্য সর্বোত্তম স্থান চিহ্নিত করতে আপনাকে একটি বহুস্তরীয় বিশ্লেষণের মধ্য দিয়ে নিয়ে যাবে। আমরা একটি রাজ্যব্যাপী চিত্র দিয়ে শুরু করব, ক্রমান্বয়ে আমাদের অনুসন্ধানকে একটি নির্দিষ্ট কাউন্টি ও বাণিজ্যিক অঞ্চলে সীমাবদ্ধ করব, এবং পরিশেষে প্রতিযোগীদের মানচিত্র তৈরি করে স্বতন্ত্র এলাকাগুলোর মূল্যায়ন ও বাজারের ঘাটতি চিহ্নিত করার জন্য একটি অতি-স্থানীয় বিশ্লেষণ করব।
সমাধান কর্মপ্রবাহ
এই প্রক্রিয়াটি একটি যৌক্তিক ফানেল অনুসরণ করে, যা বিস্তৃতভাবে শুরু হয়ে ক্রমান্বয়ে আরও সুনির্দিষ্ট হয়, যাতে অনুসন্ধানের ক্ষেত্রটি পরিমার্জিত হয় এবং চূড়ান্ত স্থান নির্বাচনের ব্যাপারে আস্থা বাড়ে।
পূর্বশর্ত এবং পরিবেশ সেটআপ
বিশ্লেষণে প্রবেশ করার আগে, আপনার কয়েকটি মূল সক্ষমতা সম্পন্ন একটি পরিবেশ প্রয়োজন। যদিও এই নির্দেশিকাটি SQL এবং Python ব্যবহার করে একটি বাস্তবায়ন ধাপে ধাপে দেখাবে, এর সাধারণ নীতিগুলি অন্যান্য প্রযুক্তি স্ট্যাকের ক্ষেত্রেও প্রয়োগ করা যেতে পারে।
পূর্বশর্ত হিসেবে, নিশ্চিত করুন আপনার পরিবেশ নিম্নলিখিত বিষয়গুলো করতে সক্ষম:
- BigQuery-তে কোয়েরি চালান।
- Places Insights অ্যাক্সেস করুন, আরও তথ্যের জন্য Setup Places Insights দেখুন।
-
bigquery-public-dataএবং ইউএস সেন্সাস ব্যুরোর কাউন্টি পপুলেশন টোটালস থেকে পাবলিক ডেটাসেটগুলিতে সাবস্ক্রাইব করুন।
আপনাকে মানচিত্রে ভূ-স্থানিক ডেটা কল্পনা করতে সক্ষম হতে হবে, যা প্রতিটি বিশ্লেষণমূলক ধাপের ফলাফল ব্যাখ্যা করার জন্য অত্যন্ত গুরুত্বপূর্ণ। এটি অর্জন করার অনেক উপায় আছে। আপনি লুকার স্টুডিওর (Looker Studio) মতো বিআই (BI) টুল ব্যবহার করতে পারেন যা সরাসরি বিগকোয়েরির (BigQuery) সাথে সংযুক্ত হয়, অথবা আপনি পাইথনের (Python) মতো ডেটা সায়েন্স ল্যাঙ্গুয়েজ ব্যবহার করতে পারেন।
রাজ্য-স্তরের বিশ্লেষণ: সেরা কাউন্টিটি খুঁজুন
আমাদের প্রথম পদক্ষেপ হলো নেভাডার সবচেয়ে সম্ভাবনাময় কাউন্টিটি চিহ্নিত করার জন্য একটি ব্যাপক বিশ্লেষণ করা। আমরা সম্ভাবনাময় বলতে উচ্চ জনসংখ্যা এবং বিদ্যমান রেস্তোরাঁর উচ্চ ঘনত্বের একটি সমন্বয়কে বোঝাব, যা একটি শক্তিশালী খাদ্য ও পানীয় সংস্কৃতির ইঙ্গিত দেয়।
আমাদের BigQuery কোয়েরিটি Places Insights ডেটাসেটের মধ্যে থাকা বিল্ট-ইন অ্যাড্রেস কম্পোনেন্টগুলো ব্যবহার করে এই কাজটি সম্পন্ন করে। কোয়েরিটি প্রথমে administrative_area_level_1_name ফিল্ড ব্যবহার করে ডেটা ফিল্টার করে শুধুমাত্র নেভাডা রাজ্যের অন্তর্ভুক্ত স্থানগুলো গণনা করে। এরপর এটি এই সেটটিকে আরও পরিমার্জন করে শুধুমাত্র সেইসব স্থান অন্তর্ভুক্ত করে যেখানে types অ্যারেতে ' restaurant ' শব্দটি রয়েছে। সবশেষে, এটি প্রতিটি কাউন্টির জন্য গণনা তৈরি করতে এই ফলাফলগুলোকে কাউন্টির নাম ( administrative_area_level_2_name ) অনুসারে গ্রুপ করে। এই পদ্ধতিটি ডেটাসেটের বিল্ট-ইন, প্রি-ইনডেক্সড অ্যাড্রেস কাঠামোকে কাজে লাগায়।
এই অংশটিতে দেখানো হয়েছে, কীভাবে আমরা প্লেসেস ইনসাইটস-এর সাহায্যে কাউন্টি জিওমেট্রিগুলোকে যুক্ত করি এবং একটি নির্দিষ্ট স্থানের ধরন, যেমন restaurant , ফিল্টার করি।
SELECT WITH AGGREGATION_THRESHOLD
administrative_area_level_2_name,
COUNT(*) AS restaurant_count
FROM
`places_insights___us.places`
WHERE
-- Filter for the state of Nevada
administrative_area_level_1_name = 'Nevada'
-- Filter for places that are restaurants
AND 'restaurant' IN UNNEST(types)
-- Filter for operational places only
AND business_status = 'OPERATIONAL'
-- Exclude rows where the county name is null
AND administrative_area_level_2_name IS NOT NULL
GROUP BY
administrative_area_level_2_name
ORDER BY
restaurant_count DESC
শুধু রেস্তোরাঁর সংখ্যা গণনা করাই যথেষ্ট নয়; বাজারের সম্পৃক্ততা ও সুযোগ সম্পর্কে সঠিক ধারণা পেতে আমাদের এটিকে জনসংখ্যার তথ্যের সাথে মিলিয়ে দেখতে হবে। আমরা ইউএস সেন্সাস ব্যুরোর কাউন্টি পপুলেশন টোটালস থেকে জনসংখ্যার তথ্য ব্যবহার করব।
এই দুটি সম্পূর্ণ ভিন্ন মেট্রিক (একটি স্থানের সংখ্যা বনাম একটি বৃহৎ জনসংখ্যা) তুলনা করার জন্য, আমরা মিন-ম্যাক্স নর্মালাইজেশন ব্যবহার করি। এই কৌশলটি উভয় মেট্রিককে একটি সাধারণ পরিসরে (০ থেকে ১) স্কেল করে। এরপর একটি ভারসাম্যপূর্ণ তুলনার জন্য, আমরা সেগুলোকে একটি একক normalized_score এ একত্রিত করি এবং প্রতিটি মেট্রিককে ৫০% গুরুত্ব দিই।
এই অংশটি স্কোর গণনার মূল যুক্তি তুলে ধরে। এটি স্বাভাবিককৃত জনসংখ্যা এবং রেস্তোরাঁর সংখ্যাকে একত্রিত করে:
(
-- Normalize restaurant count (scales to a 0-1 value) and apply 50% weight
SAFE_DIVIDE(restaurant_count - min_restaurants, max_restaurants - min_restaurants) * 0.5
+
-- Normalize population (scales to a 0-1 value) and apply 50% weight
SAFE_DIVIDE(population_2023 - min_pop, max_pop - min_pop) * 0.5
) AS normalized_score
সম্পূর্ণ কোয়েরিটি চালানোর পর কাউন্টিগুলোর একটি তালিকা, রেস্তোরাঁর সংখ্যা, জনসংখ্যা এবং নর্মালাইজড স্কোর ফেরত আসে। normalized_score DESC অনুসারে অবরোহী ক্রমে সাজালে দেখা যায় যে, পরবর্তী তদন্তের জন্য শীর্ষ প্রতিযোগী হিসেবে ক্লার্ক কাউন্টিই সুস্পষ্ট বিজয়ী।

এই স্ক্রিনশটটি নর্মালাইজড স্কোর অনুসারে শীর্ষ ৪টি কাউন্টি দেখাচ্ছে। এই উদাহরণ থেকে প্রকৃত জনসংখ্যা ইচ্ছাকৃতভাবে বাদ দেওয়া হয়েছে।
জেলা-স্তরের বিশ্লেষণ: সবচেয়ে ব্যস্ত বাণিজ্যিক এলাকাগুলো খুঁজুন
এখন যেহেতু আমরা ক্লার্ক কাউন্টি চিহ্নিত করেছি, পরবর্তী পদক্ষেপ হলো সবচেয়ে বেশি বাণিজ্যিক কার্যকলাপ সম্পন্ন জিপ কোডগুলো খুঁজে বের করা। আমাদের বিদ্যমান কফি শপগুলোর তথ্য থেকে আমরা জানি যে, বড় বড় ব্র্যান্ডের ঘনবসতির কাছাকাছি অবস্থিত হলে সেগুলোর পারফরম্যান্স ভালো হয়, তাই আমরা এটিকে অধিক পদচারণার একটি পরোক্ষ সূচক হিসেবে ব্যবহার করব।
এই কোয়েরিটি প্লেসেস ইনসাইটস-এর অন্তর্গত brands টেবিলটি ব্যবহার করে, যেটিতে নির্দিষ্ট ব্র্যান্ড সম্পর্কিত তথ্য থাকে। সমর্থিত ব্র্যান্ডগুলোর তালিকা খুঁজে বের করার জন্য এই টেবিলটি কোয়েরি করা যায় । আমরা প্রথমে আমাদের টার্গেট ব্র্যান্ডগুলোর একটি তালিকা নির্ধারণ করি এবং তারপর ক্লার্ক কাউন্টির প্রতিটি জিপ কোডের মধ্যে এই নির্দিষ্ট স্টোরগুলোর কতগুলো অবস্থিত তা গণনা করার জন্য এটিকে মূল প্লেসেস ইনসাইটস ডেটাসেটের সাথে জয়েন করি।
এটি অর্জনের সবচেয়ে কার্যকরী উপায় হলো একটি দ্বি-পদক্ষেপ পদ্ধতি:
- প্রথমে, আমরা প্রতিটি পোস্টাল কোডের মধ্যে থাকা ব্র্যান্ডগুলো গণনা করার জন্য একটি দ্রুত, ভূ-স্থানিক নয় এমন একত্রীকরণ প্রক্রিয়া চালাব।
- দ্বিতীয়ত, ভিজ্যুয়ালাইজেশনের জন্য মানচিত্রের সীমানা পেতে আমরা সেই ফলাফলগুলোকে একটি পাবলিক ডেটাসেটের সাথে যুক্ত করব।
postal_code_names ফিল্ড ব্যবহার করে ব্র্যান্ড গণনা করুন
এই প্রথম কোয়েরিটি মূল গণনার কার্যপ্রণালী সম্পাদন করে। এটি ক্লার্ক কাউন্টির স্থানগুলোকে ফিল্টার করে এবং তারপর পোস্টাল কোড অনুযায়ী ব্র্যান্ডের সংখ্যাগুলোকে গ্রুপ করার জন্য postal_code_names অ্যারেটিকে আননেস্ট করে।
WITH brand_names AS (
-- First, select the chains we are interested in by name
SELECT
id,
name
FROM
`places_insights___us.brands`
WHERE
name IN ('7-Eleven', 'CVS', 'Walgreens', 'Subway Restaurants', "McDonald's")
)
SELECT WITH AGGREGATION_THRESHOLD
postal_code,
COUNT(*) AS total_brand_count
FROM
`places_insights___us.places` AS places_table,
-- Unnest the built-in postal code and brand ID arrays
UNNEST(places_table.postal_code_names) AS postal_code,
UNNEST(places_table.brand_ids) AS brand_id
JOIN
brand_names
ON brand_names.id = brand_id
WHERE
-- Filter directly on the administrative area fields in the places table
places_table.administrative_area_level_2_name = 'Clark County'
AND places_table.administrative_area_level_1_name = 'Nevada'
GROUP BY
postal_code
ORDER BY
total_brand_count DESC
আউটপুটটি হলো পোস্টাল কোড এবং সেগুলোর সংশ্লিষ্ট ব্র্যান্ড সংখ্যার একটি সারণি।

ম্যাপিংয়ের জন্য জিপ কোড জ্যামিতি সংযুক্ত করুন
এখন যেহেতু আমাদের কাছে সংখ্যাগুলো আছে, আমরা ভিজ্যুয়ালাইজেশনের জন্য প্রয়োজনীয় পলিগন আকারগুলো পেতে পারি। এই দ্বিতীয় কোয়েরিটি আমাদের প্রথম কোয়েরিটিকে নেয়, সেটিকে brand_counts_by_zip নামের একটি কমন টেবিল এক্সপ্রেশন (CTE)-এর মধ্যে আবদ্ধ করে এবং এর ফলাফলকে পাবলিক geo_us_boundaries.zip_codes table সাথে যুক্ত করে। এটি দক্ষতার সাথে আমাদের পূর্ব-গণনাকৃত সংখ্যাগুলোর সাথে জ্যামিতি সংযুক্ত করে।
WITH brand_counts_by_zip AS (
-- This will be the entire query from the previous step, without the final ORDER BY (excluded for brevity).
. . .
)
-- Now, join the aggregated results to the boundaries table
SELECT
counts.postal_code,
counts.total_brand_count,
-- Simplify the geometry for faster rendering in maps
ST_SIMPLIFY(zip_boundaries.zip_code_geom, 100) AS geography
FROM
brand_counts_by_zip AS counts
JOIN
`bigquery-public-data.geo_us_boundaries.zip_codes` AS zip_boundaries
ON counts.postal_code = zip_boundaries.zip_code
ORDER BY
counts.total_brand_count DESC
আউটপুটটি হলো পোস্টাল কোড, সেগুলোর সংশ্লিষ্ট ব্র্যান্ডের সংখ্যা এবং পোস্টাল কোডের জ্যামিতি সম্বলিত একটি সারণি।

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

হাইপার-লোকাল বিশ্লেষণ: স্বতন্ত্র গ্রিড এলাকাগুলোর স্কোর নির্ধারণ
লাস ভেগাসের সাধারণ এলাকাটি চিহ্নিত করার পর, এখন পুঙ্খানুপুঙ্খ বিশ্লেষণের পালা। এখানেই আমরা আমাদের নির্দিষ্ট ব্যবসায়িক জ্ঞানকে কাজে লাগাই। আমরা জানি, একটি ভালো কফি শপ সেইসব ব্যবসার কাছাকাছি ভালো চলে, যেগুলো আমাদের ব্যস্ততম সময়ে, যেমন সকালের শেষ ভাগে এবং দুপুরের খাবারের সময়, ব্যস্ত থাকে।
আমাদের পরবর্তী কোয়েরিটি বেশ সুনির্দিষ্ট। এটি লাস ভেগাস মেট্রোপলিটন এলাকার উপর স্ট্যান্ডার্ড H3 জিওস্পেশিয়াল ইনডেক্স (রেজোলিউশন ৮-এ) ব্যবহার করে একটি সূক্ষ্ম ষড়ভুজাকার গ্রিড তৈরির মাধ্যমে শুরু হয়, যাতে এলাকাটিকে মাইক্রো-লেভেলে বিশ্লেষণ করা যায়। কোয়েরিটি প্রথমে সেই সমস্ত পরিপূরক ব্যবসাগুলিকে শনাক্ত করে, যেগুলি আমাদের ব্যস্ততম সময়ে (সোমবার, সকাল ১০টা থেকে দুপুর ২টা) খোলা থাকে।
এরপর আমরা প্রতিটি স্থানের ধরনের উপর একটি ওয়েটেড স্কোর প্রয়োগ করি। একটি কাছাকাছি রেস্তোরাঁ আমাদের কাছে একটি কনভেনিয়েন্স স্টোরের চেয়ে বেশি মূল্যবান, তাই এটি একটি উচ্চতর মাল্টিপ্লায়ার পায়। এটি আমাদের প্রতিটি ছোট এলাকার জন্য একটি কাস্টম suitability_score প্রদান করে।
এই উদ্ধৃতাংশটি ওয়েটেড স্কোরিং লজিককে তুলে ধরে, যা খোলার সময় যাচাই করার জন্য একটি পূর্ব-গণনাকৃত ফ্ল্যাগ ( is_open_monday_window ) ব্যবহার করে:
. . .
(
COUNTIF('restaurant' IN UNNEST(types) AND is_open_monday_window) * 8 +
COUNTIF('convenience_store' IN UNNEST(types) AND is_open_monday_window) * 3 +
COUNTIF('bar' IN UNNEST(types) AND is_open_monday_window) * 7 +
COUNTIF('tourist_attraction' IN UNNEST(types) AND is_open_monday_window) * 6 +
COUNTIF('casino' IN UNNEST(types) AND is_open_monday_window) * 7
) AS suitability_score
. . .
সম্পূর্ণ কোয়েরির জন্য প্রসারিত করুন।
-- This query calculates a custom 'suitability score' for different areas in the Las Vegas -- metropolitan area to identify prime commercial zones. It uses a weighted model based -- on the density of specific business types that are open during a target time window. -- Step 1: Pre-filter the dataset to only include relevant places. -- This CTE finds all places in our target localities (Las Vegas, Spring Valley, etc.) and -- adds a boolean flag 'is_open_monday_window' for those open during the target time. WITH PlacesInTargetAreaWithOpenFlag AS ( SELECT point, types, EXISTS( SELECT 1 FROM UNNEST(regular_opening_hours.monday) AS monday_hours WHERE monday_hours.start_time <= TIME '10:00:00' AND monday_hours.end_time >= TIME '14:00:00' ) AS is_open_monday_window FROM `places_insights___us.places` WHERE EXISTS ( SELECT 1 FROM UNNEST(locality_names) AS locality WHERE locality IN ('Las Vegas', 'Spring Valley', 'Paradise', 'North Las Vegas', 'Winchester') ) AND administrative_area_level_1_name = 'Nevada' ), -- Step 2: Aggregate the filtered places into H3 cells and calculate the suitability score. -- Each place's location is converted to an H3 index (at resolution 8). The query then -- calculates a weighted 'suitability_score' and individual counts for each business type -- within that cell. TileScores AS ( SELECT WITH AGGREGATION_THRESHOLD -- Convert each place's geographic point into an H3 cell index. `carto-os.carto.H3_FROMGEOGPOINT`(point, 8) AS h3_index, -- Calculate the weighted score based on the count of places of each type -- that are open during the target window. ( COUNTIF('restaurant' IN UNNEST(types) AND is_open_monday_window) * 8 + COUNTIF('convenience_store' IN UNNEST(types) AND is_open_monday_window) * 3 + COUNTIF('bar' IN UNNEST(types) AND is_open_monday_window) * 7 + COUNTIF('tourist_attraction' IN UNNEST(types) AND is_open_monday_window) * 6 + COUNTIF('casino' IN UNNEST(types) AND is_open_monday_window) * 7 ) AS suitability_score, -- Also return the individual counts for each category for detailed analysis. COUNTIF('restaurant' IN UNNEST(types) AND is_open_monday_window) AS restaurant_count, COUNTIF('convenience_store' IN UNNEST(types) AND is_open_monday_window) AS convenience_store_count, COUNTIF('bar' IN UNNEST(types) AND is_open_monday_window) AS bar_count, COUNTIF('tourist_attraction' IN UNNEST(types) AND is_open_monday_window) AS tourist_attraction_count, COUNTIF('casino' IN UNNEST(types) AND is_open_monday_window) AS casino_count FROM -- CHANGED: This now references the CTE with the expanded area. PlacesInTargetAreaWithOpenFlag -- Group by the H3 index to ensure all calculations are per-cell. GROUP BY h3_index ), -- Step 3: Find the maximum suitability score across all cells. -- This value is used in the next step to normalize the scores to a consistent scale (e.g., 0-10). MaxScore AS ( SELECT MAX(suitability_score) AS max_score FROM TileScores ) -- Step 4: Assemble the final results. -- This joins the scored tiles with the max score, calculates the normalized score, -- generates the H3 cell's polygon geometry for mapping, and orders the results. SELECT ts.h3_index, -- Generate the hexagonal polygon for the H3 cell for visualization. `carto-os.carto.H3_BOUNDARY`(ts.h3_index) AS h3_geography, ts.restaurant_count, ts.convenience_store_count, ts.bar_count, ts.tourist_attraction_count, ts.casino_count, ts.suitability_score, -- Normalize the score to a 0-10 scale for easier interpretation. ROUND( CASE WHEN ms.max_score = 0 THEN 0 ELSE (ts.suitability_score / ms.max_score) * 10 END, 2 ) AS normalized_suitability_score FROM -- A cross join is efficient here as MaxScore contains only one row. TileScores ts, MaxScore ms -- Display the highest-scoring locations first. ORDER BY normalized_suitability_score DESC;
মানচিত্রে এই স্কোরগুলো দেখলে বিজয়ী স্থানগুলো স্পষ্টভাবে ফুটে ওঠে। সবচেয়ে গাঢ় বেগুনি রঙের স্থানগুলো, যা মূলত লাস ভেগাস স্ট্রিপ এবং ডাউনটাউনের কাছাকাছি, আমাদের নতুন কফি শপের জন্য সর্বোচ্চ সম্ভাবনাময় এলাকা।

প্রতিযোগী বিশ্লেষণ: বিদ্যমান কফি শপগুলো শনাক্ত করুন
আমাদের উপযুক্ততা মডেলটি সবচেয়ে সম্ভাবনাময় অঞ্চলগুলোকে সফলভাবে চিহ্নিত করেছে, কিন্তু শুধুমাত্র উচ্চ স্কোরই সাফল্যের নিশ্চয়তা দেয় না। এখন আমাদের অবশ্যই এর সাথে প্রতিযোগীদের তথ্য মিলিয়ে দেখতে হবে। আদর্শ অবস্থান হলো এমন একটি উচ্চ-সম্ভাবনাময় এলাকা যেখানে আগে থেকেই কফি শপের ঘনত্ব কম, কারণ আমরা বাজারের একটি সুস্পষ্ট শূন্যস্থান খুঁজছি।
এটি করার জন্য, আমরা PLACES_COUNT_PER_H3 ফাংশনটি ব্যবহার করি। এই ফাংশনটি একটি নির্দিষ্ট ভৌগোলিক এলাকার মধ্যে, H3 সেল অনুযায়ী স্থানের সংখ্যা দক্ষতার সাথে নির্ণয় করার জন্য ডিজাইন করা হয়েছে।
প্রথমে, আমরা পুরো লাস ভেগাস মেট্রো এলাকার ভৌগোলিক অবস্থানকে ডায়নামিকভাবে সংজ্ঞায়িত করি। কোনো একটি নির্দিষ্ট এলাকার উপর নির্ভর না করে, আমরা লাস ভেগাস এবং এর আশেপাশের প্রধান এলাকাগুলোর সীমানা পাওয়ার জন্য পাবলিক ওভারচার ম্যাপস ডেটাসেট থেকে তথ্য সংগ্রহ করি এবং ST_UNION_AGG ব্যবহার করে সেগুলোকে একটি একক পলিগনে একীভূত করি। এরপর আমরা এই এলাকাটিকে ফাংশনের মধ্যে পাঠিয়ে সমস্ত চালু কফি শপের সংখ্যা গণনা করতে বলি।
এই কোয়েরিটি মেট্রো এলাকা নির্ধারণ করে এবং H3 সেলগুলিতে কফি শপের সংখ্যা পাওয়ার জন্য ফাংশনটিকে কল করে:
-- Define a variable to hold the combined geography for the Las Vegas metro area.
DECLARE las_vegas_metro_area GEOGRAPHY;
-- Set the variable by fetching the shapes for the five localities from Overture Maps
-- and merging them into a single polygon using ST_UNION_AGG.
SET las_vegas_metro_area = (
SELECT
ST_UNION_AGG(geometry)
FROM
`bigquery-public-data.overture_maps.division_area`
WHERE
country = 'US'
AND region = 'US-NV'
AND names.primary IN ('Las Vegas', 'Spring Valley', 'Paradise', 'North Las Vegas', 'Winchester')
);
-- Call the PLACES_COUNT_PER_H3 function with our defined area and parameters.
SELECT
*
FROM
`places_insights___us.PLACES_COUNT_PER_H3`(
JSON_OBJECT(
-- Use the metro area geography we just created.
'geography', las_vegas_metro_area,
-- Specify 'coffee_shop' as the place type to count.
'types', ["coffee_shop"],
-- Best practice: Only count places that are currently operational.
'business_status', ['OPERATIONAL'],
-- Set the H3 grid resolution to 8.
'h3_resolution', 8
)
);
ফাংশনটি একটি টেবিল রিটার্ন করে, যাতে H3 সেল ইনডেক্স, তার জ্যামিতি, কফি শপের মোট সংখ্যা এবং তাদের প্লেস আইডিগুলোর একটি নমুনা অন্তর্ভুক্ত থাকে:

সামগ্রিক সংখ্যাটি দরকারি হলেও, প্রকৃত প্রতিযোগীদের দেখাটা অপরিহার্য। এখানেই আমরা প্লেসেস ইনসাইটস ডেটাসেট থেকে প্লেসেস এপিআই -তে স্থানান্তরিত হই। সর্বোচ্চ নর্মালাইজড উপযুক্ততা স্কোরযুক্ত সেলগুলো থেকে sample_place_ids এক্সট্র্যাক্ট করে, আমরা প্লেস ডিটেইলস এপিআই কল করার মাধ্যমে প্রতিটি প্রতিযোগীর নাম, ঠিকানা, রেটিং এবং অবস্থানের মতো বিস্তারিত তথ্য পুনরুদ্ধার করতে পারি।
এর জন্য পূর্ববর্তী কোয়েরির ফলাফল, যেখান থেকে উপযুক্ততা স্কোর তৈরি করা হয়েছিল, এবং PLACES_COUNT_PER_H3 কোয়েরির ফলাফল তুলনা করতে হবে। সর্বোচ্চ নর্মালাইজড উপযুক্ততা স্কোরযুক্ত সেলগুলো থেকে কফি শপের সংখ্যা এবং আইডি পেতে H3 সেল ইনডেক্স ব্যবহার করা যেতে পারে।
এই পাইথন কোডটি দেখায় যে কীভাবে এই তুলনাটি করা যেতে পারে।
# Isolate the Top 5 Most Suitable H3 Cells
top_suitability_cells = gdf_suitability.head(5)
# Extract the 'h3_index' values from these top 5 cells into a list.
top_h3_indexes = top_suitability_cells['h3_index'].tolist()
print(f"The top 5 H3 indexes are: {top_h3_indexes}")
# Now, we find the rows in our DataFrame where the
# 'h3_cell_index' matches one of the indexes from our top 5 list.
coffee_counts_in_top_zones = gdf_coffee_shops[
gdf_coffee_shops['h3_cell_index'].isin(top_h3_indexes)
]
এখন আমাদের কাছে সর্বোচ্চ উপযুক্ততা স্কোর সহ H3 সেলগুলির মধ্যে আগে থেকেই বিদ্যমান কফি শপগুলির প্লেস আইডিগুলির তালিকা রয়েছে, প্রতিটি স্থান সম্পর্কে আরও বিস্তারিত তথ্যের জন্য অনুরোধ করা যেতে পারে।
এটি প্রতিটি প্লেস আইডির জন্য সরাসরি প্লেস ডিটেইলস এপিআই -তে অনুরোধ পাঠিয়ে, অথবা কলটি সম্পাদন করার জন্য একটি ক্লায়েন্ট লাইব্রেরি ব্যবহার করে করা যেতে পারে। মনে রাখবেন, শুধুমাত্র আপনার প্রয়োজনীয় ডেটা অনুরোধ করার জন্য FieldMask প্যারামিটারটি সেট করতে হবে।
অবশেষে, আমরা সবকিছুকে একত্রিত করে একটি একক, শক্তিশালী ভিজ্যুয়ালাইজেশন তৈরি করি। আমরা আমাদের বেগুনি উপযুক্ততা কোরোপ্লেথ মানচিত্রটিকে ভিত্তি স্তর হিসেবে স্থাপন করি এবং তারপর প্লেসেস এপিআই (Places API) থেকে প্রাপ্ত প্রতিটি স্বতন্ত্র কফি শপের জন্য পিন যুক্ত করি। এই চূড়ান্ত মানচিত্রটি একনজরে দেখার মতো একটি চিত্র প্রদান করে যা আমাদের সম্পূর্ণ বিশ্লেষণকে সংশ্লেষণ করে: গাঢ় বেগুনি এলাকাগুলো সম্ভাবনা দেখায়, এবং সবুজ পিনগুলো বর্তমান বাজারের বাস্তবতা তুলে ধরে।

যেসব গাঢ় বেগুনি সেলে খুব কম বা কোনো পিন নেই, সেগুলো খুঁজে আমরা আত্মবিশ্বাসের সাথে সেই সুনির্দিষ্ট এলাকাগুলো চিহ্নিত করতে পারি, যা আমাদের নতুন অবস্থানের জন্য সেরা সুযোগের প্রতিনিধিত্ব করে।

উপরের দুটি সেলের উপযুক্ততার স্কোর বেশ ভালো, কিন্তু সেখানে কিছু স্পষ্ট ফাঁকা জায়গা রয়েছে যা আমাদের নতুন কফি শপের জন্য সম্ভাব্য স্থান হতে পারে।
উপসংহার
এই ডকুমেন্টে, আমরা ‘কোথায় সম্প্রসারণ করা হবে?’— এই রাজ্যব্যাপী প্রশ্ন থেকে সরে এসে একটি ডেটা-সমর্থিত, স্থানীয় উত্তরের দিকে এগিয়েছি। বিভিন্ন ডেটাসেটকে স্তরে স্তরে সাজিয়ে এবং নিজস্ব ব্যবসায়িক লজিক প্রয়োগ করে, আপনি একটি বড় ব্যবসায়িক সিদ্ধান্তের সাথে জড়িত ঝুঁকি পদ্ধতিগতভাবে কমাতে পারেন। BigQuery-এর ব্যাপকতা, Places Insights-এর সমৃদ্ধি এবং Places API-এর রিয়েল-টাইম বিশদ বিবরণকে একত্রিত করে তৈরি এই ওয়ার্কফ্লোটি, কৌশলগত প্রবৃদ্ধির জন্য লোকেশন ইন্টেলিজেন্স ব্যবহার করতে আগ্রহী যেকোনো প্রতিষ্ঠানের জন্য একটি শক্তিশালী টেমপ্লেট প্রদান করে।
পরবর্তী পদক্ষেপ
- আপনার নিজস্ব ব্যবসায়িক যুক্তি, লক্ষ্য ভৌগোলিক অঞ্চল এবং স্বত্বাধিকারযুক্ত ডেটাসেট দিয়ে এই কর্মপ্রবাহটি মানিয়ে নিন।
- আপনার মডেলকে আরও সমৃদ্ধ করতে প্লেসেস ইনসাইটস ডেটাসেটের অন্যান্য ডেটা ফিল্ড, যেমন রিভিউ সংখ্যা, মূল্যস্তর এবং ব্যবহারকারীর রেটিং, খতিয়ে দেখুন।
- এই প্রক্রিয়াটিকে স্বয়ংক্রিয় করে একটি অভ্যন্তরীণ সাইট নির্বাচন ড্যাশবোর্ড তৈরি করুন, যা নতুন বাজারগুলোকে গতিশীলভাবে মূল্যায়ন করতে ব্যবহার করা যাবে।
ডকুমেন্টেশনটি আরও গভীরভাবে দেখুন:
- স্থান সম্পর্কিত অন্তর্দৃষ্টির সংক্ষিপ্ত বিবরণ
- স্থান অন্তর্দৃষ্টি ফাংশন
- বিগকোয়েরি জিওস্পেশিয়াল অ্যানালিটিক্স
- স্থান এপিআই
অবদানকারীরা
হেনরিক ভালভ | ডেভএক্স ইঞ্জিনিয়ার
গুগল কোলাবে চালান
গিটহাবে উৎস দেখুন