การทดลอง (Experimentation) เป็นวิธีการสำคัญในยุค Digital marketing ปัจจุบันอย่างมากกเลย รู้มั้ยครับว่า..เพลย์ลิสต์ของ Spotify, ปุ่มหยิบใส่ตะกร้าของ Shopee, ข้อความบนปุ่มกดตอนจะซื้อประกัน, การแสดงราคาสินค้าในเว็บ e-commerce ต่างๆ ในความจริงแล้วไม่ได้เกิดจากนักพัฒนาเว็บ อยากจะวางปุ่ม วางราคา วางส่วนลดที่ตำแหน่งไหนยังไงก็ได้ หรือวันหนึ่งตื่นขึ้นมาแล้วมาไอเดียก็เขียนเพิ่มแล้ววางองค์ประกอบนั้นเข้าไปในเว็บได้อย่างนั้นเลย

ทุกการกระทำ หรือการเปลี่ยนแปลงของระบบ โปรแกรม แอพพลิเคชั่นในยุคนี้ล้วนผ่านการทดลอง ทดสอบมาอย่างละเอียดแล้วเท่านั้น เพราะเป้าหมายในการเปลี่ยนคือทำยังไงให้รักษาความสนใจของลูกค้าผู้ใช้งานไว้ได้ และดึงผู้ใช้อย่างเราๆ อยู่บนแพลตฟอร์มของเค้าไปนานๆ นั่นเอง

A/B Testing จึงมีบทบาทสำคัญในการทำทดสอบนี้ เพราะมันทำให้เราไม่ต้องมานั่งตัดสินใจว่าโฆษณาตัวใด แคมเปญตัวไหน ที่ลูกค้าเห็นแล้วจะคลิกเข้ามาดู กดสั่งซื้อได้มากที่สุด

เพราะบางครั้งมนุษย์อาจจะใช้ ้ “อารมณ์ความรู้สึก” ตอนนั้นเองเป็นตัวตัดสินใจก็ได้ ซึ่งมันไม่ได้ช่วยให้เกิดผลดีต่อธุรกิจ เพราะอย่างนั้นการทดสอบอย่าง A/B Testing จึงเป็นตัวช่วยในเรื่องลด bias การตัดสินใจเลือกของบุคคลได้ (ก็คือให้กลุ่มทดลองมาช่วยตัดสินใจแทน)

ในโพสต์นี้หนุ่มก็เลยจะพามาลองใช้ python ทำ A/B Testing กันนะฮะ สุดท้ายแล้วคุณผู้อ่านอาจจะเข้าใจ (หรืองงหนักกว่าเดิม) ในเรื่องของ A/B testing คืออะไร ใช้งานตอนไหน และมีสถิติที่จำเป็นในการสร้างโมเดลและวิเคราะห์ผลยังไงเพิ่มขึ้นอีกซักนิ๊ดด หนุ่มก็เป็นปลื้มแล้วว

A/B Testing คืออะไร

เป็นการทดลองที่ช่วยเปรียบเทียบสิ่งเดียวกันแต่มี 2 เวอร์ชัน ก็อย่างเช่น หากเรามีเว็บไซต์ขายของและอยากรู้ว่าลูกค้าจะกดซื้อสินค้าด้วยปุ่มจ่ายตังค์ที่เป็น สีแดงมากกว่าสีน้ำเงิน หรือไม่ —A/B testing จึงมีซีนสำคัญในการหาคำตอบนี้ของเราได้

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

ฟังดูเหมือนง่ายใช่มะ?

แต่มันจะมีอยู่ e นึง…

เกิดว่า ปุ่มสีแดง ลูกค้ากดไป 100 ครั้ง ส่วนปุ่มสีน้ำเงินถูกกดไป 99 ครั้ง เราแทบจะไม่เห็นความแตกต่างของการคลิกเลยถูกมั้ย? (ห่างแค่ 1 คลิกเองอะ) 🤔 ก็เป็นไปได้ว่า ไม่ใช่สีของปุ่มละที่ช่วยให้มีการคลิกชำระเงินเพิ่มขึ้นมา อาจจะมีตัวการภายนอกอื่นๆ มาร่วมด้วย อย่างเช่น พฤติกรรมของลูกค้าเอง ช่วงเวลาของวัน ข้อความส่วนลด ฯลฯ

