	{"id":21214,"date":"2020-11-25T09:21:16","date_gmt":"2020-11-25T09:21:16","guid":{"rendered":"https:\/\/www.artefact.com\/?post_type=news&#038;p=21214"},"modified":"2024-09-20T17:45:14","modified_gmt":"2024-09-20T16:45:14","slug":"how-did-we-put-our-sales-forecasting-solution-for-croissants-into-production","status":"publish","type":"blog","link":"https:\/\/www.artefact.com\/es\/blog\/how-did-we-put-our-sales-forecasting-solution-for-croissants-into-production\/","title":{"rendered":"\u00bfC\u00f3mo pusimos en producci\u00f3n nuestra soluci\u00f3n de previsi\u00f3n de ventas de cruasanes?"},"content":{"rendered":"<p><div class=\"fusion-fullwidth fullwidth-box fusion-builder-row-1 fusion-flex-container nonhundred-percent-fullwidth non-hundred-percent-height-scrolling\" style=\"--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-padding-top:0px;--awb-padding-right:0px;--awb-padding-bottom:0px;--awb-padding-left:0px;--awb-margin-bottom:40px;--awb-flex-wrap:wrap;\" ><div class=\"fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap\" style=\"max-width:calc( 1440px + 20px );margin-left: calc(-20px \/ 2 );margin-right: calc(-20px \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-0 fusion_builder_column_1_2 1_2 fusion-flex-column avada-news-bloc-image\" style=\"--awb-bg-size:cover;--awb-width-large:50%;--awb-margin-top-large:0px;--awb-spacing-right-large:10px;--awb-margin-bottom-large:0px;--awb-spacing-left-large:10px;--awb-width-medium:50%;--awb-order-medium:0;--awb-spacing-right-medium:10px;--awb-spacing-left-medium:10px;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:10px;--awb-spacing-left-small:10px;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><div class=\"fusion-image-element\" style=\"text-align:left;--awb-caption-title-font-family:var(--h2_typography-font-family);--awb-caption-title-font-weight:var(--h2_typography-font-weight);--awb-caption-title-font-style:var(--h2_typography-font-style);--awb-caption-title-size:var(--h2_typography-font-size);--awb-caption-title-transform:var(--h2_typography-text-transform);--awb-caption-title-line-height:var(--h2_typography-line-height);--awb-caption-title-letter-spacing:var(--h2_typography-letter-spacing);\"><span class=\"fusion-imageframe imageframe-none imageframe-1 hover-type-none\"><img decoding=\"async\" width=\"300\" height=\"74\" title=\"Mediano Blog\" src=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/04\/Medium-Blog.png\" data-orig-src=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/04\/Medium-Blog-300x74.png\" alt class=\"lazyload img-responsive wp-image-60582\" srcset=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%274000%27%20height%3D%27992%27%20viewBox%3D%270%200%204000%20992%27%3E%3Crect%20width%3D%274000%27%20height%3D%27992%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-srcset=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/04\/Medium-Blog-200x50.png 200w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/04\/Medium-Blog-400x99.png 400w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/04\/Medium-Blog-600x149.png 600w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/04\/Medium-Blog-800x198.png 800w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/04\/Medium-Blog-1200x298.png 1200w\" data-sizes=\"auto\" data-orig-sizes=\"(max-width: 640px) 100vw, 800px\" \/><\/span><\/div><\/div><\/div><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-1 fusion_builder_column_1_2 1_2 fusion-flex-column\" style=\"--awb-padding-top:10px;--awb-padding-right:10px;--awb-padding-bottom:10px;--awb-padding-left:10px;--awb-bg-size:cover;--awb-width-large:50%;--awb-margin-top-large:0px;--awb-spacing-right-large:10px;--awb-margin-bottom-large:0px;--awb-spacing-left-large:10px;--awb-width-medium:50%;--awb-order-medium:0;--awb-spacing-right-medium:10px;--awb-spacing-left-medium:10px;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:10px;--awb-spacing-left-small:10px;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><div class=\"fusion-text fusion-text-1\"><p>NOTICIAS \/ TECNOLOG\u00cdA AI<\/p>\n<\/div><div class=\"fusion-text fusion-text-2\"><p>25 de noviembre de 2020<br \/>\nEn Artefact somos tan franceses que hemos decidido aplicar el aprendizaje autom\u00e1tico a los cruasanes. Este primer art\u00edculo de dos explica c\u00f3mo hemos decidido utilizar Catboost para predecir las ventas de \u201cviennoiseries\u201d. Las caracter\u00edsticas m\u00e1s importantes que impulsaron las ventas fueron las \u00faltimas ventas semanales, si el producto est\u00e1 en promoci\u00f3n o no y su precio. Le presentaremos algunas bonitas caracter\u00edsticas de ingenier\u00eda, como la canibalizaci\u00f3n y por qu\u00e9 a veces es necesario actualizar la variable objetivo.<\/p>\n<\/div><\/div><\/div><\/div><\/div><div class=\"fusion-fullwidth fullwidth-box fusion-builder-row-2 fusion-flex-container nonhundred-percent-fullwidth non-hundred-percent-height-scrolling\" style=\"--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-background-color:#ffffff;--awb-flex-wrap:wrap;\" ><div class=\"fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap\" style=\"max-width:calc( 1440px + 20px );margin-left: calc(-20px \/ 2 );margin-right: calc(-20px \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-2 fusion_builder_column_1_1 1_1 fusion-flex-column\" style=\"--awb-bg-color:#ffffff;--awb-bg-color-hover:#ffffff;--awb-bg-size:cover;--awb-width-large:100%;--awb-margin-top-large:0px;--awb-spacing-right-large:10px;--awb-margin-bottom-large:0px;--awb-spacing-left-large:10px;--awb-width-medium:100%;--awb-order-medium:0;--awb-spacing-right-medium:10px;--awb-spacing-left-medium:10px;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:10px;--awb-spacing-left-small:10px;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><div class=\"fusion-text fusion-text-3\" style=\"--awb-text-color:#000000;\"><p><span style=\"color: #ff0066;\"><strong class=\"jl kd\">\u00bfDe qu\u00e9 se trata?<\/strong><\/span><\/p>\n<p>En Artefact somos tan franceses que hemos decidido aplicar el aprendizaje autom\u00e1tico a los cruasanes. Este primer art\u00edculo de dos explica c\u00f3mo hemos decidido utilizar Catboost para predecir las ventas de \u201cviennoiseries\u201d. Las caracter\u00edsticas m\u00e1s importantes que impulsaron las ventas fueron las \u00faltimas ventas semanales, si el producto est\u00e1 en promoci\u00f3n o no y su precio.<\/p>\n<p>Le presentaremos algunas bonitas caracter\u00edsticas de ingenier\u00eda que incluyen la canibalizaci\u00f3n y por qu\u00e9 a veces es necesario actualizar la variable objetivo. Elegimos como m\u00e9tricas de evaluaci\u00f3n la Precisi\u00f3n de Pron\u00f3stico y el biais. Nuestro segundo art\u00edculo explicar\u00e1 c\u00f3mo pusimos este modelo en producci\u00f3n y algunas buenas pr\u00e1cticas de ML Ops.<\/p>\n<p><span style=\"color: #ff0066;\"><strong class=\"jl kd\">\u00bfPara qui\u00e9n?<\/strong><\/span><\/p>\n<ul>\n<li>Data Cient\u00edfico, Ingeniero ML o Data amantes<\/li>\n<\/ul>\n<p id=\"cb94\" class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc df ek\" data-selectable-paragraph=\"\"><span style=\"color: #ff0066;\"><strong class=\"jl kd\">\u00bfPara llevar?<\/strong><\/span><\/p>\n<ul class=\"\">\n<li id=\"ead1\" class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">Algoritmos de refuerzo para la predicci\u00f3n de series temporales<\/li>\n<li id=\"2597\" class=\"jj jk dn jl b em km iq jn ep kn iu jp jq ko js jt ju kp jw jx jy kq ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">C\u00f3mo responder a un problema de previsi\u00f3n con ruido data<\/li>\n<li id=\"a441\" class=\"jj jk dn jl b em km iq jn ep kn iu jp jq ko js jt ju kp jw jx jy kq ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">C\u00f3mo gestionar las limitaciones operativas en la producci\u00f3n<\/li>\n<\/ul>\n<p id=\"d9f7\" class=\"il im dn ce in io ip iq ir is it iu iv iw ix iy iz ja jb jc jd je jf jg jh ji ek\"><span style=\"color: #ff0066;\"><strong>Contexto<\/strong><\/span><\/p>\n<p id=\"730b\" class=\"jj jk dn jl b em jm iq jn ep jo iu jp jq jr js jt ju jv jw jx jy jz ka kb kc df ek\" data-selectable-paragraph=\"\">Recientemente hemos estado trabajando en un tema realmente interesante y desafiante para un gran minorista en Francia: C\u00f3mo predecir la demanda diaria de productos frescos perecederos como la boller\u00eda, incluidos nuestros queridos cruasanes.<\/p>\n<p class=\"jj jk dn jl b em jm iq jn ep jo iu jp jq jr js jt ju jv jw jx jy jz ka kb kc df ek\" data-selectable-paragraph=\"\">Este minorista se enfrentaba a un problema cl\u00e1sico de la cadena de suministro: cada d\u00eda sus panaderos tienen que hornear una cierta cantidad de productos frescos y perecederos: cruasanes, panes de chocolate, baguettes, tartas de lim\u00f3n, etc. La mayor\u00eda de estos productos no duran m\u00e1s de un d\u00eda, si no se venden se consideran ingresos perdidos. Por otro lado, si no hay disponibilidad en los estantes durante el d\u00eda, se traducir\u00e1 en consumidores descontentos y en una p\u00e9rdida de dinero. El reto consiste en predecir a nivel diario, con siete d\u00edas de antelaci\u00f3n, la cantidad de cada producto perecedero para cada tienda. El objetivo de este proyecto es mejorar la disponibilidad en los estantes y reducir al mismo tiempo el desperdicio de alimentos.<\/p>\n<p class=\"jj jk dn jl b em jm iq jn ep jo iu jp jq jr js jt ju jv jw jx jy jz ka kb kc df ek\" data-selectable-paragraph=\"\">Para predecir las ventas con unos d\u00edas de antelaci\u00f3n, ya se utilizaba una soluci\u00f3n interna que utilizaba medidas estad\u00edsticas sencillas. Sin embargo, tras reunirnos con los responsables de la panader\u00eda, comprendimos que hab\u00eda un claro margen de mejora aprovechando m\u00e1s data y caracter\u00edsticas como los efectos de la estacionalidad, el tiempo, las vacaciones, los efectos de la sustituci\u00f3n de productos, etc. As\u00ed pues, decidimos utilizar la soluci\u00f3n actual como l\u00ednea de base y probar algoritmos m\u00e1s recientes para mejorar la precisi\u00f3n de la previsi\u00f3n.<\/p>\n<p class=\"jj jk dn jl b em jm iq jn ep jo iu jp jq jr js jt ju jv jw jx jy jz ka kb kc df ek\" data-selectable-paragraph=\"\">Y para concluir esta introducci\u00f3n, una ilustraci\u00f3n del reto y de lo que queremos conseguir.<\/p>\n<p data-selectable-paragraph=\"\"><img decoding=\"async\" class=\"lazyload size-full wp-image-21368 aligncenter\" src=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2020\/11\/0_tmryqg1LTyu3u_b8.jpeg\" data-orig-src=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2020\/11\/0_tmryqg1LTyu3u_b8.jpeg\" alt=\"\" width=\"700\" height=\"393\" srcset=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%27700%27%20height%3D%27393%27%20viewBox%3D%270%200%20700%20393%27%3E%3Crect%20width%3D%27700%27%20height%3D%27393%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-srcset=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2020\/11\/0_tmryqg1LTyu3u_b8-200x112.jpeg 200w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2020\/11\/0_tmryqg1LTyu3u_b8.jpeg 700w\" data-sizes=\"auto\" data-orig-sizes=\"(max-width: 700px) 100vw, 700px\" \/><\/p>\n<figure class=\"hn ho hp hq hr hd cx cy paragraph-image\">\n<div class=\"hu hv hw hx aj hy\" tabindex=\"0\" role=\"button\">\n<div class=\"cx cy kr\">\n<div class=\"ie s hw if\">\n<div class=\"ig ih s\">\n<div class=\"hz ia t u v ib aj bm ic id\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/figure>\n<\/div><\/div><\/div><\/div><\/div><div class=\"fusion-fullwidth fullwidth-box fusion-builder-row-3 fusion-flex-container nonhundred-percent-fullwidth non-hundred-percent-height-scrolling\" style=\"--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-background-color:#ffffff;--awb-flex-wrap:wrap;\" ><div class=\"fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap\" style=\"max-width:calc( 1440px + 20px );margin-left: calc(-20px \/ 2 );margin-right: calc(-20px \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-3 fusion_builder_column_1_1 1_1 fusion-flex-column\" style=\"--awb-bg-color:#ffffff;--awb-bg-color-hover:#ffffff;--awb-bg-size:cover;--awb-width-large:100%;--awb-margin-top-large:0px;--awb-spacing-right-large:10px;--awb-margin-bottom-large:0px;--awb-spacing-left-large:10px;--awb-width-medium:100%;--awb-order-medium:0;--awb-spacing-right-medium:10px;--awb-spacing-left-medium:10px;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:10px;--awb-spacing-left-small:10px;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><div class=\"fusion-text fusion-text-4\" style=\"--awb-text-color:#000000;\"><p><span style=\"color: #ff0066;\"><strong>Desarrollo de modelos<\/strong><\/span><\/p>\n<p>Ahora que tenemos un problema bien definido y algunos objetivos que alcanzar, por fin podemos empezar a escribir un buen c\u00f3digo python en nuestros cuadernos: \u00a1que empiece la diversi\u00f3n!<\/p>\n<p><span style=\"color: #ff0066;\"><strong>Solicitud Data<\/strong><\/span><\/p>\n<p>Como en cualquier proyecto cient\u00edfico data, todo empieza con data. Por experiencia, le recomendamos encarecidamente que solicite el data lo antes posible. No sea t\u00edmido a la hora de pedir muchos data y para cada fuente de data aseg\u00farese de identificar a un referente, alguien con quien pueda ponerse en contacto f\u00e1cilmente y plantear sus preguntas sobre la colecci\u00f3n de data o sobre c\u00f3mo se estructura el data.<\/p>\n<p>Gracias a las distintas reuniones pudimos elaborar una lista de los data que pod\u00edamos utilizar:<\/p>\n<ul>\n<li>Transaccional data incluido el precio de los productos.<\/li>\n<li>Promociones: una lista de todas las promociones futuras y sus precios asociados.<\/li>\n<li>Informaci\u00f3n sobre el producto: diferentes caracter\u00edsticas relacionadas con los productos.<\/li>\n<li id=\"8e84\" class=\"jj jk dn jl b em km iq jn ep kn iu jp jq ko js jt ju kp jw jx jy kq ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">Informaci\u00f3n sobre las tiendas: ubicaci\u00f3n, tama\u00f1o de las tiendas, competidores.<\/li>\n<li id=\"c5b6\" class=\"jj jk dn jl b em km iq jn ep kn iu jp jq ko js jt ju kp jw jx jy kq ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">Tiempo data.<\/li>\n<li id=\"ca97\" class=\"jj jk dn jl b em km iq jn ep kn iu jp jq ko js jt ju kp jw jx jy kq ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">Residuos data: al final de cada d\u00eda, cu\u00e1ntos productos se tiraron.<\/li>\n<\/ul>\n<p id=\"aa80\" class=\"il im dn ce in io ip iq ir is it iu iv iw ix iy iz ja jb jc jd je jf jg jh ji ek\"><span style=\"color: #ff0066;\"><strong>An\u00e1lisis exploratorio Data (EDA) y detecci\u00f3n de valores at\u00edpicos<\/strong><\/span><\/p>\n<p id=\"67bb\" class=\"jj jk dn jl b em jm iq jn ep jo iu jp jq jr js jt ju jv jw jx jy jz ka kb kc df ek\" data-selectable-paragraph=\"\">Una vez recogida la data, empezamos a hacer algunos an\u00e1lisis. \u00bfExiste estacionalidad en mi data? \u00bfUna tendencia? \u00bfCu\u00e1ntos productos tengo? \u00bfSon coherentes a lo largo del tiempo? \u00bfHay productos estacionales?<\/p>\n<p class=\"jj jk dn jl b em jm iq jn ep jo iu jp jq jr js jt ju jv jw jx jy jz ka kb kc df ek\" data-selectable-paragraph=\"\">Al trazar las diferentes series temporales, tambi\u00e9n detectamos algunas caracter\u00edsticas interesantes:<\/p>\n<ul class=\"\">\n<li id=\"80a9\" class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">Estacionalidad a lo largo del a\u00f1o, pero tambi\u00e9n durante la semana.<\/li>\n<li id=\"d0ce\" class=\"jj jk dn jl b em km iq jn ep kn iu jp jq ko js jt ju kp jw jx jy kq ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">Precios y si el producto est\u00e1 en promoci\u00f3n o no.<\/li>\n<li id=\"c317\" class=\"jj jk dn jl b em km iq jn ep kn iu jp jq ko js jt ju kp jw jx jy kq ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">Canibalizaci\u00f3n de productos y ventas diferidas durante la falta de existencias.<\/li>\n<li id=\"dd82\" class=\"jj jk dn jl b em km iq jn ep kn iu jp jq ko js jt ju kp jw jx jy kq ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">El patr\u00f3n de ventas difiere de una tienda a otra.<\/li>\n<\/ul>\n<p id=\"e6a0\" class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc df ek\" data-selectable-paragraph=\"\">Tenga en cuenta que hemos creado diferentes caracter\u00edsticas relacionadas con la fijaci\u00f3n de precios. El precio absoluto, pero tambi\u00e9n los precios relativos en comparaci\u00f3n con otros productos de la misma subfamilia, familia o tienda. El precio relativo es una forma de cuantificar la canibalizaci\u00f3n de precios entre productos. Tambi\u00e9n creamos caracter\u00edsticas que traducen la variaci\u00f3n del precio de un producto a lo largo del tiempo.<\/p>\n<p class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc df ek\" data-selectable-paragraph=\"\">Para tareas de predicci\u00f3n tan realistas, el diablo est\u00e1 en los detalles y es realmente importante buscar valores at\u00edpicos y anomal\u00edas, tomarse el tiempo necesario para hacer crujir su data.<\/p>\n<p id=\"3dfd\" class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc df ek\" data-selectable-paragraph=\"\">Pero primero, \u00bfpor qu\u00e9 deber\u00edamos preocuparnos por la detecci\u00f3n de valores at\u00edpicos? Por muchas razones, puede indicar un mal data, errores en los ETL, procesos empresariales que desconoc\u00eda. En segundo lugar, es muy probable que afecte a su algoritmo y a la parte de inferencia, por lo que es sin duda una parte importante del desarrollo.<\/p>\n<p class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc df ek\" data-selectable-paragraph=\"\">Puede detectar valores at\u00edpicos en distintos momentos del proyecto, ya sea durante el an\u00e1lisis exploratorio data (EDA) o analizando los mayores errores de sus modelos.<\/p>\n<p class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc df ek\" data-selectable-paragraph=\"\">Al realizar el EDA, detectamos algunos data extra\u00f1os, como las ventas B2B, por ejemplo 1.800 ventas de un solo art\u00edculo en un solo recibo de compra. Valores at\u00edpicos relacionados con la fijaci\u00f3n de precios, en su mayor\u00eda debidos a errores manuales de la cajera: \u00a1precios negativos o un cruas\u00e1n que costaba 250 euros!<\/p>\n<figure class=\"hn ho hp hq hr hd cx cy paragraph-image\">\n<div class=\"hu hv hw hx aj hy\" tabindex=\"0\" role=\"button\">\n<div class=\"cx cy ks\">\n<div class=\"ie s hw if\">\n<div class=\"kt ih s\">\n<div class=\"hz ia t u v ib aj bm ic id\"><\/div>\n<p><img decoding=\"async\" class=\"lazyload vl vm t u v ib aj c aligncenter\" src=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2024\/09\/01TAXEHqr9CLKkcfH.png\" data-orig-src=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2024\/09\/01TAXEHqr9CLKkcfH.png\" data-sizes=\"auto\" data-orig-sizes=\"700px\" srcset=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%27709%27%20height%3D%27348%27%20viewBox%3D%270%200%20709%20348%27%3E%3Crect%20width%3D%27709%27%20height%3D%27348%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-srcset=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2024\/09\/01TAXEHqr9CLKkcfH.png 276w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2024\/09\/01TAXEHqr9CLKkcfH.png 552w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2024\/09\/01TAXEHqr9CLKkcfH.png 640w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2024\/09\/01TAXEHqr9CLKkcfH.png 700w\" alt=\"Image for post\" width=\"709\" height=\"348\" \/><\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/figure>\n<p id=\"fd19\" class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc df ek\" data-selectable-paragraph=\"\">Nos dimos cuenta de que a veces nuestras predicciones estaban totalmente equivocadas los primeros d\u00edas de los periodos de promoci\u00f3n. Despu\u00e9s de algunos an\u00e1lisis nos dimos cuenta de que se deb\u00eda a que la promoci\u00f3n se lanzaba un d\u00eda antes o despu\u00e9s del d\u00eda oficial. De hecho, a veces el gestor se tomaba alguna libertad y decid\u00eda cambiar el inicio o el final de las promociones. Estos cambios pueden detectarse y fijarse en el conjunto de entrenamiento data pero pueden dar lugar a grandes errores de predicci\u00f3n. En efecto, las promociones pueden alcanzar vol\u00famenes de 4 a 5 veces mayores que en caso de no promoci\u00f3n.<\/p>\n<p class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc df ek\" data-selectable-paragraph=\"\">Aqu\u00ed tiene una lista de otros ejemplos interesantes de procesos y mecanismos que hemos descubierto gracias a este an\u00e1lisis y que puede encontrar en sus proyectos:<\/p>\n<ul class=\"\">\n<li id=\"2720\" class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">El surtido no siempre es coherente a lo largo de los d\u00edas debido a limitaciones operativas, errores, gesti\u00f3n de existencias.<\/li>\n<li id=\"1132\" class=\"jj jk dn jl b em km iq jn ep kn iu jp jq ko js jt ju kp jw jx jy kq ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">En el caso de algunas fuentes data, las fechas indicadas eran los d\u00edas en que se carg\u00f3 el data, por lo que es necesario eliminar un d\u00eda para obtener el d\u00eda real.<\/li>\n<\/ul>\n<\/div><\/div><\/div><\/div><\/div><div class=\"fusion-fullwidth fullwidth-box fusion-builder-row-4 fusion-flex-container nonhundred-percent-fullwidth non-hundred-percent-height-scrolling\" style=\"--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-background-color:#ffffff;--awb-flex-wrap:wrap;\" ><div class=\"fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap\" style=\"max-width:calc( 1440px + 20px );margin-left: calc(-20px \/ 2 );margin-right: calc(-20px \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-4 fusion_builder_column_1_1 1_1 fusion-flex-column\" style=\"--awb-bg-color:#ffffff;--awb-bg-color-hover:#ffffff;--awb-bg-size:cover;--awb-width-large:100%;--awb-margin-top-large:0px;--awb-spacing-right-large:10px;--awb-margin-bottom-large:0px;--awb-spacing-left-large:10px;--awb-width-medium:100%;--awb-order-medium:0;--awb-spacing-right-medium:10px;--awb-spacing-left-medium:10px;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:10px;--awb-spacing-left-small:10px;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><div class=\"fusion-text fusion-text-5\" style=\"--awb-text-color:#000000;\"><p><span style=\"color: #ff0066;\"><strong>De la predicci\u00f3n de ventas a la predicci\u00f3n \u00f3ptima de ventas<\/strong><\/span><\/p>\n<p>Un reto nos llev\u00f3 a actualizar nuestra variable objetivo. A veces, debido a una influencia inesperada o a una mala previsi\u00f3n, el departamento esperaba una escasez de productos antes del final del d\u00eda. Entonces pueden producirse dos fen\u00f3menos: el cliente al no poder encontrar su producto no compra nada, o compra un bien similar. Bas\u00e1ndonos en el hist\u00f3rico data, dedujimos algunas leyes de distribuci\u00f3n (estad\u00edsticas b\u00e1sicas) que nos ayudaron a modelizar este impacto y actualizamos nuestra variable objetivo para no predecir las ventas hist\u00f3ricas sino las ventas \u00f3ptimas de un producto concreto.<\/p>\n<p>Esta actualizaci\u00f3n de la variable objetivo es delicada porque es realmente dif\u00edcil saber si la actualizaci\u00f3n ha tenido sentido. \u00bfMejor\u00f3 realmente la calidad del data o la empeor\u00f3? Una forma de cuantificar nuestro impacto fue tomar las ventas sin ruptura de existencias y crear una falsa escasez, por ejemplo, eliminar todas las ventas despu\u00e9s de las 5 \u00f3 6 de la tarde y luego intentar reconstruir las ventas. Este m\u00e9todo nos ayuda a volver a un problema cl\u00e1sico supervisado que podemos evaluar objetivamente.<\/p>\n<p>Como resultado, pudimos predecir las ventas \u00f3ptimas y evitar que nuestro algoritmo aprendiera patrones de escasez.<\/p>\n<p><span style=\"color: #ff0066;\"><strong>Nuestros modelos<\/strong><\/span><\/p>\n<p>Despu\u00e9s de haber limpiado correctamente nuestro data, por fin podemos probar y ensayar algunos modelos.<\/p>\n<p id=\"7083\" class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc df ek\" data-selectable-paragraph=\"\">Tiene muchas posibilidades diferentes para abordar un problema de previsi\u00f3n: enfoques estad\u00edsticos cl\u00e1sicos (SARIMA, Suavizado exponencial, Profeta, etc.), enfoques de aprendizaje autom\u00e1tico (Regresi\u00f3n lineal, Algoritmos de refuerzo) o Aprendizaje profundo (RNN, LSTM, CNN). C\u00f3mo elegir el enfoque adecuado es una cuesti\u00f3n delicada, he aqu\u00ed algunos elementos que nos ayudaron a elegir:<\/p>\n<ul class=\"\">\n<li id=\"8a12\" class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">No una, sino muchas series temporales: ~10 000<\/li>\n<li id=\"80b8\" class=\"jj jk dn jl b em km iq jn ep kn iu jp jq ko js jt ju kp jw jx jy kq ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">Series temporales irregulares: puede ocurrir que no haya ventas durante algunos d\u00edas debido a decisiones del gestor o a limitaciones comerciales u operativas.<\/li>\n<li id=\"6ae9\" class=\"jj jk dn jl b em km iq jn ep kn iu jp jq ko js jt ju kp jw jx jy kq ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">Las promociones tienen un gran impacto y no son estacionales ni c\u00edclicas.<\/li>\n<li id=\"6ba6\" class=\"jj jk dn jl b em km iq jn ep kn iu jp jq ko js jt ju kp jw jx jy kq ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">Observamos una enorme correlaci\u00f3n entre las ventas en J-0 y las ventas de en J-7, J-14, J-21 para los art\u00edculos por tienda y el estado de estar en promociones o no.<\/li>\n<li id=\"6a82\" class=\"jj jk dn jl b em km iq jn ep kn iu jp jq ko js jt ju kp jw jx jy kq ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">Los factores ex\u00f3genos data influyen en las ventas: precios, d\u00edas especiales, etc.<\/li>\n<\/ul>\n<p id=\"638a\" class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc df ek\" data-selectable-paragraph=\"\">Por estas razones, decidimos elegir Catboost como modelo. Catboost tiene muchas ventajas, como el manejo nativo de valores categ\u00f3ricos y ausentes, puede manejar muchas caracter\u00edsticas, se escala bien y puede inferir muchas series temporales dentro del mismo modelo. Adem\u00e1s, proporciona un bonito gr\u00e1fico durante el entrenamiento y se integra muy f\u00e1cilmente con\u00a0<em class=\"ku\">SHAP<\/em>\u00a0para la importancia del rasgo.<\/p>\n<p class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc df ek\" data-selectable-paragraph=\"\">He aqu\u00ed, por ejemplo, una captura de pantalla del gr\u00e1fico interactivo del algoritmo durante su entrenamiento:<\/p>\n<figure class=\"hn ho hp hq hr hd cx cy paragraph-image\">\n<div class=\"hu hv hw hx aj hy\" tabindex=\"0\" role=\"button\">\n<div class=\"cx cy kv\">\n<div class=\"ie s hw if\">\n<div class=\"kw ih s\">\n<div class=\"hz ia t u v ib aj bm ic id\"><\/div>\n<p><img decoding=\"async\" class=\"lazyload vl vm t u v ib aj c aligncenter\" src=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2024\/09\/0IHYfQrWymxriIbmh.png\" data-orig-src=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2024\/09\/0IHYfQrWymxriIbmh.png\" data-sizes=\"auto\" data-orig-sizes=\"700px\" srcset=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%27714%27%20height%3D%27355%27%20viewBox%3D%270%200%20714%20355%27%3E%3Crect%20width%3D%27714%27%20height%3D%27355%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-srcset=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2024\/09\/0IHYfQrWymxriIbmh.png 276w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2024\/09\/0IHYfQrWymxriIbmh.png 552w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2024\/09\/0IHYfQrWymxriIbmh.png 640w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2024\/09\/0IHYfQrWymxriIbmh.png 700w\" alt=\"Image for post\" width=\"714\" height=\"355\" \/><\/p>\n<\/div>\n<div><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/figure>\n<p id=\"e5ba\" class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc df ek\" data-selectable-paragraph=\"\">Sin embargo, uno de los inconvenientes de los enfoques de ML puro es la necesidad de codificar uno mismo todas las caracter\u00edsticas, especialmente las relacionadas con el tiempo. Sin una s\u00f3lida ingenier\u00eda de caracter\u00edsticas, estos algoritmos ser\u00e1n incapaces de captar los patrones temporales. Adem\u00e1s, s\u00f3lo pueden inferir un marco temporal fijo, a diferencia de Sarima o Prophet, en los que puede especificar el n\u00famero de d\u00edas a pronosticar mediante el par\u00e1metro periodos.<\/p>\n<p class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc df ek\" data-selectable-paragraph=\"\">Por \u00faltimo, debe tener mucho cuidado con las fugas de data, especialmente cuando construya su funci\u00f3n de retardo.<\/p>\n<p class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc df ek\" data-selectable-paragraph=\"\">Una de las principales caracter\u00edsticas no era el desfase semanal, sino la media de los desfases: D-7, D-14, D-21, ... etc las \u00faltimas seis semanas. De hecho, la caracter\u00edstica no regular de nuestra serie temporal mezclada con el uso de la promoci\u00f3n de vez en cuando induce una estacionalidad difusa, de ah\u00ed el uso de una media. Es importante observar que el mero uso de esta media como modelo \u00fanico ya ofrece un rendimiento realmente bueno.<\/p>\n<p id=\"8cf2\" class=\"il im dn ce in io ip iq ir is it iu iv iw ix iy iz ja jb jc jd je jf jg jh ji ek\"><span style=\"color: #ff0066;\"><strong>Un modelo frente a muchos modelos<\/strong><\/span><\/p>\n<p class=\"il im dn ce in io ip iq ir is it iu iv iw ix iy iz ja jb jc jd je jf jg jh ji ek\">En resumen, utilizamos un algoritmo Catboost, para predecir todas nuestras 10 000 series temporales, para cada producto y cada tienda. Pero, \u00bfy si un art\u00edculo tiene un patr\u00f3n de ventas realmente particular, o una tienda espec\u00edfica? \u00bfPodr\u00eda el algoritmo identificar y aprender este patr\u00f3n?<\/p>\n<p class=\"il im dn ce in io ip iq ir is it iu iv iw ix iy iz ja jb jc jd je jf jg jh ji ek\">Estas cuestiones nos llevan a preguntarnos, \u00bfdeber\u00edamos agrupar nuestros productos, tiendas y entrenar un algoritmo por agrupaci\u00f3n? Aunque el uso de algoritmos de \u00e1rboles de decisi\u00f3n deber\u00eda hacer frente a este reto, observamos limitaciones en algunos casos concretos.<\/p>\n<p class=\"il im dn ce in io ip iq ir is it iu iv iw ix iy iz ja jb jc jd je jf jg jh ji ek\">Los algoritmos de refuerzo son algoritmos iterativos, basados en aprendices d\u00e9biles que se centrar\u00e1n en sus mayores errores. Evidentemente, est\u00e1 un poco simplificado, pero me sirve para se\u00f1alar una de sus limitaciones. Si no ha normalizado su variable objetivo, su algoritmo \u201cs\u00f3lo\u201d se centrar\u00e1 en los productos con grandes errores, que ser\u00e1n probablemente los que tengan mayores ventas. Como resultado, el algoritmo puede centrarse m\u00e1s en los productos o tiendas con mayor volumen de ventas.<\/p>\n<p class=\"il im dn ce in io ip iq ir is it iu iv iw ix iy iz ja jb jc jd je jf jg jh ji ek\">No encontramos la forma perfecta de abordar este reto, pero observamos algunas mejoras agrupando nuestros productos\/tiendas por familias o frecuencia de venta.<\/p>\n<p id=\"b5a4\" class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc df ek\" data-selectable-paragraph=\"\">Una de las ventajas de entrenar m\u00faltiples algoritmos son:<\/p>\n<ul class=\"\">\n<li id=\"6fdc\" class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">M\u00e1s r\u00e1pido de entrenar<\/li>\n<li id=\"9f1e\" class=\"jj jk dn jl b em km iq jn ep kn iu jp jq ko js jt ju kp jw jx jy kq ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">M\u00e1s f\u00e1cil de afinar<\/li>\n<li id=\"25e8\" class=\"jj jk dn jl b em km iq jn ep kn iu jp jq ko js jt ju kp jw jx jy kq ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">M\u00e1s f\u00e1cil de depurar<\/li>\n<li id=\"9727\" class=\"jj jk dn jl b em km iq jn ep kn iu jp jq ko js jt ju kp jw jx jy kq ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">En caso de anomal\u00edas data no todos los modelos ir\u00e1n mal<\/li>\n<li id=\"812c\" class=\"jj jk dn jl b em km iq jn ep kn iu jp jq ko js jt ju kp jw jx jy kq ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">Dependiendo de los productos, puede jugar con la funci\u00f3n de p\u00e9rdida y promover la escasez o la sobreproducci\u00f3n<\/li>\n<\/ul>\n<p id=\"6381\" class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc df ek\" data-selectable-paragraph=\"\">Pero, por otro lado, \u00a1ser\u00e1 m\u00e1s dif\u00edcil de mantener!<\/p>\n<p class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc df ek\" data-selectable-paragraph=\"\">Al final decidimos optar por este enfoque, ya que estaba dando mejores resultados.<\/p>\n<\/div><\/div><\/div><\/div><\/div><div class=\"fusion-fullwidth fullwidth-box fusion-builder-row-5 fusion-flex-container nonhundred-percent-fullwidth non-hundred-percent-height-scrolling\" style=\"--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-background-color:#ffffff;--awb-flex-wrap:wrap;\" ><div class=\"fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap\" style=\"max-width:calc( 1440px + 20px );margin-left: calc(-20px \/ 2 );margin-right: calc(-20px \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-5 fusion_builder_column_1_1 1_1 fusion-flex-column\" style=\"--awb-bg-color:#ffffff;--awb-bg-color-hover:#ffffff;--awb-bg-size:cover;--awb-width-large:100%;--awb-margin-top-large:0px;--awb-spacing-right-large:10px;--awb-margin-bottom-large:0px;--awb-spacing-left-large:10px;--awb-width-medium:100%;--awb-order-medium:0;--awb-spacing-right-medium:10px;--awb-spacing-left-medium:10px;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:10px;--awb-spacing-left-small:10px;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><div class=\"fusion-text fusion-text-6\" style=\"--awb-text-color:#000000;\"><p id=\"9fc2\" class=\"il im dn ce in io ip iq ir is it iu iv iw ix iy iz ja jb jc jd je jf jg jh ji ek\"><span style=\"color: #ff0066;\"><strong>\u00bfC\u00f3mo evaluar nuestro modelo?<\/strong><\/span><\/p>\n<p id=\"66f9\" class=\"jj jk dn jl b em jm iq jn ep jo iu jp jq jr js jt ju jv jw jx jy jz ka kb kc df ek\" data-selectable-paragraph=\"\">En las secciones anteriores hemos hablado de muchos modelos y de sus prestaciones. Pero, \u00bfc\u00f3mo se eval\u00faa un algoritmo de previsi\u00f3n? Obviamente, es muy similar a cualquier problema de aprendizaje autom\u00e1tico, pero sin embargo tiene sus propias especificidades:<\/p>\n<ol>\n<li>\u00a0Validaci\u00f3n cruzada<\/li>\n<\/ol>\n<p id=\"2a03\" class=\"jj jk dn jl b em jm iq jn ep jo iu jp jq jr js jt ju jv jw jx jy jz ka kb kc df ek\" data-selectable-paragraph=\"\">Como ya se ha mencionado, uno de los retos de la previsi\u00f3n de series temporales es evitar la fuga de data. Puede ocurrir mientras creamos nuestras caracter\u00edsticas: rezagos, normalizaci\u00f3n de nuestras variables, etc...<\/p>\n<p id=\"8fa3\" class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc df ek\" data-selectable-paragraph=\"\">Pero tambi\u00e9n puede ocurrir al realizar la validaci\u00f3n cruzada, dividida entre los conjuntos data de entrenamiento, validaci\u00f3n y prueba.<\/p>\n<p id=\"bc69\" class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc df ek\" data-selectable-paragraph=\"\">No puede utilizar el cl\u00e1sico\u00a0<em class=\"ku\">entrenar_prueba_split()<\/em>\u00a0de sklearn. \u00bfPor qu\u00e9? \u00a1Imagine que su conjunto data son las ventas de 2019, si divide aleatoriamente, entrenar\u00e1 sobre data de enero, febrero, ..., diciembre de 2019 y su data de prueba tendr\u00e1 ventas de las mismas fechas! Como resultado, su algoritmo se entrenar\u00e1 en patrones que no tendr\u00e1 en producci\u00f3n, de ah\u00ed un problema de fuga de data. Para resolver eso hay otras formas de dividir su data como la funci\u00f3n T<em class=\"ku\">imeSeriesSplit()<\/em>\u00a0tambi\u00e9n de sklearn.<\/p>\n<p id=\"8558\" class=\"kx im dn ce in ky kz eo ir la lb er iv es lc eu iz ev ld ex jd ey le fa jh lf ek\">2. La elecci\u00f3n de la m\u00e9trica:<\/p>\n<p id=\"22a7\" class=\"jj jk dn jl b em jm iq jn ep jo iu jp jq jr js jt ju jv jw jx jy jz ka kb kc df ek\" data-selectable-paragraph=\"\">La previsi\u00f3n de series temporales es un problema de regresi\u00f3n, como resultado podemos utilizar las m\u00e9tricas cl\u00e1sicas como MSE, RMSE pero tambi\u00e9n existen otras, aqu\u00ed una lista no exhaustiva:<\/p>\n<ul class=\"\">\n<li id=\"08a5\" class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">MAPE o precisi\u00f3n de las previsiones<\/li>\n<li id=\"2012\" class=\"jj jk dn jl b em km iq jn ep kn iu jp jq ko js jt ju kp jw jx jy kq ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">Un MAPE ponderado<\/li>\n<li id=\"7dfa\" class=\"jj jk dn jl b em km iq jn ep kn iu jp jq ko js jt ju kp jw jx jy kq ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">Deformaci\u00f3n temporal din\u00e1mica<\/li>\n<\/ul>\n<p id=\"2f5b\" class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc df ek\" data-selectable-paragraph=\"\">Optimizamos nuestro algoritmo utilizando el RMSE, pero para comunicarnos con nuestros empresarios utilizamos una Precisi\u00f3n de Previsi\u00f3n ponderada:<\/p>\n<figure class=\"hn ho hp hq hr hd cx cy paragraph-image\">\n<div class=\"cx cy lg\">\n<div class=\"ie s hw if\">\n<div class=\"lh ih s\">\n<div class=\"hz ia t u v ib aj bm ic id\"><\/div>\n<p><img decoding=\"async\" class=\"lazyload vl vm t u v ib aj c aligncenter\" src=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2024\/09\/1TMosktPGqo5c6MG4bQVw8g.png\" data-orig-src=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2024\/09\/1TMosktPGqo5c6MG4bQVw8g.png\" data-sizes=\"auto\" data-orig-sizes=\"342px\" srcset=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%27342%27%20height%3D%2750%27%20viewBox%3D%270%200%20342%2050%27%3E%3Crect%20width%3D%27342%27%20height%3D%2750%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-srcset=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2024\/09\/1TMosktPGqo5c6MG4bQVw8g.png 276w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2024\/09\/1TMosktPGqo5c6MG4bQVw8g.png 342w\" alt=\"Image for post\" width=\"342\" height=\"50\" \/><\/p>\n<\/div>\n<div><\/div>\n<\/div>\n<\/div>\n<\/figure>\n<p id=\"5685\" class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc df ek\" data-selectable-paragraph=\"\">Lo calculamos primero a nivel de d\u00eda\/tienda y luego lo agregamos por tienda utilizando una media ponderada, siendo las ponderaciones las ventas por d\u00eda de las diferentes tiendas. Evidentemente, esta m\u00e9trica puede ser cuestionada, pero tiene la ventaja de disponer de un valor para cada tienda, y si un d\u00eda el gestor rinde realmente (mal o bien) no se sobreestima. Adem\u00e1s FA es una m\u00e9trica realmente interpretable que habla del negocio a diferencia de RMSE.<\/p>\n<p id=\"9603\" class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc df ek\" data-selectable-paragraph=\"\">Por \u00faltimo, otra m\u00e9trica interesante a tener en cuenta es el biais, que introduce la tendencia general del algoritmo a predecir en exceso o a predecir en defecto. Dependiendo del caso de negocio puede que quiera impulsar una u otra. En nuestro caso impulsamos una ligera sobrepredicci\u00f3n para asegurarnos de tener el producto en la estanter\u00eda y \u00a1mantener contento a nuestro cliente!<\/p>\n<p id=\"f905\" class=\"il im dn ce in io ip iq ir is it iu iv iw ix iy iz ja jb jc jd je jf jg jh ji ek\"><span style=\"color: #ff0066;\"><strong>Palabras finales, algunos consejos para cualquier proyecto data<\/strong><\/span><\/p>\n<p id=\"8308\" class=\"jj jk dn jl b em jm iq jn ep jo iu jp jq jr js jt ju jv jw jx jy jz ka kb kc df ek\" data-selectable-paragraph=\"\">He pensado que tambi\u00e9n estar\u00eda bien compartir con ustedes algunos consejos, errores que cometemos a nivel de proyecto.<\/p>\n<p id=\"8ff5\" class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc df ek\" data-selectable-paragraph=\"\">En primer lugar, \u00bfc\u00f3mo desarrollamos nuestros modelos, la ingenier\u00eda de caracter\u00edsticas?<\/p>\n<p id=\"14f4\" class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc df ek\" data-selectable-paragraph=\"\">Todos estos diferentes pasos, experimentos se realizaron en cuadernos, \u00a1pero el uso de cuadernos no significa c\u00f3digo sucio! Al contrario, recomendamos encarecidamente tomarse el tiempo necesario para escribir cuadernos adecuados con t\u00edtulos, nombres propios, funciones y factorizar las l\u00edneas redundantes.<\/p>\n<p id=\"5708\" class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc df ek\" data-selectable-paragraph=\"\">El uso de cuadernos plantea algunos retos, especialmente cuando muchos desarrolladores trabajan juntos: conflictos en github, c\u00f3digo no replicable, etc...<\/p>\n<p id=\"bc94\" class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc df ek\" data-selectable-paragraph=\"\">He aqu\u00ed algunos consejos para reducir estos problemas:<\/p>\n<ul class=\"\">\n<li id=\"e4b4\" class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">Versione sus cuadernos utilizando rebajas<\/li>\n<li id=\"2bc5\" class=\"jj jk dn jl b em km iq jn ep kn iu jp jq ko js jt ju kp jw jx jy kq ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">Evite trabajar juntos en los mismos cuadernos<\/li>\n<li id=\"8f73\" class=\"jj jk dn jl b em km iq jn ep kn iu jp jq ko js jt ju kp jw jx jy kq ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">Si todav\u00eda lo hace, para manejar los conflictos en el cuaderno utilice la funci\u00f3n\u00a0<em class=\"ku\">nbdev<\/em>\u00a0biblioteca de fastai<\/li>\n<li id=\"684e\" class=\"jj jk dn jl b em km iq jn ep kn iu jp jq ko js jt ju kp jw jx jy kq ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">Empaquete las funciones comunes en archivos .py como resultado todo el mundo utilizar\u00e1 las mismas<\/li>\n<li id=\"bec5\" class=\"jj jk dn jl b em km iq jn ep kn iu jp jq ko js jt ju kp jw jx jy kq ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">Para versionar su experimento utilice herramientas como\u00a0<a class=\"ck li\" href=\"https:\/\/mlflow.org\/\" rel=\"noopener nofollow\" target=\"_blank\">Flujo ML<\/a><\/li>\n<li id=\"1688\" class=\"jj jk dn jl b em km iq jn ep kn iu jp jq ko js jt ju kp jw jx jy kq ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">Evite print() y utilice un registrador en su lugar, s\u00f3lo registre la informaci\u00f3n \u00fatil. Compruebe\u00a0<a class=\"ck li\" href=\"https:\/\/scikit-lego.readthedocs.io\/en\/latest\/pandas_pipeline.html#Logging-in-method-chaining\" rel=\"noopener nofollow\" target=\"_blank\">scikit-lego<\/a>\u00a0que tiene caracter\u00edsticas muy interesantes, decoradores.<\/li>\n<li id=\"3dbf\" class=\"jj jk dn jl b em km iq jn ep kn iu jp jq ko js jt ju kp jw jx jy kq ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">Si realmente quiere imprimir cosas pruebe en la biblioteca\u00a0<a class=\"ck li\" href=\"https:\/\/github.com\/willmcgugan\/rich\" rel=\"noopener nofollow\" target=\"_blank\">rico<\/a>\u00a0que lo hace m\u00e1s agradable y tambi\u00e9n puede utilizarse como herramienta de registro. Aqu\u00ed a\u00a0<a class=\"ck li\" href=\"https:\/\/calmcode.io\/rich\/introduction.html\" rel=\"noopener nofollow\" target=\"_blank\">demostraci\u00f3n r\u00e1pida<\/a>\u00a0de ricos por calmcode.io<\/li>\n<\/ul>\n<p id=\"3ec0\" class=\"il im dn ce in io ip iq ir is it iu iv iw ix iy iz ja jb jc jd je jf jg jh ji ek\"><span style=\"color: #ff0066;\"><strong>Puntos clave<\/strong><\/span><\/p>\n<p id=\"1370\" class=\"jj jk dn jl b em jm iq jn ep jo iu jp jq jr js jt ju jv jw jx jy jz ka kb kc df ek\" data-selectable-paragraph=\"\">Nos hubiera encantado compartir con ustedes nuestros resultados, pero no se nos permiti\u00f3 por motivos de privacidad, pero podemos decir que con esta metodolog\u00eda pudimos hacerlo:<\/p>\n<ul class=\"\">\n<li id=\"b9cf\" class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">Sea tan bueno como su mejor planificador de la demanda<\/li>\n<li id=\"2351\" class=\"jj jk dn jl b em km iq jn ep kn iu jp jq ko js jt ju kp jw jx jy kq ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">Aumente la FA de alguna tienda hasta 30%<\/li>\n<\/ul>\n<p id=\"5540\" class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc df ek\" data-selectable-paragraph=\"\">Pero por otro lado, aqu\u00ed est\u00e1 la lista de nuestros mayores aprendizajes que espero le ayuden a desarrollar su propia soluci\u00f3n:<\/p>\n<ul class=\"\">\n<li id=\"f872\" class=\"jj jk dn jl b em ke iq jn ep kf iu jp jq kg js jt ju kh jw jx jy ki ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">T\u00f3mese el tiempo necesario para comprender su problema, defina un objetivo claro y medible, una m\u00e9trica de evaluaci\u00f3n<\/li>\n<li id=\"683c\" class=\"jj jk dn jl b em km iq jn ep kn iu jp jq ko js jt ju kp jw jx jy kq ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">Cruce y explore su data, si no ha encontrado anomal\u00edas... \u00a1no ha mirado lo suficiente!<\/li>\n<li id=\"f77b\" class=\"jj jk dn jl b em km iq jn ep kn iu jp jq ko js jt ju kp jw jx jy kq ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">Realice un seguimiento riguroso de sus experimentos<\/li>\n<li id=\"7685\" class=\"jj jk dn jl b em km iq jn ep kn iu jp jq ko js jt ju kp jw jx jy kq ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">Escriba c\u00f3digo limpio especialmente en cuadernos, le facilitar\u00e1 mucho la vida para la implantaci\u00f3n<\/li>\n<li id=\"e5e1\" class=\"jj jk dn jl b em km iq jn ep kn iu jp jq ko js jt ju kp jw jx jy kq ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">Piense siempre en la producci\u00f3n, las fugas data son su peor enemigo en la previsi\u00f3n de series temporales<\/li>\n<li id=\"2864\" class=\"jj jk dn jl b em km iq jn ep kn iu jp jq ko js jt ju kp jw jx jy kq ka kb kc kj kk kl ek\" data-selectable-paragraph=\"\">Empiece con un \u00e1mbito peque\u00f1o, con modelos sencillos, pruebe, falle, aprenda, mejore y \u00a1tenga \u00e9xito!<\/li>\n<\/ul>\n<\/div><\/div><\/div><\/div><\/div><div class=\"fusion-fullwidth fullwidth-box fusion-builder-row-6 fusion-flex-container nonhundred-percent-fullwidth non-hundred-percent-height-scrolling\" style=\"--link_hover_color: #ff0066;--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-padding-top:0px;--awb-padding-right:0px;--awb-padding-bottom:0px;--awb-padding-left:0px;--awb-flex-wrap:wrap;\" ><div class=\"fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap\" style=\"max-width:calc( 1440px + 20px );margin-left: calc(-20px \/ 2 );margin-right: calc(-20px \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-6 fusion_builder_column_1_2 1_2 fusion-flex-column\" style=\"--awb-bg-size:cover;--awb-width-large:50%;--awb-margin-top-large:0px;--awb-spacing-right-large:10px;--awb-margin-bottom-large:0px;--awb-spacing-left-large:10px;--awb-width-medium:50%;--awb-order-medium:0;--awb-spacing-right-medium:10px;--awb-spacing-left-medium:10px;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:10px;--awb-spacing-left-small:10px;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><div class=\"fusion-image-element\" style=\"text-align:center;--awb-margin-top:0px;--awb-margin-right:0px;--awb-margin-bottom:0px;--awb-margin-left:0px;--awb-caption-title-font-family:var(--h2_typography-font-family);--awb-caption-title-font-weight:var(--h2_typography-font-weight);--awb-caption-title-font-style:var(--h2_typography-font-style);--awb-caption-title-size:var(--h2_typography-font-size);--awb-caption-title-transform:var(--h2_typography-text-transform);--awb-caption-title-line-height:var(--h2_typography-line-height);--awb-caption-title-letter-spacing:var(--h2_typography-letter-spacing);\"><span class=\"fusion-imageframe imageframe-none imageframe-2 hover-type-none\"><img decoding=\"async\" width=\"1057\" height=\"591\" title=\"data-driven\" src=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%271057%27%20height%3D%27591%27%20viewBox%3D%270%200%201057%20591%27%3E%3Crect%20width%3D%271057%27%20height%3D%27591%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-orig-src=\"https:\/\/www.artefact.com\/wp-content\/uploads\/2020\/06\/Global-Newsletter-Data-Digest_LinkedIn_600x315_april.jpg\" alt class=\"lazyload img-responsive wp-image-30246\"\/><\/span><\/div><\/div><\/div><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-7 fusion_builder_column_1_2 1_2 fusion-flex-column fusion-flex-align-self-center fusion-column-inner-bg-wrapper\" style=\"--awb-inner-bg-size:cover;--awb-width-large:50%;--awb-margin-top-large:0px;--awb-spacing-right-large:10px;--awb-margin-bottom-large:0px;--awb-spacing-left-large:10px;--awb-width-medium:50%;--awb-order-medium:0;--awb-spacing-right-medium:10px;--awb-spacing-left-medium:10px;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:10px;--awb-spacing-left-small:10px;\"><span class=\"fusion-column-inner-bg hover-type-none\"><a class=\"fusion-column-anchor\" href=\"https:\/\/go.pardot.com\/l\/597421\/2020-05-06\/2k5zzj\" target=\"_blank\" rel=\"noopener\"><span class=\"fusion-column-inner-bg-image\"><\/span><\/a><\/span><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-center fusion-content-layout-column\"><div class=\"fusion-text fusion-text-7\"><p><b>\u00bfInteresado en digital y data marketing?<\/b><\/p>\n<p>Suscr\u00edbase a Data Digest, el bolet\u00edn de Artefact, para recibir consejos pr\u00e1cticos, ideas y opiniones en su bandeja de entrada todos los meses.<\/p>\n<p><b>\u00a1Ap\u00fanteme!<\/b><\/p>\n<\/div><\/div><\/div><\/div><\/div><\/p>","protected":false},"excerpt":{"rendered":"<p>25 de noviembre de 2020<br \/>\nEn Artefact somos tan franceses que hemos decidido aplicar el aprendizaje autom\u00e1tico a los cruasanes. Este primer art\u00edculo de dos explica c\u00f3mo hemos decidido utilizar Catboost para predecir las ventas de \u201cviennoiseries\u201d. Las caracter\u00edsticas m\u00e1s importantes que impulsaron las ventas fueron las \u00faltimas ventas semanales, si el producto est\u00e1 en promoci\u00f3n o no y su precio. Le presentaremos algunas bonitas caracter\u00edsticas de ingenier\u00eda, como la canibalizaci\u00f3n y por qu\u00e9 a veces es necesario actualizar la variable objetivo.<\/p>","protected":false},"featured_media":21373,"parent":0,"template":"","meta":{"_acf_changed":false,"ep_exclude_from_search":false},"blog-category":[2995],"blog-language":[2991],"class_list":["post-21214","blog","type-blog","status-publish","has-post-thumbnail","hentry","blog-category-ai-technology","blog-language-en"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.artefact.com\/es\/wp-json\/wp\/v2\/blog\/21214","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.artefact.com\/es\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/www.artefact.com\/es\/wp-json\/wp\/v2\/types\/blog"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.artefact.com\/es\/wp-json\/wp\/v2\/media\/21373"}],"wp:attachment":[{"href":"https:\/\/www.artefact.com\/es\/wp-json\/wp\/v2\/media?parent=21214"}],"wp:term":[{"taxonomy":"blog-category","embeddable":true,"href":"https:\/\/www.artefact.com\/es\/wp-json\/wp\/v2\/blog-category?post=21214"},{"taxonomy":"blog-language","embeddable":true,"href":"https:\/\/www.artefact.com\/es\/wp-json\/wp\/v2\/blog-language?post=21214"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}