Forecast in Excel + SRV™: come prevedere vendite e rischio stock nel Pharma

Cerca:

Generic selectors
Exact matches only
Search in title
Search in content
Post Type Selectors

Ci sono file Excel che registrano il passato.
E poi ci sono file Excel che ti evitano problemi tra tre mesi.

La differenza non è nella formula.
È nel modo in cui colleghi i numeri alle decisioni.

Se lavori nella Supply Chain Pharma, sai già cosa succede:
lo stock sembra “ok”… finché improvvisamente non lo è più.

Lotti che scadono, forecast troppo ottimistici, dati che non tornano.

Questo tutorial nasce proprio qui.

Non per spiegarti una funzione di Excel.
Ma per costruire un sistema che ti dica:

👉 “Questo SKU tra 4 mesi diventa un problema. Ecco cosa fare adesso.”

Useremo due leve:

  • un forecast statistico reale (PREVISIONE.ETS)

  • un framework decisionale (S.R.V.™)

E alla fine aggiungiamo l’ultimo pezzo:
👉 far partire automaticamente le mail prima che qualcuno ti chieda spiegazioni.

Pubblicità

Parte 1: Creare il Forecast Predittivo (Funzione PREVISIONE.ETS)

Un caso reale (che succede più spesso di quanto pensi)

È lunedì mattina.

Il Sales ti scrive:
“Abbiamo bisogno urgente di stock per PH-202, il cliente spinge.”

Apri Excel.
Controlli.

Stock: 9.800 unità
Forecast mese: 1.200

Sembra tutto sotto controllo.

Poi guardi meglio.

  • Shelf life residua: 7 mesi

  • Target cliente: 12 mesi

  • Disallineamento ERP vs 3PL: -15%

E lì cambia tutto.

👉 Quello stock non è una sicurezza. È un problema in ritardo.

Nel giro di 6 settimane succedono tre cose:

  • il cliente rifiuta i lotti

  • il magazzino resta pieno

  • il finance inizia a parlare di write-off

E la domanda che arriva è sempre la stessa:

👉 “Perché non l’abbiamo visto prima?”

Il “perché ora”

Nel 2026, con shelf life più corte e forecast più volatili, un sistema reattivo non basta più.

Aspettare che il problema emerga significa quasi sempre arrivare tardi.

Serve un sistema che faccia una cosa molto semplice:

👉 trasformare segnali deboli in decisioni operative.

Ed è esattamente quello che costruiamo in questo tutorial.

Non un file Excel.

Ma un sistema che ti permette di dire, con anticipo:

👉 “Questo SKU sta diventando un rischio. Ecco cosa facciamo prima che lo diventi davvero.”

1. Preparazione dei Dati Storici

Organizza i tuoi dati di vendita in due colonne:

  • Colonna A (Data): Almeno 24 mesi di dati storici (es. Gennaio 2024 – Dicembre 2025).

  • Colonna B (Vendite Reali): Le unità vendute per ogni mese.

2. Calcolo della Previsione

Excel offre una funzione potente chiamata PREVISIONE.ETS (Exponential Triple Smoothing), che rileva automaticamente stagionalità e trend.

Per prevedere il valore di Gennaio 2026, usa questa formula:

=PREVISIONE.ETS(A26; $B$2:$B$25; $A$2:$A$25; 1; 1)

  • Argomento 1 (A26): La data futura che vuoi prevedere.

  • Argomento 2 (B2:B25): L’intervallo delle vendite storiche.

  • Argomento 3 (A2:A25): L’intervallo delle date storiche.

  • Argomento 4 (1): Stagionalità (1 indica che Excel la rileva automaticamente).

Nota tecnica: Il quarto argomento “1” (stagionalità) è il punto di forza. Excel usa l’algoritmo AAA (Additive Holt-Winters). È perfetto per il Pharma dove spesso ci sono picchi stagionali (es. antinfluenzali).

  • Argomento 5 (1): Completamento dati (1 riempie eventuali mesi mancanti con la media).

Cosa sta succedendo:

  • Excel analizza il comportamento storico

  • Identifica cicli stagionali (anche senza dirglielo)

  • Restituisce un valore coerente con quel pattern

👉 Questo numero non è “la verità”. Ma è molto meglio di un’intuizione.

Il limite del forecast (ed è qui che molti sbagliano)

Il forecast ti dice quanto venderai.

Ma non ti dice se lo stock che hai:

  • è coerente

  • è vendibile

  • è affidabile

E qui nasce il vero problema.

👉 Puoi avere un forecast perfetto… e comunque perdere soldi.

Per questo serve un secondo livello di analisi.


Parte 2: Il Framework S.R.V.™

