Modellare le Vendite con una Funzione Sinusoidale: Previsioni Stagionali e Impatto di Promozioni ed Eventi

Cerca:

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

Navigare le Fluttuazioni del Mercato Retail con la Previsione delle Vendite

Immagina di essere il responsabile di un negozio di articoli sportivi specializzato in abbigliamento outdoor. Ogni anno, noti un andamento ciclico nelle vendite: picchi durante l’autunno e l’inverno, quando la domanda di giacche a vento e attrezzatura da sci aumenta, e periodi di relativa calma in primavera ed estate. Questa stagionalità è una caratteristica comune a molti settori retail, e comprenderla è cruciale per ottimizzare la gestione delle scorte, pianificare campagne promozionali efficaci e, in ultima analisi, massimizzare i profitti.

Tuttavia, prevedere con precisione le vendite non è così semplice come osservare un andamento stagionale. Fattori esterni, come le promozioni che lanci periodicamente o le improvvise ondate di maltempo, possono influenzare significativamente la domanda, rendendo difficile una stima accurata. Ad esempio, una promozione ben pianificata potrebbe portare a un’impennata delle vendite superiore alle aspettative, mentre un’ondata di caldo anomalo in pieno inverno potrebbe deprimere la domanda di abbigliamento pesante.

In questo contesto, avere a disposizione un modello predittivo affidabile diventa fondamentale. Questo articolo esplora un approccio innovativo per la previsione delle vendite nel settore retail, basato su un modello sinusoidale arricchito dall’integrazione di variabili che tengono conto dell’impatto delle promozioni e degli eventi meteorologici. Questo modello mira a fornire una visione più precisa delle dinamiche di vendita, consentendo ai retailer di prendere decisioni più informate e strategiche.

Obiettivi del Modello

L’obiettivo principale del modello è identificare e prevedere le dinamiche di vendita in un contesto stagionale, integrando l’effetto di promozioni ed eventi esterni. I passi principali includono:

  1. Rilevare la stagionalità: Determinare la fase e il periodo che meglio descrivono il ciclo stagionale delle vendite.
  2. Misurare l’impatto delle promozioni: Valutare l’effetto delle campagne promozionali sui volumi di vendita.
  3. Incorporare gli effetti meteorologici: Identificare come condizioni climatiche estreme influenzano le vendite.
  4. Generare previsioni accurate: Offrire una base per decisioni strategiche sulla gestione delle scorte e delle promozioni future.

Il Modello Sinusoidale: Struttura e Funzionamento

Il modello si basa su una funzione sinusoidale, arricchita da componenti che tengono conto delle promozioni e degli eventi meteorologici. La funzione è definita come:

Componenti del Modello

A: Ampiezza della Stagionalità: Rappresenta l’entità delle variazioni delle vendite rispetto al valore medio. Un’ampiezza maggiore indica fluttuazioni stagionali più marcate.

P: Periodo della Stagionalità: Indica la durata del ciclo stagionale, ovvero il tempo necessario affinché il ciclo si ripeta. Solitamente si misura in giorni (ad esempio, 365 per un ciclo annuale).

φ (phi): Fase della Stagionalità: Rappresenta lo sfasamento orizzontale della curva sinusoidale rispetto all’origine. Determina il punto di partenza del ciclo stagionale nel tempo. Si misura in radianti.

C: Livello Base delle Vendite (Offset): Rappresenta il valore medio delle vendite intorno al quale oscillano le variazioni stagionali. È il valore che si avrebbe in assenza di stagionalità, promozioni ed eventi meteo.

Impatto delle Promozioni sulle Vendite: Questo termine è generico. Per essere più precisi, possiamo dividerlo in due componenti:

Variabile Promozioni (input): Un valore che indica la presenza o l’intensità di una promozione (es. 0 per nessuna promozione, 1 per promozione).

Coefficiente di Impatto delle Promozioni (parametro del modello): Un valore che quantifica l’effetto moltiplicativo della promozione sulle vendite. Chiamiamolo β (beta).

Quindi l’effetto delle promozioni sarà β * Variabile Promozioni.

Impatto degli Eventi Meteo sulle Vendite: Anche in questo caso, è utile distinguere:

Variabile Eventi Meteo (input): Un valore che indica la presenza o l’intensità di un evento meteo (es. 0 per nessuna anomalia, 1 per evento).

Coefficiente di Impatto degli Eventi Meteo (parametro del modello): Un valore che quantifica l’effetto moltiplicativo dell’evento meteo sulle vendite. Chiamiamolo γ (gamma). Quindi l’effetto degli eventi meteo sarà γ * Variabile Eventi Meteo.

