Formule du taux de service optimal pour l’optimisation des stocks

Notebook-as-a-book illustration







Par Joannès Vermorel, dernière version janvier 2012

Le taux de service (pour les stocks) représente la probabilité attendue de ne pas atteindre la rupture de stock. Ce pourcentage est nécessaire pour calculer le stock de sécurité. Intuitivement, le taux de service représente un compromis entre le coût du stock et celui des ruptures de stock (qui entraînent, entre autres, des ventes manquées, des opportunités perdues et une frustration du client). Dans cet article, nous décrivons comment optimiser la valeur du taux de service. Puis, nous proposons une analyse plus détaillée pour les cas particuliers des denrées périssables.

Cet article a été rédigé du point de vue des "prévisions classiques" en 2011. Quelques années plus tard, nous nous rendons compte qu'il existe de bien meilleures options en logistique quantitative, grâce auxquelles il n'est plus nécessaire d'optimiser les taux de service lorsque la technologie repose sur des grilles quantiles.

Modèle et formule

Les ouvrages classiques sur la chaîne logistique sont quelque peu confus en ce qui concerne les valeurs numériques qui devraient être adoptées pour le taux de service. Nous proposons ci-dessous de calculer le taux de service optimal en modélisant le coût respectif du stock et celui des ruptures de stock.

Introduisons les variables suivantes :
  • soit $p$, le taux de service, c'est-à-dire la probabilité de ne pas être en rupture de stock.
  • soit $H$, le coût de possession par unité pendant la durée du délai de réapprovisionnement (1).
  • soit $M$, le coût unitaire marginal d’une rupture de stock (2).

Téléchargez la feuille Excel : service-level-formula.xlsx (calcul illustré)

(1) La durée prise en compte ici est le délai de réapprovisionnement. Par conséquent, au lieu de prendre en compte le coût de possession annuel $H_y$, plus habituel, nous prenons en compte $H = \frac{d}{365}H_y$ avec $d$ le délai de réapprovisionnement exprimé en jours.

(2) Le coût d’une rupture de stock inclut a minima la marge brute, c'est-à-dire le profit immédiat qui aurait dû être généré si aucune rupture de stock n’avait eu lieu. Cependant, la perte de marge brute n’est pas le seul coût : par exemple, la frustration du client et la perte de la fidélité du client devraient également être prises en compte. En règle générale, nous observons que de nombreux distributeurs alimentaires considèrent que $M$ est égal à 3 fois la marge brute.

Le taux de service optimal est donné par l'équation suivante (le raisonnement est détaillé ci-dessous) : $$p=\Phi\left(\sqrt{2\ln\left(\frac{1}{\sqrt{2\pi}}\frac{M}{H}\right)}\right)$$ Où $\Phi$ est la fonction de distribution cumulative associée à la distribution normale. Cette valeur peut être calculée facilement dans Excel ; $\Phi$ est la fonction NORMSDIST. De plus, pour le calcul numérique : $\sqrt{2 \pi} \approx 2,50 $

Fonction de coût

Pour modéliser la fonction de coût, nous introduisons deux variables supplémentaires :
  • soit $Q$, la quantité de stock amortie (3), une fonction dépendant de $p$.
  • soit $O$, la demande excédentaire moyenne en cas de rupture de stock.

(3) Nous adoptons ici le point de vue de l’Analyse Amortie. Le niveau du stock varie tout le temps, mais, dans le but de rendre l'analyse pratique, notre objectif ici est d’obtenir une valeur de taux de service indépendante (au sens statistique) de la prévision de la demande elle-même. Par conséquent, nous ferons l'hyptohèse que $Q$ est égal au point de commande (pour en savoir plus, vous pouvez consulter notre guide sur le stock de sécurité).