Il Framework S.R.V.™ trasforma un semplice forecast in una decisione strategica. Non si limita a guardare la domanda, ma analizza se lo stock è in grado di sopravvivere a quella domanda attraverso tre dimensioni critiche.

Forse potrebbe interessarti anche:  Teorema di Bayes: 6 Esercizi Pratici per Capire l'Analisi delle Recensioni

S – Shelf Life Integrity™

Nel Pharma, la scadenza legale è solo metà della storia. Conta la Residual Shelf Life (RSL) accettata dal mercato. Se il cliente esige 12 mesi residui e tu ne hai 8, quel prodotto è già “commercialmente morto”.

Formula: (Mesi alla Scadenza / Target RSL Mercato)

Esempio: 8 mesi residui / 12 mesi target = S: 0.67 (Sotto 1.0 = Zona di Rischio)

R – Rotation Reality™

Qui colleghiamo il forecast allo stock fisico. Non conta quanto vendi in assoluto, ma quanto velocemente smaltisci ciò che hai accumulato in magazzino.

Formula: (Forecast 3 Mesi / Stock Totale)

Esempio: Forecast 1.200 / Stock 6.000 = R: 0.2 (Hai 5 volte più stock del necessario)

V – Visibility Alignment™

La credibilità del dato. Se l’ERP e il magazzino fisico (3PL) non coincidono, il rischio operativo aumenta esponenzialmente.

Formula: 1 – (ASS(Stock ERP – Stock 3PL) / Stock ERP)

Esempio: ERP 100, 3PL 90 = V: 0.90 (Più scende, più devi essere prudente)


Parte 3: SRV Score™

Lo score finale non è una media, è un prodotto matematico:

SRV Score = S * R * V

Questa è una scelta metodologica fondamentale: il sistema è punitivo. Se anche uno solo dei fattori è debole, l’intero score crolla. Non puoi compensare una scadenza imminente (S bassa) con una buona visibilità (V alta).

Analisi Comparativa

SKU S R V SRV Score Stato
PH-101 1.10 0.90 0.98 0.97 Healthy
PH-202 0.70 0.50 0.95 0.33 High Risk

💡 L’intuizione dell’Analyst: Il secondo SKU (PH-202) è già un problema finanziario, anche se il sistema ERP non ha ancora generato alert di scadenza. Il framework S.R.V.™ ti permette di vedere il “disastro” mesi prima che appaia nel bilancio di fine anno.


Parte 4: Visualizzazione “Insight” (Grafico a Bolle)

Un file Excel senza visualizzazione resta un file.

Un grafico giusto diventa una decisione.

Usa un grafico a bolle:

  • Asse X → Shelf Life (S)

  • Asse Y → Rotation (R)

  • Dimensione → Valore stock €

  • Colore → Visibility (V)

Questo grafico mostra istantaneamente dove si concentrano i soldi: le bolle grandi in basso a sinistra (bassa vita residua, bassa rotazione) sono i tuoi “incendi” da spegnere subito.

Esempio:

mappa rischio stock

Come leggere il grafico

Questo grafico a bolle non è solo una visualizzazione: è una mappa decisionale per il tuo Direttore Supply Chain. Ecco l’analisi dei quattro quadranti che emergono:

🔴 In Basso a Sinistra: “Gli Incendi” (Zona Critica)

Qui si concentrano le bolle grandi, rosse o arancioni. Significa che abbiamo:

  • S < 1: Prodotti che scadono presto e che i distributori non accetteranno più.

  • R < 0.5: Prodotti che si muovono lentamente rispetto al forecast.

  • V Bassa: Dati ERP/3PL non allineati.

  • Azione: Write-off (svalutazione) immediato per i lotti già scaduti, promozioni “last minute” aggressive per gli altri, e inventario fisico urgente per allineare i dati.

🟡 In Basso a Destra: “Il Magazzino Statico”

Prodotti con buona vita residua (S > 1) ma che non ruotano (R < 0.5).

  • Rischio: Stiamo immobilizzando capitale che non genera valore. Se il forecast è troppo ottimista, questi prodotti diventeranno “Incendi” tra 6 mesi.

  • Azione: Rivedere il Demand Plan nel meeting S&OP e rallentare le produzioni/acquisti.

🟡 In Alto a Sinistra: “La Corsa contro il Tempo”

Prodotti che ruotano velocemente (R > 0.5) ma hanno una vita residua limitata (S < 1).

  • Rischio: Rottura di stock (Out of Stock) imminente perché non riusciremo a rifornire in tempo, o obsolescenza se il forecast non viene rispettato perfettamente.

  • Azione: Monitoraggio settimanale delle vendite e accelerazione dei controlli qualità per i nuovi lotti in arrivo.