แล้วจะตัดสินใจยังไงว่าลูกค้าคนไหนจะเห็นปุ่มแดง ใครจะเห็นปุ่มน้ำเงิน?

แล้วต้องคลิกกี่ครั้งถึงจะตัดสินใจได้ว่าปุ่มไหนดีกว่ากัน ซัก 10 คลิก หรือ 100 คลิก หรือพันอัพดีนะ?

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

  • การเพิ่มอัตราการเปิดอีเมล (Open Rate): เป้าหมายคือ การทำให้ผู้รับเปิดอ่านอีเมลที่เราส่งไปมากขึ้น
  • การเพิ่มอัตราการคลิก (Click-Through Rate หรือ CTR): เป้าหมายนี้คือการทำให้ผู้รับคลิกที่ลิงก์หรือปุ่มในอีเมลที่เราส่งไปมากขึ้น

ในโพสต์นี้เลยจะมาทำ best practice ในการใช้งาน A/B testing กัน คุณผู้อ่านลองเอาไปประประยุกต์ใช้โค้ดดูนะฮะ ซึ่งสเต็ปที่สำคัญประกอบด้วย 4 ขั้นตอนคือ

  1. Create a hypothesis
  2. Defining Success Metrics
  3. Calculate Sample Size and Duration
  4. Analyze A/B Test Results

Run A/B testing ใน python ได้ยังไง

ลองเป็นตัวอย่างเว็บ e-commerce ซักเว็บละกัน:

เจ้าของเว็บคนนึง สมมติชื่อ ตาไมค์ คือตาไมค์ต้องการเปลี่ยนโทนสีของหน้า Landing page (หน้าที่คนคลิกเข้ามาแล้วเจอในตอนแรก) เว็บของเค้าจากสีขาวเป็นสีดำ เพราะเค้าคิดว่าวิธีนี้จะช่วยเพิ่มจำนวนการคลิกบนหน้า Landing page ได้

เพื่อจะตัดสินใจเปลี่ยนหน้า Landing page นี้ ตาไมค์จึงทำการทดสอบ A/B testing … มาเริ่มกันเลย

1. Create a hypothesis

สมมติฐานเป็นข้อความตั้งต้นที่กำหนดถึง “สิ่งที่เรากำลังทดสอบและผลลัพธ์ที่คาดว่าจะสังเกตได้”

ในตัวอย่างของตาไมค์ จะได้สมมติฐานคือ:

“การเปลี่ยนสีของหน้า Landing page จากสีขาวเป็นสีดำจะไม่มีผลต่อการคลิก” (~จะหน้าสีขาวหรือหน้าสีดำก็ได้จำนวนการคลิกเท่าๆ กัน)

ประโยคข้างบนเรียกว่า “null hypothesis (H0)” ซึ่งถือว่าไม่มีความแตกต่างที่สำคัญ (no significant) ระหว่าง Control Group (ที่ยังเป็นสีขาวเหมือนเดิม) กับ Treatment Group (หน้าสีดำ)

Treatment Group กลุ่มที่ถูกควบคุม/เปลี่ยนแปลงไปจากเดิม

Control Group ยังแปลได้สองความหมาย คือ 1. ไม่ได้ treatment หรือ 2. ทำพฤติกรรมเหมือนเดิม (ไม่เปลี่ยนแปลง)

หลังจากที่ทำการทดสอบแล้วจะมี 2 ตัวเลือกคือ:

  • Reject H0: ปฏิเสธ H0 เพราะว่า มีความแตกต่างที่สำคัญระหว่าง Control Group และกลุ่ม Treatment Group
  • Fail to reject H0: ไม่สามารถปฏิเสธ H0 คือ เราไม่สามารถหาความแตกต่างที่สำคัญระหว่าง Control Group และกลุ่ม Treatment ได้

