Data Analyst › สถิติสำหรับ DA

สหสัมพันธ์และเหตุ-ผล

ประมาณ 25 นาที

เป้าหมายของบท

  • เข้าใจ Pearson correlation coefficient และวิธีตีความค่า r
  • เข้าใจว่า correlation ไม่ได้แปลว่ามีความสัมพันธ์เชิงเหตุ-ผล (causation) เสมอไป
  • รู้จัก confounding variable (ตัวแปรกวน) ที่ทำให้สองตัวแปรดูสัมพันธ์กันทั้งที่ไม่ได้เป็นเหตุเป็นผลกันโดยตรง

จาก A/B test สู่ correlation

บทที่แล้วเรียนเรื่อง A/B testing ไปแล้ว — จุดแข็งของ A/B test คือการสุ่มผู้ใช้เข้ากลุ่ม ทำให้ถ้าเจอความต่าง ที่มีนัยสำคัญ เราสรุปได้ค่อนข้างมั่นใจว่า “การเปลี่ยนแปลงที่ทำ” เป็นเหตุของความต่างนั้นจริง เพราะการสุ่มทำให้ ปัจจัยอื่นๆ ถูกกระจายเท่าๆ กันในทั้งสองกลุ่มโดยเฉลี่ย

แต่ข้อมูลส่วนใหญ่ที่ DA เจอในชีวิตจริงไม่ได้มาจากการทดลองแบบสุ่ม — มันคือข้อมูลที่เกิดขึ้นเองตามธรรมชาติของธุรกิจ (observational data) บทนี้จะเรียนเครื่องมือที่ใช้บอกว่าตัวแปรสองตัว “สัมพันธ์กัน” แค่ไหน (correlation) และ ที่สำคัญกว่านั้นคือกับดักที่พบบ่อยที่สุดข้อหนึ่งของการวิเคราะห์ข้อมูล: การเห็นว่าสองอย่างสัมพันธ์กันแล้วรีบสรุปว่า อย่างหนึ่งเป็นเหตุให้เกิดอีกอย่างหนึ่ง

Pearson correlation coefficient

Pearson correlation coefficient (มักเขียนแทนด้วย r) วัดว่าตัวแปรตัวเลขสองตัวมีความสัมพันธ์แบบเชิงเส้น (linear) กันมากแค่ไหน ค่า r อยู่ในช่วง -1 ถึง 1:

ค่า r ความหมาย
ใกล้ +1 สัมพันธ์เชิงบวกแรง (ตัวหนึ่งขึ้น อีกตัวก็ขึ้นตาม เป็นเส้นตรง)
ใกล้ -1 สัมพันธ์เชิงลบแรง (ตัวหนึ่งขึ้น อีกตัวลง เป็นเส้นตรง)
ใกล้ 0 แทบไม่มีความสัมพันธ์เชิงเส้น

pandas มีเมธอด .corr() ให้ใช้ตรงๆ ระหว่าง Series สองตัว:

import pandas as pd

products = pd.read_csv("data/products.csv")
r = products['price'].corr(products['cost'])
r   # 0.9957

r = 0.9957 ใกล้ 1 มาก แปลว่าราคาขาย (price) กับต้นทุน (cost) ของสินค้าสัมพันธ์กันแรงมากในเชิงเส้น — สินค้าต้นทุนสูงมักขายแพง สินค้าต้นทุนต่ำมักขายถูก

สัมพันธ์กันแรง ≠ อย่างหนึ่งเป็นเหตุของอีกอย่างหนึ่ง

พอเห็น r = 0.9957 หลายคนจะรีบสรุปว่า “ต้นทุนสูงทำให้ราคาสูง” หรือ “ตั้งราคาสูงทำให้ต้นทุนสูง” — แต่การสรุปแบบนี้ ข้ามขั้นตอนสำคัญไป ความสัมพันธ์ทางสถิติ (correlation) บอกแค่ว่าตัวเลขสองชุดเคลื่อนไหวไปด้วยกัน แต่ไม่ได้บอกว่า ทำไมถึงเคลื่อนไหวไปด้วยกัน อาจเป็นไปได้สามแบบ: A ทำให้เกิด B, B ทำให้เกิด A, หรือมีตัวแปรที่สามที่ทำให้ทั้ง A และ B เกิดขึ้นพร้อมกัน

