[{"data":1,"prerenderedAt":1968},["ShallowReactive",2],{"article-alternates":3,"article-\u002Fes\u002Fdata\u002Fmarketing-mix-modeling-robyn-configuracion-practica":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":8,"_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":1962,"_id":1963,"_source":1964,"_file":1965,"_stem":1966,"_extension":1967},"data",false,"","Marketing Mix Modeling: Configuración práctica con Robyn","Configurar MMM con el framework Robyn de Meta: curvas de saturación, decay de adstock, validación holdout. Incluye código R e integración con BigQuery.","2026-07-24",[21,22,23,24,25],"marketing-mix-modeling","robyn","attribution","data-science","bigquery",8,"Roibase",{"type":29,"children":30,"toc":1953},"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,1822,1828,1838,1869,1874,1884,1894,1937,1947],{"type":32,"tag":33,"props":34,"children":35},"element","p",{},[36],{"type":37,"value":38},"text","La atribución se ha roto en los últimos tres años. iOS 14.5, Consent Mode v2, la retirada de las cookies de terceros — todo deja al especialista en marketing digital frente a la misma pregunta: ¿qué canal funciona realmente? Marketing Mix Modeling (MMM) es la respuesta estadística que rompe la dependencia de cookies y píxeles, operando sobre datos agregados a nivel total. El framework Robyn de código abierto de Meta transforma MMM de un ejercicio académico a un pipeline productivo. Este artículo proporciona pasos concretos para configurar Robyn desde cero, interpretar curvas de saturación, ajustar parámetros de adstock decay y validar el modelo con técnicas holdout.",{"type":32,"tag":40,"props":41,"children":43},"h2",{"id":42},"qué-es-mmm-y-por-qué-es-crítico-ahora",[44],{"type":37,"value":45},"Qué es MMM y por qué es crítico ahora",{"type":32,"tag":33,"props":47,"children":48},{},[49],{"type":37,"value":50},"Marketing Mix Modeling explica la relación entre gasto en medios y ventas o conversiones mediante estadística basada en regresión. No requiere datos a nivel de usuario — trabaja con métricas agregadas semanales o diarias como gasto total, impresiones y ventas. El modelo calcula la contribución marginal (incrementality) de cada canal y muestra cuándo un canal entra en saturación.",{"type":32,"tag":33,"props":52,"children":53},{},[54],{"type":37,"value":55},"La atribución last-click clásica es basada en píxeles — asigna crédito al último canal en el que el usuario hizo clic. MMM, en cambio, observa todos los canales en la misma ventana temporal para aislar correlaciones. Por ejemplo, si la publicidad televisiva tiene un retraso de 3 semanas con respecto a las ventas (efecto carry-over), el modelo captura este retraso con el parámetro \"adstock\". La curva de saturación muestra rendimientos decrecientes: los primeros 100.000 TL en gasto generan 50 conversiones, mientras que los siguientes 100.000 TL generan solo 20.",{"type":32,"tag":33,"props":57,"children":58},{},[59],{"type":37,"value":60},"Robyn presenta este framework matemático como un paquete R que Meta ha entrenado con sus propios datos de campaña. Incluye regresión bayesiana, algoritmos evolutivos multiobjetivo (MOEA) para sintonización de hiperparámetros y optimización Nevergrad. La configuración no es manual — después de preparar los datos, 50 líneas de código R generan el modelo.",{"type":32,"tag":40,"props":62,"children":64},{"id":63},"preparación-de-datos-de-bigquery-a-robyn",[65],{"type":37,"value":66},"Preparación de datos: de BigQuery a Robyn",{"type":32,"tag":33,"props":68,"children":69},{},[70],{"type":37,"value":71},"Robyn espera un CSV\u002Fdata.frame único como entrada. Cada fila es un período de tiempo (semana o día), cada columna es gasto de un canal, impresiones o métrica de ventas. No acepta datos faltantes — si hay celdas vacías, debes realizar imputación. A continuación, el esquema mínimo:",{"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},"Para extraer estos datos de BigQuery con agregación semanal:",{"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},"La variable de control (tendencia, estacionalidad, indicador macroeconómico) no es obligatoria pero aumenta el poder explicativo del modelo. Por ejemplo, en retail, si enero es un mes de descuentos, añade una variable ficticia. Robyn incorpora estas variables como baseline \"orgánico\" en la regresión.",{"type":32,"tag":33,"props":534,"children":535},{},[536,538,544],{"type":37,"value":537},"Para transferir datos a R, usa el paquete ",{"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},"Para verificar la conformidad del formato de datos con Robyn, la función ",{"type":32,"tag":199,"props":593,"children":595},{"className":594},[],[596],{"type":37,"value":597},"robyn_inputs()",{"type":37,"value":599}," valida el esquema. La columna de fecha debe ser de clase Date, y las métricas deben ser numéricas.",{"type":32,"tag":40,"props":601,"children":603},{"id":602},"configuración-del-modelo-robyn-adstock-y-saturación",[604],{"type":37,"value":605},"Configuración del modelo Robyn: adstock y saturación",{"type":32,"tag":33,"props":607,"children":608},{},[609,611,616,618,624],{"type":37,"value":610},"El núcleo de Robyn son las funciones ",{"type":32,"tag":199,"props":612,"children":614},{"className":613},[],[615],{"type":37,"value":597},{"type":37,"value":617}," y ",{"type":32,"tag":199,"props":619,"children":621},{"className":620},[],[622],{"type":37,"value":623},"robyn_run()",{"type":37,"value":625},". El primer paso es definir los inputs del modelo:",{"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 = \"ES\",\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 = \"ES\",\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},"Selección del tipo de adstock:",{"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},": El más común. La tasa de decay es constante (por ejemplo, cada semana se mantiene el 80%). Adecuada para TV y 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},": Decay asimétrica — caída rápida al principio, luego ralentización. Lógica para vídeo e influencer marketing.",{"type":32,"tag":33,"props":804,"children":805},{},[806],{"type":37,"value":807},"Fórmula de adstock geométrico:",{"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}," es la tasa de decay (entre 0-1). Robyn optimiza automáticamente este parámetro, pero puedes proporcionar un rango manual:",{"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),       # coeficiente de la curva de saturación\n  tv_spend_gammas = c(0.3, 1),       # punto de inflexión de saturación\n  tv_spend_thetas = c(0, 0.5),       # tasa de decay de adstock\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),       # coeficiente de la curva de saturación\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),       # punto de inflexión de saturación\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),       # tasa de decay de adstock\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},"Parámetros de saturación:",{"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},": La forma de la curva. Alpha alto → saturación tardía.",{"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},": Punto de inflexión — 0.5 significa inflexión en el punto medio.",{"type":32,"tag":33,"props":968,"children":969},{},[970],{"type":37,"value":971},"Saturación con ecuación Hill:",{"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 optimiza estos parámetros mediante un algoritmo evolutivo. Genera 2000 modelos y selecciona los mejores trade-offs de la frontera de Pareto (balance entre R² y NRMSE).",{"type":32,"tag":40,"props":986,"children":988},{"id":987},"ejecución-del-modelo-e-interpretación-de-resultados",[989],{"type":37,"value":990},"Ejecución del modelo e interpretación de resultados",{"type":32,"tag":33,"props":992,"children":993},{},[994],{"type":37,"value":995},"Para ejecutar el modelo 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},"La salida es una lista — cada iteración es un conjunto diferente de hiperparámetros. Robyn selecciona automáticamente los 3 mejores modelos (óptimos de Pareto). Los resultados incluyen:",{"type":32,"tag":192,"props":1055,"children":1057},{"code":1056,"language":549,"meta":16,"className":550,"style":16},"OutputModels$resultHypParam    # parámetros de todos los modelos\nOutputModels$xDecompAgg        # descomposición de contribución por canal\nOutputModels$resultCalibration # puntuación de validación 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    # parámetros de todos los modelos\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        # descomposición de contribución por canal\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 # puntuación de validación holdout\n",{"type":32,"tag":33,"props":1086,"children":1087},{},[1088],{"type":32,"tag":771,"props":1089,"children":1090},{},[1091],{"type":37,"value":1092},"Tabla de descomposición de ejemplo:",{"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},"Interpretación de ROI:",{"type":37,"value":1220}," Facebook 1.20 — cada 1 TL de gasto genera 1.20 TL de retorno. TV 0.75 — no es ROI negativo, sino 0.75 TL de contribución incremental por encima del baseline. Robyn mide \"incrementality\", no crédito 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},"Detección de saturación:",{"type":37,"value":1230}," Robyn grafica la curva de saturación:",{"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},"En el gráfico, observa dónde la curva se aplana a medida que aumenta el gasto. Por ejemplo, si el gasto en TV supera 80.000 TL, la ganancia marginal cae un 50% — esta es una señal crítica para optimizar el presupuesto.",{"type":32,"tag":40,"props":1251,"children":1253},{"id":1252},"validación-holdout-y-confiabilidad-del-modelo",[1254],{"type":37,"value":1255},"Validación holdout y confiabilidad del modelo",{"type":32,"tag":33,"props":1257,"children":1258},{},[1259],{"type":37,"value":1260},"Para que un modelo MMM sea utilizable en producción, divide los datos históricos en: conjunto de entrenamiento (por ejemplo, 2022-octubre 2024) + conjunto holdout (noviembre-diciembre 2024). El modelo se entrena con el conjunto de entrenamiento y se prueba con el holdout. Si el MAPE (error porcentual absoluto medio) está por debajo del 10%, el modelo es confiable.",{"type":32,"tag":33,"props":1262,"children":1263},{},[1264],{"type":37,"value":1265},"Robyn realiza validación holdout automáticamente:",{"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,  # últimas 52 semanas como 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,  # últimas 52 semanas como 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},"El resultado aparece en la tabla ",{"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 (error cuadrático medio normalizado):",{"type":37,"value":1401}," Valores bajos = bueno. 0.12 es aceptable (por debajo de 0.15 es production-ready).\n",{"type":32,"tag":771,"props":1403,"children":1404},{},[1405],{"type":37,"value":1406},"decomp.rssd:",{"type":37,"value":1408}," Consistencia de descomposición entre entrenamiento y validación. 0.05 → desviación del 5% → modelo estable.",{"type":32,"tag":33,"props":1410,"children":1411},{},[1412],{"type":37,"value":1413},"Si la validación holdout falla, hay dos posibilidades: (1) Datos insuficientes — necesitas al menos 2 años de datos semanales. (2) Variables faltantes — añade estacionalidad, gasto de competencia, cambios de precio u otras variables confusoras.",{"type":32,"tag":40,"props":1415,"children":1417},{"id":1416},"vinculación-de-salida-de-robyn-con-el-mecanismo-de-decisión",[1418],{"type":37,"value":1419},"Vinculación de salida de Robyn con el mecanismo de decisión",{"type":32,"tag":33,"props":1421,"children":1422},{},[1423],{"type":37,"value":1424},"Para cargar nuevamente los resultados de Robyn en BigQuery, exporta la tabla de descomposición como 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},"Cárgalo en 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},"Esta tabla se conecta a dashboards (Looker, Tableau) u optimizadores de presupuesto. Por ejemplo, usa un modelo dbt para calcular el umbral de saturación:",{"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},"Esta consulta ordena los canales con ROI > 1.0 — tu lista de prioridades para aumentar presupuesto. Robyn también tiene una función de asignador de presupuesto:",{"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},"La salida sugiere un presupuesto nuevo para cada canal. Las restricciones mantienen los cambios entre el 70-150% del gasto actual (evitando riesgo operacional por cambios abruptos).",{"type":32,"tag":33,"props":1807,"children":1808},{},[1809,1811,1820],{"type":37,"value":1810},"La configuración de ",{"type":32,"tag":1812,"props":1813,"children":1817},"a",{"href":1814,"rel":1815},"https:\u002F\u002Fwww.roibase.com.tr\u002Fes\u002Ffirstparty",[1816],"nofollow",[1818],{"type":37,"value":1819},"Medición e Infraestructura de Primera Parte",{"type":37,"value":1821}," es crítica para MMM — la calidad de los datos que se alimentan en Robyn afecta directamente la confiabilidad del modelo. Sin rastreo de eventos server-side, resolución de identidad e integración de consent mode, el sesgo en el nivel de agregación es inevitable.",{"type":32,"tag":40,"props":1823,"children":1825},{"id":1824},"trampas-comunes-y-mitigación",[1826],{"type":37,"value":1827},"Trampas comunes y mitigación",{"type":32,"tag":33,"props":1829,"children":1830},{},[1831,1836],{"type":32,"tag":771,"props":1832,"children":1833},{},[1834],{"type":37,"value":1835},"Multicolinealidad:",{"type":37,"value":1837}," Si dos canales siempre están activos simultáneamente (por ejemplo, TV y Facebook siempre se ejecutan juntos), el modelo no puede separar sus contribuciones. Se requiere verificación del Factor de Inflación de Varianza (VIF):",{"type":32,"tag":192,"props":1839,"children":1841},{"code":1840,"language":549,"meta":16,"className":550,"style":16},"library(car)\nvif_model \u003C- lm(revenue ~ tv_spend + fb_spend + google_spend, data = df)\nvif(vif_model)\n",[1842],{"type":32,"tag":199,"props":1843,"children":1844},{"__ignoreMap":16},[1845,1853,1861],{"type":32,"tag":203,"props":1846,"children":1847},{"class":205,"line":206},[1848],{"type":32,"tag":203,"props":1849,"children":1850},{},[1851],{"type":37,"value":1852},"library(car)\n",{"type":32,"tag":203,"props":1854,"children":1855},{"class":205,"line":216},[1856],{"type":32,"tag":203,"props":1857,"children":1858},{},[1859],{"type":37,"value":1860},"vif_model \u003C- lm(revenue ~ tv_spend + fb_spend + google_spend, data = df)\n",{"type":32,"tag":203,"props":1862,"children":1863},{"class":205,"line":251},[1864],{"type":32,"tag":203,"props":1865,"children":1866},{},[1867],{"type":37,"value":1868},"vif(vif_model)\n",{"type":32,"tag":33,"props":1870,"children":1871},{},[1872],{"type":37,"value":1873},"VIF > 5 → hay problema. Soluciones: (1) Pausar temporalmente un canal y ejecutar un test holdout. (2) Recopilar serie temporal más larga.",{"type":32,"tag":33,"props":1875,"children":1876},{},[1877,1882],{"type":32,"tag":771,"props":1878,"children":1879},{},[1880],{"type":37,"value":1881},"Incertidumbre de período de retraso:",{"type":37,"value":1883}," Si el parámetro de adstock está mal configurado (por ejemplo, 1 semana para TV en lugar de 4), el modelo producirá resultados engañosos. Valida el tiempo real de decay con A\u002FB testing o experimentos geo. El paquete GeoLift de Meta lo hace.",{"type":32,"tag":33,"props":1885,"children":1886},{},[1887,1892],{"type":32,"tag":771,"props":1888,"children":1889},{},[1890],{"type":37,"value":1891},"Falta de control de estacionalidad:",{"type":37,"value":1893}," Si los componentes de Prophet (tendencia, estación, feriado) no se añaden al modelo, el aumento de ventas en enero puede atribuirse a medios (cuando realmente es efecto del descuento de Año Nuevo). Siempre activa Prophet:",{"type":32,"tag":192,"props":1895,"children":1897},{"code":1896,"language":549,"meta":16,"className":550,"style":16},"InputCollect \u003C- robyn_inputs(\n  InputCollect = InputCollect,\n  prophet_vars = c(\"trend\", \"season\", \"holiday\"),\n  prophet_country = \"ES\"\n)\n",[1898],{"type":32,"tag":199,"props":1899,"children":1900},{"__ignoreMap":16},[1901,1908,1915,1922,1930],{"type":32,"tag":203,"props":1902,"children":1903},{"class":205,"line":206},[1904],{"type":32,"tag":203,"props":1905,"children":1906},{},[1907],{"type":37,"value":657},{"type":32,"tag":203,"props":1909,"children":1910},{"class":205,"line":216},[1911],{"type":32,"tag":203,"props":1912,"children":1913},{},[1914],{"type":37,"value":918},{"type":32,"tag":203,"props":1916,"children":1917},{"class":205,"line":251},[1918],{"type":32,"tag":203,"props":1919,"children":1920},{},[1921],{"type":37,"value":697},{"type":32,"tag":203,"props":1923,"children":1924},{"class":205,"line":311},[1925],{"type":32,"tag":203,"props":1926,"children":1927},{},[1928],{"type":37,"value":1929},"  prophet_country = \"ES\"\n",{"type":32,"tag":203,"props":1931,"children":1932},{"class":205,"line":361},[1933],{"type":32,"tag":203,"props":1934,"children":1935},{},[1936],{"type":37,"value":766},{"type":32,"tag":33,"props":1938,"children":1939},{},[1940,1945],{"type":32,"tag":771,"props":1941,"children":1942},{},[1943],{"type":37,"value":1944},"Drift del modelo:",{"type":37,"value":1946}," Cuando la dinámica del mercado cambia (competidor nuevo",{"type":32,"tag":1948,"props":1949,"children":1950},"style",{},[1951],{"type":37,"value":1952},"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":1954},[1955,1956,1957,1958,1959,1960,1961],{"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":1824,"depth":216,"text":1827},"markdown","content:es:data:marketing-mix-modeling-robyn-configuracion-practica.md","content","es\u002Fdata\u002Fmarketing-mix-modeling-robyn-configuracion-practica.md","es\u002Fdata\u002Fmarketing-mix-modeling-robyn-configuracion-practica","md",1785103519394]