สหสัมพันธ์และเหตุ-ผล
ประมาณ 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 มีหลักคร่าวๆ ดังนี้:
- ทำ A/B test แบบสุ่มจริง ถ้าทำได้ — นี่คือวิธีที่แข็งแรงที่สุดในการพิสูจน์เหตุ-ผล เพราะการสุ่มตัดผลของตัวแปรกวนออกไป
- ควบคุมตัวแปรที่สงสัยว่าเป็นตัวกวน เช่น เทียบ correlation ของ price/cost ภายในแต่ละ category แยกกัน แทนที่จะดูรวมทุกหมวด ถ้า correlation ยังแรงอยู่แม้ควบคุม category แล้ว ก็เป็นหลักฐานว่ามีกลไกเชิงตรงอยู่จริงด้วย
- ใช้ domain knowledge ประกอบเสมอ — ถามว่า “มีกลไกอะไรที่สมเหตุสมผลที่ A จะทำให้เกิด B” ก่อนสรุปอะไรจากตัวเลขล้วนๆ
ตัวอย่างคลาสสิกที่ใช้สอนเรื่องนี้กันทั่วไป: ยอดขายไอศกรีมกับจำนวนคนจมน้ำในแต่ละเดือนมีความสัมพันธ์กันสูงมาก — แต่ไม่ใช่ เพราะไอศกรีมทำให้คนจมน้ำ ทั้งสองอย่างสูงพร้อมกันเพราะอุณหภูมิ/ฤดูร้อน เป็นตัวแปรกวนที่ทำให้คนทั้งซื้อไอศกรีมเยอะขึ้น และไปว่ายน้ำเยอะขึ้นในเวลาเดียวกัน
ตัวอย่างแก้โจทย์
กด "ขั้นต่อไป" ทีละขั้น ลองรันและแก้โค้ดในแต่ละขั้นได้
ราคาสินค้ากับต้นทุนสัมพันธ์กันแค่ไหน
ทีมการเงินสังเกตว่าสินค้าที่ต้นทุนสูงมักขายแพง เลยอยากรู้ว่าราคาขาย (price) กับต้นทุน (cost) ของสินค้า สัมพันธ์กันแรงแค่ไหน แล้วสรุปได้เลยไหมว่าต้นทุนเป็นตัว "ทำให้" ราคาสูงขึ้นโดยตรง
หา Pearson correlation ระหว่าง
priceกับcostด้วย.corr()
ส่วนลดกับยอดต่อออเดอร์สัมพันธ์กันจริงไหม
ทีมการตลาดเชื่อว่าส่วนลด (discount_pct) น่าจะทำให้ลูกค้าซื้อของมากขึ้น (ยอดต่อออเดอร์สูงขึ้น) ลองเช็คด้วย correlation ว่าข้อมูลจริงสนับสนุนความเชื่อนี้ไหม
หายอดต่อออเดอร์ (เฉพาะ completed orders) แล้วดึง discount_pct ต่อออเดอร์มาเทียบ โดยเติมค่าว่าง (ไม่มีส่วนลด) ด้วย 0 ก่อน
เติมช่องว่าง
แทน ___ ด้วยโค้ดที่ถูกต้อง แล้วกดตรวจคำตอบ
เติม ___ ให้ครบเพื่อหา 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
สรุป
- 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 ประกอบเสมอ — ถามว่ามีกลไก ทางธุรกิจอะไรที่สมเหตุสมผลรองรับความสัมพันธ์เชิงเหตุ-ผลที่สงสัยไว้หรือไม่