পাঠ ০৮ · ৩০-এর মধ্যে · মডিউল ২

Descriptive statistics

Descriptive stats — mean, median, std, IQR
৭ মিনিট পড়া শুরু · Beginner pandas কোডসহ

এই পাঠে যা শিখবেন

  • Mean, median, mode — কখন কোনটা ব্যবহার করতে হয়
  • Std, variance, IQR — spread পরিমাপের তিন উপায়
  • Skewness ও kurtosis — distribution-এর shape বুঝা
  • pandas .describe() দিয়ে এক লাইনে সব stats

১ · কেন descriptive stats?

ভাবুন — Daraz-এর গত মাসের ১০ লাখ অর্ডারের একটি CSV ফাইল আপনার সামনে। সরাসরি প্রতিটি সারি দেখা অসম্ভব। আপনি জানতে চান — "গড় অর্ডার-ভ্যালু কত? সবচেয়ে বড় আর সবচেয়ে ছোট কত? অধিকাংশ অর্ডার কোন range-এ?"। এই প্রশ্নগুলোর উত্তর দেয় descriptive statisticsDescriptive Statisticsডেটাকে সংক্ষিপ্ত সংখ্যায় বর্ণনা করার পদ্ধতি — central tendency, spread, ও shape। Inferential statistics-এর বিপরীত (যা sample থেকে population সম্পর্কে inference করে)।।

তিন প্রশ্ন

১) কোথায় কেন্দ্র? — mean, median, mode।
২) কতটা ছড়ানো? — std, variance, IQR, range।
৩) আকার কী? — skewness (অপ্রতিসাম্য), kurtosis (চূড়াশীর্ণতা)।

এই তিন প্রশ্নের উত্তর জানলে — যেকোনো column সম্পর্কে আপনার মোটামুটি ধারণা হয়ে যাবে। বাকি analysis তো এই ভিত্তির উপরই।

২ · Mean — সরল গড়

MeanArithmetic Meanসব মান যোগ করে সংখ্যা দিয়ে ভাগ। Outlier-এর প্রতি sensitive — একটি বিশাল বা ক্ষুদ্র মান গড়কে টেনে নিতে পারে। হলো "সব যোগ, সংখ্যা দিয়ে ভাগ":

$$\bar{x} = \frac{1}{n} \sum_{i=1}^{n} x_i$$

উদাহরণ: ৫ জন bKash এজেন্টের দৈনিক transaction (BDT): ১২,০০০, ১৫,০০০, ১৮,০০০, ১৪,০০০, ১১,০০০।
Mean $= (১২ + ১৫ + ১৮ + ১৪ + ১১) / ৫ = ৭০ / ৫ = ১৪$ হাজার।

Mean একটি বিশাল outlier-এ ভেঙে পড়ে। যদি একজন এজেন্টের একদিন ৫,০০,০০০ BDT ঢুকে যায় — তাহলে গড় ১.১২ লাখে চলে যাবে, যা বাকি সবার থেকে সম্পূর্ণ ভিন্ন। বাংলাদেশের আয় বণ্টন এই ভুল ব্যবহারের ক্লাসিক উদাহরণ — "মাথাপিছু আয়" বললেই গরিবরা মনে করেন তারা গড়ের নিচে কেন।

৩ · Median — মধ্যবর্তী মান

MedianMedianডেটাকে sort করার পর ঠিক মাঝখানের মান। Outlier-এর প্রতি robust — তাই asymmetric distribution-এ mean-এর চেয়ে নির্ভরযোগ্য। হলো sort করার পর ঠিক মাঝের সংখ্যা। যদি সংখ্যা even হয় — মাঝের দু'টির গড়।

উপরের উদাহরণে sort: ১১, ১২, ১৪, ১৫, ১৮ — মাঝের সংখ্যা ১৪ হাজার।

