Calcolare un livello di servizio ottimale (catena logistica)

di Joannès Vermorel, ultima revisione Gennaio 2012

Il livello di servizio (nella gestione delle scorte) rappresenta la probabilità attesa di non incorrere in una rottura di stock. È espresso in percentuale e serve a calcolare la scorta di sicurezza. Intuitivamente, il livello di servizio è un compromesso tra i costi di gestione del magazzino e i costi di una eventuale rottura di stock (in cui rientrano, tra le altre cose, mancate vendite, opportunità perse e frustrazione dei clienti). In questo articolo, vedremo in dettaglio come ottimizzare il valore del livello di servizio, con particolare riferimento alle merci deperibili.

Questo articolo è stato scritto nel 2011, sulla base dei metodi di previsione tradizionale. Tuttavia, ricordiamo che, a distanza di ormai qualche anno, esistono altre opzioni disponibili per la supply chain, che consentono di evitare l'ottimizzazione dei livelli di servizio grazie a una tecnologia di previsione probabilistica.

Modello e formula

In materia di supply chain, la letteratura classica è piuttosto vaga al riguardo dei valori numerici da adottare per il livello di servizio. Qui di seguito proponiamo di calcolare il livello di servizio ottimale, modellizzando i costi rispettivi di gestione del magazzino e di rottura di stock.

Introduciamo le seguenti variabili:
  • sia $p$ il livello di servizio, ossia la probabilità di non incorrere in una rottura di stock;
  • siano $H$ i costi di mantenimento a magazzino per unità, per la durata del lead time (1);
  • sia $M$ il costo unitario marginale di una rottura di stock (2).

Scarica il foglio di calcolo Excel: service-level-formula.xlsx (calcolo illustrato)

(1) La durata che consideriamo qui è quella del lead time. Pertanto, invece di considerare, come avviene di solito, i costi annuali di mantenimento a magazzino $H_y$, considereremo $H = \frac{d}{365}H_y$, dove $d$ è il lead time espresso in giorni.

(2) I costi di una rottura di stock includono essenzialmente il margine lordo, ossia il profitto istantaneo che sarebbe stato generato se non si fosse verificata la rottura di stock, ma anche altri tipi di perdita, ad esempio la frustrazione e la conseguente perdita di fidelizzazione del cliente. Abbiamo potuto osservare che, in genere, molti rivenditori alimentari considerano $M$ pari a 3 volte il margine lordo.

Il livello di servizio ottimale è dato da (ragionamento dettagliato più sotto): $$p=\Phi\left(\sqrt{2\ln\left(\frac{1}{\sqrt{2\pi}}\frac{M}{H}\right)}\right)$$ dove $\Phi$ è la funzione di distribuzione cumulativa associata alla distribuzione normale. Il valore può essere facilmente calcolato con Excel, dove $\Phi$ corrisponde alla funzione NORMSDIST. Per il calcolo numerico: $\sqrt{2 \pi} \approx 2,50$

Funzione di costo

Per modellizzare i dati in una funzione di costo, introdurremo altre due variabili:
  • sia $Q$ la quantità di scorte ammortizzata (3), una funzione dipendente da $p$;
  • sia $O$ la domanda eccedente media in caso di rottura di stock.

(3) Adotteremo qui il punto di vista dell'analisi ammortizzata. Il livello delle scorte varia costantemente; il nostro obiettivo, però, è quello di rendere l'analisi pratica, ottenendo un valore per il livello di servizio che sia dissociato dalla previsione stessa della domanda. Pertanto, ipotizzeremo che $Q$ sia uguale al punto di riordino (leggere la nostra guida alla scorta di sicurezza per i dettagli).

Per un dato livello di servizio, il costo totale $C(p)$, che combina sia i costi di mantenimento a magazzino, sia i costi di una rottura di stock, può essere calcolato in questo modo: $$C(p) = Q(p)H + (1-p)MO$$ dove $Q(p)H$ è il costo di mantenimento a magazzino e $MO$ il costo della rottura di stock, che si verifica unicamente con una probabilità pari a $1-p$. Usando la formula introdotta nel nostro tutorial sulla scorta di sicurezza, poiché $Q(q)$ è uguale al punto di riordino, avremo $Q(p) = Z + \sigma \Phi^{-1}(p)$, dove $Z$ è il consumo nel lead time, $\sigma$ l'errore di previsione atteso e $\Phi(p)^{-1}$ l'inverso della funzione di distribuzione cumulativa associata alla distribuzione normale standard (media 0, varianza 1).

Analisi delle vendite mancate medie