ตัวแปรที่สามแบบหลังนี้เรียกว่า confounding variable (ตัวแปรกวน) — ตัวแปรที่ส่งผลต่อทั้งสองตัวแปรที่กำลังดูอยู่ พร้อมกัน ทำให้สองตัวแปรนั้นดูสัมพันธ์กันทั้งที่ไม่ได้เป็นเหตุเป็นผลกันโดยตรง

ในกรณีของ price กับ cost ตัวแปรกวนคือ category (หมวดหมู่สินค้า) — สินค้าแต่ละหมวด (Electronics, Fashion, Home ฯลฯ) มีทั้งช่วงราคาและอัตราส่วนต้นทุนต่อราคาเป็นของตัวเอง ลองดูราคาเฉลี่ยแยกตามหมวด:

products.groupby('category')['price'].mean()
# Electronics แพงกว่า Sports, Sports แพงกว่า Home, ...

หมวดสินค้าคือสิ่งที่กำหนดทั้งช่วงราคาและช่วงต้นทุนไปพร้อมกันตั้งแต่ต้น ไม่ใช่ว่าต้นทุนไปดันราคาโดยตรงเพียงอย่างเดียว — แม้ในทางปฏิบัติ ธุรกิจจริงก็มักตั้งราคาจากสูตรที่อิงต้นทุนอยู่บ้าง (เช่น cost-plus pricing) ดังนั้นในเคสนี้จึงน่าจะเป็น ทั้งตัวแปรกวนร่วม (category) และกลไกเชิงตรงบางส่วน (สูตรตั้งราคาจากต้นทุน) ปนกันอยู่ ไม่ใช่เรื่องเดียวล้วนๆ

ไม่มี correlation ก็ไม่ได้แปลว่าไม่มีเหตุ-ผล

กับดักอีกด้านหนึ่งคือการสรุปในทิศทางตรงข้าม: เจอ r ใกล้ 0 แล้วรีบสรุปว่า “ไม่มีความสัมพันธ์เชิงเหตุ-ผลแน่นอน” ลองดูตัวอย่าง: ทีมการตลาดเชื่อว่าส่วนลด (discount_pct) น่าจะทำให้ลูกค้าซื้อของมากขึ้น (ยอดต่อออเดอร์สูงขึ้น)

r_discount_rev = orders['discount_pct'].fillna(0).corr(order_revenue)
r_discount_rev   # -0.022

r = -0.022 ใกล้ 0 มาก แปลว่าแทบไม่มีความสัมพันธ์เชิงเส้นระหว่างส่วนลดกับยอดต่อออเดอร์ในข้อมูลชุดนี้เลย — ทั้งที่ เรื่องเล่าเชิงธุรกิจ (“ลดราคาแล้วคนซื้อเยอะขึ้น”) ฟังดูสมเหตุสมผล

แต่การไม่เจอ correlation ไม่ได้พิสูจน์ว่าผลเชิงเหตุ-ผลไม่มีอยู่จริง เป็นไปได้ว่า:

  • ผลกระทบจริงถูกปัจจัยอื่นกลบไว้ (เช่น ลูกค้าที่ได้ส่วนลดกับลูกค้าที่ไม่ได้ อาจเป็นคนละกลุ่มพฤติกรรมกันตั้งแต่ต้น)
  • ความสัมพันธ์อาจไม่ใช่แบบเส้นตรง — Pearson correlation จับได้แค่ความสัมพันธ์เชิงเส้นเท่านั้น ถ้าส่วนลดมีผลจริง แต่เป็นรูปแบบโค้ง (เช่น ได้ผลดีเฉพาะช่วงส่วนลด 5-10% แต่ช่วงอื่นไม่ได้ผล) r ที่คำนวณได้อาจใกล้ 0 ทั้งที่มีความสัมพันธ์ อยู่จริง

จะรู้ได้ยังไงว่าเป็นเหตุ-ผลจริง

