Python statistics.kde: ประมาณ distribution โดยไม่บังคับให้ข้อมูลเป็นโค้งระฆัง
ค่าเฉลี่ยกับส่วนเบี่ยงเบนมาตรฐานเล่าไม่ครบเมื่อข้อมูลมีสองยอดหรือเบ้หนักครับ statistics.kde สร้างฟังก์ชันประมาณความหนาแน่นจากตัวอย่าง โดยไม่บังคับว่าข้อมูลต้องเป็น normal distribution และไม่ต้องติดตั้งไลบรารีภายนอก
WHY: ดูรูปทรงก่อนสรุปด้วยเลขเดียว
KDE หรือ kernel density estimation วาง “กองทราย” เล็ก ๆ บนทุกจุดข้อมูลแล้วรวมกองเข้าด้วยกัน ค่า bandwidth h คือความกว้างของกอง ถ้าแคบเกินจะเห็นยอดจุกจิกทุกจุด ถ้ากว้างเกินยอดสำคัญอาจละลายรวมกัน เหมือนปรับความละเอียดแผนที่ครับ ซูมมากเห็นตรอกทุกเส้น ซูมน้อยเห็นแค่ภูเขาใหญ่
HOW: ประเมิน density และตรวจสมบัติพื้นฐาน
import math
import statistics
import unittest
class KdeTests(unittest.TestCase):
def test_density_is_finite_and_peaks_near_samples(self) -> None:
samples = [1.0, 1.2, 1.4, 4.8, 5.0, 5.2]
density = statistics.kde(samples, h=0.35, kernel="normal")
near_group = density(1.2)
between_groups = density(3.0)
self.assertTrue(math.isfinite(near_group))
self.assertGreaterEqual(near_group, 0.0)
self.assertGreater(near_group, between_groups)
def test_cumulative_density_stays_in_range(self) -> None:
cumulative = statistics.kde([0.0, 1.0, 2.0], h=0.5, cumulative=True)
self.assertGreaterEqual(cumulative(1.0), 0.0)
self.assertLessEqual(cumulative(1.0), 1.0)
if __name__ == "__main__":
unittest.main()
test ไม่ล็อกค่าทศนิยมตายตัว เพราะ implementation และ floating point อาจเปลี่ยนรายละเอียดได้ เราตรวจ contract ที่สำคัญกว่า: ค่า finite, ไม่ติดลบ และบริเวณใกล้กลุ่มข้อมูลมี density สูงกว่าช่องว่าง
อย่าให้เส้นโค้งสวยกว่าหลักฐาน
KDE ไม่สร้างข้อมูลเพิ่ม ตัวอย่างน้อยหรือมี sampling bias ก็ยังให้ภาพที่มั่นใจเกินจริงได้ ควรวาดหลาย bandwidth, แสดงจุดข้อมูลจริง และบอกจำนวน sample เสมอ ข้อมูลที่มีขอบเขต เช่น latency ห้ามติดลบ อาจเกิดหางเลยขอบเมื่อใช้ normal kernel จึงต้องตีความหรือเลือก kernel ให้เหมาะ
| คำถาม | สิ่งที่ควรลอง |
|---|---|
รูปทรงเปลี่ยนตาม h มากไหม | เทียบ bandwidth อย่างน้อย 3 ค่า |
| มีสองกลุ่มจริงหรือ noise | ดู raw points และ domain context |
| ต้องสุ่มค่าตาม distribution | ใช้ kde_random พร้อม seed ใน test |
| ต้องการ inference จริงจัง | ใช้เครื่องมือสถิติที่มี validation/diagnostics เพิ่ม |
Recap
- ใช้ KDE เพื่อสำรวจรูปทรง ไม่ใช่พิสูจน์เหตุและผล
- เทียบหลาย bandwidth
- แสดง sample count และ raw data เมื่อทำได้
- ระวังหางเลยขอบเขตของข้อมูลจริง