0Pricing
SQL Interview Prep · บทเรียน

การกำหนดกลุ่มการทดสอบ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. สร้างกระบวนการ Funnel หลายขั้นตอน
  2. เหตุการณ์ตามลำดับและช่วงเวลา
  3. การกำหนดกลุ่มการทดสอบ A/B และตัวชี้วัด
  4. ค่าการเพิ่มขึ้น นัยสำคัญ และเกณฑ์ควบคุมใน SQL
← กลับไปที่ SQL Interview Prep