Forse potrebbe interessarti anche:  Strategie di Localizzazione: Esercizi sul Modello di Hotelling

🟢 In Alto a Destra: “La Safe Zone” (Zona Sana)

Qui si trovano le bolle verdi con S > 1 e R > 0.5. È dove ogni SKU Pharma dovrebbe stare.

  • Significato: Prodotti freschi, che si muovono velocemente e con dati affidabili.

  • Azione: Monitoraggio standard.


Combinando la funzione PREVISIONE.ETS con il framework S.R.V.™, smetti di essere un analista passivo che “registra” gli scarti. Diventi un analista proattivo che dice: “In base al trend statistico e al framework SRV, lo SKU PH-202 genererà una perdita di 40k € tra 4 mesi. Ecco il piano per evitarlo”.


Parte 5: Automazione – quando il sistema lavora per te

A questo punto hai:

  • forecast

  • rischio

  • priorità

Manca solo una cosa:

👉 far partire l’azione automaticamente

Lo script Python che vedremo è perfetto per questo.

Cosa fa:

  • legge Excel

  • filtra SRV < 0.40

  • raggruppa per Sales

  • invia email con tabella + allegato

👉 Questo è il vero salto di livello.

Non aspetti più la domanda.
Arrivi con la risposta prima.

1. Preparazione dell’ambiente

Assicurati di avere installate le librerie necessarie:

pip install pandas openpyxl

2. Lo Script Python: “The S.R.V.™ Alerter”

Questo script presuppone che tu abbia una colonna chiamata Email_Sales nel tuo Excel (per sapere a chi inviare cosa) e la colonna SRV_Score che abbiamo calcolato.

import pandas as pd
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
import os

# ==========================
# CONFIGURAZIONE E DATI
# ==========================
FILE_REPORT_NAME = "Report_SRV_Pharma.xlsx"
SMTP_SERVER = "smtp.office365.com" # Cambia in base al tuo provider
SMTP_PORT = 587
EMAIL_MITTENTE = "[email protected]"
EMAIL_PASSWORD = "tua_password_sicura"

# 1. Caricamento Dati
if not os.path.exists(FILE_REPORT_NAME):
    print(f"Errore: Il file {FILE_REPORT_NAME} non esiste.")
    exit()

df = pd.read_excel(FILE_REPORT_NAME)

# 2. Filtro Criticità (SRV Score < 0.40)
criticità = df[df['SRV_Score'] < 0.40].copy()

def send_srv_alert(sales_email, data_subset):
    # Creazione del contenitore della mail
    msg = MIMEMultipart()
    msg['From'] = EMAIL_MITTENTE
    msg['To'] = sales_email
    msg['Subject'] = f"⚠️ ALERT S.R.V.™: Azione Urgente Stock Pharma - {pd.Timestamp.now().strftime('%d/%m/%Y')}"

    # Generazione tabella HTML per il corpo mail
    table_html = data_subset[['SKU', 'SRV_Score', 'Azione_Suggerita', 'Valore_Euro']].to_html(index=False, border=1)
    
    body = f"""

⚠️ Rischio Obsolescenza Rilevato

 

Ciao Team Sales,

 

In base all’analisi S.R.V.™ (Shelf Risk Velocity), i seguenti prodotti nel tuo portafoglio sono in ZONA CRITICA.

 

{table_html}

 

Nota: In allegato trovi il report completo per l’analisi dei lotti specifici.

 

Si prega di definire le azioni di clearance entro il prossimo meeting S&OP.

 


 

Report generato automaticamente dal Supply Chain Analytics System.

 

    
    """
    msg.attach(MIMEText(body, 'html'))

    # ==========================
    # ALLEGA FILE EXCEL (Il tuo blocco di codice)
    # ==========================
    try:
        with open(FILE_REPORT_NAME, "rb") as f:
            file_data = f.read()
            
        part = MIMEApplication(file_data, Name=FILE_REPORT_NAME)
        part['Content-Disposition'] = f'attachment; filename="{FILE_REPORT_NAME}"'
        msg.attach(part)

        # ==========================
        # INVIO EMAIL
        # ==========================
        with smtplib.SMTP(SMTP_SERVER, SMTP_PORT) as server:
            server.starttls()
            server.login(EMAIL_MITTENTE, EMAIL_PASSWORD)
            server.send_message(msg)
            
        print(f"📧 Report inviato con successo a {sales_email}!")
        
    except Exception as e:
        print(f"❌ Errore durante l'invio a {sales_email}: {e}")

# 3. Esecuzione per ogni Sales Manager che ha criticità
if not criticità.empty:
    for email in criticità['Email_Sales'].unique():
        subset = criticità[criticità['Email_Sales'] == email]
        send_srv_alert(email, subset)
