{"id":3101074,"date":"2025-10-16T09:00:31","date_gmt":"2025-10-16T09:00:31","guid":{"rendered":"https:\/\/www.clicdata.com\/?p=3101074"},"modified":"2025-10-16T09:00:46","modified_gmt":"2025-10-16T09:00:46","slug":"demand-forecasting-supply-chain-python","status":"publish","type":"post","link":"https:\/\/www.clicdata.com\/fr\/blog\/demand-forecasting-supply-chain-python\/","title":{"rendered":"Mettre en place un mod\u00e8le de demand forecasting pour la supply chain avec Python"},"content":{"rendered":"\n<p>Entre surstockage, qui immobilise du capital, et ruptures de stock, qui entra\u00eenent des pertes et de l\u2019insatisfaction client, la gestion des inventaires est un d\u00e9fi central pour toute entreprise de distribution.<\/p>\n\n\n\n<p>La r\u00e9ponse \u00e0 ces probl\u00e9matiques se trouve dans la <strong>pr\u00e9vision de la demande<\/strong> (<em>demand forecasting<\/em>). En analysant les ventes historiques et les facteurs externes (promotions, saisonnalit\u00e9, jours f\u00e9ri\u00e9s), il devient possible d\u2019anticiper les fluctuations de la demande et d\u2019optimiser la planification, la production et la distribution.<\/p>\n\n\n\n<p>Cet article explique comment <strong>construire un mod\u00e8le complet de demand forecasting avec Python<\/strong>, de la collecte de donn\u00e9es jusqu\u2019\u00e0 l\u2019int\u00e9gration des pr\u00e9visions dans un tableau de bord BI.<\/p>\n\n\n\n<p><strong>Public cible :<\/strong> data analysts et data engineers d\u00e9butants souhaitant d\u00e9ployer un projet de <strong>supply chain forecasting<\/strong> efficace.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"676\" src=\"https:\/\/www.clicdata.com\/wp-content\/uploads\/2025\/09\/predictive-warehouse-management-scaled-1-1024x676.webp\" alt=\"R\u00e9seau logistique et entreposage de cartons connect\u00e9s.\" class=\"wp-image-3101075\" srcset=\"https:\/\/www.clicdata.com\/wp-content\/uploads\/2025\/09\/predictive-warehouse-management-scaled-1-1024x676.webp 1024w, https:\/\/www.clicdata.com\/wp-content\/uploads\/2025\/09\/predictive-warehouse-management-scaled-1-300x198.webp 300w, https:\/\/www.clicdata.com\/wp-content\/uploads\/2025\/09\/predictive-warehouse-management-scaled-1-768x507.webp 768w, https:\/\/www.clicdata.com\/wp-content\/uploads\/2025\/09\/predictive-warehouse-management-scaled-1-1536x1014.webp 1536w, https:\/\/www.clicdata.com\/wp-content\/uploads\/2025\/09\/predictive-warehouse-management-scaled-1-2048x1352.webp 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Comprendre le demand forecasting en supply chain<\/h2>\n\n\n\n<p>La <strong>pr\u00e9vision de la demande (demand forecasting)<\/strong> consiste \u00e0 estimer les ventes futures \u00e0 partir de donn\u00e9es pass\u00e9es et de variables explicatives.<\/p>\n\n\n\n<p>En supply chain, elle permet de :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>planifier la production et les approvisionnements,<\/li>\n\n\n\n<li>ajuster les niveaux de stock,<\/li>\n\n\n\n<li>r\u00e9duire les co\u00fbts logistiques li\u00e9s au surstock ou \u00e0 la rupture.<\/li>\n<\/ul>\n\n\n\n<p>Par exemple, un distributeur peut identifier l\u2019impact des soldes ou des f\u00eates sur ses ventes et ajuster ses commandes en cons\u00e9quence. Le <strong>supply chain demand forecasting<\/strong> devient alors un levier direct d\u2019efficacit\u00e9 op\u00e9rationnelle.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Collecte et pr\u00e9paration des donn\u00e9es<\/h3>\n\n\n\n<p>Un mod\u00e8le de <strong>supply chain forecasting<\/strong> est aussi performant que la qualit\u00e9 des donn\u00e9es utilis\u00e9es. Les principaux champs \u00e0 inclure sont :<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Colonne<\/th><th>Description<\/th><\/tr><\/thead><tbody><tr><td><code>Date<\/code><\/td><td>Date ou p\u00e9riode d\u2019enregistrement<\/td><\/tr><tr><td><code>Product_ID<\/code><\/td><td>Identifiant du produit<\/td><\/tr><tr><td><code>Quantity<\/code><\/td><td>Quantit\u00e9 vendue<\/td><\/tr><tr><td><code>Promo<\/code><\/td><td>Indicateur de promotion<\/td><\/tr><tr><td><code>Holiday<\/code><\/td><td>Indicateur de jour f\u00e9ri\u00e9 ou d\u2019\u00e9v\u00e9nement sp\u00e9cial<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:1.125rem;font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#39404f;color:#c8d0e0\">Python<\/span><span role=\"button\" tabindex=\"0\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>import pandas as pd\n\ndata = pd.read_csv(\"sales_data.csv\", parse_dates=&#91;\"Date\"&#93;)\ndata = data.sort_values(\"Date\")\n\nprint(data.info())\nprint(data.head())<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #81A1C1\">import<\/span><span style=\"color: #D8DEE9FF\"> pandas <\/span><span style=\"color: #81A1C1\">as<\/span><span style=\"color: #D8DEE9FF\"> pd<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">data <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> pd<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">read_csv<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">sales_data.csv<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">parse_dates<\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #ECEFF4\">&#91;<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Date<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">&#93;)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">data <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> data<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">sort_values<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Date<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88C0D0\">print<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">data<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">info<\/span><span style=\"color: #ECEFF4\">())<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88C0D0\">print<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">data<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">head<\/span><span style=\"color: #ECEFF4\">())<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p><strong>Bonnes pratiques :<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Imputez ou supprimez les valeurs manquantes selon leur fr\u00e9quence<\/li>\n\n\n\n<li>V\u00e9rifiez la coh\u00e9rence temporelle (pas de dates manquantes)<\/li>\n\n\n\n<li>Supprimez les doublons<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Analyse exploratoire des donn\u00e9es (EDA)<\/h2>\n\n\n\n<p>Avant de mod\u00e9liser, il est indispensable de comprendre les comportements de la demande.<br>L\u2019<strong>analyse exploratoire (EDA)<\/strong> permet de rep\u00e9rer :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>les tendances de fond,<\/li>\n\n\n\n<li>la saisonnalit\u00e9,<\/li>\n\n\n\n<li>les valeurs aberrantes.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Exemple de visualisation temporelle<\/h3>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:1.125rem;font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#39404f;color:#c8d0e0\">Python<\/span><span role=\"button\" tabindex=\"0\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>import matplotlib.pyplot as plt\n\nplt.figure(figsize=(10, 5))\nplt.plot(data&#91;\"Date\"&#93;, data&#91;\"Quantity\"&#93;)\nplt.title(\"\u00c9volution des ventes dans le temps\")\nplt.xlabel(\"Date\")\nplt.ylabel(\"Ventes\")\nplt.show()<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #81A1C1\">import<\/span><span style=\"color: #D8DEE9FF\"> matplotlib<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">pyplot <\/span><span style=\"color: #81A1C1\">as<\/span><span style=\"color: #D8DEE9FF\"> plt<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">plt<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">figure<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9\">figsize<\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #B48EAD\">10<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">5<\/span><span style=\"color: #ECEFF4\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">plt<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">plot<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">data<\/span><span style=\"color: #ECEFF4\">&#91;<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Date<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">&#93;,<\/span><span style=\"color: #D8DEE9FF\"> data<\/span><span style=\"color: #ECEFF4\">&#91;<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Quantity<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">&#93;)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">plt<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">title<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">\u00c9volution des ventes dans le temps<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">plt<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">xlabel<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Date<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">plt<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">ylabel<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Ventes<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">plt<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">show<\/span><span style=\"color: #ECEFF4\">()<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p><strong>Conseils :<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Identifiez les pics li\u00e9s \u00e0 des \u00e9v\u00e9nements saisonniers ou \u00e0 des promotions<\/li>\n\n\n\n<li>Rep\u00e9rez les anomalies qui pourraient biaiser le mod\u00e8le<\/li>\n\n\n\n<li>L\u2019EDA guide les futures \u00e9tapes de preprocessing et de feature engineering<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Feature engineering : enrichir le jeu de donn\u00e9es<\/h3>\n\n\n\n<p>Le <strong>feature engineering<\/strong> permet de r\u00e9v\u00e9ler des structures temporelles et des patterns cach\u00e9s dans les ventes.<\/p>\n\n\n\n<p>Variables de d\u00e9calage (lag features)<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:1.125rem;font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#39404f;color:#c8d0e0\">Python<\/span><span role=\"button\" tabindex=\"0\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>data&#91;\"lag_7\"&#93; = data&#91;\"Quantity\"&#93;.shift(7)<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D8DEE9FF\">data<\/span><span style=\"color: #ECEFF4\">&#91;<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">lag_7<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">&#93;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> data<\/span><span style=\"color: #ECEFF4\">&#91;<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Quantity<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">&#93;.<\/span><span style=\"color: #88C0D0\">shift<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #B48EAD\">7<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Moyennes mobiles<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:1.125rem;font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#39404f;color:#c8d0e0\">Python<\/span><span role=\"button\" tabindex=\"0\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>data&#91;\"rolling_avg_7\"&#93; = data&#91;\"Quantity\"&#93;.rolling(7).mean()<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D8DEE9FF\">data<\/span><span style=\"color: #ECEFF4\">&#91;<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">rolling_avg_7<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">&#93;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> data<\/span><span style=\"color: #ECEFF4\">&#91;<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Quantity<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">&#93;.<\/span><span style=\"color: #88C0D0\">rolling<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #B48EAD\">7<\/span><span style=\"color: #ECEFF4\">).<\/span><span style=\"color: #88C0D0\">mean<\/span><span style=\"color: #ECEFF4\">()<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Variables externes<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:1.125rem;font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#39404f;color:#c8d0e0\">Python<\/span><span role=\"button\" tabindex=\"0\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>data&#91;\"Promo\"&#93; = data&#91;\"Date\"&#93;.isin(promo_dates).astype(int)\ndata&#91;\"Holiday\"&#93; = data&#91;\"Date\"&#93;.isin(holiday_dates).astype(int)<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D8DEE9FF\">data<\/span><span style=\"color: #ECEFF4\">&#91;<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Promo<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">&#93;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> data<\/span><span style=\"color: #ECEFF4\">&#91;<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Date<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">&#93;.<\/span><span style=\"color: #88C0D0\">isin<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">promo_dates<\/span><span style=\"color: #ECEFF4\">).<\/span><span style=\"color: #88C0D0\">astype<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #88C0D0\">int<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">data<\/span><span style=\"color: #ECEFF4\">&#91;<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Holiday<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">&#93;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> data<\/span><span style=\"color: #ECEFF4\">&#91;<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Date<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">&#93;.<\/span><span style=\"color: #88C0D0\">isin<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">holiday_dates<\/span><span style=\"color: #ECEFF4\">).<\/span><span style=\"color: #88C0D0\">astype<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #88C0D0\">int<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p><strong>Bonnes pratiques :<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u00c9vitez de multiplier les features inutiles<\/li>\n\n\n\n<li>Testez leur corr\u00e9lation avec la demande avant de les int\u00e9grer<\/li>\n\n\n\n<li>Supprimez les lignes contenant des <code>NaN<\/code> apr\u00e8s la cr\u00e9ation de lags et de moyennes mobiles<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">S\u00e9lection du mod\u00e8le de pr\u00e9vision<\/h2>\n\n\n\n<p>Trois grandes familles de mod\u00e8les sont utilis\u00e9es pour le <strong>demand forecasting<\/strong> :<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Famille<\/th><th>Mod\u00e8les<\/th><th>Points forts<\/th><th>Cas d\u2019usage<\/th><\/tr><\/thead><tbody><tr><td>S\u00e9ries temporelles classiques<\/td><td>ARIMA, SARIMA, Prophet<\/td><td>Simples \u00e0 interpr\u00e9ter<\/td><td>Donn\u00e9es univari\u00e9es avec saisonnalit\u00e9<\/td><\/tr><tr><td>Machine Learning<\/td><td>Random Forest, XGBoost, LightGBM<\/td><td>Capture les relations non lin\u00e9aires<\/td><td>Donn\u00e9es enrichies avec variables externes<\/td><\/tr><tr><td>Deep Learning<\/td><td>LSTM, GRU<\/td><td>Apprentissage des d\u00e9pendances longues<\/td><td>S\u00e9ries complexes et volumineuses<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Pour un premier projet, <strong>XGBoost<\/strong> est un excellent choix pour sa robustesse et sa flexibilit\u00e9.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Entra\u00eenement et \u00e9valuation du mod\u00e8le<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Exemple avec XGBoost<\/h3>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:1.125rem;font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#39404f;color:#c8d0e0\">Python<\/span><span role=\"button\" tabindex=\"0\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>from xgboost import XGBRegressor\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import mean_absolute_error\n\nfeatures = &#91;\"lag_7\", \"rolling_avg_7\", \"Promo\", \"Holiday\"&#93;\ndata = data.dropna()\n\ntrain, test = train_test_split(data, test_size=0.2, shuffle=False)\n\nmodel = XGBRegressor(n_estimators=200, learning_rate=0.05, max_depth=5)\nmodel.fit(train&#91;features&#93;, train&#91;\"Quantity\"&#93;)\n\npreds = model.predict(test&#91;features&#93;)\nmae = mean_absolute_error(test&#91;\"Quantity\"&#93;, preds)\nprint(f\"MAE : {mae:.2f}\")<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #81A1C1\">from<\/span><span style=\"color: #D8DEE9FF\"> xgboost <\/span><span style=\"color: #81A1C1\">import<\/span><span style=\"color: #D8DEE9FF\"> XGBRegressor<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">from<\/span><span style=\"color: #D8DEE9FF\"> sklearn<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">model_selection <\/span><span style=\"color: #81A1C1\">import<\/span><span style=\"color: #D8DEE9FF\"> train_test_split<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">from<\/span><span style=\"color: #D8DEE9FF\"> sklearn<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">metrics <\/span><span style=\"color: #81A1C1\">import<\/span><span style=\"color: #D8DEE9FF\"> mean_absolute_error<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">features <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#91;<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">lag_7<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">rolling_avg_7<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Promo<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Holiday<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">data <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> data<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">dropna<\/span><span style=\"color: #ECEFF4\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">train<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> test <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">train_test_split<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">data<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">test_size<\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #B48EAD\">0.2<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">shuffle<\/span><span style=\"color: #81A1C1\">=False<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">model <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">XGBRegressor<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9\">n_estimators<\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #B48EAD\">200<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">learning_rate<\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #B48EAD\">0.05<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">max_depth<\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #B48EAD\">5<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">model<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">fit<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">train<\/span><span style=\"color: #ECEFF4\">&#91;<\/span><span style=\"color: #D8DEE9FF\">features<\/span><span style=\"color: #ECEFF4\">&#93;,<\/span><span style=\"color: #D8DEE9FF\"> train<\/span><span style=\"color: #ECEFF4\">&#91;<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Quantity<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">&#93;)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">preds <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> model<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">predict<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">test<\/span><span style=\"color: #ECEFF4\">&#91;<\/span><span style=\"color: #D8DEE9FF\">features<\/span><span style=\"color: #ECEFF4\">&#93;)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">mae <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">mean_absolute_error<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">test<\/span><span style=\"color: #ECEFF4\">&#91;<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Quantity<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">&#93;,<\/span><span style=\"color: #D8DEE9FF\"> preds<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88C0D0\">print<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #81A1C1\">f<\/span><span style=\"color: #A3BE8C\">&quot;MAE : <\/span><span style=\"color: #EBCB8B\">{<\/span><span style=\"color: #D8DEE9FF\">mae<\/span><span style=\"color: #81A1C1\">:.2f<\/span><span style=\"color: #EBCB8B\">}<\/span><span style=\"color: #A3BE8C\">&quot;<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Visualisation des pr\u00e9visions<\/p>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:1.125rem;font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#39404f;color:#c8d0e0\">Python<\/span><span role=\"button\" tabindex=\"0\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>plt.figure(figsize=(10, 5))\nplt.plot(test&#91;\"Date\"&#93;, test&#91;\"Quantity\"&#93;, label=\"R\u00e9el\")\nplt.plot(test&#91;\"Date\"&#93;, preds, label=\"Pr\u00e9vision\")\nplt.legend()\nplt.title(\"Pr\u00e9vision de la demande avec XGBoost\")\nplt.show()<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D8DEE9FF\">plt<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">figure<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9\">figsize<\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #B48EAD\">10<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">5<\/span><span style=\"color: #ECEFF4\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">plt<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">plot<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">test<\/span><span style=\"color: #ECEFF4\">&#91;<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Date<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">&#93;,<\/span><span style=\"color: #D8DEE9FF\"> test<\/span><span style=\"color: #ECEFF4\">&#91;<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Quantity<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">&#93;,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">label<\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">R\u00e9el<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">plt<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">plot<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">test<\/span><span style=\"color: #ECEFF4\">&#91;<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Date<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">&#93;,<\/span><span style=\"color: #D8DEE9FF\"> preds<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">label<\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Pr\u00e9vision<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">plt<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">legend<\/span><span style=\"color: #ECEFF4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">plt<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">title<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Pr\u00e9vision de la demande avec XGBoost<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">plt<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">show<\/span><span style=\"color: #ECEFF4\">()<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p><strong>Interpr\u00e9tation :<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Une erreur MAE faible indique une bonne capacit\u00e9 de g\u00e9n\u00e9ralisation.<\/li>\n\n\n\n<li>Le graphique permet de valider visuellement la coh\u00e9rence des pr\u00e9visions avec les tendances observ\u00e9es.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Exploiter les pr\u00e9visions pour optimiser la supply chain<\/h2>\n\n\n\n<p>Une fois le mod\u00e8le valid\u00e9, les pr\u00e9visions servent \u00e0 piloter les stocks et les approvisionnements.<br>L\u2019objectif est d\u2019atteindre un \u00e9quilibre entre disponibilit\u00e9 produit et ma\u00eetrise des co\u00fbts.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Exemple : calcul du point de r\u00e9approvisionnement<\/h3>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:1.125rem;font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#39404f;color:#c8d0e0\">Python<\/span><span role=\"button\" tabindex=\"0\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>lead_time = 7  # jours\nsafety_stock = preds.std() * 1.65  # niveau de service 95%\nreorder_point = preds.mean() * lead_time + safety_stock<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D8DEE9FF\">lead_time <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">7<\/span><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #616E88\"># jours<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">safety_stock <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> preds<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">std<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">*<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">1.65<\/span><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #616E88\"># niveau de service 95%<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">reorder_point <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> preds<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">mean<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">*<\/span><span style=\"color: #D8DEE9FF\"> lead_time <\/span><span style=\"color: #81A1C1\">+<\/span><span style=\"color: #D8DEE9FF\"> safety_stock<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Ces calculs permettent de d\u00e9finir des seuils de r\u00e9approvisionnement adapt\u00e9s aux variations de la demande.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Int\u00e9gration des pr\u00e9visions dans un tableau de bord BI<\/h2>\n\n\n\n<p>L\u2019int\u00e9gration des r\u00e9sultats dans une solution de <strong>Business Intelligence (BI)<\/strong>, telle que ClicData, Power BI ou Streamlit, transforme la <strong>pr\u00e9vision de la demande<\/strong> en un outil d\u00e9cisionnel exploitable par les \u00e9quipes m\u00e9tiers.<\/p>\n\n\n\n<p><strong>Cas d\u2019usage typiques :<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Suivi des pr\u00e9visions et ventes r\u00e9elles en temps r\u00e9el,<\/li>\n\n\n\n<li>Analyse des \u00e9carts et ajustement des stocks,<\/li>\n\n\n\n<li>Partage des insights avec les d\u00e9cideurs et responsables supply chain.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p>La <strong>pr\u00e9vision de la demande (demand forecasting)<\/strong> est un levier essentiel du <strong>supply chain forecasting<\/strong> moderne.<br>Gr\u00e2ce \u00e0 Python, il devient possible de combiner donn\u00e9es historiques, variables externes et algorithmes performants pour anticiper la demande avec pr\u00e9cision.<\/p>\n\n\n\n<p><strong>\u00c0 retenir :<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Des donn\u00e9es propres et coh\u00e9rentes sont la base de tout mod\u00e8le fiable<\/li>\n\n\n\n<li>Les features temporelles renforcent la pr\u00e9cision des pr\u00e9visions<\/li>\n\n\n\n<li>L\u2019int\u00e9gration BI permet de rendre la pr\u00e9vision directement actionnable<\/li>\n<\/ul>\n\n\n\n<p>En ma\u00eetrisant le <strong>supply chain demand forecasting<\/strong>, les entreprises transforment leurs donn\u00e9es brutes en d\u00e9cisions strat\u00e9giques et gagnent en agilit\u00e9 face aux incertitudes du march\u00e9.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Entre surstockage, qui immobilise du capital, et ruptures de stock, qui entra\u00eenent des pertes et de l\u2019insatisfaction client, la gestion des inventaires est un d\u00e9fi central pour toute entreprise de distribution. La r\u00e9ponse \u00e0 ces probl\u00e9matiques se trouve dans la pr\u00e9vision de la demande (demand forecasting). En analysant les ventes historiques et les facteurs externes [&hellip;]<\/p>\n","protected":false},"author":8,"featured_media":3096254,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_seopress_robots_primary_cat":"none","_seopress_titles_title":"Demand forecasting avec Python : optimiser votre supply chain","_seopress_titles_desc":"Apprenez \u00e0 construire un mod\u00e8le de demand forecasting avec Python pour anticiper la demande et optimiser la supply chain. Guide complet \u00e9tape par \u00e9tape.","_seopress_robots_index":"","footnotes":""},"categories":[100226],"tags":[],"role":[],"sector":[],"class_list":["post-3101074","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-data-analytics"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.clicdata.com\/fr\/wp-json\/wp\/v2\/posts\/3101074","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.clicdata.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.clicdata.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.clicdata.com\/fr\/wp-json\/wp\/v2\/users\/8"}],"replies":[{"embeddable":true,"href":"https:\/\/www.clicdata.com\/fr\/wp-json\/wp\/v2\/comments?post=3101074"}],"version-history":[{"count":9,"href":"https:\/\/www.clicdata.com\/fr\/wp-json\/wp\/v2\/posts\/3101074\/revisions"}],"predecessor-version":[{"id":3101307,"href":"https:\/\/www.clicdata.com\/fr\/wp-json\/wp\/v2\/posts\/3101074\/revisions\/3101307"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.clicdata.com\/fr\/wp-json\/wp\/v2\/media\/3096254"}],"wp:attachment":[{"href":"https:\/\/www.clicdata.com\/fr\/wp-json\/wp\/v2\/media?parent=3101074"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.clicdata.com\/fr\/wp-json\/wp\/v2\/categories?post=3101074"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.clicdata.com\/fr\/wp-json\/wp\/v2\/tags?post=3101074"},{"taxonomy":"role","embeddable":true,"href":"https:\/\/www.clicdata.com\/fr\/wp-json\/wp\/v2\/role?post=3101074"},{"taxonomy":"sector","embeddable":true,"href":"https:\/\/www.clicdata.com\/fr\/wp-json\/wp\/v2\/sector?post=3101074"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}