[{"data":1,"prerenderedAt":1622},["ShallowReactive",2],{"article-alternates":3,"article-\u002Ffr\u002Fdata\u002Frobyn-marketing-mix-modeling-praktik-kurulum":13},{"i18nKey":4,"paths":5},"data-005-2026-05",{"de":6,"en":7,"es":8,"fr":9,"it":10,"ru":11,"tr":12},"\u002Fde\u002Fdata\u002Frobyn-marketing-mix-modeling-praktik-kurulum","\u002Fen\u002Fdata\u002Fmarketing-mix-modeling-robyn-practical-setup","\u002Fes\u002Fdata\u002Frobyn-marketing-mix-modeling-guia-practica","\u002Ffr\u002Fdata\u002Frobyn-marketing-mix-modeling-praktik-kurulum","\u002Fit\u002Fdata\u002Frobyn-marketing-mix-modeling-pratico-setup","\u002Fru\u002Fdata\u002Frobyn-marketing-mix-modeling-setup","\u002Ftr\u002Fdata\u002Fmarketing-mix-modeling-robyn-ile-pratik-kurulum",{"_path":9,"_dir":14,"_draft":15,"_partial":15,"_locale":16,"title":17,"description":18,"publishedAt":19,"modifiedAt":19,"category":14,"i18nKey":4,"tags":20,"readingTime":26,"author":27,"body":28,"_type":1616,"_id":1617,"_source":1618,"_file":1619,"_stem":1620,"_extension":1621},"data",false,"","Marketing Mix Modeling : Configuration pratique avec Robyn","Configurez la bibliothèque MMM open-source de Meta, Robyn, avec courbes de saturation, décroissance d'adstock et validation holdout sur votre stack BigQuery.","2026-05-17",[21,22,23,24,25],"marketing-mix-modeling","robyn","meta","adstock","saturation-curve",9,"Roibase",{"type":29,"children":30,"toc":1606},"root",[31,39,46,51,56,61,67,72,81,91,111,116,124,142,147,153,158,163,187,195,203,208,216,281,286,293,429,434,440,445,450,458,618,626,644,649,655,660,711,719,1354,1367,1373,1378,1383,1391,1570,1575,1580,1584,1600],{"type":32,"tag":33,"props":34,"children":35},"element","p",{},[36],{"type":37,"value":38},"text","La fenêtre d'attribution s'est réduite à 7 jours, le taux de refus du consentement aux cookies dépasse 40 %, la contribution multi-touch entre canaux est devenue intraçable. En 2026, l'unique voie fiable pour un performance marketer est le modèle économétrique agrégé : le Marketing Mix Modeling. La bibliothèque Robyn, lancée en open-source par Meta en 2021, a enfin rendu ce processus production-ready. Comment interpréter une courbe de saturation, que signifie réellement la décroissance d'adstock, dans quel intervalle la validation holdout fonctionne-t-elle — nous répondrons à ces questions en déployant Robyn sur votre stack BigQuery.",{"type":32,"tag":40,"props":41,"children":43},"h2",{"id":42},"robyn-ce-quil-est-ce-quil-nest-pas",[44],{"type":37,"value":45},"Robyn : Ce qu'il est, ce qu'il n'est pas",{"type":32,"tag":33,"props":47,"children":48},{},[49],{"type":37,"value":50},"Robyn est une bibliothèque R développée par l'équipe Marketing Science de Facebook et publiée en open-source. Son objectif : régresser les dépenses hebdomadaires ou quotidiennes par canal + variables externes (jours fériés, saisonnalité, prix) contre une métrique de ventes. Output : ROAS par canal, niveau de saturation, effet de décalage temporel (adstock), allocation budgétaire optimale.",{"type":32,"tag":33,"props":52,"children":53},{},[54],{"type":37,"value":55},"Ce qu'il n'est pas : ce n'est pas de l'attribution au dernier clic, il ne suit pas le parcours de conversion au niveau utilisateur. Il n'utilise pas de données personnelles, ne dépend pas de signaux cookie. Il fonctionne avec des modèles de régression économétrique sur séries temporelles agrégées — pas Ridge ni Lasso, mais optimisation d'hyperparamètres via Nevergrad qui balaye des transformations non-linéaires complexes.",{"type":32,"tag":33,"props":57,"children":58},{},[59],{"type":37,"value":60},"Dans les processus MMM classiques, on modélise 36 points de données mensuels. Robyn fonctionne même sur granularité quotidienne — 104 semaines minimum (2 ans) sont recommandées. Moins de 52 semaines maintiennent la variance élevée et rendent les intervalles de confiance peu fiables.",{"type":32,"tag":40,"props":62,"children":64},{"id":63},"la-courbe-de-saturation-s-curve-et-fonction-hill",[65],{"type":37,"value":66},"La courbe de saturation : S-Curve et fonction Hill",{"type":32,"tag":33,"props":68,"children":69},{},[70],{"type":37,"value":71},"Au cœur de Robyn se trouvent deux transformations de saturation : Adbudg (S-curve) et Hill. Toutes deux codent l'hypothèse de rendements marginaux décroissants. Autrement dit, chaque 1000 € supplémentaires dépensés sur un canal ne génère pas autant de conversions que les premiers 1000 €.",{"type":32,"tag":33,"props":73,"children":74},{},[75],{"type":32,"tag":76,"props":77,"children":78},"strong",{},[79],{"type":37,"value":80},"Formule de la transformation Hill :",{"type":32,"tag":82,"props":83,"children":85},"pre",{"code":84},"y = K * (x^alpha) \u002F (S^alpha + x^alpha)\n",[86],{"type":32,"tag":87,"props":88,"children":89},"code",{"__ignoreMap":16},[90],{"type":37,"value":84},{"type":32,"tag":92,"props":93,"children":94},"ul",{},[95,101,106],{"type":32,"tag":96,"props":97,"children":98},"li",{},[99],{"type":37,"value":100},"K : réponse maximale (asymptote)",{"type":32,"tag":96,"props":102,"children":103},{},[104],{"type":37,"value":105},"S : point de demi-saturation (à ce niveau de dépense, la réponse atteint 50 % de K)",{"type":32,"tag":96,"props":107,"children":108},{},[109],{"type":37,"value":110},"alpha : pente de la courbe (alpha > 1 = S-curve, alpha \u003C 1 = concave)",{"type":32,"tag":33,"props":112,"children":113},{},[114],{"type":37,"value":115},"Robyn optimise les paramètres alpha et S pour chaque canal via Nevergrad. Il teste 10 000+ combinaisons et sélectionne le meilleur ajustement selon le NRMSE le plus bas (normalized root mean squared error).",{"type":32,"tag":33,"props":117,"children":118},{},[119],{"type":32,"tag":76,"props":120,"children":121},{},[122],{"type":37,"value":123},"Interprétation pratique :",{"type":32,"tag":92,"props":125,"children":126},{},[127,132,137],{"type":32,"tag":96,"props":128,"children":129},{},[130],{"type":37,"value":131},"Si Google Ads révèle S = 50 000 €, cela signifie qu'à 50 000 € de dépense hebdomadaire, vous atteignez 50 % de votre potentiel de réponse.",{"type":32,"tag":96,"props":133,"children":134},{},[135],{"type":37,"value":136},"Si alpha = 2,5, la courbe est une S raide — le rendement est très faible sous 50 000 €, puis augmente très lentement au-delà.",{"type":32,"tag":96,"props":138,"children":139},{},[140],{"type":37,"value":141},"L'optimiseur budgétaire utilise ces courbes pour répondre : « Est-il mieux de passer Google Ads de 50 000 € à 60 000 € ou Facebook de 30 000 € à 40 000 € ? »",{"type":32,"tag":33,"props":143,"children":144},{},[145],{"type":37,"value":146},"En pratique : le budget de recherche s'avère généralement concave (alpha \u003C 1), tandis que display\u002Fvidéo suit une S-curve (alpha > 1). La demande de recherche est limitée, le pool display illimité mais l'attention ne l'est pas.",{"type":32,"tag":40,"props":148,"children":150},{"id":149},"adstock-decay-modéliser-leffet-différé",[151],{"type":37,"value":152},"Adstock Decay : Modéliser l'effet différé",{"type":32,"tag":33,"props":154,"children":155},{},[156],{"type":37,"value":157},"L'impact d'une dépense marketing ne se limite pas au jour même — il s'étend sur plusieurs semaines. Une publicité TV génère encore une mémorisation de marque 3 semaines après, tandis que le social payant perd son effet en 7 jours. L'adstock formalise mathématiquement ce report (carryover) et cette décroissance (decay).",{"type":32,"tag":33,"props":159,"children":160},{},[161],{"type":37,"value":162},"Robyn offre deux transformations d'adstock :",{"type":32,"tag":164,"props":165,"children":166},"ol",{},[167,177],{"type":32,"tag":96,"props":168,"children":169},{},[170,175],{"type":32,"tag":76,"props":171,"children":172},{},[173],{"type":37,"value":174},"Adstock géométrique :",{"type":37,"value":176}," Décroissance exponentielle. Paramètre theta (entre 0 et 1). Theta = 0,5 signifie que 50 % de l'effet de la semaine précédente transite vers la semaine actuelle.",{"type":32,"tag":96,"props":178,"children":179},{},[180,185],{"type":32,"tag":76,"props":181,"children":182},{},[183],{"type":37,"value":184},"Adstock Weibull :",{"type":37,"value":186}," Plus flexible — pic décalé + queue longue. Paramètres : forme (k) et échelle (lambda). Préféré pour les canaux comme la TV avec un pic d'effet différé.",{"type":32,"tag":33,"props":188,"children":189},{},[190],{"type":32,"tag":76,"props":191,"children":192},{},[193],{"type":37,"value":194},"Formule de l'adstock géométrique :",{"type":32,"tag":82,"props":196,"children":198},{"code":197},"adstocked_t = spend_t + theta * adstocked_(t-1)\n",[199],{"type":32,"tag":87,"props":200,"children":201},{"__ignoreMap":16},[202],{"type":37,"value":197},{"type":32,"tag":33,"props":204,"children":205},{},[206],{"type":37,"value":207},"Robyn optimise theta (ou k, lambda) pour chaque canal via grid search. L'utilisateur définit une plage dans hyperparameters.json (par ex., 0–0,7), et le modèle trouve le theta optimal.",{"type":32,"tag":33,"props":209,"children":210},{},[211],{"type":32,"tag":76,"props":212,"children":213},{},[214],{"type":37,"value":215},"Ce qu'il faut faire en pratique :",{"type":32,"tag":82,"props":217,"children":221},{"code":218,"language":219,"meta":16,"className":220,"style":16},"hyperparameters \u003C- list(\n  google_ads_S = c(0.3, 3),    # plage theta pour adstock\n  google_ads_alphas = c(0.5, 3), # plage alpha de saturation\n  facebook_ads_S = c(0.1, 2),\n  facebook_ads_alphas = c(1, 5)\n)\n","r","language-r shiki shiki-themes github-dark",[222],{"type":32,"tag":87,"props":223,"children":224},{"__ignoreMap":16},[225,236,245,254,263,272],{"type":32,"tag":226,"props":227,"children":230},"span",{"class":228,"line":229},"line",1,[231],{"type":32,"tag":226,"props":232,"children":233},{},[234],{"type":37,"value":235},"hyperparameters \u003C- list(\n",{"type":32,"tag":226,"props":237,"children":239},{"class":228,"line":238},2,[240],{"type":32,"tag":226,"props":241,"children":242},{},[243],{"type":37,"value":244},"  google_ads_S = c(0.3, 3),    # plage theta pour adstock\n",{"type":32,"tag":226,"props":246,"children":248},{"class":228,"line":247},3,[249],{"type":32,"tag":226,"props":250,"children":251},{},[252],{"type":37,"value":253},"  google_ads_alphas = c(0.5, 3), # plage alpha de saturation\n",{"type":32,"tag":226,"props":255,"children":257},{"class":228,"line":256},4,[258],{"type":32,"tag":226,"props":259,"children":260},{},[261],{"type":37,"value":262},"  facebook_ads_S = c(0.1, 2),\n",{"type":32,"tag":226,"props":264,"children":266},{"class":228,"line":265},5,[267],{"type":32,"tag":226,"props":268,"children":269},{},[270],{"type":37,"value":271},"  facebook_ads_alphas = c(1, 5)\n",{"type":32,"tag":226,"props":273,"children":275},{"class":228,"line":274},6,[276],{"type":32,"tag":226,"props":277,"children":278},{},[279],{"type":37,"value":280},")\n",{"type":32,"tag":33,"props":282,"children":283},{},[284],{"type":37,"value":285},"Si Google Ads ressort avec theta = 0,4 et Facebook Ads avec 0,2, cela signifie que l'impact de Google Ads s'étend plus longtemps. Le planificateur budgétaire en tient compte — un euro dépensé en Google Ads contribue encore 2 semaines plus tard, tandis que pour Facebook ce n'est qu'une semaine.",{"type":32,"tag":287,"props":288,"children":290},"h3",{"id":289},"bloc-de-code-transformation-dadstock-simple-r",[291],{"type":37,"value":292},"Bloc de code : transformation d'adstock simple (R)",{"type":32,"tag":82,"props":294,"children":296},{"code":295,"language":219,"meta":16,"className":220,"style":16},"apply_geometric_adstock \u003C- function(spend, theta) {\n  adstocked \u003C- numeric(length(spend))\n  adstocked[1] \u003C- spend[1]\n  for (t in 2:length(spend)) {\n    adstocked[t] \u003C- spend[t] + theta * adstocked[t - 1]\n  }\n  return(adstocked)\n}\n\n# Exemple : dépense Google Ads\ngoogle_spend \u003C- c(10000, 15000, 12000, 8000, 20000)\ntheta_google \u003C- 0.5\nadstocked_google \u003C- apply_geometric_adstock(google_spend, theta_google)\nprint(adstocked_google)\n# [1] 10000.0 20000.0 22000.0 19000.0 29500.0\n",[297],{"type":32,"tag":87,"props":298,"children":299},{"__ignoreMap":16},[300,308,316,324,332,340,348,357,366,375,384,393,402,411,420],{"type":32,"tag":226,"props":301,"children":302},{"class":228,"line":229},[303],{"type":32,"tag":226,"props":304,"children":305},{},[306],{"type":37,"value":307},"apply_geometric_adstock \u003C- function(spend, theta) {\n",{"type":32,"tag":226,"props":309,"children":310},{"class":228,"line":238},[311],{"type":32,"tag":226,"props":312,"children":313},{},[314],{"type":37,"value":315},"  adstocked \u003C- numeric(length(spend))\n",{"type":32,"tag":226,"props":317,"children":318},{"class":228,"line":247},[319],{"type":32,"tag":226,"props":320,"children":321},{},[322],{"type":37,"value":323},"  adstocked[1] \u003C- spend[1]\n",{"type":32,"tag":226,"props":325,"children":326},{"class":228,"line":256},[327],{"type":32,"tag":226,"props":328,"children":329},{},[330],{"type":37,"value":331},"  for (t in 2:length(spend)) {\n",{"type":32,"tag":226,"props":333,"children":334},{"class":228,"line":265},[335],{"type":32,"tag":226,"props":336,"children":337},{},[338],{"type":37,"value":339},"    adstocked[t] \u003C- spend[t] + theta * adstocked[t - 1]\n",{"type":32,"tag":226,"props":341,"children":342},{"class":228,"line":274},[343],{"type":32,"tag":226,"props":344,"children":345},{},[346],{"type":37,"value":347},"  }\n",{"type":32,"tag":226,"props":349,"children":351},{"class":228,"line":350},7,[352],{"type":32,"tag":226,"props":353,"children":354},{},[355],{"type":37,"value":356},"  return(adstocked)\n",{"type":32,"tag":226,"props":358,"children":360},{"class":228,"line":359},8,[361],{"type":32,"tag":226,"props":362,"children":363},{},[364],{"type":37,"value":365},"}\n",{"type":32,"tag":226,"props":367,"children":368},{"class":228,"line":26},[369],{"type":32,"tag":226,"props":370,"children":372},{"emptyLinePlaceholder":371},true,[373],{"type":37,"value":374},"\n",{"type":32,"tag":226,"props":376,"children":378},{"class":228,"line":377},10,[379],{"type":32,"tag":226,"props":380,"children":381},{},[382],{"type":37,"value":383},"# Exemple : dépense Google Ads\n",{"type":32,"tag":226,"props":385,"children":387},{"class":228,"line":386},11,[388],{"type":32,"tag":226,"props":389,"children":390},{},[391],{"type":37,"value":392},"google_spend \u003C- c(10000, 15000, 12000, 8000, 20000)\n",{"type":32,"tag":226,"props":394,"children":396},{"class":228,"line":395},12,[397],{"type":32,"tag":226,"props":398,"children":399},{},[400],{"type":37,"value":401},"theta_google \u003C- 0.5\n",{"type":32,"tag":226,"props":403,"children":405},{"class":228,"line":404},13,[406],{"type":32,"tag":226,"props":407,"children":408},{},[409],{"type":37,"value":410},"adstocked_google \u003C- apply_geometric_adstock(google_spend, theta_google)\n",{"type":32,"tag":226,"props":412,"children":414},{"class":228,"line":413},14,[415],{"type":32,"tag":226,"props":416,"children":417},{},[418],{"type":37,"value":419},"print(adstocked_google)\n",{"type":32,"tag":226,"props":421,"children":423},{"class":228,"line":422},15,[424],{"type":32,"tag":226,"props":425,"children":426},{},[427],{"type":37,"value":428},"# [1] 10000.0 20000.0 22000.0 19000.0 29500.0\n",{"type":32,"tag":33,"props":430,"children":431},{},[432],{"type":37,"value":433},"Ce code s'exécute au niveau C++ optimisé dans Robyn, mais la logique reste la même.",{"type":32,"tag":40,"props":435,"children":437},{"id":436},"validation-holdout-test-de-fiabilité-du-modèle",[438],{"type":37,"value":439},"Validation Holdout : test de fiabilité du modèle",{"type":32,"tag":33,"props":441,"children":442},{},[443],{"type":37,"value":444},"Robyn court le risque de surapprentissage lors de l'amélioration de l'ajustement du modèle. 10 canaux + 5 variables macro + paramètres de saturation et adstock pour chacun = 30+ variables. Avec 104 points de données, c'est trop de degrés de liberté.",{"type":32,"tag":33,"props":446,"children":447},{},[448],{"type":37,"value":449},"Robyn utilise la validation holdout : les N dernières semaines de données sont exclues de l'entraînement du modèle, ce dernier apprend sur l'historique, puis prédit sur la période holdout, et le MAPE (mean absolute percentage error) est calculé par rapport aux valeurs réelles.",{"type":32,"tag":33,"props":451,"children":452},{},[453],{"type":32,"tag":76,"props":454,"children":455},{},[456],{"type":37,"value":457},"Définir holdout dans Robyn :",{"type":32,"tag":82,"props":459,"children":461},{"code":460,"language":219,"meta":16,"className":220,"style":16},"InputCollect \u003C- robyn_inputs(\n  dt_input = df_marketing,\n  dep_var = \"revenue\",\n  paid_media_spends = c(\"google_ads\", \"facebook_ads\", \"tiktok_ads\"),\n  window_start = \"2024-01-01\",\n  window_end = \"2026-04-30\",\n  adstock = \"geometric\",\n  prophet_vars = c(\"trend\", \"season\", \"holiday\"),\n  prophet_country = \"FR\"\n)\n\n# Holdout : 8 dernières semaines\nOutputModels \u003C- robyn_run(\n  InputCollect = InputCollect,\n  iterations = 2000,\n  trials = 5,\n  ts_validation = TRUE,\n  ts_holdout = 8  # 8 dernières semaines = ensemble de test\n)\n",[462],{"type":32,"tag":87,"props":463,"children":464},{"__ignoreMap":16},[465,473,481,489,497,505,513,521,529,537,544,551,559,567,575,583,592,601,610],{"type":32,"tag":226,"props":466,"children":467},{"class":228,"line":229},[468],{"type":32,"tag":226,"props":469,"children":470},{},[471],{"type":37,"value":472},"InputCollect \u003C- robyn_inputs(\n",{"type":32,"tag":226,"props":474,"children":475},{"class":228,"line":238},[476],{"type":32,"tag":226,"props":477,"children":478},{},[479],{"type":37,"value":480},"  dt_input = df_marketing,\n",{"type":32,"tag":226,"props":482,"children":483},{"class":228,"line":247},[484],{"type":32,"tag":226,"props":485,"children":486},{},[487],{"type":37,"value":488},"  dep_var = \"revenue\",\n",{"type":32,"tag":226,"props":490,"children":491},{"class":228,"line":256},[492],{"type":32,"tag":226,"props":493,"children":494},{},[495],{"type":37,"value":496},"  paid_media_spends = c(\"google_ads\", \"facebook_ads\", \"tiktok_ads\"),\n",{"type":32,"tag":226,"props":498,"children":499},{"class":228,"line":265},[500],{"type":32,"tag":226,"props":501,"children":502},{},[503],{"type":37,"value":504},"  window_start = \"2024-01-01\",\n",{"type":32,"tag":226,"props":506,"children":507},{"class":228,"line":274},[508],{"type":32,"tag":226,"props":509,"children":510},{},[511],{"type":37,"value":512},"  window_end = \"2026-04-30\",\n",{"type":32,"tag":226,"props":514,"children":515},{"class":228,"line":350},[516],{"type":32,"tag":226,"props":517,"children":518},{},[519],{"type":37,"value":520},"  adstock = \"geometric\",\n",{"type":32,"tag":226,"props":522,"children":523},{"class":228,"line":359},[524],{"type":32,"tag":226,"props":525,"children":526},{},[527],{"type":37,"value":528},"  prophet_vars = c(\"trend\", \"season\", \"holiday\"),\n",{"type":32,"tag":226,"props":530,"children":531},{"class":228,"line":26},[532],{"type":32,"tag":226,"props":533,"children":534},{},[535],{"type":37,"value":536},"  prophet_country = \"FR\"\n",{"type":32,"tag":226,"props":538,"children":539},{"class":228,"line":377},[540],{"type":32,"tag":226,"props":541,"children":542},{},[543],{"type":37,"value":280},{"type":32,"tag":226,"props":545,"children":546},{"class":228,"line":386},[547],{"type":32,"tag":226,"props":548,"children":549},{"emptyLinePlaceholder":371},[550],{"type":37,"value":374},{"type":32,"tag":226,"props":552,"children":553},{"class":228,"line":395},[554],{"type":32,"tag":226,"props":555,"children":556},{},[557],{"type":37,"value":558},"# Holdout : 8 dernières semaines\n",{"type":32,"tag":226,"props":560,"children":561},{"class":228,"line":404},[562],{"type":32,"tag":226,"props":563,"children":564},{},[565],{"type":37,"value":566},"OutputModels \u003C- robyn_run(\n",{"type":32,"tag":226,"props":568,"children":569},{"class":228,"line":413},[570],{"type":32,"tag":226,"props":571,"children":572},{},[573],{"type":37,"value":574},"  InputCollect = InputCollect,\n",{"type":32,"tag":226,"props":576,"children":577},{"class":228,"line":422},[578],{"type":32,"tag":226,"props":579,"children":580},{},[581],{"type":37,"value":582},"  iterations = 2000,\n",{"type":32,"tag":226,"props":584,"children":586},{"class":228,"line":585},16,[587],{"type":32,"tag":226,"props":588,"children":589},{},[590],{"type":37,"value":591},"  trials = 5,\n",{"type":32,"tag":226,"props":593,"children":595},{"class":228,"line":594},17,[596],{"type":32,"tag":226,"props":597,"children":598},{},[599],{"type":37,"value":600},"  ts_validation = TRUE,\n",{"type":32,"tag":226,"props":602,"children":604},{"class":228,"line":603},18,[605],{"type":32,"tag":226,"props":606,"children":607},{},[608],{"type":37,"value":609},"  ts_holdout = 8  # 8 dernières semaines = ensemble de test\n",{"type":32,"tag":226,"props":611,"children":613},{"class":228,"line":612},19,[614],{"type":32,"tag":226,"props":615,"children":616},{},[617],{"type":37,"value":280},{"type":32,"tag":33,"props":619,"children":620},{},[621],{"type":32,"tag":76,"props":622,"children":623},{},[624],{"type":37,"value":625},"Interprétation des résultats :",{"type":32,"tag":92,"props":627,"children":628},{},[629,634,639],{"type":32,"tag":96,"props":630,"children":631},{},[632],{"type":37,"value":633},"NRMSE train \u003C 0,10, NRMSE holdout \u003C 0,15 → le modèle est fiable.",{"type":32,"tag":96,"props":635,"children":636},{},[637],{"type":37,"value":638},"NRMSE train = 0,05, holdout = 0,30 → surapprentissage, il faut réduire les plages d'hyperparamètres.",{"type":32,"tag":96,"props":640,"children":641},{},[642],{"type":37,"value":643},"Decomp.RSSD (response sum of squared differences) : la contribution totale des canaux explique quelle fraction du revenu prédit. 0,6+ c'est bon, 0,8+ c'est excellent.",{"type":32,"tag":33,"props":645,"children":646},{},[647],{"type":37,"value":648},"Robyn exécute 5 trials simultanément (seeds aléatoires différents de Nevergrad), 2000 itérations par trial, et affiche les 10 meilleurs modèles sur la frontière de Pareto. L'utilisateur en sélectionne un en fonction des contraintes métier (par ex., « Google Ads ROAS ne peut pas descendre sous 3 »).",{"type":32,"tag":40,"props":650,"children":652},{"id":651},"robyn-avec-bigquery-architecture-du-pipeline",[653],{"type":37,"value":654},"Robyn avec BigQuery : architecture du pipeline",{"type":32,"tag":33,"props":656,"children":657},{},[658],{"type":37,"value":659},"Robyn s'exécute en environnement R, mais la source de données peut être BigQuery. Stack typique :",{"type":32,"tag":164,"props":661,"children":662},{},[663,673,683,701],{"type":32,"tag":96,"props":664,"children":665},{},[666,671],{"type":32,"tag":76,"props":667,"children":668},{},[669],{"type":37,"value":670},"Entrepôt de données BigQuery :",{"type":37,"value":672}," table des dépenses quotidiennes (spend_daily), table des conversions (conversions_daily), variables macro (jours fériés, météo, prix concurrent).",{"type":32,"tag":96,"props":674,"children":675},{},[676,681],{"type":32,"tag":76,"props":677,"children":678},{},[679],{"type":37,"value":680},"Transformation dbt :",{"type":37,"value":682}," jointure + agrégation. Conversion en lignes hebdomadaires, création de colonnes de dépense par canal.",{"type":32,"tag":96,"props":684,"children":685},{},[686,691,693,699],{"type":32,"tag":76,"props":687,"children":688},{},[689],{"type":37,"value":690},"Script R (Cloud Run ou Vertex AI) :",{"type":37,"value":692}," extraction depuis BigQuery via le paquet ",{"type":32,"tag":694,"props":695,"children":696},"em",{},[697],{"type":37,"value":698},"bigrquery",{"type":37,"value":700},", alimentation de Robyn, réécriture des résultats du modèle dans BigQuery.",{"type":32,"tag":96,"props":702,"children":703},{},[704,709],{"type":32,"tag":76,"props":705,"children":706},{},[707],{"type":37,"value":708},"Tableau de bord Looker Studio :",{"type":37,"value":710}," visualisation de la sortie du modèle — ROAS par canal, allocation budgétaire optimale, graphiques de saturation.",{"type":32,"tag":33,"props":712,"children":713},{},[714],{"type":32,"tag":76,"props":715,"children":716},{},[717],{"type":37,"value":718},"Exemple de modèle dbt (marketing_mix_weekly.sql) :",{"type":32,"tag":82,"props":720,"children":724},{"code":721,"language":722,"meta":16,"className":723,"style":16},"WITH spend_agg AS (\n  SELECT\n    DATE_TRUNC(spend_date, WEEK) AS week_start,\n    SUM(CASE WHEN channel = 'google_ads' THEN spend ELSE 0 END) AS google_ads_spend,\n    SUM(CASE WHEN channel = 'facebook_ads' THEN spend ELSE 0 END) AS facebook_ads_spend,\n    SUM(CASE WHEN channel = 'tiktok_ads' THEN spend ELSE 0 END) AS tiktok_ads_spend\n  FROM `project.dataset.spend_daily`\n  WHERE spend_date BETWEEN '2024-01-01' AND '2026-04-30'\n  GROUP BY 1\n),\nrevenue_agg AS (\n  SELECT\n    DATE_TRUNC(conversion_date, WEEK) AS week_start,\n    SUM(revenue) AS total_revenue\n  FROM `project.dataset.conversions_daily`\n  WHERE conversion_date BETWEEN '2024-01-01' AND '2026-04-30'\n  GROUP BY 1\n)\nSELECT\n  s.week_start,\n  s.google_ads_spend,\n  s.facebook_ads_spend,\n  s.tiktok_ads_spend,\n  r.total_revenue\nFROM spend_agg s\nLEFT JOIN revenue_agg r USING (week_start)\nORDER BY week_start\n","sql","language-sql shiki shiki-themes github-dark",[725],{"type":32,"tag":87,"props":726,"children":727},{"__ignoreMap":16},[728,753,761,788,866,931,996,1009,1042,1055,1063,1079,1086,1110,1131,1143,1171,1182,1189,1197,1221,1242,1263,1284,1302,1316,1340],{"type":32,"tag":226,"props":729,"children":730},{"class":228,"line":229},[731,737,743,748],{"type":32,"tag":226,"props":732,"children":734},{"style":733},"--shiki-default:#F97583",[735],{"type":37,"value":736},"WITH",{"type":32,"tag":226,"props":738,"children":740},{"style":739},"--shiki-default:#E1E4E8",[741],{"type":37,"value":742}," spend_agg ",{"type":32,"tag":226,"props":744,"children":745},{"style":733},[746],{"type":37,"value":747},"AS",{"type":32,"tag":226,"props":749,"children":750},{"style":739},[751],{"type":37,"value":752}," (\n",{"type":32,"tag":226,"props":754,"children":755},{"class":228,"line":238},[756],{"type":32,"tag":226,"props":757,"children":758},{"style":733},[759],{"type":37,"value":760},"  SELECT\n",{"type":32,"tag":226,"props":762,"children":763},{"class":228,"line":247},[764,769,774,779,783],{"type":32,"tag":226,"props":765,"children":766},{"style":739},[767],{"type":37,"value":768},"    DATE_TRUNC(spend_date, ",{"type":32,"tag":226,"props":770,"children":771},{"style":733},[772],{"type":37,"value":773},"WEEK",{"type":32,"tag":226,"props":775,"children":776},{"style":739},[777],{"type":37,"value":778},") ",{"type":32,"tag":226,"props":780,"children":781},{"style":733},[782],{"type":37,"value":747},{"type":32,"tag":226,"props":784,"children":785},{"style":739},[786],{"type":37,"value":787}," week_start,\n",{"type":32,"tag":226,"props":789,"children":790},{"class":228,"line":256},[791,797,802,807,812,817,822,828,833,838,843,848,853,857,861],{"type":32,"tag":226,"props":792,"children":794},{"style":793},"--shiki-default:#79B8FF",[795],{"type":37,"value":796},"    SUM",{"type":32,"tag":226,"props":798,"children":799},{"style":739},[800],{"type":37,"value":801},"(",{"type":32,"tag":226,"props":803,"children":804},{"style":733},[805],{"type":37,"value":806},"CASE",{"type":32,"tag":226,"props":808,"children":809},{"style":733},[810],{"type":37,"value":811}," WHEN",{"type":32,"tag":226,"props":813,"children":814},{"style":739},[815],{"type":37,"value":816}," channel ",{"type":32,"tag":226,"props":818,"children":819},{"style":733},[820],{"type":37,"value":821},"=",{"type":32,"tag":226,"props":823,"children":825},{"style":824},"--shiki-default:#9ECBFF",[826],{"type":37,"value":827}," 'google_ads'",{"type":32,"tag":226,"props":829,"children":830},{"style":733},[831],{"type":37,"value":832}," THEN",{"type":32,"tag":226,"props":834,"children":835},{"style":739},[836],{"type":37,"value":837}," spend ",{"type":32,"tag":226,"props":839,"children":840},{"style":733},[841],{"type":37,"value":842},"ELSE",{"type":32,"tag":226,"props":844,"children":845},{"style":793},[846],{"type":37,"value":847}," 0",{"type":32,"tag":226,"props":849,"children":850},{"style":733},[851],{"type":37,"value":852}," END",{"type":32,"tag":226,"props":854,"children":855},{"style":739},[856],{"type":37,"value":778},{"type":32,"tag":226,"props":858,"children":859},{"style":733},[860],{"type":37,"value":747},{"type":32,"tag":226,"props":862,"children":863},{"style":739},[864],{"type":37,"value":865}," google_ads_spend,\n",{"type":32,"tag":226,"props":867,"children":868},{"class":228,"line":265},[869,873,877,881,885,889,893,898,902,906,910,914,918,922,926],{"type":32,"tag":226,"props":870,"children":871},{"style":793},[872],{"type":37,"value":796},{"type":32,"tag":226,"props":874,"children":875},{"style":739},[876],{"type":37,"value":801},{"type":32,"tag":226,"props":878,"children":879},{"style":733},[880],{"type":37,"value":806},{"type":32,"tag":226,"props":882,"children":883},{"style":733},[884],{"type":37,"value":811},{"type":32,"tag":226,"props":886,"children":887},{"style":739},[888],{"type":37,"value":816},{"type":32,"tag":226,"props":890,"children":891},{"style":733},[892],{"type":37,"value":821},{"type":32,"tag":226,"props":894,"children":895},{"style":824},[896],{"type":37,"value":897}," 'facebook_ads'",{"type":32,"tag":226,"props":899,"children":900},{"style":733},[901],{"type":37,"value":832},{"type":32,"tag":226,"props":903,"children":904},{"style":739},[905],{"type":37,"value":837},{"type":32,"tag":226,"props":907,"children":908},{"style":733},[909],{"type":37,"value":842},{"type":32,"tag":226,"props":911,"children":912},{"style":793},[913],{"type":37,"value":847},{"type":32,"tag":226,"props":915,"children":916},{"style":733},[917],{"type":37,"value":852},{"type":32,"tag":226,"props":919,"children":920},{"style":739},[921],{"type":37,"value":778},{"type":32,"tag":226,"props":923,"children":924},{"style":733},[925],{"type":37,"value":747},{"type":32,"tag":226,"props":927,"children":928},{"style":739},[929],{"type":37,"value":930}," facebook_ads_spend,\n",{"type":32,"tag":226,"props":932,"children":933},{"class":228,"line":274},[934,938,942,946,950,954,958,963,967,971,975,979,983,987,991],{"type":32,"tag":226,"props":935,"children":936},{"style":793},[937],{"type":37,"value":796},{"type":32,"tag":226,"props":939,"children":940},{"style":739},[941],{"type":37,"value":801},{"type":32,"tag":226,"props":943,"children":944},{"style":733},[945],{"type":37,"value":806},{"type":32,"tag":226,"props":947,"children":948},{"style":733},[949],{"type":37,"value":811},{"type":32,"tag":226,"props":951,"children":952},{"style":739},[953],{"type":37,"value":816},{"type":32,"tag":226,"props":955,"children":956},{"style":733},[957],{"type":37,"value":821},{"type":32,"tag":226,"props":959,"children":960},{"style":824},[961],{"type":37,"value":962}," 'tiktok_ads'",{"type":32,"tag":226,"props":964,"children":965},{"style":733},[966],{"type":37,"value":832},{"type":32,"tag":226,"props":968,"children":969},{"style":739},[970],{"type":37,"value":837},{"type":32,"tag":226,"props":972,"children":973},{"style":733},[974],{"type":37,"value":842},{"type":32,"tag":226,"props":976,"children":977},{"style":793},[978],{"type":37,"value":847},{"type":32,"tag":226,"props":980,"children":981},{"style":733},[982],{"type":37,"value":852},{"type":32,"tag":226,"props":984,"children":985},{"style":739},[986],{"type":37,"value":778},{"type":32,"tag":226,"props":988,"children":989},{"style":733},[990],{"type":37,"value":747},{"type":32,"tag":226,"props":992,"children":993},{"style":739},[994],{"type":37,"value":995}," tiktok_ads_spend\n",{"type":32,"tag":226,"props":997,"children":998},{"class":228,"line":350},[999,1004],{"type":32,"tag":226,"props":1000,"children":1001},{"style":733},[1002],{"type":37,"value":1003},"  FROM",{"type":32,"tag":226,"props":1005,"children":1006},{"style":824},[1007],{"type":37,"value":1008}," `project.dataset.spend_daily`\n",{"type":32,"tag":226,"props":1010,"children":1011},{"class":228,"line":359},[1012,1017,1022,1027,1032,1037],{"type":32,"tag":226,"props":1013,"children":1014},{"style":733},[1015],{"type":37,"value":1016},"  WHERE",{"type":32,"tag":226,"props":1018,"children":1019},{"style":739},[1020],{"type":37,"value":1021}," spend_date ",{"type":32,"tag":226,"props":1023,"children":1024},{"style":733},[1025],{"type":37,"value":1026},"BETWEEN",{"type":32,"tag":226,"props":1028,"children":1029},{"style":824},[1030],{"type":37,"value":1031}," '2024-01-01'",{"type":32,"tag":226,"props":1033,"children":1034},{"style":733},[1035],{"type":37,"value":1036}," AND",{"type":32,"tag":226,"props":1038,"children":1039},{"style":824},[1040],{"type":37,"value":1041}," '2026-04-30'\n",{"type":32,"tag":226,"props":1043,"children":1044},{"class":228,"line":26},[1045,1050],{"type":32,"tag":226,"props":1046,"children":1047},{"style":733},[1048],{"type":37,"value":1049},"  GROUP BY",{"type":32,"tag":226,"props":1051,"children":1052},{"style":793},[1053],{"type":37,"value":1054}," 1\n",{"type":32,"tag":226,"props":1056,"children":1057},{"class":228,"line":377},[1058],{"type":32,"tag":226,"props":1059,"children":1060},{"style":739},[1061],{"type":37,"value":1062},"),\n",{"type":32,"tag":226,"props":1064,"children":1065},{"class":228,"line":386},[1066,1071,1075],{"type":32,"tag":226,"props":1067,"children":1068},{"style":739},[1069],{"type":37,"value":1070},"revenue_agg ",{"type":32,"tag":226,"props":1072,"children":1073},{"style":733},[1074],{"type":37,"value":747},{"type":32,"tag":226,"props":1076,"children":1077},{"style":739},[1078],{"type":37,"value":752},{"type":32,"tag":226,"props":1080,"children":1081},{"class":228,"line":395},[1082],{"type":32,"tag":226,"props":1083,"children":1084},{"style":733},[1085],{"type":37,"value":760},{"type":32,"tag":226,"props":1087,"children":1088},{"class":228,"line":404},[1089,1094,1098,1102,1106],{"type":32,"tag":226,"props":1090,"children":1091},{"style":739},[1092],{"type":37,"value":1093},"    DATE_TRUNC(conversion_date, ",{"type":32,"tag":226,"props":1095,"children":1096},{"style":733},[1097],{"type":37,"value":773},{"type":32,"tag":226,"props":1099,"children":1100},{"style":739},[1101],{"type":37,"value":778},{"type":32,"tag":226,"props":1103,"children":1104},{"style":733},[1105],{"type":37,"value":747},{"type":32,"tag":226,"props":1107,"children":1108},{"style":739},[1109],{"type":37,"value":787},{"type":32,"tag":226,"props":1111,"children":1112},{"class":228,"line":413},[1113,1117,1122,1126],{"type":32,"tag":226,"props":1114,"children":1115},{"style":793},[1116],{"type":37,"value":796},{"type":32,"tag":226,"props":1118,"children":1119},{"style":739},[1120],{"type":37,"value":1121},"(revenue) ",{"type":32,"tag":226,"props":1123,"children":1124},{"style":733},[1125],{"type":37,"value":747},{"type":32,"tag":226,"props":1127,"children":1128},{"style":739},[1129],{"type":37,"value":1130}," total_revenue\n",{"type":32,"tag":226,"props":1132,"children":1133},{"class":228,"line":422},[1134,1138],{"type":32,"tag":226,"props":1135,"children":1136},{"style":733},[1137],{"type":37,"value":1003},{"type":32,"tag":226,"props":1139,"children":1140},{"style":824},[1141],{"type":37,"value":1142}," `project.dataset.conversions_daily`\n",{"type":32,"tag":226,"props":1144,"children":1145},{"class":228,"line":585},[1146,1150,1155,1159,1163,1167],{"type":32,"tag":226,"props":1147,"children":1148},{"style":733},[1149],{"type":37,"value":1016},{"type":32,"tag":226,"props":1151,"children":1152},{"style":739},[1153],{"type":37,"value":1154}," conversion_date ",{"type":32,"tag":226,"props":1156,"children":1157},{"style":733},[1158],{"type":37,"value":1026},{"type":32,"tag":226,"props":1160,"children":1161},{"style":824},[1162],{"type":37,"value":1031},{"type":32,"tag":226,"props":1164,"children":1165},{"style":733},[1166],{"type":37,"value":1036},{"type":32,"tag":226,"props":1168,"children":1169},{"style":824},[1170],{"type":37,"value":1041},{"type":32,"tag":226,"props":1172,"children":1173},{"class":228,"line":594},[1174,1178],{"type":32,"tag":226,"props":1175,"children":1176},{"style":733},[1177],{"type":37,"value":1049},{"type":32,"tag":226,"props":1179,"children":1180},{"style":793},[1181],{"type":37,"value":1054},{"type":32,"tag":226,"props":1183,"children":1184},{"class":228,"line":603},[1185],{"type":32,"tag":226,"props":1186,"children":1187},{"style":739},[1188],{"type":37,"value":280},{"type":32,"tag":226,"props":1190,"children":1191},{"class":228,"line":612},[1192],{"type":32,"tag":226,"props":1193,"children":1194},{"style":733},[1195],{"type":37,"value":1196},"SELECT\n",{"type":32,"tag":226,"props":1198,"children":1200},{"class":228,"line":1199},20,[1201,1206,1211,1216],{"type":32,"tag":226,"props":1202,"children":1203},{"style":793},[1204],{"type":37,"value":1205},"  s",{"type":32,"tag":226,"props":1207,"children":1208},{"style":739},[1209],{"type":37,"value":1210},".",{"type":32,"tag":226,"props":1212,"children":1213},{"style":793},[1214],{"type":37,"value":1215},"week_start",{"type":32,"tag":226,"props":1217,"children":1218},{"style":739},[1219],{"type":37,"value":1220},",\n",{"type":32,"tag":226,"props":1222,"children":1224},{"class":228,"line":1223},21,[1225,1229,1233,1238],{"type":32,"tag":226,"props":1226,"children":1227},{"style":793},[1228],{"type":37,"value":1205},{"type":32,"tag":226,"props":1230,"children":1231},{"style":739},[1232],{"type":37,"value":1210},{"type":32,"tag":226,"props":1234,"children":1235},{"style":793},[1236],{"type":37,"value":1237},"google_ads_spend",{"type":32,"tag":226,"props":1239,"children":1240},{"style":739},[1241],{"type":37,"value":1220},{"type":32,"tag":226,"props":1243,"children":1245},{"class":228,"line":1244},22,[1246,1250,1254,1259],{"type":32,"tag":226,"props":1247,"children":1248},{"style":793},[1249],{"type":37,"value":1205},{"type":32,"tag":226,"props":1251,"children":1252},{"style":739},[1253],{"type":37,"value":1210},{"type":32,"tag":226,"props":1255,"children":1256},{"style":793},[1257],{"type":37,"value":1258},"facebook_ads_spend",{"type":32,"tag":226,"props":1260,"children":1261},{"style":739},[1262],{"type":37,"value":1220},{"type":32,"tag":226,"props":1264,"children":1266},{"class":228,"line":1265},23,[1267,1271,1275,1280],{"type":32,"tag":226,"props":1268,"children":1269},{"style":793},[1270],{"type":37,"value":1205},{"type":32,"tag":226,"props":1272,"children":1273},{"style":739},[1274],{"type":37,"value":1210},{"type":32,"tag":226,"props":1276,"children":1277},{"style":793},[1278],{"type":37,"value":1279},"tiktok_ads_spend",{"type":32,"tag":226,"props":1281,"children":1282},{"style":739},[1283],{"type":37,"value":1220},{"type":32,"tag":226,"props":1285,"children":1287},{"class":228,"line":1286},24,[1288,1293,1297],{"type":32,"tag":226,"props":1289,"children":1290},{"style":793},[1291],{"type":37,"value":1292},"  r",{"type":32,"tag":226,"props":1294,"children":1295},{"style":739},[1296],{"type":37,"value":1210},{"type":32,"tag":226,"props":1298,"children":1299},{"style":793},[1300],{"type":37,"value":1301},"total_revenue\n",{"type":32,"tag":226,"props":1303,"children":1305},{"class":228,"line":1304},25,[1306,1311],{"type":32,"tag":226,"props":1307,"children":1308},{"style":733},[1309],{"type":37,"value":1310},"FROM",{"type":32,"tag":226,"props":1312,"children":1313},{"style":739},[1314],{"type":37,"value":1315}," spend_agg s\n",{"type":32,"tag":226,"props":1317,"children":1319},{"class":228,"line":1318},26,[1320,1325,1330,1335],{"type":32,"tag":226,"props":1321,"children":1322},{"style":733},[1323],{"type":37,"value":1324},"LEFT JOIN",{"type":32,"tag":226,"props":1326,"children":1327},{"style":739},[1328],{"type":37,"value":1329}," revenue_agg r ",{"type":32,"tag":226,"props":1331,"children":1332},{"style":733},[1333],{"type":37,"value":1334},"USING",{"type":32,"tag":226,"props":1336,"children":1337},{"style":739},[1338],{"type":37,"value":1339}," (week_start)\n",{"type":32,"tag":226,"props":1341,"children":1343},{"class":228,"line":1342},27,[1344,1349],{"type":32,"tag":226,"props":1345,"children":1346},{"style":733},[1347],{"type":37,"value":1348},"ORDER BY",{"type":32,"tag":226,"props":1350,"children":1351},{"style":739},[1352],{"type":37,"value":1353}," week_start\n",{"type":32,"tag":33,"props":1355,"children":1356},{},[1357,1359,1365],{"type":37,"value":1358},"Cette table est matérialisée dans BigQuery, le script R de Robyn la télécharge via ",{"type":32,"tag":87,"props":1360,"children":1362},{"className":1361},[],[1363],{"type":37,"value":1364},"bigrquery::bq_table_download()",{"type":37,"value":1366},". La sortie du modèle (contribution de chaque canal chaque semaine) est réécrite dans BigQuery — vos outils BI la lisent de là.",{"type":32,"tag":40,"props":1368,"children":1370},{"id":1369},"budget-optimizer-allocation-pareto-optimale",[1371],{"type":37,"value":1372},"Budget Optimizer : allocation Pareto-optimale",{"type":32,"tag":33,"props":1374,"children":1375},{},[1376],{"type":37,"value":1377},"Après l'ajustement du modèle, Robyn exécute un second module : l'allocateur de budget. Entrées : budget total (par ex., 500 000 €\u002Fsemaine), contraintes de dépense par canal (par ex., Google Ads minimum 50 000 €). Sortie : allocation optimale pour maximiser le ROAS.",{"type":32,"tag":33,"props":1379,"children":1380},{},[1381],{"type":37,"value":1382},"Algorithme : il prend la dérivée de la courbe de saturation de chaque canal (ROAS marginal), puis réalloue le budget jusqu'à égaliser le ROAS marginal entre les canaux. C'est une optimisation Lagrangienne.",{"type":32,"tag":33,"props":1384,"children":1385},{},[1386],{"type":32,"tag":76,"props":1387,"children":1388},{},[1389],{"type":37,"value":1390},"Exemple de tableau de résultats :",{"type":32,"tag":1392,"props":1393,"children":1394},"table",{},[1395,1434],{"type":32,"tag":1396,"props":1397,"children":1398},"thead",{},[1399],{"type":32,"tag":1400,"props":1401,"children":1402},"tr",{},[1403,1409,1414,1419,1424,1429],{"type":32,"tag":1404,"props":1405,"children":1406},"th",{},[1407],{"type":37,"value":1408},"Canal",{"type":32,"tag":1404,"props":1410,"children":1411},{},[1412],{"type":37,"value":1413},"Dépense actuelle",{"type":32,"tag":1404,"props":1415,"children":1416},{},[1417],{"type":37,"value":1418},"Dépense optimale",{"type":32,"tag":1404,"props":1420,"children":1421},{},[1422],{"type":37,"value":1423},"Delta",{"type":32,"tag":1404,"props":1425,"children":1426},{},[1427],{"type":37,"value":1428},"ROAS actuel",{"type":32,"tag":1404,"props":1430,"children":1431},{},[1432],{"type":37,"value":1433},"ROAS optimal",{"type":32,"tag":1435,"props":1436,"children":1437},"tbody",{},[1438,1472,1504,1537],{"type":32,"tag":1400,"props":1439,"children":1440},{},[1441,1447,1452,1457,1462,1467],{"type":32,"tag":1442,"props":1443,"children":1444},"td",{},[1445],{"type":37,"value":1446},"Google Ads",{"type":32,"tag":1442,"props":1448,"children":1449},{},[1450],{"type":37,"value":1451},"200 000 €",{"type":32,"tag":1442,"props":1453,"children":1454},{},[1455],{"type":37,"value":1456},"180 000 €",{"type":32,"tag":1442,"props":1458,"children":1459},{},[1460],{"type":37,"value":1461},"−20 000 €",{"type":32,"tag":1442,"props":1463,"children":1464},{},[1465],{"type":37,"value":1466},"4,2",{"type":32,"tag":1442,"props":1468,"children":1469},{},[1470],{"type":37,"value":1471},"4,5",{"type":32,"tag":1400,"props":1473,"children":1474},{},[1475,1480,1485,1489,1494,1499],{"type":32,"tag":1442,"props":1476,"children":1477},{},[1478],{"type":37,"value":1479},"Facebook Ads",{"type":32,"tag":1442,"props":1481,"children":1482},{},[1483],{"type":37,"value":1484},"150 000 €",{"type":32,"tag":1442,"props":1486,"children":1487},{},[1488],{"type":37,"value":1451},{"type":32,"tag":1442,"props":1490,"children":1491},{},[1492],{"type":37,"value":1493},"+50 000 €",{"type":32,"tag":1442,"props":1495,"children":1496},{},[1497],{"type":37,"value":1498},"3,8",{"type":32,"tag":1442,"props":1500,"children":1501},{},[1502],{"type":37,"value":1503},"4,1",{"type":32,"tag":1400,"props":1505,"children":1506},{},[1507,1512,1517,1522,1527,1532],{"type":32,"tag":1442,"props":1508,"children":1509},{},[1510],{"type":37,"value":1511},"TikTok Ads",{"type":32,"tag":1442,"props":1513,"children":1514},{},[1515],{"type":37,"value":1516},"100 000 €",{"type":32,"tag":1442,"props":1518,"children":1519},{},[1520],{"type":37,"value":1521},"120 000 €",{"type":32,"tag":1442,"props":1523,"children":1524},{},[1525],{"type":37,"value":1526},"+20 000 €",{"type":32,"tag":1442,"props":1528,"children":1529},{},[1530],{"type":37,"value":1531},"3,5",{"type":32,"tag":1442,"props":1533,"children":1534},{},[1535],{"type":37,"value":1536},"3,9",{"type":32,"tag":1400,"props":1538,"children":1539},{},[1540,1545,1550,1555,1560,1565],{"type":32,"tag":1442,"props":1541,"children":1542},{},[1543],{"type":37,"value":1544},"Display",{"type":32,"tag":1442,"props":1546,"children":1547},{},[1548],{"type":37,"value":1549},"50 000 €",{"type":32,"tag":1442,"props":1551,"children":1552},{},[1553],{"type":37,"value":1554},"0 €",{"type":32,"tag":1442,"props":1556,"children":1557},{},[1558],{"type":37,"value":1559},"−50 000 €",{"type":32,"tag":1442,"props":1561,"children":1562},{},[1563],{"type":37,"value":1564},"1,2",{"type":32,"tag":1442,"props":1566,"children":1567},{},[1568],{"type":37,"value":1569},"—",{"type":32,"tag":33,"props":1571,"children":1572},{},[1573],{"type":37,"value":1574},"Interprétation : le canal Display génère un ROAS de 1,2 même très loin sous le point de saturation — il doit être supprimé. Google Ads est déjà au-delà du point de saturation ; réduire la dépense de 20 000 € booste le ROAS. Facebook Ads est encore sur la pente douce de la courbe, l'augmentation budgétaire est efficace.",{"type":32,"tag":33,"props":1576,"children":1577},{},[1578],{"type":37,"value":1579},"Ce tableau remis au CFO, la sortie Robyn visualisée dans Looker : la prise de décision devient data-driven. « Donnons 50 000 € de plus à Facebook ce mois » n'est plus une intuition, c'est un output du modèle.",{"type":32,"tag":1581,"props":1582,"children":1583},"hr",{},[],{"type":32,"tag":33,"props":1585,"children":1586},{},[1587,1589,1598],{"type":37,"value":1588},"Déployer Robyn requiert 2 ans de données hebdomadaires granulaires, un environnement R, une connexion BigQuery et 4–6 heures de tuning d'hyperparamètres. Une fois en production, le modèle se refresh mensuellement (4 semaines de nouvelles données, la fenêtre holdout glisse). Les courbes de saturation et paramètres d'adstock évoluent avec le temps — theta de Facebook baisse en périodes festives, alpha de Google Ads monte pendant le Black Friday. Robyn ne capture pas ces dynamiques automatiquement, mais un retrain plus fréquent les détecte. Si votre stack de données ",{"type":32,"tag":1590,"props":1591,"children":1595},"a",{"href":1592,"rel":1593},"https:\u002F\u002Fwww.roibase.com.tr\u002Ffr\u002Ffirstparty",[1594],"nofollow",[1596],{"type":37,"value":1597},"first-party",{"type":37,"value":1599}," repose sur des fondations BigQuery sol",{"type":32,"tag":1601,"props":1602,"children":1603},"style",{},[1604],{"type":37,"value":1605},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":16,"searchDepth":247,"depth":247,"links":1607},[1608,1609,1610,1613,1614,1615],{"id":42,"depth":238,"text":45},{"id":63,"depth":238,"text":66},{"id":149,"depth":238,"text":152,"children":1611},[1612],{"id":289,"depth":247,"text":292},{"id":436,"depth":238,"text":439},{"id":651,"depth":238,"text":654},{"id":1369,"depth":238,"text":1372},"markdown","content:fr:data:robyn-marketing-mix-modeling-praktik-kurulum.md","content","fr\u002Fdata\u002Frobyn-marketing-mix-modeling-praktik-kurulum.md","fr\u002Fdata\u002Frobyn-marketing-mix-modeling-praktik-kurulum","md",1778997832088]