কখন median ব্যবহার করবেন?

  • আয়, সম্পদ, বাড়ির দাম — সব right-skewed। mean বিভ্রান্তিকর।
  • Order value, click-count, time-on-page — log-normal-এর কাছাকাছি।
  • যেকোনো small-n ডেটা যেখানে একটি অস্বাভাবিক মান থাকতে পারে।
ঢাকার Gulshan ও কড়াইল বস্তি দু'জায়গার বাসিন্দা মিলিয়ে গড় আয় হিসাব করলে — একজন কোটিপতি পুরো গড়কে টেনে তুলবে। কিন্তু median বললে — ৫০% মানুষ এই মান-এর নিচে, ৫০% উপরে — এটা সঠিক ছবি দেয়।

৪ · Mode — সর্বাধিক frequent

ModeModeযে মানটি ডেটায় সবচেয়ে বেশিবার এসেছে। Categorical ডেটার জন্য একমাত্র central tendency। একাধিক mode থাকলে — bimodal বা multimodal distribution। = সবচেয়ে frequent মান। Categorical ডেটার (যেমন: জেলা, পেমেন্ট পদ্ধতি) জন্য একমাত্র central tendency।

Pathao-এর payment method: cash, bKash, Nagad, card — যদি cash সর্বাধিক, তাহলে mode = "cash"। Numerical ডেটায় mode কম useful — কারণ continuous values খুব কমই পুনরাবৃত্ত।

৫ · Variance ও Standard Deviation