Pour un taux de service donné, le coût total $C(p)$ combinant à la fois le coût du stockage et les coûts d’une rupture de stock peut s'écrire : $$C(p) = Q(p)H + (1-p)MO$$ Où $Q(p)H$ est le coût du stock et $MO$ le coût d’une rupture de stock, ayant uniquement lieu avec une probabilité $1-p$. En utilisant la formule introduite dans notre tutoriel sur le stock de sécurité, et étant donné que $Q(q)$ est égal au point de réapprovisionnement, nous avons $Q(p) = Z + \sigma \Phi^{-1}(p)$ où $Z$ est la demande outil, $\sigma$ l’erreur de prévision attendue, et $\Phi(p)^{-1}$ l’inverse de la fonction de distribution cumulative associée à la distribution normale standard (moyenne de zéro et variante de un).

Analyse des ventes manquées moyennes

L’analyse de $O$, les ventes manquées moyennes, est subtile. En considérant que la distribution de la demande est la distribution normale $\mathcal{N}$ et que $q$ est le stock disponible, $O(q)$ est la moyenne conditionnelle de la demande $x$ lorsque $x > q$ (moins le stock disponible $q$), alors : $$O(q)=\frac{\int_q^\infty{x\mathcal{N}(x)dx}}{\int_q^\infty{\mathcal{N}(x)dx}}-q=\frac{1}{q}+\mathcal{o}\left(\frac{1}{q}\right)$$ Obtenez un aperçu de la fonction en cliquant ici (1).

Ce résultat peut être interprété de la façon suivante : si la demande suit rigoureusement la distribution normale, alors la quantité moyenne de ventes manquées en cas de rupture de stock converge rapidement vers zéro à mesure que le niveau du stock augmente.

Cependant, notre expérience nous indique que l’erreur de prévision n’a pas de convergence aussi bonne que celle que la distribution normale prévoirait. Par conséquent, nous ferons ci-dessous l'hypothèse que $O=\sigma$, c'est-à-dire que la quantité moyenne de ventes manquées est égale à l’erreur de prévision moyenne. A l'évidence, il s'agit plus d'une règle générale que d'une analyse approfondie, mais nous avons découvert qu'en pratique, cette approximation donnait des résultats tout à fait sensés.

Minimisation de la fonction de coût

En appliquant les changements définis ci-dessus à l’expression de $C(p)$, nous obtenons : $$C(p) = \left(Z + \sigma \Phi^{-1}(p)\right)H + (1-p)M\sigma$$ Ensuite, l’expression $C(p)$ peut être dérivée par $p$, avec : $$\frac{\partial C}{\partial p} = \sigma H \partial \Phi^{-1}(p) - \sigma M$$ Étant donné que nous cherchons la valeur minimum, nous essayons de résoudre $\frac{\partial C}{\partial p} = 0$, ce qui donne : $$\sigma H \partial \Phi^{-1}(p) - \sigma M = 0$$ Ce qui peut être simplifié par $\sigma$, avec : $$H \partial \Phi^{-1}(p) - M = 0$$ Et pour finir : $$\partial \Phi^{-1}(p) = \frac{M}{H}$$ Puis, nous utiliserons la relation entre $\partial \Phi^{-1}$ and $\Phi^{-1}$ : $$\partial \Phi^{-1}(p)=\sqrt{2\pi}e^{\frac{1}{2}\Phi^{-1}(p)^2}$$ Pour voir avoir une preuve visuelle de l’égalité, vous pouvez comparer (1) et (2).

Cette relation nous permet d’obtenir : $$\sqrt{2\pi}e^{\frac{1}{2}\Phi^{-1}(p)^2}=\frac{M}{H}$$ $$\frac{1}{2}\Phi^{-1}(p)^2=\ln\left(\frac{1}{\sqrt{2\pi}}\frac{M}{H}\right)$$ Nous prenons la solution racine positive de l’équation (la racine négative correspond au maximum local de la fonction) avec : $$\Phi^{-1}(p)=\sqrt{2\ln\left(\frac{1}{\sqrt{2\pi}}\frac{M}{H}\right)}$$ Et finalement, en appliquant $\Phi$ des deux côtés, nous obtenons le taux de service optimal avec : $$p=\Phi\left(\sqrt{2\ln\left(\frac{1}{\sqrt{2\pi}}\frac{M}{H}\right)}\right)$$