เมื่อเจอตัวแปรสองตัวที่สัมพันธ์กันแรงในข้อมูล observational (ไม่ได้มาจากการทดลองสุ่ม) วิธีตรวจสอบว่าเป็นเหตุ-ผลจริง หรือแค่ confounded มีหลักคร่าวๆ ดังนี้:

  1. ทำ A/B test แบบสุ่มจริง ถ้าทำได้ — นี่คือวิธีที่แข็งแรงที่สุดในการพิสูจน์เหตุ-ผล เพราะการสุ่มตัดผลของตัวแปรกวนออกไป
  2. ควบคุมตัวแปรที่สงสัยว่าเป็นตัวกวน เช่น เทียบ correlation ของ price/cost ภายในแต่ละ category แยกกัน แทนที่จะดูรวมทุกหมวด ถ้า correlation ยังแรงอยู่แม้ควบคุม category แล้ว ก็เป็นหลักฐานว่ามีกลไกเชิงตรงอยู่จริงด้วย
  3. ใช้ domain knowledge ประกอบเสมอ — ถามว่า “มีกลไกอะไรที่สมเหตุสมผลที่ A จะทำให้เกิด B” ก่อนสรุปอะไรจากตัวเลขล้วนๆ

ตัวอย่างคลาสสิกที่ใช้สอนเรื่องนี้กันทั่วไป: ยอดขายไอศกรีมกับจำนวนคนจมน้ำในแต่ละเดือนมีความสัมพันธ์กันสูงมาก — แต่ไม่ใช่ เพราะไอศกรีมทำให้คนจมน้ำ ทั้งสองอย่างสูงพร้อมกันเพราะอุณหภูมิ/ฤดูร้อน เป็นตัวแปรกวนที่ทำให้คนทั้งซื้อไอศกรีมเยอะขึ้น และไปว่ายน้ำเยอะขึ้นในเวลาเดียวกัน

ตัวอย่างแก้โจทย์

กด "ขั้นต่อไป" ทีละขั้น ลองรันและแก้โค้ดในแต่ละขั้นได้

ราคาสินค้ากับต้นทุนสัมพันธ์กันแค่ไหน

ทีมการเงินสังเกตว่าสินค้าที่ต้นทุนสูงมักขายแพง เลยอยากรู้ว่าราคาขาย (price) กับต้นทุน (cost) ของสินค้า สัมพันธ์กันแรงแค่ไหน แล้วสรุปได้เลยไหมว่าต้นทุนเป็นตัว "ทำให้" ราคาสูงขึ้นโดยตรง

  1. หา Pearson correlation ระหว่าง price กับ cost ด้วย .corr()

    Python

ส่วนลดกับยอดต่อออเดอร์สัมพันธ์กันจริงไหม

ทีมการตลาดเชื่อว่าส่วนลด (discount_pct) น่าจะทำให้ลูกค้าซื้อของมากขึ้น (ยอดต่อออเดอร์สูงขึ้น) ลองเช็คด้วย correlation ว่าข้อมูลจริงสนับสนุนความเชื่อนี้ไหม

  1. หายอดต่อออเดอร์ (เฉพาะ completed orders) แล้วดึง discount_pct ต่อออเดอร์มาเทียบ โดยเติมค่าว่าง (ไม่มีส่วนลด) ด้วย 0 ก่อน

    Python

เติมช่องว่าง

แทน ___ ด้วยโค้ดที่ถูกต้อง แล้วกดตรวจคำตอบ

ยังไม่ได้ทำ

เติม ___ ให้ครบเพื่อหา Pearson correlation ระหว่างราคาสินค้า (price) กับต้นทุน (cost) เก็บผลไว้ในตัวแปร r_price_cost (blank ทั้งสองจุดคือ products)

แบบฝึกท้ายบท

บทนี้จะนับว่าเสร็จเมื่อผ่านข้อพื้นฐานและประยุกต์ครบ ข้อท้าทายได้ดาวเพิ่ม

🟢 พื้นฐาน

🟢 พื้นฐานยังไม่ได้ทำ

Pearson correlation ระหว่างราคาสินค้า (price) กับต้นทุนสินค้า (cost) เก็บไว้ในตัวแปร r_price_cost

🟢 พื้นฐานยังไม่ได้ทำ