จุดนี้คือ หากเรา Reject null hypothesis (H0) แสดงว่ามีความแตกต่างที่สำคัญเมื่อสีของหน้า Landing page เปลี่ยนจากสีขาวเป็นสีดำ

หากความแตกต่างนี้เป็นไปในทางบวก (positive) ก็คือ จำนวนการการคลิกเพิ่มขึ้น ตาไมค์จึงทำการเปลี่ยนสีของหน้า Landing page ต่อไปได้

คำถามคือ 💗: ความแตกต่างที่สำคัญ (มีนัยยะสำคัญ) ใช้อะไรวัด และมันต้องแตกต่างแค่ไหนล่ะ?

2. Defining Success Metrics

หลังจากกำหนดสมมติฐานแล้ว เราต้องมากำหนด metric ให้กับการทดลองนี้ด้วย ซึ่ง metric นี้จะวัดว่าควร Reject null hypothesis (H0) หรือไม่

ในหน้า Landing page ของตาไมค์ metric ที่ใช้วัดอาจจะเป็น:

  • Click-Through-Rate (CTR) อัตราส่วนของจำนวนผู้เข้าชมที่เห็นสีของหน้า Landing page และคลิกเข้าไปดูอะไรซักอย่างในเว็บ
  • Clicks per User จำนวนการคลิกต่อผู้เข้าชม 1 คน (Number of Clicks / Number of Unique Users)
  • Clicks per Website Visit จำนวนการคลิกเฉลี่ยต่อหนึ่งผู้เข้าชม

เพื่อให้เข้าใจง่ายขอยกตัวอย่างเป็น Click-Through-Rate (CTR) เป็น metric วัดความสำเร็จนะครับ

โดยวิธีนี้ หากหน้าเว็บสีดำ (Treatment Group) มีการคลิกต่อผู้ใช้มากกว่าหน้าเว็บสีขาว (Control Group) อย่างมีนัยยะสำคัญ เราถึงจะ Reject null hypothesis (H0)

3. Calculate Sample Size and Duration

ไปแล้ว 2 ขั้นตอน ต่อมาเราจะต้องกำหนดขนาดตัวอย่าง (sample size) และระยะเวลาที่จะดำเนินการทดลอง

Let’s say ว่าเว็บของตาไมค์มีผู้เข้าชมประมาณ 100,000 รายต่อเดือน

ตาไมค์ต้องคิดต่อว่า จะทำการทดสอบนี้กับ sample size ที่ 10% (~10,000 คน) หรือต้องใช้ 50% (~50,000 คน) หรืออาจจะต้องใช้หมดทั้ง 100,000 คนเลยถึงจะเพียงพอ

จึงเป็นที่มาของหลักการ Statistical power และ MDE (Minimum Detectable Effect)

MDE (Minimum Detectable Effect) ความแตกต่างที่เล็กที่สุดที่เรา care เมื่อผลลัพธ์เปลี่ยนแปลงไป อย่างเช่น หากการทดสอบของตาไมค์ พบว่า CTR เพิ่มขึ้น 0.1% เมื่อใช้หน้า Landing page ใหม่สีดำ ความแตกต่างนี้มีความหมายต่อธุรกิจตาไมค์รึเปล่า?

หรือตาไมค์ต้องการการเปลี่ยนแปลง CTR อย่างน้อย 5% ตาไมค์ถึงจะเปลี่ยนหน้า Landing page เป็นสีดำอันใหม่ (แต่ในการทดสอบจริงอาจจะเปลี่ยนแค่ 2-3% เราก็จะไม่ตรวจพบความแตกต่างนี้)

MDE สามารถช่วยกำหนดขนาด sample size ที่จะใช้ได้ เช่น หากตาไมค์ care เมื่อมีการเปลี่ยนแปลงของ CTR ที่ 0.0001% เค้าอาจจะต้องทดสอบกับผู้ใช้ถึง 1 ล้านคน

