Metrics এবং Dimensions
Metrics এবং Dimensions — সম্পূর্ণ ব্যাখ্যা 📖
১. আগে একটা Real Story দিয়ে শুরু করি
🏪 ধরো তুমি FoodBD App এর Data Analyst
Manager তোমাকে বললো —
"এই মাসের sales report দাও।"
তুমি বললে —
"এই মাসে মোট ৳৫,০০,০০০ revenue হয়েছে।"
Manager বললো —
"শুধু total জানলে হবে না। ঢাকায় কত? চট্টগ্রামে কত? Food category তে কত? Weekend এ কত? Weekday এ কত?"
এখানে:
৳৫,০০,০০০ Revenue → এটা হলো METRIC
(সংখ্যা, measure করা যায়)
ঢাকা/চট্টগ্রাম → এটা হলো DIMENSION
City (category, ভাগ করা যায়)
Food Category → এটা হলো DIMENSION
Weekend/Weekday → এটা হলো DIMENSION
Metric দিয়ে জানি "কত" — Dimension দিয়ে জানি "কোথায়/কীভাবে/কখন"।
২. Metric কী? (Definition)
Metric হলো এমন কিছু যা সংখ্যায় measure করা যায়। এটা দিয়ে business এর performance বোঝা যায়।
সহজ ভাষায়:
Metric = সংখ্যা = পরিমাপ করা যায়
Examples:
→ মোট Orders = ১,৫০০
→ Total Revenue = ৳৫,০০,০০০
→ New Users = ৩,০০০
→ Average Order Value = ৳৩৩৩
→ Conversion Rate = ৫%
Metric এর বৈশিষ্ট্য:
✅ সবসময় একটা সংখ্যা
✅ Calculate করা যায় (sum, average, count)
✅ বাড়া বা কমা track করা যায়
✅ দুইটা সময়ের মধ্যে compare করা যায়
৩. Dimension কী? (Definition)
Dimension হলো এমন কিছু যা দিয়ে data কে ভাগ করা যায় বা categorize করা যায়। এটা সংখ্যা না, বরং category বা label।
সহজ ভাষায়:
Dimension = Category = ভাগ করার উপায়
Examples:
→ City : ঢাকা, চট্টগ্রাম, সিলেট
→ Platform : Android, iOS, Web
→ Category : Food, Grocery, Medicine
→ Day Type : Weekend, Weekday
→ Gender : Male, Female, Other
Dimension এর বৈশিষ্ট্য:
✅ সবসময় একটা label বা category
✅ Calculate করা যায় না (sum/average হয় না)
✅ Data কে group করতে use হয়
✅ Filter করতে use হয়
৪. দুইটার পার্থক্য — একদম Clear করি
🍔 FoodBD App এর একটা Order এর কথা ধরো:
একটা Order এর সব information:
┌─────────────────────────────────────────────────┐
│ Order ID : 10234 │
│ Customer : রহিম │
│ City : ঢাকা ← DIMENSION │
│ Platform : Android ← DIMENSION │
│ Food Category : Burger ← DIMENSION │
│ Order Date : 2024-01-15 ← DIMENSION │
│ Day Type : Weekday ← DIMENSION │
│ Order Amount : ৳৩৫০ ← METRIC │
│ Delivery Time : ৩০ min ← METRIC │
│ Discount : ৳৫০ ← METRIC │
│ Final Amount : ৳৩০০ ← METRIC │
└─────────────────────────────────────────────────┘
পার্থক্য দেখো:
┌──────────────────┬─────────────────────────────────┐
│ METRIC │ DIMENSION │
├──────────────────┼─────────────────────────────────┤
│ সংখ্যা │ Category/Label │
│ ৳৩৫০ Amount │ "ঢাকা" City │
│ ৩০ min Delivery │ "Android" Platform │
│ ৳৫০ Discount │ "Burger" Category │
│ │ "Weekday" Day Type │
├──────────────────┼─────────────────────────────────┤
│ Sum করা যায় │ Sum করা যায় না │
│ Average হয় │ Average হয় না │
│ Count করা যায় │ Group করা যায় │
├──────────────────┼─────────────────────────────────┤
│ "কত?" │ "কোথায়? কখন? কীভাবে? কে?" │
└──────────────────┴─────────────────────────────────┘
৫. Real Life Examples দিয়ে আরো পরিষ্কার করি
Example 1 — School Result
একজন Student এর Result:
Dimension → নাম : রহিম
Dimension → Class : Class 10
Dimension → Section : A
Dimension → Subject : Math
Dimension → Shift : Morning
Metric → Marks : ৮৫
Metric → Grade : A+ (এটা আসলে দুটোই হতে পারে)
Metric → Rank : ৩
প্রশ্ন: Math এ সবার average marks কত?
→ Marks (Metric) কে Subject = Math (Dimension) দিয়ে filter করো
Example 2 — Pathao Ride
একটা Ride এর তথ্য:
Dimension → City : ঢাকা
Dimension → Zone : মিরপুর
Dimension → Rider Type : Regular
Dimension → Vehicle : Bike
Dimension → Time Slot : Morning Rush
Metric → Fare : ৳৮০
Metric → Distance : ৫ km
Metric → Duration : ২৫ min
Metric → Rating : ৪.৫
প্রশ্ন: মিরপুরে Bike ride এর average fare কত?
→ Fare (Metric) কে Zone=মিরপুর, Vehicle=Bike (Dimension) দিয়ে filter করো
Example 3 — Bkash Transaction
একটা Transaction এর তথ্য:
Dimension → Transaction Type : Send Money
Dimension → User Type : Regular User
Dimension → Division : Dhaka
Dimension → Device : Android
Dimension → Time : Night (10pm-12am)
Metric → Amount : ৳৫,০০০
Metric → Fee : ৳৫
Metric → Processing Time : ২ sec
প্রশ্ন: রাতে Send Money তে average amount কত?
→ Amount (Metric) কে Type=Send Money, Time=Night (Dimension) দিয়ে filter করো
৬. Metric এর প্রকারভেদ
Type 1 — Count Metric
মোট সংখ্যা গণনা করা।
Example:
→ Total Orders = ১,৫০০
→ Total Users = ১০,০০০
→ Total Clicks = ৫,০০০
SQL: COUNT(*)
Type 2 — Sum Metric
মোট যোগফল।
Example:
→ Total Revenue = ৳৫,০০,০০০
→ Total Discount = ৳৫০,০০০
SQL: SUM(amount)
Type 3 — Average Metric
গড় মান।
Example:
→ Average Order Value = ৳৩৩৩
→ Average Delivery Time = ৩৫ min
SQL: AVG(amount)
Type 4 — Ratio/Rate Metric
দুইটা সংখ্যার অনুপাত।
Example:
→ Conversion Rate = Converted / Total × ১০০
→ CTR = Clicks / Impressions × ১০০
→ QRR = Qualified / Total × ১০০
SQL: SUM(x) / SUM(y) * 100
Type 5 — Derived Metric
দুই বা তার বেশি Metric মিলিয়ে বানানো।
Example:
→ Revenue per User = Total Revenue / Total Users
→ RPQR = Revenue / Qualified Referrals
→ CPC = Ad Spend / Clicks
SQL: SUM(revenue) / COUNT(DISTINCT user_id)
৭. Dimension এর প্রকারভেদ
Type 1 — Categorical Dimension
নির্দিষ্ট কিছু category।
Example:
→ Platform : Android, iOS, Web
→ Status : Active, Inactive
→ Gender : Male, Female
SQL: WHERE platform = 'Android'
Type 2 — Geographic Dimension
জায়গা বা location সম্পর্কিত।
Example:
→ Country : Bangladesh, India
→ Division : Dhaka, Chittagong
→ City : Mirpur, Dhanmondi
SQL: GROUP BY city
Type 3 — Time Dimension
সময় সম্পর্কিত।
Example:
→ Date : 2024-01-15
→ Month : January
→ Quarter : Q1
→ Day Type : Weekend/Weekday
→ Time Slot : Morning/Evening
SQL: DATE_TRUNC('month', created_at)
Type 4 — Behavioral Dimension
User এর behavior সম্পর্কিত।
Example:
→ User Type : New User, Returning User
→ Order Count : First Order, Repeat Order
→ Loyalty : Bronze, Silver, Gold
SQL: CASE WHEN order_count = 1 THEN 'New' ELSE 'Returning' END
৮. Metric + Dimension = Meaningful Insight
Metric একা কিছু বলে না। Dimension দিলেই কাজের কথা বলে।
❌ শুধু Metric:
"Revenue = ৳৫,০০,০০০"
→ এটা দিয়ে কোনো decision নেওয়া যায় না।
✅ Metric + Dimension:
"ঢাকায় Revenue = ৳৩,০০,০০০" (City Dimension)
"চট্টগ্রামে Revenue = ৳১,৫০,০০০" (City Dimension)
"অন্যত্র Revenue = ৳৫০,০০০"
→ এখন বোঝা যাচ্ছে ঢাকায় focus করা দরকার।
→ এটা একটা actionable insight!
৯. SQL দিয়ে Metric + Dimension ব্যবহার
Query 1 — City Dimension দিয়ে Revenue Metric দেখো
-- Dimension: City
-- Metric: Revenue, Order Count, Avg Order Value
SELECT
city AS dimension_city,
COUNT(*) AS total_orders,
SUM(order_amount) AS total_revenue,
ROUND(AVG(order_amount), 2) AS avg_order_value
FROM orders
WHERE created_at >= NOW() - INTERVAL '30 days'
GROUP BY city
ORDER BY total_revenue DESC;
Output:
dimension_city | total_orders | total_revenue | avg_order_value
---------------|--------------|---------------|----------------
ঢাকা | 8000 | 400000.00 | 50.00
চট্টগ্রাম | 3000 | 150000.00 | 50.00
সিলেট | 1500 | 60000.00 | 40.00
রাজশাহী | 800 | 28000.00 | 35.00
Query 2 — Time Dimension দিয়ে দেখো
-- Dimension: Month
-- Metric: Revenue, Orders
SELECT
TO_CHAR(created_at, 'YYYY-MM') AS dimension_month,
COUNT(*) AS total_orders,
SUM(order_amount) AS total_revenue
FROM orders
WHERE created_at >= NOW() - INTERVAL '6 months'
GROUP BY TO_CHAR(created_at, 'YYYY-MM')
ORDER BY dimension_month;
Output:
dimension_month | total_orders | total_revenue
----------------|--------------|---------------
2024-08 | 5000 | 250000.00
2024-09 | 5500 | 275000.00
2024-10 | 6000 | 300000.00
2024-11 | 7000 | 385000.00
2024-12 | 9000 | 540000.00 ← Eid/Holiday effect
2025-01 | 6500 | 325000.00
Query 3 — Multiple Dimensions একসাথে
-- Dimension: City + Platform
-- Metric: Revenue
SELECT
city AS dimension_city,
platform AS dimension_platform,
COUNT(*) AS total_orders,
SUM(order_amount) AS total_revenue,
ROUND(AVG(order_amount), 2) AS avg_order_value
FROM orders
WHERE created_at >= NOW() - INTERVAL '30 days'
GROUP BY city, platform
ORDER BY total_revenue DESC;
Output:
dimension_city | dimension_platform | total_orders | total_revenue | avg_order_value
---------------|-------------------|--------------|---------------|----------------
ঢাকা | Android | 5000 | 250000.00 | 50.00
ঢাকা | iOS | 2000 | 120000.00 | 60.00
চট্টগ্রাম | Android | 2000 | 80000.00 | 40.00
ঢাকা | Web | 1000 | 30000.00 | 30.00
চট্টগ্রাম | iOS | 800 | 40000.00 | 50.00
ঢাকায় iOS user রা বেশি টাকা খরচ করছে। চট্টগ্রামে Android এ focus করা দরকার।
Query 4 — Behavioral Dimension
-- New User vs Returning User এর Revenue compare করো
SELECT
CASE
WHEN order_count = 1 THEN 'New User'
WHEN order_count BETWEEN 2 AND 5 THEN 'Regular User'
ELSE 'Loyal User'
END AS dimension_user_type,
COUNT(DISTINCT o.user_id) AS total_users,
COUNT(*) AS total_orders,
SUM(o.order_amount) AS total_revenue,
ROUND(AVG(o.order_amount), 2) AS avg_order_value
FROM orders o
JOIN (
SELECT
user_id,
COUNT(*) AS order_count
FROM orders
GROUP BY user_id
) user_stats ON user_stats.user_id = o.user_id
WHERE o.created_at >= NOW() - INTERVAL '30 days'
GROUP BY
CASE
WHEN order_count = 1 THEN 'New User'
WHEN order_count BETWEEN 2 AND 5 THEN 'Regular User'
ELSE 'Loyal User'
END
ORDER BY total_revenue DESC;
Output:
dimension_user_type | total_users | total_orders | total_revenue | avg_order_value
--------------------|-------------|--------------|---------------|----------------
Loyal User | 1000 | 8000 | 480000.00 | 60.00
Regular User | 3000 | 6000 | 240000.00 | 40.00
New User | 5000 | 5000 | 150000.00 | 30.00
Loyal User রা বেশি টাকা খরচ করে। তাদের retain করা সবচেয়ে important।
১০. Python দিয়ে Metric + Dimension Analyze করা
import pandas as pd
import psycopg2
conn = psycopg2.connect(
host="your-host",
database="your_db",
user="your_user",
password="your_password"
)
query = """
SELECT
city,
platform,
food_category,
CASE
WHEN EXTRACT(DOW FROM created_at) IN (0,6)
THEN 'Weekend'
ELSE 'Weekday'
END AS day_type,
order_amount,
created_at
FROM orders
WHERE created_at >= NOW() - INTERVAL '30 days'
"""
df = pd.read_sql(query, conn)
conn.close()
# =============================================
# METRIC এর সংজ্ঞা
# =============================================
def calculate_metrics(dataframe):
return {
'total_orders' : len(dataframe),
'total_revenue' : dataframe['order_amount'].sum(),
'avg_order_value' : dataframe['order_amount'].mean().round(2),
'max_order' : dataframe['order_amount'].max(),
'min_order' : dataframe['order_amount'].min()
}
# =============================================
# DIMENSION 1 — City
# =============================================
print("===== Revenue by City (Geographic Dimension) =====")
city_analysis = df.groupby('city').apply(
lambda x: pd.Series(calculate_metrics(x))
).reset_index()
print(city_analysis.sort_values('total_revenue',
ascending=False
).to_string(index=False))
# =============================================
# DIMENSION 2 — Platform
# =============================================
print("\n===== Revenue by Platform (Categorical Dimension) =====")
platform_analysis = df.groupby('platform').apply(
lambda x: pd.Series(calculate_metrics(x))
).reset_index()
print(platform_analysis.sort_values('total_revenue',
ascending=False
).to_string(index=False))
# =============================================
# DIMENSION 3 — Day Type
# =============================================
print("\n===== Revenue by Day Type (Time Dimension) =====")
daytype_analysis = df.groupby('day_type').apply(
lambda x: pd.Series(calculate_metrics(x))
).reset_index()
print(daytype_analysis.to_string(index=False))
# =============================================
# MULTIPLE DIMENSIONS — City + Platform
# =============================================
print("\n===== City + Platform (Multiple Dimensions) =====")
multi_dim = df.groupby(['city', 'platform']).agg(
total_orders = ('order_amount', 'count'),
total_revenue = ('order_amount', 'sum'),
avg_order_value = ('order_amount', 'mean')
).round(2).reset_index()
print(multi_dim.sort_values('total_revenue',
ascending=False
).head(10).to_string(index=False))
Output:
===== Revenue by City (Geographic Dimension) =====
city total_orders total_revenue avg_order_value
ঢাকা 8000 400000.00 50.00
চট্টগ্রাম 3000 150000.00 50.00
সিলেট 1500 60000.00 40.00
===== Revenue by Platform (Categorical Dimension) =====
platform total_orders total_revenue avg_order_value
Android 7000 315000.00 45.00
iOS 3500 210000.00 60.00
Web 2000 75000.00 37.50
===== Revenue by Day Type (Time Dimension) =====
day_type total_orders total_revenue avg_order_value
Weekday 7500 337500.00 45.00
Weekend 5000 262500.00 52.50
===== City + Platform (Multiple Dimensions) =====
city platform total_orders total_revenue avg_order_value
ঢাকা Android 5000 250000.00 50.00
ঢাকা iOS 2000 120000.00 60.00
চট্টগ্রাম Android 2000 80000.00 40.00
১১. Superset এ Metric + Dimension
Superset এ যেকোনো chart বানানোর সময়:
X-axis বা Group By = DIMENSION দাও
→ City, Platform, Month, Category
Y-axis বা Metric = METRIC দাও
→ SUM(revenue), COUNT(*), AVG(amount)
Example:
Bar Chart:
→ X-axis : City (Dimension)
→ Y-axis : SUM(order_amount) (Metric)
Line Chart:
→ X-axis : Month (Time Dimension)
→ Y-axis : COUNT(*) Orders (Metric)
Pie Chart:
→ Slice : Platform (Dimension)
→ Value : SUM(revenue) (Metric)
১২. Common Mistakes ⚠️
| Mistake | সমস্যা | সমাধান |
|---|---|---|
| Dimension কে Metric মনে করা | City কে average করার চেষ্টা | City = label, average হয় না |
| শুধু Metric দেখা | "Revenue ৳৫লাখ" — কোনো insight নেই | সবসময় Dimension দিয়ে breakdown করো |
| বেশি Dimension একসাথে | Data বুঝতে কঠিন হয় | একবারে ২-৩ টার বেশি dimension না |
| Time Dimension ignore করা | Trend বোঝা যায় না | সবসময় time breakdown রাখো |
সারসংক্ষেপ 🎯
| বিষয় | Metric | Dimension |
|---|---|---|
| কী | সংখ্যা | Category/Label |
| Example | Revenue, Orders, CTR | City, Platform, Date |
| SQL এ | SUM, COUNT, AVG | GROUP BY, WHERE |
| প্রশ্নের উত্তর | "কত?" | "কোথায়? কখন? কীভাবে?" |
| একা কি useful? | না | না |
| একসাথে | ✅ Powerful Insight | ✅ Powerful Insight |
এক কথায় মনে রাখো 🧠
Metric = "কত টাকা আয় হলো?" (সংখ্যা)
Dimension = "কোন শহরে আয় হলো?" (category)
দুইটা মিলিয়েই তৈরি হয় Insight:
"ঢাকায় ৳৩ লাখ আয় হলো এই মাসে" ✅