สถิติเชิงบรรยาย
ประมาณ 25 นาที
เป้าหมายของบท
- เข้าใจ mean/median/mode และรู้ว่าเมื่อไหร่ควรใช้ตัวไหน
- คำนวณ variance/std เพื่อบอกว่าข้อมูลกระจายมากหรือน้อย
- หา quartiles (Q1/Q3) และ IQR
- ใช้ IQR หา outlier ด้วย fence
จาก pandas สู่สถิติ
จบสาย pandas แล้ว ต่อไปนี้จะเรียนสถิติที่ใช้จริงในงาน DA — ไม่ใช่ทฤษฎีเชิงลึก แต่เป็นเครื่องมือที่ใช้ตอบคำถาม “ข้อมูลชุดนี้หน้าตาเป็นยังไง” และ “ตัวเลขไหนผิดปกติบ้าง” บทแรกนี้เริ่มจากพื้นฐานที่สุด: การสรุปข้อมูลด้วยตัวเลข ตัวเดียว (descriptive statistics)
ค่ากลาง: mean, median, mode
“ค่ากลาง” ของข้อมูลมีหลายแบบ แต่ละแบบตอบคำถามต่างกัน:
| ค่า | ความหมาย | pandas |
|---|---|---|
| mean (ค่าเฉลี่ย) | ผลรวมหารด้วยจำนวนข้อมูล | .mean() |
| median (มัธยฐาน) | ค่าที่อยู่ตรงกลางเมื่อเรียงข้อมูลแล้ว | .median() |
| mode (ฐานนิยม) | ค่าที่พบบ่อยที่สุด | .mode() |
import pandas as pd
products = pd.read_csv("data/products.csv")
products['price'].mean() # 2296.0
products['price'].median() # 1014.0
สังเกตว่า mean (2296.0) กับ median (1014.0) ของราคาสินค้าต่างกันเกินเท่าตัว — นี่ไม่ใช่ความผิดพลาด แต่เป็นสัญญาณว่าข้อมูลเบ้ขวา (right-skewed): มีสินค้าราคาแพงมากอยู่ไม่กี่ชิ้นที่ดึงค่าเฉลี่ยขึ้นไปสูงกว่า ค่ากลางจริงๆ ของข้อมูลส่วนใหญ่
mean คำนวณจากผลรวมของทุกค่า จึงไวต่อค่าที่สูงหรือต่ำผิดปกติ (outlier) มาก ในขณะที่ median ดูแค่ ตำแหน่งกลางของข้อมูลที่เรียงแล้ว ไม่ว่าค่าที่สูงที่สุดจะสูงขึ้นไปอีกแค่ไหน median ก็ไม่ขยับ — median จึง “ทนทาน” (robust) ต่อ outlier กว่า mean
กติกาที่ใช้ได้จริง: ถ้าข้อมูลมีแนวโน้มเบ้ (เช่น รายได้, ราคาสินค้า, ยอดขาย ที่มักมีค่าสูงผิดปกติบางค่า) ควรรายงาน median คู่กับ mean เสมอ ไม่ควรใช้ mean ตัวเดียวแล้วสรุปว่านั่นคือ “ค่าทั่วไป”
การกระจายของข้อมูล: variance และ standard deviation
ค่ากลางบอกได้แค่ “ตรงกลางอยู่ที่ไหน” แต่ไม่บอกว่าข้อมูลกระจายกว้างแค่ไหนรอบๆ ค่ากลางนั้น variance (ความแปรปรวน) วัดค่านี้โดยเฉลี่ยของ (ค่าแต่ละตัว - mean)² และ standard deviation (ส่วนเบี่ยงเบน มาตรฐาน, std) คือรากที่สองของ variance — ใช้ std มากกว่า variance ในทางปฏิบัติ เพราะหน่วยของ std เหมือนกับ หน่วยของข้อมูลเดิม (variance มีหน่วยเป็นกำลังสอง ตีความยากกว่า)
products['price'].std() # 3648.41
std ยิ่งมาก ยิ่งแปลว่าข้อมูลกระจายกว้าง (มีทั้งราคาถูกมากและแพงมากปนกัน) ส่วน std น้อย แปลว่าข้อมูลกระจุกตัว ใกล้ค่าเฉลี่ย
Quartiles และ IQR
Quartiles แบ่งข้อมูลที่เรียงแล้วออกเป็น 4 ส่วนเท่าๆ กัน:
- Q1 (เปอร์เซ็นไทล์ที่ 25): 25% ของข้อมูลอยู่ต่ำกว่าค่านี้
- Q2 คือ median นั่นเอง (เปอร์เซ็นไทล์ที่ 50)
- Q3 (เปอร์เซ็นไทล์ที่ 75): 75% ของข้อมูลอยู่ต่ำกว่าค่านี้
q1 = products['price'].quantile(0.25) # 494.0
q3 = products['price'].quantile(0.75) # 2381.5
IQR (interquartile range) คือช่วงระหว่าง Q3 กับ Q1 (Q3 - Q1) วัดการกระจายของข้อมูล 50% ตรงกลาง
โดยไม่สนใจค่าสุดโต่งที่ปลายทั้งสองข้าง — ต่างจาก range (max - min) ที่ไวต่อ outlier มาก เพราะ range
ขึ้นอยู่กับค่าที่สุดขั้วเพียงตัวเดียว
iqr = q3 - q1 # 1887.5
ใช้ IQR หา outlier
กฎที่ใช้กันทั่วไปในการหา outlier ด้วย IQR คือกำหนด “fence” (รั้ว) สองเส้น:
- upper fence (รั้วบน):
Q3 + 1.5 × IQR - lower fence (รั้วล่าง):
Q1 - 1.5 × IQR
ค่าไหนที่อยู่นอกรั้วทั้งสองนี้ถือว่าเป็น outlier ที่ควรตรวจสอบเพิ่มเติม
upper_fence = q3 + 1.5 * iqr
n_outliers = (products['price'] > upper_fence).sum()
ตัวคูณ 1.5 เป็นส่วนสำคัญของสูตร ไม่ใช่ตัวเลือก — ถ้าลืมใส่แล้วใช้ Q3 เฉยๆ เป็น fence จะได้เส้นแบ่งที่ต่ำ
เกินไป ทำให้สินค้าที่ราคาแค่ “แพงกว่าค่ามัธยฐานหน่อย” (ไม่ได้ผิดปกติจริง) ถูกนับเป็น outlier ไปด้วยเยอะเกินจำเป็น
ข้อดีของวิธีนี้คือไม่ต้องสมมติว่าข้อมูลมีการแจกแจงแบบใดแบบหนึ่ง (เช่น normal distribution) เหมือนกฎ z-score ที่จะเรียนในบทถัดไป — IQR fence ใช้ได้กับข้อมูลเบ้แรงๆ อย่างยอดขายหรือราคาสินค้าได้อย่างสมเหตุสมผลกว่า
ตัวอย่างแก้โจทย์
กด "ขั้นต่อไป" ทีละขั้น ลองรันและแก้โค้ดในแต่ละขั้นได้
ราคาสินค้าเฉลี่ย vs ค่ากลาง ต่างกันแค่ไหน
ทีมสินค้าอยากรู้ว่าราคาสินค้า "โดยทั่วไป" อยู่ที่เท่าไหร่ ลองดูทั้ง mean และ median เทียบกัน
หาค่าเฉลี่ย (mean) ของราคาสินค้าด้วย
.mean()
หา outlier ของราคาสินค้าด้วย IQR fence
ทีมสินค้าสงสัยว่ามีสินค้าราคา "ผิดปกติ" (แพงเกินไป) ปนอยู่ในร้านหรือไม่ ลองใช้กฎ IQR มาเช็ค
หา Q1 (เปอร์เซ็นไทล์ที่ 25) และ Q3 (เปอร์เซ็นไทล์ที่ 75) ด้วย
.quantile()แล้วคำนวณ IQR = Q3 - Q1
เติมช่องว่าง
แทน ___ ด้วยโค้ดที่ถูกต้อง แล้วกดตรวจคำตอบ
หาส่วนเบี่ยงเบนมาตรฐาน (standard deviation) ของยอดขายต่อออเดอร์ (เฉพาะออเดอร์ที่ status เป็น completed)
โดยยอดขายต่อออเดอร์คือผลรวมของ quantity * unit_price ในแต่ละ order_id
เก็บผลลัพธ์ไว้ในตัวแปร std_order_rev เติม ___ ให้ครบ
เติมสูตร upper fence สำหรับหา outlier ของราคาสินค้า (Q3 + ___ * IQR) เก็บผลไว้ในตัวแปร upper_fence
เติม ___ ให้ครบ
แบบฝึกท้ายบท
บทนี้จะนับว่าเสร็จเมื่อผ่านข้อพื้นฐานและประยุกต์ครบ ข้อท้าทายได้ดาวเพิ่ม
🟢 พื้นฐาน
ราคาเฉลี่ย (mean) ของสินค้าทั้งหมด เก็บไว้ในตัวแปร mean_price
ค่ากลาง (median) ของราคาสินค้าทั้งหมด เก็บไว้ในตัวแปร median_price
ส่วนเบี่ยงเบนมาตรฐาน (standard deviation) ของราคาสินค้าทั้งหมด เก็บไว้ในตัวแปร std_price
หาเปอร์เซ็นไทล์ที่ 25 (Q1) และเปอร์เซ็นไทล์ที่ 75 (Q3) ของราคาสินค้า เก็บไว้ในตัวแปร q1_price และ q3_price
🟡 ประยุกต์
IQR (interquartile range) ของราคาสินค้า (Q3 - Q1) เก็บไว้ในตัวแปร iqr_price
ค่ากลาง (median) ของยอดขายต่อออเดอร์ (เฉพาะออเดอร์ที่ status เป็น completed โดยยอดต่อออเดอร์คือผลรวมของ quantity * unit_price ในแต่ละ order_id) เก็บไว้ในตัวแปร median_order_rev
ยอดขายต่อออเดอร์ (completed orders เท่านั้น) เบ้ขวาหรือไม่ (ตรวจจาก mean > median) เก็บผลบูลีนไว้ในตัวแปร is_right_skewed
จำนวนออเดอร์ที่ยอดขาย (completed orders เท่านั้น) เกิน upper IQR fence (Q3 + 1.5*IQR ของยอดต่อออเดอร์) เก็บไว้ในตัวแปร n_outliers
🔴 ท้าทาย
ค่า skewness ของราคาสินค้า (ใช้ .skew()) เก็บไว้ในตัวแปร skew_price
lower IQR fence ของยอดขายต่อออเดอร์ (completed orders เท่านั้น, สูตร Q1 - 1.5*IQR — ค่านี้จะติดลบ เพราะ ยอดขายเป็นลบไม่ได้จริง จึงไม่มี outlier ด้านล่างที่มีความหมาย) เก็บไว้ในตัวแปร lower_fence
Quiz
สรุป
- mean ไวต่อ outlier แต่ median ทนทานกว่า เพราะดูแค่ตำแหน่งกลาง — ข้อมูลเบ้ขวาจะมี mean > median เสมอ
- variance/std บอกว่าข้อมูลกระจายมากหรือน้อยรอบค่าเฉลี่ย
- IQR (Q3 - Q1) วัดการกระจายของข้อมูล 50% ตรงกลาง ทนทานต่อ outlier มากกว่า range (max - min)
- ใช้ IQR fence (Q3 + 1.5*IQR) หา outlier ด้านบนได้ โดยไม่ต้องสมมติว่าข้อมูลเป็นการแจกแจงปกติ
คำถามสัมภาษณ์
ทำไมนักวิเคราะห์มักดู median ควบคู่กับ mean เสมอเวลารายงานตัวเลข
เพราะ mean เพียงตัวเดียวอาจทำให้เข้าใจผิดได้ถ้าข้อมูลเบ้ (skewed) หรือมี outlier — เช่นรายได้เฉลี่ยต่อออเดอร์ อาจถูกดึงสูงขึ้นไปมากจากออเดอร์ขนาดใหญ่ไม่กี่ออเดอร์ ทำให้ตัวเลข mean ดูดีเกินความเป็นจริงของ "ออเดอร์ทั่วไป"
การดู median ควบคู่กันช่วยให้เห็นภาพที่สมดุลขึ้น: ถ้า mean กับ median ใกล้กัน ข้อมูลค่อนข้างสมมาตร แต่ถ้าต่างกันมาก (แบบราคาสินค้าหรือยอดขายในร้านนี้) ก็เป็นสัญญาณว่าต้องระวังการตีความ และอาจต้องดู distribution ทั้งหมดเพิ่มเติม
เจอ outlier ในข้อมูลควรทำยังไง
ไม่ควรลบทิ้งทันทีโดยไม่ตรวจสอบ — ขั้นแรกต้องหาที่มาก่อนเสมอว่า outlier นี้เกิดจากอะไร อาจเป็นข้อผิดพลาดในการ บันทึกข้อมูล (เช่น ใส่จำนวนผิดหลัก) หรืออาจเป็นเหตุการณ์จริงที่มีความหมายทางธุรกิจ (เช่น ลูกค้าองค์กรสั่งซื้อจำนวนมาก)
ถ้าเป็นข้อผิดพลาดจริง ค่อยแก้ไขหรือตัดออก แต่ถ้าเป็นค่าจริงที่มีความหมาย ควรเก็บไว้วิเคราะห์แยกต่างหาก หรือใช้สถิติ ที่ทนทานต่อ outlier (เช่น median แทน mean) แทนการลบข้อมูลทิ้งไปเฉยๆ