ปล่อยฟีเจอร์ให้โดน ด้วย Firebase A/B Testing

naluinui
Firebase Thailand
4 min readDec 23, 2017

--

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

แล้วเราจะรู้ได้ไงล่ะว่า การเปลี่ยนแปลงนี้ได้ผลตามที่คาดหวังไว้จริงๆ? เราอาจจะใช้การเดา(แบบมีหลักการ) การโหวตกันเองในทีม ไปถามเพื่อน พ่อแม่พี่น้อง หรือออกไปขอ feedback จากกลุ่มผู้ใช้บางกลุ่ม แต่คงไม่มีอะไรสู้การทดลองกับผู้ใช้ที่คลุกคลีกับแอปของเราทุกวัน แล้วคอยติดตามการตอบสนองพร้อมทั้งดูผลลัพธ์แบบ on-the-fly ได้ เพราะนอกจากจะได้ผลลัพธ์ที่มีคุณภาพ ประจักษ์กับตาตัวเองแล้ว ยังประหยัดทั้งเงินและเวลาอีกด้วย นั่นก็คือแนวคิดของการทำ A/B testing นั่นเองค่า

A/B Testing จะทำให้เราสามารถแบ่งกลุ่มผู้ใช้บางส่วนเท่าๆกัน เพื่อทำการทดสอบฟีเจอร์ใดฟีเจอร์หนึ่ง ก่อนที่จะปล่อยฟีเจอร์นั้นออกไปให้ผู้ใช้ทั้งหมดได้ใช้งาน กลุ่มแรกให้เห็นแบบ A (Control) กลุ่มที่สองให้เห็นแบบ B (Variant) หรือบางทีอาจมีมากกว่า 2 แบบก็ได้ (A/B/n testing) แล้วดูว่าแบบไหนได้ผลลัพธ์ตามที่คาดหวังไว้มากกว่ากัน เช่น การทดสอบข้อความเชิญชวนให้สมัครสมาชิก คือลองตั้งข้อความเชิญชวนหลายๆแบบ เพื่อดูว่าข้อความไหนดึงดูดใจให้ผู้ใช้ทำการสมัครสมาชิกมากที่สุด เป็นต้น

กลุ่มเป้าหมาย จะถูกเลือกมาบางส่วนจากผู้ใช้ทั้งหมด แล้วนำมาแบ่งกลุ่มเท่าๆกันเพื่อทดสอบตัวแปรแต่ละตัว