Discussion sur la formule

Le premier aspect intéressant de la formule est que le taux de service optimal dépend uniquement de $H$ (coût de possession) et de $M$ (coût d’une rupture de stock). Cependant, il existe une dépendance implicite au délai de réapprovisionnement étant donné que $H$ a été défini comme le coût de possession pendant la durée du délai de réapprovisionnement.

Deuxièmement, un coût de possession plus élevé réduit le taux de service optimal ; et, de même, un coût de rupture de stock plus élevé augmente le taux de service. Ce comportement est assez intuitif car le taux de service est un compromis entre davantage de stocks et davantage ruptures de stock.

Enfin, la formule n’est pas valide pour toutes les valeurs de $M$ et $H$. Il faut que $\sqrt{2\pi}\frac{M}{H} > 1$ ou l’algorithme produira une valeur négative, qui n'est pas maniable compte tenu de la racine carrée externe. Nous obtenons $M > \sqrt{2 \pi} H$, ce qui peut être approximé par $M > 2.5 H$. Si cette condition n’est pas vérifiée, cela signifie que la fonction de coût initiale $C(p)$ n’a pas de minimum, ou plutôt, que le minimum est $-\infty$ pour $p=0$. D'un point de vue pratique, $M < 2.5 H$ pourrait être interprété comme une situation pathologique, dans laquelle le niveau de stock le plus rentable serait un stock de zéro (soit 100% de rupture de stock).

Exemple pratique

Prenons une bouteille de lait de 1L vendue au prix de 1,50€, avec une marge de 10% (soit 0,15€ de marge brute). Supposons que le délai de réapprovisionnement est de 4 jours. Le coût de possession annuel est de 1,50€ (la valeur est élevée car le lait est un produit hautement périssable). Nous supposons que le coût de rupture de stock représente 3 fois la marge brute, c’est-à-dire 0,45€. Cela nous donne $M=0,45$ et $H=\frac{4}{365} 1,5\approx 0,0055$.

En nous basant sur ces valeurs et sur la formule de taux de service optimal obtenues ci-dessus, nous obtenons $p\approx 98,5\%$, ce qui est une valeur typique pour des produits frais incontournables stockés dans les entrepôts alimentant les réseaux de la distribution alimentaire.

Denrées périssables

Question posée par Vyacheslav Grinkevych, expert en chaîne logistique, 13-02-2012 :
Je travaille sur la Prévision et la Planification de l’approvisionnement pour les produits laitiers périssables à court terme, où le taux de service optimal est un sujet très important. Le composant le plus intéressant et le plus délicat ici est H – le coût de possession – et la question de sa valeur adéquate en pratique.

Par exemple, pour des produits laitiers à durée de vie courte, l’un des aspects les plus importants de H ne devrait pas seulement être le coût purement financier des liquidités gelées dans les coûts de stockage et les coûts logistiques opérationnels, mais également le coût des pertes potentielles dues à la casse sur les produits périmés ou aux ventes discount qui doivent être effectuées pour tenter d'écouler les produits juste avant leur date de péremption. Cela se produit lorsque vos ventes sont bien en-dessous des prévisions.

Ce compromis peut être décrit comme le risque d’excédents de stock potentiels par rapport au risque de ruptures de stock potentielles – deux risques opposés, mais ayant la même origine par nature – c'est-à-dire reliés au stock de sécurité. En cas de grosse surestimation, entraînant généralement un problème de péremption, les erreurs de prévision ne sont pas distribuées normalement. Par conséquent, je me demande comment mieux exprimer ces risques de ruptures de stock potentielles.

