ตั้งแต่วันที่ 7 มีนาคม 2024 Google ได้เปิดตัว Bayesian MMM เวอร์ชันใหม่อย่างเป็นทางการที่เรียกว่า Meridian ขณะนี้ Meridian มีให้บริการอย่างจำกัดสำหรับผู้ลงโฆษณาบางราย โปรดเยี่ยมชมไซต์นี้หรือติดต่อตัวแทน Google ของคุณเพื่อขอข้อมูลเพิ่มเติม เวอร์ชัน LMMM จะเลิกใช้งานเมื่อ Meridian พร้อมใช้งานทั่วไปแล้ว
เอกสาร • บทนำ • ทฤษฎี • การเริ่มต้นใช้งาน • ข้อมูลอ้างอิง • จุดเด่นของชุมชน
การสร้างแบบจำลองส่วนประสมการตลาด (MMM) ถูกใช้โดยผู้ลงโฆษณาเพื่อวัดประสิทธิภาพการโฆษณาและแจ้งการตัดสินใจจัดสรรงบประมาณผ่านช่องทางสื่อ การวัดผลตามข้อมูลรวมทำให้สามารถเปรียบเทียบระหว่างช่องทางออนไลน์และออฟไลน์ได้ นอกเหนือจากการไม่ได้รับผลกระทบจากการเปลี่ยนแปลงระบบนิเวศล่าสุด (บางส่วนเกี่ยวข้องกับความเป็นส่วนตัว) ซึ่งอาจส่งผลต่อรูปแบบการระบุแหล่งที่มา MMM ช่วยให้คุณ:
การใช้แนวทางแบบ Bayesian กับ MMM ช่วยให้ผู้ลงโฆษณาสามารถรวมข้อมูลก่อนหน้านี้เข้ากับการสร้างแบบจำลอง ช่วยให้คุณ:
แพ็คเกจ LightweightMMM (สร้างโดยใช้ Numpyro และ JAX) ช่วยให้ผู้ลงโฆษณาสร้างโมเดล MMM แบบเบย์ได้อย่างง่ายดาย โดยมอบฟังก์ชันการทำงานเพื่อปรับขนาดข้อมูลอย่างเหมาะสม ประเมินโมเดล เพิ่มประสิทธิภาพการจัดสรรงบประมาณ และพล็อตกราฟทั่วไปที่ใช้ในฟิลด์นี้
MMM จะบอกปริมาณความสัมพันธ์ระหว่างกิจกรรมของช่องทางสื่อและการขาย ในขณะที่ควบคุมปัจจัยอื่นๆ ภาพรวมโมเดลแบบง่ายแสดงอยู่ด้านล่าง และโมเดลแบบเต็มมีระบุไว้ในเอกสารประกอบโมเดล โดยทั่วไป MMM จะดำเนินการโดยใช้การสังเกตระดับรายสัปดาห์ (เช่น KPI อาจเป็นยอดขายต่อสัปดาห์) อย่างไรก็ตาม สามารถดำเนินการในระดับรายวันได้เช่นกัน
โดยที่ kpi โดยทั่วไปคือปริมาณหรือมูลค่าการขายต่อช่วงเวลา
LightweightMMM สามารถเรียกใช้โดยใช้ข้อมูลที่รวบรวมในระดับชาติ (แนวทางมาตรฐาน) หรือใช้ข้อมูลที่รวบรวมในระดับภูมิศาสตร์ (แนวทางลำดับชั้นย่อยของประเทศ)
ระดับประเทศ (แนวทางมาตรฐาน) แนวทางนี้มีความเหมาะสมหากข้อมูลที่มีอยู่ถูกรวบรวมในระดับประเทศเท่านั้น (เช่น KPI อาจเป็นยอดขายระดับประเทศต่อช่วงเวลา) นี่เป็นรูปแบบทั่วไปที่ใช้ใน MMM
ระดับภูมิศาสตร์ (แนวทางลำดับชั้นย่อยของประเทศ) แนวทางนี้มีความเหมาะสมหากสามารถรวบรวมข้อมูลในระดับย่อยของประเทศได้ (เช่น KPI อาจเป็นยอดขายต่อช่วงเวลาสำหรับแต่ละรัฐภายในประเทศ) แนวทางนี้สามารถให้ผลลัพธ์ที่แม่นยำยิ่งขึ้นเมื่อเปรียบเทียบกับแนวทางมาตรฐาน เนื่องจากใช้จุดข้อมูลมากกว่าเพื่อให้เหมาะสมกับแบบจำลอง เราขอแนะนำให้ใช้แบบจำลองระดับย่อยของประเทศสำหรับประเทศขนาดใหญ่ เช่น สหรัฐอเมริกา หากเป็นไปได้
มีแนวโน้มว่าผลกระทบของช่องทางสื่อต่อการขายอาจมีผลกระทบล่าช้าซึ่งจะค่อยๆ ลดลงเมื่อเวลาผ่านไป สถาปัตยกรรมโมเดล Bayesian MMM อันทรงพลังของเราได้รับการออกแบบมาเพื่อจับภาพเอฟเฟกต์นี้และเสนอแนวทางที่แตกต่างกันสามวิธี เราขอแนะนำให้ผู้ใช้เปรียบเทียบทั้งสามวิธีและใช้แนวทางที่ได้ผลดีที่สุด โดยทั่วไปแล้วแนวทางที่ใช้ได้ผลดีที่สุดจะเป็นแนวทางที่เหมาะสมที่สุด (ซึ่งเป็นหนึ่งในผลลัพธ์ที่สร้างขึ้น) รูปแบบการทำงานของแนวทางทั้งสามนี้มีอธิบายไว้โดยย่อด้านล่าง และแสดงไว้อย่างครบถ้วนในเอกสารประกอบโมเดลของเรา
วิธีที่แนะนำในการติดตั้ง Light_mmm คือผ่าน PyPi:
pip install --upgrade pip
pip install lightweight_mmm
หากคุณต้องการใช้เวอร์ชันล่าสุดและเสถียรน้อยกว่าเล็กน้อย คุณสามารถติดตั้งได้จาก GitHub:
pip install --upgrade git+https://github.com/google/lightweight_mmm.git
หากคุณใช้ Google Colab โปรดรีสตาร์ทรันไทม์หลังการติดตั้ง
ที่นี่เราใช้ข้อมูลจำลอง แต่จะถือว่าคุณได้ล้างข้อมูลของคุณแล้ว ณ จุดนี้ ข้อมูลที่จำเป็นจะเป็น:
# Let's assume we have the following datasets with the following shapes (we use
the `simulate_dummy_data` function in utils for this example ):
media_data , extra_features , target , costs = utils . simulate_dummy_data (
data_size = 160 ,
n_media_channels = 3 ,
n_extra_features = 2 ,
geos = 5 ) # Or geos=1 for national model
การปรับขนาดเป็นศิลปะเล็กน้อย เทคนิคแบบเบย์จะทำงานได้ดีหากข้อมูลอินพุตมีขนาดเล็ก เราไม่ควรให้ตัวแปรอยู่ตรงกลางที่ 0 ยอดขายและสื่อควรมีขอบเขตล่างเป็น 0
y / jnp.mean(y)
สามารถปรับ y
เป็นmedia
สามารถปรับขนาดเป็น X_m / jnp.mean(X_m, axis=0)
ซึ่งหมายความว่าค่าเฉลี่ยคอลัมน์ใหม่จะเป็น 1 เรามี CustomScaler
ซึ่งสามารถใช้การคูณและการหารได้ในกรณีที่ตัวปรับขนาดที่ใช้กว้างกว่านั้นไม่เหมาะกับกรณีการใช้งานของคุณ ปรับขนาดข้อมูลของคุณให้เหมาะสมก่อนที่จะปรับโมเดลให้เหมาะสม ด้านล่างนี้เป็นตัวอย่างการใช้งาน CustomScaler
นี้:
# Simple split of the data based on time.
split_point = data_size - data_size // 10
media_data_train = media_data [: split_point , :]
target_train = target [: split_point ]
extra_features_train = extra_features [: split_point , :]
extra_features_test = extra_features [ split_point :, :]
# Scale data
media_scaler = preprocessing . CustomScaler ( divide_operation = jnp . mean )
extra_features_scaler = preprocessing . CustomScaler ( divide_operation = jnp . mean )
target_scaler = preprocessing . CustomScaler (
divide_operation = jnp . mean )
# scale cost up by N since fit() will divide it by number of time periods
cost_scaler = preprocessing . CustomScaler ( divide_operation = jnp . mean )
media_data_train = media_scaler . fit_transform ( media_data_train )
extra_features_train = extra_features_scaler . fit_transform (
extra_features_train )
target_train = target_scaler . fit_transform ( target_train )
costs = cost_scaler . fit_transform ( unscaled_costs )
ในกรณีที่คุณมีตัวแปรที่มี 0 จำนวนมาก คุณสามารถปรับขนาดตามค่าเฉลี่ยของค่าที่ไม่ใช่ศูนย์ได้ ตัวอย่างเช่น คุณสามารถใช้ฟังก์ชัน lambda เพื่อทำสิ่งนี้: lambda x: jnp.mean(x[x > 0])
เช่นเดียวกับการปรับขนาดต้นทุน
โมเดลต้องการข้อมูลสื่อ คุณสมบัติพิเศษ ค่าใช้จ่ายของแต่ละหน่วยสื่อต่อช่องสัญญาณ และเป้าหมาย คุณยังสามารถส่งผ่านจำนวนตัวอย่างที่คุณต้องการใช้และจำนวนเชนได้ด้วย
สำหรับการรันหลายเชนพร้อมกัน ผู้ใช้จะต้องตั้งค่า numpyro.set_host_device_count
เป็นจำนวนเชนหรือจำนวน CPU ที่พร้อมใช้งาน
ดูตัวอย่างด้านล่าง:
# Fit model.
mmm = lightweight_mmm . LightweightMMM ()
mmm . fit ( media = media_data ,
extra_features = extra_features ,
media_prior = costs ,
target = target ,
number_warmup = 1000 ,
number_samples = 1000 ,
number_chains = 2 )
หากคุณต้องการเปลี่ยนแปลงสิ่งใด ๆ ก่อนหน้าในโมเดล (นอกเหนือจากสื่อก่อนหน้าที่คุณระบุไว้เสมอ) คุณสามารถทำได้ด้วย custom_priors
:
# See detailed explanation on custom priors in our documentation.
custom_priors = { "intercept" : numpyro . distributions . Uniform ( 1 , 5 )}
# Fit model.
mmm = lightweight_mmm . LightweightMMM ()
mmm . fit ( media = media_data ,
extra_features = extra_features ,
media_prior = costs ,
target = target ,
number_warmup = 1000 ,
number_samples = 1000 ,
number_chains = 2 ,
custom_priors = custom_priors )
โปรดดูเอกสารประกอบของเราใน custom_priors สำหรับรายละเอียดเพิ่มเติม
คุณสามารถสลับระหว่างข้อมูลรายวันและรายสัปดาห์ได้โดยเปิดใช้งาน weekday_seasonality=True
และ seasonality_frequency=365
หรือ weekday_seasonality=False
และ seasonality_frequency=52
(ค่าเริ่มต้น) ในกรณีของข้อมูลรายวัน เรามีฤดูกาลสองประเภท: วันทำงานที่ไม่ต่อเนื่อง และรายปีที่ราบรื่น
ผู้ใช้สามารถตรวจสอบการวัดการบรรจบกันของพารามิเตอร์ได้ดังต่อไปนี้:
mmm . print_summary ()
หลักทั่วไปคือค่า r_hat
สำหรับพารามิเตอร์ทั้งหมดน้อยกว่า 1.1
ผู้ใช้สามารถตรวจสอบความเหมาะสมระหว่าง KPI จริงและ KPI ที่คาดการณ์ได้โดย:
plot . plot_model_fit ( media_mix_model = mmm , target_scaler = target_scaler )
หากกำหนด target_scaler
ที่ใช้สำหรับ preprocessing.CustomScaler()
เป้าหมายจะไม่ได้รับการปรับขนาด Bayesian R-squared และ MAPE แสดงในแผนภูมิ
ผู้ใช้สามารถรับคำทำนายสำหรับข้อมูลการทดสอบได้โดย:
prediction = mmm . predict (
media = media_data_test ,
extra_features = extra_data_test ,
target_scaler = target_scaler
)
การทำนายที่ส่งคืนคือการแจกแจง หากต้องการการประมาณจุด ผู้ใช้สามารถคำนวณตามการแจกแจงที่กำหนดได้ ตัวอย่างเช่น ถ้า data_size
ของข้อมูลทดสอบคือ 20, number_samples
คือ 1,000 และ number_of_chains
คือ 2 mmm.predict
จะส่งกลับชุดการคาดการณ์ 2,000 ชุดพร้อมจุดข้อมูล 20 จุด ผู้ใช้สามารถเปรียบเทียบการแจกแจงกับค่าที่แท้จริงของข้อมูลทดสอบ และคำนวณหน่วยเมตริก เช่น ค่าเฉลี่ยและค่ามัธยฐาน
ผู้ใช้สามารถรับรายละเอียดการประมาณค่าพารามิเตอร์ได้โดย:
mmm . print_summary ()
ค่าข้างต้นจะส่งกลับค่าเฉลี่ย ค่าเบี่ยงเบนมาตรฐาน ค่ามัธยฐาน และช่วงเวลาที่น่าเชื่อถือสำหรับแต่ละพารามิเตอร์ แผนภูมิการกระจายจัดทำโดย:
plot . plot_media_channel_posteriors ( media_mix_model = mmm , channel_names = media_names )
channel_names
ระบุชื่อสื่อในแต่ละแผนภูมิ
เส้นโค้งการตอบสนองมีดังต่อไปนี้:
plot . plot_response_curves ( media_mix_model = mmm , media_scaler = media_scaler , target_scaler = target_scaler )
หากกำหนด media_scaler
และ target_scaler
สำหรับ preprocessing.CustomScaler()
ทั้งค่าสื่อและเป้าหมายจะไม่ได้รับการปรับขนาด
หากต้องการแยกประสิทธิภาพของสื่อและการประมาณ ROI ผู้ใช้สามารถทำสิ่งต่อไปนี้:
media_effect_hat , roi_hat = mmm . get_posterior_metrics ()
media_effect_hat
คือการประมาณประสิทธิภาพของสื่อ และ roi_hat
คือการประมาณค่า ROI จากนั้นผู้ใช้สามารถเห็นภาพการกระจายของการประมาณค่าได้ดังนี้:
plot . plot_bars_media_metrics ( metric = media_effect_hat , channel_names = media_names )
plot . plot_bars_media_metrics ( metric = roi_hat , channel_names = media_names )
สำหรับการเพิ่มประสิทธิภาพ เราจะเพิ่มยอดขายให้สูงสุดโดยเปลี่ยนปัจจัยการผลิตสื่อ เพื่อให้ต้นทุนรวมของสื่อคงที่ เรายังอนุญาตให้มีขอบเขตที่เหมาะสมในอินพุตสื่อแต่ละรายการได้ (เช่น +- x%) เราเพิ่มประสิทธิภาพข้ามช่องทางเท่านั้นและไม่ใช่เมื่อเวลาผ่านไป ในการรันการปรับให้เหมาะสมที่สุด จำเป็นต้องมีพารามิเตอร์หลักดังต่อไปนี้:
n_time_periods
: จำนวนช่วงเวลาที่คุณต้องการจำลอง (เช่น เพิ่มประสิทธิภาพสำหรับ 10 สัปดาห์ข้างหน้า หากคุณฝึกโมเดลเกี่ยวกับข้อมูลรายสัปดาห์)budget
ที่คุณต้องการจัดสรรสำหรับ n_time_periods
ถัดไปn_time_periods
ต่อไปนี้media_gap
หมายถึงช่องว่างข้อมูลสื่อระหว่างจุดสิ้นสุดของข้อมูลการฝึกอบรมและจุดเริ่มต้นของสื่อตัวอย่างที่กำหนด เช่น หากใช้ข้อมูล 100 สัปดาห์สำหรับการฝึกอบรมและการคาดการณ์เริ่มต้น 2 เดือนหลังจากข้อมูลการฝึกอบรมเสร็จสิ้น เราจำเป็นต้องจัดเตรียมข้อมูล 8 สัปดาห์ที่ขาดหายไประหว่างข้อมูลการฝึกอบรมและข้อมูลการคาดการณ์ เพื่อให้การแปลงข้อมูล (adstock, การนำส่ง, ...) สามารถเกิดขึ้นได้อย่างถูกต้อง .ดูด้านล่างและตัวอย่างการเพิ่มประสิทธิภาพ:
# Run media optimization.
budget = 40 # your budget here
prices = np . array ([ 0.1 , 0.11 , 0.12 ])
extra_features_test = extra_features_scaler . transform ( extra_features_test )
solution = optimize_media . find_optimal_budgets (
n_time_periods = extra_features_test . shape [ 0 ],
media_mix_model = mmm ,
budget = budget ,
extra_features = extra_features_test ,
prices = prices )
ผู้ใช้สามารถบันทึกและโหลดโมเดลได้ดังนี้:
utils . save_model ( mmm , file_path = 'file_path' )
ผู้ใช้สามารถระบุ file_path
เพื่อบันทึกโมเดลได้ หากต้องการโหลดโมเดล MMM ที่บันทึกไว้:
utils . load_model ( file_path : 'file_path' )
หากต้องการอ้างอิงที่เก็บนี้:
@software{lightweight_mmmgithub,
author = {Pablo Duque and Dirk Nachbar and Yuka Abe and Christiane Ahlheim and Mike Anderson and Yan Sun and Omri Goldstein and Tim Eck},
title = {LightweightMMM: Lightweight (Bayesian) Marketing Mix Modeling},
url = {https://github.com/google/lightweight_mmm},
version = {0.1.6},
year = {2022},
}
Jin, Y., Wang, Y., Sun, Y., Chan, D., & Koehler, J. (2017) วิธีการแบบเบย์สำหรับการสร้างแบบจำลองสื่อผสมพร้อมการยกยอดและเอฟเฟกต์รูปร่าง กูเกิลอิงค์
ชาน ดี. และเพอร์รี่ เอ็ม. (2017) ความท้าทายและโอกาสในการสร้างแบบจำลองสื่อผสม
ซัน, วาย., วัง, วาย., จิน, วาย., ชาน, ดี., และโคห์เลอร์, เจ. (2017) การสร้างแบบจำลองสื่อผสมลำดับชั้นแบบเบย์เซียนระดับทางภูมิศาสตร์
เนื่องจาก LMMM ไม่ใช่ผลิตภัณฑ์อย่างเป็นทางการของ Google ทีม LMMM จึงให้การสนับสนุนได้เพียงจำกัดเท่านั้น
สำหรับ คำถามเกี่ยวกับวิธีการ โปรดดูส่วนข้อมูลอ้างอิงหรือหน้าคำถามที่พบบ่อย
สำหรับ ปัญหาในการติดตั้งหรือใช้ LMMM โปรดโพสต์ไว้ในแท็บการสนทนาหรือปัญหาของที่เก็บ Github ทีมงาน LMMM จะตอบคำถามเหล่านี้ในเวลาว่าง ดังนั้นเราจึงไม่สามารถรับประกันการตอบกลับได้ทันท่วงที นอกจากนี้เรายังสนับสนุนให้ชุมชนแบ่งปันเคล็ดลับและคำแนะนำซึ่งกันและกันที่นี่!
สำหรับ คำขอคุณลักษณะ โปรดโพสต์ลงในแท็บการสนทนาของที่เก็บ Github เรามีแผนการทำงานภายในสำหรับการพัฒนา LMMM แต่ให้ความสนใจกับคำขอคุณสมบัติและขอบคุณพวกเขา!
สำหรับ รายงานข้อบกพร่อง โปรดโพสต์ไว้ที่แท็บปัญหาของที่เก็บ Github หาก/เมื่อใดที่เราสามารถแก้ไขปัญหาเหล่านี้ได้ เราจะแจ้งให้คุณทราบในความคิดเห็นเกี่ยวกับปัญหาของคุณ
เรายินดีรับ คำขอดึงข้อมูล แต่เป็นเรื่องยากมากสำหรับเราที่จะรวมเข้าด้วยกัน เนื่องจากโค้ดในพื้นที่เก็บข้อมูลนี้เชื่อมโยงกับระบบภายในของ Google และต้องผ่านการตรวจสอบภายใน หากคุณส่งคำขอดึงและเรามีทรัพยากรที่จะช่วยรวมเข้าด้วยกัน เราจะติดต่อคุณเกี่ยวกับเรื่องนี้!
วิธีสร้างโมเดลส่วนประสมการตลาดด้วย LightweightMMM โดย Mario Filho
วิธีการทำงานของ Google LightweightMMM และคำแนะนำของ LightweightMMM ของ Google โดย Mike Taylor