จะว่าไปแล้ว A/B testing ก็คือการทดลองอย่างนึงนั่นเอง หลักการก็คล้ายกับตอนที่เราเรียนทำโครงงานวิทยาศาสตร์ตอน ป.3 ยังไงก็อย่างนั้น ซึ่งถ้าให้สรุปวิธีการสั้นๆ คงสรุปได้ดังนี้

  1. ตั้งสมมติฐาน/เป้าหมาย เช่น สีปุ่ม Buy Now มีผลต่อการกดของผู้ใช้
  2. กำหนดตัวแปร ในที่นี้ ตัวแปรต้นคือ สีปุ่ม อยากทดลองกี่สีก็ว่าไป สีเขียว สีแดง สีฟ้า หรือบางทีอาจมีตัวแปรตามเข้ามาเกี่ยว เช่น พอเปลี่ยนสีปุ่มเป็นสีเข้ม สีตัวอักษรก็ต้องเปลี่ยนเป็นสีอ่อนตามไปด้วยเพื่อให้อ่านง่ายขึ้น เป็นต้น (Multivariate testing) ทั้งนี้เราต้องแน่ใจด้วยว่าตัวแปรต้นและตัวแปรตามต้องมีความเกี่ยวข้องกัน ไม่อย่างนั้นผลการทดลอง อาจจะออกมาไม่ตรงตามสมมติฐาน/เป้าหมายที่ตั้งไว้ เช่น ตั้งเป้าว่า ‘สีปุ่ม Buy Now มีผลต่อการกดของผู้ใช้’ แต่ไปเปลี่ยนข้อความในปุ่มด้วย อันนี้ก็จะได้ผลลัพธ์ไม่ชัดเจนแล้วว่า การกดของผู้ใช้ที่เพิ่มขึ้นหรือลดลงนั้นมาจากการเปลี่ยนสีปุ่ม หรือการเปลี่ยนข้อความในปุ่มกันแน่ อีกอย่างที่ต้องคำนึงถึงในการกำหนดตัวแปรก็คือ การจะมีตัวแปรต้นหรือตัวแปรตามเยอะๆ ต้องแน่ใจด้วยว่า เรามีตัวแปรควบคุมที่มากพอ นั่นก็คือกลุ่มเป้าหมายที่เราจะทำการทดลองด้วยนั่นเอง
  3. สรุปผล รอเวลา แล้วดูว่าผลเป็นไปตามสมมติฐาน/เป้าหมายที่เราคิดไว้ในตอนแรกหรือไม่ อย่างที่คุณครูเคยบอก ‘ทุกการทดลองมีอะไรให้เราได้เรียนรู้เสมอ’ กับ A/B Testing ก็เช่นกัน บางทีผลอาจไม่เป็นตามเป้า การเปลี่ยนแปลงอาจจะไม่ได้ดีขึ้น เพราะของเดิมที่มีอาจจะดีอยู่แล้วก็เป็นได้ :)

A/B Testing with Firebase 🔥

เราอาจจะเคยทำ A/B Testing กับ Firebase กันมาบ้างแล้ว โดยใช้ Firebase Remote Config เพื่อทำการทดลองเปลี่ยนแปลงค่าต่างๆในแอปตามที่เราต้องการให้กับกลุ่มเป้าหมายที่กำหนดด้วยค่า Random percentile และเก็บ Analytic events พร้อมกับ User property เองเพื่อติดตามผลด้วย Google Analytics for Firebase แต่เมื่อไม่นานมานี้ ทาง Firebase เพิ่งจะเปิดตัวฟีเจอร์ใหม่ เพื่อให้เราทำ A/B testing ได้ง่ายขึ้นไปอีก นั่นก็คือ Firebase A/B Testing ซึ่งเป็นฟีเจอร์ที่ add-on มากับทั้ง Remote Config และ Notifications จะง่ายแค่ไหน ไปดูกันเลย!

A/B Testing × Remote Config

อย่างที่ทราบกันดีว่า Remote Config ทำให้เราสามารถเปลี่ยนแปลงควบคุมค่าต่างๆ หรือกำหนดลูกเล่นการใช้งานในแอป ได้แบบ on-the-fly ซึ่งทำให้ผู้ใช้ไม่ต้องอัพเดทแอปใหม่ก็สามารถรับค่าใหม่ล่าสุดได้เสมอ โดยตัว A/B testing แบบใหม่นอกจากจะทำให้เราสามารถทำ A/B test แบบควบคุมค่าหลายๆค่าที่เรากำหนดไว้ใน Remote Config ในคราวเดียวกันได้แล้ว ยังทำให้เราไม่ต้องกังวลกับการเก็บ Analytics แล้วไป filter เพื่อดูผลลัพธ์เองอีกต่อไป เพราะ A/B testing ตัวใหม่นี้มีหน้าแสดงผลลัพธ์พร้อมกับตัดสินผู้ชนะให้เราทันที

เมื่อเข้าไปในเมนู Remote Config จะเห็นปุ่ม A/B testing โดดเด่นอยู่ที่มุมขวาบน เมื่อคลิกจะมี panel เล็กๆโผล่ออกมา คลิก Create Experiment เพื่อสร้างการทดลองแรกกันเลย!

