আগের আলোচনায় আমরা ডেটার কেন্দ্রীয় মান (Mean, Median, Mode) খুঁজে বের করা শিখেছি। কিন্তু ডেটার সম্পূর্ণ চিত্র বোঝার জন্য শুধু কেন্দ্রীয় মান জানাই যথেষ্ট নয়। আমাদের জানতে হবে ডেটাগুলো সেই কেন্দ্রীয় মানের চারপাশে কীভাবে ছড়িয়ে বা বিস্তৃত হয়ে আছে। এই বিস্তার পরিমাপ করার পদ্ধতিগুলোকেই বলা হয় Measures of Dispersion বা Measures of Spread।
সহজ একটি উদাহরণ দিই। ধরুন, দুটি ক্লাসের ছাত্রদের পরীক্ষার গড় নম্বর ৬০। প্রথম ক্লাসে সবাই ৫৫ থেকে ৬৫ এর মধ্যে নম্বর পেয়েছে। দ্বিতীয় ক্লাসে কিছু ছাত্র ৯০ পেয়েছে, আবার কিছু ছাত্র ৩০ পেয়েছে। যদিও দুটি ক্লাসের গড় একই, তাদের নম্বরের বিস্তার বা ছড়িয়ে থাকার ধরণ সম্পূর্ণ আলাদা। এই পার্থক্যটাই আমরা Measures of Dispersion দিয়ে পরিমাপ করি। চলুন, সবচেয়ে প্রচলিত ৫টি পদ্ধতি সম্পর্কে জেনে নেওয়া যাক।
পরিসর (Range)
পরিসর (Range) হলো ডেটাসেটের সর্বোচ্চ এবং সর্বনিম্ন মানের মধ্যে পার্থক্য (অর্থাৎ, সবচেয়ে বড় সংখ্যাটি থেকে সবচেয়ে ছোট সংখ্যাটি বাদ দেওয়া)। রেঞ্জ নির্ণয় করার জন্য:
- প্রথমে ডেটাসেট থেকে সবচেয়ে বড় এবং সবচেয়ে ছোট সংখ্যাটি নির্ধারণ করুন।
- তারপর বড় সংখ্যাটি থেকে ছোট সংখ্যাটি বিয়োগ করুন।
পরিসর (Range) গাণিতিকভাবে নির্ণয় করতে, আপনাকে কেবল ডেটাসেটের ছোট থেকে বড় ক্রমে সাজানো মান নির্ধারণ করতে হবে এবং তারপর বিয়োগ করে পার্থক্যটি বের করতে হবে (উদাহরণস্বরূপ, শুরুতেই সংখ্যাগুলিকে আরোহী ক্রমে সাজালে পরিসর গণনা করা খুব সহজ হয়ে যায়)। এই উদাহরণে, ডেটাসেটের সবচেয়ে বড় সংখ্যা হলো ৮ এবং সবচেয়ে ছোট সংখ্যা হলো ১।
তাই রেঞ্জ = ৮ − ১ = ৭।
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import numpy as np # দুই বন্ধুর শেষ ৫ ম্যাচের ক্রিকেট রান runs_player_A = [25, 30, 35, 28, 32] # ধারাবাহিক (Consistent) runs_player_B = [5, 100, 10, 80, 55] # অধারাবাহিক (Inconsistent) range_A = np.ptp(runs_player_A) # ptp = peak to peak range_B = np.ptp(runs_player_B) print(f"খেলোয়াড় A-এর রানের পরিসর (Range): {range_A}") print(f"খেলোয়াড় B-এর রানের পরিসর (Range): {range_B}") |
আন্তঃচতুর্থক পরিসর (Interquartile Range (IQR))
আউটলায়ারের সমস্যা দূর করার জন্য IQR একটি চমৎকার পদ্ধতি। ডেটাকে ছোট থেকে বড় ক্রমে সাজানোর পর এর মাঝের ৫০% ডেটার বিস্তারকে IQR বলে। এটি তৃতীয় কোয়ার্টাইল (Q3 বা 75th percentile) এবং প্রথম কোয়ার্টাইল (Q1 বা 25th percentile)-এর মধ্যেকার পার্থক্য। সুবিধা হলো, যেহেতু এটি ডেটাসেটের প্রথম ২৫% এবং শেষ ২৫% মানকে বাদ দিয়ে হিসাব করা হয়, তাই এটি আউটলায়ার দ্বারা প্রভাবিত হয় না। বক্সপ্লট (Boxplot) তৈরিতে এটি ব্যবহৃত হয়।
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
from scipy.stats import iqr data = [10, 20, 25, 30, 35, 40, 45, 50, 150] # 150 একটি আউটলায়ার # numpy ব্যবহার করে কোয়ার্টাইল বের করা যায় q1 = np.percentile(data, 25) q3 = np.percentile(data, 75) iqr_manual = q3 - q1 # scipy ব্যবহার করে সরাসরি iqr বের করা যায় iqr_auto = iqr(data) print(f"প্রথম কোয়ার্টাইল (Q1): {q1}") print(f"তৃতীয় কোয়ার্টাইল (Q3): {q3}") print(f"আন্তঃচতুর্থক পরিসর (IQR): {iqr_manual}") print(f"Scipy দিয়ে প্রাপ্ত IQR: {iqr_auto}") |
ভেদাঙ্ক (Variance)
Variance হলো গড় থেকে প্রতিটি মানের দূরত্বের বর্গের (squared difference) গড়। এটি দেখায় যে ডেটাসেটের প্রতিটি মান তার গড় (Mean) থেকে কতটা দূরে অবস্থিত। অসুবিধা হলো, এর এককটি মূল ডেটার এককের বর্গ হয় (যেমন: রান স্কয়ার, টাকা স্কয়ার), যা বোঝা কঠিন।
|
1 2 3 4 5 6 7 8 |
import numpy as np runs_player_A = [25, 30, 35, 28, 32] variance_A = np.var(runs_player_A) print(f"খেলোয়াড় A-এর রানের ভেদাঙ্ক (Variance): {variance_A:.2f}") |
পরিমিত ব্যবধান (Standard Deviation)
এটি ভেদাঙ্কের (Variance) অসুবিধা দূর করে এবং বিস্তার পরিমাপের জন্য সবচেয়ে বেশি ব্যবহৃত পদ্ধতি। সুবিধা হলো, এর একক মূল ডেটার এককের সমান হয় (যেমন: রান, টাকা), যা বোঝা এবং ব্যাখ্যা করা অনেক সহজ। Standard Deviation যত কম, ডেটা তত বেশি ধারাবাহিক (consistent) বা গড়ের কাছাকাছি থাকে।
|
1 2 3 4 5 6 7 8 9 10 11 12 |
import numpy as np runs_player_A = [25, 30, 35, 28, 32] runs_player_B = [5, 100, 10, 80, 55] std_A = np.std(runs_player_A) std_B = np.std(runs_player_B) print(f"খেলোয়াড় A-এর রানের পরিমিত ব্যবধান (Std Dev): {std_A:.2f}") print(f"খেলোয়াড় B-এর রানের পরিমিত ব্যবধান (Std Dev): {std_B:.2f}") |
বিভেদাঙ্ক (Coefficient of Variation (CV))
CV একটি আপেক্ষিক (relative) বিস্তার পরিমাপক। এটি হলো Standard Deviation এবং Mean-এর অনুপাত, যা সাধারণত শতাংশে প্রকাশ করা হয়। যখন দুটি ভিন্ন ডেটাসেটের বিস্তার তুলনা করতে হয়, যাদের একক বা গড় ভিন্ন। যেমন: ক্রিকেটারদের রানের বিস্তারের সাথে বোলারদের উইকেটের বিস্তারের তুলনা করা, অথবা হাতির ওজন (কেজি) এবং ইঁদুরের ওজনের (গ্রাম) বিস্তারের তুলনা করা। যার CV কম, সে তত বেশি স্থিতিশীল (stable) বা ধারাবাহিক।
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import numpy as np # ডেটা (কাল্পনিক) kohli_scores = np.array([70, 80, 65, 85, 75]) shakib_scores = np.array([50, 90, 30, 100, 40]) # কোহলির জন্য CV mean_kohli = np.mean(kohli_scores) std_kohli = np.std(kohli_scores) cv_kohli = (std_kohli / mean_kohli) * 100 # সাকিবের জন্য CV mean_shakib = np.mean(shakib_scores) std_shakib = np.std(shakib_scores) cv_shakib = (std_shakib / mean_shakib) * 100 print(f"কোহলির গড়: {mean_kohli:.2f}, Std Dev: {std_kohli:.2f}, CV: {cv_kohli:.2f}%") print(f"সাকিবের গড়: {mean_shakib:.2f}, Std Dev: {std_shakib:.2f}, CV: {cv_shakib:.2f}%") |
ডেটা অ্যানালাইসিসে কেন্দ্রীয় মানের পাশাপাশি ডেটার বিস্তার জানা অত্যন্ত জরুরি। এটি আমাদের ডেটার গঠন, ধারাবাহিকতা এবং নির্ভরযোগ্যতা সম্পর্কে গভীর ধারণা দেয়। আশা করি, এই আলোচনা আপনাকে ডেটার বিস্তার পরিমাপের পদ্ধতিগুলো সহজে বুঝতে সাহায্য করেছে।

Leave a Comment