L'analisi di $O$, ossia delle vendite mancate medie, è sottile. Considerando che la distribuzione della domanda è la distribuzione normale $\mathcal{N}$ e che $q$ sono le scorte disponibili, $O(q)$ è la media condizionata della domanda $x$ quando $x > q$ (meno le scorte disponibili $q$), cioè: $$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)$$ Per visualizzare la funzione, fare clic qui (1).

Il risultato può essere così interpretato: se la domanda segue rigorosamente la distribuzione normale, allora la quantità media di vendite mancate nell'evento (condizionato) di una rottura di stock convergerà rapidamente verso zero man mano che le scorte aumenteranno.

Secondo la nostra esperienza, però, l'errore di previsione non ha la stessa convergenza ottimale che la distribuzione normale prevedrebbe. Pertanto, ipotizzeremo qui di seguito che $O=\sigma$, ossia che la quantità media di vendite mancate sia uguale all'errore di previsione medio. Ovviamente, si tratta più di una regola generale che non di un'analisi approfondita. Tuttavia, abbiamo avuto modo di constatare che, nella pratica, questa approssimazione dà risultati sensati.

Minimizzazione della funzione di costo

Applicando le sostituzioni che abbiamo appena indicato all'espressione di $C(p)$, avremo: $$C(p) = \left(Z + \sigma \Phi^{-1}(p)\right)H + (1-p)M\sigma$$ In seguito, l'espressione $C(p)$ può essere differenziata in $p$ con: $$\frac{\partial C}{\partial p} = \sigma H \partial \Phi^{-1}(p) - \sigma M$$ Poiché cerchiamo il valore minimo, tentiamo di risolvere $\frac{\partial C}{\partial p} = 0$, che ci dà: $$\sigma H \partial \Phi^{-1}(p) - \sigma M = 0$$ che può essere semplificata in $\sigma$, con: $$H \partial \Phi^{-1}(p) - M = 0$$ e infine: $$\partial \Phi^{-1}(p) = \frac{M}{H}$$ Useremo poi il rapporto tra $\partial \Phi^{-1}$ e $\Phi^{-1}$ : $$\partial \Phi^{-1}(p)=\sqrt{2\pi}e^{\frac{1}{2}\Phi^{-1}(p)^2}$$ Per avere una prova visiva dell'uguaglianza, è possibile confrontare (1) e (2).

Con questo rapporto otteniamo: $$\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)$$ Prendiamo la soluzione radice positiva dell'equazione (la radice negativa corrisponde a un massimo locale della funzione) con: $$\Phi^{-1}(p)=\sqrt{2\ln\left(\frac{1}{\sqrt{2\pi}}\frac{M}{H}\right)}$$ E, infine, applicando $\Phi$ a entrambi i membri, otteniamo il livello di servizio ottimale con: $$p=\Phi\left(\sqrt{2\ln\left(\frac{1}{\sqrt{2\pi}}\frac{M}{H}\right)}\right)$$

Discussione della formula

Il primo aspetto degno di nota in questa formula è che il livello di servizio ottimale dipende unicamente da $H$ (costi di gestione del magazzino) e $M$ (costi di una rottura di stock). Tuttavia, esiste una dipendenza implicita dal lead time, poiché $H$ è stato definito come costo di mantenimento a magazzino per la durata del lead time.

Un altro aspetto interessante è che un costo di gestione del magazzino più elevato abbassa il livello di servizio ottimale, mentre costi più elevati per una rottura di stock aumentano il livello di servizio. Si tratta di un comportamento che può essere facilmente intuito, dato che il livello di servizio è un compromesso tra avere più scorte e avere più rotture di stock.

La formula, poi, non è valida per tutti i valori di $M$ e $H$. È necessario che $\sqrt{2\pi}\frac{M}{H} > 1$, o il logaritmo produrrà un valore negativo, che risulta inservibile, considerando la radice quadrata esterna. Avremo $M > \sqrt{2 \pi} H$, che può essere approssimato come $M > 2,5 H$. Se questa condizione non si verifica, allora la funzione di costo iniziale $C(p)$ non avrà un minimo, o il minimo sarà $-\infty$ per $p=0$. Da un punto di vista pratico, $M < 2,5 H$ potrebbe essere interpretata come una situazione estrema, in cui il livello di scorte più conveniente è pari a zero (cioè 100% di rottura di stock).

Un esempio pratico

Consideriamo che un cartone da un 1L di latte sia venduto a €1,50 con un margine del 10% (cioè €0,15 di margine lordo). Poniamo che il lead time sia di 4 giorni. Il costo annuale di mantenimento a magazzino è di €1,50 (il valore è elevato perché il latte è un prodotto altamente deperibile). Poniamo che il costo di una rottura di stock sia 3 volte il margine lordo, ossia €0,45. Avremo $M=0,45$ e $H=\frac{4}{365} 1.5\approx 0,0055$.

