Lab: Active Students > 100
คำถามง่ายๆ: “มีนักเรียน active กี่คนที่ price > 100?” — แต่คำตอบจะเปลี่ยนเมื่อมี missing values
เวลาที่ใช้: ~35 นาที
ข้อมูลตั้งต้น
Section titled “ข้อมูลตั้งต้น”| name | active | price |
|---|---|---|
| Alice | TRUE | 150 |
| Bob | TRUE | 80 |
| Carol | FALSE | 200 |
| Dave | TRUE | 120 |
| Eve | TRUE | 50 |
| Frank | TRUE | 300 |
Part 1: ไม่มี NULL
Section titled “Part 1: ไม่มี NULL”-
คำถาม: มีนักเรียน active กี่คนที่ price > 100?
-
Google Sheets
สร้างข้อมูลใน A1:C7 แล้วใช้สูตร:
=COUNTIFS(B2:B7, TRUE, C2:C7, ">"&100)ได้เท่าไหร่?
-
Python (pandas)
import pandas as pddf = pd.DataFrame({"name": ["Alice", "Bob", "Carol", "Dave", "Eve", "Frank"],"active": [True, True, False, True, True, True],"price": [150, 80, 200, 120, 50, 300]})result = df[(df["active"] == True) & (df["price"] > 100)]print(result)print(f"Count: {len(result)}") -
SQL
CREATE TABLE students (name VARCHAR(50),active BOOLEAN,price NUMERIC(10, 2));INSERT INTO students VALUES ('Alice', TRUE, 150);INSERT INTO students VALUES ('Bob', TRUE, 80);INSERT INTO students VALUES ('Carol', FALSE, 200);INSERT INTO students VALUES ('Dave', TRUE, 120);INSERT INTO students VALUES ('Eve', TRUE, 50);INSERT INTO students VALUES ('Frank', TRUE, 300);SELECT COUNT(*) FROM studentsWHERE active = TRUE AND price > 100; -
ตอบ: คำตอบของคุณคือเท่าไหร่ ทั้ง 3 เครื่องมือตรงกันไหม?
Part 2: เพิ่ม NULL — ดูคำตอบเปลี่ยน
Section titled “Part 2: เพิ่ม NULL — ดูคำตอบเปลี่ยน”ตอนนี้เปลี่ยนข้อมูล — Dave ไม่มีค่า active และ Eve ไม่มี price:
| name | active | price |
|---|---|---|
| Alice | TRUE | 150 |
| Bob | TRUE | 80 |
| Carol | FALSE | 200 |
| Dave | (missing) | 120 |
| Eve | TRUE | (missing) |
| Frank | TRUE | 300 |
-
คำถามเดิม: มีนักเรียน active กี่คนที่ price > 100?
-
Google Sheets
แก้ข้อมูล: ลบค่า active ของ Dave (ปล่อยเซลล์ว่าง) และลบ price ของ Eve
ใช้สูตรเดิม:
=COUNTIFS(B2:B7, TRUE, C2:C7, ">"&100)คำตอบเปลี่ยนไหม? เป็นเท่าไหร่?
-
Python (pandas)
import pandas as pdimport numpy as npdf = pd.DataFrame({"name": ["Alice", "Bob", "Carol", "Dave", "Eve", "Frank"],"active": [True, True, False, None, True, True],"price": [150, 80, 200, 120, None, 300]})# ใช้ filter เดิมresult = df[(df["active"] == True) & (df["price"] > 100)]print(result)print(f"Count: {len(result)}")# ใครหายไป? ตรวจสอบ missingprint("\n--- Missing active ---")print(df[df["active"].isna()])print("\n--- Missing price ---")print(df[df["price"].isna()]) -
SQL
-- แก้ข้อมูล Dave และ EveUPDATE students SET active = NULL WHERE name = 'Dave';UPDATE students SET price = NULL WHERE name = 'Eve';-- query เดิมSELECT COUNT(*) FROM studentsWHERE active = TRUE AND price > 100;-- ใครหายไป?SELECT name, active, price FROM studentsWHERE active IS NULL OR price IS NULL; -
เปรียบเทียบ: คำตอบ Part 1 กับ Part 2 ต่างกันไหม? ทำไม?
-
คิดต่อ: ถ้า Dave จริงๆ เป็น active (แค่ลืมใส่ค่า) และ Eve มี price 200 (แค่ลืมบันทึก) — คำตอบ “ที่ถูกต้อง” ควรเป็นเท่าไหร่?
ดูเฉลย Part 1
Part 1 (ไม่มี NULL):
นักเรียน active ที่ price > 100:
- Alice: active=TRUE, price=150 → ผ่าน
- Bob: active=TRUE, price=80 → ไม่ผ่าน (price ≤ 100)
- Carol: active=FALSE, price=200 → ไม่ผ่าน (ไม่ active)
- Dave: active=TRUE, price=120 → ผ่าน
- Eve: active=TRUE, price=50 → ไม่ผ่าน (price ≤ 100)
- Frank: active=TRUE, price=300 → ผ่าน
คำตอบ: 3 คน (Alice, Dave, Frank) — ทั้ง 3 เครื่องมือตรงกัน
ดูเฉลย Part 2
Part 2 (มี NULL):
- Alice: active=TRUE, price=150 → ผ่าน
- Bob: active=TRUE, price=80 → ไม่ผ่าน (price ≤ 100)
- Carol: active=FALSE, price=200 → ไม่ผ่าน (ไม่ active)
- Dave: active=NULL, price=120 → หายไป! (NULL = TRUE → NULL → ถูกตัดออก)
- Eve: active=TRUE, price=NULL → หายไป! (NULL > 100 → NULL → ถูกตัดออก)
- Frank: active=TRUE, price=300 → ผ่าน
คำตอบ: 2 คน (Alice, Frank)
จาก 3 คนเหลือ 2 คน — Dave และ Eve หายไปเพราะ NULL ทำให้ condition กลายเป็น unknown
ถ้า Dave จริงๆ active และ Eve มี price 200: คำตอบควรเป็น 4 คน (Alice, Dave, Eve, Frank) — ห่างจากคำตอบที่ได้ (2 คน) ถึง 2 เท่า!
บทเรียน: Missing values ไม่ใช่แค่ “ข้อมูลหายไปนิดหน่อย” — มันเปลี่ยน คำตอบของคำถามทั้งหมด