Pour en revenir à votre formule, on pourrait essayer de la développer encore davantage pour tenter de trouver une relation entre H et p, ou pour faire de H une fonction de p, c'est-à-dire H(p), avant d'en venir à la minimisation du coût total C(p). Qu’en pensez-vous ?

La formule du taux de service donnée ci-dessus est en effet basée sur une hypothèse simpliste selon laquelle les coûts, à la fois les coûts de stockage et de rupture de stock, sont strictement linéaires. Cependant, en pratique, on peut trouver des non linéarités brutales :
  • L'entrepôt est plein, et il existe un point au-delà duquel l'ajout d'une unité supplémentaire de stock entraîne des coûts supplémentaires massifs car il faut trouver un nouvel entrepôt.
  • Les ruptures de stock entraînent des pertes de ventes croissantes, jusqu'au point où une rupture de stock supplémentaire cause la perte complète du client récurrent.

Les denrées périssables présentent un autre problème : si la couverture de stock, à savoir le stock exprimé en jours plutôt qu’en unités de stock, se rapproche de la durée de vie du produit avant péremption, alors $H$, le coût de possession, augmente en tendant vers l'infini.

En effet, $H$ représente la friction associée au simple fait d'avoir du stock. Une couverture de stock supérieure à la durée de vie d’un produit représente une situation absurde dans laquelle, en prenant l'hypothèse qu'on a une gestion de stock de type FIFO (Premier arrivé, Premier sorti - First In, First Out), aucun produit ne quitterait l’entrepôt sans avoir d'abord atteint sa date de péremption.

Pour modéliser l’effet de la périssabilité du stock, nous introduisons quelques durées clées :
  • soit $\lambda$, le délai de réapprovisionnement
  • soit $\lambda_\infty$, la durée de vie du produit avant d’arriver à la date de péremption (c'est-à-dire avant d'atteindre une valeur nulle).
  • soit $\lambda_½$, la durée qui double le coût de possession d’origine du produit du fait de la perte de sa valeur de marché.
  • soit $\lambda_c(p)$, la couverture de stock, c'est-à-dire le stock exprimé en jours plutôt qu’en unités de produit. Cette durée dépend du facteur du stock de sécurité, et par conséquent de $p$.

Avec ces durées, nous pouvons modéliser le coût de possession comme suit : $$ H(p) = H \left(1 - \frac{\lambda_\infty - \lambda_½}{\lambda_\infty - \lambda} + \frac{\lambda_\infty - \lambda_½}{\lambda_\infty - \lambda_c(p)} \right) $$

Détaillons l'hypothèse implicite sous-jacente, car nous tordons quelque peu la notion usuelle de coût de possession dans le but de prendre en compte le risque de casse.

Tout d’abord, nous avons $H(0,5)=H$. Nous obtenons ceci d’après la définition même donnée ci-dessus. En effet $\lambda_c(0.5)=\lambda$, avec un taux de service à 50%, la couverture de stock est égale au délai de réapprovisionnement. Par conséquent, nous déclarons ici que, dans ce modèle, $H$ représente le coût de possession dans lequel les coûts de la casse, associé à un taux de service de 50%, ont déjà été pris en compte. Il est intéressant de noter que zéro stock de sécurité n’implique pas un taux de casse de zéro avec zéro perte de produits arrivés à leur date de péremption, mais seulement des pertes peu fréquentes.

Deuxièmement, pour le taux de service $p_½$ tel que $\lambda_c(p_½) = \lambda_½$, alors nous avons $H(p_½)=2H$. Là encore, il s’agit simplement d’une conséquence de la définition adoptée pour $H(p)$. De façon intuitive, $\lambda_½$ représente la durée qui double la combinaison des coûts de possession et des coûts associés à la casse, par comparaison avec la situation zéro stock de sécurité. Il est clair qu’en pratique, le coût supplémentaire découlant des discounts sur les produits en fin de vie et les produits périmés passera par des étapes assez discrètes. Cependant, nous pensons qu’essayer d’exprimer de coût supplémentaire à travers une durée classique qui, en pratique, serait définie comme une certaine fraction de la durée de vie du produit, est une approche potentiellement bien plus résistante aux diverses approximations nécessairement impliquées, par opposition à un modèle plus raffiné, reposant sur des variables encore plus incertaines.