Basandoci su questi valori e sulla formula per un livello di servizio ottimale che abbiamo prima enunciato, avremo $p\approx 98,5\%$, un valore tipico per molti prodotti freschi di prima necessità, immagazzinati nei depositi che riforniscono le catene di alimentari.

Merci deperibili

Domanda posta da Vyacheslav Grinkevych, esperto di logistica, in data 13/02/2012:

Sto pianificando previsioni e forniture per prodotti caseari a breve scadenza, e ho quindi urgente bisogno di stabilire un livello di servizio ottimale. Mi sembra che qui la componente più interessante e insidiosa sia H, i costi di mantenimento a magazzino, e mi chiedevo quale sia, nella pratica, il valore da attribuirle.

Ad esempio, per i prodotti caseari a breve scadenza, H dovrebbe includere non solo i costi puramente finanziari, dovuti al capitale immobilizzato in scorte, o i costi delle operazioni logistiche di magazzinaggio, ma anche il costo delle perdite potenziali, dovute al write-off dei prodotti scaduti o delle vendite scontate a cui ricorriamo quando vogliamo eliminare i prodotti a ridosso della scadenza – insomma, i costi legati a tutte le operazioni a cui siamo costretti quando le vendite sono molto al di sotto delle previsioni.

Sui piatti della bilancia abbiamo da un lato il rischio di un potenziale eccesso di giacenze e dall'altro il rischio di una potenziale rottura di stock: due rischi che vanno in direzioni opposte, ma che hanno lo stesso punto di partenza, e cioè la scorta di sicurezza. In caso di grandi sovraprevisioni (e cioè nei casi in cui abbiamo problemi di prodotti scaduti), gli errori di previsione non sono distribuiti normalmente. Mi chiedevo, quindi, come possiamo esprimere meglio questi rischi di potenziali eccessi di giacenze.

Per tornare alla vostra formula, si potrebbe provare a trovare una relazione tra H e p, o rendere H una funzione di p, del tipo H(p), prima di minimizzare i costi totali C(p). Cosa ne pensate?

In effetti, la formula per il livello di servizio che abbiamo visto precedentemente si basa sulla ipotesi semplicistica che i costi, sia di magazzinaggio che di rottura di stock, siano strettamente lineari. Nella realtà, però, esistono casi di estrema non-linearità. Tanto per citarne alcuni:

  • il magazzino è pieno: arrivati a un certo punto, 1 sola unità in più in magazzino richiederebbe costi aggiuntivi per trovare un altro deposito;
  • le rotture di stock causano perdite crescenti in termini di vendite, fino al punto in cui un'ennesima rottura di stock causa la perdita di tutti i clienti abituali.

Nel caso delle merci deperibili, c'è un altro fattore da tenere in conto: se la copertura dello stock, ossia il livello di stock espresso in giorni anziché in unità, si avvicina alla scadenza del prodotto, allora $H$, il costo di mantenimento a magazzino, aumenta verso un valore infinito.

$H$ rappresenta, infatti, la frizione associata al solo fatto di avere delle scorte. Una copertura di stock maggiore della scadenza del prodotto è una situazione assurda, in cui, se il magazzino è gestito secondo il metodo FIFO (First In, First Out – primo a entrare, primo a uscire), nessun prodotto potrà mai lasciare il magazzino prima della scadenza.

Per modellizzare l'effetto della deperibilità delle scorte, introdurremo ora dei periodi chiave:

  • $\lambda$, il lead time;
  • $\lambda_\infty$, il periodo di vita di un prodotto prima della scadenza finale (ossia prima di avere un valore di mercato nullo);
  • $\lambda_½$, la durata che raddoppia i costi originari di mantenimento a magazzino del prodotto, a causa della perdita del suo valore di mercato;
  • $\lambda_c(p)$, la copertura di stock, e cioè il livello di stock espresso in giorni anziché in unità di prodotto. Questo valore dipende dal fattore scorta di sicurezza, quindi $p$.

Attraverso questi periodi, possiamo così modellizzare i costi di mantenimento a magazzino:

$$ H(p) = H \left(1 - \frac{\lambda_\infty - \lambda_½}{\lambda_\infty - \lambda} + \frac{\lambda_\infty - \lambda_½}{\lambda_\infty - \lambda_c(p)} \right) $$ Vediamo più in dettaglio l'ipotesi qui implicita, perché, in qualche modo, abbiamo distorto il concetto usuale di costi di mantenimento a magazzino, in modo che potessero includere anche il rischio di write-off.

