Vai al contenuto

Retail e beni di consumoBI, AI e ML per l'azienda

Elasticità al prezzo e proposta di listino

Un aumento di prezzo può far perdere un pezzo su tre o quasi nulla, e la differenza si scopre a cose fatte. In Muvia un modello scritto dal team stima ogni settimana l'elasticità di ogni articolo e prepara la proposta di listino: cosa aumentare, cosa ridurre, quanto margine rende.

Scenario illustrativo: descrive un caso tipo, non il progetto di un cliente.

Sul listino, un aumento che regge e uno che fa scappare i clienti si somigliano.

Quando i costi salgono, il listino si ritocca quasi sempre in blocco: qualche punto in più su tutta la categoria. Ma ogni articolo reagisce a modo suo. Su alcuni un aumento non si sente, su altri fa perdere un pezzo su tre, e lo si vede solo nelle vendite delle settimane dopo.

Stimare la sensibilità al prezzo vuol dire separare l'effetto del prezzo da quello dei volantini e della stagione, articolo per articolo, e rifarlo ogni volta che arrivano dati nuovi. In un foglio di calcolo nessuno lo fa davvero.

Per chi
Pricing e category manager, direzione commerciale, controllo di gestione.
Listini, costi d'acquisto e prezzi a scaffale dal gestionale su SQL Server, i pezzi venduti dai file delle casse e il calendario dei volantini in Excel entrano in Muvia, dove una funzione Python stima ogni lunedì l'elasticità di ogni articolo; ne escono un'analisi di prezzi e pezzi, un cruscotto degli scenari, il notebook con la proposta di listino e le risposte di Athena.

In Muvia, passo per passo

Schermate vere del prodotto, registrate su un progetto con dati di esempio.

1 di 5

Il video · Un aumento di prezzo può far perdere un pezzo su tre o quasi nulla, e la differenza si scopre a cose fatte. In Muvia un modello scritto dal team stima ogni settimana l'elasticità di ogni articolo e prepara la proposta di listino: cosa aumentare, cosa ridurre, quanto margine rende.

Cosa ottieni

Ogni articolo il suo prezzo
Gli aumenti vanno dove la domanda li regge e i ribassi dove riportano pezzi e margine, invece di un ritocco uguale per tutti.
Il prezzo separato dal volantino
Il modello non scambia l'effetto di una promozione o della stagione per effetto del prezzo.
La proposta si aggiorna da sola
Ogni lunedì l'elasticità si ricalcola sui dati nuovi e la proposta di listino la segue.
Il motivo scritto accanto
Ogni prezzo proposto porta la sua spiegazione in parole, leggibile da chi non ha costruito il modello.

Per il team tecnico

Come si costruisce in Muvia

  1. 1

    Metti insieme prezzi e vendite

    Il gestionale su SQL Server porta listini e costi, i file delle casse i pezzi venduti, un Excel il calendario dei volantini. Una query li unisce in una serie per articolo e per giorno, salvata come dataset.

  2. 2

    Guarda prima di modellare

    In Analisi metti prezzo e pezzi uno sopra l'altro, annoti il giorno di un aumento e confronti due articoli nel grafico XY: chi crolla e chi resta piatto si vede prima di qualsiasi modello.

  3. 3

    Stima l'elasticità in Python

    Una funzione Python fa per ogni articolo una regressione sui logaritmi, con volantini e stagione tra le variabili: il coefficiente del prezzo è l'elasticità. La scrive il team, anche partendo da una bozza di Athena.

  4. 4

    Programma la proposta

    Un flusso la esegue ogni lunedì mattina e scrive in tabelle gestite l'elasticità di ogni articolo e il margine atteso per variazioni del prezzo da −5% a +5%, con il prezzo proposto e il motivo.

  5. 5

    Porta la proposta a chi decide

    Un cruscotto mostra chi regge un aumento e chi va ribassato; il notebook della proposta di listino, con testo e numeri sempre aggiornati, è pronto per la riunione del lunedì.

Funzione Python

import numpy as np
import pandas as pd

def _elasticita(g):
    giorno = pd.to_datetime(g["giorno"]).dt.dayofyear.to_numpy(float)
    X = np.column_stack([
        np.ones(len(g)),
        np.log(g["prezzo_scaffale"]),
        g["in_volantino"],
        np.sin(2 * np.pi * giorno / 365.25),
        np.cos(2 * np.pi * giorno / 365.25),
    ])
    beta, *_ = np.linalg.lstsq(X, np.log(g["pezzi"]), rcond=None)
    return beta[1]

def transform(inputs, params, ctx):
    d = inputs["rows"]
    righe = []
    for codice, g in d[d["pezzi"] > 0].groupby("codice"):
        e = _elasticita(g)
        ultimo = g.sort_values("giorno").iloc[-1]
        pezzi_sett = g["pezzi"].tail(28).mean() * 7
        for v in range(-5, 6):
            prezzo = ultimo["prezzo_listino"] * (1 + v / 100)
            pezzi = pezzi_sett * (1 + v / 100) ** e
            righe.append({"codice": codice, "elasticita": round(e, 2),
                          "variazione_pct": v,
                          "margine_settimana": round((prezzo - ultimo["costo_acquisto"]) * pezzi, 2)})
    return {"rows": pd.DataFrame(righe)}
L'elasticità di ogni articolo da una regressione sui logaritmi, e il margine settimanale atteso da −5% a +5% di prezzo.
I dati che servono
  • Prezzi di listino e a scaffale per articolo, giorno per giorno, dal gestionale su SQL Server
  • Costi d'acquisto per articolo, dallo stesso gestionale
  • Pezzi venduti per articolo e per giorno, dai file delle casse
  • Calendario dei volantini e delle promozioni, da un file Excel
Le parti di Muvia usate

Portaci una domanda a cui oggi non sai rispondere.

Partiamo da una domanda vera della tua azienda e ti mostriamo il percorso dalla fonte al cruscotto, con i tuoi sistemi e non con quelli di una demo.