Pour finir, à mesure que $p$ se rapproche de $p_\infty$ avec $\lambda_c(p_\infty)=\lambda_\infty$, alors $H(p)$ tend vers l'infini, une fois encore par définition de la fonction adoptée pour $H(p)$. Au premier abord, il peut sembler étrange d’avoir un coût de possession qui dépasse le coût unitaire du produit, mais il n’y a là aucun paradoxe. La valeur $H(p)$ représente le coût de friction pour qu’une unité soit livrée au client. Si, du fait de grosses pertes sur des produits périmés, pour livrer 1 unité au client final, l’entrepôt reçoit en moyenne 3 unités (dont 2 seront périmées avant d'avoir pu être livrées), alors les coûts de friction seront bien supérieurs au prix unitaire d’origine du produit.

En résumé, $\lambda_½$ est uniquement une variable incertaine introduite. On peut raisonnablement faire l'hypothèse que $\lambda$ et $\lambda_\infty$ sont connues. Nous pensons que ce modèle pour $H(p)$ est à peu près ce que l'on peut obtenir de plus simple en introduisant une seule variable supplémentaire. Ensuite, pour $\lambda_c(p)$, avec une approximation modeste, nous avons : $$\lambda_c(p) = \lambda \left(1 +\frac{\sigma}{Z}\Phi^{-1}(p)\right)$$

En effet, $\lambda_c$, la couverture de stock, peut être vue comme un ratio sur le délai de réapprovisionnement, incluant la demande outil plus un facteur de stock de sécurité normalisé. Ceci donne la fonction de coût alternative : $$C^*(p) = \left(Z + \sigma \Phi^{-1}(p)\right)H\left(1 - \frac{\lambda_\infty - \lambda_½}{\lambda_\infty - \lambda} + \frac{ \lambda_\infty - \lambda_½}{\lambda_\infty - \lambda \left(1 +\frac{\sigma}{Z}\Phi^{-1}(p)\right)} \right) + (1-p)M\sigma$$

Contrairement à la fonction de coût précédente, cette fonction ne semble pas avoir de minimum algébrique simple. Cependant, en adoptant une approche similaire à celle utilisée pour calculer la quantité économique de commande (EOQ), il est relativement facile de trouver une solution approximative, en itérant via des augmentations de 0,1%, en allant de 80% à 99,9%. Cela représente 200 itérations pour pouvoir atteindre une précision de 0,1%, amplement suffisante à des fins pratiques.

Usage pratique prévu

La formule de taux de service s'accompagne de quelques approximations, par conséquent, les valeurs numériques peuvent ne pas être immédiatement utilisables : il y a généralement des ajustements à faire. En particulier, le facteur $\frac{1}{\sqrt(2\pi)}\approx0,4$ peut être ajusté en fonction des besoins. Cependant, nous pensons que cette formule peut vous donner une bonne idée de la manière dont les taux de service respectifs de vos items devraient être ordonnés. Par exemple, si pour deux produits A et B, vous obtenez des taux de service de 95% (pour A) et 90% (pour B), alors pour la configuration du passage production, les résultats doivent être conformes à vos attentes et le taux de service pour A doit être supérieur au taux de service pour B.

Enfin, compte tenu de la nature de l’analyse ci-dessus, nous pensons que cette formule n'est pas adaptée aux produits associés à une demande faible ou intermittente. En effet, ce type de faibles volumes de produits sont généralement associés à des points de commande de 0 ou 1 unité ; une modélisation linéaire du coût de possession du produit n’a pas toujours du sens, car la complexité du stockage d’une référence supplémentaire doit également être prise en compte.