Forse potrebbe interessarti anche:  Prevedere le Tendenze con le Onde: l'Uso delle Funzioni Sinusoidali per la Stagionalità

Vantaggi del Modello

  1. Semplicità: La funzione sinusoidale è intuitiva e ben adatta a dati con comportamenti ciclici.
  2. Flessibilità: L’aggiunta di variabili esplicative (promozioni, meteo) consente di modellare effetti specifici.
  3. Predittività: Offre previsioni a breve e medio termine con alta accuratezza in presenza di stagionalità ben definita.

Limiti del Modello

  1. Linearità Assunta: Gli effetti delle promozioni e del meteo sono considerati lineari, il che potrebbe non riflettere la realtà complessa del retail.
  2. Effetti non Modellati: Non considera altri fattori come concorrenza, eventi speciali o variazioni macroeconomiche.
  3. Rumore nei Dati: Le vendite giornaliere possono includere variazioni casuali difficili da prevedere.

Implementazione Pratica

Librerie Utilizzate

  • NumPy: Per la gestione delle operazioni matematiche.
  • Pandas: Per la manipolazione dei dati tabulari.
  • SciPy: Per l’ottimizzazione dei parametri della funzione.
  • Matplotlib: Per la visualizzazione dei dati.

Diamo un’occhiata al codice completo in Python:

iimport numpy as np
import pandas as pd
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt

# Funzione sinusoidale con effetti aggiuntivi
def funzione_sinusoidale_con_effetti(x, ampiezza, periodo, fase, offset, coeff_promozioni, coeff_eventi):
    giorni, promozioni, eventi_meteo = x
    componente_sinusoidale = ampiezza * np.sin(2 * np.pi * giorni / periodo + fase) + offset
    effetto_promozioni = coeff_promozioni * promozioni
    effetto_eventi = coeff_eventi * eventi_meteo
    return componente_sinusoidale + effetto_promozioni + effetto_eventi

# Caricamento dei dati dal file CSV
dati = pd.read_csv("vendite.csv", parse_dates=["Data"])

# Aggiunta di una colonna per il giorno dell'anno
dati['Giorno_anno'] = dati['Data'].dt.day_of_year + (dati['Data'].dt.year - dati['Data'].dt.year.min()) * 365

# Conversione delle colonne in array
giorni = dati['Giorno_anno'].values
vendite = dati['Vendite'].values
promozioni = dati['Promozioni'].values
eventi_meteo = dati['Eventi_Meteo'].values

# Stima iniziale dei parametri
stima_iniziale = [30, 365, 0, vendite.mean(), 10, 10]

# Ottimizzazione dei parametri della funzione
parametri, _ = curve_fit(
    funzione_sinusoidale_con_effetti,
    (giorni, promozioni, eventi_meteo),
    vendite,
    p0=stima_iniziale
)

# Parametri ottimizzati
ampiezza, periodo, fase, offset, coeff_promozioni, coeff_eventi = parametri
print("Parametri ottimizzati:")
print(f"Ampiezza: {ampiezza:.2f}")
print(f"Periodo: {periodo:.2f} giorni")
print(f"Fase: {fase:.2f} rad")
print(f"Offset: {offset:.2f}")
print(f"Coefficiente Promozioni: {coeff_promozioni:.2f}")
print(f"Coefficiente Eventi Meteo: {coeff_eventi:.2f}")

# Calcolo delle vendite previste
vendite_previste = funzione_sinusoidale_con_effetti((giorni, promozioni, eventi_meteo), *parametri)

# Visualizzazione dei risultati
plt.figure(figsize=(15, 6))
plt.plot(dati['Data'], vendite, label='Vendite osservate', alpha=0.7)
plt.plot(dati['Data'], vendite_previste, label='Vendite previste (modello)', color='red', linewidth=2)
plt.title("Vendite con modello sinusoidale e effetti di promozioni ed eventi meteo")
plt.xlabel("Data")
plt.ylabel("Vendite giornaliere")
plt.legend()
plt.grid(alpha=0.3)
plt.show()

# Visualizzazione dei primi risultati
dati['Vendite_Previsioni'] = vendite_previste
print(dati[['Data', 'Vendite', 'Vendite_Previsioni']].head())