เนื่องจากต่อเดือนตาไมค์มีผู้ชมเว็บ 100,000 คน นั่นคือต้องทำการทดสอบนานถึง 10 เดือน กับผู้ชมเยี่ยมเว็บไซต์ 100% ของเค้า (จาก 1 เดือน : 100,000 คน → 10 เดือน : 100,000 x 10 = 1,000,000 คน) หรือก็คือ:

  • MDE ต่ำลง (ละเอียดมาก) = ขนาดตัวอย่างที่ใช้จะใหญ่ขึ้น
  • MDE สูง (หยาบขึ้น) = ขนาดตัวอย่างที่ใช้ก็จะเล็กลง

ยิ่งเราทำการทดลองนานขึ้นเท่าไร ก็ยิ่งมีแนวโน้มที่จะพบความแตกต่างที่เล็กน้อยระหว่าง Control Group และ Treatment Group มากขึ้นเท่านั้น

ต่อไปจะเป็นตัวอย่างโค้ด Python สำหรับคำนวณ sample size และระยะเวลาของการทดสอบ A/B โดยเราจะ assume ค่า MDE ที่แตกต่างกันดู:

1: Defining Sample Size and Duration Functions

ฟังก์ชันกำหนดขนาดตัวอย่างและฟังก์ชันคำนวณระยะเวลาของการทดสอบ

import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
import pandas as pd
# ฟังก์ชันแรกจะคำนวณจำนวนผู้ใช้ที่คุณต้องการสำหรับการทดลอง
def calculate_sample_size(baseline_conversion, mde, power=0.8, significance_level=0.05):
   expected_conversion = baseline_conversion * (1 + mde)
  
   z_alpha = stats.norm.ppf(1 - significance_level/2)
   z_beta = stats.norm.ppf(power)
  
   sd1 = np.sqrt(baseline_conversion * (1 - baseline_conversion))
   sd2 = np.sqrt(expected_conversion * (1 - expected_conversion))
  
   numerator = (z_alpha * np.sqrt(2 * sd1**2) + z_beta * np.sqrt(sd1**2 + sd2**2))**2
   denominator = (expected_conversion - baseline_conversion)**2
  
   sample_size_per_variant = np.ceil(numerator / denominator)
  
   return int(sample_size_per_variant)
# ฟังก์ชันที่สองจะนำเอาต์พุตของฟังก์ชันแรกมาใช้ในการคำนวณระยะเวลาการทดลอง 
# โดยพิจารณาจากจำนวนผู้ใช้รายวันที่มีอยู่ (ในกรณีนี้คือปริมาณการเข้าชมเว็บไซต์ของ ตาไมค์ รายวัน)
def calculate_experiment_duration(sample_size_per_variant, daily_visitors, traffic_allocation=0.5):
   visitors_per_variant_per_day = daily_visitors * traffic_allocation / 2
   days_required = np.ceil(sample_size_per_variant / visitors_per_variant_per_day)
  
   return int(days_required)

ฟังก์ชันแรก calculate_sample_size จะคำนวณจำนวนผู้ใช้ที่คุณต้องการสำหรับการทดลอง

ฟังก์ชันที่สอง calculate_experiment_duration จะนำเอาต์พุตของฟังก์ชันแรกมาใช้ในการคำนวณระยะเวลาการทดลองโดยพิจารณาจากจำนวนผู้ชมเว็บรายวันที่มีอยู่ (ในกรณีนี้คือปริมาณการเข้าชมเว็บไซต์ของ ตาไมค์)

2: Calculating Sample Sizes for a Range of MDE

ขั้นตอนต่อมา เป็นการคำนวณขนาดตัวอย่าง sample size ตามช่วง MDE ที่กำหนด ทำให้เรารู้ว่า หากต้องการ MDE ที่ระดับเท่านี้ อยากใช้ทดสอบกับผู้ชมประมาณกี่เปอร์เซ็นต์ แสดงออกมาเป็นจำนวนผู้ชมที่เราต้องแบ่งให้กับแต่ละกลุ่ม รวมถึงระยะเวลาที่ต้องใช้ทดสอบด้วย

