[{"data":1,"prerenderedAt":1857},["ShallowReactive",2],{"article-alternates":3,"article-\u002Fru\u002Fdata\u002Fmarketing-mix-modeling-robyn-prakticheskaia-nastroika":13},{"i18nKey":4,"paths":5},"data-005-2026-07",{"de":6,"en":7,"es":8,"fr":9,"it":10,"ru":11,"tr":12},"\u002Fde\u002Fdata\u002Fmarketing-mix-modeling-robyn-praktische-einrichtung","\u002Fen\u002Fdata\u002Fmarketing-mix-modeling-robyn-practical-setup","\u002Fes\u002Fdata\u002Fmarketing-mix-modeling-robyn-configuracion-practica","\u002Ffr\u002Fdata\u002Fmodelisation-mix-marketing-configuration-pratique-robyn","\u002Fit\u002Fdata\u002Fmarketing-mix-modeling-robyn-kurulum","\u002Fru\u002Fdata\u002Fmarketing-mix-modeling-robyn-prakticheskaia-nastroika","\u002Ftr\u002Fdata\u002Fmarketing-mix-modeling-robyn-ile-pratik-kurulum",{"_path":11,"_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":1851,"_id":1852,"_source":1853,"_file":1854,"_stem":1855,"_extension":1856},"data",false,"","Marketing Mix Modeling: практическая настройка с Robyn","Настройка MMM с помощью фреймворка Robyn от Meta: кривые насыщения, затухание адстока, валидация holdout. Код на R и интеграция с BigQuery включены.","2026-07-24",[21,22,23,24,25],"marketing-mix-modeling","robyn","attribution","data-science","bigquery",8,"Roibase",{"type":29,"children":30,"toc":1842},"root",[31,39,46,51,56,61,67,72,186,191,528,533,546,587,600,606,626,767,776,803,808,816,827,934,942,967,972,980,985,991,996,1049,1054,1085,1093,1211,1221,1231,1245,1250,1256,1261,1266,1325,1337,1392,1409,1414,1420,1425,1439,1444,1532,1537,1727,1732,1801,1806,1820,1826,1836],{"type":32,"tag":33,"props":34,"children":35},"element","p",{},[36],{"type":37,"value":38},"text","Атрибуция ломается последние три года. iOS 14.5, Consent Mode v2, отказ от сторонних cookies — всё это оставляет маркетолога с одним вопросом: какой канал действительно работает? Marketing Mix Modeling (MMM) — это статистический ответ, который разрывает зависимость от cookies и пикселей, работая с агрегированными данными на уровне портфеля. Фреймворк Robyn от Meta превращает MMM из академического упражнения в production-ready pipeline. Эта статья даёт конкретные шаги для настройки Robyn с нуля, интерпретации кривых насыщения, калибровки параметров адстока и валидации модели через holdout-тестирование.",{"type":32,"tag":40,"props":41,"children":43},"h2",{"id":42},"что-такое-mmm-и-почему-это-критично-сейчас",[44],{"type":37,"value":45},"Что такое MMM и почему это критично сейчас",{"type":32,"tag":33,"props":47,"children":48},{},[49],{"type":37,"value":50},"Marketing Mix Modeling объясняет связь между расходами на медиа и продажами или конверсиями через регрессионную статистику. Он не требует данных на уровне пользователей — работает с агрегированными метриками: недельные или суточные расходы, показы, продажи. Модель рассчитывает маржинальный вклад каждого канала (incrementality) и показывает, когда канал входит в насыщение.",{"type":32,"tag":33,"props":52,"children":53},{},[54],{"type":37,"value":55},"Классическая last-click атрибуция основана на пиксельном отслеживании — весь кредит за конверсию получает последний нажатый канал. MMM наблюдает все каналы в одном временном окне и изолирует корреляцию. Например, если между ТВ-рекламой и продажами есть трёхнедельная задержка (carryover effect), модель захватывает её через параметр «адсток». Кривая насыщения показывает убывающую отдачу: первые 100.000 рублей расходов приносят 50 конверсий, а следующие 100.000 — только 20.",{"type":32,"tag":33,"props":57,"children":58},{},[59],{"type":37,"value":60},"Robyn — это R-пакет Meta, обученный на собственных данных кампаний. Он включает байесовскую гребневую регрессию, многоцелевой эволюционный алгоритм (MOEA) для настройки гиперпараметров и оптимизацию через Nevergrad. После подготовки данных 50 строк кода R производят модель.",{"type":32,"tag":40,"props":62,"children":64},{"id":63},"подготовка-данных-из-bigquery-в-robyn",[65],{"type":37,"value":66},"Подготовка данных: из BigQuery в Robyn",{"type":32,"tag":33,"props":68,"children":69},{},[70],{"type":37,"value":71},"Robyn ожидает на входе один CSV\u002Fdata.frame. Каждая строка — это временной период (неделя или день), каждый столбец — расходы канала, показы или продажи. Пропущенные данные не допускаются — если ячейка пуста, нужна imputation. Минимальная схема:",{"type":32,"tag":73,"props":74,"children":75},"table",{},[76,115],{"type":32,"tag":77,"props":78,"children":79},"thead",{},[80],{"type":32,"tag":81,"props":82,"children":83},"tr",{},[84,90,95,100,105,110],{"type":32,"tag":85,"props":86,"children":87},"th",{},[88],{"type":37,"value":89},"date",{"type":32,"tag":85,"props":91,"children":92},{},[93],{"type":37,"value":94},"tv_spend",{"type":32,"tag":85,"props":96,"children":97},{},[98],{"type":37,"value":99},"fb_spend",{"type":32,"tag":85,"props":101,"children":102},{},[103],{"type":37,"value":104},"google_spend",{"type":32,"tag":85,"props":106,"children":107},{},[108],{"type":37,"value":109},"revenue",{"type":32,"tag":85,"props":111,"children":112},{},[113],{"type":37,"value":114},"control_var",{"type":32,"tag":116,"props":117,"children":118},"tbody",{},[119,153],{"type":32,"tag":81,"props":120,"children":121},{},[122,128,133,138,143,148],{"type":32,"tag":123,"props":124,"children":125},"td",{},[126],{"type":37,"value":127},"2024-01-01",{"type":32,"tag":123,"props":129,"children":130},{},[131],{"type":37,"value":132},"50000",{"type":32,"tag":123,"props":134,"children":135},{},[136],{"type":37,"value":137},"12000",{"type":32,"tag":123,"props":139,"children":140},{},[141],{"type":37,"value":142},"8000",{"type":32,"tag":123,"props":144,"children":145},{},[146],{"type":37,"value":147},"120000",{"type":32,"tag":123,"props":149,"children":150},{},[151],{"type":37,"value":152},"0.8",{"type":32,"tag":81,"props":154,"children":155},{},[156,161,166,171,176,181],{"type":32,"tag":123,"props":157,"children":158},{},[159],{"type":37,"value":160},"2024-01-08",{"type":32,"tag":123,"props":162,"children":163},{},[164],{"type":37,"value":165},"55000",{"type":32,"tag":123,"props":167,"children":168},{},[169],{"type":37,"value":170},"13000",{"type":32,"tag":123,"props":172,"children":173},{},[174],{"type":37,"value":175},"9000",{"type":32,"tag":123,"props":177,"children":178},{},[179],{"type":37,"value":180},"135000",{"type":32,"tag":123,"props":182,"children":183},{},[184],{"type":37,"value":185},"0.9",{"type":32,"tag":33,"props":187,"children":188},{},[189],{"type":37,"value":190},"Запрос для извлечения данных из BigQuery с еженедельной агрегацией:",{"type":32,"tag":192,"props":193,"children":197},"pre",{"code":194,"language":195,"meta":16,"className":196,"style":16},"SELECT\n  DATE_TRUNC(event_date, WEEK) AS date,\n  SUM(IF(channel = 'tv', spend, 0)) AS tv_spend,\n  SUM(IF(channel = 'facebook', spend, 0)) AS fb_spend,\n  SUM(IF(channel = 'google', spend, 0)) AS google_spend,\n  SUM(revenue) AS revenue,\n  AVG(seasonality_index) AS control_var\nFROM `project.dataset.marketing_events`\nWHERE event_date BETWEEN '2022-01-01' AND '2024-12-31'\nGROUP BY 1\nORDER BY 1\n","sql","language-sql shiki shiki-themes github-dark",[198],{"type":32,"tag":199,"props":200,"children":201},"code",{"__ignoreMap":16},[202,214,249,309,359,409,431,454,467,501,515],{"type":32,"tag":203,"props":204,"children":207},"span",{"class":205,"line":206},"line",1,[208],{"type":32,"tag":203,"props":209,"children":211},{"style":210},"--shiki-default:#F97583",[212],{"type":37,"value":213},"SELECT\n",{"type":32,"tag":203,"props":215,"children":217},{"class":205,"line":216},2,[218,224,229,234,239,244],{"type":32,"tag":203,"props":219,"children":221},{"style":220},"--shiki-default:#E1E4E8",[222],{"type":37,"value":223},"  DATE_TRUNC(event_date, ",{"type":32,"tag":203,"props":225,"children":226},{"style":210},[227],{"type":37,"value":228},"WEEK",{"type":32,"tag":203,"props":230,"children":231},{"style":220},[232],{"type":37,"value":233},") ",{"type":32,"tag":203,"props":235,"children":236},{"style":210},[237],{"type":37,"value":238},"AS",{"type":32,"tag":203,"props":240,"children":241},{"style":210},[242],{"type":37,"value":243}," date",{"type":32,"tag":203,"props":245,"children":246},{"style":220},[247],{"type":37,"value":248},",\n",{"type":32,"tag":203,"props":250,"children":252},{"class":205,"line":251},3,[253,259,264,269,274,279,285,290,295,300,304],{"type":32,"tag":203,"props":254,"children":256},{"style":255},"--shiki-default:#79B8FF",[257],{"type":37,"value":258},"  SUM",{"type":32,"tag":203,"props":260,"children":261},{"style":220},[262],{"type":37,"value":263},"(",{"type":32,"tag":203,"props":265,"children":266},{"style":210},[267],{"type":37,"value":268},"IF",{"type":32,"tag":203,"props":270,"children":271},{"style":220},[272],{"type":37,"value":273},"(channel ",{"type":32,"tag":203,"props":275,"children":276},{"style":210},[277],{"type":37,"value":278},"=",{"type":32,"tag":203,"props":280,"children":282},{"style":281},"--shiki-default:#9ECBFF",[283],{"type":37,"value":284}," 'tv'",{"type":32,"tag":203,"props":286,"children":287},{"style":220},[288],{"type":37,"value":289},", spend, ",{"type":32,"tag":203,"props":291,"children":292},{"style":255},[293],{"type":37,"value":294},"0",{"type":32,"tag":203,"props":296,"children":297},{"style":220},[298],{"type":37,"value":299},")) ",{"type":32,"tag":203,"props":301,"children":302},{"style":210},[303],{"type":37,"value":238},{"type":32,"tag":203,"props":305,"children":306},{"style":220},[307],{"type":37,"value":308}," tv_spend,\n",{"type":32,"tag":203,"props":310,"children":312},{"class":205,"line":311},4,[313,317,321,325,329,333,338,342,346,350,354],{"type":32,"tag":203,"props":314,"children":315},{"style":255},[316],{"type":37,"value":258},{"type":32,"tag":203,"props":318,"children":319},{"style":220},[320],{"type":37,"value":263},{"type":32,"tag":203,"props":322,"children":323},{"style":210},[324],{"type":37,"value":268},{"type":32,"tag":203,"props":326,"children":327},{"style":220},[328],{"type":37,"value":273},{"type":32,"tag":203,"props":330,"children":331},{"style":210},[332],{"type":37,"value":278},{"type":32,"tag":203,"props":334,"children":335},{"style":281},[336],{"type":37,"value":337}," 'facebook'",{"type":32,"tag":203,"props":339,"children":340},{"style":220},[341],{"type":37,"value":289},{"type":32,"tag":203,"props":343,"children":344},{"style":255},[345],{"type":37,"value":294},{"type":32,"tag":203,"props":347,"children":348},{"style":220},[349],{"type":37,"value":299},{"type":32,"tag":203,"props":351,"children":352},{"style":210},[353],{"type":37,"value":238},{"type":32,"tag":203,"props":355,"children":356},{"style":220},[357],{"type":37,"value":358}," fb_spend,\n",{"type":32,"tag":203,"props":360,"children":362},{"class":205,"line":361},5,[363,367,371,375,379,383,388,392,396,400,404],{"type":32,"tag":203,"props":364,"children":365},{"style":255},[366],{"type":37,"value":258},{"type":32,"tag":203,"props":368,"children":369},{"style":220},[370],{"type":37,"value":263},{"type":32,"tag":203,"props":372,"children":373},{"style":210},[374],{"type":37,"value":268},{"type":32,"tag":203,"props":376,"children":377},{"style":220},[378],{"type":37,"value":273},{"type":32,"tag":203,"props":380,"children":381},{"style":210},[382],{"type":37,"value":278},{"type":32,"tag":203,"props":384,"children":385},{"style":281},[386],{"type":37,"value":387}," 'google'",{"type":32,"tag":203,"props":389,"children":390},{"style":220},[391],{"type":37,"value":289},{"type":32,"tag":203,"props":393,"children":394},{"style":255},[395],{"type":37,"value":294},{"type":32,"tag":203,"props":397,"children":398},{"style":220},[399],{"type":37,"value":299},{"type":32,"tag":203,"props":401,"children":402},{"style":210},[403],{"type":37,"value":238},{"type":32,"tag":203,"props":405,"children":406},{"style":220},[407],{"type":37,"value":408}," google_spend,\n",{"type":32,"tag":203,"props":410,"children":412},{"class":205,"line":411},6,[413,417,422,426],{"type":32,"tag":203,"props":414,"children":415},{"style":255},[416],{"type":37,"value":258},{"type":32,"tag":203,"props":418,"children":419},{"style":220},[420],{"type":37,"value":421},"(revenue) ",{"type":32,"tag":203,"props":423,"children":424},{"style":210},[425],{"type":37,"value":238},{"type":32,"tag":203,"props":427,"children":428},{"style":220},[429],{"type":37,"value":430}," revenue,\n",{"type":32,"tag":203,"props":432,"children":434},{"class":205,"line":433},7,[435,440,445,449],{"type":32,"tag":203,"props":436,"children":437},{"style":255},[438],{"type":37,"value":439},"  AVG",{"type":32,"tag":203,"props":441,"children":442},{"style":220},[443],{"type":37,"value":444},"(seasonality_index) ",{"type":32,"tag":203,"props":446,"children":447},{"style":210},[448],{"type":37,"value":238},{"type":32,"tag":203,"props":450,"children":451},{"style":220},[452],{"type":37,"value":453}," control_var\n",{"type":32,"tag":203,"props":455,"children":456},{"class":205,"line":26},[457,462],{"type":32,"tag":203,"props":458,"children":459},{"style":210},[460],{"type":37,"value":461},"FROM",{"type":32,"tag":203,"props":463,"children":464},{"style":281},[465],{"type":37,"value":466}," `project.dataset.marketing_events`\n",{"type":32,"tag":203,"props":468,"children":470},{"class":205,"line":469},9,[471,476,481,486,491,496],{"type":32,"tag":203,"props":472,"children":473},{"style":210},[474],{"type":37,"value":475},"WHERE",{"type":32,"tag":203,"props":477,"children":478},{"style":220},[479],{"type":37,"value":480}," event_date ",{"type":32,"tag":203,"props":482,"children":483},{"style":210},[484],{"type":37,"value":485},"BETWEEN",{"type":32,"tag":203,"props":487,"children":488},{"style":281},[489],{"type":37,"value":490}," '2022-01-01'",{"type":32,"tag":203,"props":492,"children":493},{"style":210},[494],{"type":37,"value":495}," AND",{"type":32,"tag":203,"props":497,"children":498},{"style":281},[499],{"type":37,"value":500}," '2024-12-31'\n",{"type":32,"tag":203,"props":502,"children":504},{"class":205,"line":503},10,[505,510],{"type":32,"tag":203,"props":506,"children":507},{"style":210},[508],{"type":37,"value":509},"GROUP BY",{"type":32,"tag":203,"props":511,"children":512},{"style":255},[513],{"type":37,"value":514}," 1\n",{"type":32,"tag":203,"props":516,"children":518},{"class":205,"line":517},11,[519,524],{"type":32,"tag":203,"props":520,"children":521},{"style":210},[522],{"type":37,"value":523},"ORDER BY",{"type":32,"tag":203,"props":525,"children":526},{"style":255},[527],{"type":37,"value":514},{"type":32,"tag":33,"props":529,"children":530},{},[531],{"type":37,"value":532},"Контрольная переменная (тренд, сезонность, макроэкономический индекс) не обязательна, но повышает объяснительную силу модели. Например, в розничной торговле январь — месяц скидок, поэтому добавьте dummy-переменную. Robyn включает эти переменные как «органическую» базовую линию в регрессию.",{"type":32,"tag":33,"props":534,"children":535},{},[536,538,544],{"type":37,"value":537},"Для загрузки данных в R используйте пакет ",{"type":32,"tag":199,"props":539,"children":541},{"className":540},[],[542],{"type":37,"value":543},"bigrquery",{"type":37,"value":545},":",{"type":32,"tag":192,"props":547,"children":551},{"code":548,"language":549,"meta":16,"className":550,"style":16},"library(bigrquery)\nbq_auth(path = \"service-account-key.json\")\nsql \u003C- \"SELECT date, tv_spend, fb_spend, google_spend, revenue FROM ...\"\ndf \u003C- bq_project_query(\"your-project-id\", sql) %>% bq_table_download()\n","r","language-r shiki shiki-themes github-dark",[552],{"type":32,"tag":199,"props":553,"children":554},{"__ignoreMap":16},[555,563,571,579],{"type":32,"tag":203,"props":556,"children":557},{"class":205,"line":206},[558],{"type":32,"tag":203,"props":559,"children":560},{},[561],{"type":37,"value":562},"library(bigrquery)\n",{"type":32,"tag":203,"props":564,"children":565},{"class":205,"line":216},[566],{"type":32,"tag":203,"props":567,"children":568},{},[569],{"type":37,"value":570},"bq_auth(path = \"service-account-key.json\")\n",{"type":32,"tag":203,"props":572,"children":573},{"class":205,"line":251},[574],{"type":32,"tag":203,"props":575,"children":576},{},[577],{"type":37,"value":578},"sql \u003C- \"SELECT date, tv_spend, fb_spend, google_spend, revenue FROM ...\"\n",{"type":32,"tag":203,"props":580,"children":581},{"class":205,"line":311},[582],{"type":32,"tag":203,"props":583,"children":584},{},[585],{"type":37,"value":586},"df \u003C- bq_project_query(\"your-project-id\", sql) %>% bq_table_download()\n",{"type":32,"tag":33,"props":588,"children":589},{},[590,592,598],{"type":37,"value":591},"Функция ",{"type":32,"tag":199,"props":593,"children":595},{"className":594},[],[596],{"type":37,"value":597},"robyn_inputs()",{"type":37,"value":599}," валидирует схему для совместимости с Robyn. Столбец даты должен быть класса Date, метрики — numeric.",{"type":32,"tag":40,"props":601,"children":603},{"id":602},"конфигурация-модели-robyn-адсток-и-насыщение",[604],{"type":37,"value":605},"Конфигурация модели Robyn: адсток и насыщение",{"type":32,"tag":33,"props":607,"children":608},{},[609,611,616,618,624],{"type":37,"value":610},"Ядро Robyn — функции ",{"type":32,"tag":199,"props":612,"children":614},{"className":613},[],[615],{"type":37,"value":597},{"type":37,"value":617}," и ",{"type":32,"tag":199,"props":619,"children":621},{"className":620},[],[622],{"type":37,"value":623},"robyn_run()",{"type":37,"value":625},". Первый шаг — определить входные параметры модели:",{"type":32,"tag":192,"props":627,"children":629},{"code":628,"language":549,"meta":16,"className":550,"style":16},"library(Robyn)\n\nInputCollect \u003C- robyn_inputs(\n  dt_input = df,\n  date_var = \"date\",\n  dep_var = \"revenue\",\n  dep_var_type = \"revenue\",\n  prophet_vars = c(\"trend\", \"season\", \"holiday\"),\n  prophet_country = \"RU\",\n  paid_media_spends = c(\"tv_spend\", \"fb_spend\", \"google_spend\"),\n  paid_media_vars = c(\"tv_spend\", \"fb_spend\", \"google_spend\"),\n  context_vars = c(\"control_var\"),\n  adstock = \"geometric\",\n  window_start = \"2022-01-01\",\n  window_end = \"2024-10-31\"\n)\n",[630],{"type":32,"tag":199,"props":631,"children":632},{"__ignoreMap":16},[633,641,650,658,666,674,682,690,698,706,714,722,731,740,749,758],{"type":32,"tag":203,"props":634,"children":635},{"class":205,"line":206},[636],{"type":32,"tag":203,"props":637,"children":638},{},[639],{"type":37,"value":640},"library(Robyn)\n",{"type":32,"tag":203,"props":642,"children":643},{"class":205,"line":216},[644],{"type":32,"tag":203,"props":645,"children":647},{"emptyLinePlaceholder":646},true,[648],{"type":37,"value":649},"\n",{"type":32,"tag":203,"props":651,"children":652},{"class":205,"line":251},[653],{"type":32,"tag":203,"props":654,"children":655},{},[656],{"type":37,"value":657},"InputCollect \u003C- robyn_inputs(\n",{"type":32,"tag":203,"props":659,"children":660},{"class":205,"line":311},[661],{"type":32,"tag":203,"props":662,"children":663},{},[664],{"type":37,"value":665},"  dt_input = df,\n",{"type":32,"tag":203,"props":667,"children":668},{"class":205,"line":361},[669],{"type":32,"tag":203,"props":670,"children":671},{},[672],{"type":37,"value":673},"  date_var = \"date\",\n",{"type":32,"tag":203,"props":675,"children":676},{"class":205,"line":411},[677],{"type":32,"tag":203,"props":678,"children":679},{},[680],{"type":37,"value":681},"  dep_var = \"revenue\",\n",{"type":32,"tag":203,"props":683,"children":684},{"class":205,"line":433},[685],{"type":32,"tag":203,"props":686,"children":687},{},[688],{"type":37,"value":689},"  dep_var_type = \"revenue\",\n",{"type":32,"tag":203,"props":691,"children":692},{"class":205,"line":26},[693],{"type":32,"tag":203,"props":694,"children":695},{},[696],{"type":37,"value":697},"  prophet_vars = c(\"trend\", \"season\", \"holiday\"),\n",{"type":32,"tag":203,"props":699,"children":700},{"class":205,"line":469},[701],{"type":32,"tag":203,"props":702,"children":703},{},[704],{"type":37,"value":705},"  prophet_country = \"RU\",\n",{"type":32,"tag":203,"props":707,"children":708},{"class":205,"line":503},[709],{"type":32,"tag":203,"props":710,"children":711},{},[712],{"type":37,"value":713},"  paid_media_spends = c(\"tv_spend\", \"fb_spend\", \"google_spend\"),\n",{"type":32,"tag":203,"props":715,"children":716},{"class":205,"line":517},[717],{"type":32,"tag":203,"props":718,"children":719},{},[720],{"type":37,"value":721},"  paid_media_vars = c(\"tv_spend\", \"fb_spend\", \"google_spend\"),\n",{"type":32,"tag":203,"props":723,"children":725},{"class":205,"line":724},12,[726],{"type":32,"tag":203,"props":727,"children":728},{},[729],{"type":37,"value":730},"  context_vars = c(\"control_var\"),\n",{"type":32,"tag":203,"props":732,"children":734},{"class":205,"line":733},13,[735],{"type":32,"tag":203,"props":736,"children":737},{},[738],{"type":37,"value":739},"  adstock = \"geometric\",\n",{"type":32,"tag":203,"props":741,"children":743},{"class":205,"line":742},14,[744],{"type":32,"tag":203,"props":745,"children":746},{},[747],{"type":37,"value":748},"  window_start = \"2022-01-01\",\n",{"type":32,"tag":203,"props":750,"children":752},{"class":205,"line":751},15,[753],{"type":32,"tag":203,"props":754,"children":755},{},[756],{"type":37,"value":757},"  window_end = \"2024-10-31\"\n",{"type":32,"tag":203,"props":759,"children":761},{"class":205,"line":760},16,[762],{"type":32,"tag":203,"props":763,"children":764},{},[765],{"type":37,"value":766},")\n",{"type":32,"tag":33,"props":768,"children":769},{},[770],{"type":32,"tag":771,"props":772,"children":773},"strong",{},[774],{"type":37,"value":775},"Выбор типа адстока:",{"type":32,"tag":777,"props":778,"children":779},"ul",{},[780,792],{"type":32,"tag":781,"props":782,"children":783},"li",{},[784,790],{"type":32,"tag":199,"props":785,"children":787},{"className":786},[],[788],{"type":37,"value":789},"geometric",{"type":37,"value":791},": Наиболее распространённый. Постоянная скорость затухания (например, каждую неделю остаётся 80%). Подходит для ТВ и display.",{"type":32,"tag":781,"props":793,"children":794},{},[795,801],{"type":32,"tag":199,"props":796,"children":798},{"className":797},[],[799],{"type":37,"value":800},"weibull",{"type":37,"value":802},": Асимметричное затухание — быстрое падение вначале, затем замедление. Логично для видео и кампаний инфлюэнсеров.",{"type":32,"tag":33,"props":804,"children":805},{},[806],{"type":37,"value":807},"Формула геометрического адстока:",{"type":32,"tag":192,"props":809,"children":811},{"code":810},"transformed_value[t] = spend[t] + theta * transformed_value[t-1]\n",[812],{"type":32,"tag":199,"props":813,"children":814},{"__ignoreMap":16},[815],{"type":37,"value":810},{"type":32,"tag":33,"props":817,"children":818},{},[819,825],{"type":32,"tag":199,"props":820,"children":822},{"className":821},[],[823],{"type":37,"value":824},"theta",{"type":37,"value":826}," — это скорость затухания (0-1). Robyn автоматически оптимизирует этот параметр, но вы можете установить диапазон вручную:",{"type":32,"tag":192,"props":828,"children":830},{"code":829,"language":549,"meta":16,"className":550,"style":16},"hyperparameters \u003C- list(\n  tv_spend_alphas = c(0.5, 3),       # коэффициент кривой насыщения\n  tv_spend_gammas = c(0.3, 1),       # точка перегиба насыщения\n  tv_spend_thetas = c(0, 0.5),       # скорость затухания адстока\n  fb_spend_alphas = c(0.5, 3),\n  fb_spend_gammas = c(0.3, 1),\n  fb_spend_thetas = c(0, 0.3)\n)\n\nInputCollect \u003C- robyn_inputs(\n  InputCollect = InputCollect,\n  hyperparameters = hyperparameters\n)\n",[831],{"type":32,"tag":199,"props":832,"children":833},{"__ignoreMap":16},[834,842,850,858,866,874,882,890,897,904,911,919,927],{"type":32,"tag":203,"props":835,"children":836},{"class":205,"line":206},[837],{"type":32,"tag":203,"props":838,"children":839},{},[840],{"type":37,"value":841},"hyperparameters \u003C- list(\n",{"type":32,"tag":203,"props":843,"children":844},{"class":205,"line":216},[845],{"type":32,"tag":203,"props":846,"children":847},{},[848],{"type":37,"value":849},"  tv_spend_alphas = c(0.5, 3),       # коэффициент кривой насыщения\n",{"type":32,"tag":203,"props":851,"children":852},{"class":205,"line":251},[853],{"type":32,"tag":203,"props":854,"children":855},{},[856],{"type":37,"value":857},"  tv_spend_gammas = c(0.3, 1),       # точка перегиба насыщения\n",{"type":32,"tag":203,"props":859,"children":860},{"class":205,"line":311},[861],{"type":32,"tag":203,"props":862,"children":863},{},[864],{"type":37,"value":865},"  tv_spend_thetas = c(0, 0.5),       # скорость затухания адстока\n",{"type":32,"tag":203,"props":867,"children":868},{"class":205,"line":361},[869],{"type":32,"tag":203,"props":870,"children":871},{},[872],{"type":37,"value":873},"  fb_spend_alphas = c(0.5, 3),\n",{"type":32,"tag":203,"props":875,"children":876},{"class":205,"line":411},[877],{"type":32,"tag":203,"props":878,"children":879},{},[880],{"type":37,"value":881},"  fb_spend_gammas = c(0.3, 1),\n",{"type":32,"tag":203,"props":883,"children":884},{"class":205,"line":433},[885],{"type":32,"tag":203,"props":886,"children":887},{},[888],{"type":37,"value":889},"  fb_spend_thetas = c(0, 0.3)\n",{"type":32,"tag":203,"props":891,"children":892},{"class":205,"line":26},[893],{"type":32,"tag":203,"props":894,"children":895},{},[896],{"type":37,"value":766},{"type":32,"tag":203,"props":898,"children":899},{"class":205,"line":469},[900],{"type":32,"tag":203,"props":901,"children":902},{"emptyLinePlaceholder":646},[903],{"type":37,"value":649},{"type":32,"tag":203,"props":905,"children":906},{"class":205,"line":503},[907],{"type":32,"tag":203,"props":908,"children":909},{},[910],{"type":37,"value":657},{"type":32,"tag":203,"props":912,"children":913},{"class":205,"line":517},[914],{"type":32,"tag":203,"props":915,"children":916},{},[917],{"type":37,"value":918},"  InputCollect = InputCollect,\n",{"type":32,"tag":203,"props":920,"children":921},{"class":205,"line":724},[922],{"type":32,"tag":203,"props":923,"children":924},{},[925],{"type":37,"value":926},"  hyperparameters = hyperparameters\n",{"type":32,"tag":203,"props":928,"children":929},{"class":205,"line":733},[930],{"type":32,"tag":203,"props":931,"children":932},{},[933],{"type":37,"value":766},{"type":32,"tag":33,"props":935,"children":936},{},[937],{"type":32,"tag":771,"props":938,"children":939},{},[940],{"type":37,"value":941},"Параметры насыщения:",{"type":32,"tag":777,"props":943,"children":944},{},[945,956],{"type":32,"tag":781,"props":946,"children":947},{},[948,954],{"type":32,"tag":199,"props":949,"children":951},{"className":950},[],[952],{"type":37,"value":953},"alpha",{"type":37,"value":955},": форма кривой. Высокий alpha → позднее насыщение.",{"type":32,"tag":781,"props":957,"children":958},{},[959,965],{"type":32,"tag":199,"props":960,"children":962},{"className":961},[],[963],{"type":37,"value":964},"gamma",{"type":37,"value":966},": точка перегиба — 0.5 означает излом в середине.",{"type":32,"tag":33,"props":968,"children":969},{},[970],{"type":37,"value":971},"Насыщение моделируется через уравнение Хилла:",{"type":32,"tag":192,"props":973,"children":975},{"code":974},"response = spend^alpha \u002F (gamma^alpha + spend^alpha)\n",[976],{"type":32,"tag":199,"props":977,"children":978},{"__ignoreMap":16},[979],{"type":37,"value":974},{"type":32,"tag":33,"props":981,"children":982},{},[983],{"type":37,"value":984},"Robyn оптимизирует эти параметры через эволюционный алгоритм. Он создаёт 2000 моделей и выбирает лучшие на основе Pareto frontier (баланс между R² и NRMSE).",{"type":32,"tag":40,"props":986,"children":988},{"id":987},"запуск-модели-и-интерпретация-результатов",[989],{"type":37,"value":990},"Запуск модели и интерпретация результатов",{"type":32,"tag":33,"props":992,"children":993},{},[994],{"type":37,"value":995},"Запуск модели Robyn:",{"type":32,"tag":192,"props":997,"children":999},{"code":998,"language":549,"meta":16,"className":550,"style":16},"OutputModels \u003C- robyn_run(\n  InputCollect = InputCollect,\n  iterations = 2000,\n  trials = 5,\n  cores = 8\n)\n",[1000],{"type":32,"tag":199,"props":1001,"children":1002},{"__ignoreMap":16},[1003,1011,1018,1026,1034,1042],{"type":32,"tag":203,"props":1004,"children":1005},{"class":205,"line":206},[1006],{"type":32,"tag":203,"props":1007,"children":1008},{},[1009],{"type":37,"value":1010},"OutputModels \u003C- robyn_run(\n",{"type":32,"tag":203,"props":1012,"children":1013},{"class":205,"line":216},[1014],{"type":32,"tag":203,"props":1015,"children":1016},{},[1017],{"type":37,"value":918},{"type":32,"tag":203,"props":1019,"children":1020},{"class":205,"line":251},[1021],{"type":32,"tag":203,"props":1022,"children":1023},{},[1024],{"type":37,"value":1025},"  iterations = 2000,\n",{"type":32,"tag":203,"props":1027,"children":1028},{"class":205,"line":311},[1029],{"type":32,"tag":203,"props":1030,"children":1031},{},[1032],{"type":37,"value":1033},"  trials = 5,\n",{"type":32,"tag":203,"props":1035,"children":1036},{"class":205,"line":361},[1037],{"type":32,"tag":203,"props":1038,"children":1039},{},[1040],{"type":37,"value":1041},"  cores = 8\n",{"type":32,"tag":203,"props":1043,"children":1044},{"class":205,"line":411},[1045],{"type":32,"tag":203,"props":1046,"children":1047},{},[1048],{"type":37,"value":766},{"type":32,"tag":33,"props":1050,"children":1051},{},[1052],{"type":37,"value":1053},"Выход — список, где каждая итерация представляет разный набор гиперпараметров. Robyn автоматически выбирает 3 лучшие модели (Pareto-оптимальные). Результаты:",{"type":32,"tag":192,"props":1055,"children":1057},{"code":1056,"language":549,"meta":16,"className":550,"style":16},"OutputModels$resultHypParam    # параметры для всех моделей\nOutputModels$xDecompAgg        # декомпозиция по каналам\nOutputModels$resultCalibration # оценка валидации holdout\n",[1058],{"type":32,"tag":199,"props":1059,"children":1060},{"__ignoreMap":16},[1061,1069,1077],{"type":32,"tag":203,"props":1062,"children":1063},{"class":205,"line":206},[1064],{"type":32,"tag":203,"props":1065,"children":1066},{},[1067],{"type":37,"value":1068},"OutputModels$resultHypParam    # параметры для всех моделей\n",{"type":32,"tag":203,"props":1070,"children":1071},{"class":205,"line":216},[1072],{"type":32,"tag":203,"props":1073,"children":1074},{},[1075],{"type":37,"value":1076},"OutputModels$xDecompAgg        # декомпозиция по каналам\n",{"type":32,"tag":203,"props":1078,"children":1079},{"class":205,"line":251},[1080],{"type":32,"tag":203,"props":1081,"children":1082},{},[1083],{"type":37,"value":1084},"OutputModels$resultCalibration # оценка валидации holdout\n",{"type":32,"tag":33,"props":1086,"children":1087},{},[1088],{"type":32,"tag":771,"props":1089,"children":1090},{},[1091],{"type":37,"value":1092},"Пример таблицы декомпозиции:",{"type":32,"tag":73,"props":1094,"children":1095},{},[1096,1127],{"type":32,"tag":77,"props":1097,"children":1098},{},[1099],{"type":32,"tag":81,"props":1100,"children":1101},{},[1102,1107,1112,1117,1122],{"type":32,"tag":85,"props":1103,"children":1104},{},[1105],{"type":37,"value":1106},"channel",{"type":32,"tag":85,"props":1108,"children":1109},{},[1110],{"type":37,"value":1111},"total_spend",{"type":32,"tag":85,"props":1113,"children":1114},{},[1115],{"type":37,"value":1116},"total_response",{"type":32,"tag":85,"props":1118,"children":1119},{},[1120],{"type":37,"value":1121},"roi",{"type":32,"tag":85,"props":1123,"children":1124},{},[1125],{"type":37,"value":1126},"mean_response",{"type":32,"tag":116,"props":1128,"children":1129},{},[1130,1157,1184],{"type":32,"tag":81,"props":1131,"children":1132},{},[1133,1137,1142,1147,1152],{"type":32,"tag":123,"props":1134,"children":1135},{},[1136],{"type":37,"value":94},{"type":32,"tag":123,"props":1138,"children":1139},{},[1140],{"type":37,"value":1141},"2400000",{"type":32,"tag":123,"props":1143,"children":1144},{},[1145],{"type":37,"value":1146},"1800000",{"type":32,"tag":123,"props":1148,"children":1149},{},[1150],{"type":37,"value":1151},"0.75",{"type":32,"tag":123,"props":1153,"children":1154},{},[1155],{"type":37,"value":1156},"15000",{"type":32,"tag":81,"props":1158,"children":1159},{},[1160,1164,1169,1174,1179],{"type":32,"tag":123,"props":1161,"children":1162},{},[1163],{"type":37,"value":99},{"type":32,"tag":123,"props":1165,"children":1166},{},[1167],{"type":37,"value":1168},"600000",{"type":32,"tag":123,"props":1170,"children":1171},{},[1172],{"type":37,"value":1173},"720000",{"type":32,"tag":123,"props":1175,"children":1176},{},[1177],{"type":37,"value":1178},"1.20",{"type":32,"tag":123,"props":1180,"children":1181},{},[1182],{"type":37,"value":1183},"6000",{"type":32,"tag":81,"props":1185,"children":1186},{},[1187,1191,1196,1201,1206],{"type":32,"tag":123,"props":1188,"children":1189},{},[1190],{"type":37,"value":104},{"type":32,"tag":123,"props":1192,"children":1193},{},[1194],{"type":37,"value":1195},"400000",{"type":32,"tag":123,"props":1197,"children":1198},{},[1199],{"type":37,"value":1200},"560000",{"type":32,"tag":123,"props":1202,"children":1203},{},[1204],{"type":37,"value":1205},"1.40",{"type":32,"tag":123,"props":1207,"children":1208},{},[1209],{"type":37,"value":1210},"4667",{"type":32,"tag":33,"props":1212,"children":1213},{},[1214,1219],{"type":32,"tag":771,"props":1215,"children":1216},{},[1217],{"type":37,"value":1218},"Интерпретация ROI:",{"type":37,"value":1220}," Facebook 1.20 — каждый рубль расходов приносит 1.20 рублей дохода. ТВ 0.75 — это не отрицательный ROI, а 0.75 рублей инкрементального вклада сверх базовой линии. Robyn измеряет incrementality, а не last-click кредит.",{"type":32,"tag":33,"props":1222,"children":1223},{},[1224,1229],{"type":32,"tag":771,"props":1225,"children":1226},{},[1227],{"type":37,"value":1228},"Обнаружение насыщения:",{"type":37,"value":1230}," Robyn строит график кривой насыщения:",{"type":32,"tag":192,"props":1232,"children":1234},{"code":1233,"language":549,"meta":16,"className":550,"style":16},"robyn_onepagers(InputCollect, OutputModels, select_model = \"2_100_3\")\n",[1235],{"type":32,"tag":199,"props":1236,"children":1237},{"__ignoreMap":16},[1238],{"type":32,"tag":203,"props":1239,"children":1240},{"class":205,"line":206},[1241],{"type":32,"tag":203,"props":1242,"children":1243},{},[1244],{"type":37,"value":1233},{"type":32,"tag":33,"props":1246,"children":1247},{},[1248],{"type":37,"value":1249},"На графике видна точка, где кривая начинает выравниваться. Например, если расходы ТВ превышают 80.000 рублей, маржинальный доход падает на 50% — это критический сигнал для оптимизации бюджета.",{"type":32,"tag":40,"props":1251,"children":1253},{"id":1252},"валидация-holdout-и-надёжность-модели",[1254],{"type":37,"value":1255},"Валидация holdout и надёжность модели",{"type":32,"tag":33,"props":1257,"children":1258},{},[1259],{"type":37,"value":1260},"Чтобы использовать MMM-модель в production, разделите исторические данные: training set (например, январь 2022 — октябрь 2024) + holdout set (ноябрь-декабрь 2024). Модель обучается на training set и тестируется на holdout. Если MAPE (средняя абсолютная ошибка в процентах) ниже 10%, модель надёжна.",{"type":32,"tag":33,"props":1262,"children":1263},{},[1264],{"type":37,"value":1265},"Robyn автоматически выполняет валидацию holdout:",{"type":32,"tag":192,"props":1267,"children":1269},{"code":1268,"language":549,"meta":16,"className":550,"style":16},"InputCollect \u003C- robyn_inputs(\n  InputCollect = InputCollect,\n  window_start = \"2022-01-01\",\n  window_end = \"2024-10-31\",\n  rollingWindowStartWhich = 52,  # последние 52 недели — holdout\n  rollingWindowEndWhich = 4\n)\n",[1270],{"type":32,"tag":199,"props":1271,"children":1272},{"__ignoreMap":16},[1273,1280,1287,1294,1302,1310,1318],{"type":32,"tag":203,"props":1274,"children":1275},{"class":205,"line":206},[1276],{"type":32,"tag":203,"props":1277,"children":1278},{},[1279],{"type":37,"value":657},{"type":32,"tag":203,"props":1281,"children":1282},{"class":205,"line":216},[1283],{"type":32,"tag":203,"props":1284,"children":1285},{},[1286],{"type":37,"value":918},{"type":32,"tag":203,"props":1288,"children":1289},{"class":205,"line":251},[1290],{"type":32,"tag":203,"props":1291,"children":1292},{},[1293],{"type":37,"value":748},{"type":32,"tag":203,"props":1295,"children":1296},{"class":205,"line":311},[1297],{"type":32,"tag":203,"props":1298,"children":1299},{},[1300],{"type":37,"value":1301},"  window_end = \"2024-10-31\",\n",{"type":32,"tag":203,"props":1303,"children":1304},{"class":205,"line":361},[1305],{"type":32,"tag":203,"props":1306,"children":1307},{},[1308],{"type":37,"value":1309},"  rollingWindowStartWhich = 52,  # последние 52 недели — holdout\n",{"type":32,"tag":203,"props":1311,"children":1312},{"class":205,"line":411},[1313],{"type":32,"tag":203,"props":1314,"children":1315},{},[1316],{"type":37,"value":1317},"  rollingWindowEndWhich = 4\n",{"type":32,"tag":203,"props":1319,"children":1320},{"class":205,"line":433},[1321],{"type":32,"tag":203,"props":1322,"children":1323},{},[1324],{"type":37,"value":766},{"type":32,"tag":33,"props":1326,"children":1327},{},[1328,1330,1336],{"type":37,"value":1329},"Результаты в таблице ",{"type":32,"tag":199,"props":1331,"children":1333},{"className":1332},[],[1334],{"type":37,"value":1335},"resultCalibration",{"type":37,"value":545},{"type":32,"tag":73,"props":1338,"children":1339},{},[1340,1366],{"type":32,"tag":77,"props":1341,"children":1342},{},[1343],{"type":32,"tag":81,"props":1344,"children":1345},{},[1346,1351,1356,1361],{"type":32,"tag":85,"props":1347,"children":1348},{},[1349],{"type":37,"value":1350},"model_id",{"type":32,"tag":85,"props":1352,"children":1353},{},[1354],{"type":37,"value":1355},"nrmse_train",{"type":32,"tag":85,"props":1357,"children":1358},{},[1359],{"type":37,"value":1360},"nrmse_val",{"type":32,"tag":85,"props":1362,"children":1363},{},[1364],{"type":37,"value":1365},"decomp.rssd",{"type":32,"tag":116,"props":1367,"children":1368},{},[1369],{"type":32,"tag":81,"props":1370,"children":1371},{},[1372,1377,1382,1387],{"type":32,"tag":123,"props":1373,"children":1374},{},[1375],{"type":37,"value":1376},"2_100_3",{"type":32,"tag":123,"props":1378,"children":1379},{},[1380],{"type":37,"value":1381},"0.08",{"type":32,"tag":123,"props":1383,"children":1384},{},[1385],{"type":37,"value":1386},"0.12",{"type":32,"tag":123,"props":1388,"children":1389},{},[1390],{"type":37,"value":1391},"0.05",{"type":32,"tag":33,"props":1393,"children":1394},{},[1395,1400,1402,1407],{"type":32,"tag":771,"props":1396,"children":1397},{},[1398],{"type":37,"value":1399},"NRMSE (нормализованная среднеквадратичная ошибка):",{"type":37,"value":1401}," Ниже — лучше. 0.12 приемлемо (production-ready — ниже 0.15).\n",{"type":32,"tag":771,"props":1403,"children":1404},{},[1405],{"type":37,"value":1406},"decomp.rssd:",{"type":37,"value":1408}," Согласованность декомпозиции между training и validation. 0.05 → 5% отклонение → стабильная модель.",{"type":32,"tag":33,"props":1410,"children":1411},{},[1412],{"type":37,"value":1413},"Если валидация holdout не удалась, возможны две проблемы: (1) Недостаточно данных — нужно минимум 2 года еженедельных данных. (2) Пропущены переменные — добавьте сезонность, расходы конкурентов, изменения цены.",{"type":32,"tag":40,"props":1415,"children":1417},{"id":1416},"связь-выходов-robyn-с-механизмом-принятия-решений",[1418],{"type":37,"value":1419},"Связь выходов Robyn с механизмом принятия решений",{"type":32,"tag":33,"props":1421,"children":1422},{},[1423],{"type":37,"value":1424},"Экспортируйте таблицу декомпозиции в CSV:",{"type":32,"tag":192,"props":1426,"children":1428},{"code":1427,"language":549,"meta":16,"className":550,"style":16},"write.csv(OutputModels$xDecompAgg, \"robyn_output.csv\")\n",[1429],{"type":32,"tag":199,"props":1430,"children":1431},{"__ignoreMap":16},[1432],{"type":32,"tag":203,"props":1433,"children":1434},{"class":205,"line":206},[1435],{"type":32,"tag":203,"props":1436,"children":1437},{},[1438],{"type":37,"value":1427},{"type":32,"tag":33,"props":1440,"children":1441},{},[1442],{"type":37,"value":1443},"Загрузите в BigQuery:",{"type":32,"tag":192,"props":1445,"children":1447},{"code":1446,"language":195,"meta":16,"className":196,"style":16},"LOAD DATA OVERWRITE `project.dataset.mmm_results`\nFROM FILES (\n  format = 'CSV',\n  uris = ['gs:\u002F\u002Fbucket\u002Frobyn_output.csv']\n);\n",[1448],{"type":32,"tag":199,"props":1449,"children":1450},{"__ignoreMap":16},[1451,1474,1486,1507,1524],{"type":32,"tag":203,"props":1452,"children":1453},{"class":205,"line":206},[1454,1459,1464,1469],{"type":32,"tag":203,"props":1455,"children":1456},{"style":210},[1457],{"type":37,"value":1458},"LOAD",{"type":32,"tag":203,"props":1460,"children":1461},{"style":210},[1462],{"type":37,"value":1463}," DATA",{"type":32,"tag":203,"props":1465,"children":1466},{"style":220},[1467],{"type":37,"value":1468}," OVERWRITE ",{"type":32,"tag":203,"props":1470,"children":1471},{"style":281},[1472],{"type":37,"value":1473},"`project.dataset.mmm_results`\n",{"type":32,"tag":203,"props":1475,"children":1476},{"class":205,"line":216},[1477,1481],{"type":32,"tag":203,"props":1478,"children":1479},{"style":210},[1480],{"type":37,"value":461},{"type":32,"tag":203,"props":1482,"children":1483},{"style":220},[1484],{"type":37,"value":1485}," FILES (\n",{"type":32,"tag":203,"props":1487,"children":1488},{"class":205,"line":251},[1489,1494,1498,1503],{"type":32,"tag":203,"props":1490,"children":1491},{"style":220},[1492],{"type":37,"value":1493},"  format ",{"type":32,"tag":203,"props":1495,"children":1496},{"style":210},[1497],{"type":37,"value":278},{"type":32,"tag":203,"props":1499,"children":1500},{"style":281},[1501],{"type":37,"value":1502}," 'CSV'",{"type":32,"tag":203,"props":1504,"children":1505},{"style":220},[1506],{"type":37,"value":248},{"type":32,"tag":203,"props":1508,"children":1509},{"class":205,"line":311},[1510,1515,1519],{"type":32,"tag":203,"props":1511,"children":1512},{"style":220},[1513],{"type":37,"value":1514},"  uris ",{"type":32,"tag":203,"props":1516,"children":1517},{"style":210},[1518],{"type":37,"value":278},{"type":32,"tag":203,"props":1520,"children":1521},{"style":220},[1522],{"type":37,"value":1523}," ['gs:\u002F\u002Fbucket\u002Frobyn_output.csv']\n",{"type":32,"tag":203,"props":1525,"children":1526},{"class":205,"line":361},[1527],{"type":32,"tag":203,"props":1528,"children":1529},{"style":220},[1530],{"type":37,"value":1531},");\n",{"type":32,"tag":33,"props":1533,"children":1534},{},[1535],{"type":37,"value":1536},"Эта таблица подключается к dashboard'ам (Looker, Tableau) или оптимизаторам бюджета. Например, dbt-модель рассчитает оптимальные расходы:",{"type":32,"tag":192,"props":1538,"children":1540},{"code":1539,"language":195,"meta":16,"className":196,"style":16},"WITH saturation AS (\n  SELECT\n    channel,\n    total_spend,\n    roi,\n    total_spend \u002F NULLIF(roi, 0) AS optimal_spend\n  FROM `project.dataset.mmm_results`\n)\nSELECT * FROM saturation WHERE roi > 1.0 ORDER BY roi DESC;\n",[1541],{"type":32,"tag":199,"props":1542,"children":1543},{"__ignoreMap":16},[1544,1566,1574,1582,1590,1598,1638,1651,1658],{"type":32,"tag":203,"props":1545,"children":1546},{"class":205,"line":206},[1547,1552,1557,1561],{"type":32,"tag":203,"props":1548,"children":1549},{"style":210},[1550],{"type":37,"value":1551},"WITH",{"type":32,"tag":203,"props":1553,"children":1554},{"style":220},[1555],{"type":37,"value":1556}," saturation ",{"type":32,"tag":203,"props":1558,"children":1559},{"style":210},[1560],{"type":37,"value":238},{"type":32,"tag":203,"props":1562,"children":1563},{"style":220},[1564],{"type":37,"value":1565}," (\n",{"type":32,"tag":203,"props":1567,"children":1568},{"class":205,"line":216},[1569],{"type":32,"tag":203,"props":1570,"children":1571},{"style":210},[1572],{"type":37,"value":1573},"  SELECT\n",{"type":32,"tag":203,"props":1575,"children":1576},{"class":205,"line":251},[1577],{"type":32,"tag":203,"props":1578,"children":1579},{"style":220},[1580],{"type":37,"value":1581},"    channel,\n",{"type":32,"tag":203,"props":1583,"children":1584},{"class":205,"line":311},[1585],{"type":32,"tag":203,"props":1586,"children":1587},{"style":220},[1588],{"type":37,"value":1589},"    total_spend,\n",{"type":32,"tag":203,"props":1591,"children":1592},{"class":205,"line":361},[1593],{"type":32,"tag":203,"props":1594,"children":1595},{"style":220},[1596],{"type":37,"value":1597},"    roi,\n",{"type":32,"tag":203,"props":1599,"children":1600},{"class":205,"line":411},[1601,1606,1611,1616,1621,1625,1629,1633],{"type":32,"tag":203,"props":1602,"children":1603},{"style":220},[1604],{"type":37,"value":1605},"    total_spend ",{"type":32,"tag":203,"props":1607,"children":1608},{"style":210},[1609],{"type":37,"value":1610},"\u002F",{"type":32,"tag":203,"props":1612,"children":1613},{"style":255},[1614],{"type":37,"value":1615}," NULLIF",{"type":32,"tag":203,"props":1617,"children":1618},{"style":220},[1619],{"type":37,"value":1620},"(roi, ",{"type":32,"tag":203,"props":1622,"children":1623},{"style":255},[1624],{"type":37,"value":294},{"type":32,"tag":203,"props":1626,"children":1627},{"style":220},[1628],{"type":37,"value":233},{"type":32,"tag":203,"props":1630,"children":1631},{"style":210},[1632],{"type":37,"value":238},{"type":32,"tag":203,"props":1634,"children":1635},{"style":220},[1636],{"type":37,"value":1637}," optimal_spend\n",{"type":32,"tag":203,"props":1639,"children":1640},{"class":205,"line":433},[1641,1646],{"type":32,"tag":203,"props":1642,"children":1643},{"style":210},[1644],{"type":37,"value":1645},"  FROM",{"type":32,"tag":203,"props":1647,"children":1648},{"style":281},[1649],{"type":37,"value":1650}," `project.dataset.mmm_results`\n",{"type":32,"tag":203,"props":1652,"children":1653},{"class":205,"line":26},[1654],{"type":32,"tag":203,"props":1655,"children":1656},{"style":220},[1657],{"type":37,"value":766},{"type":32,"tag":203,"props":1659,"children":1660},{"class":205,"line":469},[1661,1666,1671,1676,1680,1684,1689,1694,1699,1704,1708,1713,1717,1722],{"type":32,"tag":203,"props":1662,"children":1663},{"style":210},[1664],{"type":37,"value":1665},"SELECT",{"type":32,"tag":203,"props":1667,"children":1668},{"style":210},[1669],{"type":37,"value":1670}," *",{"type":32,"tag":203,"props":1672,"children":1673},{"style":210},[1674],{"type":37,"value":1675}," FROM",{"type":32,"tag":203,"props":1677,"children":1678},{"style":220},[1679],{"type":37,"value":1556},{"type":32,"tag":203,"props":1681,"children":1682},{"style":210},[1683],{"type":37,"value":475},{"type":32,"tag":203,"props":1685,"children":1686},{"style":220},[1687],{"type":37,"value":1688}," roi ",{"type":32,"tag":203,"props":1690,"children":1691},{"style":210},[1692],{"type":37,"value":1693},">",{"type":32,"tag":203,"props":1695,"children":1696},{"style":255},[1697],{"type":37,"value":1698}," 1",{"type":32,"tag":203,"props":1700,"children":1701},{"style":220},[1702],{"type":37,"value":1703},".",{"type":32,"tag":203,"props":1705,"children":1706},{"style":255},[1707],{"type":37,"value":294},{"type":32,"tag":203,"props":1709,"children":1710},{"style":210},[1711],{"type":37,"value":1712}," ORDER BY",{"type":32,"tag":203,"props":1714,"children":1715},{"style":220},[1716],{"type":37,"value":1688},{"type":32,"tag":203,"props":1718,"children":1719},{"style":210},[1720],{"type":37,"value":1721},"DESC",{"type":32,"tag":203,"props":1723,"children":1724},{"style":220},[1725],{"type":37,"value":1726},";\n",{"type":32,"tag":33,"props":1728,"children":1729},{},[1730],{"type":37,"value":1731},"Этот запрос ранжирует каналы с ROI > 1 — это приоритеты для увеличения бюджета. Robyn также имеет встроенную функцию оптимизатора бюджета:",{"type":32,"tag":192,"props":1733,"children":1735},{"code":1734,"language":549,"meta":16,"className":550,"style":16},"AllocatorCollect \u003C- robyn_allocator(\n  InputCollect = InputCollect,\n  OutputCollect = OutputModels,\n  select_model = \"2_100_3\",\n  scenario = \"max_response\",\n  channel_constr_low = c(0.7, 0.7, 0.7),\n  channel_constr_up = c(1.5, 1.5, 1.5)\n)\n",[1736],{"type":32,"tag":199,"props":1737,"children":1738},{"__ignoreMap":16},[1739,1747,1754,1762,1770,1778,1786,1794],{"type":32,"tag":203,"props":1740,"children":1741},{"class":205,"line":206},[1742],{"type":32,"tag":203,"props":1743,"children":1744},{},[1745],{"type":37,"value":1746},"AllocatorCollect \u003C- robyn_allocator(\n",{"type":32,"tag":203,"props":1748,"children":1749},{"class":205,"line":216},[1750],{"type":32,"tag":203,"props":1751,"children":1752},{},[1753],{"type":37,"value":918},{"type":32,"tag":203,"props":1755,"children":1756},{"class":205,"line":251},[1757],{"type":32,"tag":203,"props":1758,"children":1759},{},[1760],{"type":37,"value":1761},"  OutputCollect = OutputModels,\n",{"type":32,"tag":203,"props":1763,"children":1764},{"class":205,"line":311},[1765],{"type":32,"tag":203,"props":1766,"children":1767},{},[1768],{"type":37,"value":1769},"  select_model = \"2_100_3\",\n",{"type":32,"tag":203,"props":1771,"children":1772},{"class":205,"line":361},[1773],{"type":32,"tag":203,"props":1774,"children":1775},{},[1776],{"type":37,"value":1777},"  scenario = \"max_response\",\n",{"type":32,"tag":203,"props":1779,"children":1780},{"class":205,"line":411},[1781],{"type":32,"tag":203,"props":1782,"children":1783},{},[1784],{"type":37,"value":1785},"  channel_constr_low = c(0.7, 0.7, 0.7),\n",{"type":32,"tag":203,"props":1787,"children":1788},{"class":205,"line":433},[1789],{"type":32,"tag":203,"props":1790,"children":1791},{},[1792],{"type":37,"value":1793},"  channel_constr_up = c(1.5, 1.5, 1.5)\n",{"type":32,"tag":203,"props":1795,"children":1796},{"class":205,"line":26},[1797],{"type":32,"tag":203,"props":1798,"children":1799},{},[1800],{"type":37,"value":766},{"type":32,"tag":33,"props":1802,"children":1803},{},[1804],{"type":37,"value":1805},"Выход — рекомендуемый новый бюджет для каждого канала. Ограничения удерживают изменения в диапазоне 70-150% текущих расходов (для снижения операционного риска).",{"type":32,"tag":33,"props":1807,"children":1808},{},[1809,1818],{"type":32,"tag":1810,"props":1811,"children":1815},"a",{"href":1812,"rel":1813},"https:\u002F\u002Fwww.roibase.com.tr\u002Fru\u002Ffirstparty",[1814],"nofollow",[1816],{"type":37,"value":1817},"First-Party Data & Measurement Architecture",{"type":37,"value":1819}," критична для Robyn — качество данных, скармливаемых модели, прямо влияет на надёжность. Без server-side event tracking, разрешения identity и интеграции consent mode агрегирование вводит bias.",{"type":32,"tag":40,"props":1821,"children":1823},{"id":1822},"распространённые-ловушки-и-их-смягчение",[1824],{"type":37,"value":1825},"Распространённые ловушки и их смягчение",{"type":32,"tag":33,"props":1827,"children":1828},{},[1829,1834],{"type":32,"tag":771,"props":1830,"children":1831},{},[1832],{"type":37,"value":1833},"Мультиколлинеарность:",{"type":37,"value":1835}," Если два канала всегда работают одновременно (например, ТВ + Facebook запускаются вместе), модель не может раз",{"type":32,"tag":1837,"props":1838,"children":1839},"style",{},[1840],{"type":37,"value":1841},"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":251,"depth":251,"links":1843},[1844,1845,1846,1847,1848,1849,1850],{"id":42,"depth":216,"text":45},{"id":63,"depth":216,"text":66},{"id":602,"depth":216,"text":605},{"id":987,"depth":216,"text":990},{"id":1252,"depth":216,"text":1255},{"id":1416,"depth":216,"text":1419},{"id":1822,"depth":216,"text":1825},"markdown","content:ru:data:marketing-mix-modeling-robyn-prakticheskaia-nastroika.md","content","ru\u002Fdata\u002Fmarketing-mix-modeling-robyn-prakticheskaia-nastroika.md","ru\u002Fdata\u002Fmarketing-mix-modeling-robyn-prakticheskaia-nastroika","md",1785103525932]