เริ่มแรกเลยคือ การกำหนดสมมติฐานและเลือกกลุ่มเป้าหมาย ที่เราต้องการทดลอง ซึ่งเราสามารถเลือกกลุ่มเป้าหมายตามที่เราสนใจได้เลย โดยอาจจะเลือกจาก User property เช่น 5% ของผู้ใช้ที่เคยซื้อของในแอป หรือจะเลือกจาก App version หรือแม้กระทั่งเลือกจาก Firebase Predictions เช่น 10% ของคนที่คาดว่าจะยังใช้แอปใน 7 วันข้างหน้าก็ยังได้

ในตัวอย่างนี้ เราจะทำการทดสอบข้อความเชิญชวนให้ผู้ใช้เรทแอป ว่าข้อความมีผลที่จะทำให้เราได้คะแนนสูงๆจากผู้ใช้หรือไม่ ข้อความแบบไหนจะทำให้ผู้ใช้ให้คะแนนสูงๆมากที่สุด โดยกลุ่มเป้าหมายจะเป็น 10% ของผู้ใช้แอปที่ใช้ภาษาในเครื่องเป็นภาษาอังกฤษ

ถัดมาเป็นการสร้างตัวแปร ในที่นี้ เราสร้างตัวแปร 3 ตัวแปรด้วยกัน โดยแบบแรกจะเป็น Control Group ซึ่งปกติแล้วเราจะให้ตัวแปรนี้เป็นค่า default (ง่ายๆก็คือ ค่าที่ผู้ใช้คุ้นเคยกันดีอยู่แล้ว หรือใช้อยู่แล้วในแอปเวอร์ชั่นปัจจุบัน) เพื่อนำมาเป็นเกณฑ์พื้นฐาน(Baseline) ในการเปรียบเทียบกับตัวแปรตัวอื่นๆที่สร้างขึ้นมาใหม่ และอีก 2 แบบเป็นตัวแปรที่สร้างขึ้นมาใหม่เพื่อทำการทดสอบก่อนที่จะปล่อยไปให้ผู้ใช้ทั้งหมดได้ใช้งานจริง

สุดท้าย กำหนดเป้าหมาย(Conversion)ในที่นี้ เป้าหมายหลักของเราคือ ‘ดูว่าข้อความจะทำให้ได้ยอดเรทสูงๆหรือไม่’ ซึ่งเราสามารถดูได้จาก Event ที่เราได้ track ไว้แล้วด้วย Google Analytics for Firebase ที่ชื่อ ‘rate_high_score’ ยิ่งไปกว่านั้น เราสามารถดูตัววัดผลอื่นๆ(Metrics) ควบคู่ไปได้อีกด้วย เพื่อดูว่าการทดลองครั้งนี้ มีผลกระทบกับด้านอื่นๆด้วยไหม ไม่ว่าจะเป็น User engagement ยอด Retention หรือ Custom Event อื่นๆ ที่เราเพิ่มเข้ามาเองก็ได้

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

ในหน้า Draft mode นี้เอง เราสามารถเพิ่ม Test devices เข้าไป เพื่อลองทดสอบค่า Variant ต่างๆในเครื่องเทสก่อนได้ เพียงแค่เข้าไปที่เมนู Manage test devices เพื่อกำหนดค่า Instance ID token พร้อมทั้งเลือกค่า Variant ที่ต้องการจะทดสอบกับแต่ละ device หลังจากที่กด Add และ Save เราก็สามารถทดสอบ Variant ต่างๆ ได้จนมั่นใจก่อนที่จะปล่อยผู้ใช้จริงได้ใช้

ซึ่งค่า Instance ID token สามารถหาได้จากโค้ด 1 บรรทัดตามนี้

InstanceID.instanceID().token() // iOSFirebaseInstanceId.getInstance().getToken() // Android

หลังจากเทสจนมั่นใจแล้ว กดปุ่ม ‘Start Experiment’ เพื่อเริ่มทำการทดลองกับผู้ใช้จริงกันเลย!

