Skip to content

Lab: Clean Real Dataset

นำเข้าไฟล์ CSV ที่มีปัญหา ทำความสะอาดข้อมูล ตั้ง Validation แล้วใช้ QUERY + VLOOKUP ตอบ 5 คำถามทางธุรกิจ

ข้อมูลเริ่มต้น

Section titled “ข้อมูลเริ่มต้น”

สร้าง Google Sheet ใหม่ชื่อ “GS-4 Lab: Clean Real Dataset” แล้วสร้างข้อมูลตามนี้:

  1. สร้าง Sheet “raw_orders” — ข้อมูลคำสั่งซื้อ (จำลอง CSV Import)

    พิมพ์ข้อมูลนี้ (จงใจใส่ปัญหาไว้):

    order_iddatecustomer_idproduct_idqtystatus
    0012025-03-15C001P1015shipped
    00215/03/2025C002P203shipped
    0032025-03-16C001P1013Shipped
    0042025-03-17C003P9992pending
    0052025-03-18C002P305-1completed
    0062025/03/19C004P10110shipped
    0072025-03-20C001P203abcpending
    0082025-03-21C005P3057Completed

    ปัญหาที่ซ่อนอยู่: วันที่หลายรูปแบบ, qty เว้นว่าง/ติดลบ/ไม่ใช่ตัวเลข, status ตัวพิมพ์ไม่สม่ำเสมอ

  2. สร้าง Sheet “products” — ตารางสินค้าอ้างอิง

    product_idnamepricecategory
    P101Widget A500Electronics
    P203Gadget B1200Electronics
    P305Notebook C150Stationery
    P410Pen D35Stationery
  3. สร้าง Sheet “clean_orders” — ทำความสะอาดข้อมูล

    คัดลอก raw_orders มาแล้วแก้ไข:

    • แก้ format วันที่ให้เหมือนกัน
    • แก้ status ให้เป็น lowercase ทั้งหมด
    • จัดการ qty ที่ผิดปกติ
    • เพิ่มคอลัมน์ product_name และ total ด้วย VLOOKUP/XLOOKUP
  4. สร้าง Sheet “validation” — ตั้ง Data Validation

    สร้างแบบฟอร์มกรอกคำสั่งซื้อใหม่พร้อม Validation:

    • order_id: ห้ามว่าง
    • date: ต้องเป็นวันที่ในปี 2025
    • product_id: Dropdown จาก products sheet
    • qty: ตัวเลข 1-1000
    • status: Dropdown (pending, shipped, completed)
  5. สร้าง Sheet “analysis” — ตอบ 5 คำถามธุรกิจ

    ใช้สูตร QUERY, FILTER, VLOOKUP บน clean_orders เพื่อตอบคำถาม

ใน Sheet “analysis” ตอบคำถามเหล่านี้ (แต่ละข้อใช้สูตรเดียว):

  1. ยอดขายรวมทั้งหมด (sum of total)
  2. สินค้าที่ขายดีที่สุด (มี qty สูงสุดรวมทุก order)
  3. ลูกค้าที่สั่งบ่อยที่สุด (จำนวน orders มากสุด)
  4. ยอดขายแยกตาม Category (Electronics vs Stationery)
  5. รายการที่ status = “pending” (แสดงรายละเอียดทั้งหมด)
Show Solution
สูตรสำหรับ clean_orders:
status (ทำให้ lowercase):
=LOWER(F2)
product_name (ดึงชื่อสินค้า):
=XLOOKUP(D2, products!A:A, products!B:B, "ไม่พบ")
price (ดึงราคา):
=XLOOKUP(D2, products!A:A, products!C:C, 0)
total (คำนวณยอดรวม):
=IF(ISNUMBER(E2), E2 * XLOOKUP(D2, products!A:A, products!C:C, 0), 0)
สำหรับ qty ที่มีปัญหา:
- Row 2 (ว่าง): ใส่ 0 หรือ flag ว่า missing
- Row 5 (ติดลบ): ใช้ =ABS(E5) หรือ flag ว่าผิดปกติ
- Row 7 ("abc"): ไม่สามารถคำนวณ → ใส่ 0 หรือ flag
ตรวจสอบ qty:
=IF(AND(ISNUMBER(E2), E2>0), E2, 0)
Show Solution
Data Validation สำหรับแบบฟอร์มกรอกข้อมูล:
order_id: Custom formula → =A2<>""
date: Date is between → 1/1/2025 and 31/12/2025
product_id: Dropdown from range → products!A2:A5
qty: Number is between → 1 and 1000
status: Dropdown → pending, shipped, completed
ทุกข้อตั้งเป็น "Reject input" เพื่อป้องกันข้อมูลผิด
Show Solution
=SUM(clean_orders!H2:H100)
หรือถ้าคำนวณ total ในแต่ละแถว:
=SUMPRODUCT(
IF(ISNUMBER(clean_orders!E2:E100),clean_orders!E2:E100,0) *
XLOOKUP(clean_orders!D2:D100, products!A:A, products!C:C, 0)
)
Show Solution
=QUERY(clean_orders!A1:H100,
"SELECT D, SUM(E)
WHERE E IS NOT NULL
GROUP BY D
ORDER BY SUM(E) DESC
LIMIT 1")
Show Solution
=QUERY(clean_orders!A1:H100,
"SELECT C, COUNT(A)
GROUP BY C
ORDER BY COUNT(A) DESC
LIMIT 1")
Show Solution
=QUERY({clean_orders!D2:D100, clean_orders!H2:H100,
XLOOKUP(clean_orders!D2:D100, products!A:A, products!D:D)},
"SELECT Col3, SUM(Col2)
GROUP BY Col3
LABEL Col3 'Category', SUM(Col2) 'Total Sales'")
Show Solution
=FILTER(clean_orders!A2:H100, clean_orders!G2:G100 = "pending")
  • ข้อมูลใน clean_orders ไม่มี format วันที่ปนกัน
  • status เป็น lowercase ทั้งหมด
  • qty ที่ผิดปกติถูกจัดการแล้ว (0 หรือ flag)
  • XLOOKUP ดึง product_name ได้ถูกต้อง (P999 แสดง “ไม่พบ”)
  • Validation ป้องกันข้อมูลผิดในแบบฟอร์มใหม่
  • ตอบ 5 คำถามธุรกิจได้ด้วยสูตรเดียวต่อข้อ