การกำหนดกลุ่มการทดสอบ A/B และตัวชี้วัด
เชื่อมการกำหนดกลุ่มการทดลองเข้ากับผลลัพธ์ และคำนวณตัวชี้วัดแยกตามรูปแบบการทดลอง
การกำหนดกลุ่มการทดสอบ A/B และตัวชี้วัด เป็นบทเรียน SQL Interview Prep ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Interview Prep และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน
คำถามเกี่ยวกับการทดสอบ A/B ตรวจสอบอะไร
คำถามเกี่ยวกับการทดสอบ A/B ตรวจสอบว่าคุณสามารถ เชื่อมการกำหนดกลุ่มการทดลองเข้ากับผลลัพธ์ และคำนวณเมตริกต่อกลุ่มที่ชัดเจนได้อย่างถูกต้องหรือไม่
จุดพลาดมักอยู่ที่การเชื่อมข้อมูลแทบทุกครั้ง เช่น การนับผลลัพธ์ของผู้ใช้ที่ไม่เคยเข้าร่วมการทดลอง หรือการนับผู้ใช้ที่ถูกกำหนดกลุ่มสองครั้งซ้ำกัน หากเชื่อมข้อมูลการกำหนดกลุ่มได้ถูกต้อง การคำนวณเมตริกก็เป็นเพียงเลขคณิตง่าย ๆ
สองตารางที่คุณได้รับ
คาดว่าจะมีตาราง การกำหนดกลุ่ม และตาราง ผลลัพธ์:
assignments(user_id, variant, assigned_at)โดยกลุ่มการทดลองมีค่าเป็น 'กลุ่มควบคุม' หรือ 'กลุ่มทดลอง'orders(user_id, order_id, amount, created_at)หรือตารางเหตุการณ์ทั่วไป
การกำหนดกลุ่มเป็นแหล่งข้อมูลหลักที่ยืนยันว่าใครอยู่ในการทดลอง ส่วนผลลัพธ์จะนับก็ต่อเมื่อผู้ใช้นั้นปรากฏอยู่ในการกำหนดกลุ่ม
CREATE TABLE assignments (
user_id INT,
variant VARCHAR(20),
assigned_at TIMESTAMP
);
CREATE TABLE orders (
user_id INT,
order_id INT,
amount NUMERIC,
created_at TIMESTAMP
);เริ่มจากการกำหนดกลุ่มแล้วใช้ LEFT JOIN กับผลลัพธ์
กฎสำคัญที่สุดคือ เริ่มจากตารางการกำหนดกลุ่ม แล้วใช้ LEFT JOIN กับผลลัพธ์ วิธีนี้จะเก็บผู้ใช้ที่เข้าร่วมการทดลองแต่ไม่เคยเปลี่ยนผ่านไว้ด้วย ซึ่งจำเป็นสำหรับตัวหารที่สะท้อนความเป็นจริง
การใช้ INNER JOIN จะตัดผู้ใช้ที่ไม่เปลี่ยนผ่านออกไปโดยไม่แจ้งให้ทราบ และทำให้อัตราการเปลี่ยนผ่านสูงเกินจริง
SELECT
a.user_id,
a.variant,
o.order_id
FROM assignments a
LEFT JOIN orders o
ON o.user_id = a.user_id;การนับการเปลี่ยนผ่านในแต่ละกลุ่ม
อัตราการเปลี่ยนผ่าน = ผู้ใช้ที่เปลี่ยนผ่าน / ผู้ใช้ที่ได้รับการกำหนดกลุ่ม โดยคำนวณแยกตามกลุ่มการทดลอง ให้นับผู้ใช้ที่เปลี่ยนผ่านไม่ซ้ำกันในตัวเศษ และนับผู้ใช้ที่ได้รับการกำหนดกลุ่มทั้งหมดในตัวหาร
ใช้ COUNT(DISTINCT ...) กับผู้ใช้จากคำสั่งซื้อ เพื่อให้ผู้ใช้ที่มีคำสั่งซื้อสามรายการยังคงนับเป็นผู้ใช้ที่เปลี่ยนผ่านเพียงหนึ่งคน
SELECT
a.variant,
COUNT(DISTINCT a.user_id) AS assigned,
COUNT(DISTINCT o.user_id) AS converters,
ROUND(100.0 * COUNT(DISTINCT o.user_id)
/ COUNT(DISTINCT a.user_id), 2) AS conv_rate_pct
FROM assignments a
LEFT JOIN orders o ON o.user_id = a.user_id
GROUP BY a.variant;ข้อผิดพลาดจากการกำหนดกลุ่มสองครั้ง
ถ้าผู้ใช้ปรากฏในตารางการกำหนดกลุ่ม สองครั้ง ครั้งหนึ่งในแต่ละกลุ่มจะเป็นอย่างไร การเชื่อมข้อมูลจะนับผู้ใช้นั้นในทั้งสองฝั่ง และทำให้การทดลองปนเปื้อน
ผู้สัมภาษณ์มักจงใจใส่กรณีนี้ไว้ คุณต้องป้องกันให้ได้โดยตัดข้อมูลการกำหนดกลุ่มซ้ำให้เหลือหนึ่งกลุ่มต่อผู้ใช้ ซึ่งโดยทั่วไปคือการกำหนดกลุ่ม ครั้งแรก ก่อนเชื่อมข้อมูล
WITH dedup AS (
SELECT user_id, variant,
ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY assigned_at) AS rn
FROM assignments
)
SELECT user_id, variant
FROM dedup
WHERE rn = 1;นับเฉพาะผลลัพธ์หลังการกำหนดกลุ่ม
คำสั่งซื้อที่เกิดขึ้น ก่อน ผู้ใช้ได้รับการกำหนดกลุ่มไม่สามารถเกิดจากการทดลองได้ ให้เพิ่มเงื่อนไขตรวจสอบเวลา โดยผลลัพธ์ต้องเกิดขึ้นตั้งแต่เวลา assigned_at หรือหลังจากนั้น
ใส่เงื่อนไขนี้ไว้ในส่วนคำสั่ง ON ของ LEFT JOIN เพื่อให้ยังคงเก็บผู้ใช้ที่ไม่เปลี่ยนผ่านไว้
SELECT
a.variant,
COUNT(DISTINCT a.user_id) AS assigned,
COUNT(DISTINCT o.user_id) AS converters
FROM assignments a
LEFT JOIN orders o
ON o.user_id = a.user_id
AND o.created_at >= a.assigned_at
GROUP BY a.variant;ON เทียบกับ WHERE ในการเชื่อมผลลัพธ์
นี่เป็นคำถามต่อยอดที่มักเจอแน่นอน หากคุณย้าย o.created_at >= a.assigned_at ไปไว้ใน WHERE คุณจะเปลี่ยน LEFT JOIN ให้กลายเป็น INNER JOIN: แถวที่ผู้ใช้ไม่เคยสั่งซื้อจะมีค่า o.created_at = NULL ทำให้เงื่อนไขมีค่าเป็น UNKNOWN และแถวเหล่านั้นหายไป
เก็บเงื่อนไขกรองผลลัพธ์ไว้ใน ON เพื่อรักษาผู้ใช้ที่ไม่เปลี่ยนผ่านไว้ในตัวหาร
เมตริกรายได้ต่อกลุ่มการทดลอง
นอกจากการเปลี่ยนผ่านแล้ว ผู้สัมภาษณ์ยังอาจถามถึง รายได้ต่อผู้ใช้ (ARPU) และ รายได้ต่อผู้ใช้ที่เปลี่ยนผ่าน ให้รวมจำนวนเงินก่อน แล้วหารด้วยตัวหารที่ถูกต้อง
ARPU หารด้วยผู้ใช้ที่ได้รับการกำหนดกลุ่มทั้งหมด ส่วนรายได้ต่อผู้ใช้ที่เปลี่ยนผ่านจะหารเฉพาะผู้ใช้ที่สั่งซื้อ ระบุให้ชัดเจนว่าธุรกิจต้องการตัวชี้วัดใด
SELECT
a.variant,
COUNT(DISTINCT a.user_id) AS assigned,
COALESCE(SUM(o.amount), 0) AS revenue,
ROUND(COALESCE(SUM(o.amount), 0)
/ COUNT(DISTINCT a.user_id), 2) AS arpu
FROM assignments a
LEFT JOIN orders o
ON o.user_id = a.user_id
AND o.created_at >= a.assigned_at
GROUP BY a.variant;รูปแบบการรวมข้อมูลสองระดับ
เมื่อเมตริกคือ "คำสั่งซื้อเฉลี่ยต่อผู้ใช้" อย่าคำนวณในรอบเดียว เพราะจะผสมระดับข้อมูลของผู้ใช้กับระดับข้อมูลของคำสั่งซื้อ ให้รวมข้อมูลเป็น ระดับผู้ใช้ก่อน แล้วจึงหาค่าเฉลี่ยระหว่างผู้ใช้
รูปแบบต่อผู้ใช้แล้วจึงต่อกลุ่มการทดลองนี้เป็นระดับข้อมูลที่ถูกต้อง และเป็นจุดแยกความสามารถที่มักใช้ในการสัมภาษณ์
WITH per_user AS (
SELECT a.variant, a.user_id,
COUNT(o.order_id) AS orders_cnt
FROM assignments a
LEFT JOIN orders o
ON o.user_id = a.user_id
AND o.created_at >= a.assigned_at
GROUP BY a.variant, a.user_id
)
SELECT variant, ROUND(AVG(orders_cnt), 3) AS avg_orders_per_user
FROM per_user
GROUP BY variant;คำสั่งสอบถามที่สมบูรณ์และตรวจสอบเหตุผลได้
รวมทุกอย่างเข้าด้วยกัน: ตัดข้อมูลซ้ำให้เหลือการกำหนดกลุ่มครั้งแรก เริ่มจากการกำหนดกลุ่ม ตรวจสอบเวลาของผลลัพธ์ใน ON และรายงานการเปลี่ยนผ่านพร้อม ARPU แยกตามกลุ่มการทดลอง อธิบายเหตุผลของแต่ละเงื่อนไขขณะเขียน
WITH enrolled AS (
SELECT user_id, variant, assigned_at
FROM (
SELECT user_id, variant, assigned_at,
ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY assigned_at) AS rn
FROM assignments
) x WHERE rn = 1
)
SELECT
e.variant,
COUNT(DISTINCT e.user_id) AS assigned,
COUNT(DISTINCT o.user_id) AS converters,
ROUND(100.0 * COUNT(DISTINCT o.user_id)
/ COUNT(DISTINCT e.user_id), 2) AS conv_pct,
ROUND(COALESCE(SUM(o.amount),0)
/ COUNT(DISTINCT e.user_id), 2) AS arpu
FROM enrolled e
LEFT JOIN orders o
ON o.user_id = e.user_id
AND o.created_at >= e.assigned_at
GROUP BY e.variant;การตรวจสอบความสมเหตุสมผลที่ผู้สัมภาษณ์คาดหวัง
ก่อนสรุปผล ให้ตรวจสอบการตั้งค่าการทดลอง:
- ขนาดของแต่ละกลุ่มสมดุลกันโดยประมาณหรือไม่ การแบ่ง 90/10 ทั้งที่ตั้งใจให้เป็น 50/50 เป็นสัญญาณว่ามีข้อผิดพลาด
- มีผู้ใช้คนใดอยู่ในทั้งสองกลุ่มหรือไม่ ให้นับผู้ใช้ที่อยู่ในกลุ่มการทดลองที่แตกต่างกันมากกว่าหนึ่งกลุ่ม
- มีการกำหนดกลุ่มที่ไม่มีช่วงเวลาสำหรับผลลัพธ์ที่เป็นไปได้หรือไม่ เช่น กำหนดกลุ่มหลังจุดตัดข้อมูล
การเสนอการตรวจสอบเหล่านี้โดยไม่ต้องมีผู้ถามจะแสดงให้เห็นถึงวุฒิภาวะด้านการวิเคราะห์
SELECT user_id, COUNT(DISTINCT variant) AS variant_count
FROM assignments
GROUP BY user_id
HAVING COUNT(DISTINCT variant) > 1;ตรวจสอบอย่างรวดเร็ว
คุณคำนวณการเปลี่ยนผ่านแยกตามกลุ่มโดยใช้ LEFT JOIN เชื่อมคำสั่งซื้อเข้ากับการกำหนดกลุ่ม แต่ใส่ o.created_at >= a.assigned_at ไว้ในส่วนคำสั่ง WHERE จะเกิดอะไรขึ้น
สรุป: การกำหนดกลุ่มและเมตริกของการทดสอบ A/B
ตอนนี้คุณมีแนวทางวิเคราะห์การทดลองที่ตรวจสอบเหตุผลได้แล้ว:
- ถือว่า การกำหนดกลุ่มเป็นแหล่งข้อมูลหลัก และใช้ LEFT JOIN กับผลลัพธ์
- ตัดข้อมูลซ้ำ ให้เหลือหนึ่งกลุ่มต่อผู้ใช้ (การกำหนดกลุ่มครั้งแรก)
- ตรวจสอบเวลาของผลลัพธ์ใน ส่วนคำสั่ง ON ห้ามใช้ WHERE เพื่อให้ยังคงเก็บผู้ใช้ที่ไม่เปลี่ยนผ่านไว้
- เลือกตัวหารที่ถูกต้องสำหรับการเปลี่ยนผ่าน ARPU และรายได้ต่อผู้ใช้ที่เปลี่ยนผ่าน
- รวมข้อมูลเป็น ระดับผู้ใช้ก่อน เพื่อหาค่าเฉลี่ยต่อผู้ใช้
- ดำเนินการ ตรวจสอบความสมเหตุสมผลเกี่ยวกับความสมดุลของการแบ่งกลุ่มและการกำหนดกลุ่มข้ามกลุ่ม
ถัดไป: เปลี่ยนเมตริกต่อกลุ่มการทดลองเหล่านี้ให้เป็นการเพิ่มขึ้น นัยสำคัญ และตัวชี้วัดเฝ้าระวัง
คำถามที่พบบ่อย
บทเรียน “การกำหนดกลุ่มการทดสอบ A/B และตัวชี้วัด” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การกำหนดกลุ่มการทดสอบ A/B และตัวชี้วัด” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Interview Prep ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การกำหนดกลุ่มการทดสอบ A/B และตัวชี้วัด”
เชื่อมการกำหนดกลุ่มการทดลองเข้ากับผลลัพธ์ และคำนวณตัวชี้วัดแยกตามรูปแบบการทดลอง คุณปฏิบัติ SQL Interview Prep ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Interview Prep หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Interview Prep บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “การกำหนดกลุ่มการทดสอบ A/B และตัวชี้วัด” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน SQL Interview Prep นี้ได้ไหม
ได้ บทเรียน SQL Interview Prep ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- สร้างกระบวนการ Funnel หลายขั้นตอน
- เหตุการณ์ตามลำดับและช่วงเวลา
- การกำหนดกลุ่มการทดสอบ A/B และตัวชี้วัด
- ค่าการเพิ่มขึ้น นัยสำคัญ และเกณฑ์ควบคุมใน SQL