การวัดการกระจาย

สถิติเบื้องต้นด้วย Python

Maggie Matsui

Content Developer, DataCamp

การกระจายคืออะไร?

ฮิสโตแกรมสองอัน: อันแรกแคบโดยมีข้อมูลกระจุกอยู่ในช่วงค่าแคบ อีกอันกว้างกว่าโดยมีข้อมูลกระจายในช่วงค่ากว้างกว่า

สถิติเบื้องต้นด้วย Python

ความแปรปรวน

ระยะห่างเฉลี่ยจากจุดข้อมูลแต่ละจุดถึงค่าเฉลี่ยของข้อมูล

กราฟ dot plot ที่มี 7 จุดข้อมูล โดยมีเส้นสีแดงอยู่ตรงกลางแทนค่าเฉลี่ย

สถิติเบื้องต้นด้วย Python

ความแปรปรวน

ระยะห่างเฉลี่ยจากจุดข้อมูลแต่ละจุดถึงค่าเฉลี่ยของข้อมูล

กราฟ dot plot ที่มี 7 จุดข้อมูล โดยมีเส้นสีแดงอยู่ตรงกลางแทนค่าเฉลี่ย และมีลูกศรวาดจากแต่ละจุดไปยังเส้นค่าเฉลี่ย

สถิติเบื้องต้นด้วย Python

การคำนวณความแปรปรวน

1. ลบค่าเฉลี่ยออกจากแต่ละจุดข้อมูล

dists = msleep['sleep_total'] - 
        np.mean(msleep['sleep_total'])
print(dists)
0     1.666265
1     6.566265
2     3.966265
3     4.466265
4    -6.433735
      ...

2. ยกกำลังสองระยะห่างแต่ละค่า

sq_dists = dists ** 2
print(sq_dists)
0      2.776439
1     43.115837
2     15.731259
3     19.947524
4     41.392945
      ...
สถิติเบื้องต้นด้วย Python

การคำนวณความแปรปรวน

3. รวมระยะห่างที่ยกกำลังสองแล้ว

sum_sq_dists = np.sum(sq_dists)
print(sum_sq_dists)
1624.065542

4. หารด้วยจำนวนจุดข้อมูล - 1

variance = sum_sq_dists / (83 - 1)
print(variance)
19.805677

ใช้ np.var()

np.var(msleep['sleep_total'], ddof=1)
19.805677

หากไม่ใส่ ddof=1 จะคำนวณ ความแปรปรวนของประชากร แทน ความแปรปรวนของกลุ่มตัวอย่าง:

np.var(msleep['sleep_total'])
19.567055
สถิติเบื้องต้นด้วย Python

ส่วนเบี่ยงเบนมาตรฐาน

np.sqrt(np.var(msleep['sleep_total'], ddof=1))
4.450357
np.std(msleep['sleep_total'], ddof=1)
4.450357
สถิติเบื้องต้นด้วย Python

ค่าเบี่ยงเบนสัมบูรณ์เฉลี่ย

dists = msleep['sleep_total'] - np.mean(msleep['sleep_total'])

np.mean(np.abs(dists))
3.566701

ส่วนเบี่ยงเบนมาตรฐาน vs. ค่าเบี่ยงเบนสัมบูรณ์เฉลี่ย

  • ส่วนเบี่ยงเบนมาตรฐานยกกำลังสองระยะห่าง จึงให้น้ำหนักกับระยะห่างที่ไกลมากกว่าระยะที่ใกล้
  • ค่าเบี่ยงเบนสัมบูรณ์เฉลี่ยให้น้ำหนักกับระยะห่างทุกค่าเท่ากัน
  • ทั้งสองแบบไม่มีอันไหนดีกว่ากัน แต่ SD ใช้กันบ่อยกว่า MAD
สถิติเบื้องต้นด้วย Python

ควอนไทล์

np.quantile(msleep['sleep_total'], 0.5)
10.1

$$

                        ควอนไทล์ที่ 0.5 = มัธยฐาน

ควอร์ไทล์:

np.quantile(msleep['sleep_total'], [0, 0.25, 0.5, 0.75, 1])
array([ 1.9 ,  7.85, 10.1 , 13.75, 19.9 ])
สถิติเบื้องต้นด้วย Python

Boxplot ใช้ควอร์ไทล์

import matplotlib.pyplot as plt
plt.boxplot(msleep['sleep_total'])
plt.show()

กราฟ boxplot ของ sleep_total

สถิติเบื้องต้นด้วย Python

ควอนไทล์โดยใช้ np.linspace()

np.quantile(msleep['sleep_total'], [0, 0.2, 0.4, 0.6, 0.8, 1])
array([ 1.9 ,  6.24,  9.48, 11.14, 14.4 , 19.9 ])

 

np.linspace(start, stop, num)

np.quantile(msleep['sleep_total'], np.linspace(0, 1, 5))
array([ 1.9 ,  7.85, 10.1 , 13.75, 19.9 ])
สถิติเบื้องต้นด้วย Python

พิสัยควอร์ไทล์ (IQR)

ความสูงของกล่องใน boxplot

np.quantile(msleep['sleep_total'], 0.75) - np.quantile(msleep['sleep_total'], 0.25)
5.9
from scipy.stats import iqr
iqr(msleep['sleep_total'])
5.9
สถิติเบื้องต้นด้วย Python

ค่าผิดปกติ (Outliers)

ค่าผิดปกติ (Outlier): จุดข้อมูลที่แตกต่างจากจุดอื่นอย่างมีนัยสำคัญ

แล้วจะรู้ได้อย่างไรว่าแตกต่างมากพอ? จุดข้อมูลถือเป็น outlier หาก:

  • $\text{data} < \text{Q1} - 1.5\times\text{IQR}$    หรือ
  • $\text{data} > \text{Q3} + 1.5\times\text{IQR}$
สถิติเบื้องต้นด้วย Python

การหาค่าผิดปกติ

from scipy.stats import iqr
iqr = iqr(msleep['bodywt'])

lower_threshold = np.quantile(msleep['bodywt'], 0.25) - 1.5 * iqr upper_threshold = np.quantile(msleep['bodywt'], 0.75) + 1.5 * iqr
msleep[(msleep['bodywt'] < lower_threshold) | (msleep['bodywt'] > upper_threshold)]
                    name   vore  sleep_total    bodywt
4                    Cow  herbi          4.0   600.000
20        Asian elephant  herbi          3.9  2547.000
22                 Horse  herbi          2.9   521.000
...
สถิติเบื้องต้นด้วย Python

ดูทุกค่าในคราวเดียว

msleep['bodywt'].describe()
count      83.000000
mean      166.136349
std       786.839732
min         0.005000
25%         0.174000
50%         1.670000
75%        41.750000
max      6654.000000
Name: bodywt, dtype: float64
สถิติเบื้องต้นด้วย Python

มาฝึกกันเถอะ!

สถิติเบื้องต้นด้วย Python

Preparing Video For Download...