จากค่า correlation ระหว่างราคากับต้นทุนที่คำนวณได้ ความสัมพันธ์นี้ถือว่า "แรง" หรือไม่ (ใช้กติกาง่ายๆ ว่า |r| > 0.7 ถือว่าแรง) เก็บผลบูลีนไว้ในตัวแปร is_strong

🟢 พื้นฐานยังไม่ได้ทำ

Pearson correlation ระหว่างส่วนลด (discount_pct ของออเดอร์ที่ completed เท่านั้น เติมค่าว่างด้วย 0) กับ ยอดขายต่อออเดอร์ (ผลรวม quantity * unit_price ต่อ order_id) เก็บไว้ในตัวแปร r_discount_rev

🟢 พื้นฐานยังไม่ได้ทำ

จากค่า correlation ระหว่างส่วนลดกับยอดต่อออเดอร์ ความสัมพันธ์นี้ถือว่า "แรง" หรือไม่ (|r| > 0.7) เก็บผล บูลีนไว้ในตัวแปร is_strong_discount

🟡 ประยุกต์

🟡 ประยุกต์ยังไม่ได้ทำ

p-value ของ Pearson correlation ระหว่างราคาสินค้ากับต้นทุน (ใช้ scipy.stats.pearsonr) ความสัมพันธ์นี้มีนัยสำคัญ ทางสถิติที่ α=0.05 หรือไม่ เก็บผลบูลีนไว้ในตัวแปร price_cost_significant

🟡 ประยุกต์ยังไม่ได้ทำ

ราคาเฉลี่ยของสินค้าแยกตามหมวด (category) เก็บไว้ในตัวแปร result (Series ชื่อ price, index เป็น category) — ใช้เพื่อโต้แย้งว่า category น่าจะเป็นตัวแปรกวนร่วมที่อยู่เบื้องหลัง correlation ของราคากับต้นทุน

🟡 ประยุกต์ยังไม่ได้ทำ

ต้นทุนเฉลี่ยของสินค้าแยกตามหมวด (category) เก็บไว้ในตัวแปร result (Series ชื่อ cost, index เป็น category) — แนวคิดเดียวกับ e6 แต่ดูฝั่งต้นทุนแทน

🔴 ท้าทาย

🔴 ท้าทายยังไม่ได้ทำ

จาก e6/e7 จะเห็นว่าทั้งราคาและต้นทุนต่างกันมากระหว่างหมวดสินค้า (เช่น Electronics มีทั้งช่วงราคาและช่วงต้นทุน กว้างกว่าหมวดอื่นชัดเจน) แต่ correlation ระหว่าง price กับ cost ก็ยังแรงมากแม้จะมองแยกภายในหมวดเดียวกันด้วย คำถามจริง-เท็จ: กรณีนี้น่าจะเป็นทั้ง "confounding ร่วม" (category ขับเคลื่อนทั้งคู่) และ "กลไกเชิงตรงบางส่วน" (สูตรตั้งราคาที่อิงต้นทุนโดยตรง) ปนกันอยู่ ไม่ใช่คำอธิบายเดียวล้วนๆ เก็บผลบูลีนไว้ในตัวแปร both_factors_plausible

Quiz

1. Pearson correlation coefficient วัดความสัมพันธ์แบบไหน
2. r ใกล้ 0 แปลว่าตัวแปรสองตัวไม่มีความสัมพันธ์กันแน่นอนไหม
3. confounding variable (ตัวแปรกวน) คืออะไร
4. เจอ correlation สูงมาก (เช่น r=0.99) ควรสรุปได้เลยไหมว่าอะไรเป็นเหตุอะไรเป็นผล
5. ตัวอย่างคลาสสิกของ correlation without causation คือยอดขายไอศกรีมกับจำนวนคนจมน้ำที่สัมพันธ์กัน ทั้งสองสัมพันธ์กันเพราะอะไร