Cosa fa questo modello?

  1. Componenti Sinusoidali:
    • Rappresentano la stagionalità con ampiezza, periodo e fase.
  2. Promozioni:
    • Aggiungono un incremento alle vendite per i giorni di promozione.
  3. Eventi Meteo:
    • Aggiungono (o sottraggono) vendite nei giorni con eventi climatici eccezionali.

Interpretazione dei parametri

  • Ampiezza: Intensità delle variazioni stagionali.
  • Periodo: Lunghezza del ciclo stagionale.
  • Fase: Posizione della stagione sul calendario.
  • Offset: Livello medio delle vendite.
  • Coefficiente Promozioni: Incremento medio delle vendite dovuto alle promozioni.
  • Coefficiente Eventi Meteo: Incremento o decremento medio delle vendite nei giorni di eventi meteo.

Funzioni Principali

Funzione Sinusoidale con Effetti:

def funzione_sinusoidale_con_effetti(x, ampiezza, periodo, fase, offset, coeff_promozioni, coeff_eventi):
    giorni, promozioni, eventi_meteo = x
    componente_sinusoidale = ampiezza * np.sin(2 * np.pi * giorni / periodo + fase) + offset
    effetto_promozioni = coeff_promozioni * promozioni
    effetto_eventi = coeff_eventi * eventi_meteo
    return componente_sinusoidale + effetto_promozioni + effetto_eventi

Ottimizzazione dei Parametri:

parametri, _ = curve_fit(
    funzione_sinusoidale_con_effetti,
    (giorni, promozioni, eventi_meteo),
    vendite,
    p0=stima_iniziale
)

Visualizzazione dei Risultati:

plt.plot(dati['Data'], vendite, label='Vendite osservate')
plt.plot(dati['Data'], vendite_previste, label='Vendite previste', color='red')
plt.legend()
plt.show()

Il codice seguente si occupa del salvataggio e caricamento dei dati utilizzati per l’analisi delle vendite simulate.

Struttura dei dati generati:

  • I dati rappresentano le vendite simulate di giacche a vento, che seguono una stagionalità definita da una funzione sinusoidale.
  • Componenti aggiuntivi come promozioni ed eventi meteorologici estremi vengono integrati per aumentare la complessità e il realismo.
  • Ogni riga del dataset contiene:
    • Data: La data di riferimento per il valore delle vendite.
    • Vendite: Il numero simulato di giacche vendute.
    • Promozioni: Un indicatore che rappresenta il livello di promozione in corso per quel giorno.
    • Eventi_Meteo: Un indicatore degli effetti delle condizioni climatiche estreme.

Come sono stati generati i dati di simulazione:

Ecco il codice completo che genera dati simulati per le vendite di giacche a vento, li salva in un file CSV denominato vendite.csv e visualizza i risultati in un grafico.

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
def genera_dati_vendite_giacche(
anni=2, promozioni=5, picco_promozione=1.5, ampiezza_stagionalita=0.3, trend_annuale=0.05
):
"""
Genera dati simulati per le vendite di giacche a vento in un negozio sportivo.
"""
giorni = np.arange(anni * 365)
base_vendite = 30 # Vendite medie giornaliere di base

# Stagionalità: più alta nei mesi autunnali e invernali
stagionalita = (
1 + ampiezza_stagionalita * np.sin(2 * np.pi * giorni / 365 - np.pi / 6)
)

# Trend: incremento annuale del trend
trend = 1 + trend_annuale * (giorni / 365)

# Rumore casuale
rumore = np.random.normal(0, 3, size=len(giorni))

# Promozioni: distribuite casualmente durante l'anno
promozioni_giorni = np.random.choice(giorni, size=promozioni, replace=False)
effetto_promozioni = np.zeros_like(giorni, dtype=float)
for p in promozioni_giorni:
# Effetto promozione concentrato su un periodo di 7 giorni
effetto_promozioni += np.exp(-0.5 * ((giorni - p) / 3)**2) * picco_promozione

# Eventi eccezionali (giorni di condizioni meteo estreme)
eventi_meteo = np.random.choice(giorni, size=3, replace=False)
effetto_eventi = np.zeros_like(giorni, dtype=float)
for e in eventi_meteo:
effetto_eventi += np.exp(-0.5 * ((giorni - e) / 2)**2) * 2.0

# Calcolo delle vendite
vendite = (
base_vendite * stagionalita * trend + rumore + effetto_promozioni + effetto_eventi
)
vendite = np.clip(vendite, a_min=0, a_max=None) # Vendite non possono essere negative

