โมดูล 3/5 · สัปดาห์ 7–9 · 27 ชม.

ช่วงความเชื่อมั่นและการทดสอบสมมติฐาน

UAT 106 สถิติและการวิเคราะห์ข้อมูลสำหรับงานเทคโนโลยี

เวลาเรียนประมาณ 90 นาทีร่าง รอตรวจปรับปรุงล่าสุด 26 กันยายน 2569

บทเรียน

เมื่อเรียนจบโมดูลนี้ ผู้เรียนจะสามารถ

  1. คำนวณ standard error และช่วงความเชื่อมั่นของค่าเฉลี่ยด้วยการแจกแจง t
  2. ตั้งสมมติฐานและทิศทางของการทดสอบจากข้อกำหนดก่อนเห็นข้อมูล
  3. ทดสอบค่าเฉลี่ยหนึ่งกลุ่มและเปรียบเทียบสองกลุ่มด้วย Welch t-test และตีความค่า p อย่างถูกต้อง
  4. อธิบายความผิดพลาดชนิดที่ 1 และ 2 และแยกช่วงความเชื่อมั่นของค่าเฉลี่ยออกจากการกระจายของแต่ละเที่ยวบิน

ความรู้พื้นฐานที่ควรมี: UAT 106 โมดูล 1–2

ทำไมต้องรู้

ผู้ผลิตระบุว่าโดรนบินได้ “ไม่ต่ำกว่า 20 นาที” หน่วยงานทดสอบสี่เที่ยว ได้ค่าเฉลี่ย 22.6 นาที ข้อมูลนี้พอจะยืนยันข้อกำหนดหรือไม่ ถ้าทดสอบใหม่อีกสี่เที่ยวค่าเฉลี่ยอาจเปลี่ยนไป สถิติอนุมาน (inferential statistics) บอกว่าตัวเลขจากตัวอย่างไม่แน่นอนเท่าใด และข้อมูลสนับสนุนข้อสรุปได้แค่ไหน หน่วยความรู้ “การทดสอบ UAV และการวิเคราะห์หลักฐาน” และแนวทางทดลอง L14 ของคลังความรู้โดรนใช้แนวคิดในโมดูลนี้ตรง ๆ

Standard error และช่วงความเชื่อมั่น

ค่าเฉลี่ยจากตัวอย่างไม่เท่ากับค่าเฉลี่ยจริงของประชากร standard error (SE) วัดว่าค่าเฉลี่ยของตัวอย่างคลาดเคลื่อนได้เท่าใด ช่วงความเชื่อมั่น (confidence interval, CI) ของค่าเฉลี่ยตามคู่มือสถิติของ NIST คือ ใช้ การแจกแจง t แทนการแจกแจงปกติเพราะเราประมาณ จากตัวอย่าง เมื่อ น้อย ค่า จะใหญ่กว่า 1.96 มาก

ตัวอย่างที่ 1 เวลาบินสามเที่ยว 20, 22, 24 นาที

ตัวอย่างนี้มาจากหน่วยความรู้การทดสอบ UAV ของคลังความรู้โดรน

import math
from scipy import stats

x = [20, 22, 24]
n = len(x)
mean = sum(x) / n
s = math.sqrt(sum((v - mean) ** 2 for v in x) / (n - 1))
se = s / math.sqrt(n)
t_crit = stats.t.ppf(0.975, df=n - 1)
print(f"mean {mean}  s {s}  SE {se:.6f}  t {t_crit:.8f}")
print(f"95% CI [{mean - t_crit * se:.2f}, {mean + t_crit * se:.2f}] min")
ci = stats.ttest_1samp(x, popmean=0).confidence_interval(confidence_level=0.95)
print(f"scipy check [{ci.low:.2f}, {ci.high:.2f}]")
mean 22.0  s 2.0  SE 1.154701  t 4.30265273
95% CI [17.03, 26.97] min
scipy check [17.03, 26.97]

ช่วงกว้างถึง 17.03 ถึง 26.97 นาที เพราะมีเพียงสามเที่ยวและ ถ้าใช้ 1.96 แทนจะได้ช่วงแคบลงเหลือไม่ถึงครึ่งของที่ควรเป็น ()

ความหมายของ “95%” คือ ถ้าทำการทดลองแบบเดียวกันซ้ำหลายครั้ง ช่วงที่สร้างด้วยวิธีนี้ 95% ของครั้งจะครอบค่าเฉลี่ยจริงไว้ ไม่ใช่ โอกาส 95% ที่เที่ยวบินถัดไปจะอยู่ในช่วง

ทดสอบสมมติฐานจากข้อกำหนด

