Skip to content

Lab: Active Students > 100

คำถามง่ายๆ: “มีนักเรียน active กี่คนที่ price > 100?” — แต่คำตอบจะเปลี่ยนเมื่อมี missing values

เวลาที่ใช้: ~35 นาที

nameactiveprice
AliceTRUE150
BobTRUE80
CarolFALSE200
DaveTRUE120
EveTRUE50
FrankTRUE300
  1. คำถาม: มีนักเรียน active กี่คนที่ price > 100?

  2. Google Sheets

    สร้างข้อมูลใน A1:C7 แล้วใช้สูตร:

    =COUNTIFS(B2:B7, TRUE, C2:C7, ">"&100)

    ได้เท่าไหร่?

  3. Python (pandas)

    import pandas as pd
    df = 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)}")
  4. 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 students
    WHERE active = TRUE AND price > 100;
  5. ตอบ: คำตอบของคุณคือเท่าไหร่ ทั้ง 3 เครื่องมือตรงกันไหม?

Part 2: เพิ่ม NULL — ดูคำตอบเปลี่ยน

Section titled “Part 2: เพิ่ม NULL — ดูคำตอบเปลี่ยน”

ตอนนี้เปลี่ยนข้อมูล — Dave ไม่มีค่า active และ Eve ไม่มี price:

nameactiveprice
AliceTRUE150
BobTRUE80
CarolFALSE200
Dave(missing)120
EveTRUE(missing)
FrankTRUE300
  1. คำถามเดิม: มีนักเรียน active กี่คนที่ price > 100?

  2. Google Sheets

    แก้ข้อมูล: ลบค่า active ของ Dave (ปล่อยเซลล์ว่าง) และลบ price ของ Eve

    ใช้สูตรเดิม:

    =COUNTIFS(B2:B7, TRUE, C2:C7, ">"&100)

    คำตอบเปลี่ยนไหม? เป็นเท่าไหร่?

  3. Python (pandas)

    import pandas as pd
    import numpy as np
    df = 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)}")
    # ใครหายไป? ตรวจสอบ missing
    print("\n--- Missing active ---")
    print(df[df["active"].isna()])
    print("\n--- Missing price ---")
    print(df[df["price"].isna()])
  4. SQL

    -- แก้ข้อมูล Dave และ Eve
    UPDATE students SET active = NULL WHERE name = 'Dave';
    UPDATE students SET price = NULL WHERE name = 'Eve';
    -- query เดิม
    SELECT COUNT(*) FROM students
    WHERE active = TRUE AND price > 100;
    -- ใครหายไป?
    SELECT name, active, price FROM students
    WHERE active IS NULL OR price IS NULL;
  5. เปรียบเทียบ: คำตอบ Part 1 กับ Part 2 ต่างกันไหม? ทำไม?

  6. คิดต่อ: ถ้า 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 ไม่ใช่แค่ “ข้อมูลหายไปนิดหน่อย” — มันเปลี่ยน คำตอบของคำถามทั้งหมด