# Creazione di un DataFrame per i dati
date = pd.date_range(start="2023-01-01", periods=len(giorni))
dati = pd.DataFrame({
"Data": date,
"Vendite": vendite,
"Promozioni": np.isin(giorni, promozioni_giorni).astype(int),
"Eventi_Meteo": np.isin(giorni, eventi_meteo).astype(int)
})

return dati

# Generazione dei dati
dati_vendite = genera_dati_vendite_giacche()

# Salvataggio dei dati in un file CSV
dati_vendite.to_csv("vendite.csv", index=False)
print("Dati salvati in 'vendite.csv'.")

# Visualizzazione
plt.figure(figsize=(15, 6))
plt.plot(dati_vendite['Data'], dati_vendite['Vendite'], label='Vendite giornaliere', alpha=0.7)
plt.scatter(dati_vendite[dati_vendite['Promozioni'] == 1]['Data'],
dati_vendite[dati_vendite['Promozioni'] == 1]['Vendite'],
color='red', label='Promozioni', alpha=0.8)
plt.scatter(dati_vendite[dati_vendite['Eventi_Meteo'] == 1]['Data'],
dati_vendite[dati_vendite['Eventi_Meteo'] == 1]['Vendite'],
color='blue', label='Eventi Meteo', alpha=0.8)
plt.title("Simulazione delle vendite di giacche a vento")
plt.xlabel("Data")
plt.ylabel("Vendite giornaliere")
plt.legend()
plt.grid(alpha=0.3)
plt.show()

# Visualizzazione dei primi dati
print(dati_vendite.head())

Come funziona il codice?

  1. Generazione delle vendite simulate:
    • Modella l’andamento delle vendite includendo stagionalità, trend, effetti delle promozioni e condizioni meteo straordinarie.
  2. Salvataggio in CSV:
    • I dati vengono salvati in un file vendite.csv per analisi successive o per condividerli.
  3. Visualizzazione grafica:
    • Mostra l’andamento delle vendite giornaliere e evidenzia i giorni di promozioni e condizioni meteo eccezionali.

Utilizzo del file vendite.csv:

  • Il dataset generato viene salvato in un file CSV tramite la funzione to_csv() di Pandas.
  • Successivamente, il file viene ricaricato usando read_csv(), consentendo di continuare l’analisi in una sessione separata o di condividere i dati.

Risultati:

Parametri ottimizzati:
Ampiezza: 9.17
Periodo: 360.96 giorni
Fase: -0.67 rad
Offset: 31.56
Coefficiente Promozioni: 1.94
Coefficiente Eventi Meteo: 1.74
simulazione della previsione delle vendite con stagionalità


I risultati mostrano le vendite giornaliere effettive e le vendite previste dal modello.

Interpretazione dei Dati

Colonna Significato
Data La data della vendita giornaliera.
Vendite I dati reali delle vendite del negozio per quel giorno.
Vendite_Previsioni Le vendite previste dal modello sinusoidale, tenendo conto della stagionalità, promozioni ed eventi.

Confronto tra vendite osservate e previste

  1. Differenze tra valori reali e previsti:
    • Ad esempio, il 1° gennaio, il modello prevede vendite di 26.02, mentre le vendite reali sono 19.40.
    • Il 3 gennaio, il modello è più vicino alle vendite reali (26.28 previste contro 29.27 osservate).
  2. Possibili cause delle discrepanze:
    • Effetti non modellati: Il modello considera solo promozioni ed eventi meteo come fattori esterni; altri elementi (festività, concorrenza, ecc.) potrebbero influire.
    • Rumore nei dati: Le vendite reali hanno una componente di variabilità che il modello non cattura completamente.
    • Parametri da affinare: I coefficienti del modello possono essere ulteriormente ottimizzati con più dati.

Utilizzo Pratico dei Risultati

  1. Previsione delle Vendite:
    • Il negozio può pianificare meglio le sue scorte e le strategie di marketing, basandosi sulle previsioni per i giorni successivi.
  2. Valutazione delle Strategie Promozionali:
    • Se i giorni di promozione mostrano un incremento significativo nelle vendite previste rispetto ai giorni normali, possiamo concludere che le promozioni sono efficaci.
  3. Analisi degli Eventi Meteo:
    • Se i giorni con eventi meteo mostrano un impatto consistente sulle vendite, il negozio può adattare la sua strategia (es. sconti extra durante il maltempo).

Conclusioni

Il modello sembra catturare bene le tendenze generali delle vendite, ma può essere migliorato per gestire meglio le variabili impreviste o effetti non modellati. Questo approccio fornisce una base solida per prendere decisioni strategiche nel retail.

Pubblicità