การทดสอบสมมติฐาน (hypothesis test) เริ่มจากตั้ง สมมติฐานว่าง ที่เราพยายามหาหลักฐานมาหักล้าง และ สมมติฐานทางเลือก สิ่งที่ต้องทำก่อนเห็นข้อมูลคือเลือก ทิศทาง ให้ตรงข้อกำหนด และเลือก ระดับนัยสำคัญ เช่น 0.05

ห้ากล่องเรียงกัน เขียนข้อกำหนดและทิศทาง ตั้ง H0 H1 และแอลฟาก่อนเห็นข้อมูล เก็บเที่ยวบินที่เป็นอิสระ คำนวณ t และค่า p และรายงานผลพร้อม CI และข้อจำกัด ด้านล่างมีกล่องสีชมพูเขียนว่าห้ามเปลี่ยนทิศทางการทดสอบหลังเห็นผล
ภาพที่ 1 ขั้นตอนทดสอบสมมติฐาน

ข้อกำหนด “เวลาบินเฉลี่ยไม่ต่ำกว่า 20 นาทีเมื่อบรรทุก 1.0 kg” ต้องการหลักฐานว่าค่าเฉลี่ย มากกว่า 20 จึงตั้ง และ เป็นการทดสอบ ด้านเดียว (one-sided)

import pandas as pd

flights = pd.read_csv("endurance.csv")
a_1kg = flights.query("battery == 'A' and payload_kg == 1.0")["endurance_min"]
print("flights:", a_1kg.tolist())
res = stats.ttest_1samp(a_1kg, popmean=20, alternative="greater")
print(f"mean {a_1kg.mean():.3f}  t {res.statistic:.3f}  p {res.pvalue:.4f}  df {res.df}")
se = a_1kg.std() / math.sqrt(len(a_1kg))
print(f"one-sided 95% lower bound {a_1kg.mean() - stats.t.ppf(0.95, len(a_1kg) - 1) * se:.2f} min")
ci = stats.ttest_1samp(a_1kg, popmean=20).confidence_interval(0.95)
print(f"two-sided 95% CI [{ci.low:.2f}, {ci.high:.2f}] min")
flights: [23.92, 22.04, 22.47, 21.83]
mean 22.565  t 5.447  p 0.0061  df 3
one-sided 95% lower bound 21.46 min
two-sided 95% CI [21.07, 24.06] min

ค่า p คือความน่าจะเป็นที่จะได้ผลสุดโต่งเท่านี้หรือมากกว่า ถ้า เป็นจริง ค่า p = 0.006 น้อยกว่า 0.05 จึงปฏิเสธ ข้อมูลสนับสนุนว่าค่าเฉลี่ยเกิน 20 นาที และขอบล่างด้านเดียว 95% อยู่ที่ประมาณ 21.46 นาที

แกนเวลาบิน 18 ถึง 25 นาที เส้นประสีชมพูที่ 20 นาทีคือเกณฑ์ แถวบนเป็นจุดของแต่ละเที่ยวสี่จุดระหว่างประมาณ 21.8 ถึง 23.9 นาที แถวล่างเป็นช่วงความเชื่อมั่น 95% ของค่าเฉลี่ยจาก 21.07 ถึง 24.06 นาที มีจุดค่าเฉลี่ยตรงกลาง
ภาพที่ 2 ช่วงความเชื่อมั่นของค่าเฉลี่ยกับเวลาบินแต่ละเที่ยว

ค่าเฉลี่ยผ่าน ไม่ได้แปลว่าทุกเที่ยวผ่าน

ช่วงความเชื่อมั่นบอกความไม่แน่นอนของ ค่าเฉลี่ย ส่วนคำถาม “เที่ยวบิน 99% จะบินได้เกิน 20 นาทีหรือไม่” ต้องใช้ tolerance interval ซึ่งเป็นอีกวิธีหนึ่งในคู่มือ NIST และต้องการข้อมูลมากกว่านี้มาก ข้อสรุปจากสี่เที่ยวยังจำกัดอยู่ที่แบตเตอรี่ น้ำหนักบรรทุก และสภาพอากาศแบบที่ทดสอบ

เปรียบเทียบสองกลุ่มด้วย Welch t-test

คำถามต่อไปคือ “แบตเตอรี่ยี่ห้อ B บินได้นานกว่า A หรือไม่” เมื่อบรรทุก 0.5 kg ใช้ Welch t-test ซึ่งไม่ต้องสมมติว่าสองกลุ่มกระจายเท่ากัน ใน SciPy ต้องระบุ equal_var=False เพราะค่าเริ่มต้นคือแบบกระจายเท่ากัน

