งูต้นฉบับกำลังใช้แปรงสามขนาดเกลี่ยกองจุดข้อมูลให้เป็นเนินโค้งบนกระดาษครีม

Python statistics.kde: ประมาณ distribution โดยไม่บังคับให้ข้อมูลเป็นโค้งระฆัง

พี่โชว์Engineering

ค่าเฉลี่ยกับส่วนเบี่ยงเบนมาตรฐานเล่าไม่ครบเมื่อข้อมูลมีสองยอดหรือเบ้หนักครับ 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 เมื่อทำได้
  • ระวังหางเลยขอบเขตของข้อมูลจริง