# Example MDE/sample size tradeoff for ตาไมค์'s website
daily_visitors = 100000 / 30  # Convert monthly to daily visitors
baseline_conversion = 0.05    # ตาไมค์'s current landing page CTR (baseline conv rate of 5%)
# Create a table of sample sizes for different MDEs
mde_values = [0.01, 0.02, 0.03, 0.05, 0.10, 0.15]  # 1% to 15% change
traffic_allocations = [0.1, 0.5, 1.0]  # 10%, 50%, and 100% of website traffic
results = []
for mde in mde_values:
   sample_size = calculate_sample_size(baseline_conversion, mde)
  
   for allocation in traffic_allocations:
       duration = calculate_experiment_duration(sample_size, daily_visitors, allocation)
       results.append({
           'MDE': f"{mde*100:.1f}%",
           'Traffic Allocation': f"{allocation*100:.0f}%",
           'Sample Size per Variant': f"{sample_size:,}",
           'Duration (days)': duration
       })

# Create a DataFrame and display the results
df_results = pd.DataFrame(results)
print("Sample Size and Duration for Different MDEs:")
print(df_results)

หากคุณผู้อ่านต้องการนำโค้ดข้างบนไปใช้ สามารถเปลี่ยนพารามิเตอร์ต่อไปนี้ได้นะครับ:

  • daily_visitors จำนวนผู้เยี่ยมชมรายเดือน (ในสูตรจะไปเฉลี่ยเป็นรายวันเอง)
  • baseline_conversion เมตริกที่เราสังเกตได้จากสถิติเดิม (baseline) ที่มีอยู่ ในโจทย์ Let’s say ว่าเว็บของตาไมค์มี CTR อยู่ที่ 5%
  • mde_values ในตัวอย่างนี้ได้ระบุช่วงของ MDE ตั้งแต่ 1% ถึง 15% ซึ่งจะแตกต่างกันไปตามสถานการณ์ทางธุรกิจของคุณผู้อ่าน ตัวอย่างเช่น หากผู้คุณผู้อ่านกำลังทำการทดสอบ A/B สำหรับบริษัทเทคโนโลยีขนาดใหญ่ที่มีผู้ใช้รายเดือนหลายล้านคน คุณผู้อ่านอาจจะมองหา MDE ในช่วง 0.01% ถึง 0.05% ~เพราะเปลี่ยนแปลงเพียงเล็กน้อยก็ถึงเป็นเม็ดเงินที่คุ้มค่า
  • traffic_allocations ปริมาณ sample size ของผู้ชมที่เรายินดีจะนำมาใช้ทดสอบ

3: Visualizing the relationship between sample size and MDE

ขั้นต่อมาเป็นการสร้างภาพความสัมพันธ์ระหว่างขนาดตัวอย่างและ MDE

# สร้างกราฟความสัมพันธ์ ระหว่าง MDE และ sample size
plt.figure(figsize=(10, 6))
mde_range = np.arange(0.01, 0.2, 0.01)
sample_sizes = [calculate_sample_size(baseline_conversion, mde) for mde in mde_range]

plt.plot(mde_range * 100, sample_sizes)
plt.xlabel('Minimum Detectable Effect (%)')
plt.ylabel('Required Sample Size per Variant')
plt.title('Required Sample Size vs. MDE')
plt.grid(True)
plt.tight_layout()
plt.show()

Chart ที่ได้ก็คือ follow ตามกฏที่ว่า MDE ต่ำลง (ละเอียดมาก) ขนาดตัวอย่างที่ใช้จะใหญ่ขึ้น และเมื่อ MDE สูง (หยาบขึ้น) ขนาดตัวอย่างที่ใช้ก็จะยิ่งเล็กลง