half = flights.query("payload_kg == 0.5")
a = half.query("battery == 'A'")["endurance_min"]
b = half.query("battery == 'B'")["endurance_min"]
res = stats.ttest_ind(b, a, equal_var=False)
ci = res.confidence_interval(0.95)
print(f"mean B - A = {b.mean() - a.mean():.2f} min   t {res.statistic:.3f}   p {res.pvalue:.3f}   df {res.df:.2f}")
print(f"95% CI of the difference [{ci.low:.2f}, {ci.high:.2f}] min")
mean B - A = 0.70 min   t 1.015   p 0.353   df 5.36
95% CI of the difference [-1.04, 2.44] min

ค่า p = 0.35 มากกว่า 0.05 จึง ไม่ปฏิเสธ แต่ห้ามสรุปว่า “สองยี่ห้อเท่ากัน” ช่วงความเชื่อมั่นของผลต่างตั้งแต่ −1.04 ถึง +2.44 นาทีบอกว่าข้อมูลสี่เที่ยวต่อกลุ่มยังเข้ากันได้ทั้งกับกรณีที่ B แย่กว่าประมาณหนึ่งนาทีและดีกว่าเกือบสองนาทีครึ่ง คำตอบที่ซื่อตรงคือ “ข้อมูลยังไม่พอจะบอก”

ความผิดพลาดสองชนิดและหลักการใช้ค่า p

จริง ไม่จริง
ปฏิเสธ ความผิดพลาดชนิดที่ 1 (โอกาส )ถูกต้อง (กำลังการทดสอบ)
ไม่ปฏิเสธ ถูกต้องความผิดพลาดชนิดที่ 2
import numpy as np

rng = np.random.default_rng(116)
null_true = rng.normal(20, 0.9, size=(10_000, 4))
p = stats.ttest_1samp(null_true, 20, axis=1, alternative="greater").pvalue
print(f"H0 true: rejected in {np.mean(p < 0.05):.1%} of 10 000 experiments")
for n in (4, 8, 16):
    real = rng.normal(21, 0.9, size=(10_000, n))
    p = stats.ttest_1samp(real, 20, axis=1, alternative="greater").pvalue
    print(f"true mean 21 min, n = {n:>2}: power {np.mean(p < 0.05):.1%}")
H0 true: rejected in 5.0% of 10 000 experiments
true mean 21 min, n =  4: power 52.1%
true mean 21 min, n =  8: power 87.7%
true mean 21 min, n = 16: power 99.5%

เมื่อ จริง การทดสอบที่ ปฏิเสธผิดประมาณ 5% ตามที่ออกแบบ และเมื่อค่าเฉลี่ยจริงคือ 21 นาที สี่เที่ยวตรวจพบได้เพียงประมาณครึ่งหนึ่งของการทดลอง (52%) การเพิ่มจำนวนเที่ยวบินเพิ่มกำลังการทดสอบ จึงควรวางแผนจำนวนเที่ยวบินก่อนทดสอบ

สมาคมสถิติอเมริกัน (ASA) ออกแถลงการณ์เรื่องค่า p ในปี 2016 มีหลักสำคัญ เช่น ค่า p ไม่ได้ วัดความน่าจะเป็นที่สมมติฐานเป็นจริง ข้อสรุปไม่ควรขึ้นกับว่าค่า p ผ่านเส้น 0.05 หรือไม่เพียงอย่างเดียว ต้องรายงานครบและโปร่งใส และค่า p ไม่ได้บอกขนาดของผล จึงต้องรายงานช่วงความเชื่อมั่นของผลต่างคู่กันเสมอ

ปฏิบัติการประจำโมดูล

ปฏิบัติการ: ตีความผลทดสอบเวลาบิน

  1. ทำตามแนวทางทดลอง L14 ของคลังความรู้โดรน เขียนข้อกำหนด สมมติฐาน ทิศทาง และ ลงใบงาน ก่อน เปิดไฟล์ endurance.csv
  2. ทดสอบข้อกำหนด “ไม่ต่ำกว่า 20 นาที” ของทุกคู่ยี่ห้อกับน้ำหนักบรรทุก รายงานค่าเฉลี่ย SD n ค่า p และขอบล่างด้านเดียว
  3. เปรียบเทียบยี่ห้อ A กับ B ที่น้ำหนักบรรทุกทั้งสามระดับด้วย Welch t-test แล้วเขียนข้อสรุปที่ไม่เกินกว่าข้อมูล
  4. ใช้การจำลองหาจำนวนเที่ยวบินน้อยที่สุดที่ทำให้กำลังการทดสอบถึง 80% เมื่อค่าเฉลี่ยจริง 21 นาที SD 0.9 นาที

ข้อผิดพลาดที่พบบ่อย