In primo luogo, abbiamo $H(0,5)=H$, che abbiamo ottenuto dalla definizione qui sopra. Infatti $\lambda_c(0,5)=\lambda$, con un livello di servizio del 50%, la copertura di stock è uguale al lead time. Pertanto, possiamo affermare che, in questo modello, $H$ rappresenta il costo di mantenimento a magazzino, in cui i costi di write-off associati a un livello di servizio del 50% sono già calcolati nel costo $H$. Vale la pena di sottolineare come una scorta di sicurezza pari a zero non implichi un rischio di write-off pari a zero, ma solo un rischio raro di write-off.

In secondo luogo, per il livello di servizio $p_½$ tale che $\lambda_c(p_½) = \lambda_½$, avremo $H(p_½)=2H$. Anche in questo caso, si tratta di una conseguenza della definizione che abbiamo dato di $H(p)$. Intuitivamente, $\lambda_½$ rappresenta la durata che raddoppia la combinazione di costi di mantenimento a magazzino e costi di write-off, in relazione alla situazione scorta di sicurezza pari a zero. Evidentemente, nella realtà dei fatti, i costi aggiuntivi relativi a sconti per prodotti in scadenza e write-off evolvono per fasi distinte. Tuttavia, siamo convinti che tentare di esprimere tali costi aggiuntivi attraverso una durata tipica, che in pratica potrebbe essere definita come una certa frazione del periodo di vita del prodotto, sia un approccio potenzialmente più resiliente alle varie approssimazioni necessarie, a differenza di un modello più raffinato, basato su variabili ancora più incerte.

In terzo e ultimo luogo, man mano che $p$ si avvicina a $p_\infty$ with $\lambda_c(p_\infty)=\lambda_\infty$, $H(p)$ tenderà all'infinito, di nuovo per la definizione della funzione adottata per $H(p)$. A prima vista, potrebbe sembrare strano che i costi di mantenimento a magazzino siano superiori al costo del prodotto per unità, ma si tratta di un finto paradosso. Il valore $H(p)$ rappresenta il costo di frizione necessario per consegnare un'unità di prodotto al cliente. Se, a causa di write-off massicci, per consegnare 1 unità al cliente finale il deposito riceve 3 unità in media (2 delle quali scadono prima della consegna), allora i costi di frizione saranno molto più elevati rispetto al costo originario di un'unità di prodotto.

Riassumendo, $\lambda_½$ è l'unica variabile incerta introdotta. Possiamo ragionevolmente ipotizzare che $\lambda$ e $\lambda_\infty$ siano note. Riteniamo che questo sia il modello più semplice possibile per calcolare $H(p)$ introducendo 1 sola variabile in più. Poi, per $\lambda_c(p)$, con una modesta approssimazione, avremo:

$$\lambda_c(p) = \lambda \left(1 +\frac{\sigma}{Z}\Phi^{-1}(p)\right)$$ In effetti, $\lambda_c$, la copertura di stock, può essere vista come una percentuale sul lead time, che include la domanda nel lead time, più un fattore normalizzato di scorta di sicurezza. Avremo, quindi, la funzione di costo alternativa:

$$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$$ A differenza della precedente, questa funzione di costo non sembra avere un minimo algebrico semplice. Tuttavia, adottando un approccio simile a quello usato per calcolare il lotto economico, è relativamente facile trovare una soluzione approssimata, ripetendo aumenti dello 0,1% dall'80% al 99,9%. Saranno necessarie 200 ripetizioni per arrivare a una precisione dello 0,1%, più che sufficiente a scopo pratico.

Uso pratico

La formula per il calcolo del livello di servizio contiene diverse approssimazioni, quindi i valori numerici potrebbero non essere utilizzabili fuori contesto prima di qualche ritocco. In particolare, il fattore $\frac{1}{\sqrt(2\pi)}\approx0,4$ può essere regolato secondo le proprie esigenze. Tuttavia, riteniamo che questa formula sia un buon esempio di come mettere a confronto i livelli di servizio rispettivi dei diversi prodotti. Ad esempio, se per i due prodotti A e B è stato fissato un livello di servizio rispettivamente del 95% e del 90%, allora, per la configurazione finale della produzione, ci si dovrà aspettare un livello di servizio più elevato per A che per B.

Considerando, poi, la natura dell'analisi che abbiamo fin qui condotto, questa formula è, a nostro avviso, irrilevante per i prodotti a domanda bassa o intermittente. Infatti, questo tipo di prodotti è di solito associato a un punto di riordino piuttosto basso, solitamente pari a 0 o 1 unità; per questo motivo, modellizzare i costi di magazzinaggio di questi prodotti in modo lineare non è necessariamente la soluzione migliore, poiché dovremmo considerare anche le difficoltà legate al magazzinaggio di un articolo in più.