เป็น Chart ที่เป็นประโยชน์เมื่อต้องนำเสนอผลลัพธ์ต่อ boss หัวหน้างาน ทีมงานต่างๆ ช่วยให้ทีมตัดสินใจได้ง่ายขึ้นว่า MDE และขนาดตัวอย่างเท่าใดที่ยอมรับได้เมื่อต้องดำเนินการทดลอง


ในโลกแห่งความเป็นจริง การเลือก sample size อาจจะต้องตัดสินใจอย่างรวดเร็ว โดยอาจจะพิจารณาจากระยะเวลา (Timeline) กับงบประมาณ (Budget) ว่าสมเหตุสมผลหรือไม่? → ในบางครั้งงบก็น้อย ระยะเวลาที่ต้องสรุปผลอีก 2 เดือนข้างหน้า สั้นมากก 😭 แต่ก็ต้องสู้กันปายย

มันเป็นสิ่งที่เราต้อง Trade off เสมอระหว่างความถูกต้องทางสถิติกับระยะเวลาที่เรามี หากต้องการความถูกต้องตามแนวทางหลักการสถิติทุกอย่างอาจจะต้องใช้เวลานานถึงจะได้ผลลัพธ์ออกมา

หรืออาจจะยักเยื้องไปคำนวน Sample size จาก Confidence level และ MOE (Margin of Error) เลยว่าที่ Error 5% → Confidence level 95% จากทดลองซ้ำ 100 ครั้ง ได้ผลลัพธ์เหมือนเดิม 95 ครั้ง ต้องใช้จำนวน Sample size เท่าไหร่ที่เว็บไซต์นี้ Sample Size Calculator | SurveyMonkey และใช้ระยะเวลาตามที่ตาไมค์กำหนดเอง


4. Analyze A/B Test Results

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

  • มีความแตกต่างระหว่างกลุ่ม A และกลุ่ม B หรือไม่? → ในโจทย์ของเราก็จะเป็น “มีความแตกต่างใน CTR (Click-Through Rate) ระหว่างหน้า Landing page สีขาวและสีดำหรือไม่”
  • และความแตกต่างนี้มีความสำคัญทางสถิติ (นัยยะสำคัญทางสถิติ) หรือไม่?

สิ่งที่เราต้องวัดเมื่อต้องวิเคราะห์ผลการทดสอบ A/B testing

  • Statistical significance - ความแตกต่างที่สังเกตได้ระหว่าง Control group และ Treatment group ของเรามีความสำคัญทางสถิติ (นัยยะสำคัญทางสถิติ) หรือไม่
  • Confidence interval
  • Effect size – ขนาดของความแตกต่างระหว่าง Control group และ Treatment group คือเท่าใด

นี่คือโค้ด Python ที่ใช้ดำเนินการคำนวณองค์ประกอบก่อนหน้านี้:

def analyze_ab_test_results(control_visitors, control_conversions,
                          treatment_visitors, treatment_conversions,
                          significance_level=0.05):

   # Calculate conversion rates
   control_rate = control_conversions / control_visitors
   treatment_rate = treatment_conversions / treatment_visitors
  
   # Calculate absolute and relative differences
   absolute_diff = treatment_rate - control_rate
   relative_diff = absolute_diff / control_rate
  
   # Calculate standard errors
   control_se = np.sqrt(control_rate * (1 - control_rate) / control_visitors)
   treatment_se = np.sqrt(treatment_rate * (1 - treatment_rate) / treatment_visitors)
  
   # Calculate z-score
   pooled_se = np.sqrt(control_se**2 + treatment_se**2)
   z_score = absolute_diff / pooled_se
  
   # Calculate p-value (two-tailed test)
   p_value = 2 * (1 - stats.norm.cdf(abs(z_score)))
  
   # Calculate confidence interval
   z_critical = stats.norm.ppf(1 - significance_level/2)
   margin_of_error = z_critical * pooled_se
   ci_lower = absolute_diff - margin_of_error
   ci_upper = absolute_diff + margin_of_error
  
   # Determine if result is statistically significant
   is_significant = p_value < significance_level
  
   return {
       'control_rate': control_rate,
       'treatment_rate': treatment_rate,
       'absolute_diff': absolute_diff,
       'relative_diff': relative_diff * 100,  # Convert to percentage
       'margin_of_error': margin_of_error,
       'z_score': z_score,
       'p_value': p_value,
       'ci_lower': ci_lower,
       'ci_upper': ci_upper,
       'is_significant': is_significant
   }

