Overview

Robyn: Continuos & Semi Automated MMM

September 8, 2025
2 min read
robyn

What is Robyn?

Meta Marketing Science 에서 개발된 오픈소스 마케팅 믹스 모델링(MMM) 패키지로, AI/ML 알고리즘에 기반하여 마케팅 최적화 및 의사 결정을 향상시키기 위해 사용됨.

세분화되고 거대한 데이터를 위해 설계되었으며, ai 기반의 자동화를 통해 실시간 마케팅 의사 결정에 효율적으로 대응할 수 있도록 지원.

R 언어로 작성되었으나, Robyn API for python (Nevergrad)도 제공되어 다양한 환경에서 활용 가능.

Note (How to use Robyn API in python)

overall workflow:

[Robyn hosted on R] - [API on R/plumber] - [python]

Prerequisites:

  • R
  • R packages: Robyn, plumber, …
  • python

Steps:

Terminal window
brew install r
Rscript -e 'remote::install_github("facebookexperimental/Robyn/R")'
Rscript -e 'install.packages(c('arrow', 'dplyr', 'plumber', 'ggplot2', 'jsonlite', 'tibble'))'
# follow steps for install nevergrad in R (https://github.com/facebookexperimental/Robyn/blob/main/demo/install_nevergrad.R)

Key Features

  • 자동화 및 AI 통합: hyperparameter 최적화를 위해 다목적 진화 알고리즘을 사용하여 주요 프로세스를 자동화.
  • time-series decomposition: 장기 마케팅 전략에 필수적인 시계열 데이터의 추세 및 계절성을 처리.
  • ridge regression: 복잡한 마케팅 모델에 fitting 하기 위해 regularized regression 을 사용하여 모델 안정성과 해석성을 개선.
  • gradient 기반 최적화: ROI 목표에 따라 여러 마케팅 채널에 대한 예산 할당을 자동으로 최적화.

Code Example

using robyn API in python (Nevergrad):

import pyomo.environ as pyo
import nevergrad as ng
import nevergrad.functions.pyomo as ng_pyomo
# define coef.
A = ['hammer', 'wrench', 'screwdriver', 'towel']
b = {'hammer': 8, 'wrench': 3, 'screwdriver': 6, 'towel': 11}
w = {'hammer': 5, 'wrench': 7, 'screwdriver': 4, 'towel': 3}
w_max = 14
# define empty model
model = pyo.ConcreteModel()
# define decision variables
model.x = pyo.Var(A, domain=pyo.Binary)
# define objective function
model.obj = pyo.Objective(expr = -sum(b[i] * model.x[i] for i in A))
# define constraints
model.constr = pyo.Constraint(expr = sum(w[i] * model.x[i] for i in A) <= w_max)
# define nevergrad function (Pyomo로 만든 수학적인 model을 Nevergrad가 이해할 수 있는 파이썬 함수(func) 형태로 변환)
func = ng_pyomo.Pyomo(model)
# define optimizer (문제를 풀 최적화 알고리즘(Optimizer)을 선택하고 설정)
optimizer = ng.optimizers.BFGSCMA(parametrization=func.parametrization, budget=100)
# recommendation (실제로 최적화를 실행)
recommend = optimizer.minimize(func.function)
recommend.kwargs # {'hammer': 1.0, 'wrench': 0.0, 'screwdriver': 1.0, 'towel': 1.0}