অধ্যায় 4 · পরিসংখ্যান: সৎভাবে ডেটা পড়া
ডিস্ট্রিবিউশন, নরমাল কার্ভ ও ফিচার স্কেলিং
- পৃষ্ঠা 10 / 17
- 3 মিনিট পড়া
ডিস্ট্রিবিউশন বলে কোন মানগুলো সম্ভব আর প্রতিটা কতবার আসে। একটা নিরপেক্ষ ছক্কা ছুড়লে পাওয়া যায় ইউনিফর্ম ডিস্ট্রিবিউশন: প্রতিটা দিক সমান সম্ভাব্য। উচ্চতা, মাপের ভুল আর অনেক ছোট প্রভাব যোগ হয়ে আসা আরও অনেক কিছু মেনে চলে নরমাল ডিস্ট্রিবিউশন, বিখ্যাত ঘণ্টা আকৃতির কার্ভ।
নরমাল ডিস্ট্রিবিউশন
দুটো সংখ্যাই একটা নরমাল ডিস্ট্রিবিউশনকে পুরো বর্ণনা করে: গড় (কেন্দ্র) আর স্ট্যান্ডার্ড ডেভিয়েশন (প্রস্থ)। আর এটা একটা নির্ভরযোগ্য নিয়ম মেনে চলে, যা ১,০০,০০০টা উচ্চতা সিমুলেট করে যাচাই করা যায়:
import numpy as np
rng = np.random.default_rng(42)
heights = rng.normal(loc=165, scale=7, size=100_000) # গড় ১৬৫ সেমি, std ৭ সেমি
mean, std = heights.mean(), heights.std()
print(f"mean {mean:.1f}, std {std:.2f}")
for k in [1, 2, 3]:
inside = np.mean(np.abs(heights - mean) < k * std)
print(f"within {k} std: {inside:.1%}")mean 165.0, std 7.03
within 1 std: 68.4%
within 2 std: 95.4%
within 3 std: 99.7%| এর মধ্যে… | ডেটার অংশ | উচ্চতার জন্য (গড় ১৬৫, std ৭) |
|---|---|---|
| ১ স্ট্যান্ডার্ড ডেভিয়েশন | প্রায় ৬৮% | ১৫৮–১৭২ সেমি |
| ২ স্ট্যান্ডার্ড ডেভিয়েশন | প্রায় ৯৫% | ১৫১–১৭৯ সেমি |
| ৩ স্ট্যান্ডার্ড ডেভিয়েশন | প্রায় ৯৯.৭% | ১৪৪–১৮৬ সেমি |
তাই গড় থেকে ৩ স্ট্যান্ডার্ড ডেভিয়েশনের বেশি দূরের কিছু খুবই বিরল — অস্বাভাবিকতা চিহ্নিত করার এটা একটা সহজ উপায়, যেমন API এররের হঠাৎ লাফ বা অস্বাভাবিক একটা লেনদেন।
সবকিছু নরমাল নয়। আয়, উত্তরের সময় (পাতা ৯) আর শব্দের ব্যবহারের হার ডানদিকে লম্বা লেজওয়ালা: বেশিরভাগ মান ছোট, কয়েকটা বিশাল। ঘণ্টা কার্ভ ধরে নেওয়ার আগে সবসময় ডেটাটা দেখুন (একটা হিস্টোগ্রাম, AI-এর জন্য Python-এর পাতা ১৫)।
z-স্কোর আর স্ট্যান্ডার্ডাইজেশন
z-স্কোর বলে একটা মান গড় থেকে কত স্ট্যান্ডার্ড ডেভিয়েশন দূরে: z = (x − mean) / std। পুরো একটা ফিচারকে z-স্কোরে বদলানোকে বলে স্ট্যান্ডার্ডাইজেশন। এরপর প্রতিটা ফিচারের গড় ০ আর স্ট্যান্ডার্ড ডেভিয়েশন ১, মূল একক যা-ই হোক:
import numpy as np
# খুব আলাদা মাপের দুটো ফিচার
salary = np.array([25_000, 40_000, 55_000, 120_000]) # মাসে টাকা
age = np.array([22, 30, 41, 35]) # বছর
def standardise(x):
return (x - x.mean()) / x.std()
print(standardise(salary).round(2))
print(standardise(age).round(2))
print(standardise(salary).mean().round(2), standardise(salary).std().round(2))[-0.97 -0.55 -0.14 1.66]
[-1.44 -0.29 1.29 0.43]
0.0 1.0বেতন (হাজারের ঘরে) আর বয়স (দশের ঘরে) এখন একই মাপকাঠিতে। এটা না করলে দূরত্বভিত্তিক মডেল আর গ্রেডিয়েন্ট ডিসেন্ট বেতনকে শত গুণ বেশি গুরুত্বপূর্ণ ধরত, শুধু তার সংখ্যাগুলো বড় বলে — পাতা ২-এর ফ্ল্যাটগুলোতে যে সমস্যা দেখেছেন। পাইপলাইনের ভেতরে scikit-learn-এর StandardScaler ঠিক এটাই করে।
নিজে চেষ্টা করুন
- গড় ১৬৫ আর স্ট্যান্ডার্ড ডেভিয়েশন ৭ হলে ১৮৬ সেমি উচ্চতার z-স্কোর কত?
rng.integers(1, 7, ...)দিয়ে ছক্কার ১,০০,০০০টা চাল সিমুলেট করুন। এটা কি নরমাল? ১ স্ট্যান্ডার্ড ডেভিয়েশনের মধ্যে কত অংশ, যাচাই করুন।- পাতা ২-এর ফ্ল্যাটগুলো স্ট্যান্ডার্ডাইজ করে আবার দূরত্ব হিসাব করুন। এখন কোন ফ্ল্যাট A-এর সবচেয়ে কাছে?