[{"data":1,"prerenderedAt":6101},["ShallowReactive",2],{"blog-post-experimenting-with-exploratory-data-analysis-es":3,"blog-post-adjacent-experimenting-with-exploratory-data-analysis-es":4404},{"id":4,"title":5,"author":6,"body":7,"date":4385,"description":13,"extension":4386,"image":4387,"lastmod":4385,"meta":4388,"navigation":159,"order":143,"path":4389,"seo":4390,"sitemap":4391,"slug":4394,"stem":4395,"summary":4396,"tags":4397,"__hash__":4403},"content_es\u002Fblog\u002Fblog\u002Fexperimenting-with-exploratory-data-analysis.md","Experimentando con el análisis exploratorio de datos","David Deras",{"type":8,"value":9,"toc":4376},"minimark",[10,14,24,27,30,35,43,51,56,72,874,878,889,940,943,1354,1357,1394,1397,1401,1404,1425,1878,1889,1904,1909,1916,1919,1930,1937,1942,1956,1959,1973,1976,1987,1990,2001,2010,2013,2020,2027,2034,2041,2048,2051,2054,2068,2071,2077,2080,2087,2090,2093,2104,2110,2116,2130,2133,2140,2143,2433,2436,2439,2759,2762,2773,2782,2785,2805,2812,2819,2822,2828,2831,2858,2865,2916,2923,2967,2974,3012,3019,3058,3065,3068,3112,3115,3129,3134,3137,3143,3146,3149,3152,3160,3163,3166,3169,3189,3208,3212,3218,3509,3513,3516,3671,3674,3680,3686,3753,3756,3899,3904,4086,4095,4098,4101,4206,4209,4275,4278,4323,4326,4372],[11,12,13],"p",{},"El análisis exploratorio de datos (EDA) es una etapa crucial en cualquier proyecto de aprendizaje automático. En este articulo realizaremos algunos experimentos con EDA para entender mejor cómo podemos utilizarlo para obtener insights valiosos de nuestros datos y mejorar el rendimiento de nuestros modelos.",[11,15,16,17],{},"Artículo anterior: ",[18,19,23],"a",{"href":20,"rel":21},"https:\u002F\u002Fderas.dev\u002Fes\u002Fblog\u002Fworkflow-machine-learning-projects",[22],"nofollow","El flujo en proyectos de aprendizaje automático",[25,26],"table-of-contents",{},[28,29],"hr",{},[31,32,34],"h2",{"id":33},"un-ejercicio-práctico-estimando-las-ventas-de-una-cafetería","Un Ejercicio Práctico: Estimando las Ventas de una Cafetería",[11,36,37,38,42],{},"Para entender el verdadero impacto de un Análisis Exploratorio de Datos (EDA), salgamos de la teoría y vayamos a la práctica con un escenario comercial: ",[39,40,41],"strong",{},"Estimar cuántos ingresos generará una cafetería al mes",". Este tipo de ejercicios permite que gerentes y dueños de negocio tomen decisiones basadas en datos (Data-Driven) y no en corazonadas.",[11,44,45,46],{},"Puedes seguir este ejercicio interactivo en Google Colab: ",[18,47,50],{"href":48,"rel":49},"https:\u002F\u002Fcolab.research.google.com\u002Fdrive\u002F12NPwGTp9JE0Vl926_ODlqpDRLkbnJimz?usp=sharing",[22],"EDA para Estimar Ventas de una Cafetería",[52,53,55],"h3",{"id":54},"paso-1-generación-y-carga-de-datos","Paso 1: Generación y Carga de Datos",[11,57,58,59,63,64,67,68,71],{},"Como primer paso, necesitamos un historial. Simularemos los datos de 365 días operativos de la cafetería, con variables que van desde la temperatura ambiente hasta inversión en publicidad (Ads en redes sociales). Importamos herramientas esenciales del stack clásico de Python: ",[60,61,62],"code",{},"pandas"," para manejar las tablas, y ",[60,65,66],{},"matplotlib","\u002F",[60,69,70],{},"seaborn"," para gráficos.",[73,74,79],"pre",{"className":75,"code":76,"language":77,"meta":78,"style":78},"language-python shiki shiki-themes vitesse-light vitesse-dark","import pandas as pd\nimport numpy as np\nimport random\nimport matplotlib.pyplot as plt\nimport seaborn as sns\n\n# Semilla para que los datos sean reproducibles\nnp.random.seed(42)\nrandom.seed(42)\n\n# Generación del dataset (365 días operativos)\nn = 365\nclimas = [\"Soleado\", \"Lluvioso\", \"Nublado\"]\ndata = []\n\nfor _ in range(n):\n    temperatura = round(random.uniform(15.0, 35.0), 1)\n    inversion_publicidad = round(random.uniform(10.0, 150.0), 2)\n    eventos_cercanos = random.choice([0, 1])\n    descuento_aplicado = random.choice([0, 10, 15, 20])\n    clima = random.choice(climas)\n    \n    # Lógica de negocio (Correlaciones simuladas):\n    # La temperatura baja y los eventos suben ventas. El clima lluvioso invita a tomar café.\n    ventas = (\n        500 + \n        (inversion_publicidad * 2.5) - \n        (temperatura * 8) + \n        (eventos_cercanos * 250) + \n        (descuento_aplicado * 5)\n    )\n    \n    if clima == \"Lluvioso\": ventas += 150\n    elif clima == \"Soleado\": ventas -= 50\n    \n    # Añadimos ruido estadístico para hacerlo realista\n    ventas += np.random.normal(0, 80)\n    \n    data.append([temperatura, inversion_publicidad, eventos_cercanos, descuento_aplicado, clima, round(ventas, 2)])\n\ncolumns = [\"temperatura_c\", \"inversion_publicidad\", \"evento_local\", \"descuento\", \"clima\", \"ventas_diarias\"]\ndf = pd.DataFrame(data, columns=columns)\ndf.head()\n","python","",[60,80,81,100,113,121,141,154,161,168,194,209,214,220,232,276,287,292,316,354,389,418,453,474,480,486,492,503,516,539,558,577,592,598,603,633,659,664,670,700,705,757,762,826,860],{"__ignoreMap":78},[82,83,86,90,94,97],"span",{"class":84,"line":85},"line",1,[82,87,89],{"class":88},"sTPum","import",[82,91,93],{"class":92},"s8w-G"," pandas ",[82,95,96],{"class":88},"as",[82,98,99],{"class":92}," pd\n",[82,101,103,105,108,110],{"class":84,"line":102},2,[82,104,89],{"class":88},[82,106,107],{"class":92}," numpy ",[82,109,96],{"class":88},[82,111,112],{"class":92}," np\n",[82,114,116,118],{"class":84,"line":115},3,[82,117,89],{"class":88},[82,119,120],{"class":92}," random\n",[82,122,124,126,129,133,136,138],{"class":84,"line":123},4,[82,125,89],{"class":88},[82,127,128],{"class":92}," matplotlib",[82,130,132],{"class":131},"si6no",".",[82,134,135],{"class":92},"pyplot ",[82,137,96],{"class":88},[82,139,140],{"class":92}," plt\n",[82,142,144,146,149,151],{"class":84,"line":143},5,[82,145,89],{"class":88},[82,147,148],{"class":92}," seaborn ",[82,150,96],{"class":88},[82,152,153],{"class":92}," sns\n",[82,155,157],{"class":84,"line":156},6,[82,158,160],{"emptyLinePlaceholder":159},true,"\n",[82,162,164],{"class":84,"line":163},7,[82,165,167],{"class":166},"snYqZ","# Semilla para que los datos sean reproducibles\n",[82,169,171,174,176,179,181,184,187,191],{"class":84,"line":170},8,[82,172,173],{"class":92},"np",[82,175,132],{"class":131},[82,177,178],{"class":92},"random",[82,180,132],{"class":131},[82,182,183],{"class":92},"seed",[82,185,186],{"class":131},"(",[82,188,190],{"class":189},"sqbOQ","42",[82,192,193],{"class":131},")\n",[82,195,197,199,201,203,205,207],{"class":84,"line":196},9,[82,198,178],{"class":92},[82,200,132],{"class":131},[82,202,183],{"class":92},[82,204,186],{"class":131},[82,206,190],{"class":189},[82,208,193],{"class":131},[82,210,212],{"class":84,"line":211},10,[82,213,160],{"emptyLinePlaceholder":159},[82,215,217],{"class":84,"line":216},11,[82,218,219],{"class":166},"# Generación del dataset (365 días operativos)\n",[82,221,223,226,229],{"class":84,"line":222},12,[82,224,225],{"class":92},"n ",[82,227,228],{"class":131},"=",[82,230,231],{"class":189}," 365\n",[82,233,235,238,240,243,247,251,253,256,259,262,264,266,268,271,273],{"class":84,"line":234},13,[82,236,237],{"class":92},"climas ",[82,239,228],{"class":131},[82,241,242],{"class":131}," [",[82,244,246],{"class":245},"scnC2","\"",[82,248,250],{"class":249},"spP0B","Soleado",[82,252,246],{"class":245},[82,254,255],{"class":131},",",[82,257,258],{"class":245}," \"",[82,260,261],{"class":249},"Lluvioso",[82,263,246],{"class":245},[82,265,255],{"class":131},[82,267,258],{"class":245},[82,269,270],{"class":249},"Nublado",[82,272,246],{"class":245},[82,274,275],{"class":131},"]\n",[82,277,279,282,284],{"class":84,"line":278},14,[82,280,281],{"class":92},"data ",[82,283,228],{"class":131},[82,285,286],{"class":131}," []\n",[82,288,290],{"class":84,"line":289},15,[82,291,160],{"emptyLinePlaceholder":159},[82,293,295,298,301,304,308,310,313],{"class":84,"line":294},16,[82,296,297],{"class":88},"for",[82,299,300],{"class":92}," _ ",[82,302,303],{"class":88},"in",[82,305,307],{"class":306},"sHLBJ"," range",[82,309,186],{"class":131},[82,311,312],{"class":92},"n",[82,314,315],{"class":131},"):\n",[82,317,319,322,324,327,329,331,333,336,338,341,343,346,349,352],{"class":84,"line":318},17,[82,320,321],{"class":92},"    temperatura ",[82,323,228],{"class":131},[82,325,326],{"class":306}," round",[82,328,186],{"class":131},[82,330,178],{"class":92},[82,332,132],{"class":131},[82,334,335],{"class":92},"uniform",[82,337,186],{"class":131},[82,339,340],{"class":189},"15.0",[82,342,255],{"class":131},[82,344,345],{"class":189}," 35.0",[82,347,348],{"class":131},"),",[82,350,351],{"class":189}," 1",[82,353,193],{"class":131},[82,355,357,360,362,364,366,368,370,372,374,377,379,382,384,387],{"class":84,"line":356},18,[82,358,359],{"class":92},"    inversion_publicidad ",[82,361,228],{"class":131},[82,363,326],{"class":306},[82,365,186],{"class":131},[82,367,178],{"class":92},[82,369,132],{"class":131},[82,371,335],{"class":92},[82,373,186],{"class":131},[82,375,376],{"class":189},"10.0",[82,378,255],{"class":131},[82,380,381],{"class":189}," 150.0",[82,383,348],{"class":131},[82,385,386],{"class":189}," 2",[82,388,193],{"class":131},[82,390,392,395,397,400,402,405,408,411,413,415],{"class":84,"line":391},19,[82,393,394],{"class":92},"    eventos_cercanos ",[82,396,228],{"class":131},[82,398,399],{"class":92}," random",[82,401,132],{"class":131},[82,403,404],{"class":92},"choice",[82,406,407],{"class":131},"([",[82,409,410],{"class":189},"0",[82,412,255],{"class":131},[82,414,351],{"class":189},[82,416,417],{"class":131},"])\n",[82,419,421,424,426,428,430,432,434,436,438,441,443,446,448,451],{"class":84,"line":420},20,[82,422,423],{"class":92},"    descuento_aplicado ",[82,425,228],{"class":131},[82,427,399],{"class":92},[82,429,132],{"class":131},[82,431,404],{"class":92},[82,433,407],{"class":131},[82,435,410],{"class":189},[82,437,255],{"class":131},[82,439,440],{"class":189}," 10",[82,442,255],{"class":131},[82,444,445],{"class":189}," 15",[82,447,255],{"class":131},[82,449,450],{"class":189}," 20",[82,452,417],{"class":131},[82,454,456,459,461,463,465,467,469,472],{"class":84,"line":455},21,[82,457,458],{"class":92},"    clima ",[82,460,228],{"class":131},[82,462,399],{"class":92},[82,464,132],{"class":131},[82,466,404],{"class":92},[82,468,186],{"class":131},[82,470,471],{"class":92},"climas",[82,473,193],{"class":131},[82,475,477],{"class":84,"line":476},22,[82,478,479],{"class":92},"    \n",[82,481,483],{"class":84,"line":482},23,[82,484,485],{"class":166},"    # Lógica de negocio (Correlaciones simuladas):\n",[82,487,489],{"class":84,"line":488},24,[82,490,491],{"class":166},"    # La temperatura baja y los eventos suben ventas. El clima lluvioso invita a tomar café.\n",[82,493,495,498,500],{"class":84,"line":494},25,[82,496,497],{"class":92},"    ventas ",[82,499,228],{"class":131},[82,501,502],{"class":131}," (\n",[82,504,506,509,513],{"class":84,"line":505},26,[82,507,508],{"class":189},"        500",[82,510,512],{"class":511},"s5TCs"," +",[82,514,515],{"class":92}," \n",[82,517,519,522,525,528,531,534,537],{"class":84,"line":518},27,[82,520,521],{"class":131},"        (",[82,523,524],{"class":92},"inversion_publicidad ",[82,526,527],{"class":511},"*",[82,529,530],{"class":189}," 2.5",[82,532,533],{"class":131},")",[82,535,536],{"class":511}," -",[82,538,515],{"class":92},[82,540,542,544,547,549,552,554,556],{"class":84,"line":541},28,[82,543,521],{"class":131},[82,545,546],{"class":92},"temperatura ",[82,548,527],{"class":511},[82,550,551],{"class":189}," 8",[82,553,533],{"class":131},[82,555,512],{"class":511},[82,557,515],{"class":92},[82,559,561,563,566,568,571,573,575],{"class":84,"line":560},29,[82,562,521],{"class":131},[82,564,565],{"class":92},"eventos_cercanos ",[82,567,527],{"class":511},[82,569,570],{"class":189}," 250",[82,572,533],{"class":131},[82,574,512],{"class":511},[82,576,515],{"class":92},[82,578,580,582,585,587,590],{"class":84,"line":579},30,[82,581,521],{"class":131},[82,583,584],{"class":92},"descuento_aplicado ",[82,586,527],{"class":511},[82,588,589],{"class":189}," 5",[82,591,193],{"class":131},[82,593,595],{"class":84,"line":594},31,[82,596,597],{"class":131},"    )\n",[82,599,601],{"class":84,"line":600},32,[82,602,479],{"class":92},[82,604,606,609,612,615,617,619,621,624,627,630],{"class":84,"line":605},33,[82,607,608],{"class":88},"    if",[82,610,611],{"class":92}," clima ",[82,613,614],{"class":511},"==",[82,616,258],{"class":245},[82,618,261],{"class":249},[82,620,246],{"class":245},[82,622,623],{"class":131},":",[82,625,626],{"class":92}," ventas ",[82,628,629],{"class":131},"+=",[82,631,632],{"class":189}," 150\n",[82,634,636,639,641,643,645,647,649,651,653,656],{"class":84,"line":635},34,[82,637,638],{"class":88},"    elif",[82,640,611],{"class":92},[82,642,614],{"class":511},[82,644,258],{"class":245},[82,646,250],{"class":249},[82,648,246],{"class":245},[82,650,623],{"class":131},[82,652,626],{"class":92},[82,654,655],{"class":131},"-=",[82,657,658],{"class":189}," 50\n",[82,660,662],{"class":84,"line":661},35,[82,663,479],{"class":92},[82,665,667],{"class":84,"line":666},36,[82,668,669],{"class":166},"    # Añadimos ruido estadístico para hacerlo realista\n",[82,671,673,675,677,680,682,684,686,689,691,693,695,698],{"class":84,"line":672},37,[82,674,497],{"class":92},[82,676,629],{"class":131},[82,678,679],{"class":92}," np",[82,681,132],{"class":131},[82,683,178],{"class":92},[82,685,132],{"class":131},[82,687,688],{"class":92},"normal",[82,690,186],{"class":131},[82,692,410],{"class":189},[82,694,255],{"class":131},[82,696,697],{"class":189}," 80",[82,699,193],{"class":131},[82,701,703],{"class":84,"line":702},38,[82,704,479],{"class":92},[82,706,708,711,713,716,718,721,723,726,728,731,733,736,738,741,743,745,747,750,752,754],{"class":84,"line":707},39,[82,709,710],{"class":92},"    data",[82,712,132],{"class":131},[82,714,715],{"class":92},"append",[82,717,407],{"class":131},[82,719,720],{"class":92},"temperatura",[82,722,255],{"class":131},[82,724,725],{"class":92}," inversion_publicidad",[82,727,255],{"class":131},[82,729,730],{"class":92}," eventos_cercanos",[82,732,255],{"class":131},[82,734,735],{"class":92}," descuento_aplicado",[82,737,255],{"class":131},[82,739,740],{"class":92}," clima",[82,742,255],{"class":131},[82,744,326],{"class":306},[82,746,186],{"class":131},[82,748,749],{"class":92},"ventas",[82,751,255],{"class":131},[82,753,386],{"class":189},[82,755,756],{"class":131},")])\n",[82,758,760],{"class":84,"line":759},40,[82,761,160],{"emptyLinePlaceholder":159},[82,763,765,768,770,772,774,777,779,781,783,786,788,790,792,795,797,799,801,804,806,808,810,813,815,817,819,822,824],{"class":84,"line":764},41,[82,766,767],{"class":92},"columns ",[82,769,228],{"class":131},[82,771,242],{"class":131},[82,773,246],{"class":245},[82,775,776],{"class":249},"temperatura_c",[82,778,246],{"class":245},[82,780,255],{"class":131},[82,782,258],{"class":245},[82,784,785],{"class":249},"inversion_publicidad",[82,787,246],{"class":245},[82,789,255],{"class":131},[82,791,258],{"class":245},[82,793,794],{"class":249},"evento_local",[82,796,246],{"class":245},[82,798,255],{"class":131},[82,800,258],{"class":245},[82,802,803],{"class":249},"descuento",[82,805,246],{"class":245},[82,807,255],{"class":131},[82,809,258],{"class":245},[82,811,812],{"class":249},"clima",[82,814,246],{"class":245},[82,816,255],{"class":131},[82,818,258],{"class":245},[82,820,821],{"class":249},"ventas_diarias",[82,823,246],{"class":245},[82,825,275],{"class":131},[82,827,829,832,834,837,839,842,844,847,849,853,855,858],{"class":84,"line":828},42,[82,830,831],{"class":92},"df ",[82,833,228],{"class":131},[82,835,836],{"class":92}," pd",[82,838,132],{"class":131},[82,840,841],{"class":92},"DataFrame",[82,843,186],{"class":131},[82,845,846],{"class":92},"data",[82,848,255],{"class":131},[82,850,852],{"class":851},"s9nN2"," columns",[82,854,228],{"class":131},[82,856,857],{"class":92},"columns",[82,859,193],{"class":131},[82,861,863,866,868,871],{"class":84,"line":862},43,[82,864,865],{"class":92},"df",[82,867,132],{"class":131},[82,869,870],{"class":92},"head",[82,872,873],{"class":131},"()\n",[52,875,877],{"id":876},"paso-2-conociendo-la-data-exploración-inicial","Paso 2: Conociendo la Data (Exploración Inicial)",[11,879,880,881,884,885,888],{},"Con ",[60,882,883],{},"df.info()"," comprobamos que no haya datos faltantes (nulos) y los tipos de dato, mientras que ",[60,886,887],{},"df.describe()"," nos resume la media, los máximos y mínimos diarios de ventas y gastos.",[73,890,892],{"className":75,"code":891,"language":77,"meta":78,"style":78},"# Un vistazo rápido a la salud de nuestra tabla\nprint(df.info())\n\n# Estadísticas descriptivas (promedios, cuartiles, mín\u002Fmáx)\nprint(df.describe())\n",[60,893,894,899,916,920,925],{"__ignoreMap":78},[82,895,896],{"class":84,"line":85},[82,897,898],{"class":166},"# Un vistazo rápido a la salud de nuestra tabla\n",[82,900,901,904,906,908,910,913],{"class":84,"line":102},[82,902,903],{"class":306},"print",[82,905,186],{"class":131},[82,907,865],{"class":92},[82,909,132],{"class":131},[82,911,912],{"class":92},"info",[82,914,915],{"class":131},"())\n",[82,917,918],{"class":84,"line":115},[82,919,160],{"emptyLinePlaceholder":159},[82,921,922],{"class":84,"line":123},[82,923,924],{"class":166},"# Estadísticas descriptivas (promedios, cuartiles, mín\u002Fmáx)\n",[82,926,927,929,931,933,935,938],{"class":84,"line":143},[82,928,903],{"class":306},[82,930,186],{"class":131},[82,932,865],{"class":92},[82,934,132],{"class":131},[82,936,937],{"class":92},"describe",[82,939,915],{"class":131},[11,941,942],{},"Dando como resultado lo siguiente:",[73,944,948],{"className":945,"code":946,"language":947,"meta":78,"style":78},"language-sh shiki shiki-themes vitesse-light vitesse-dark","\u003Cclass 'pandas.core.frame.DataFrame'>\nRangeIndex: 365 entries, 0 to 364\nData columns (total 6 columns):\n #   Column         Non-Null Count  Dtype  \n---  ------         --------------  -----  \n 0   temperature_c  365 non-null    float64\n 1   ad_investment  365 non-null    float64\n 2   local_event    365 non-null    int64  \n 3   discount       365 non-null    int64  \n 4   weather        365 non-null    object \n 5   daily_sales    365 non-null    float64\ndtypes: float64(3), int64(2), object(1)\nmemory usage: 17.2+ KB\nNone\n       temperature_c  ad_investment  local_event    discount  daily_sales\ncount     365.000000     365.000000   365.000000  365.000000   365.000000\nmean       24.648767      82.490247     0.561644   11.684932   735.927151\nstd         5.687482      40.828333     0.496867    7.270059   204.863687\nmin        15.100000      10.060000     0.000000    0.000000   226.620000\n25%        19.800000      48.400000     0.000000   10.000000   576.890000\n50%        24.500000      84.780000     1.000000   15.000000   729.730000\n75%        29.600000     120.280000     1.000000   20.000000   879.280000\nmax        35.000000     149.780000     1.000000   20.000000  1337.220000\n","sh",[60,949,950,969,990,1007,1012,1030,1046,1059,1076,1093,1111,1124,1163,1177,1182,1199,1218,1238,1258,1278,1297,1317,1336],{"__ignoreMap":78},[82,951,952,955,958,961,964,966],{"class":84,"line":85},[82,953,954],{"class":511},"\u003C",[82,956,957],{"class":92},"class ",[82,959,960],{"class":245},"'",[82,962,963],{"class":249},"pandas.core.frame.DataFrame",[82,965,960],{"class":245},[82,967,968],{"class":511},">\n",[82,970,971,975,978,981,984,987],{"class":84,"line":102},[82,972,974],{"class":973},"s_xSY","RangeIndex:",[82,976,977],{"class":189}," 365",[82,979,980],{"class":249}," entries,",[82,982,983],{"class":189}," 0",[82,985,986],{"class":249}," to",[82,988,989],{"class":189}," 364\n",[82,991,992,995,997,1000,1003,1005],{"class":84,"line":115},[82,993,994],{"class":973},"Data",[82,996,852],{"class":249},[82,998,999],{"class":92}," (total ",[82,1001,1002],{"class":189},"6",[82,1004,852],{"class":249},[82,1006,315],{"class":92},[82,1008,1009],{"class":84,"line":123},[82,1010,1011],{"class":166}," #   Column         Non-Null Count  Dtype  \n",[82,1013,1014,1017,1021,1024,1027],{"class":84,"line":143},[82,1015,1016],{"class":973},"---",[82,1018,1020],{"class":1019},"sfsYZ","  ------",[82,1022,1023],{"class":1019},"         --------------",[82,1025,1026],{"class":1019},"  -----",[82,1028,1029],{"class":92},"  \n",[82,1031,1032,1034,1037,1040,1043],{"class":84,"line":156},[82,1033,983],{"class":973},[82,1035,1036],{"class":249},"   temperature_c",[82,1038,1039],{"class":189},"  365",[82,1041,1042],{"class":249}," non-null",[82,1044,1045],{"class":249},"    float64\n",[82,1047,1048,1050,1053,1055,1057],{"class":84,"line":163},[82,1049,351],{"class":973},[82,1051,1052],{"class":249},"   ad_investment",[82,1054,1039],{"class":189},[82,1056,1042],{"class":249},[82,1058,1045],{"class":249},[82,1060,1061,1063,1066,1069,1071,1074],{"class":84,"line":170},[82,1062,386],{"class":973},[82,1064,1065],{"class":249},"   local_event",[82,1067,1068],{"class":189},"    365",[82,1070,1042],{"class":249},[82,1072,1073],{"class":249},"    int64",[82,1075,1029],{"class":92},[82,1077,1078,1081,1084,1087,1089,1091],{"class":84,"line":196},[82,1079,1080],{"class":973}," 3",[82,1082,1083],{"class":249},"   discount",[82,1085,1086],{"class":189},"       365",[82,1088,1042],{"class":249},[82,1090,1073],{"class":249},[82,1092,1029],{"class":92},[82,1094,1095,1098,1101,1104,1106,1109],{"class":84,"line":211},[82,1096,1097],{"class":973}," 4",[82,1099,1100],{"class":249},"   weather",[82,1102,1103],{"class":189},"        365",[82,1105,1042],{"class":249},[82,1107,1108],{"class":249},"    object",[82,1110,515],{"class":92},[82,1112,1113,1115,1118,1120,1122],{"class":84,"line":216},[82,1114,589],{"class":973},[82,1116,1117],{"class":249},"   daily_sales",[82,1119,1068],{"class":189},[82,1121,1042],{"class":249},[82,1123,1045],{"class":249},[82,1125,1126,1129,1132,1134,1137,1139,1141,1144,1146,1149,1151,1153,1156,1158,1161],{"class":84,"line":222},[82,1127,1128],{"class":973},"dtypes:",[82,1130,1131],{"class":249}," float64",[82,1133,186],{"class":131},[82,1135,1136],{"class":973},"3",[82,1138,533],{"class":131},[82,1140,255],{"class":249},[82,1142,1143],{"class":249}," int64",[82,1145,186],{"class":131},[82,1147,1148],{"class":973},"2",[82,1150,533],{"class":131},[82,1152,255],{"class":249},[82,1154,1155],{"class":249}," object",[82,1157,186],{"class":131},[82,1159,1160],{"class":973},"1",[82,1162,193],{"class":131},[82,1164,1165,1168,1171,1174],{"class":84,"line":234},[82,1166,1167],{"class":973},"memory",[82,1169,1170],{"class":249}," usage:",[82,1172,1173],{"class":249}," 17.2+",[82,1175,1176],{"class":249}," KB\n",[82,1178,1179],{"class":84,"line":278},[82,1180,1181],{"class":973},"None\n",[82,1183,1184,1187,1190,1193,1196],{"class":84,"line":289},[82,1185,1186],{"class":973},"       temperature_c",[82,1188,1189],{"class":249},"  ad_investment",[82,1191,1192],{"class":249},"  local_event",[82,1194,1195],{"class":249},"    discount",[82,1197,1198],{"class":249},"  daily_sales\n",[82,1200,1201,1204,1207,1209,1212,1215],{"class":84,"line":294},[82,1202,1203],{"class":973},"count",[82,1205,1206],{"class":189},"     365.000000",[82,1208,1206],{"class":189},[82,1210,1211],{"class":189},"   365.000000",[82,1213,1214],{"class":189},"  365.000000",[82,1216,1217],{"class":189},"   365.000000\n",[82,1219,1220,1223,1226,1229,1232,1235],{"class":84,"line":318},[82,1221,1222],{"class":973},"mean",[82,1224,1225],{"class":189},"       24.648767",[82,1227,1228],{"class":189},"      82.490247",[82,1230,1231],{"class":189},"     0.561644",[82,1233,1234],{"class":189},"   11.684932",[82,1236,1237],{"class":189},"   735.927151\n",[82,1239,1240,1243,1246,1249,1252,1255],{"class":84,"line":356},[82,1241,1242],{"class":973},"std",[82,1244,1245],{"class":189},"         5.687482",[82,1247,1248],{"class":189},"      40.828333",[82,1250,1251],{"class":189},"     0.496867",[82,1253,1254],{"class":189},"    7.270059",[82,1256,1257],{"class":189},"   204.863687\n",[82,1259,1260,1263,1266,1269,1272,1275],{"class":84,"line":391},[82,1261,1262],{"class":973},"min",[82,1264,1265],{"class":189},"        15.100000",[82,1267,1268],{"class":189},"      10.060000",[82,1270,1271],{"class":189},"     0.000000",[82,1273,1274],{"class":189},"    0.000000",[82,1276,1277],{"class":189},"   226.620000\n",[82,1279,1280,1283,1286,1289,1291,1294],{"class":84,"line":420},[82,1281,1282],{"class":973},"25%",[82,1284,1285],{"class":189},"        19.800000",[82,1287,1288],{"class":189},"      48.400000",[82,1290,1271],{"class":189},[82,1292,1293],{"class":189},"   10.000000",[82,1295,1296],{"class":189},"   576.890000\n",[82,1298,1299,1302,1305,1308,1311,1314],{"class":84,"line":455},[82,1300,1301],{"class":973},"50%",[82,1303,1304],{"class":189},"        24.500000",[82,1306,1307],{"class":189},"      84.780000",[82,1309,1310],{"class":189},"     1.000000",[82,1312,1313],{"class":189},"   15.000000",[82,1315,1316],{"class":189},"   729.730000\n",[82,1318,1319,1322,1325,1328,1330,1333],{"class":84,"line":476},[82,1320,1321],{"class":973},"75%",[82,1323,1324],{"class":189},"        29.600000",[82,1326,1327],{"class":189},"     120.280000",[82,1329,1310],{"class":189},[82,1331,1332],{"class":189},"   20.000000",[82,1334,1335],{"class":189},"   879.280000\n",[82,1337,1338,1341,1344,1347,1349,1351],{"class":84,"line":482},[82,1339,1340],{"class":973},"max",[82,1342,1343],{"class":189},"        35.000000",[82,1345,1346],{"class":189},"     149.780000",[82,1348,1310],{"class":189},[82,1350,1332],{"class":189},[82,1352,1353],{"class":189},"  1337.220000\n",[11,1355,1356],{},"Exploremos un poco los resultados:",[1358,1359,1360,1364,1374,1377,1380],"ul",{},[1361,1362,1363],"li",{},"La temperatura promedio es de 24.65°C, con un rango entre 15.1°C y 35°C.",[1361,1365,1366,1367,1370,1371,132],{},"La inversión en publicidad varía ampliamente, con un promedio de ",[60,1368,1369],{},"$82.49"," y un máximo de ",[60,1372,1373],{},"$149.78",[1361,1375,1376],{},"El 56.16% de los días tuvieron un evento local.",[1361,1378,1379],{},"El descuento aplicado varía, con un promedio de 11.68% y un máximo de 20%.",[1361,1381,1382,1383,1386,1387,1390,1391,132],{},"Las ventas diarias tienen un promedio de ",[60,1384,1385],{},"$735.93",", con una amplia variabilidad, desde un mínimo de ",[60,1388,1389],{},"$226.62"," hasta un máximo de ",[60,1392,1393],{},"$1337.22",[11,1395,1396],{},"Además, no hay valores nulos en el dataset, lo que es una buena señal para el análisis posterior.\nLa amplia variabilidad en las ventas diarias sugiere que hay factores significativos que afectan las ventas, lo que hace que el análisis exploratorio de datos sea aún más crucial para entender estas relaciones.",[52,1398,1400],{"id":1399},"paso-3-visualización-estratégica","Paso 3: Visualización Estratégica",[11,1402,1403],{},"La mejor forma de entender nuestros datos es a través de la visualización. Vamos a construir tres gráficos clave para nuestro análisis:",[1405,1406,1407,1413,1419],"ol",{},[1361,1408,1409,1412],{},[39,1410,1411],{},"Histograma de Ventas:"," Nos dice si nuestras ganancias diarias siguen una curva normal (Campana de Gauss) o si están sesgadas.",[1361,1414,1415,1418],{},[39,1416,1417],{},"Dispersión (Scatter) Publicidad vs. Ventas:"," Revela si meter más dinero a los Ads realmente sube las ventas o si llega a un tope (rendimiento decreciente).",[1361,1420,1421,1424],{},[39,1422,1423],{},"Matriz de Correlación:"," Es el \"santo grial\" del EDA. Asignará un valor de -1 a 1 a la relación entre todas nuestras variables.",[73,1426,1428],{"className":75,"code":1427,"language":77,"meta":78,"style":78},"# 1. Distribución de las ventas (¿vendemos más en días \"buenos\" o \"malos\" estadísticamente?)\nplt.figure(figsize=(8,5))\nsns.histplot(df[\"ventas_diarias\"], bins=20, kde=True, color=\"brown\")\nplt.title(\"Distribución de las Ventas Diarias de Café\")\nplt.xlabel(\"Ventas en $\")\nplt.ylabel(\"Frecuencia (Días)\")\nplt.show()\n\n# 2. El impacto de los Ads\nplt.figure(figsize=(8,5))\nsns.scatterplot(x=\"inversion_publicidad\", y=\"ventas_diarias\", hue=\"clima\", data=df)\nplt.title(\"Inversión en Publicidad vs. Ventas (Coloreado por Clima)\")\nplt.xlabel(\"Inversión ($)\")\nplt.ylabel(\"Ventas ($)\")\nplt.show()\n\n# 3. El mapa de calor (Heatmap)\nplt.figure(figsize=(8,6))\nsns.heatmap(df.corr(numeric_only=True), annot=True, cmap=\"YlOrBr\", fmt=\".2f\")\nplt.title(\"Correlación de Variables\")\nplt.show()\n",[60,1429,1430,1435,1464,1524,1544,1564,1584,1595,1599,1604,1626,1685,1704,1723,1742,1752,1756,1761,1783,1849,1868],{"__ignoreMap":78},[82,1431,1432],{"class":84,"line":85},[82,1433,1434],{"class":166},"# 1. Distribución de las ventas (¿vendemos más en días \"buenos\" o \"malos\" estadísticamente?)\n",[82,1436,1437,1440,1442,1445,1447,1450,1453,1456,1458,1461],{"class":84,"line":102},[82,1438,1439],{"class":92},"plt",[82,1441,132],{"class":131},[82,1443,1444],{"class":92},"figure",[82,1446,186],{"class":131},[82,1448,1449],{"class":851},"figsize",[82,1451,1452],{"class":131},"=(",[82,1454,1455],{"class":189},"8",[82,1457,255],{"class":131},[82,1459,1460],{"class":189},"5",[82,1462,1463],{"class":131},"))\n",[82,1465,1466,1469,1471,1474,1476,1478,1481,1483,1485,1487,1490,1493,1495,1498,1500,1503,1505,1508,1510,1513,1515,1517,1520,1522],{"class":84,"line":115},[82,1467,1468],{"class":92},"sns",[82,1470,132],{"class":131},[82,1472,1473],{"class":92},"histplot",[82,1475,186],{"class":131},[82,1477,865],{"class":92},[82,1479,1480],{"class":131},"[",[82,1482,246],{"class":245},[82,1484,821],{"class":249},[82,1486,246],{"class":245},[82,1488,1489],{"class":131},"],",[82,1491,1492],{"class":851}," bins",[82,1494,228],{"class":131},[82,1496,1497],{"class":189},"20",[82,1499,255],{"class":131},[82,1501,1502],{"class":851}," kde",[82,1504,228],{"class":131},[82,1506,1507],{"class":88},"True",[82,1509,255],{"class":131},[82,1511,1512],{"class":851}," color",[82,1514,228],{"class":131},[82,1516,246],{"class":245},[82,1518,1519],{"class":249},"brown",[82,1521,246],{"class":245},[82,1523,193],{"class":131},[82,1525,1526,1528,1530,1533,1535,1537,1540,1542],{"class":84,"line":123},[82,1527,1439],{"class":92},[82,1529,132],{"class":131},[82,1531,1532],{"class":92},"title",[82,1534,186],{"class":131},[82,1536,246],{"class":245},[82,1538,1539],{"class":249},"Distribución de las Ventas Diarias de Café",[82,1541,246],{"class":245},[82,1543,193],{"class":131},[82,1545,1546,1548,1550,1553,1555,1557,1560,1562],{"class":84,"line":143},[82,1547,1439],{"class":92},[82,1549,132],{"class":131},[82,1551,1552],{"class":92},"xlabel",[82,1554,186],{"class":131},[82,1556,246],{"class":245},[82,1558,1559],{"class":249},"Ventas en $",[82,1561,246],{"class":245},[82,1563,193],{"class":131},[82,1565,1566,1568,1570,1573,1575,1577,1580,1582],{"class":84,"line":156},[82,1567,1439],{"class":92},[82,1569,132],{"class":131},[82,1571,1572],{"class":92},"ylabel",[82,1574,186],{"class":131},[82,1576,246],{"class":245},[82,1578,1579],{"class":249},"Frecuencia (Días)",[82,1581,246],{"class":245},[82,1583,193],{"class":131},[82,1585,1586,1588,1590,1593],{"class":84,"line":163},[82,1587,1439],{"class":92},[82,1589,132],{"class":131},[82,1591,1592],{"class":92},"show",[82,1594,873],{"class":131},[82,1596,1597],{"class":84,"line":170},[82,1598,160],{"emptyLinePlaceholder":159},[82,1600,1601],{"class":84,"line":196},[82,1602,1603],{"class":166},"# 2. El impacto de los Ads\n",[82,1605,1606,1608,1610,1612,1614,1616,1618,1620,1622,1624],{"class":84,"line":211},[82,1607,1439],{"class":92},[82,1609,132],{"class":131},[82,1611,1444],{"class":92},[82,1613,186],{"class":131},[82,1615,1449],{"class":851},[82,1617,1452],{"class":131},[82,1619,1455],{"class":189},[82,1621,255],{"class":131},[82,1623,1460],{"class":189},[82,1625,1463],{"class":131},[82,1627,1628,1630,1632,1635,1637,1640,1642,1644,1646,1648,1650,1653,1655,1657,1659,1661,1663,1666,1668,1670,1672,1674,1676,1679,1681,1683],{"class":84,"line":216},[82,1629,1468],{"class":92},[82,1631,132],{"class":131},[82,1633,1634],{"class":92},"scatterplot",[82,1636,186],{"class":131},[82,1638,1639],{"class":851},"x",[82,1641,228],{"class":131},[82,1643,246],{"class":245},[82,1645,785],{"class":249},[82,1647,246],{"class":245},[82,1649,255],{"class":131},[82,1651,1652],{"class":851}," y",[82,1654,228],{"class":131},[82,1656,246],{"class":245},[82,1658,821],{"class":249},[82,1660,246],{"class":245},[82,1662,255],{"class":131},[82,1664,1665],{"class":851}," hue",[82,1667,228],{"class":131},[82,1669,246],{"class":245},[82,1671,812],{"class":249},[82,1673,246],{"class":245},[82,1675,255],{"class":131},[82,1677,1678],{"class":851}," data",[82,1680,228],{"class":131},[82,1682,865],{"class":92},[82,1684,193],{"class":131},[82,1686,1687,1689,1691,1693,1695,1697,1700,1702],{"class":84,"line":222},[82,1688,1439],{"class":92},[82,1690,132],{"class":131},[82,1692,1532],{"class":92},[82,1694,186],{"class":131},[82,1696,246],{"class":245},[82,1698,1699],{"class":249},"Inversión en Publicidad vs. Ventas (Coloreado por Clima)",[82,1701,246],{"class":245},[82,1703,193],{"class":131},[82,1705,1706,1708,1710,1712,1714,1716,1719,1721],{"class":84,"line":234},[82,1707,1439],{"class":92},[82,1709,132],{"class":131},[82,1711,1552],{"class":92},[82,1713,186],{"class":131},[82,1715,246],{"class":245},[82,1717,1718],{"class":249},"Inversión ($)",[82,1720,246],{"class":245},[82,1722,193],{"class":131},[82,1724,1725,1727,1729,1731,1733,1735,1738,1740],{"class":84,"line":278},[82,1726,1439],{"class":92},[82,1728,132],{"class":131},[82,1730,1572],{"class":92},[82,1732,186],{"class":131},[82,1734,246],{"class":245},[82,1736,1737],{"class":249},"Ventas ($)",[82,1739,246],{"class":245},[82,1741,193],{"class":131},[82,1743,1744,1746,1748,1750],{"class":84,"line":289},[82,1745,1439],{"class":92},[82,1747,132],{"class":131},[82,1749,1592],{"class":92},[82,1751,873],{"class":131},[82,1753,1754],{"class":84,"line":294},[82,1755,160],{"emptyLinePlaceholder":159},[82,1757,1758],{"class":84,"line":318},[82,1759,1760],{"class":166},"# 3. El mapa de calor (Heatmap)\n",[82,1762,1763,1765,1767,1769,1771,1773,1775,1777,1779,1781],{"class":84,"line":356},[82,1764,1439],{"class":92},[82,1766,132],{"class":131},[82,1768,1444],{"class":92},[82,1770,186],{"class":131},[82,1772,1449],{"class":851},[82,1774,1452],{"class":131},[82,1776,1455],{"class":189},[82,1778,255],{"class":131},[82,1780,1002],{"class":189},[82,1782,1463],{"class":131},[82,1784,1785,1787,1789,1792,1794,1796,1798,1801,1803,1806,1808,1810,1812,1815,1817,1819,1821,1824,1826,1828,1831,1833,1835,1838,1840,1842,1845,1847],{"class":84,"line":391},[82,1786,1468],{"class":92},[82,1788,132],{"class":131},[82,1790,1791],{"class":92},"heatmap",[82,1793,186],{"class":131},[82,1795,865],{"class":92},[82,1797,132],{"class":131},[82,1799,1800],{"class":92},"corr",[82,1802,186],{"class":131},[82,1804,1805],{"class":851},"numeric_only",[82,1807,228],{"class":131},[82,1809,1507],{"class":88},[82,1811,348],{"class":131},[82,1813,1814],{"class":851}," annot",[82,1816,228],{"class":131},[82,1818,1507],{"class":88},[82,1820,255],{"class":131},[82,1822,1823],{"class":851}," cmap",[82,1825,228],{"class":131},[82,1827,246],{"class":245},[82,1829,1830],{"class":249},"YlOrBr",[82,1832,246],{"class":245},[82,1834,255],{"class":131},[82,1836,1837],{"class":851}," fmt",[82,1839,228],{"class":131},[82,1841,246],{"class":245},[82,1843,1844],{"class":249},".2f",[82,1846,246],{"class":245},[82,1848,193],{"class":131},[82,1850,1851,1853,1855,1857,1859,1861,1864,1866],{"class":84,"line":420},[82,1852,1439],{"class":92},[82,1854,132],{"class":131},[82,1856,1532],{"class":92},[82,1858,186],{"class":131},[82,1860,246],{"class":245},[82,1862,1863],{"class":249},"Correlación de Variables",[82,1865,246],{"class":245},[82,1867,193],{"class":131},[82,1869,1870,1872,1874,1876],{"class":84,"line":455},[82,1871,1439],{"class":92},[82,1873,132],{"class":131},[82,1875,1592],{"class":92},[82,1877,873],{"class":131},[11,1879,1880,1885],{},[1881,1882],"img",{"alt":1883,"src":1884},"Distribución de ventas diarias","\u002Fblog\u002Fexperimenting-with-exploratory-data-analysis\u002Fshared\u002Fsales_distribution.webp",[1886,1887,1888],"em",{},"Histograma de Ventas",[11,1890,1891,1892,1895,1896,1899,1900,1903],{},"Comencemos con el ",[39,1893,1894],{},"histograma",", que nos permite visualizar cómo se distribuyen las ventas diarias a lo largo del tiempo. En este caso, observamos que las ventas siguen una ",[39,1897,1898],{},"distribución aproximadamente normal",", con una media cercana a ",[60,1901,1902],{},"$800",". Esto significa que la mayoría de los días las ventas se concentran alrededor de ese valor promedio, y que los días con ventas muy bajas o muy altas son menos frecuentes y se distribuyen de manera relativamente simétrica a ambos lados.",[1358,1905,1906],{},[1361,1907,1908],{},"¿Por qué es importante identificar una distribución normal?",[11,1910,1911,1912,1915],{},"Porque muchos modelos estadísticos y de machine learning, como la ",[39,1913,1914],{},"regresión lineal",", el análisis de varianza o ciertos modelos probabilísticos, funcionan mejor cuando los datos (o al menos los errores del modelo) siguen una distribución normal.",[11,1917,1918],{},"Cuando esta condición se cumple:",[1358,1920,1921,1924,1927],{},[1361,1922,1923],{},"Las estimaciones tienden a ser más estables.",[1361,1925,1926],{},"Los intervalos de confianza y pruebas estadísticas son más confiables.",[1361,1928,1929],{},"El modelo no se ve excesivamente afectado por valores extremos.",[11,1931,1932,1933,1936],{},"Si los datos ",[39,1934,1935],{},"no"," siguen una distribución normal, puede ser necesario aplicar transformaciones matemáticas (como logaritmo, raíz cuadrada o Box-Cox) para estabilizar la varianza y reducir la asimetría.",[1358,1938,1939],{},[1361,1940,1941],{},"¿Qué significa \"sesgo a la derecha\" o \"sesgo a la izquierda\"?",[1358,1943,1944,1950],{},[1361,1945,1946,1949],{},[39,1947,1948],{},"Sesgo a la derecha (asimetría positiva):"," Hay una cola larga hacia valores altos. Esto indica que existen pocos días con ventas extremadamente altas.",[1361,1951,1952,1955],{},[39,1953,1954],{},"Sesgo a la izquierda (asimetría negativa):"," Hay una cola larga hacia valores bajos. Esto indica que existen pocos días con ventas inusualmente bajas.",[11,1957,1958],{},"La asimetría es importante porque los modelos sensibles a valores extremos pueden verse distorsionados.",[11,1960,1961,1962,1965,1966,1969,1970,132],{},"Supongamos que la mayoría de los días las ventas están entre ",[60,1963,1964],{},"$700"," y ",[60,1967,1968],{},"$900",", pero en tres días especiales (por ejemplo, promociones o feriados) las ventas alcanzan ",[60,1971,1972],{},"$2,500",[11,1974,1975],{},"Si entrenamos una regresión lineal directamente con esos datos:",[1358,1977,1978,1981,1984],{},[1361,1979,1980],{},"El modelo intentará ajustar una línea que también explique esos picos.",[1361,1982,1983],{},"Esto puede desplazar la pendiente o el intercepto.",[1361,1985,1986],{},"Como resultado, las predicciones para los días “normales” (que son la mayoría) podrían quedar ligeramente infladas.",[11,1988,1989],{},"En cambio, si aplicamos una transformación logarítmica antes de entrenar el modelo:",[1358,1991,1992,1995,1998],{},[1361,1993,1994],{},"Se reduce el impacto de los valores extremadamente altos.",[1361,1996,1997],{},"La distribución se vuelve más simétrica.",[1361,1999,2000],{},"El modelo aprende un patrón más representativo del comportamiento general.",[11,2002,2003,2007],{},[1881,2004],{"alt":2005,"src":2006},"Publicidad vs Ventas","\u002Fblog\u002Fexperimenting-with-exploratory-data-analysis\u002Fshared\u002Fads_vs_sales.webp",[1886,2008,2009],{},"Dispersión entre Inversión en Publicidad y Ventas",[11,2011,2012],{},"Los puntos según el clima son de diferentes colores: Azul-Soleado, Naranja-Nublado, Verde-Lluvioso",[1358,2014,2015],{},[1361,2016,2017],{},[39,2018,2019],{},"Relación principal: inversión vs. ventas",[11,2021,2022,2023,2026],{},"Lo primero que se observa es una ",[39,2024,2025],{},"tendencia positiva",":\nA medida que aumenta la inversión en publicidad, las ventas tienden a aumentar.",[11,2028,2029,2030,2033],{},"Esto indica una ",[39,2031,2032],{},"correlación positiva"," entre ambas variables. No parece una relación completamente aleatoria; los puntos muestran una pendiente ascendente general.",[11,2035,2036,2037,2040],{},"En términos de machine learning, esto sugiere que la inversión publicitaria es ",[39,2038,2039],{},"una"," variable predictora relevante para estimar ventas (no la única).",[1358,2042,2043],{},[1361,2044,2045],{},[39,2046,2047],{},"Variabilidad en las ventas",[11,2049,2050],{},"Aunque la tendencia es positiva, los puntos están bastante dispersos verticalmente.",[11,2052,2053],{},"Por ejemplo:",[11,2055,2056,2057,2060,2061,1965,2064,2067],{},"Con una inversión de ",[60,2058,2059],{},"$100",", las ventas pueden variar entre aproximadamente ",[60,2062,2063],{},"$400",[60,2065,2066],{},"$1,100"," dependiendo de otros factores.",[11,2069,2070],{},"Esto nos dice algo muy importante:",[2072,2073,2074],"blockquote",{},[11,2075,2076],{},"La inversión no explica el 100% del comportamiento de las ventas.",[11,2078,2079],{},"Existen otras variables influyendo (en este caso, sabemos que el clima es una de ellas).",[1358,2081,2082],{},[1361,2083,2084],{},[39,2085,2086],{},"Impacto del clima",[11,2088,2089],{},"Aquí es donde el gráfico se vuelve más interesante.",[11,2091,2092],{},"Observando los colores:",[1358,2094,2095,2098,2101],{},[1361,2096,2097],{},"Los puntos verdes (lluvioso) tienden a ubicarse en valores de ventas más altos.",[1361,2099,2100],{},"Los puntos azules (soleado) tienden a concentrarse en valores más bajos para el mismo nivel de inversión.",[1361,2102,2103],{},"Los naranjas (nublado) están en un punto intermedio.",[11,2105,2106,2107,132],{},"Esto sugiere que el clima actúa como una ",[39,2108,2109],{},"variable moderadora",[11,2111,2112,2113,623],{},"Por ejemplo:\nCon una inversión de ",[60,2114,2115],{},"$120",[1358,2117,2118,2124],{},[1361,2119,2120,2121],{},"Día soleado → ventas alrededor de ",[60,2122,2123],{},"$500–900",[1361,2125,2126,2127],{},"Día lluvioso → ventas alrededor de ",[60,2128,2129],{},"$700–1,200",[11,2131,2132],{},"En un modelo de regresión simple que solo use inversión, estas diferencias generarían errores grandes.",[1358,2134,2135],{},[1361,2136,2137],{},[39,2138,2139],{},"Implicación para modelado",[11,2141,2142],{},"Si entrenamos un modelo usando solo inversión:",[82,2144,2147],{"className":2145},[2146],"katex-display",[82,2148,2151,2217],{"className":2149},[2150],"katex",[82,2152,2155],{"className":2153},[2154],"katex-mathml",[2156,2157,2160],"math",{"xmlns":2158,"display":2159},"http:\u002F\u002Fwww.w3.org\u002F1998\u002FMath\u002FMathML","block",[2161,2162,2163,2212],"semantics",{},[2164,2165,2166,2170,2173,2183,2186,2192,2195],"mrow",{},[2167,2168,2169],"mtext",{},"Ventas",[2171,2172,228],"mo",{},[2174,2175,2176,2180],"msub",{},[2177,2178,2179],"mi",{},"β",[2181,2182,410],"mn",{},[2171,2184,2185],{},"+",[2174,2187,2188,2190],{},[2177,2189,2179],{},[2181,2191,1160],{},[2171,2193,2194],{},"⋅",[2164,2196,2197,2200,2210],{},[2167,2198,2199],{},"Inversi",[2201,2202,2204,2207],"mover",{"accent":2203},"true",[2167,2205,2206],{},"o",[2171,2208,2209],{},"ˊ",[2167,2211,312],{},[2213,2214,2216],"annotation",{"encoding":2215},"application\u002Fx-tex","\\text{Ventas} = \\beta_0 + \\beta_1 \\cdot \\text{Inversión}",[82,2218,2221,2250,2326,2381],{"className":2219,"ariaHidden":2203},[2220],"katex-html",[82,2222,2225,2230,2238,2243,2247],{"className":2223},[2224],"base",[82,2226],{"className":2227,"style":2229},[2228],"strut","height:0.6833em;",[82,2231,2235],{"className":2232},[2233,2234],"mord","text",[82,2236,2169],{"className":2237},[2233],[82,2239],{"className":2240,"style":2242},[2241],"mspace","margin-right:0.2778em;",[82,2244,228],{"className":2245},[2246],"mrel",[82,2248],{"className":2249,"style":2242},[2241],[82,2251,2253,2257,2315,2319,2323],{"className":2252},[2224],[82,2254],{"className":2255,"style":2256},[2228],"height:0.8889em;vertical-align:-0.1944em;",[82,2258,2260,2265],{"className":2259},[2233],[82,2261,2179],{"className":2262,"style":2264},[2233,2263],"mathnormal","margin-right:0.0528em;",[82,2266,2269],{"className":2267},[2268],"msupsub",[82,2270,2274,2306],{"className":2271},[2272,2273],"vlist-t","vlist-t2",[82,2275,2278,2301],{"className":2276},[2277],"vlist-r",[82,2279,2283],{"className":2280,"style":2282},[2281],"vlist","height:0.3011em;",[82,2284,2286,2291],{"style":2285},"top:-2.55em;margin-left:-0.0528em;margin-right:0.05em;",[82,2287],{"className":2288,"style":2290},[2289],"pstrut","height:2.7em;",[82,2292,2298],{"className":2293},[2294,2295,2296,2297],"sizing","reset-size6","size3","mtight",[82,2299,410],{"className":2300},[2233,2297],[82,2302,2305],{"className":2303},[2304],"vlist-s","​",[82,2307,2309],{"className":2308},[2277],[82,2310,2313],{"className":2311,"style":2312},[2281],"height:0.15em;",[82,2314],{},[82,2316],{"className":2317,"style":2318},[2241],"margin-right:0.2222em;",[82,2320,2185],{"className":2321},[2322],"mbin",[82,2324],{"className":2325,"style":2318},[2241],[82,2327,2329,2332,2372,2375,2378],{"className":2328},[2224],[82,2330],{"className":2331,"style":2256},[2228],[82,2333,2335,2338],{"className":2334},[2233],[82,2336,2179],{"className":2337,"style":2264},[2233,2263],[82,2339,2341],{"className":2340},[2268],[82,2342,2344,2364],{"className":2343},[2272,2273],[82,2345,2347,2361],{"className":2346},[2277],[82,2348,2350],{"className":2349,"style":2282},[2281],[82,2351,2352,2355],{"style":2285},[82,2353],{"className":2354,"style":2290},[2289],[82,2356,2358],{"className":2357},[2294,2295,2296,2297],[82,2359,1160],{"className":2360},[2233,2297],[82,2362,2305],{"className":2363},[2304],[82,2365,2367],{"className":2366},[2277],[82,2368,2370],{"className":2369,"style":2312},[2281],[82,2371],{},[82,2373],{"className":2374,"style":2318},[2241],[82,2376,2194],{"className":2377},[2322],[82,2379],{"className":2380,"style":2318},[2241],[82,2382,2384,2388],{"className":2383},[2224],[82,2385],{"className":2386,"style":2387},[2228],"height:0.6944em;",[82,2389,2391,2394,2430],{"className":2390},[2233,2234],[82,2392,2199],{"className":2393},[2233],[82,2395,2398],{"className":2396},[2233,2397],"accent",[82,2399,2401],{"className":2400},[2272],[82,2402,2404],{"className":2403},[2277],[82,2405,2407,2417],{"className":2406,"style":2387},[2281],[82,2408,2410,2414],{"style":2409},"top:-3em;",[82,2411],{"className":2412,"style":2413},[2289],"height:3em;",[82,2415,2206],{"className":2416},[2233],[82,2418,2419,2422],{"style":2409},[82,2420],{"className":2421,"style":2413},[2289],[82,2423,2427],{"className":2424,"style":2426},[2425],"accent-body","left:-0.25em;",[82,2428,2209],{"className":2429},[2233],[82,2431,312],{"className":2432},[2233],[11,2434,2435],{},"El modelo capturará la tendencia general, pero tendrá errores sistemáticos dependiendo del clima.",[11,2437,2438],{},"En cambio, si incluimos el clima como variable categórica (por ejemplo usando one-hot encoding):",[82,2440,2442],{"className":2441},[2146],[82,2443,2445,2502],{"className":2444},[2150],[82,2446,2448],{"className":2447},[2154],[2156,2449,2450],{"xmlns":2158,"display":2159},[2161,2451,2452,2499],{},[2164,2453,2454,2456,2458,2464,2466,2472,2474,2486,2488,2494,2496],{},[2167,2455,2169],{},[2171,2457,228],{},[2174,2459,2460,2462],{},[2177,2461,2179],{},[2181,2463,410],{},[2171,2465,2185],{},[2174,2467,2468,2470],{},[2177,2469,2179],{},[2181,2471,1160],{},[2171,2473,2194],{},[2164,2475,2476,2478,2484],{},[2167,2477,2199],{},[2201,2479,2480,2482],{"accent":2203},[2167,2481,2206],{},[2171,2483,2209],{},[2167,2485,312],{},[2171,2487,2185],{},[2174,2489,2490,2492],{},[2177,2491,2179],{},[2181,2493,1148],{},[2171,2495,2194],{},[2167,2497,2498],{},"Clima",[2213,2500,2501],{"encoding":2215},"\\text{Ventas} = \\beta_0 + \\beta_1 \\cdot \\text{Inversión} + \\beta_2 \\cdot \\text{Clima}",[82,2503,2505,2526,2581,2636,2692,2747],{"className":2504,"ariaHidden":2203},[2220],[82,2506,2508,2511,2517,2520,2523],{"className":2507},[2224],[82,2509],{"className":2510,"style":2229},[2228],[82,2512,2514],{"className":2513},[2233,2234],[82,2515,2169],{"className":2516},[2233],[82,2518],{"className":2519,"style":2242},[2241],[82,2521,228],{"className":2522},[2246],[82,2524],{"className":2525,"style":2242},[2241],[82,2527,2529,2532,2572,2575,2578],{"className":2528},[2224],[82,2530],{"className":2531,"style":2256},[2228],[82,2533,2535,2538],{"className":2534},[2233],[82,2536,2179],{"className":2537,"style":2264},[2233,2263],[82,2539,2541],{"className":2540},[2268],[82,2542,2544,2564],{"className":2543},[2272,2273],[82,2545,2547,2561],{"className":2546},[2277],[82,2548,2550],{"className":2549,"style":2282},[2281],[82,2551,2552,2555],{"style":2285},[82,2553],{"className":2554,"style":2290},[2289],[82,2556,2558],{"className":2557},[2294,2295,2296,2297],[82,2559,410],{"className":2560},[2233,2297],[82,2562,2305],{"className":2563},[2304],[82,2565,2567],{"className":2566},[2277],[82,2568,2570],{"className":2569,"style":2312},[2281],[82,2571],{},[82,2573],{"className":2574,"style":2318},[2241],[82,2576,2185],{"className":2577},[2322],[82,2579],{"className":2580,"style":2318},[2241],[82,2582,2584,2587,2627,2630,2633],{"className":2583},[2224],[82,2585],{"className":2586,"style":2256},[2228],[82,2588,2590,2593],{"className":2589},[2233],[82,2591,2179],{"className":2592,"style":2264},[2233,2263],[82,2594,2596],{"className":2595},[2268],[82,2597,2599,2619],{"className":2598},[2272,2273],[82,2600,2602,2616],{"className":2601},[2277],[82,2603,2605],{"className":2604,"style":2282},[2281],[82,2606,2607,2610],{"style":2285},[82,2608],{"className":2609,"style":2290},[2289],[82,2611,2613],{"className":2612},[2294,2295,2296,2297],[82,2614,1160],{"className":2615},[2233,2297],[82,2617,2305],{"className":2618},[2304],[82,2620,2622],{"className":2621},[2277],[82,2623,2625],{"className":2624,"style":2312},[2281],[82,2626],{},[82,2628],{"className":2629,"style":2318},[2241],[82,2631,2194],{"className":2632},[2322],[82,2634],{"className":2635,"style":2318},[2241],[82,2637,2639,2643,2683,2686,2689],{"className":2638},[2224],[82,2640],{"className":2641,"style":2642},[2228],"height:0.7778em;vertical-align:-0.0833em;",[82,2644,2646,2649,2680],{"className":2645},[2233,2234],[82,2647,2199],{"className":2648},[2233],[82,2650,2652],{"className":2651},[2233,2397],[82,2653,2655],{"className":2654},[2272],[82,2656,2658],{"className":2657},[2277],[82,2659,2661,2669],{"className":2660,"style":2387},[2281],[82,2662,2663,2666],{"style":2409},[82,2664],{"className":2665,"style":2413},[2289],[82,2667,2206],{"className":2668},[2233],[82,2670,2671,2674],{"style":2409},[82,2672],{"className":2673,"style":2413},[2289],[82,2675,2677],{"className":2676,"style":2426},[2425],[82,2678,2209],{"className":2679},[2233],[82,2681,312],{"className":2682},[2233],[82,2684],{"className":2685,"style":2318},[2241],[82,2687,2185],{"className":2688},[2322],[82,2690],{"className":2691,"style":2318},[2241],[82,2693,2695,2698,2738,2741,2744],{"className":2694},[2224],[82,2696],{"className":2697,"style":2256},[2228],[82,2699,2701,2704],{"className":2700},[2233],[82,2702,2179],{"className":2703,"style":2264},[2233,2263],[82,2705,2707],{"className":2706},[2268],[82,2708,2710,2730],{"className":2709},[2272,2273],[82,2711,2713,2727],{"className":2712},[2277],[82,2714,2716],{"className":2715,"style":2282},[2281],[82,2717,2718,2721],{"style":2285},[82,2719],{"className":2720,"style":2290},[2289],[82,2722,2724],{"className":2723},[2294,2295,2296,2297],[82,2725,1148],{"className":2726},[2233,2297],[82,2728,2305],{"className":2729},[2304],[82,2731,2733],{"className":2732},[2277],[82,2734,2736],{"className":2735,"style":2312},[2281],[82,2737],{},[82,2739],{"className":2740,"style":2318},[2241],[82,2742,2194],{"className":2743},[2322],[82,2745],{"className":2746,"style":2318},[2241],[82,2748,2750,2753],{"className":2749},[2224],[82,2751],{"className":2752,"style":2387},[2228],[82,2754,2756],{"className":2755},[2233,2234],[82,2757,2498],{"className":2758},[2233],[11,2760,2761],{},"El modelo podrá:",[1358,2763,2764,2767,2770],{},[1361,2765,2766],{},"Ajustar diferentes interceptos por clima (por ejemplo, un término extra para días lluviosos).",[1361,2768,2769],{},"Mejorar precisión (ya que nos permite capturar esa variabilidad adicional).",[1361,2771,2772],{},"Reducir varianza del error (porque la varianza, es decir, la dispersión de los puntos alrededor de la línea de regresión, se reduce al explicar más factores).",[11,2774,2775,2779],{},[1881,2776],{"alt":2777,"src":2778},"Matriz de Correlación Cafetería","\u002Fblog\u002Fexperimenting-with-exploratory-data-analysis\u002Fshared\u002Fcafeteria_correlation_matrix.webp",[1886,2780,2781],{},"Heatmap de Correlación",[11,2783,2784],{},"Vamos a descomponer la matriz de correlación, interpretando cada valor, pero antes recordemos qué significa cada número:",[1358,2786,2787,2793,2799],{},[1361,2788,2789,2792],{},[39,2790,2791],{},"1.00",": correlación positiva perfecta",[1361,2794,2795,2798],{},[39,2796,2797],{},"0.00",": no hay relación lineal",[1361,2800,2801,2804],{},[39,2802,2803],{},"-1.00",": correlación negativa perfecta",[11,2806,2807,2808,2811],{},"La matriz es ",[39,2809,2810],{},"simétrica",", es decir:",[73,2813,2817],{"className":2814,"code":2816,"language":2234},[2815],"language-text","Corr(A, B) = Corr(B, A)\n",[60,2818,2816],{"__ignoreMap":78},[11,2820,2821],{},"Por eso verás los mismos valores reflejados arriba y abajo de la diagonal.",[11,2823,2824,2825,2827],{},"La diagonal principal siempre es ",[39,2826,2791],{},", porque cada variable está perfectamente correlacionada consigo misma.",[11,2829,2830],{},"Las variables incluidas son:",[1358,2832,2833,2838,2843,2848,2853],{},[1361,2834,2835],{},[60,2836,2837],{},"temperature_c",[1361,2839,2840],{},[60,2841,2842],{},"ad_investment",[1361,2844,2845],{},[60,2846,2847],{},"local_event",[1361,2849,2850],{},[60,2851,2852],{},"discount",[1361,2854,2855],{},[60,2856,2857],{},"daily_sales",[1405,2859,2860],{},[1361,2861,2862,2864],{},[60,2863,2837],{},": Temperatura en grados Celsius.",[1358,2866,2867,2873,2880,2887,2894],{},[1361,2868,2869,2870,2872],{},"temperature_c - temperature_c = ",[39,2871,2791],{},"\nPerfecta correlación consigo misma.",[1361,2874,2875,2876,2879],{},"temperature_c - ad_investment = ",[39,2877,2878],{},"-0.03","\nRelación prácticamente inexistente.\nLa temperatura no influye en cuánto se invierte en publicidad.",[1361,2881,2882,2883,2886],{},"temperature_c - local_event = ",[39,2884,2885],{},"0.05","\nCorrelación muy débil positiva.\nLos eventos locales no dependen realmente del clima en este dataset.",[1361,2888,2889,2890,2893],{},"temperature_c - discount = ",[39,2891,2892],{},"0.04","\nSin relación relevante.\nLos descuentos no parecen aplicarse según temperatura.",[1361,2895,2896,2897,2900,2901,2904,2905,2913,2915],{},"temperature_c - daily_sales = ",[39,2898,2899],{},"-0.24","\nCorrelación negativa débil-moderada.\nCuando la temperatura aumenta, las ventas tienden a bajar ligeramente.",[2902,2903],"br",{},"Esto puede indicar:",[1358,2906,2907,2910],{},[1361,2908,2909],{},"El negocio vende productos que se consumen más en clima fresco.",[1361,2911,2912],{},"En días muy calurosos hay menos afluencia.",[2902,2914],{},"No es una relación fuerte, pero sí consistente.",[1405,2917,2918],{"start":102},[1361,2919,2920,2922],{},[60,2921,2842],{},": Inversión en publicidad.",[1358,2924,2925,2930,2937,2943],{},[1361,2926,2927,2928],{},"ad_investment - ad_investment = ",[39,2929,2791],{},[1361,2931,2932,2933,2936],{},"ad_investment - local_event = ",[39,2934,2935],{},"-0.05","\nPrácticamente independencia.\nLa inversión publicitaria no depende directamente de si hay evento.",[1361,2938,2939,2940,2942],{},"ad_investment - discount = ",[39,2941,2878],{},"\nSin relación.\nInversión y descuentos parecen decisiones separadas.",[1361,2944,2945,2946,2949,2950,2952,2953,2964,2966],{},"ad_investment - daily_sales = ",[39,2947,2948],{},"0.47","\nCorrelación positiva moderada.",[2902,2951],{},"Esto significa:",[1358,2954,2955,2958,2961],{},[1361,2956,2957],{},"A mayor inversión, mayores ventas.",[1361,2959,2960],{},"La relación es significativa, pero no perfecta.",[1361,2962,2963],{},"Hay otros factores influyendo.",[2902,2965],{},"Estadísticamente, es un predictor importante.",[1405,2968,2969],{"start":115},[1361,2970,2971,2973],{},[60,2972,2847],{},": Evento local.",[1358,2975,2976,2981,2988],{},[1361,2977,2978,2979],{},"local_event - local_event = ",[39,2980,2791],{},[1361,2982,2983,2984,2987],{},"local_event - discount = ",[39,2985,2986],{},"-0.06","\nRelación casi nula.\nNo parece que los eventos impliquen necesariamente descuentos.",[1361,2989,2990,2991,2994,2995,2997,2998,3009,3011],{},"local_event - daily_sales = ",[39,2992,2993],{},"0.57","\nEs la correlación más alta con ventas.",[2902,2996],{},"Interpretación:",[1358,2999,3000,3003,3006],{},[1361,3001,3002],{},"Cuando hay evento local, las ventas aumentan notablemente.",[1361,3004,3005],{},"Es el factor más influyente del dataset.",[1361,3007,3008],{},"Representa una variable clave para el modelo.",[2902,3010],{},"En términos prácticos:\nLos eventos generan tráfico o demanda adicional.",[1405,3013,3014],{"start":123},[1361,3015,3016,3018],{},[60,3017,2852],{},": Descuento.",[1358,3020,3021,3026],{},[1361,3022,3023,3024],{},"discount - discount = ",[39,3025,2791],{},[1361,3027,3028,3029,3032,3033,3035,3036,3044,3046,3047],{},"discount - daily_sales = ",[39,3030,3031],{},"0.13","\nCorrelación positiva débil.",[2902,3034],{},"Significa:",[1358,3037,3038,3041],{},[1361,3039,3040],{},"Los descuentos tienen un impacto pequeño.",[1361,3042,3043],{},"No parecen ser el motor principal de ventas.",[2902,3045],{},"Posibles explicaciones:",[1358,3048,3049,3052,3055],{},[1361,3050,3051],{},"Descuentos bajos",[1361,3053,3054],{},"Mala estrategia",[1361,3056,3057],{},"O efecto condicionado a otras variables",[1405,3059,3060],{"start":143},[1361,3061,3062,3064],{},[60,3063,2857],{},": Ventas diarias.",[11,3066,3067],{},"Ya interpretamos todas sus correlaciones con las demás variables:",[3069,3070,3071,3084],"table",{},[3072,3073,3074],"thead",{},[3075,3076,3077,3081],"tr",{},[3078,3079,3080],"th",{},"Variable",[3078,3082,3083],{},"Correlación",[3085,3086,3087,3094,3100,3106],"tbody",{},[3075,3088,3089,3092],{},[3090,3091,2837],"td",{},[3090,3093,2899],{},[3075,3095,3096,3098],{},[3090,3097,2842],{},[3090,3099,2948],{},[3075,3101,3102,3104],{},[3090,3103,2847],{},[3090,3105,2993],{},[3075,3107,3108,3110],{},[3090,3109,2852],{},[3090,3111,3031],{},[11,3113,3114],{},"Ordenadas por impacto lineal:",[1405,3116,3117,3120,3123,3126],{},[1361,3118,3119],{},"local_event (0.57)",[1361,3121,3122],{},"ad_investment (0.47)",[1361,3124,3125],{},"temperature_c (-0.24)",[1361,3127,3128],{},"discount (0.13)",[11,3130,3131],{},[39,3132,3133],{},"¿Qué nos dice esto a nivel de modelado?",[11,3135,3136],{},"Lo primero es que las variables más predictivas para estimar ventas son:",[1358,3138,3139,3141],{},[1361,3140,2847],{},[1361,3142,2842],{},[11,3144,3145],{},"Ambas deberían incluirse en el modelo.",[11,3147,3148],{},"Luego tenemos la multicolinealidad",[11,3150,3151],{},"Observamos que:",[1358,3153,3154,3157],{},[1361,3155,3156],{},"Ninguna variable independiente tiene correlación alta con otra.",[1361,3158,3159],{},"Todos los valores entre predictores están cerca de 0.",[11,3161,3162],{},"Esto es excelente porque significa que no hay redundancia fuerte y que cada variable aporta información distinta.",[11,3164,3165],{},"Si tuviesemos valores cercanos a 1 o -1 entre predictores (por ejemplo, ad_investment y local_event), tendríamos que considerar eliminar o combinar variables para evitar problemas de multicolinealidad.",[11,3167,3168],{},"Asi que con todo esto podemos concluir:",[1358,3170,3171,3174,3177,3180,3183,3186],{},[1361,3172,3173],{},"El principal motor de ventas son los eventos locales.",[1361,3175,3176],{},"La inversión publicitaria tiene un impacto claro y consistente.",[1361,3178,3179],{},"La temperatura afecta ligeramente de forma negativa.",[1361,3181,3182],{},"Los descuentos tienen impacto bajo.",[1361,3184,3185],{},"No hay multicolinealidad problemática.",[1361,3187,3188],{},"El dataset es apto para un modelo de regresión múltiple.",[2072,3190,3191,3194],{},[11,3192,3193],{},"Con esta información, un gerente de la cafetería podría tomar decisiones estratégicas como:",[1358,3195,3196,3199,3202,3205],{},[1361,3197,3198],{},"Prioriza campañas durante eventos locales.",[1361,3200,3201],{},"Mantén inversión publicitaria constante.",[1361,3203,3204],{},"Reevaluar estrategia de descuentos.",[1361,3206,3207],{},"Considerar estrategias específicas para días calurosos.",[52,3209,3211],{"id":3210},"paso-4-de-los-datos-a-la-predicción-modelado","Paso 4: De los Datos a la Predicción (Modelado)",[11,3213,3214,3215,132],{},"Con el EDA completado, transformamos el clima a un formato binario y alimentamos a un modelo de ",[1886,3216,3217],{},"Regresión Lineal Simple",[73,3219,3221],{"className":75,"code":3220,"language":77,"meta":78,"style":78},"from sklearn.model_selection import train_test_split\nfrom sklearn.linear_model import LinearRegression\nfrom sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score\n\n# One-Hot Encoding: Convierte \"Soleado\" o \"Lluvioso\" en columnas de 0s y 1s\ndf_encoded = pd.get_dummies(df, columns=[\"clima\"])\nX = df_encoded.drop(\"ventas_diarias\", axis=1)\ny = df_encoded[\"ventas_diarias\"]\n\n# Dividimos: 80% para que el modelo aprenda, 20% para examinarlo después\nX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n\nmodelo_cafeteria = LinearRegression()\nmodelo_cafeteria.fit(X_train, y_train)\n\n# Hacemos predicciones con el modelo entrenado\npredicciones = modelo_cafeteria.predict(X_test)\n",[60,3222,3223,3241,3257,3283,3287,3292,3325,3359,3378,3382,3387,3442,3446,3458,3478,3482,3487],{"__ignoreMap":78},[82,3224,3225,3228,3231,3233,3236,3238],{"class":84,"line":85},[82,3226,3227],{"class":88},"from",[82,3229,3230],{"class":92}," sklearn",[82,3232,132],{"class":131},[82,3234,3235],{"class":92},"model_selection ",[82,3237,89],{"class":88},[82,3239,3240],{"class":92}," train_test_split\n",[82,3242,3243,3245,3247,3249,3252,3254],{"class":84,"line":102},[82,3244,3227],{"class":88},[82,3246,3230],{"class":92},[82,3248,132],{"class":131},[82,3250,3251],{"class":92},"linear_model ",[82,3253,89],{"class":88},[82,3255,3256],{"class":92}," LinearRegression\n",[82,3258,3259,3261,3263,3265,3268,3270,3273,3275,3278,3280],{"class":84,"line":115},[82,3260,3227],{"class":88},[82,3262,3230],{"class":92},[82,3264,132],{"class":131},[82,3266,3267],{"class":92},"metrics ",[82,3269,89],{"class":88},[82,3271,3272],{"class":92}," mean_absolute_error",[82,3274,255],{"class":131},[82,3276,3277],{"class":92}," mean_squared_error",[82,3279,255],{"class":131},[82,3281,3282],{"class":92}," r2_score\n",[82,3284,3285],{"class":84,"line":123},[82,3286,160],{"emptyLinePlaceholder":159},[82,3288,3289],{"class":84,"line":143},[82,3290,3291],{"class":166},"# One-Hot Encoding: Convierte \"Soleado\" o \"Lluvioso\" en columnas de 0s y 1s\n",[82,3293,3294,3297,3299,3301,3303,3306,3308,3310,3312,3314,3317,3319,3321,3323],{"class":84,"line":156},[82,3295,3296],{"class":92},"df_encoded ",[82,3298,228],{"class":131},[82,3300,836],{"class":92},[82,3302,132],{"class":131},[82,3304,3305],{"class":92},"get_dummies",[82,3307,186],{"class":131},[82,3309,865],{"class":92},[82,3311,255],{"class":131},[82,3313,852],{"class":851},[82,3315,3316],{"class":131},"=[",[82,3318,246],{"class":245},[82,3320,812],{"class":249},[82,3322,246],{"class":245},[82,3324,417],{"class":131},[82,3326,3327,3330,3332,3335,3337,3340,3342,3344,3346,3348,3350,3353,3355,3357],{"class":84,"line":163},[82,3328,3329],{"class":92},"X ",[82,3331,228],{"class":131},[82,3333,3334],{"class":92}," df_encoded",[82,3336,132],{"class":131},[82,3338,3339],{"class":92},"drop",[82,3341,186],{"class":131},[82,3343,246],{"class":245},[82,3345,821],{"class":249},[82,3347,246],{"class":245},[82,3349,255],{"class":131},[82,3351,3352],{"class":851}," axis",[82,3354,228],{"class":131},[82,3356,1160],{"class":189},[82,3358,193],{"class":131},[82,3360,3361,3364,3366,3368,3370,3372,3374,3376],{"class":84,"line":170},[82,3362,3363],{"class":92},"y ",[82,3365,228],{"class":131},[82,3367,3334],{"class":92},[82,3369,1480],{"class":131},[82,3371,246],{"class":245},[82,3373,821],{"class":249},[82,3375,246],{"class":245},[82,3377,275],{"class":131},[82,3379,3380],{"class":84,"line":196},[82,3381,160],{"emptyLinePlaceholder":159},[82,3383,3384],{"class":84,"line":211},[82,3385,3386],{"class":166},"# Dividimos: 80% para que el modelo aprenda, 20% para examinarlo después\n",[82,3388,3389,3392,3394,3397,3399,3402,3404,3407,3409,3412,3414,3417,3419,3421,3423,3426,3428,3431,3433,3436,3438,3440],{"class":84,"line":216},[82,3390,3391],{"class":92},"X_train",[82,3393,255],{"class":131},[82,3395,3396],{"class":92}," X_test",[82,3398,255],{"class":131},[82,3400,3401],{"class":92}," y_train",[82,3403,255],{"class":131},[82,3405,3406],{"class":92}," y_test ",[82,3408,228],{"class":131},[82,3410,3411],{"class":92}," train_test_split",[82,3413,186],{"class":131},[82,3415,3416],{"class":92},"X",[82,3418,255],{"class":131},[82,3420,1652],{"class":92},[82,3422,255],{"class":131},[82,3424,3425],{"class":851}," test_size",[82,3427,228],{"class":131},[82,3429,3430],{"class":189},"0.2",[82,3432,255],{"class":131},[82,3434,3435],{"class":851}," random_state",[82,3437,228],{"class":131},[82,3439,190],{"class":189},[82,3441,193],{"class":131},[82,3443,3444],{"class":84,"line":222},[82,3445,160],{"emptyLinePlaceholder":159},[82,3447,3448,3451,3453,3456],{"class":84,"line":234},[82,3449,3450],{"class":92},"modelo_cafeteria ",[82,3452,228],{"class":131},[82,3454,3455],{"class":92}," LinearRegression",[82,3457,873],{"class":131},[82,3459,3460,3463,3465,3468,3470,3472,3474,3476],{"class":84,"line":278},[82,3461,3462],{"class":92},"modelo_cafeteria",[82,3464,132],{"class":131},[82,3466,3467],{"class":92},"fit",[82,3469,186],{"class":131},[82,3471,3391],{"class":92},[82,3473,255],{"class":131},[82,3475,3401],{"class":92},[82,3477,193],{"class":131},[82,3479,3480],{"class":84,"line":289},[82,3481,160],{"emptyLinePlaceholder":159},[82,3483,3484],{"class":84,"line":294},[82,3485,3486],{"class":166},"# Hacemos predicciones con el modelo entrenado\n",[82,3488,3489,3492,3494,3497,3499,3502,3504,3507],{"class":84,"line":318},[82,3490,3491],{"class":92},"predicciones ",[82,3493,228],{"class":131},[82,3495,3496],{"class":92}," modelo_cafeteria",[82,3498,132],{"class":131},[82,3500,3501],{"class":92},"predict",[82,3503,186],{"class":131},[82,3505,3506],{"class":92},"X_test",[82,3508,193],{"class":131},[52,3510,3512],{"id":3511},"paso-5-calificando-al-modelo","Paso 5: Calificando al Modelo",[11,3514,3515],{},"Ahora evaluemos que tan \"certero\" es nuestro algoritmo comparando las ventas contra sus predicciones.",[73,3517,3519],{"className":75,"code":3518,"language":77,"meta":78,"style":78},"mae = mean_absolute_error(y_test, predicciones)\nrmse = np.sqrt(mean_squared_error(y_test, predicciones))\nr2 = r2_score(y_test, predicciones)\n\nprint(f\"MAE: ${mae:.2f}\")\nprint(f\"RMSE: ${rmse:.2f}\")\nprint(f\"R^2: {r2:.2f}\")\n",[60,3520,3521,3542,3571,3591,3595,3623,3647],{"__ignoreMap":78},[82,3522,3523,3526,3528,3530,3532,3535,3537,3540],{"class":84,"line":85},[82,3524,3525],{"class":92},"mae ",[82,3527,228],{"class":131},[82,3529,3272],{"class":92},[82,3531,186],{"class":131},[82,3533,3534],{"class":92},"y_test",[82,3536,255],{"class":131},[82,3538,3539],{"class":92}," predicciones",[82,3541,193],{"class":131},[82,3543,3544,3547,3549,3551,3553,3556,3558,3561,3563,3565,3567,3569],{"class":84,"line":102},[82,3545,3546],{"class":92},"rmse ",[82,3548,228],{"class":131},[82,3550,679],{"class":92},[82,3552,132],{"class":131},[82,3554,3555],{"class":92},"sqrt",[82,3557,186],{"class":131},[82,3559,3560],{"class":92},"mean_squared_error",[82,3562,186],{"class":131},[82,3564,3534],{"class":92},[82,3566,255],{"class":131},[82,3568,3539],{"class":92},[82,3570,1463],{"class":131},[82,3572,3573,3576,3578,3581,3583,3585,3587,3589],{"class":84,"line":115},[82,3574,3575],{"class":92},"r2 ",[82,3577,228],{"class":131},[82,3579,3580],{"class":92}," r2_score",[82,3582,186],{"class":131},[82,3584,3534],{"class":92},[82,3586,255],{"class":131},[82,3588,3539],{"class":92},[82,3590,193],{"class":131},[82,3592,3593],{"class":84,"line":123},[82,3594,160],{"emptyLinePlaceholder":159},[82,3596,3597,3599,3601,3604,3607,3610,3613,3616,3619,3621],{"class":84,"line":143},[82,3598,903],{"class":306},[82,3600,186],{"class":131},[82,3602,3603],{"class":511},"f",[82,3605,3606],{"class":249},"\"MAE: $",[82,3608,3609],{"class":1019},"{",[82,3611,3612],{"class":92},"mae",[82,3614,3615],{"class":511},":.2f",[82,3617,3618],{"class":1019},"}",[82,3620,246],{"class":249},[82,3622,193],{"class":131},[82,3624,3625,3627,3629,3631,3634,3636,3639,3641,3643,3645],{"class":84,"line":156},[82,3626,903],{"class":306},[82,3628,186],{"class":131},[82,3630,3603],{"class":511},[82,3632,3633],{"class":249},"\"RMSE: $",[82,3635,3609],{"class":1019},[82,3637,3638],{"class":92},"rmse",[82,3640,3615],{"class":511},[82,3642,3618],{"class":1019},[82,3644,246],{"class":249},[82,3646,193],{"class":131},[82,3648,3649,3651,3653,3655,3658,3660,3663,3665,3667,3669],{"class":84,"line":163},[82,3650,903],{"class":306},[82,3652,186],{"class":131},[82,3654,3603],{"class":511},[82,3656,3657],{"class":249},"\"R^2: ",[82,3659,3609],{"class":1019},[82,3661,3662],{"class":92},"r2",[82,3664,3615],{"class":511},[82,3666,3618],{"class":1019},[82,3668,246],{"class":249},[82,3670,193],{"class":131},[11,3672,3673],{},"Dando como resultado:",[11,3675,3676,3677],{},"MAE: ",[60,3678,3679],{},"$55.39",[11,3681,3682,3683],{},"RMSE: ",[60,3684,3685],{},"$74.51",[11,3687,3688,3752],{},[82,3689,3691,3711],{"className":3690},[2150],[82,3692,3694],{"className":3693},[2154],[2156,3695,3696],{"xmlns":2158},[2161,3697,3698,3708],{},[2164,3699,3700],{},[3701,3702,3703,3706],"msup",{},[2177,3704,3705],{},"R",[2181,3707,1148],{},[2213,3709,3710],{"encoding":2215},"R^2",[82,3712,3714],{"className":3713,"ariaHidden":2203},[2220],[82,3715,3717,3721],{"className":3716},[2224],[82,3718],{"className":3719,"style":3720},[2228],"height:0.8141em;",[82,3722,3724,3728],{"className":3723},[2233],[82,3725,3705],{"className":3726,"style":3727},[2233,2263],"margin-right:0.0077em;",[82,3729,3731],{"className":3730},[2268],[82,3732,3734],{"className":3733},[2272],[82,3735,3737],{"className":3736},[2277],[82,3738,3740],{"className":3739,"style":3720},[2281],[82,3741,3743,3746],{"style":3742},"top:-3.063em;margin-right:0.05em;",[82,3744],{"className":3745,"style":2290},[2289],[82,3747,3749],{"className":3748},[2294,2295,2296,2297],[82,3750,1148],{"className":3751},[2233,2297],": 0.88",[11,3754,3755],{},"¿Qué significan estos números?",[1358,3757,3758,3767,3776],{},[1361,3759,3760,3763,3764,3766],{},[39,3761,3762],{},"MAE (Error Absoluto Medio)",": En promedio, nuestras predicciones se desvían de las ventas reales por aproximadamente ",[60,3765,3679],{},". Esto nos da una idea de la magnitud del error en términos monetarios.",[1361,3768,3769,3772,3773,3775],{},[39,3770,3771],{},"RMSE (Error Cuadrático Medio)",": Al penalizar más los errores grandeses, el RMSE de ",[60,3774,3685],{}," indica que, aunque la mayoría de las predicciones están cerca, hay algunos casos donde el modelo se equivoca más significativamente.",[1361,3777,3778,3839,3840,3898],{},[39,3779,3780,3838],{},[82,3781,3783,3800],{"className":3782},[2150],[82,3784,3786],{"className":3785},[2154],[2156,3787,3788],{"xmlns":2158},[2161,3789,3790,3798],{},[2164,3791,3792],{},[3701,3793,3794,3796],{},[2177,3795,3705],{},[2181,3797,1148],{},[2213,3799,3710],{"encoding":2215},[82,3801,3803],{"className":3802,"ariaHidden":2203},[2220],[82,3804,3806,3809],{"className":3805},[2224],[82,3807],{"className":3808,"style":3720},[2228],[82,3810,3812,3815],{"className":3811},[2233],[82,3813,3705],{"className":3814,"style":3727},[2233,2263],[82,3816,3818],{"className":3817},[2268],[82,3819,3821],{"className":3820},[2272],[82,3822,3824],{"className":3823},[2277],[82,3825,3827],{"className":3826,"style":3720},[2281],[82,3828,3829,3832],{"style":3742},[82,3830],{"className":3831,"style":2290},[2289],[82,3833,3835],{"className":3834},[2294,2295,2296,2297],[82,3836,1148],{"className":3837},[2233,2297]," (Puntuación de Determinación)",": Un ",[82,3841,3843,3860],{"className":3842},[2150],[82,3844,3846],{"className":3845},[2154],[2156,3847,3848],{"xmlns":2158},[2161,3849,3850,3858],{},[2164,3851,3852],{},[3701,3853,3854,3856],{},[2177,3855,3705],{},[2181,3857,1148],{},[2213,3859,3710],{"encoding":2215},[82,3861,3863],{"className":3862,"ariaHidden":2203},[2220],[82,3864,3866,3869],{"className":3865},[2224],[82,3867],{"className":3868,"style":3720},[2228],[82,3870,3872,3875],{"className":3871},[2233],[82,3873,3705],{"className":3874,"style":3727},[2233,2263],[82,3876,3878],{"className":3877},[2268],[82,3879,3881],{"className":3880},[2272],[82,3882,3884],{"className":3883},[2277],[82,3885,3887],{"className":3886,"style":3720},[2281],[82,3888,3889,3892],{"style":3742},[82,3890],{"className":3891,"style":2290},[2289],[82,3893,3895],{"className":3894},[2294,2295,2296,2297],[82,3896,1148],{"className":3897},[2233,2297]," de 0.88 significa que el modelo explica el 88% de la variabilidad en las ventas diarias. Esto es un resultado bastante bueno, indicando que el modelo captura la mayoría de los patrones presentes en los datos.",[11,3900,3901],{},[39,3902,3903],{},"Grafico de Predicciones vs Realidad",[73,3905,3907],{"className":75,"code":3906,"language":77,"meta":78,"style":78},"plt.figure(figsize=(8,5))\nsns.scatterplot(x=y_test, y=predictions)\nplt.plot([y.min(), y.max()], [y.min(), y.max()], 'r--')  # Perfect reference line\nplt.title(\"Predictions vs Actual Sales\")\nplt.xlabel(\"Actual Sales ($)\")\nplt.ylabel(\"Model Predictions ($)\")\nplt.show()\n",[60,3908,3909,3931,3958,4019,4038,4057,4076],{"__ignoreMap":78},[82,3910,3911,3913,3915,3917,3919,3921,3923,3925,3927,3929],{"class":84,"line":85},[82,3912,1439],{"class":92},[82,3914,132],{"class":131},[82,3916,1444],{"class":92},[82,3918,186],{"class":131},[82,3920,1449],{"class":851},[82,3922,1452],{"class":131},[82,3924,1455],{"class":189},[82,3926,255],{"class":131},[82,3928,1460],{"class":189},[82,3930,1463],{"class":131},[82,3932,3933,3935,3937,3939,3941,3943,3945,3947,3949,3951,3953,3956],{"class":84,"line":102},[82,3934,1468],{"class":92},[82,3936,132],{"class":131},[82,3938,1634],{"class":92},[82,3940,186],{"class":131},[82,3942,1639],{"class":851},[82,3944,228],{"class":131},[82,3946,3534],{"class":92},[82,3948,255],{"class":131},[82,3950,1652],{"class":851},[82,3952,228],{"class":131},[82,3954,3955],{"class":92},"predictions",[82,3957,193],{"class":131},[82,3959,3960,3962,3964,3967,3969,3972,3974,3976,3979,3981,3983,3985,3988,3990,3992,3994,3996,3998,4000,4002,4004,4006,4009,4012,4014,4016],{"class":84,"line":115},[82,3961,1439],{"class":92},[82,3963,132],{"class":131},[82,3965,3966],{"class":92},"plot",[82,3968,407],{"class":131},[82,3970,3971],{"class":92},"y",[82,3973,132],{"class":131},[82,3975,1262],{"class":92},[82,3977,3978],{"class":131},"(),",[82,3980,1652],{"class":92},[82,3982,132],{"class":131},[82,3984,1340],{"class":92},[82,3986,3987],{"class":131},"()],",[82,3989,242],{"class":131},[82,3991,3971],{"class":92},[82,3993,132],{"class":131},[82,3995,1262],{"class":92},[82,3997,3978],{"class":131},[82,3999,1652],{"class":92},[82,4001,132],{"class":131},[82,4003,1340],{"class":92},[82,4005,3987],{"class":131},[82,4007,4008],{"class":245}," '",[82,4010,4011],{"class":249},"r--",[82,4013,960],{"class":245},[82,4015,533],{"class":131},[82,4017,4018],{"class":166},"  # Perfect reference line\n",[82,4020,4021,4023,4025,4027,4029,4031,4034,4036],{"class":84,"line":123},[82,4022,1439],{"class":92},[82,4024,132],{"class":131},[82,4026,1532],{"class":92},[82,4028,186],{"class":131},[82,4030,246],{"class":245},[82,4032,4033],{"class":249},"Predictions vs Actual Sales",[82,4035,246],{"class":245},[82,4037,193],{"class":131},[82,4039,4040,4042,4044,4046,4048,4050,4053,4055],{"class":84,"line":143},[82,4041,1439],{"class":92},[82,4043,132],{"class":131},[82,4045,1552],{"class":92},[82,4047,186],{"class":131},[82,4049,246],{"class":245},[82,4051,4052],{"class":249},"Actual Sales ($)",[82,4054,246],{"class":245},[82,4056,193],{"class":131},[82,4058,4059,4061,4063,4065,4067,4069,4072,4074],{"class":84,"line":156},[82,4060,1439],{"class":92},[82,4062,132],{"class":131},[82,4064,1572],{"class":92},[82,4066,186],{"class":131},[82,4068,246],{"class":245},[82,4070,4071],{"class":249},"Model Predictions ($)",[82,4073,246],{"class":245},[82,4075,193],{"class":131},[82,4077,4078,4080,4082,4084],{"class":84,"line":163},[82,4079,1439],{"class":92},[82,4081,132],{"class":131},[82,4083,1592],{"class":92},[82,4085,873],{"class":131},[11,4087,4088,4092],{},[1881,4089],{"alt":4090,"src":4091},"Predicciones vs Realidad","\u002Fblog\u002Fexperimenting-with-exploratory-data-analysis\u002Fshared\u002Fpredictions_vs_actual_sales.webp",[1886,4093,4094],{},"Gráfico de Predicciones vs Ventas Reales",[11,4096,4097],{},"Como se observa, tenemos una línea de referencia (en rojo) que representa la perfección: si todas las ventas estuvieran exactamente en esa línea, el modelo sería perfecto, pero la realidad nunca será asi de ideal. Aún así, la mayoría de los puntos se agrupan alrededor de esa línea, lo que indica que el modelo tiene un buen desempeño general. Algunos puntos se alejan más, lo que refleja los casos donde el modelo no predice tan bien, posiblemente debido a factores no capturados en el dataset o a la variabilidad inherente en las ventas diarias.",[11,4099,4100],{},"Podemos también obtener los coeficientes del modelo para entender la importancia de cada variable:",[73,4102,4104],{"className":75,"code":4103,"language":77,"meta":78,"style":78},"coeficientes = pd.DataFrame({\n    'Variable': X.columns,\n    'Coeficiente': modelo_cafeteria.coef_\n})\ndisplay(coeficientes.sort_values(by='Coeficiente', ascending=False))\n",[60,4105,4106,4122,4143,4161,4166],{"__ignoreMap":78},[82,4107,4108,4111,4113,4115,4117,4119],{"class":84,"line":85},[82,4109,4110],{"class":92},"coeficientes ",[82,4112,228],{"class":131},[82,4114,836],{"class":92},[82,4116,132],{"class":131},[82,4118,841],{"class":92},[82,4120,4121],{"class":131},"({\n",[82,4123,4124,4127,4129,4131,4133,4136,4138,4140],{"class":84,"line":102},[82,4125,4126],{"class":245},"    '",[82,4128,3080],{"class":249},[82,4130,960],{"class":245},[82,4132,623],{"class":131},[82,4134,4135],{"class":92}," X",[82,4137,132],{"class":131},[82,4139,857],{"class":92},[82,4141,4142],{"class":131},",\n",[82,4144,4145,4147,4150,4152,4154,4156,4158],{"class":84,"line":115},[82,4146,4126],{"class":245},[82,4148,4149],{"class":249},"Coeficiente",[82,4151,960],{"class":245},[82,4153,623],{"class":131},[82,4155,3496],{"class":92},[82,4157,132],{"class":131},[82,4159,4160],{"class":92},"coef_\n",[82,4162,4163],{"class":84,"line":123},[82,4164,4165],{"class":131},"})\n",[82,4167,4168,4171,4173,4176,4178,4181,4183,4186,4188,4190,4192,4194,4196,4199,4201,4204],{"class":84,"line":143},[82,4169,4170],{"class":92},"display",[82,4172,186],{"class":131},[82,4174,4175],{"class":92},"coeficientes",[82,4177,132],{"class":131},[82,4179,4180],{"class":92},"sort_values",[82,4182,186],{"class":131},[82,4184,4185],{"class":851},"by",[82,4187,228],{"class":131},[82,4189,960],{"class":245},[82,4191,4149],{"class":249},[82,4193,960],{"class":245},[82,4195,255],{"class":131},[82,4197,4198],{"class":851}," ascending",[82,4200,228],{"class":131},[82,4202,4203],{"class":88},"False",[82,4205,1463],{"class":131},[11,4207,4208],{},"Esto nos arroja el siguiente resultado:",[3069,4210,4211,4221],{},[3072,4212,4213],{},[3075,4214,4215,4218],{},[3078,4216,4217],{},"Feature",[3078,4219,4220],{},"Coefficient",[3085,4222,4223,4230,4238,4245,4252,4259,4267],{},[3075,4224,4225,4227],{},[3090,4226,2847],{},[3090,4228,4229],{},"261.839739",[3075,4231,4232,4235],{},[3090,4233,4234],{},"weather_Rainy",[3090,4236,4237],{},"124.573377",[3075,4239,4240,4242],{},[3090,4241,2852],{},[3090,4243,4244],{},"4.837618",[3075,4246,4247,4249],{},[3090,4248,2842],{},[3090,4250,4251],{},"2.482678",[3075,4253,4254,4256],{},[3090,4255,2837],{},[3090,4257,4258],{},"-8.578684",[3075,4260,4261,4264],{},[3090,4262,4263],{},"weather_Cloudy",[3090,4265,4266],{},"-28.151991",[3075,4268,4269,4272],{},[3090,4270,4271],{},"weather_Sunny",[3090,4273,4274],{},"-96.421386",[11,4276,4277],{},"Lo que nos dice cada coeficiente es el impacto que tiene esa variable en las ventas diarias, manteniendo las demás constantes. Por ejemplo:",[1358,4279,4280,4286,4292,4299,4305,4311,4317],{},[1361,4281,4282,4283,132],{},"Un evento local (local_event) aumenta las ventas en aproximadamente ",[60,4284,4285],{},"$261.84",[1361,4287,4288,4289,132],{},"Un día lluvioso (weather_Rainy) aumenta las ventas en aproximadamente ",[60,4290,4291],{},"$124.57",[1361,4293,4294,4295,4298],{},"Un descuento (discount) aumenta las ventas en aproximadamente ",[60,4296,4297],{},"$4.84"," por cada punto porcentual de descuento.",[1361,4300,4301,4302,132],{},"Cada dólar adicional invertido en publicidad (ad_investment) aumenta las ventas en aproximadamente ",[60,4303,4304],{},"$2.48",[1361,4306,4307,4308],{},"Cada grado Celsius adicional (temperature_c) disminuye las ventas en aproximadamente ",[60,4309,4310],{},"$8.58",[1361,4312,4313,4314,132],{},"Un día nublado (weather_Cloudy) disminuye las ventas en aproximadamente ",[60,4315,4316],{},"$28.15",[1361,4318,4319,4320,132],{},"Un día soleado (weather_Sunny) disminuye las ventas en aproximadamente ",[60,4321,4322],{},"$96.42",[11,4324,4325],{},"¿Qué mejoras podemos hacer al modelo?",[1358,4327,4328,4345,4351,4360,4366],{},[1361,4329,4330,4333,4334,1965,4336,4338,4339,1965,4341,4344],{},[39,4331,4332],{},"Feature Engineering",": Explorar la creación de nuevas características a partir de las existentes. Por ejemplo, los términos de interacción entre ",[60,4335,2842],{},[60,4337,2852],{},", o ",[60,4340,2837],{},[60,4342,4343],{},"weather",", podrían capturar relaciones más complejas.",[1361,4346,4347,4350],{},[39,4348,4349],{},"Relaciones no lineales",": El modelo actual es lineal. Si los diagramas de dispersión sugieren relaciones no lineales (p. ej., ventas que alcanzan su máximo a cierta temperatura y luego disminuyen), las características polinómicas u otros modelos no lineales (como Random Forest o Gradient Boosting) podrían capturarlas mejor.",[1361,4352,4353,4356,4357,4359],{},[39,4354,4355],{},"Aspectos de series temporales",": Dado que los datos son de ventas diarias, podría haber patrones temporales (p. ej., efectos del día de la semana, estacionalidad no capturada completamente por ",[60,4358,4343],{},"). Incorporar características como el día de la semana, el mes o utilizar modelos específicos para series temporales podría ser beneficioso.",[1361,4361,4362,4365],{},[39,4363,4364],{},"Detección de valores atípicos",": Investigar cualquier valor atípico potencial en los datos que pueda estar influyendo desproporcionadamente en los coeficientes y predicciones del modelo.",[1361,4367,4368,4371],{},[39,4369,4370],{},"Más datos",": Si bien no siempre es factible, contar con puntos de datos más diversos (por ejemplo, de diferentes cafeterías, durante un período más prolongado y con condiciones más variadas) podría ayudar a que el modelo se generalice mejor.",[4373,4374,4375],"style",{},"html pre.shiki code .sTPum, html code.shiki .sTPum{--shiki-default:#1E754F;--shiki-dark:#4D9375}html pre.shiki code .s8w-G, html code.shiki .s8w-G{--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .si6no, html code.shiki .si6no{--shiki-default:#999999;--shiki-dark:#666666}html pre.shiki code .snYqZ, html code.shiki .snYqZ{--shiki-default:#A0ADA0;--shiki-dark:#758575DD}html pre.shiki code .sqbOQ, html code.shiki .sqbOQ{--shiki-default:#2F798A;--shiki-dark:#4C9A91}html pre.shiki code .scnC2, html code.shiki .scnC2{--shiki-default:#B5695977;--shiki-dark:#C98A7D77}html pre.shiki code .spP0B, html code.shiki .spP0B{--shiki-default:#B56959;--shiki-dark:#C98A7D}html pre.shiki code .sHLBJ, html code.shiki .sHLBJ{--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .s5TCs, html code.shiki .s5TCs{--shiki-default:#AB5959;--shiki-dark:#CB7676}html pre.shiki code .s9nN2, html code.shiki .s9nN2{--shiki-default:#B07D48;--shiki-dark:#BD976A}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);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s_xSY, html code.shiki .s_xSY{--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .sfsYZ, html code.shiki .sfsYZ{--shiki-default:#A65E2B;--shiki-dark:#C99076}",{"title":78,"searchDepth":115,"depth":115,"links":4377},[4378],{"id":33,"depth":102,"text":34,"children":4379},[4380,4381,4382,4383,4384],{"id":54,"depth":115,"text":55},{"id":876,"depth":115,"text":877},{"id":1399,"depth":115,"text":1400},{"id":3210,"depth":115,"text":3211},{"id":3511,"depth":115,"text":3512},"2026-04-19","md","\u002Fblog\u002Fexperimenting-with-exploratory-data-analysis\u002Fshared\u002Feda.webp",{},"\u002Fblog\u002Fblog\u002Fexperimenting-with-exploratory-data-analysis",{"title":5,"description":13},{"loc":4392,"priority":4393,"lastmod":4385},"\u002Fes\u002Fblog\u002Fexperimenting-with-exploratory-data-analysis",0.7,"experimenting-with-exploratory-data-analysis","blog\u002Fblog\u002Fexperimenting-with-exploratory-data-analysis","En este artículo, exploraremos el proceso de análisis exploratorio de datos (EDA) en el contexto de proyectos de aprendizaje automático.",[4398,4399,4400,4401,4402],"aprendizaje automático","análisis de datos","EDA","proyectos de machine learning","análisis exploratorio","jLuQVdubL3rr8PUSL6UI21aRoxNP9hjQ-h94ciQdHmc",{"prev":4405,"next":6100},{"id":4406,"title":23,"author":6,"body":4407,"date":6084,"description":4411,"extension":4386,"image":6085,"lastmod":6084,"meta":6086,"navigation":159,"order":123,"path":6087,"seo":6088,"sitemap":6089,"slug":6091,"stem":6092,"summary":6093,"tags":6094,"__hash__":6099},"content_es\u002Fblog\u002Fblog\u002Fworkflow-machine-learning-projects.md",{"type":8,"value":4408,"toc":6047},[4409,4412,4419,4421,4423,4426,4452,4466,4475,4477,4481,4484,4510,4513,4516,4538,4540,4544,4547,4573,4576,4580,4583,4586,4590,4593,4649,4652,4677,4682,4686,4715,4719,4722,4748,4751,4755,4811,4815,4823,4826,4832,4840,4846,4854,4860,4868,4872,4875,4901,4909,4915,4918,4922,4925,4964,4967,4971,4974,4991,4993,4999,5003,5028,5032,5035,5037,5051,5055,5058,5074,5077,5081,5084,5087,5090,5110,5115,5118,5156,5160,5163,5207,5211,5214,5256,5260,5263,5267,5270,5274,5277,5309,5313,5316,5336,5339,5377,5380,5412,5415,5441,5443,5447,5450,5455,5458,5483,5486,5492,5495,5501,5508,5514,5521,5525,5531,5534,5540,5545,5551,5557,5560,5567,5570,5576,5579,5583,5586,5593,5599,5606,5612,5616,5619,5625,5628,5634,5640,5644,5647,5654,5657,5663,5670,5673,5679,5686,5689,5695,5698,5701,5704,5749,5752,5758,5765,5769,5772,5783,5786,5845,5851,5862,5868,5872,5875,5886,5889,5892,5895,5898,5906,5909,5915,5918,5924,5927,5933,5936,5942,5945,5949,5952,5966,5969,5973,5976,5979,5982,5990,5997,6000,6003,6011,6013,6020,6031,6038,6045],[11,4410,4411],{},"Continuamos aprendiendo sobre el mundo del aprendizaje automático, y en esta ocasión, nos adentraremos en el flujo típico de un proyecto de aprendizaje automático.",[11,4413,16,4414],{},[18,4415,4418],{"href":4416,"rel":4417},"https:\u002F\u002Fderas.dev\u002Fes\u002Fblog\u002Fmachine-learning-paradigms-and-mathematical-foundations",[22],"Paradigmas de aprendizaje automático y fundamentos matemáticos",[25,4420],{},[28,4422],{},[11,4424,4425],{},"¿Por qué es importante entender el flujo de un proyecto de aprendizaje automático?",[1358,4427,4428,4434,4440,4446],{},[1361,4429,4430,4433],{},[39,4431,4432],{},"El proceso es más importante que el resultado",": Los modelos exitosos no dependen únicamente de algoritmos sofisticados, sino de un\nproceso bien estructurado. Un Random Forest con datos limpios y bien preparados supera consistentemente a una red neuronal profunda con datos de mala calidad.",[1361,4435,4436,4439],{},[39,4437,4438],{},"Reproducibilidad",": Un flujo de trabajo claro y documentado permite que otros científicos de datos puedan reproducir tus resultados, lo cual es fundamental para la validación y el avance del conocimiento en el campo.",[1361,4441,4442,4445],{},[39,4443,4444],{},"Colaboración",": En proyectos de aprendizaje automático, a menudo hay múltiples personas involucradas, desde científicos de datos hasta ingenieros de datos y stakeholders. Un flujo de trabajo bien definido facilita la comunicación y la colaboración entre todos los miembros del equipo.",[1361,4447,4448,4451],{},[39,4449,4450],{},"Reduce el riesgo de errores",": Un proceso estructurado ayuda a identificar y corregir errores en las etapas tempranas del proyecto, lo que puede ahorrar tiempo y recursos a largo plazo.",[11,4453,4454,4455,4458,4459,1965,4462,4465],{},"De forma general el aprendizaje automático es un proceso que es ",[39,4456,4457],{},"parte de un sistema",", con un ",[39,4460,4461],{},"ciclo iterativo",[39,4463,4464],{},"orientado a generar valor"," que consta de varias etapas, cada una con sus propias tareas y desafíos.",[11,4467,4468,4472],{},[1881,4469],{"alt":4470,"src":4471},"Visión integradora del ciclo en Machine Learning","\u002Fblog\u002Fworkflow-machine-learning-projects\u002Fshared\u002Fmachine-learning-cycle.webp",[1886,4473,4474],{},"Ciclo en Machine Learning",[28,4476],{},[31,4478,4480],{"id":4479},"_1-definición-del-problema","1. Definición del problema",[11,4482,4483],{},"La primera etapa de cualquier proyecto de aprendizaje automático es la definición del problema:",[1358,4485,4486,4492,4498,4504],{},[1361,4487,4488,4491],{},[39,4489,4490],{},"Identificación del problema",": ¿Que queremos lograr con el proyecto? ¿Qué decisiones queremos apoyar con el modelo? Es crucial entender el contexto del negocio o la aplicación para definir claramente el problema.",[1361,4493,4494,4497],{},[39,4495,4496],{},"Variable objetivo",": ¿Cuál es la variable que queremos predecir o clasificar? Esta variable, también conocida como variable dependiente, es el foco del proyecto y debe ser claramente definida.",[1361,4499,4500,4503],{},[39,4501,4502],{},"Tipo de problema",": ¿Es un problema de clasificación, regresión, clustering, o algo más? La naturaleza del problema influirá en la elección de los algoritmos y técnicas a utilizar.",[1361,4505,4506,4509],{},[39,4507,4508],{},"Métricas de evaluación",": ¿Cómo vamos a medir el éxito del modelo? Es importante definir las métricas de evaluación desde el principio, ya que estas guiarán el desarrollo del modelo y la toma de decisiones a lo largo del proyecto.",[11,4511,4512],{},"Esta etapa es el cimiento de todo el proyecto. Un problema mal definido puede llevar a esfuerzos desperdiciados y resultados insatisfactorios. Es fundamental dedicar tiempo a entender el problema y establecer objetivos claros antes de avanzar a las siguientes etapas.",[11,4514,4515],{},"Veámos un ejemplo práctico:\nSupongamos que una empresa de comercio electrónico quiere predecir si un cliente realizará una compra en su sitio web. En este caso:",[1358,4517,4518,4523,4528,4533],{},[1361,4519,4520,4522],{},[39,4521,4490],{},": Predecir la probabilidad de que un cliente realice una compra.",[1361,4524,4525,4527],{},[39,4526,4496],{},": La variable objetivo podría ser una variable binaria que indique si el cliente realizó una compra (1) o no (0).",[1361,4529,4530,4532],{},[39,4531,4502],{},": Este es un problema de clasificación binaria.",[1361,4534,4535,4537],{},[39,4536,4508],{},": Las métricas de evaluación podrían incluir la precisión, el recall y el F1-score, dependiendo de la importancia relativa de los falsos positivos y los falsos negativos en el contexto del negocio.",[28,4539],{},[31,4541,4543],{"id":4542},"_2-recopilación-de-datos","2. Recopilación de datos",[11,4545,4546],{},"Una vez que el problema está claramente definido, el siguiente paso es la recopilación de datos, aquí se deben identificar y acceder a las fuentes de datos relevantes. Esto puede incluir:",[1358,4548,4549,4555,4561,4567],{},[1361,4550,4551,4554],{},[39,4552,4553],{},"Bases de datos internas\u002Fempresariales",": Datos almacenados en sistemas internos de la empresa, como bases de datos relacionales, data warehouses o data lakes. Algunos ejemplos incluyen registros de ventas, datos de clientes, datos provenientes de CRM o ERP, entre otros.",[1361,4556,4557,4560],{},[39,4558,4559],{},"APIs y servicios web",": Datos externos de proveedores de datos, redes sociales, servicios de geolocalización, etc. Por ejemplo, una empresa de análisis de sentimientos podría utilizar la API de Twitter para recopilar tweets relacionados con un tema específico.",[1361,4562,4563,4566],{},[39,4564,4565],{},"Logs y registros de eventos de sistemas",": Datos generados por aplicaciones, servidores, dispositivos IoT, etc. Por ejemplo, una empresa de monitoreo de infraestructura podría recopilar logs de servidores para detectar patrones de fallos.",[1361,4568,4569,4572],{},[39,4570,4571],{},"Datos públicos\u002Fexternos",": Datos disponibles públicamente, como conjuntos de datos de Kaggle, datos gubernamentales, datos de investigación académica, etc. Por ejemplo, un investigador podría utilizar el conjunto de datos de imágenes de MNIST para entrenar un modelo de reconocimiento de dígitos manuscritos.",[11,4574,4575],{},"Es importante tener en cuenta que la calidad de los datos recopilados es crucial para el éxito del proyecto. Los datos deben ser relevantes, completos, precisos y actualizados. Además, es fundamental considerar aspectos éticos y legales relacionados con la recopilación y el uso de datos, como la privacidad de los usuarios y el cumplimiento de regulaciones como GDPR.",[31,4577,4579],{"id":4578},"_3-preprocesamiento-de-datos","3. Preprocesamiento de datos",[11,4581,4582],{},"Esta es la fase de preparación y limpieza de datos,  es un paso crucial y a menudo es el mayor cuello de botella. Los prefesionales de datos suelen dedicar entre el 70% y el 80% de su tiempo a preparar datos y no a construir modelos.",[11,4584,4585],{},"La calidad del modelos depende directamente de la calidad de los datos, si están desordenados o incompletos, el modelo no podrá aprender patrones útiles. Incluso el algoritmo más sofisticado no puede compensar por datos de mala calidad.",[31,4587,4589],{"id":4588},"_4-análisis-exploratorio-de-datos-eda","4. Análisis exploratorio de datos (EDA)",[11,4591,4592],{},"Durante esta etapa, se realiza un análisis detallado de los datos para comprender su estructura, distribución y relaciones entre variables. Esto incluye:",[1358,4594,4595,4615,4632],{},[1361,4596,4597,4600,4601],{},[39,4598,4599],{},"Analisis univariado",": Examinar la distribución de cada variable individualmente, utilizando estadísticas descriptivas y visualizaciones como:\n",[1358,4602,4603,4606,4609,4612],{},[1361,4604,4605],{},"Histogramas",[1361,4607,4608],{},"Diagramas de caja (boxplots)",[1361,4610,4611],{},"Gráficos de barras",[1361,4613,4614],{},"Estadísticas de tendencia central (media, mediana) y dispersión (desviación estándar, rango intercuartílico)",[1361,4616,4617,4620,4621],{},[39,4618,4619],{},"Analisis bivariado",": Explorar las relaciones entre pares de variables, utilizando visualizaciones como:\n",[1358,4622,4623,4626,4629],{},[1361,4624,4625],{},"Diagramas de dispersión (scatter plots)",[1361,4627,4628],{},"Mapas de calor (heatmaps) para visualizar correlaciones",[1361,4630,4631],{},"Gráficos de barras apiladas para variables categóricas",[1361,4633,4634,4637,4638],{},[39,4635,4636],{},"Analisis multivariado",": Examinar las relaciones entre múltiples variables simultáneamente, utilizando técnicas como:\n",[1358,4639,4640,4643,4646],{},[1361,4641,4642],{},"Análisis de componentes principales (PCA)",[1361,4644,4645],{},"Análisis de clústeres",[1361,4647,4648],{},"Gráficos de pares (pair plots)\nEl EDA es fundamental para detectar problemas en los datos, como valores atípicos, distribuciones sesgadas o relaciones no lineales entre variables. Además, el EDA puede proporcionar insights valiosos que guiarán la selección de características y la elección de algoritmos en las etapas posteriores del proyecto.",[11,4650,4651],{},"Las herramientas comunes para realizar EDA incluye:",[1358,4653,4654,4660,4665,4671],{},[1361,4655,4656,4659],{},[39,4657,4658],{},"Python",": Bibliotecas como Pandas, Matplotlib, Seaborn y Plotly son ampliamente utilizadas para el análisis exploratorio de datos en Python.",[1361,4661,4662,4664],{},[39,4663,3705],{},": Paquetes como ggplot2, dplyr y tidyr son populares para realizar EDA en R.",[1361,4666,4667,4670],{},[39,4668,4669],{},"Herramientas de visualización",": Herramientas como Tableau, Power BI o QlikView también pueden ser utilizadas para realizar análisis exploratorio de datos de manera interactiva.",[1361,4672,4673,4676],{},[39,4674,4675],{},"Jupyter Notebooks",": Los notebooks de Jupyter son una herramienta común para realizar EDA, ya que permiten combinar código, visualizaciones y texto explicativo en un solo documento.",[2072,4678,4679],{},[11,4680,4681],{},"El EDA no es un paso lineal, a menudo se realiza de manera iterativa a medida que se descubren nuevos insights o se identifican problemas en los datos. Es importante documentar los hallazgos del EDA, ya que estos pueden ser útiles para la toma de decisiones en las etapas posteriores del proyecto.",[52,4683,4685],{"id":4684},"principios-para-un-eda-efectivo","Principios para un EDA efectivo",[1358,4687,4688,4694,4700,4709],{},[1361,4689,4690,4693],{},[39,4691,4692],{},"Comenzar simple",": Iniciar con visualizaciones y estadísticas básicas para obtener una comprensión general de los datos antes de profundizar en análisis más complejos.",[1361,4695,4696,4699],{},[39,4697,4698],{},"Colores con propósito",": Utilizar colores de manera estratégica para resaltar patrones o diferencias importantes en los datos, evitando el uso excesivo de colores que pueda distraer.",[1361,4701,4702,4705,4708],{},[39,4703,4704],{},"Proceso iterativo",[4706,4707],"iterar",{}," continuamente a medida que se descubren nuevos insights o se identifican problemas en los datos, ajustando el enfoque del EDA según sea necesario.",[1361,4710,4711,4714],{},[39,4712,4713],{},"Documentar hallazgos",": Registrar los insights y descubrimientos del EDA para facilitar la toma de decisiones en las etapas posteriores del proyecto y para compartir con otros miembros del equipo.",[31,4716,4718],{"id":4717},"_5-feature-engineering","5. Feature engineering",[11,4720,4721],{},"El feature engineering es el proceso de crear nuevas características a partir de los datos originales para mejorar el rendimiento del modelo. Es el puente entre datos crudos sin estructurar y entradas listas para modelar. Esta etapa es crucial porque nos ayuda a:",[1358,4723,4724,4730,4736,4742],{},[1361,4725,4726,4729],{},[39,4727,4728],{},"Mejorar precisión",": Las características bien diseñadas pueden capturar patrones complejos en los datos que los modelos pueden aprovechar para hacer mejores predicciones.",[1361,4731,4732,4735],{},[39,4733,4734],{},"Reducir sobreajuste",": Al crear características más relevantes, podemos ayudar a los modelos a generalizar mejor a datos no vistos, reduciendo el riesgo de sobreajuste.",[1361,4737,4738,4741],{},[39,4739,4740],{},"Facilitar la interpretación",": Las características bien diseñadas pueden hacer que los modelos sean más interpretables, lo que es especialmente importante en aplicaciones donde la explicabilidad es crucial.",[1361,4743,4744,4747],{},[39,4745,4746],{},"Aumentar la eficiencia",": Al reducir la dimensionalidad de los datos o crear características más informativas, podemos mejorar la eficiencia del entrenamiento del modelo.",[11,4749,4750],{},"Algunas técnicas fundamentales de feature engineering incluyen:",[52,4752,4754],{"id":4753},"transformaciones-numéricas","Transformaciones Numéricas",[1358,4756,4757,4777],{},[1361,4758,4759,4762,4763],{},[39,4760,4761],{},"Escalado",": Útil para modelos sensibles a magnitudes (Regresión, SVM, KNN, redes neuronales).",[1358,4764,4765,4771,4774],{},[1361,4766,4767,4768],{},"Min-Max Scaling: Lleva valores a rango ",[82,4769,4770],{},"0,1",[1361,4772,4773],{},"Standardization (Z-score): media 0, desviación 1",[1361,4775,4776],{},"Robust Scaling: usa mediana y rango intercuartílico (mejor con outliers)",[1361,4778,4779,4782,4783],{},[39,4780,4781],{},"Transformaciones no lineales",": Cuando la relación no es lineal.",[1358,4784,4785,4791,4797,4808],{},[1361,4786,4787,4788],{},"Log transform: ",[60,4789,4790],{},"log(x)",[1361,4792,4793,4794],{},"Raíz cuadrada: ",[60,4795,4796],{},"sqrt(x)",[1361,4798,4799,4800,4803,4804,4807],{},"Box-Cox: ",[60,4801,4802],{},"((x + 1)^λ - 1) \u002F λ"," (para λ ≠ 0) o ",[60,4805,4806],{},"log(x + 1)"," (para λ = 0)",[1361,4809,4810],{},"Yeo-Johnson: Similar a Box-Cox pero para datos con valores negativos\nMuy útil cuando hay distribuciones muy sesgadas.",[52,4812,4814],{"id":4813},"variables-categóricas","Variables Categóricas",[1358,4816,4817],{},[1361,4818,4819,4822],{},[39,4820,4821],{},"One-Hot Encoding",": Convierte categorías en columnas binarias.",[11,4824,4825],{},"Ejemplo:",[73,4827,4830],{"className":4828,"code":4829,"language":2234},[2815],"Color: [Rojo, Azul, Verde]\n\nPasan a ser:\n\nRojo  Azul  Verde\n1     0     0\n",[60,4831,4829],{"__ignoreMap":78},[1358,4833,4834],{},[1361,4835,4836,4839],{},[39,4837,4838],{},"Ordinal Encoding",": Cuando hay orden:",[73,4841,4844],{"className":4842,"code":4843,"language":2234},[2815],"Bajo \u003C Medio \u003C Alto\n",[60,4845,4843],{"__ignoreMap":78},[1358,4847,4848],{},[1361,4849,4850,4853],{},[39,4851,4852],{},"Target Encoding",": Reemplaza categoría por promedio del target:",[73,4855,4858],{"className":4856,"code":4857,"language":2234},[2815],"Ciudad → promedio de ventas\n",[60,4859,4857],{"__ignoreMap":78},[1358,4861,4862],{},[1361,4863,4864,4867],{},[39,4865,4866],{},"Frequency Encoding",": Reemplaza categoría por frecuencia de aparición.",[52,4869,4871],{"id":4870},"features-temporales","Features Temporales",[11,4873,4874],{},"Si se trabaja con fechas:",[1358,4876,4877,4880,4883,4886,4889,4892,4895,4898],{},[1361,4878,4879],{},"Año",[1361,4881,4882],{},"Mes",[1361,4884,4885],{},"Día",[1361,4887,4888],{},"Día de la semana",[1361,4890,4891],{},"Es fin de semana",[1361,4893,4894],{},"Trimestre",[1361,4896,4897],{},"Diferencia entre fechas",[1361,4899,4900],{},"Tiempo desde último evento",[1358,4902,4903],{},[1361,4904,4905,4908],{},[39,4906,4907],{},"Codificación cíclica",": Para variables como hora o mes:",[73,4910,4913],{"className":4911,"code":4912,"language":2234},[2815],"sin(2π * hora \u002F 24)\ncos(2π * hora \u002F 24)\n",[60,4914,4912],{"__ignoreMap":78},[11,4916,4917],{},"Evita que 23 y 0 parezcan \"lejanos\".",[52,4919,4921],{"id":4920},"interacciones-entre-variables","Interacciones entre Variables",[11,4923,4924],{},"A veces la combinación importa más que la variable sola.",[1358,4926,4927,4936,4948,4956],{},[1361,4928,4929,4932,4933],{},[39,4930,4931],{},"Producto de variables",": ",[60,4934,4935],{},"x1 * x2",[1361,4937,4938,4932,4941,4944,4945],{},[39,4939,4940],{},"Polinomios",[60,4942,4943],{},"x^2",", ",[60,4946,4947],{},"x^3",[1361,4949,4950,4932,4953],{},[39,4951,4952],{},"Ratios",[60,4954,4955],{},"precio \u002F tamaño",[1361,4957,4958,4932,4961],{},[39,4959,4960],{},"Diferencias",[60,4962,4963],{},"fecha_pago - fecha_registro",[11,4965,4966],{},"Muy usado en modelos lineales.",[52,4968,4970],{"id":4969},"binning-discretización","Binning (Discretización)",[11,4972,4973],{},"Convertir numéricos en categorías:",[1358,4975,4976,4981,4986],{},[1361,4977,4978],{},[39,4979,4980],{},"Binning uniforme",[1361,4982,4983],{},[39,4984,4985],{},"Binning por cuantiles",[1361,4987,4988],{},[39,4989,4990],{},"Binning basado en negocio",[11,4992,4825],{},[73,4994,4997],{"className":4995,"code":4996,"language":2234},[2815],"Edad → [0-18], [19-35], [36-60], 60+\n",[60,4998,4996],{"__ignoreMap":78},[52,5000,5002],{"id":5001},"manejo-de-outliers","Manejo de Outliers",[1358,5004,5005,5010,5015,5020],{},[1361,5006,5007],{},[39,5008,5009],{},"Clipping",[1361,5011,5012],{},[39,5013,5014],{},"Winsorizing",[1361,5016,5017],{},[39,5018,5019],{},"Log transform",[1361,5021,5022,4932,5025],{},[39,5023,5024],{},"Crear feature binaria",[60,5026,5027],{},"es_outlier",[52,5029,5031],{"id":5030},"features-basadas-en-agrupaciones","Features basadas en agrupaciones",[11,5033,5034],{},"Muy potente en datasets transaccionales.",[11,5036,4825],{},[1358,5038,5039,5042,5045,5048],{},[1361,5040,5041],{},"Promedio de compras por usuario",[1361,5043,5044],{},"Número de pedidos",[1361,5046,5047],{},"Tiempo desde última compra",[1361,5049,5050],{},"Máximo \u002F mínimo histórico",[52,5052,5054],{"id":5053},"feature-selection","Feature Selection",[11,5056,5057],{},"No todo es crear - también eliminar.",[1358,5059,5060,5062,5065,5068,5071],{},[1361,5061,3083],{},[1361,5063,5064],{},"Mutual information",[1361,5066,5067],{},"RFE",[1361,5069,5070],{},"Lasso (L1)",[1361,5072,5073],{},"Feature importance (árboles)",[11,5075,5076],{},"El feature engineering es una de las habilidades más valiosas en la ciencia de datos, ya que puede marcar la diferencia entre un modelo mediocre y uno excepcional.",[31,5078,5080],{"id":5079},"_6-entrenamiento-de-modelos","6. Entrenamiento de modelos",[11,5082,5083],{},"Una vez que los datos están preparados y las características han sido diseñadas, el siguiente paso es entrenar un modelo de aprendizaje automático.",[11,5085,5086],{},"En esta etapa, se selecciona un algoritmo de aprendizaje automático adecuado para el problema definido y se ajusta a los datos de entrenamiento. El proceso de entrenamiento implica alimentar el modelo con los datos y permitir que aprenda patrones y relaciones para hacer predicciones.",[11,5088,5089],{},"Lo primero que debemos tener en cuenta antes de empezar es la división de los datos (datasets) en conjuntos de entrenamiento, validación y prueba. Esto es crucial para evaluar el rendimiento del modelo de manera justa y evitar el sobreajuste:",[1358,5091,5092,5098,5104],{},[1361,5093,5094,5097],{},[39,5095,5096],{},"Conjunto de entrenamiento (Training Set) - (70-80%)",": Es el conjunto de datos que se utiliza para entrenar el modelo. El modelo aprende a partir de estos datos, ajustando sus parámetros para minimizar el error en las predicciones.",[1361,5099,5100,5103],{},[39,5101,5102],{},"Conjunto de validación (Validation Set) - (10-15%)",": Es un conjunto de datos separado que se utiliza para ajustar los hiperparámetros del modelo y tomar decisiones sobre la arquitectura del modelo. El modelo no se entrena directamente con estos datos, pero se utilizan para evaluar su rendimiento durante el proceso de entrenamiento.",[1361,5105,5106,5109],{},[39,5107,5108],{},"Conjunto de prueba (Test Set) - (10-15%)",": Es un conjunto de datos completamente separado que se utiliza para evaluar el rendimiento final del modelo después de que se ha completado el entrenamiento y la selección de hiperparámetros. Este conjunto no se utiliza en absoluto durante el proceso de entrenamiento o validación, lo que permite obtener una evaluación imparcial del modelo.",[2072,5111,5112],{},[11,5113,5114],{},"Como dato, si utilizas agentes de IA para el desarrollo de software, una buena práctica es utilizar distintas sesiones o agentes para cada etapa del desarrollo, un agente para la generación de código, otro para la revisión y otro para las pruebas. En este otro caso ayuda a que la IA no sea autoreferencial y pueda detectar errores que un mismo agente podría pasar por alto.",[11,5116,5117],{},"Para el entrenamiento del modelo, se selecciona un algoritmo de aprendizaje automático adecuado para el tipo de problema que se está abordando (clasificación, regresión, clustering, etc.). Algunos ejemplos de algoritmos comunes, como ya los vimos son:",[1358,5119,5120,5126,5132,5138,5144,5150],{},[1361,5121,5122,5125],{},[39,5123,5124],{},"Regresión lineal",": Modelo simple para relaciones lineales, rápido, interpretable, pero limitado a relaciones lineales.",[1361,5127,5128,5131],{},[39,5129,5130],{},"Árboles de decisión",": Modelos basados en reglas, fáciles de interpretar, pero propensos a sobreajuste.",[1361,5133,5134,5137],{},[39,5135,5136],{},"Random Forest",": Conjunto de árboles de decisión, reduce sobreajuste, pero menos interpretable.",[1361,5139,5140,5143],{},[39,5141,5142],{},"Gradient Boosting (XGBoost, LightGBM)",": Potente para datos tabulares, pero puede ser lento y propenso a sobreajuste si no se ajusta correctamente.",[1361,5145,5146,5149],{},[39,5147,5148],{},"Redes neuronales",": Modelos inspirados en el cerebro, capaces de capturar relaciones complejas, pero requieren grandes cantidades de datos y son menos interpretables.",[1361,5151,5152,5155],{},[39,5153,5154],{},"Support Vector Machines (SVM)",": Efectivo para problemas de clasificación, pero puede ser lento con grandes conjuntos de datos.",[31,5157,5159],{"id":5158},"_7-evaluación-del-modelo","7. Evaluación del modelo",[11,5161,5162],{},"Una vez que el modelo ha sido entrenado, es crucial evaluar su rendimiento utilizando el conjunto de validación y el conjunto de prueba. La evaluación del modelo implica medir su capacidad para hacer predicciones precisas y generalizar a datos no vistos.\nLas métricas de evaluación varían según el tipo de problema que se esté abordando. Para problemas de clasificación, algunas métricas comunes incluyen:",[1358,5164,5165,5171,5177,5183,5189,5195,5201],{},[1361,5166,5167,5170],{},[39,5168,5169],{},"Precisión",": Proporción de predicciones correctas sobre el total de predicciones realizadas.",[1361,5172,5173,5176],{},[39,5174,5175],{},"Recall (Sensibilidad)",": Proporción de verdaderos positivos sobre el total de positivos reales.",[1361,5178,5179,5182],{},[39,5180,5181],{},"F1-score",": La media armónica de la precisión y el recall, útil cuando hay un desequilibrio entre clases.",[1361,5184,5185,5188],{},[39,5186,5187],{},"AUC-ROC",": Área bajo la curva ROC, que mide la capacidad del modelo para distinguir entre clases.\nPara problemas de regresión, algunas métricas comunes incluyen:",[1361,5190,5191,5194],{},[39,5192,5193],{},"Error cuadrático medio (MSE)",": Promedio de los cuadrados de los errores entre las predicciones y los valores reales.",[1361,5196,5197,5200],{},[39,5198,5199],{},"Error absoluto medio (MAE)",": Promedio de los valores absolutos de los errores entre las predicciones y los valores reales.",[1361,5202,5203,5206],{},[39,5204,5205],{},"R² (Coeficiente de determinación)",": Proporción de la varianza en la variable dependiente que es predecible a partir de las variables independientes.",[52,5208,5210],{"id":5209},"matriz-de-confusión","Matriz de confusión",[11,5212,5213],{},"Una herramienta útil para evaluar modelos de clasificación es la matriz de confusión, que muestra el número de verdaderos positivos, falsos positivos, verdaderos negativos y falsos negativos. Esto permite entender mejor el rendimiento del modelo y las áreas donde puede estar cometiendo errores.",[3069,5215,5216,5228],{},[3072,5217,5218],{},[3075,5219,5220,5222,5225],{},[3078,5221],{},[3078,5223,5224],{},"Predicción Positiva",[3078,5226,5227],{},"Predicción Negativa",[3085,5229,5230,5243],{},[3075,5231,5232,5237,5240],{},[3090,5233,5234],{},[39,5235,5236],{},"Real Positivo",[3090,5238,5239],{},"Verdaderos Positivos (TP)",[3090,5241,5242],{},"Falsos Negativos (FN)",[3075,5244,5245,5250,5253],{},[3090,5246,5247],{},[39,5248,5249],{},"Real Negativo",[3090,5251,5252],{},"Falsos Positivos (FP)",[3090,5254,5255],{},"Verdaderos Negativos (TN)",[52,5257,5259],{"id":5258},"curva-roc","Curva ROC",[11,5261,5262],{},"La curva ROC (Receiver Operating Characteristic) es una herramienta gráfica que muestra la relación entre la tasa de verdaderos positivos (TPR) y la tasa de falsos positivos (FPR) a medida que se varía el umbral de clasificación. El área bajo la curva ROC (AUC-ROC) es una métrica que mide la capacidad del modelo para distinguir entre clases, con un valor de 1 indicando un modelo perfecto y un valor de 0.5 indicando un modelo sin capacidad de discriminación.",[52,5264,5266],{"id":5265},"curva-precision-recall","Curva Precision-Recall",[11,5268,5269],{},"La curva Precision-Recall es otra herramienta gráfica que muestra la relación entre la precisión y el recall a medida que se varía el umbral de clasificación. Esta curva es especialmente útil cuando hay un desequilibrio entre clases, ya que se enfoca en la capacidad del modelo para identificar correctamente la clase minoritaria.",[31,5271,5273],{"id":5272},"_8-implementación-y-despliegue","8. Implementación y despliegue",[11,5275,5276],{},"Una vez que el modelo ha sido entrenado y evaluado, el siguiente paso es implementarlo en un entorno de producción para que pueda ser utilizado por los usuarios finales o integrado en sistemas existentes. La implementación y el despliegue de modelos de aprendizaje automático pueden ser desafiantes debido a la necesidad de garantizar la escalabilidad, la seguridad y la mantenibilidad del modelo en un entorno de producción. Algunas consideraciones clave para la implementación y el despliegue de modelos de aprendizaje automático incluyen:",[1358,5278,5279,5285,5291,5297,5303],{},[1361,5280,5281,5284],{},[39,5282,5283],{},"APIs",": Exponer el modelo a través de una API RESTful o gRPC para que pueda ser consumido por otras aplicaciones o servicios.",[1361,5286,5287,5290],{},[39,5288,5289],{},"Aplicaciones web",": Integrar el modelo en una aplicación web para que los usuarios puedan interactuar con él a través de una interfaz gráfica.",[1361,5292,5293,5296],{},[39,5294,5295],{},"Integraciones con sistemas existentes",": Integrar el modelo en sistemas empresariales existentes, como CRM, ERP o sistemas de recomendación.",[1361,5298,5299,5302],{},[39,5300,5301],{},"Contenedores y orquestación",": Utilizar contenedores (Docker) y herramientas de orquestación (Kubernetes) para facilitar el despliegue, la escalabilidad y la gestión del modelo en producción.",[1361,5304,5305,5308],{},[39,5306,5307],{},"Monitoreo y mantenimiento",": Implementar sistemas de monitoreo para rastrear el rendimiento del modelo en producción, detectar posibles problemas y realizar actualizaciones o retrainings según sea necesario.",[31,5310,5312],{"id":5311},"_9-monitoreo-y-mantenimiento","9. Monitoreo y mantenimiento",[11,5314,5315],{},"Una vez que el modelo está en producción, es crucial monitorear su rendimiento de manera continua para asegurarse de que sigue siendo efectivo y relevante. El monitoreo del modelo implica rastrear métricas clave, detectar posibles problemas y realizar ajustes o retrainings según sea necesario. Algunos problemas que pueden surgir en esta etapa incluyen:",[1358,5317,5318,5324,5330],{},[1361,5319,5320,5323],{},[39,5321,5322],{},"Deriva de datos (Data Drift)",": Ocurre cuando la distribución de los datos de entrada cambia con el tiempo, lo que puede afectar negativamente el rendimiento del modelo. Es importante monitorear la distribución de los datos y realizar retrainings si se detecta una deriva significativa.",[1361,5325,5326,5329],{},[39,5327,5328],{},"Deriva de concepto (Concept Drift)",": Ocurre cuando la relación entre las características y la variable objetivo cambia con el tiempo, lo que puede hacer que el modelo sea menos efectivo. Es importante monitorear el rendimiento del modelo y realizar ajustes o retrainings si se detecta una deriva de concepto.",[1361,5331,5332,5335],{},[39,5333,5334],{},"Training-serving skew",": Ocurre cuando hay diferencias entre los datos utilizados para entrenar el modelo y los datos que se encuentran en producción, lo que puede afectar negativamente el rendimiento del modelo. Es importante asegurarse de que los datos de entrenamiento sean representativos de los datos en producción y realizar ajustes si se detecta un skew significativo.",[11,5337,5338],{},"Para lograr un buen monitoreo se pueden tomar algunas buenas prácticas, como:",[1358,5340,5341,5347,5353,5359,5365,5371],{},[1361,5342,5343,5346],{},[39,5344,5345],{},"Definir KPIs claros",": Establecer métricas clave de rendimiento (KPIs) para monitorear el modelo, como precisión, recall, F1-score, AUC-ROC, etc.",[1361,5348,5349,5352],{},[39,5350,5351],{},"Implementar alertas",": Configurar alertas para notificar al equipo cuando el rendimiento del modelo cae por debajo de un umbral predefinido o cuando se detecta una deriva significativa.",[1361,5354,5355,5358],{},[39,5356,5357],{},"Diversificar metricas",": Monitorear múltiples métricas para obtener una visión completa del rendimiento del modelo y detectar posibles problemas desde diferentes ángulos.",[1361,5360,5361,5364],{},[39,5362,5363],{},"Automatizar retrainings",": Configurar procesos automatizados para realizar retrainings del modelo cuando se detecta una deriva significativa o cuando el rendimiento cae por debajo de un umbral predefinido.",[1361,5366,5367,5370],{},[39,5368,5369],{},"Documentar cambios",": Mantener un registro de los cambios realizados en el modelo, como ajustes de hiperparámetros, cambios en los datos de entrenamiento, etc., para facilitar la trazabilidad y la comprensión de las decisiones tomadas.",[1361,5372,5373,5376],{},[39,5374,5375],{},"Versionar modelos",": Utilizar herramientas de versionado de modelos para mantener un historial de las diferentes versiones del modelo y facilitar la gestión de cambios y actualizaciones.",[11,5378,5379],{},"Normalmente el proceso de mantenimiento lleva un proceso como el siguiente:",[1405,5381,5382,5388,5394,5400,5406],{},[1361,5383,5384,5387],{},[39,5385,5386],{},"Monitoreo continuo",": Rastrear el rendimiento del modelo en producción utilizando las métricas clave definidas.",[1361,5389,5390,5393],{},[39,5391,5392],{},"Detección de problemas",": Identificar posibles problemas, como deriva de datos, deriva de concepto o training-serving skew, a través del monitoreo de métricas y alertas.",[1361,5395,5396,5399],{},[39,5397,5398],{},"Análisis de causas",": Investigar las causas subyacentes de los problemas detectados, como cambios en la distribución de los datos, cambios en el comportamiento de los usuarios, etc.",[1361,5401,5402,5405],{},[39,5403,5404],{},"Ajustes o retrainings",": Realizar ajustes en el modelo o realizar retrainings utilizando nuevos datos para abordar los problemas detectados y mejorar el rendimiento del modelo.",[1361,5407,5408,5411],{},[39,5409,5410],{},"Validar y desplegar",": Validar el rendimiento del modelo ajustado o retrained utilizando el conjunto de validación y luego desplegar la nueva versión del modelo en producción.",[11,5413,5414],{},"Algunas herramientas populares para el monitoreo y mantenimiento de modelos de aprendizaje automático incluyen:",[1358,5416,5417,5423,5429,5435],{},[1361,5418,5419,5422],{},[39,5420,5421],{},"Prometheus",": Sistema de monitoreo y alerta de código abierto que se puede utilizar para rastrear métricas de rendimiento del modelo en producción.",[1361,5424,5425,5428],{},[39,5426,5427],{},"Grafana",": Plataforma de visualización de datos que se puede integrar con Prometheus para crear paneles de control personalizados para monitorear el rendimiento del modelo.",[1361,5430,5431,5434],{},[39,5432,5433],{},"MLflow",": Plataforma de código abierto para la gestión del ciclo de vida de los modelos de aprendizaje automático, que incluye funcionalidades para el monitoreo y mantenimiento de modelos en producción.",[1361,5436,5437,5440],{},[39,5438,5439],{},"Evidently AI",": Evidently AI es una plataforma de código abierto y basada en la nube para evaluar, probar y supervisar sistemas de IA y aprendizaje automático.",[28,5442],{},[31,5444,5446],{"id":5445},"caso-práctico-predicción-de-abandono-churn-en-una-fintech","Caso práctico: Predicción de abandono (churn) en una fintech",[11,5448,5449],{},"Haremos un recorrido por un caso práctico simulado de un proyecto de aprendizaje automático para predecir el abandono (churn) en una fintech de suscripciones digitales. En este caso ilustraremos el conocimiento que tenemos hasta ahora sobre el flujo de un proyecto de aprendizaje automático.",[11,5451,5452],{},[39,5453,5454],{},"Contexto del negocio",[11,5456,5457],{},"Una fintech de suscripciones digitales tiene:",[1358,5459,5460,5465,5471,5477],{},[1361,5461,5462],{},[39,5463,5464],{},"120,000 usuarios activos",[1361,5466,5467,5468],{},"Suscripción mensual promedio: ",[39,5469,5470],{},"$25",[1361,5472,5473,5474],{},"Ingreso mensual recurrente (MRR): ",[39,5475,5476],{},"$3,000,000",[1361,5478,5479,5480],{},"Tasa de abandono mensual (churn): ",[39,5481,5482],{},"8%",[11,5484,5485],{},"Eso significa que cada mes:",[73,5487,5490],{"className":5488,"code":5489,"language":2234},[2815],"120,000 × 8% = 9,600 usuarios cancelan\n",[60,5491,5489],{"__ignoreMap":78},[11,5493,5494],{},"Pérdida mensual estimada:",[73,5496,5499],{"className":5497,"code":5498,"language":2234},[2815],"9,600 × $25 = $240,000\n",[60,5500,5498],{"__ignoreMap":78},[11,5502,5503,5504,5507],{},"La empresa quiere reducir el churn al ",[39,5505,5506],{},"6%",", lo que implicaría ahorrar:",[73,5509,5512],{"className":5510,"code":5511,"language":2234},[2815],"2% × 120,000 × $25 = $60,000 mensuales\n",[60,5513,5511],{"__ignoreMap":78},[11,5515,5516,5517,5520],{},"El objetivo del proyecto de Machine Learning es ",[39,5518,5519],{},"identificar usuarios con alta probabilidad de cancelar en los próximos 30 días",", para enviarles una campaña de retención personalizada.",[52,5522,5524],{"id":5523},"definición-del-problema","Definición del problema",[1358,5526,5527],{},[1361,5528,5529],{},[39,5530,4490],{},[11,5532,5533],{},"Reducir la tasa de abandono mensual del 8% al 6%.",[1358,5535,5536],{},[1361,5537,5538],{},[39,5539,4496],{},[11,5541,5542,623],{},[60,5543,5544],{},"churn_30d",[73,5546,5549],{"className":5547,"code":5548,"language":2234},[2815],"1 - Cancela en los próximos 30 días\n0 - No cancela\n",[60,5550,5548],{"__ignoreMap":78},[1358,5552,5553],{},[1361,5554,5555],{},[39,5556,4502],{},[11,5558,5559],{},"Clasificación binaria.",[1358,5561,5562],{},[1361,5563,5564],{},[39,5565,5566],{},"Métrica de negocio clave",[11,5568,5569],{},"No basta con accuracy (es decir , la tasa de acierto general). Lo importante es:",[73,5571,5574],{"className":5572,"code":5573,"language":2234},[2815],"Recall de la clase churn\nROI de la campaña de retención\n",[60,5575,5573],{"__ignoreMap":78},[11,5577,5578],{},"¿Por qué? Porque queremos identificar correctamente a los usuarios que van a cancelar (recall) y asegurarnos de que la campaña de retención sea rentable (ROI).",[52,5580,5582],{"id":5581},"recopilación-de-datos","Recopilación de datos",[11,5584,5585],{},"Se recopilaron datos de:",[1358,5587,5588],{},[1361,5589,5590],{},[39,5591,5592],{},"Fuentes internas",[73,5594,5597],{"className":5595,"code":5596,"language":2234},[2815],"* Historial de pagos\n* Frecuencia de uso de la app\n* Tiempo desde último login\n* Tickets de soporte\n* Tipo de plan\n* Método de pago\n* Historial de fallos de pago\n",[60,5598,5596],{"__ignoreMap":78},[1358,5600,5601],{},[1361,5602,5603],{},[39,5604,5605],{},"Volumen de datos",[73,5607,5610],{"className":5608,"code":5609,"language":2234},[2815],"* 18 meses de histórico\n* 1.5 millones de registros mensuales\n* Dataset final: **95,000 usuarios únicos** con historial completo\n",[60,5611,5609],{"__ignoreMap":78},[52,5613,5615],{"id":5614},"preprocesamiento","Preprocesamiento",[11,5617,5618],{},"Problemas detectados:",[73,5620,5623],{"className":5621,"code":5622,"language":2234},[2815],"* 7% valores nulos en \"último login\"\n* 3% registros duplicados\n* Variables categóricas con alta cardinalidad (ciudades)\n",[60,5624,5622],{"__ignoreMap":78},[11,5626,5627],{},"Acciones tomadas:",[73,5629,5632],{"className":5630,"code":5631,"language":2234},[2815],"* Imputación con mediana para variables numéricas\n* Eliminación de duplicados\n* Agrupación de ciudades poco frecuentes como \"Otras\"\n",[60,5633,5631],{"__ignoreMap":78},[11,5635,5636,5637],{},"Tiempo invertido en esta etapa: ",[39,5638,5639],{},"72% del proyecto",[52,5641,5643],{"id":5642},"análisis-exploratorio","Análisis Exploratorio",[11,5645,5646],{},"Hallazgos clave:",[1358,5648,5649],{},[1361,5650,5651],{},[39,5652,5653],{},"Insight 1",[11,5655,5656],{},"Usuarios que no inician sesión en 14 días tienen:",[73,5658,5661],{"className":5659,"code":5660,"language":2234},[2815],"* 22% probabilidad de churn\n  vs\n* 4% en usuarios activos recientes\n",[60,5662,5660],{"__ignoreMap":78},[1358,5664,5665],{},[1361,5666,5667],{},[39,5668,5669],{},"Insight 2",[11,5671,5672],{},"Usuarios con más de 2 fallos de pago en 60 días:",[73,5674,5677],{"className":5675,"code":5676,"language":2234},[2815],"* 35% probabilidad de churn\n",[60,5678,5676],{"__ignoreMap":78},[1358,5680,5681],{},[1361,5682,5683],{},[39,5684,5685],{},"Insight 3",[11,5687,5688],{},"Usuarios que abrieron más de 3 tickets de soporte:",[73,5690,5693],{"className":5691,"code":5692,"language":2234},[2815],"* 18% churn\n* Principal causa: problemas técnicos\n",[60,5694,5692],{"__ignoreMap":78},[11,5696,5697],{},"Esto nos cambia el enfoque: no solo es un problema de retención, sino también de experiencia del usuario y soporte técnico. Estos datos nos están diciendo que los usuarios que tienen problemas técnicos o dificultades para usar la app son mucho más propensos a cancelar, lo que sugiere que una campaña de retención efectiva también debería abordar estos problemas y mejorar la experiencia del usuario.",[52,5699,4332],{"id":5700},"feature-engineering",[11,5702,5703],{},"Se crearon variables como:",[1358,5705,5706,5712,5718,5724,5730,5736,5742],{},[1361,5707,5708,5711],{},[60,5709,5710],{},"dias_desde_ultimo_login",": Es la cantidad de días desde la última vez que el usuario inició sesión en la aplicación. Esta variable es importante porque, como se descubrió en el análisis exploratorio, los usuarios que no inician sesión en un período prolongado tienen una mayor probabilidad de cancelar su suscripción.",[1361,5713,5714,5717],{},[60,5715,5716],{},"numero_fallos_pago_60d",": Es el número de fallos de pago que un usuario ha tenido en los últimos 60 días. Como se descubrió en el EDA, los usuarios con más de 2 fallos de pago en este período tienen una probabilidad significativamente mayor de cancelar su suscripción.",[1361,5719,5720,5723],{},[60,5721,5722],{},"promedio_uso_semanal",": Es el promedio de uso de la aplicación por semana. Esta variable puede ayudar a capturar el nivel de compromiso del usuario con la aplicación, lo que puede ser un indicador importante de su probabilidad de cancelar.",[1361,5725,5726,5729],{},[60,5727,5728],{},"tiempo_cliente_meses",": Usuarios que han sido clientes por más tiempo pueden tener una menor probabilidad de cancelar.",[1361,5731,5732,5735],{},[60,5733,5734],{},"tickets_soporte_90d",": Es el número de tickets de soporte que un usuario ha abierto en los últimos 90 días. Dado que se descubrió que los usuarios que abren más de 3 tickets de soporte tienen una mayor probabilidad de cancelar, esta variable puede ser un indicador importante del riesgo de churn.",[1361,5737,5738,5741],{},[60,5739,5740],{},"ratio_fallos_pago = fallos \u002F intentos",": Este ratio puede ser un indicador más preciso del riesgo de churn relacionado con los problemas de pago, ya que tiene en cuenta tanto el número de fallos como el número total de intentos de pago.",[1361,5743,5744,5745,5748],{},"Variable binaria: ",[60,5746,5747],{},"es_usuario_nuevo (\u003C3 meses)",": Los usuarios nuevos pueden tener un riesgo diferente de churn en comparación con los usuarios más antiguos, por lo que esta variable puede ayudar a capturar esa diferencia.",[11,5750,5751],{},"También se creó:",[73,5753,5756],{"className":5754,"code":5755,"language":2234},[2815],"riesgo_inactividad = dias_desde_ultimo_login × (1 \u002F promedio_uso)\n",[60,5757,5755],{"__ignoreMap":78},[11,5759,5760,5761,5764],{},"Esta variable compuesta puede ser un indicador poderoso del riesgo de churn, ya que combina la información sobre la inactividad del usuario (días desde el último login) con su nivel de compromiso (promedio de uso semanal). Un valor alto de ",[60,5762,5763],{},"riesgo_inactividad"," indicaría que un usuario no ha iniciado sesión en mucho tiempo y tiene un bajo nivel de uso, lo que podría ser un fuerte indicador de que está en riesgo de cancelar su suscripción.",[52,5766,5768],{"id":5767},"entrenamiento-de-modelos","Entrenamiento de modelos",[11,5770,5771],{},"Se dividieron datos:",[1358,5773,5774,5777,5780],{},[1361,5775,5776],{},"75% entrenamiento",[1361,5778,5779],{},"15% validación",[1361,5781,5782],{},"10% prueba",[11,5784,5785],{},"Se probaron:",[3069,5787,5788,5800],{},[3072,5789,5790],{},[3075,5791,5792,5795,5797],{},[3078,5793,5794],{},"Modelo",[3078,5796,5187],{},[3078,5798,5799],{},"Recall churn",[3085,5801,5802,5813,5823,5834],{},[3075,5803,5804,5807,5810],{},[3090,5805,5806],{},"Regresión Logística",[3090,5808,5809],{},"0.76",[3090,5811,5812],{},"0.58",[3075,5814,5815,5817,5820],{},[3090,5816,5136],{},[3090,5818,5819],{},"0.84",[3090,5821,5822],{},"0.71",[3075,5824,5825,5828,5831],{},[3090,5826,5827],{},"XGBoost",[3090,5829,5830],{},"0.87",[3090,5832,5833],{},"0.78",[3075,5835,5836,5839,5842],{},[3090,5837,5838],{},"Red neuronal",[3090,5840,5841],{},"0.85",[3090,5843,5844],{},"0.73",[11,5846,5847,5848,5850],{},"Aunque XGBoost tenía mejor métrica, se eligió ",[39,5849,5136],{}," inicialmente porque:",[1358,5852,5853,5856,5859],{},[1361,5854,5855],{},"Era más interpretable",[1361,5857,5858],{},"Menor riesgo de sobreajuste",[1361,5860,5861],{},"Más fácil de mantener",[11,5863,5864,5865,132],{},"Esto es clave: ",[39,5866,5867],{},"la mejor métrica no siempre es la mejor decisión de negocio",[52,5869,5871],{"id":5870},"evaluación","Evaluación",[11,5873,5874],{},"En el conjunto de prueba:",[1358,5876,5877,5880,5883],{},[1361,5878,5879],{},"9% churn real",[1361,5881,5882],{},"Modelo detectó 76% de los churners",[1361,5884,5885],{},"Falsos positivos: 18%",[11,5887,5888],{},"Simulación:",[11,5890,5891],{},"Se decide intervenir solo en usuarios con probabilidad > 0.65.",[11,5893,5894],{},"Usuarios marcados como \"riesgo alto\": 11,000",[11,5896,5897],{},"De esos:",[1358,5899,5900,5903],{},[1361,5901,5902],{},"6,800 realmente iban a cancelar",[1361,5904,5905],{},"4,200 eran falsos positivos",[11,5907,5908],{},"Costo campaña:",[73,5910,5913],{"className":5911,"code":5912,"language":2234},[2815],"11,000 × $2 = $22,000\n",[60,5914,5912],{"__ignoreMap":78},[11,5916,5917],{},"Clientes salvados (tasa de éxito campaña 40%):",[73,5919,5922],{"className":5920,"code":5921,"language":2234},[2815],"6,800 × 40% = 2,720 clientes retenidos\n",[60,5923,5921],{"__ignoreMap":78},[11,5925,5926],{},"Ingreso recuperado mensual:",[73,5928,5931],{"className":5929,"code":5930,"language":2234},[2815],"2,720 × $25 = $68,000\n",[60,5932,5930],{"__ignoreMap":78},[11,5934,5935],{},"ROI mensual:",[73,5937,5940],{"className":5938,"code":5939,"language":2234},[2815],"$68,000 - $22,000 = $46,000 beneficio neto\n",[60,5941,5939],{"__ignoreMap":78},[11,5943,5944],{},"Objetivo cumplido.",[52,5946,5948],{"id":5947},"implementación","Implementación",[11,5950,5951],{},"El modelo se desplegó como:",[1358,5953,5954,5957,5960,5963],{},[1361,5955,5956],{},"API REST en FastAPI",[1361,5958,5959],{},"Contenedor Docker",[1361,5961,5962],{},"Job nocturno que recalcula riesgo diario",[1361,5964,5965],{},"Integración con CRM para disparar campañas automáticas",[11,5967,5968],{},"Tiempo de inferencia por usuario: 12 ms.",[52,5970,5972],{"id":5971},"monitoreo-en-producción","Monitoreo en producción",[11,5974,5975],{},"Después de 4 meses:",[11,5977,5978],{},"La tasa de churn volvió a subir a 7.4%.",[11,5980,5981],{},"Se detectó:",[1358,5983,5984,5987],{},[1361,5985,5986],{},"Nuevo competidor con descuento agresivo",[1361,5988,5989],{},"Cambio en comportamiento de usuarios jóvenes",[11,5991,5992,5993,5996],{},"Se identificó ",[39,5994,5995],{},"concept drift",", es decir, el modelo ya no estaba capturando correctamente los patrones de churn debido a cambios en el mercado y en el comportamiento de los usuarios.",[11,5998,5999],{},"Se hizo retraining con datos recientes.",[11,6001,6002],{},"Nuevo modelo:",[1358,6004,6005,6008],{},[1361,6006,6007],{},"Mejoró recall a 81%",[1361,6009,6010],{},"Redujo churn nuevamente a 6.2%",[28,6012],{},[11,6014,6015,6016,6019],{},"¿Que podemos aprender de este caso? Primero, ",[39,6017,6018],{},"el modelo no era el centro — el proceso sí",". El éxito no vino de un algoritmo sofisticado, sino de un proceso bien ejecutado que incluyó:",[1358,6021,6022,6025,6028],{},[1361,6023,6024],{},"Buen EDA",[1361,6026,6027],{},"Buen feature engineering",[1361,6029,6030],{},"Definir correctamente la métrica de negocio",[11,6032,6033,6034,6037],{},"Segundo, accuracy no era la métrica correcta, aqui ya nos importaba ponerle ojo al ROI, porque no solo queríamos un modelo que fuera bueno en métricas técnicas, sino que también generara un impacto positivo en el negocio.\nY es que como ya hemos dicho, ",[39,6035,6036],{},"el modelo es parte de un sistema"," que incluye otros componentes como marketing, CRM, infraestructura, monitoreo y retraining. El éxito del proyecto depende de la integración efectiva de todos estos componentes, no solo del modelo en sí.",[11,6039,6040,6041,6044],{},"Tercero, el proyecto nunca termina, ",[39,6042,6043],{},"es un ciclo continuo",", el monitoreo y mantenimiento son tan importantes como el entrenamiento inicial, porque el entorno cambia, los usuarios cambian, el mercado cambia, y el modelo debe adaptarse para seguir siendo efectivo.",[28,6046],{},{"title":78,"searchDepth":115,"depth":115,"links":6048},[6049,6050,6051,6052,6055,6065,6066,6071,6072,6073],{"id":4479,"depth":102,"text":4480},{"id":4542,"depth":102,"text":4543},{"id":4578,"depth":102,"text":4579},{"id":4588,"depth":102,"text":4589,"children":6053},[6054],{"id":4684,"depth":115,"text":4685},{"id":4717,"depth":102,"text":4718,"children":6056},[6057,6058,6059,6060,6061,6062,6063,6064],{"id":4753,"depth":115,"text":4754},{"id":4813,"depth":115,"text":4814},{"id":4870,"depth":115,"text":4871},{"id":4920,"depth":115,"text":4921},{"id":4969,"depth":115,"text":4970},{"id":5001,"depth":115,"text":5002},{"id":5030,"depth":115,"text":5031},{"id":5053,"depth":115,"text":5054},{"id":5079,"depth":102,"text":5080},{"id":5158,"depth":102,"text":5159,"children":6067},[6068,6069,6070],{"id":5209,"depth":115,"text":5210},{"id":5258,"depth":115,"text":5259},{"id":5265,"depth":115,"text":5266},{"id":5272,"depth":102,"text":5273},{"id":5311,"depth":102,"text":5312},{"id":5445,"depth":102,"text":5446,"children":6074},[6075,6076,6077,6078,6079,6080,6081,6082,6083],{"id":5523,"depth":115,"text":5524},{"id":5581,"depth":115,"text":5582},{"id":5614,"depth":115,"text":5615},{"id":5642,"depth":115,"text":5643},{"id":5700,"depth":115,"text":4332},{"id":5767,"depth":115,"text":5768},{"id":5870,"depth":115,"text":5871},{"id":5947,"depth":115,"text":5948},{"id":5971,"depth":115,"text":5972},"2026-04-18","\u002Fblog\u002Fworkflow-machine-learning-projects\u002Fshared\u002Fworkflow.webp",{},"\u002Fblog\u002Fblog\u002Fworkflow-machine-learning-projects",{"title":23,"description":4411},{"loc":6090,"priority":4393,"lastmod":6084},"\u002Fes\u002Fblog\u002Fworkflow-machine-learning-projects","workflow-machine-learning-projects","blog\u002Fblog\u002Fworkflow-machine-learning-projects","Descubre el flujo típico de un proyecto de aprendizaje automático, desde la recopilación de datos hasta la implementación del modelo, y aprende sobre las mejores prácticas y desafíos comunes en el campo de la ciencia de datos.",[6095,6096,6097,6098],"Machine Learning","Data Science","Proyectos de ML","Flujo de trabajo","ZkFJq61zQv5OaLfXLn08N_uhSfWM-jtyyhkQNh9ycXY",null,1776805792868]