ข้อมูลและสถิติเชิงพรรณนา
UAT 106 สถิติและการวิเคราะห์ข้อมูลสำหรับงานเทคโนโลยี
บทเรียน
เมื่อเรียนจบโมดูลนี้ ผู้เรียนจะสามารถ
- แยกชนิดข้อมูล ประชากรกับตัวอย่าง และระบุหน่วยทดลองให้ถูกต้อง
- คำนวณค่ากลาง ส่วนเบี่ยงเบนมาตรฐาน เปอร์เซ็นไทล์ และพิสัยควอร์ไทล์ด้วย Python
- อ่านกล่องสี่เหลี่ยม (box plot) และระบุค่าผิดปกติด้วยเกณฑ์ 1.5 IQR
- แยกความแม่น (trueness) กับความเที่ยง (precision) และคำนวณ bias กับ RMSE
ทำไมต้องรู้
โดรนหนึ่งเที่ยวบินสร้างตัวเลขได้เป็นแสนค่า ทั้งความสูง ความเร็ว แรงดันแบตเตอรี่ และเวลาประมวลผลภาพ ตัวเลขดิบจำนวนมากขนาดนี้อ่านด้วยตาไม่ไหว สถิติเชิงพรรณนา (descriptive statistics) สรุปข้อมูลให้เหลือไม่กี่ค่าที่บอกได้ว่าข้อมูลอยู่แถวไหน กระจายแค่ไหน และมีอะไรผิดปกติ ถ้าสรุปผิดวิธี เช่น ใช้ค่าเฉลี่ยกับข้อมูลที่เบ้มาก หรือนับจุด log เป็นเที่ยวบิน ข้อสรุปจะผิดตั้งแต่ต้น
ข้อมูลในวิชานี้เป็น ข้อมูลสังเคราะห์ ที่สร้างจากแบบจำลองด้วยสคริปต์ make_sample_data.py เพื่อฝึกวิธีวิเคราะห์เท่านั้น ไม่ใช่ผลทดสอบของโดรนรุ่นใด ดาวน์โหลดได้ที่ /downloads/uat-106/
ข้อมูลชนิดต่าง ๆ และหน่วยทดลอง
| ชนิด | ความหมาย | ตัวอย่างงานโดรน |
|---|---|---|
| นามบัญญัติ (nominal) | กลุ่มที่ไม่มีลำดับ | ยี่ห้อแบตเตอรี่, โหมดการบิน |
| เรียงลำดับ (ordinal) | มีลำดับแต่ระยะห่างไม่เท่ากัน | ระดับความเสี่ยง ต่ำ กลาง สูง |
| อันตรภาค (interval) | ระยะห่างมีความหมาย ศูนย์ไม่ใช่ “ไม่มี” | อุณหภูมิ °C |
| อัตราส่วน (ratio) | มีศูนย์จริง หารกันได้ | เวลาบิน, น้ำหนักบรรทุก, ระยะทาง |
ประชากร (population) คือทั้งหมดที่เราอยากรู้ เช่น ทุกเที่ยวบินที่แบตเตอรี่รุ่นนี้จะบินได้ ส่วน ตัวอย่าง (sample) คือส่วนที่เราวัดจริง สถิติคือการใช้ตัวอย่างบอกเรื่องของประชากร
หน่วยทดลอง (experimental unit) คือสิ่งที่ถูกวัดแยกกันอย่างเป็นอิสระ ถ้าคำถามคือ “แบตเตอรี่รุ่นนี้บินได้นานเท่าใด” หน่วยทดลองคือ เที่ยวบิน ไม่ใช่จุดข้อมูลใน log จุด log หนึ่งพันจุดในเที่ยวเดียวไม่ได้เป็นหนึ่งพันเที่ยวบินที่เป็นอิสระกัน ข้อผิดพลาดนี้พบบ่อยมากและทำให้ผู้วิเคราะห์มั่นใจเกินจริง
import pandas as pd
hover = pd.read_csv("hover_error.csv")
err = hover["alt_err_m"]
print(len(err), "samples from ONE hover flight, sampled every", hover["t_s"].diff().iloc[1], "s")
print(f"mean {err.mean():.3f} m median {err.median():.3f} m sd {err.std():.3f} m")
print(f"min {err.min():.3f} m max {err.max():.3f} m")
600 samples from ONE hover flight, sampled every 0.1 s
mean -0.002 m median -0.001 m sd 0.127 m
min -0.735 m max 0.897 m
ค่ากลางและการกระจาย
- ค่าเฉลี่ย (mean) ผลรวมหารจำนวน ไวต่อค่าผิดปกติ
- มัธยฐาน (median) ค่าตรงกลางเมื่อเรียงข้อมูล ทนต่อค่าผิดปกติ
- ส่วนเบี่ยงเบนมาตรฐาน (standard deviation, SD) บอกว่าข้อมูลห่างจากค่าเฉลี่ยโดยทั่วไปเท่าใด หน่วยเดียวกับข้อมูล
- เปอร์เซ็นไทล์ (percentile) ค่าที่มีข้อมูลต่ำกว่าตามสัดส่วนที่กำหนด เช่น p95 คือค่าที่ข้อมูล 95% ไม่เกิน ส่วน ควอร์ไทล์ Q1 Q2 Q3 คือเปอร์เซ็นไทล์ที่ 25 50 75
ส่วนเบี่ยงเบนมาตรฐานของ ตัวอย่าง หารด้วย ไม่ใช่ เพราะค่าเฉลี่ยคำนวณจากข้อมูลชุดเดียวกัน ทำให้ระยะห่างดูน้อยกว่าจริงเล็กน้อย การหารด้วย ชดเชยส่วนนี้ ระวังว่าเครื่องมือแต่ละตัวใช้ค่าเริ่มต้นต่างกัน
import statistics
import numpy as np
flights = [21.8, 22.0, 22.5, 23.9, 24.1]
print(f"stdev (n-1) {statistics.stdev(flights):.3f} pstdev (n) {statistics.pstdev(flights):.3f}")
print("pandas .std():", round(pd.Series(flights).std(), 3), " numpy np.std():", round(np.std(flights), 3))
print("statistics.quantiles:", statistics.quantiles(flights, n=4))
print("numpy.percentile: ", np.percentile(flights, [25, 50, 75]).tolist())
stdev (n-1) 1.074 pstdev (n) 0.960
pandas .std(): 1.074 numpy np.std(): 0.96
statistics.quantiles: [21.9, 22.5, 24.0]
numpy.percentile: [22.0, 22.5, 23.9]
pandas .std() หารด้วย แต่ numpy np.std() หารด้วย ถ้าไม่ระบุ ddof=1 ส่วนควอร์ไทล์ของ statistics.quantiles (วิธี exclusive) กับ numpy.percentile (วิธี linear) ได้ค่าต่างกันเมื่อข้อมูลน้อย ทั้งสองไม่ผิด แต่ต้อง รายงานวิธีที่ใช้ เพื่อให้ผู้อื่นคำนวณซ้ำได้ตรงกัน
ตัวอย่างที่ 1 เวลาประมวลผลภาพบน edge computer
ข้อมูล 200 เฟรมจากไฟล์ latency.csv เป็นข้อมูลที่ เบ้ขวา คือมีเฟรมช้าจำนวนน้อยที่ช้ามาก หน่วยความรู้ “Edge benchmark” ของคลังความรู้โดรนแนะนำให้รายงาน p95 คู่กับค่ากลาง
lat = pd.read_csv("latency.csv")["latency_ms"]
print(f"mean {lat.mean():.1f} ms median {lat.median():.1f} ms")
print(f"p95 {lat.quantile(0.95):.1f} ms max {lat.max():.1f} ms")
mean 42.3 ms median 40.5 ms
p95 62.6 ms max 79.4 ms
ค่าเฉลี่ยสูงกว่ามัธยฐานเพราะเฟรมที่ช้าดึงค่าเฉลี่ยขึ้น ถ้าระบบต้องประมวลผลให้เสร็จภายใน 60 ms ค่าเฉลี่ย 42 ms ดูเหมือนผ่านสบาย แต่ p95 ประมาณ 63 ms บอกว่ามีเฟรมอย่างน้อย 5% ที่ช้ากว่าเกณฑ์ (นับจริงได้ 14 จาก 200 เฟรม หรือ 7%) ค่าสรุปที่เลือกจึงต้องตรงกับคำถาม
กล่องสี่เหลี่ยมและค่าผิดปกติ
กล่องสี่เหลี่ยม (box plot) ตามคู่มือสถิติของ NIST สรุปข้อมูลด้วยห้าค่า กล่องครอบจาก Q1 ถึง Q3 ความกว้างของกล่องคือ พิสัยควอร์ไทล์ (IQR) เส้นกลางกล่องคือมัธยฐาน หนวดยืดไปถึงข้อมูลที่ไกลที่สุดที่ยังอยู่ในเกณฑ์ และจุดที่อยู่นอก หรือ ถูกแสดงแยกเป็นค่าผิดปกติที่ควรตรวจ
q1, q3 = err.quantile([0.25, 0.75])
iqr = q3 - q1
low, high = q1 - 1.5 * iqr, q3 + 1.5 * iqr
print(f"Q1 {q1:.3f} Q3 {q3:.3f} IQR {iqr:.3f} fences [{low:.3f}, {high:.3f}]")
print(hover[(err < low) | (err > high)].to_string(index=False))
Q1 -0.086 Q3 0.082 IQR 0.167 fences [-0.337, 0.333]
t_s alt_err_m
21.5 0.897
43.0 -0.735
58.3 -0.372
พบค่าผิดปกติสามจุด สองจุดที่ 21.5 และ 43.0 วินาทีห่างจากกลุ่มมาก ส่วนจุดที่ 58.3 วินาทีเกินเกณฑ์เพียงเล็กน้อย เกณฑ์ 1.5 IQR เป็นเพียง สัญญาณให้ไปตรวจ ไม่ใช่คำสั่งให้ลบ ต้องกลับไปดูสาเหตุ เช่น ลมกระโชกหรือเซนเซอร์ขัดข้อง ถ้าตัดข้อมูลออกต้องรายงานเหตุผลและผลทั้งก่อนและหลังตัด
ความแม่น ความเที่ยง bias และ RMSE
พจนานุกรมมาตรวิทยาสากล (VIM, JCGM 200:2012) แยกคำสามคำ
- ความแม่น (trueness) ค่าเฉลี่ยของการวัดซ้ำจำนวนมากใกล้ค่าอ้างอิงเพียงใด ความไม่แม่นคือมี bias
- ความเที่ยง (precision) ผลการวัดซ้ำใกล้กันเองเพียงใด
- ความถูกต้อง (accuracy) ผลการวัดใกล้ค่าจริงเพียงใด เป็นผลรวมของทั้งสองอย่าง VIM ระบุว่าเป็นแนวคิด ไม่ใช่ปริมาณที่ให้ตัวเลขได้โดยตรง
ในงานตรวจแผนที่ ความคลาดเคลื่อน คือค่าจากแผนที่ลบค่าอ้างอิงของจุดตรวจสอบ bias คือค่าเฉลี่ยของ ส่วน RMSE คือรากของค่าเฉลี่ยกำลังสอง ซึ่งรวมทั้ง bias และการกระจาย ตัวอย่างนี้ใช้ข้อมูลสังเคราะห์สี่จุดจากหน่วยความรู้ “ตรวจความถูกต้องและแก้ปัญหาแผนที่”
e_z = np.array([0.10, 0.00, -0.10, 0.00])
for label, e in [("as measured", e_z), ("with +0.20 m offset", e_z + 0.20)]:
print(f"{label:<20} bias {e.mean():+.3f} m RMSE {np.sqrt(np.mean(e ** 2)):.3f} m")
as measured bias +0.000 m RMSE 0.071 m
with +0.20 m offset bias +0.200 m RMSE 0.212 m
bias เป็นศูนย์ไม่ได้แปลว่าไม่มีความคลาดเคลื่อน เพราะค่าบวกกับลบหักล้างกัน เมื่อทุกจุดเลื่อนขึ้น 0.20 m (เช่น ใช้ระดับอ้างอิงความสูงผิด) ทั้ง bias และ RMSE เพิ่มขึ้น จึงต้องรายงานทั้งสองค่าคู่กัน
ปฏิบัติการประจำโมดูล
ปฏิบัติการ: สรุปข้อมูลการลอยตัว
- เปิด
hover_error.csvด้วย pandas คำนวณค่าสรุปทั้งหมดในบท แล้ววาด histogram และ box plot ด้วย matplotlib - ตัดค่าผิดปกติสองจุดที่ชัดเจนออก คำนวณ SD ใหม่ แล้วเขียนรายงานสั้นที่แสดงทั้งผลก่อนและหลังตัดพร้อมเหตุผล
- คำนวณ p50 p90 p95 และ p99 ของ
latency.csvด้วยทั้งnumpy.percentileและstatistics.quantiles(n=100)เทียบว่าต่างกันเท่าใด - ใช้ข้อมูลจุดตรวจสอบจากหน่วยความรู้ “ตรวจความถูกต้องและแก้ปัญหาแผนที่” คำนวณ bias และ RMSE แยกแกน E N Z
ข้อผิดพลาดที่พบบ่อย
ระวัง
- นับจุด log เป็นเที่ยวบิน ทำให้ดูเหมือนมีข้อมูลมากกว่าจริงหลายร้อยเท่า
- ใช้ค่าเฉลี่ยกับข้อมูลเบ้ โดยไม่ดูมัธยฐานหรือเปอร์เซ็นไทล์
- ไม่รู้ว่าเครื่องมือหาร n หรือ n−1 ได้ SD ไม่ตรงกับผู้อื่น
- ลบค่าผิดปกติทิ้งเงียบ ๆ เพื่อให้ผลดูดี
- รายงานแต่ bias ซึ่งอาจเป็นศูนย์ทั้งที่ความคลาดเคลื่อนรายจุดใหญ่
สรุป
- ระบุชนิดข้อมูลและหน่วยทดลองให้ถูกก่อนคำนวณ จุด log ในเที่ยวเดียวไม่ใช่ตัวอย่างอิสระ
- ใช้ค่าเฉลี่ยคู่กับมัธยฐาน และ SD คู่กับเปอร์เซ็นไทล์ รายงานวิธีคำนวณเสมอ
- box plot และเกณฑ์ 1.5 IQR ชี้จุดที่ควรตรวจ ไม่ใช่จุดที่ต้องลบ
- ความแม่นเกี่ยวกับ bias ความเที่ยงเกี่ยวกับการกระจาย RMSE รวมทั้งสองอย่าง
แบบฝึกตรวจความเข้าใจ
- ข้อมูลโหมดการบิน (MANUAL, AUTO, RTL) เป็นข้อมูลชนิดใด
- เวลาบิน 20, 22, 24 นาที มีส่วนเบี่ยงเบนมาตรฐานของตัวอย่างเท่าใด
- Q1 = 10 และ Q3 = 18 ค่าที่มากกว่าเท่าใดถือเป็นค่าผิดปกติตามเกณฑ์ 1.5 IQR
- ความคลาดเคลื่อน +0.03 และ −0.03 m มี bias และ RMSE เท่าใด
- log ความสูง 36 000 จุดจากการบิน 3 เที่ยว มีตัวอย่างอิสระกี่ตัวเมื่อคำถามคือ “เวลาบินเฉลี่ย”
เฉลย
- นามบัญญัติ (nominal) เพราะเป็นกลุ่มที่ไม่มีลำดับ
- ค่าเฉลี่ย 22 ผลรวมกำลังสองของส่วนต่าง ได้ นาที
- IQR = 8 เกณฑ์บน
- bias m และ RMSE m
- 3 ตัวอย่าง เพราะหน่วยทดลองคือเที่ยวบิน
สรุปสูตรสำคัญ
| ค่าเฉลี่ย | |
| ส่วนเบี่ยงเบนมาตรฐานของตัวอย่าง | |
| เกณฑ์ค่าผิดปกติแบบ box plot | |
| bias และ RMSE |
แหล่งอ้างอิงหลัก
- Montgomery, D. C., & Runger, G. C. (2018). Applied statistics and probability for engineers (7th ed.). Wiley. link
- Diez, D. M., Çetinkaya-Rundel, M., & Barr, C. D. (2019). OpenIntro statistics (4th ed.). OpenIntro. link
- NIST/SEMATECH. e-Handbook of statistical methods. National Institute of Standards and Technology. link
- NIST/SEMATECH. Box plot (section 1.3.3.7). e-Handbook of statistical methods. link
- Python Software Foundation. statistics — Mathematical statistics functions. The Python standard library (3.14). link
- NumPy developers. numpy.percentile. NumPy documentation. link
- JCGM. (2012). International vocabulary of metrology — Basic and general concepts and associated terms (VIM, JCGM 200:2012). BIPM. link
- McKinney, W. (2022). Python for data analysis (3rd ed.). O'Reilly. link
อ่านเพิ่มเติม
ศึกษาหน่วยความรู้ที่กำหนดล่วงหน้า ดูสื่อประกอบ และทำ quiz ประจำโมดูล
สถิติเชิงพรรณนาและการแจกแจงความน่าจะเป็น
ตรวจความถูกต้องและแก้ปัญหาแผนที่
benchmark และแผนใช้งาน Edge
ในชั้นเรียน / ภาคสนาม
ปฏิบัติการในห้องแล็บหรือภาคสนามตามใบงาน พร้อม checklist ความปลอดภัย
หลักฐานการเรียนรู้: ใบงานที่ผ่านการตรวจและผล quiz