ข้างบนเป็นฟังก์ชันที่ใช้คำนวณ เราเพียงแต่ใส่ค่าพารามิเตอร์เพิ่ม ก็คือ

  • control_visitors จำนวนผู้ชมในกลุ่ม Control
  • control_conversions จำนวนผู้ชมในกลุ่ม Control ที่มี conversions
  • treatment_visitors = จำนวนผู้ชมในกลุ่ม Treatment
  • treatment_conversions จำนวนผู้ชมในกลุ่ม Treatmentที่มี conversions
  • significance_level นัยยะสำคัญที่เราใช้แบ่งว่า A/B มีความแตกต่างกัน (default 0.05)

assume ว่าผลการทดสอบของตามไมค์ได้ผลลัพธ์ตามด้านล่าง เราจะได้ผลสรุปที่มีลักษณะดังนี้

analyze_ab_test_results(control_visitors = 30000, 
                        control_conversions = 1500,
                        treatment_visitors = 30000, 
                        treatment_conversions = 1650,
                        significance_level=0.05)

วนกลับไปที่หน้า Landing Page ของตาไมค์ ผลลัพธ์ที่ได้คือ หน้า Landing Page สีดำช่วยเพิ่ม CTR ได้อย่างมีนัยสำคัญถึง 10% (relative_diff: 9.9999) ที่นี้ก็เป็นหน้าที่ของตาไมค์แล้วว่าจะตัดสินใจเปลี่ยนสีของหน้า Landing page จากสีขาวเป็นสีดำรึเปล่า เย้! 🫡

Takeaways

ฟิ้วว มาใกล้มากกกเลยฮะ สรุปสุดท้ายแล้วการจะใช้ A/B Testing นั้นมันแล้วแต่ Business Objective ของธุรกิจนั้นๆ เลยว่า ต้องการใช้งานเพื่ออะไร ใช้งานกับอะไร

โดย A/B Testing มี 4 ขั้นตอน คือ ตั้ง hypothesis, metric อะไรที่ใช้วัด hypothesis ที่ตั้งไว้, เลือกจำนวนกลุ่มตัวอย่างและระยะเวลาในการทดสอบ เก็บข้อมูลที่ได้และวิเคราะห์ผล A/B Testing

และ A/B Testing จะทำกี่ครั้งก็ได้จนกว่าจะพอใจในผลลัพธ์ แต่ยังไงก็ต้องแคร์งบฯ แคร์ระยะเวลาด้วย ฮ่าๆๆ หวังว่าตัวอย่างวิธีการทดสอบนี้จะเป็นประโยชน์กับคุณผู้อ่านนะครับ ขอบคุณฮะ



One response to “มาทำ AB Testing ใน python กัน”

  1. […] python กันไปแล้วในโพสต์นี้ “มาทำ AB Testing ใน python กัน” […]

Leave a Reply

Your email address will not be published. Required fields are marked *

Search

About

Feasible เว็บไซต์ที่นำเสนออาชีพปัจจุบันที่เรา (เจ้าของเว็บ) กำลังทำ ไม่ว่าจะเป็น นักวิเคราะห์ข้อมูล นักเรียน นักอ่าน นักฟาร์ม และอีกหลากหลายมุมมอง เรียกได้ว่าเป็น ‘แกงโฮะ’ เลยล่ะ ฮ่าๆๆ ติดตาม Content ที่จะทำออกมาได้เรื่อยๆ นะครับ ขอบคุณที่เข้ามาเยี่ยมกัน 😁✌️

Social Icons