ตัดภาพมาดูส่วน Code กันบ้าง

ในส่วนของการ implement นั้น เหมือนตอนทำ Remote Config เดิมๆทุกประการเลย เพียงแค่ต้องอัพเดท Firebase Remote Config library ในไฟล์ pod หรือ gradle เป็นตัวล่าสุดเท่านั้นเอง

รอสักพัก แล้วมาอ่านผลลัพธ์กัน

การทำ A/B testing ต้องใช้เวลาในการรวบรวมข้อมูล เพราะบางทีผู้ใช้จะตอบสนองต่อการเปลี่ยนแปลงต่างๆในแอปอย่างรวดเร็วในตอนแรกๆที่เห็น อาจจะไม่ใช่เพราะฟีเจอร์น่าสนใจ แต่อาจจะเป็นเพราะมันใหม่เลยลองกดดู อะไรอย่างนี้เป็นต้น ทางทีม Firebase จึงเน้นย้ำว่า เราอาจจะต้องรออย่างน้อย 2 สัปดาห์เพื่อจะได้ผลลัพธ์ที่ถูกต้องและแม่นยำ ซึ่งถ้าเข้าไปดูผลลัพธ์ของ scenerio เรทแอปที่เราลองทำกันไปเมื่อสักครู่ ก็จะเห็นหน้าตาประมาณนี้

ในหน้า Results นี้ จะมีค่าแสดงอยู่ด้วยกันเป็น 3 ส่วนหลักๆ โดยส่วนแรก ด้านบนสุดเป็นข้อความที่จะบอก ‘ผู้ชนะ’ คือบอกว่า Variant แบบไหนดีที่สุด หรือทำให้เราบรรลุเป้าหมายต่างๆที่ตั้งไว้ ซึ่งถ้ายังได้ข้อมูลไม่มากพอ หรือยังใช้เวลานานไม่เพียงพอ ก็จะเป็นแบบในภาพ ‘It is too early to declare a leader’

ส่วนที่ 2 เป็นตาราง Improvement overview แสดงการเปรียบเทียบระหว่างค่า Variant กับเกณฑ์พื้นฐาน(Control group) ว่าดีขึ้นหรือแย่ลงตามเป้าหมายต่างๆ ที่กำหนดไว้ในตอนแรกอย่างไร หากเราคลิกที่เป้าหมายอันใดอันหนึ่ง จะมีส่วนที่ 3 ที่แสดงรายละเอียดเจาะลึกเข้าไปในเป้าหมายนั้นๆแสดงขึ้นมา โดยจะแสดงทั้งจำนวนผู้ใช้ที่อยู่ในแต่ละกลุ่มทดลอง ผลการปรับปรุงเมื่อเทียบกับเกณฑ์พื้นฐาน ความน่าจะเป็นที่จะสูงกว่าเกณฑ์พื้นฐาน ความน่าจะเป็นในการเป็นตัวแปรที่ดีที่สุด และค่าอื่นๆที่เกี่ยวข้องกับเป้าหมายนั้นๆ เช่น ค่า Conversion rate หรือ Retention rate เป็นต้น

A/B Testing ใน Real World Project

ดูผลลัพธ์ใน Sample app กันแล้ว เราลองมาดูในโปรเจคจริงๆกันบ้าง

เกม Bingo Blast ได้สร้าง A/B Testing เพื่อทดสอบว่า ‘การลบโฆษณาออกจากแอปมีผลให้ผู้ใช้กลับมาใช้งานแอปมากขึ้นหรือไม่’ ซึ่ง Control group คือ การมีโฆษณาในแอป และ Variant ที่ต้องการเปรียบเทียบก็คือ การไม่มีโฆษณาในแอปนั่นเอง ส่วนเป้าหมายหลักที่ต้องการจะวัดผลในครั้งนี้ คือยอด Retention