ระวัง

  • เลือกทดสอบด้านเดียวหรือสองด้านหลังเห็นผล เพื่อให้ค่า p ผ่าน
  • ใช้ 1.96 กับตัวอย่างเล็ก ต้องใช้ค่า t ที่ องศาอิสระ
  • สรุปว่าเท่ากันเพราะไม่ปฏิเสธ การไม่พบความต่างไม่ใช่หลักฐานว่าไม่มีความต่าง
  • คิดว่าค่า p คือโอกาสที่ จริง ค่า p คำนวณโดยสมมติว่า จริงอยู่แล้ว
  • ใช้ CI ของค่าเฉลี่ยรับรองทุกเที่ยวบิน ต้องใช้ tolerance interval

สรุป

  • SE และช่วงความเชื่อมั่นของค่าเฉลี่ยใช้ค่า ที่ องศาอิสระ ตัวอย่างเล็กได้ช่วงกว้าง
  • ตั้ง ทิศทาง และ จากข้อกำหนดก่อนเห็นข้อมูล
  • ใช้ Welch t-test เปรียบเทียบสองกลุ่ม และรายงานช่วงความเชื่อมั่นของผลต่างคู่กับค่า p
  • คือโอกาสความผิดพลาดชนิดที่ 1 กำลังการทดสอบเพิ่มเมื่อเก็บข้อมูลมากขึ้น และค่า p ไม่ได้บอกขนาดหรือความสำคัญของผล

แบบฝึกตรวจความเข้าใจ

  1. ตัวอย่าง 9 เที่ยว นาที มี SE เท่าใด
  2. ข้อกำหนด “เสียงไม่เกิน 70 dBA” ควรตั้ง อย่างไร
  3. ค่า p = 0.03 ที่ สรุปอย่างไร
  4. ทดสอบได้ค่า p = 0.40 ผู้เขียนรายงานว่า “พิสูจน์แล้วว่าไม่ต่างกัน” ผิดตรงไหน
  5. ทำไม SciPy ttest_ind จึงต้องใส่ equal_var=False เมื่อต้องการ Welch t-test
เฉลย
  1. นาที
  2. dBA เพราะต้องการหลักฐานว่าเสียงต่ำกว่าเกณฑ์ ()
  3. ปฏิเสธ ข้อมูลสนับสนุน ที่ระดับนัยสำคัญ 0.05 และควรรายงานช่วงความเชื่อมั่นคู่กัน
  4. การไม่ปฏิเสธ ไม่ใช่หลักฐานว่าเท่ากัน อาจเป็นเพราะข้อมูลน้อยเกินไป ควรรายงานช่วงความเชื่อมั่นของผลต่าง
  5. เพราะค่าเริ่มต้นของ ttest_ind คือ equal_var=True ซึ่งสมมติว่าสองกลุ่มมีความแปรปรวนเท่ากัน

สรุปสูตรสำคัญ

standard error ของค่าเฉลี่ย
ช่วงความเชื่อมั่นสองด้านของค่าเฉลี่ย
สถิติทดสอบ t หนึ่งกลุ่ม
สถิติทดสอบ Welch

แหล่งอ้างอิงหลัก

  1. Montgomery, D. C., & Runger, G. C. (2018). Applied statistics and probability for engineers (7th ed.). Wiley. link
  2. NIST/SEMATECH. Confidence limits for the mean (section 1.3.5.2). e-Handbook of statistical methods. link
  3. NIST/SEMATECH. Two-sample t-test for equal means (section 1.3.5.3). e-Handbook of statistical methods. link
  4. NIST/SEMATECH. Tolerance intervals for a normal distribution (section 7.2.6.3). e-Handbook of statistical methods. link
  5. The SciPy community. Statistical functions (scipy.stats), SciPy 1.18 documentation. link
  6. Wasserstein, R. L., & Lazar, N. A. (2016). The ASA statement on p-values: Context, process, and purpose. The American Statistician, 70(2), 129–133. link
  7. Diez, D. M., Çetinkaya-Rundel, M., & Barr, C. D. (2019). OpenIntro statistics (4th ed.). OpenIntro. link

อ่านเพิ่มเติม

ศึกษาหน่วยความรู้ที่กำหนดล่วงหน้า ดูสื่อประกอบ และทำ quiz ประจำโมดูล

ในชั้นเรียน / ภาคสนาม

ปฏิบัติการในห้องแล็บหรือภาคสนามตามใบงาน พร้อม checklist ความปลอดภัย

หลักฐานการเรียนรู้: ใบงานที่ผ่านการตรวจและผล quiz

แบบทดสอบประจำโมดูล

แบบทดสอบนี้ใช้ตรวจความเข้าใจ (formative) ไม่ใช่การสอบเก็บคะแนน

โดเมนความรู้: คณิตศาสตร์ ฟิสิกส์ และสถิติ