else:
    print("✅ Nessun rischio SRV rilevato questa settimana. Nessun invio necessario.")

Ecco la spiegazione di come funziona la logica e come configurarlo per l’invio reale:

1. Spiegazione Passo-Passo del Codice

A. Importazione Librerie e Caricamento

Lo script inizia caricando pandas (per leggere l’Excel) e i moduli email.mime e smtplib.

Questi ultimi sono i protocolli standard di Python per “costruire” una mail (MIME) e “spedirla” (SMTP).

Il codice legge il file Report_SRV_Pharma.xlsx e crea un sottoinsieme (criticità) contenente solo le righe dove lo SRV Score è inferiore a 0.40. Se non ci sono rischi, lo script si ferma subito.

B. Costruzione della Mail (L’oggetto msg)

Per ogni Sales Manager che ha prodotti a rischio, lo script crea un oggetto MIMEMultipart. È come una busta vuota dove andremo a inserire:

  • Mittente, Destinatario e Oggetto: Definiti nelle intestazioni.

  • Il Corpo (HTML): Qui usiamo .to_html() di Pandas. Questa funzione trasforma la tua tabella Excel in codice HTML che Outlook o Gmail possono visualizzare direttamente nel testo della mail.

Forse potrebbe interessarti anche:  Gestione Scorte: Formule ed Esercizi Svolti su EOQ, ROP e Newsvendor

C. Allegato del File (Il blocco rb)

Il comando with open(..., "rb") apre il tuo Excel in modalità “Read Binary” (lettura binaria). È fondamentale perché un file Excel non è semplice testo, ma un archivio complesso. Lo script lo “impacchetta” in un formato che i server di posta riconoscono come allegato.

D. Invio tramite SMTP

Il blocco finale apre una connessione sicura (starttls) con il server della tua azienda, effettua il login e “spinge” la mail verso il destinatario.

2. Come impostarlo per l’invio reale

Per far sì che le mail partano davvero, devi configurare le credenziali del server.

Se usi Outlook / Office 365 (Il più comune in azienda):

  • SMTP_SERVER: smtp.office365.com

  • SMTP_PORT: 587

  • Sicurezza: Se la tua azienda ha l’autenticazione a due fattori (2FA), non puoi usare la tua password normale. Devi generare una “Password per l’app” dalle impostazioni di sicurezza del tuo account Microsoft.

Se usi Gmail:

  • SMTP_SERVER: smtp.gmail.com

  • SMTP_PORT: 587

  • Sicurezza: Anche qui, devi attivare la 2FA e generare una “Password per l’app”.

3. Checklist operativa per il primo invio

  1. Test Personale: Prima di inviare ai Sales, cambia temporaneamente la riga msg['To'] = sales_email con msg['To'] = "[email protected]". Così vedrai esattamente cosa ricevono loro.

  2. Preparazione Excel: Assicurati che nella colonna Email_Sales del tuo file Excel ci siano indirizzi validi (es. [email protected]). Lo script raggrupperà automaticamente i prodotti: se Mario Rossi ha 5 prodotti a rischio, riceverà una sola mail con una tabella da 5 righe.

  3. Cartella di Lavoro: Assicurati che lo script .py e il file .xlsx siano nella stessa cartella, altrimenti Python non troverà il report.


Il valore aggiunto

Impostare questo automatismo ti toglie l’onere di dover “convincere” i Sales ogni volta. La mail arriva con un tono oggettivo, basato sul framework S.R.V.™, e l’allegato permette loro di non avere scuse: i dati per agire sono lì.

Analisi Applicativa: 

L’aspetto più interessante di questo tutorial non è lo strumento, ma il passaggio dalla statistica all’etica operativa.

  1. L’algoritmo ETS non è una scatola nera: A differenza di modelli di AI complessi, PREVISIONE.ETS è trasparente. Se un Sales ti chiede “perché questo numero?”, puoi mostrargli il pattern stagionale.

  2. La natura moltiplicativa dello Score: In Supply Chain, i problemi sono spesso interdipendenti. Se sommi i rischi (media), un rischio 0 viene mitigato da un 1. Moltiplicandoli, il rischio 0 “uccide” il risultato. Questo riflette la realtà: uno stock non vendibile (S=0) è inutile anche se la domanda è infinita (R=1).

  3. L’automazione come barriera psicologica: Spesso l’analista non segnala il problema per timore del conflitto con i Sales. Automatizzare la mail sposta la responsabilità sul “sistema”, rendendo l’alert un dato di fatto oggettivo e non un’opinione personale.

Pubblicità