ตามตารางด้านบน จะเห็นว่า ค่า Retention ของ Variant ที่ลบโฆษณาออกไป อยู่ในช่วง -7 ถึง 13% คือ คือ ลดลง 7% และเพิ่มขึ้น 13% จากเกณฑ์พื้นฐาน(Control group) ซึ่งเป็นช่วงที่ค่อนข้างกว้างเกินกว่าที่จะตัดสินได้ว่าดีขึ้นหรือแย่ลงกว่าเดิม ซึ่งนั่นก็เป็นอีกเหตุผลที่ทำให้ Firebase ตัดสินว่ายังไม่ได้ผู้ชนะการทดลองนี้ หรือแปลได้ง่ายๆว่า ‘การมีหรือไม่มีโฆษณาในแอป ไม่ได้มีผลให้ผู้ใช้กลับมาใช้งานแอปมากขึ้น’ นั่นเอง

ใช้ A/B Testing กับ Notifications!

นอกจากเราจะทำ A/B Testing ด้วยการใช้ Remote Config กับการทดลองเปลี่ยนแปลงควบคุมค่าต่างๆ หรือกำหนดลูกเล่นการใช้งานในแอปได้แล้ว เรายังสามารถทดลองการส่งข้อความ Notification ผ่าน Firebase Notifications console เพื่อทดสอบการส่งข้อความหลายๆแบบให้กับผู้ใช้บางกลุ่ม แล้วดูว่าข้อความไหนทำให้ผู้ใช้อยากกดเข้ามาอ่าน หรืออยากจะกดสั่งซื้อมากที่สุด เพื่อที่จะได้ปล่อยข้อความนั้นไปให้กับผู้ใช้กลุ่มที่เหลือทั้งหมดได้อีกด้วย ซึ่งขั้นตอนก็เหมือนกับการทำ A/B testing ใน Remote Config ทุกประการ!

ทบทวน

เอาหล่ะ มาถึงตรงนี้ ก็หวังว่าทุกคนคงจะมองเห็นคอนเซป A/B testing กันในระดับนึงแล้ว บางคนคงมีในถามในใจแล้วว่า ถ้าอยากเริ่มล่ะ ต้องทำอย่างไรบ้าง เราขอสรุปเป็น step ง่ายๆ ดังนี้

  1. เริ่มใช้ Google Analytics for Firebase ในแอป เพื่อ track event ต่างๆที่เราจะนำมาเป็นเป้าหมายในการทดลอง เช่น ตัวอย่างของเรา เราทำการ track event ตอนที่คนกดเรทคะแนนสูงๆ(rate_high_score) เอาไว้
  2. ติดตั้ง Firebase Remote Config หรือ Notifications เพื่อให้ง่ายต่อการทดลองในอนาคต
  3. ทำการทดลอง A/B Testing ตั้งสมมติฐานและตัวแปร แล้วเริ่มทดลองกันเลย
  4. ประเมินผลลัพธ์ ออกแบบการทดลองใหม่ และทำซ้ำ

อย่างที่คุณครูเคยบอก ‘ทุกการทดลองมีอะไรให้เราได้เรียนรู้เสมอ’ อย่างน้อยการทำ A/B Testing ก็ทำให้เราไม่ต้องเดาอีกต่อไปว่า ผู้ใช้ชอบแบบไหนมากกว่ากัน แล้วส่งมอบแต่ฟีเจอร์ที่ใช่ให้กับเขา เพราะสุดท้ายแล้ว การที่แอป แอปนึงจะประสบความสำเร็จได้ก็ขึ้นอยู่กับการรักษาผู้ใช้ที่น่ารักให้อยู่กับเรานานๆนี่แหละ ว่าแล้วเราไปเริ่มการทดลองแรกกันเลย… 🙂

ถ้าใครสนใจอยากดู source code ของตัวอย่างที่เราใช้ในบทความนี้ ตามลิ้งค์ด้านล่างนี้ไปได้เลยค่ะ

--

--