গড়, মধ্যক, প্রচুরক

mean কে অনেকেই গড় নামেই চিনে থাকবেন। খুব সহজ - যতগুলো এলিমেন্ট নিয়ে কাজ করা হচ্ছে সেগুলোর যোগফলকে মোট এলিমেন্ট সংখ্যা দিয়ে ভাগ করলেই গড় পাওয়া যায়।

a = np.array([10, 5, 12, 3])
np.mean(a)
7.5

অর্থাৎ,$\frac{10+5+12+3}{4} = 7.5$

a = np.array([[1, 2], [3, 4]])
np.mean(a, axis=1)
array([ 1.5, 3.5])

অর্থাৎ, প্রথমে 1 ও 2 এর গড় এবং তারপর 3 ও 4 এর গড় করে আরেকটা অ্যারে তে জমা করা হয়েছে। numpy ব্যবহার না করলে এখানে লুপ, যোগ, ভাগ সহ বেশ কিছু কোড লিখতে হত।

median বা মধ্যক হচ্ছে কিছু ক্রমানুসারে সাজানো এলিমেণ্টের মাঝখানের ভ্যালুটি অথবা মাঝখানে একাধিক ভ্যালু হলে তাদের সাধারণ গড় মানটি

a = np.array([10, 14, 4, 7, 9, 12, 15])
np.median(a) # 4, 7, 9, 10, 12, 14, 15. এখানে 10 median
10.0

উপরের অ্যারের mean -ও বের করে দেখি,

a = np.array([10, 14, 4, 7, 9, 12, 15])
np.mean(a)
10.142857142857142

mode বা প্রচুরক হচ্ছে কোন ডাটা কালেকশনে যে এলিমেন্টটি সবচেয়ে বেশি সংখ্যক বার থাকে সেটা

from scipy import stats # এটি আরেকটি প্রয়োজনীয় লাইব্রেরী
a = np.array([10, 14, 4, 7, 9, 12, 4, 15]) # 4 এর উপস্থিতি বেশি
stats.mode(a)
ModeResult(mode=array([4]), count=array([2]))

mean থাকতে আবার median কেন?

মাঝে মাঝে কোন একটা ডাটা সেটের mean তার সঠিক/বাস্তবিক গড় প্রকাশ করে না। যেমন - নিচে কিছু লোকের বয়সের একটা অ্যারে আছে এবং এর mean এসেছে 33.84. এটা যথেষ্ট লজিক্যাল একটা ভিউ দিচ্ছে ডাটা সেট সম্পর্কে।

ages = np.array([30, 30, 30, 20, 20, 45, 35, 35, 30, 40, 40, 40, 45])
np.mean(ages)
33.846153846153847

কিন্তু ধরা যাক, সেই ডাটা সেটের মধ্যে একজন মাত্র অতিবৃদ্ধ লোকের বয়স যুক্ত করা হল যার বয়স 120 বছর। এতে করেই এই ডাটা সেটের mean বেড়ে গিয়ে হয়ে গেলো 40 যা একদমই এই সেটের বাস্তবিক গ্রহণযোগ্য ভিউকে রীতিমত বদলে ফেলেছে।

ages = np.array([30, 30, 30, 20, 20, 45, 35, 35, 30, 40, 40, 40, 45, 120])
np.mean(ages)
40.0

আবার এই অবস্থাতেও উক্ত সেটের median আসছে 35 অর্থাৎ একটা অসঙ্গতি পূর্ণ ডাটা এলিমেন্ট যুক্ত হবার পরেও median দিয়ে গড়ের একটা সঠিক ওভারভিউ পাওয়া যাচ্ছে। এরকম ক্ষেত্রে median উপকারী।

ages = np.array([30, 30, 30, 20, 20, 45, 35, 35, 30, 40, 40, 40, 45, 120])
np.median(ages)
35.0