Spread পরিমাপের সবচেয়ে জনপ্রিয় উপায় — varianceVarianceপ্রতিটি মান কতটা mean থেকে দূরে — সেই দূরত্ব-এর বর্গের গড়। Std-এর বর্গ। Sample variance-এ n−1 দিয়ে ভাগ (Bessel's correction)। ও standard deviation:

$$\sigma^2 = \frac{1}{n-1} \sum_{i=1}^{n} (x_i - \bar{x})^2 \quad,\quad \sigma = \sqrt{\sigma^2}$$

অর্থ: std মানে — মানগুলো গড়ে কতটা mean থেকে দূরে। ছোট std মানে ডেটা mean-এর কাছাকাছি, বড় std মানে ছড়ানো।

উপরের bKash এজেন্ট-এ:
$\sigma^2 = [(11-14)^2 + (12-14)^2 + (14-14)^2 + (15-14)^2 + (18-14)^2] / 4 = [9 + 4 + 0 + 1 + 16] / 4 = 7.5$
$\sigma = \sqrt{7.5} \approx 2.74$ হাজার।

Bessel's correction: $n-1$ দিয়ে ভাগ (n নয়) — কারণ sample variance population variance-এর underestimate করে। $n-1$ এই bias সংশোধন করে।

৬ · Range ও IQR

Range = max − min। সরল কিন্তু outlier-এ ভাঙে। উপরের উদাহরণে range = ১৮ − ১১ = ৭ হাজার।

IQRInterquartile Range (IQR)৭৫তম percentile (Q3) − ২৫তম percentile (Q1)। মাঝের ৫০% ডেটার spread। Outlier-resistant — boxplot-এর ভিত্তি। = Q3 − Q1 = ৭৫তম percentile − ২৫তম percentile। মাঝের ৫০% ডেটার spread। Outlier-resistant।

Outlier rule: $Q_1 - 1.5 \cdot \text{IQR}$-এর নিচে বা $Q_3 + 1.5 \cdot \text{IQR}$-এর উপরে — outlier হিসেবে চিহ্নিত। boxplot-এর "whisker" এই rule অনুসরণ করে।

৭ · Skewness — অপ্রতিসাম্য

SkewnessSkewnessdistribution কোন দিকে হেলে আছে — তার পরিমাপ। +ve = right tail (ধনাত্মক skew, mean > median); -ve = left tail। Symmetric distribution-এ skewness = 0। জানায় distribution কোন দিকে হেলে। যদি একটি দীর্ঘ "লেজ" ডান দিকে — right-skewed (ধনাত্মক)। যদি বাম দিকে — left-skewed (ঋণাত্মক)।

Right-skewed উদাহরণ: বাংলাদেশের পরিবারগুলোর মাসিক আয়। অধিকাংশ ১০-৩০ হাজারে, কিছু পরিবার লাখে, কিছু কোটিতে। Mean > median।

Left-skewed উদাহরণ: মৃত্যুর বয়স — অধিকাংশ ৭০+ এ মারা যান, কিছু শিশুকালে।

৮ · Kurtosis — চূড়াশীর্ণতা

KurtosisKurtosisdistribution-এর "চূড়া কতটা চূড়াকার এবং tail কতটা ভারী"। Normal-এর kurtosis = 3 (excess kurtosis = 0)। Heavy-tail (leptokurtic) finance/insurance-এ critical — extreme event-এর সম্ভাবনা। বলে — distribution-এর চূড়া কতটা তীক্ষ্ণ এবং tail কতটা ভারী। Normal distribution-এর kurtosis = 3 (excess kurtosis = 0)।

  • Leptokurtic (kurtosis > 3): চূড়া উঁচু, লেজ ভারী — extreme event বেশি। Stock return, insurance claim।
  • Mesokurtic (≈3): normal-এর মতো।
  • Platykurtic (< 3): চ্যাপ্টা — extreme value বিরল।
Descriptive statistics — তিনটি প্রশ্ন center · spread · shape কেন্দ্র কোথায়? mean median mode outlier থাকলে median কতটা ছড়ানো? std / var IQR range robust = IQR আকার কী? skewness kurtosis income → right-skew pandas: df.describe() count, mean, std, min, 25%, 50%, 75%, max এক লাইন → ৮টি sufficient stats
Descriptive stats তিনটি প্রশ্নের উত্তর দেয় — কেন্দ্র, spread, ও আকার। pandas-এর .describe() এক লাইনে আটটি sufficient stats দেয়।

৯ · pandas-এ হাতে-কলমে

চলুন একটি simulated bKash transaction ডেটায় সব stats দেখি।

Python · pandas
import pandas as pd
import numpy as np

# bKash এজেন্ট-এর দৈনিক transaction (BDT, simulated, right-skewed)
np.random.seed(42)
tx = np.random.lognormal(mean=9.5, sigma=0.7, size=200).round(0)
df = pd.DataFrame({"daily_tx": tx})

print(df.describe().round(0))
print(f"\nMean   : {df['daily_tx'].mean():.0f}")
print(f"Median : {df['daily_tx'].median():.0f}")
print(f"Mode   : {df['daily_tx'].mode().iloc[0]:.0f}")
print(f"Std    : {df['daily_tx'].std():.0f}")
print(f"IQR    : {df['daily_tx'].quantile(0.75) - df['daily_tx'].quantile(0.25):.0f}")
print(f"Skew   : {df['daily_tx'].skew():.2f}")
print(f"Kurt   : {df['daily_tx'].kurtosis():.2f}")

    
Output-এ লক্ষ্য করুন — mean > median (right-skew), skewness ধনাত্মক, এবং kurtosis > ৩ (heavy tail)। এটাই বাংলাদেশের আর্থিক ডেটার সাধারণ pattern।

১০ · একাধিক group তুলনা

Python · pandas groupby
import pandas as pd
import numpy as np

np.random.seed(0)
data = pd.DataFrame({
    "city": np.random.choice(["Dhaka", "Chittagong", "Sylhet"], 300),
    "order_bdt": np.random.lognormal(7.5, 0.6, 300).round(0)
})

# প্রতিটি শহরে মূল stats
summary = data.groupby("city")["order_bdt"].agg(
    count="count", mean="mean", median="median",
    std="std", iqr=lambda x: x.quantile(0.75) - x.quantile(0.25)
).round(0)
print(summary)

    
groupby + agg — প্রতিটি শহরের আলাদা summary। Daraz-এর মতো কোম্পানি প্রতিদিন এই pattern ব্যবহার করে — শহরভিত্তিক, বয়সভিত্তিক, ক্যাটেগরিভিত্তিক analysis।

ভাবনার প্রশ্ন

প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।

প্র ০১ বাংলাদেশের "মাথাপিছু আয়" রিপোর্টে সাধারণত mean ব্যবহার হয়। এটি কেন বিভ্রান্তিকর হতে পারে? Median বা trimmed mean কি বেশি সঠিক?

এটি statistics-এর সবচেয়ে বহুল আলোচিত উদাহরণ — এবং দুঃখজনকভাবে public communication-এ সবসময় ভুল হয়।

সমস্যা — আয় বণ্টন right-skewed:

  • বাংলাদেশে অধিকাংশ পরিবার মাসিক ১৫-৪০ হাজার টাকা আয় করে।
  • কিছু পরিবার ১-৫ লাখ। কিছু কোটি টাকা।
  • একজন কোটিপতির আয় ১,০০,০০০ গরিব পরিবারের গড়কেও তুলে ধরে।
  • ফলে — "মাথাপিছু আয় ১৭৭০ ডলার" বললেও — অধিকাংশ পরিবার এর অনেক নিচে।

Median বেশি সঠিক:

  • "৫০% মানুষ এই মান-এর নিচে আয় করে" — clear ও সঠিক ছবি।
  • USA-তে "median household income" বহুল ব্যবহৃত — কারণ এটি typical experience capture করে।
  • বাংলাদেশে BBS-এর HIES survey-এ median income দেওয়া হয়, কিন্তু news-এ rarely highlighted।

Trimmed mean:

  • উপরে ৫% ও নিচে ৫% ফেলে দিয়ে mean — outlier-resistant।
  • Olympics judging score, statistical surveys-এ ব্যবহৃত।
  • Median-এর চেয়ে কিছুটা বেশি information ব্যবহার করে।

আরও বিকল্প — distributional view:

  • Quintiles: "নিচের ২০% মানুষ মোট আয়ের কত %?" — Gini coefficient-এর ভিত্তি।
  • Histogram বা CDF: মানুষ পুরো বণ্টন দেখলে নিজেই বুঝতে পারে।
  • Geometric mean: log-normal data-র জন্য prefer।

Public communication-এর দায়িত্ব: "গড়" সবসময় mean বুঝায় না। যিনি ডেটা দেখান — তার উচিত skewness মাথায় রাখা ও সঠিক metric বাছা। এটাই data literacy-র মূল।

প্র ০২ Pathao-এর আপনার মাসিক ride data দেখাচ্ছে: mean = ৩৫০ BDT, median = ২২০ BDT, mode = ১২০ BDT। এই তিনটি সংখ্যা থেকে কী পড়া যায়? শুধু একটি সংখ্যা দিলে কোনটি বেছে নিতেন?

এই pattern (mean > median > mode) — distributional analysis-এর ক্লাসিক sign।

যা পড়া যায়:

  • Right-skewed distribution: mean > median > mode — তিনটি আলাদা মান। এটি শক্তিশালী indication যে এই data heavily right-skewed।
  • সর্বাধিক সাধারণ ride: ১২০ BDT (mode) — হয়তো বাড়ি থেকে metro station বা কাছের মার্কেট।
  • ৫০% ride: ২২০ BDT-র নিচে (median) — ছোট ও মাঝারি ride।
  • গড়: ৩৫০ BDT — কয়েকটি দীর্ঘ ride (যেমন: airport, intercity) পুরো গড়কে টেনে নিয়েছে।

একটি সংখ্যা দিলে — কোনটি?

  • "গ্রাহক সাধারণত কত খরচ করে?" — median (২২০)। Typical experience।
  • "কোম্পানির গড় revenue per ride?" — mean (৩৫০)। মোট revenue হিসাবের জন্য।
  • "সবচেয়ে frequent ride কত?" — mode (১২০)। Pricing strategy-র জন্য।

আমার বাছাই: Public communication-এ — median। কারণ একজন user-এর "typical experience" এটাই। "Pathao-এ গড় ride ৩৫০ টাকা" শুনলে নতুন user মনে করবে এটাই দাম — কিন্তু ৫০% ride আসলে ২২০-এর নিচে।

আদর্শ answer — তিনটি দেওয়া: "অর্ধেক ride ২২০-এর নিচে; সবচেয়ে frequent ১২০; গড় ৩৫০ (দীর্ঘ ride-এর কারণে)।" — পূর্ণ ছবি।

মূল উপলব্ধি: একটি সংখ্যা একটি story বলে — তিনটি একটি truth। যদি আপনি বুঝান, ব্যবসায়িক siliconer (যেমন CEO) সাধারণত এই subtlety care করেন না — তাই data scientist হিসেবে আপনাকেই সঠিক metric বেছে দিতে হবে।

প্র ০৩ Std ও IQR দু'টোই spread পরিমাপ করে। কখন কোনটা — এবং দু'টোর মধ্যে গাণিতিক সম্পর্ক কী normal distribution-এ?

এটি practitioner-দের একটি common confusion। দুই metric-এর মধ্যে নির্বাচনে data-র shape ও use-case গুরুত্বপূর্ণ।

Std কখন:

  • Distribution মোটামুটি symmetric/normal — height, weight, IQ, exam score।
  • আপনি statistical test (t-test, ANOVA) করবেন — সব std-ভিত্তিক।
  • মডেল পরবর্তী stage-এ standardization (z-score) দরকার।

IQR কখন:

  • Distribution skewed বা outlier-prone — income, transaction amount, rides per user।
  • আপনি boxplot draw করবেন — IQR-ই whisker rule-এর ভিত্তি।
  • Robust description দরকার — outlier-এ ভাঙবে না।

Normal-এ গাণিতিক সম্পর্ক:

  • পুরোপুরি normal distribution-এ — IQR ≈ 1.349 × σ।
  • অর্থাৎ — যদি std = ১০, তাহলে IQR ≈ ১৩.৫।
  • উল্টোটা: σ ≈ IQR / 1.349।

Robust std estimate:

  • "Median Absolute Deviation" (MAD) — outlier-resistant std proxy: $\sigma \approx 1.4826 \times \text{MAD}$।
  • Outlier-heavy data-তে preferred।

Practical rule:

  • EDA-এর শুরুতে দু'টোই দেখুন। যদি std ≈ 1.349 × IQR — distribution মোটামুটি normal।
  • যদি std অনেক বেশি — outlier আছে, std overestimate করছে।
  • যদি std অনেক কম — heavily clustered, কিছু outlier দূরে।

মূল উপলব্ধি: Std math-friendly কিন্তু fragile; IQR robust কিন্তু কম মার্জিত। Production data scientist দু'টিই reach-এ রাখেন — ঠিক যেমন ছুতার hammer ও screwdriver দু'টিই।

প্র ০৪ আপনি একটি e-commerce ক্লায়েন্টকে monthly report দিচ্ছেন। তারা প্রতিদিন একটি customer dashboard দেখে। কোন ৫টি descriptive stat highlight করবেন? প্রতিটির justification কী?

Dashboard design-এ KPI selection — data scientist-এর সবচেয়ে গুরুত্বপূর্ণ communication skill।

আমার বাছাই — ৫টি stat:

  1. Median order value (BDT): "Typical order কত?" — pricing ও positioning-এর জন্য সবচেয়ে গুরুত্বপূর্ণ। Mean বিভ্রান্ত করবে।
  2. Total revenue (sum): "ব্যবসা কেমন?" — board-room metric। Sum হলো আসল bottom line।
  3. Daily active users (count of unique): Engagement-এর primary metric। Trend গুরুত্বপূর্ণ।
  4. ৯০-percentile delivery time: "৯০% delivery কত সময়ে?" — customer experience-এর reliability metric। Mean delivery time অসত্য — কারণ একটি দেরিতে delivery অনেককে frustrate করে।
  5. Cart abandonment rate: "শতকরা কতজন cart-এ যোগ করে কিন্তু কিনে না?" — funnel optimization-এর key signal।

কেন এগুলো — context-অনুযায়ী:

  • Mean নয় কেন? — order value heavily right-skewed, একটি ১ লাখ টাকার ফোন দিনের গড় বদলে দেয়।
  • ৯০-percentile কেন? — delivery promise টিকিয়ে রাখা business-critical। p50 ভালো হলেও p90 খারাপ হলে angry customers।
  • Cart abandonment কেন? — সম্ভাব্য revenue-র সবচেয়ে বড় leak।

যা যোগ করতে পারেন (depending on biz):

  • Repeat purchase rate: 30-day retention।
  • Average basket size: items per order।
  • Refund/return rate: product-quality signal।
  • NPS: qualitative customer satisfaction।

Anti-pattern এড়ান:

  • Vanity metrics: "total signups" without "active users"।
  • "Average rating" without distribution — ৪.৫ মানে অনেকগুলো ৫ + কয়েকটি ১।
  • একই KPI এ অনেক stat — clutter।

মূল কথা: Dashboard "less is more"। ৫টি ভালোভাবে বেছে নেওয়া metric — ৫০টি random metric-এর চেয়ে অনেক বেশি কার্যকর। বাছাইতে context, skewness, ও business priority — সবই মাথায় রাখুন।

অনুশীলন

  1. হিসাব করুন: ৭ জন ছাত্রের পরীক্ষার নম্বর: ৬০, ৭৫, ৮০, ৬৫, ৯০, ৭০, ৩০।
    • Mean, median, mode কত?
    • Range ও std কত? (শূন্য দশমিকে)
    • ৩০-কে outlier হিসেবে ফেললে কোন stat সবচেয়ে বেশি বদলাবে?
    • Sum = ৪৭০, mean = ৪৭০/৭ ≈ ৬৭.১
    • Sort: ৩০, ৬০, ৬৫, ৭০, ৭৫, ৮০, ৯০। Median = ৭০। Mode = nan (সব unique)।
    • Range = ৯০ − ৩০ = ৬০।
    • Std ≈ ১৯.৭ (n−1 দিয়ে ভাগ)।
    • ৩০ ফেললে — mean বেশি বদলাবে (≈ ৭৩.৩); median সামান্য (৭২.৫)। Std অনেক কমে আসবে। এটাই median-এর robustness।
  2. pandas-এ চেষ্টা: উপরের সংখ্যাগুলো একটি Series-এ ঢুকিয়ে .describe() ও .skew() চালান। কী দেখলেন?
    import pandas as pd
    s = pd.Series([60, 75, 80, 65, 90, 70, 30])
    print(s.describe())
    print(f"skew = {s.skew():.2f}")

    Output-এ skew ঋণাত্মক হবে (left-skewed) — কারণ ৩০ একটি দূরবর্তী ছোট মান। mean < median এই skew-র লক্ষণ।

  3. ভাবুন: bKash dashboard-এ আপনি ৫টি descriptive stat দেখাতে চান প্রতিদিনের transaction-এর উপর। কোন ৫টি বাছবেন এবং কেন?

    প্র ০৪-এর উত্তরে details আছে। সংক্ষেপে — total volume (sum), median tx, p99 tx (large transfer detect), unique active users, ও failed-tx rate। প্রতিটির আলাদা business purpose।

আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ

কোড রানার কাজ না করলে? ব্রাউজারে কাজ না করলে Google Colab ব্যবহার করুন — Google-এর ফ্রি অনলাইন Python পরিবেশ, শুধু Gmail অ্যাকাউন্ট লাগে।
পূর্ববর্তী পাঠ
পাঠ ০৭ · API ও web scraping