Combien d’unités commander quand la demande est incertaine ?
Commandez la quantité que la demande ne dépasse pas 66,7 % du temps, c’est-à-dire le ratio critique. Avec une demande moyenne de 1 000 unités (écart type 200), et chaque unité se vend 10, coûte 4 et rapporte 1 si elle reste invendue, cela donne 1 086,1 unités, pour un bénéfice espéré de 5 345,5. Une recherche par simulation de Monte-Carlo sur le fichier d’exemple retient 1 090, le pas le plus proche de cet optimum.
Le ratio critique est le point où la probabilité de vendre une unité de plus, multipliée par ce qu’elle rapporte, égale tout juste la probabilité qu’elle reste invendue, multipliée par ce qu’elle fait perdre. Quand le gain manqué d’une vente perdue dépasse le coût d’une unité invendue, ce point se situe au-dessus de la demande médiane, le niveau que la demande dépasse une fois sur deux. Dans cet exemple, la demande est normale : sa médiane est donc égale à sa moyenne, et les montants sont exprimés dans la monnaie du fichier. La recherche porte sur des commandes de 600 à 1 600 unités par pas de 10 ; à 1 090, le bénéfice moyen est de 5 345 ± 31 (intervalle à 95 %, 5 000 saisons simulées), et la demande dépasse le stock dans 32,6 % des saisons.
Le modèle
C’est le problème du vendeur de journaux : une seule commande passée avant une saison de vente, une demande dont on ne connaît que l’éventail des valeurs possibles, des unités invendues bradées en fin de saison, et toute demande au-delà de la commande perdue. Le fichier Excel ne compte qu’une feuille, Model, avec les libellés en colonne A et les valeurs en colonne B :
Quantité commandée, B1 | 1 000 unités (la décision) |
|---|---|
Prix, B2 | 10 par unité vendue |
Coût unitaire, B3 | 4 par unité commandée |
Valeur de récupération, B4 | 1 par unité restante |
Demande, B6 | normale, moyenne 1 000 unités, écart type 200 |
Quatre formules transforment une commande et une demande en résultat de la saison : les unités vendues, Sold, =MIN(B1,B6) ; les unités restantes, Leftover, =MAX(B1-B6,0) ; le bénéfice, Profit, =B2*B8+B4*B9-B3*B1, soit les ventes plus la valeur de récupération moins le coût de la commande entière ; et les ventes perdues, Lost sales, =MAX(B6-B1,0), la demande que la commande n’a pas pu satisfaire. Une rupture de stock est ici une saison avec des ventes perdues, c’est-à-dire une demande supérieure à la commande. Aucune fonction de complément n’intervient.
Le fichier à télécharger contient ces formules, la commande de 1 000 unités et une valeur fixe provisoire dans la cellule de demande. La distribution de la demande, les deux sorties (Profit et Lost sales), l’objectif de rupture de stock et l’étude d’optimisation sont réglés dans xellstorm et se chargent avec l’exemple, à côté du fichier, qui reste tel que vous l’auriez construit.
Une distribution normale autorise en principe une demande négative, mais zéro se situe à 5 écarts types sous la moyenne, soit une probabilité d’environ 1 sur 3,5 millions ; la plus basse des 5 000 demandes simulées est de 200 unités. La demande est tirée comme un nombre continu : les ventes, les unités restantes et la commande issue de la valeur cible plus bas peuvent donc être des fractions d’unité ; arrondissez à l’unité près au moment de commander.
Pourquoi commander plus que la demande moyenne ?
Pensez à la dernière unité de la commande. Si elle se vend, elle rapporte le prix moins son coût, 10 − 4 = 6. Si elle reste invendue, elle fait perdre son coût moins la valeur de récupération, 4 − 1 = 3. Ajouter l’unité est rentable tant que sa probabilité de se vendre multipliée par 6 dépasse sa probabilité de rester invendue multipliée par 3 : tant que la probabilité de la vendre dépasse 3 / (6 + 3) = 33,3 %. Pour une commande égale à la demande moyenne, 1 000 unités, l’unité suivante se vend une fois sur deux : des commandes plus grandes sont donc rentables. Elles cessent de l’être là où la demande reste sous la commande 66,7 % du temps.
La simulation montre la même arithmétique saison par saison. Sur les mêmes 5 000 saisons simulées, commander 1 090 unités au lieu de 1 000 rapporte exactement 540 de plus (90 × 6) dans les 32,6 % des saisons où la demande atteint 1 090, et exactement 270 de moins (90 × 3) dans les 50 % où la demande reste inférieure ou égale à 1 000 ; dans les saisons intermédiaires, l’écart se situe entre les deux. En moyenne, la plus grande commande rapporte 63,5 de plus par saison, comme le donne la formule exacte ci-dessous (63,5).
La solution exacte : le ratio critique
La règle a un nom, le ratio critique : la meilleure commande Q* est le niveau de demande qui n’est pas dépassé avec la probabilité (prix − coût) / (prix − valeur de récupération), ici (10 − 4) / (10 − 1) = 0,667. Pour une demande normale, Q* = moyenne + z × écart type, où z = 0,4307 est le point de la distribution normale centrée réduite sous lequel se trouvent 66,7 % (=NORM.S.INV(6/9) dans Excel). Soit Q* = 1 000 + 0,4307 × 200 = 1 086,1 unités.
Le bénéfice espéré a lui aussi une forme explicite. Pour toute commande Q, avec z = (Q − moyenne) / écart type, il vaut (prix − valeur de récupération) × (moyenne − écart type × L(z)) − (coût − valeur de récupération) × Q, où L(z) = φ(z) − z × (1 − Φ(z)) est la fonction de perte de la distribution normale centrée réduite, φ étant sa densité et Φ sa fonction de répartition (dans Excel, =NORM.S.DIST(z,FALSE)-z*(1-NORM.S.DIST(z,TRUE))) ; écart type × L(z) est l’espérance des ventes perdues. À Q*, elle se réduit à (prix − coût) × moyenne − (prix − valeur de récupération) × écart type × φ(z) = 5 345,5, et la probabilité de rupture de stock est 1 − 0,667 = 33,3 %. Commander plutôt la demande moyenne, soit 1 000 unités, donne un bénéfice espéré de 5 281,9.
Chercher la quantité à commander par simulation
Les formules exigent un modèle aussi simple (un produit, une commande, des prix fixes) et une distribution de la demande dont les quantiles et les ventes perdues espérées ont des formules ; une simulation n’a besoin que d’un moyen de tirer la demande, et cet exemple vérifie qu’elle trouve le même optimum. L’étude d’optimisation qui se charge avec l’exemple fait de la quantité commandée (B1) la décision et essaie chaque commande de 600 à 1 600 unités par pas de 10, soit 101 commandes candidates, pour maximiser la moyenne de Profit. Une contrainte s’applique : la probabilité de rupture de stock, la part des itérations où Lost sales est supérieur à zéro, doit être d’au plus 50 %. Chaque candidate est simulée avec 1 000 itérations, les trois meilleures sont relancées avec 5 000, et chaque exécution utilise les mêmes tirages aléatoires de la demande. Ces nombres aléatoires communs font que les candidates ne diffèrent que par la commande, pas par la chance des tirages.
| Commande, unités | Bénéfice moyen | Bénéfice espéré exact | Probabilité de rupture de stock |
|---|---|---|---|
| 1 090 | 5 345 ± 31 | 5 345,4 | 32,6 % |
| 1 100 | 5 344 ± 31 | 5 344,0 | 30,9 % |
| 1 110 | 5 341 ± 32 | 5 340,9 | 29,1 % |
La nouvelle exécution retient 1 090 unités : un bénéfice moyen de 5 345 ± 31, contre une valeur exacte de 5 345,4 à cette commande, et une rupture de stock dans 32,6 % des saisons (valeur exacte : 32,6 %). C’est le pas le plus proche de l’optimum exact de 1 086,1, et la valeur exacte du bénéfice espéré, 5 345,5, se situe dans son intervalle.
Les intervalles des trois meilleures commandes se recouvrent presque entièrement, et pourtant le gagnant est net. Chaque intervalle est l’estimation que fait xellstorm du bruit de la moyenne de la candidate, d’après la variation de cette moyenne entre 20 lots d’itérations. Avec l’échantillonnage par hypercube latin, celui par défaut de xellstorm, qui répartit uniformément les tirages de chaque exécution sur la distribution de la demande, la moyenne d’une exécution entière est encore plus stable que ne le suggère son intervalle : en relançant avec 3 autres graines, le bénéfice moyen à 1 090 unités reste à moins de 0,2 de celui de cette exécution.
Ce qui départage les candidates, c’est leur différence, et comme les mêmes tirages tirent toutes les candidates vers le haut ou vers le bas ensemble, ces différences sont bien plus stables que les intervalles. Comparée saison par saison, 1 090 bat 1 100 de 1,43 (intervalle à 95 % de 0,47 à 2,39), un intervalle qui exclut zéro : meilleure au-delà du hasard, mais de peu. La valeur exacte de cette différence de bénéfice espéré est de 1,43. Près du sommet, la courbe du bénéfice est plate : s’écarter d’un pas ne coûte presque rien ; aux extrémités de la plage, 600 et 1 600 unités, le bénéfice espéré tombe à 3 585 et 4 199.
La recherche elle-même a placé 1 100 en tête, avec un bénéfice moyen de 5 370,3 contre 5 369,9 pour 1 090. Elle utilise les 1 000 premières des 5 000 itérations, qui tirent par hasard un peu plus de demande, 1 003,7 unités en moyenne contre 1 000,0 sur l’ensemble, ce qui augmente le bénéfice des plus grandes commandes près du sommet et déplace le pic d’un pas. La nouvelle exécution avec 5 000 itérations tranche, et xellstorm l’indique quand elle change le gagnant.
La contrainte, et ce que coûtent moins de ruptures de stock
La contrainte de rupture de stock ne change pas le résultat ici. Elle exclut les commandes de 1 000 unités ou moins (à 1 000, 51,6 % des itérations de la recherche tombent en rupture) : avec une demande normale, une commande égale à la moyenne tombe en rupture une fois sur deux. La meilleure commande ramène déjà la probabilité de rupture de stock à 32,6 %.
Si une rupture de stock dans 32,6 % des saisons est trop fréquente, par exemple parce que les clients qui trouvent le rayon vide ne reviennent pas, choisissez la probabilité que vous acceptez et laissez une recherche de valeur cible trouver la commande. La valeur cible de xellstorm divise par deux la plage de commandes jusqu’à ce que la statistique atteigne l’objectif. Avec 5 000 itérations par évaluation, elle trouve 1 256,25 unités après 7 évaluations, où exactement 10 % des itérations tombent en rupture. La valeur exacte est le niveau de demande qui a 90 % de chances de ne pas être dépassé, 1 000 + 200 × NORM.S.INV(0.9) = 1 256,3 unités.
| Commande, unités | 1 000 | 1 090 | 1 256,25 |
|---|---|---|---|
| Bénéfice moyen | 5 282 | 5 345 | 5 146 |
| Bénéfice au P10 | 3 695 | 3 425 | 2 926 |
| Probabilité de rupture de stock | 50 % | 32,6 % | 10 % |
| Moyenne des unités restantes | 80 | 133 | 266 |
| Ventes perdues moyennes, unités | 80 | 43 | 9 |
Pour ramener la probabilité de rupture de stock de 32,6 % à 10 %, il faut commander 166 unités de plus, dont 133 restent invendues dans une saison moyenne, et l’on renonce à 199 de bénéfice moyen par saison (3,7 % ; la différence exacte de bénéfice espéré entre les deux commandes est de 199,4). Le bénéfice au P10, le niveau que 90 % des saisons atteignent, baisse aussi, de 3 425 à 2 926 : dans une saison faible, une plus grande commande laisse plus de stock invendu (voir P50, P80 et P90). Commander juste la demande moyenne donne le P10 le plus élevé des trois, mais tombe en rupture dans 50 % des saisons. Savoir si moins de ruptures valent ce prix est une décision d’entreprise ; la simulation chiffre ce prix.
Essayez vous-même
- Ouvrez le modèle dans xellstorm. La distribution de la demande, les sorties Profit et Lost sales, l’objectif (Lost sales supérieur à zéro, la probabilité de rupture de stock) et l’étude d’optimisation sont déjà définis ; rien à installer, pas d’inscription, et le calcul se fait dans votre navigateur.
- Lancez la simulation. À la commande enregistrée de 1 000 unités, avec la graine de l’exemple (7) et 5 000 itérations, le bénéfice moyen est de 5 282 et la probabilité de rupture de stock de 50 %.
- Ouvrez l’étape Optimize. La quantité commandée (
Model!B1) est la cellule de décision, de 600 à 1 600 par pas de 10 ; l’objectif maximise la moyenne de Profit, et la contrainte impose une probabilité de Lost sales supérieur à zéro d’au plus 50 %. Cliquez sur Optimize : l’application évalue chaque commande avec 1 000 itérations, relance les trois meilleures avec 5 000, compare le gagnant au second itération par itération, et trace le bénéfice moyen par quantité commandée avec sa bande à 95 %. - Pour la commande avec une probabilité de rupture de stock de 10 %, choisissez Goal seek (valeur cible) : réglez la statistique sur Probability (probabilité), la condition sur > avec le seuil 0 sur Lost sales, et l’objectif sur 0,1 ; videz le champ Step de la quantité commandée (il contient 10 issu de l’étude), réglez Trials per evaluation sur 5 000, et cliquez sur Seek goal.
- Cliquez sur Set as fixed cells et relancez la simulation pour obtenir les résultats complets à la commande choisie, ou sur Add as scenario pour la comparer à la commande enregistrée sur les mêmes tirages.
Puis-je le faire avec Excel seul ?
Pour ce cas précis, oui : avec une demande normale, =NORM.INV((B2-B3)/(B2-B4), 1000, 200) renvoie directement la commande du ratio critique, 1 086,1. Pour une demande asymétrique, vous remplacez NORM.INV par l’inverse de cette distribution (LOGNORM.INV, GAMMA.INV, ou PERCENTILE.INC sur les ventes passées), mais la règle elle-même cesse de s’appliquer dès que plusieurs produits se partagent un budget ou un entrepôt, qu’il existe une taille de commande minimale, ou qu’un prix de solde dépend de ce qui reste. Une simulation traite ces cas, mais optimiser un modèle simulé dans Excel seul est délicat : chaque recalcul tire de nouveaux nombres aléatoires, si bien qu’une table de données ou le Solveur compare des quantités commandées sur des tirages différents et court après le bruit. xellstorm évalue pour vous chaque candidate sur un seul jeu de tirages figé. La simulation de Monte-Carlo dans Excel présente l’approche générale.
Questions
Qu’est-ce que le modèle du vendeur de journaux ?
Le modèle du vendeur de journaux est le problème classique du choix de la quantité à stocker pour une seule période de vente avant de connaître la demande, quand les unités restantes sont bradées sous le coût et que la demande au-delà du stock est perdue. Sa meilleure commande est le ratio critique de la demande : la quantité que la demande ne dépasse pas avec la probabilité (prix − coût) / (prix − valeur de récupération). Le nom vient d’un vendeur de journaux qui décide chaque matin du nombre d’exemplaires à acheter ; le même problème se pose pour les produits saisonniers, les produits frais, la capacité d’un événement et les séries de production uniques. Pour un stock réapprovisionné en continu, voir quel point de commande équilibre coût et ruptures de stock.
Quand la meilleure commande est-elle inférieure à la demande moyenne ?
La meilleure commande est inférieure à la demande moyenne quand une unité restante coûte plus que ce que fait perdre une vente manquée, c’est-à-dire quand le coût unitaire moins la valeur de récupération dépasse le prix moins le coût unitaire. Le ratio critique est alors inférieur à un demi, et, pour une distribution symétrique de la demande comme la normale, la meilleure commande est inférieure à la moyenne. Des marges minces et un stock invendu sans valeur tirent la commande vers le bas ; des marges élevées et une bonne valeur de récupération la tirent vers le haut.
Pourquoi évaluer chaque quantité commandée sur les mêmes nombres aléatoires ?
Évaluer chaque quantité commandée sur la même demande simulée, ce que l’on appelle les nombres aléatoires communs, fait que les différences entre candidates ne viennent que des commandes. Dans cet exemple, les intervalles à 95 % des trois meilleures commandes se recouvrent presque entièrement, et pourtant la différence saison par saison entre les deux meilleures a un intervalle de 0,47 à 2,39, qui exclut zéro. Avec un échantillonnage aléatoire simple, des tirages neufs pour chaque candidate feraient courir la recherche après le bruit : mesurer la différence entre ces deux commandes avec la même précision demanderait environ 2 000 fois plus d’itérations qu’avec des tirages communs.
Et si la demande n’est pas normale ?
Si la demande n’est pas normale, le ratio critique reste valable, mais la commande doit venir de la fonction quantile de cette distribution, et des formules comme le bénéfice espéré ci-dessus ne s’appliquent plus. Une simulation n’a besoin que de la distribution elle-même : dans xellstorm, choisissez une autre distribution pour la cellule de demande, comme la log-normale, la gamma, la PERT, la loi de Poisson ou la loi binomiale négative, ajustez-en une aux ventes passées à l’étape Distributions, ou laissez le modèle calculer la demande à partir d’autres entrées incertaines, puis lancez la même optimisation.
À lire aussi
- Politique de stock
Quel point de commande équilibre coût et ruptures de stock ?
Un point de commande relevé de 180 à 250 unités fait passer la probabilité d’une année avec rupture de stock de 28,0 % à 5,1 %, pour 345 de plus sur un coût annuel moyen de 2 133. - Guide
P50, P80 et P90 : ce qu’ils signifient et à quel niveau budgétiser
Le P80 est le coût que 80 % des résultats simulés ne dépassent pas. Six postes de coût d’un bâtiment : leurs P80 totalisent 2 843, mais le P80 de leur somme est de 2 756 (milliers de dollars US). - Guide
Simulation de Monte-Carlo sur Excel, avec ou sans complément
Trois façons de lancer une simulation de Monte-Carlo sur un modèle Excel : RAND() et une table de données, un complément, ou un outil dans le navigateur sans complément. Formule PERT incluse.
xellstorm est un outil de simulation de Monte-Carlo qui fonctionne dans le navigateur, pour les modèles Excel : aucun complément, et votre fichier ne quitte jamais votre ordinateur.