สรุป

  • Pearson correlation (r) วัดความสัมพันธ์เชิงเส้นระหว่างตัวแปรตัวเลขสองตัว อยู่ในช่วง -1 ถึง 1
  • correlation ไม่ได้แปลว่ามีเหตุ-ผล (correlation ≠ causation) — A อาจทำให้เกิด B, B อาจทำให้เกิด A หรือมี confounding variable ทำให้ทั้งคู่เกิดพร้อมกัน
  • confounding variable คือตัวแปรที่ส่งผลต่อทั้งสองตัวแปรที่ดูอยู่พร้อมกัน ทำให้ดูสัมพันธ์กันทั้งที่ไม่ได้เป็นเหตุเป็นผลโดยตรง
  • r ใกล้ 0 ก็ไม่ได้พิสูจน์ว่าไม่มีเหตุ-ผล เพราะ Pearson จับได้แค่ความสัมพันธ์เชิงเส้นเท่านั้น
  • วิธีตรวจสอบเหตุ-ผลจริงที่แข็งแรงที่สุดคือ A/B test แบบสุ่ม รองลงมาคือควบคุมตัวแปรกวนที่สงสัยและใช้ domain knowledge ประกอบ

คำถามสัมภาษณ์

อธิบายความแตกต่างระหว่าง correlation กับ causation ให้ผู้บริหารฟัง พร้อมยกตัวอย่าง

Correlation คือการที่ตัวเลขสองชุด "เคลื่อนไหวไปด้วยกัน" — เห็นแนวโน้มไปในทิศทางเดียวกันหรือตรงข้ามกันอย่างสม่ำเสมอ ส่วน causation คือการที่ตัวหนึ่งเป็น "เหตุ" ที่ทำให้อีกตัวหนึ่งเกิดขึ้นจริงๆ ตัวเลขที่สัมพันธ์กันแรงไม่ได้แปลว่า ตัวหนึ่งเป็นเหตุของอีกตัวหนึ่งเสมอไป

ตัวอย่างที่อธิบายง่าย: ยอดขายไอศกรีมกับจำนวนคนจมน้ำในแต่ละเดือนสัมพันธ์กันสูงมาก แต่ไม่ใช่เพราะไอศกรีมทำให้คน จมน้ำ ทั้งสองสูงขึ้นพร้อมกันเพราะอากาศร้อน/ฤดูร้อน ซึ่งทำให้คนทั้งซื้อไอศกรีมและไปว่ายน้ำมากขึ้น — ในธุรกิจของเรา ก็เจอแบบเดียวกัน เช่น ราคาสินค้ากับต้นทุนสัมพันธ์กันแรงมาก แต่ตัวขับเคลื่อนจริงคือหมวดหมู่สินค้าที่กำหนดทั้งคู่ ไปพร้อมกันตั้งแต่ต้น การจะสรุปว่าอะไรเป็นเหตุของอะไรต้องดูกลไกเบื้องหลัง ไม่ใช่ดูแค่ตัวเลข correlation ตัวเดียว

เจอสองตัวแปรที่สัมพันธ์กันแรงมาก จะตรวจสอบยังไงว่าเป็นเหตุ-ผลกันจริงหรือแค่ confounded

ขั้นแรกคือถ้าเป็นไปได้ ให้ทำ A/B test แบบสุ่มจริง — สุ่มกลุ่มตัวอย่างให้ได้รับ/ไม่ได้รับตัวแปรที่สงสัยว่าเป็นเหตุ แล้ววัดผลที่ตามมา การสุ่มช่วยตัดผลของตัวแปรกวนออกไปได้ ถือเป็นวิธีที่แข็งแรงที่สุดในการพิสูจน์เหตุ-ผล

ถ้าทำ A/B test ไม่ได้ (ข้อมูลเป็น observational ล้วนๆ) ให้ลองควบคุมตัวแปรที่สงสัยว่าเป็นตัวกวน เช่น เทียบ correlation ภายในแต่ละกลุ่มย่อยแยกกัน (เช่น แยกตาม category) ถ้าความสัมพันธ์ยังแรงอยู่แม้ควบคุมตัวแปรกวนแล้ว ก็เป็นหลักฐานที่หนักแน่นขึ้นว่ามีกลไกเชิงตรงอยู่จริง สุดท้ายต้องใช้ domain knowledge ประกอบเสมอ — ถามว่ามีกลไก ทางธุรกิจอะไรที่สมเหตุสมผลรองรับความสัมพันธ์เชิงเหตุ-ผลที่สงสัยไว้หรือไม่