Header Ads

Header ADS

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:
"ঢাকায় ৳৩ লাখ আয় হলো এই মাসে" ✅


Powered by Blogger.