Dimentichiamo i manuali. Partiamo dal problema reale che ogni manager affronta il lunedì mattina.
I dati non sono quasi mai gentili. Arrivano frammentati, sporchi o, peggio ancora, dicono tutto e il contrario di tutto. Se lavori nel marketing o nelle vendite, sai bene che tra un foglio Excel pieno di numeri e una decisione che genera profitto c’è di mezzo un abisso.
Spesso ci si affida all’intuito, ma l’intuito non scala.
Python, con la libreria SciPy, non serve a “fare i matematici”, ma a togliere il rumore di fondo.
In questo articolo analizziamo tre casi concreti: dal recupero di dati persi alla ricerca del prezzo perfetto, fino a capire quando smettere di spendere in pubblicità perché ogni euro extra sta solo bruciando il tuo margine.
Niente teoria astratta, solo codice che aiuta a decidere meglio.
Esercizio 1 (Facile): Interpolazione dei Dati di Vendita Giornalieri
Contesto reale:
Sei un analista junior in un’azienda di e-commerce. Il manager ti fornisce i dati di vendita di una settimana (da lunedì a venerdì), ma mancano i dati di mercoledì perché il sistema di tracciamento era in manutenzione. Devi stimare le vendite di mercoledì usando l’interpolazione lineare.
Dati forniti:
| Giorno | Indice (x) | Vendite (y) |
|---|---|---|
| Lunedì | 0 | 120 |
| Martedì | 1 | 150 |
| Mercoledì | 2 | ? |
| Giovedì | 3 | 200 |
| Venerdì | 4 | 180 |
Compito: Usa scipy.interpolate.interp1d per stimare le vendite di mercoledì (x=2) tramite interpolazione lineare dei dati noti.
Soluzione
import numpy as np from scipy.interpolate import interp1d # 1. Preparazione dati # I giorni sono già indicizzati da 0 a 4 x_known = np.array([0, 1, 3, 4]) # Rimuoviamo mercoledì (2) y_known = np.array([120, 150, 200, 180]) # 2. Creazione della funzione di interpolazione lineare # interp1d crea una funzione che, dato un nuovo x, restituisce il corrispondente y interpolato f_interp = interp1d(x_known, y_known, kind='linear') # 3. Stima delle vendite di mercoledì (x=2) vendite_mercoledi = f_interp(2) print(f"Vendite stimate per mercoledì: {vendite_mercoledi:.1f}")
Vendite stimate per mercoledì: 175.0
💡 Osservazione:
L’interpolazione lineare tra due punti [math](x_1, y_1)[/math] e [math](x_2, y_2)[/math] segue la formula:
[math]y = y_1 + (x – x_1) \cdot \frac{y_2 – y_1}{x_2 – x_1}[/math]
Nel nostro caso, interpoliamo tra martedì [math](1, 150)[/math] e giovedì [math](3, 200)[/math]:
[math]\displaystyle \begin{aligned}
y &= 150 + (2-1) \cdot \frac{200-150}{3-1} \\
&= 150 + 1 \cdot \frac{50}{2} = 175
\end{aligned}[/math]
Esercizio 2 (Medio-Facile): Ottimizzazione del Prezzo per Massimizzare il Profitto
Contesto reale: Sei un pricing analyst. La ricerca di mercato indica che la domanda di un prodotto segue la relazione:
quantità_venduta = 1000 - 20*prezzo. Il costo unitario di produzione è 15€.
Devi trovare il prezzo che massimizza il profitto totale.
Compito: Usa scipy.optimize.minimize_scalar per trovare il prezzo ottimale (tra 20€ e 40€) che massimizza il profitto.
Soluzione
from scipy.optimize import minimize_scalar
# 1. Definizione della funzione di profitto
# Profitto = Ricavi - Costi = (prezzo * quantità) - (costo_unitario * quantità)
def profitto(prezzo):
# Quantità venduta in funzione del prezzo
quantita = 1000 - 20 * prezzo
# Solo prezzi che danno quantità positiva
if quantita <= 0:
return -float('inf') # Profitto infinitamente negativo
costo_unitario = 15
profitto_totale = (prezzo - costo_unitario) * quantita
return -profitto_totale # Negativo perché minimize cerca il minimo
# 2. Ricerca del massimo (minimizzando il negativo del profitto)
# Cerchiamo nell'intervallo [20, 40] dove ci aspettiamo il prezzo ottimale
risultato = minimize_scalar(profitto, bounds=(20, 40), method='bounded')
# 3. Estrazione del risultato
prezzo_ottimale = risultato.x
profitto_massimo = -risultato.fun # Ripristiniamo il segno
print(f"Prezzo ottimale: €{prezzo_ottimale:.2f}")
print(f"Profitto massimo: €{profitto_massimo:.2f}")
print(f"Quantità venduta: {1000 - 20 * prezzo_ottimale:.0f} unità")
Prezzo ottimale: €32.50
Profitto massimo: €6125.00
Quantità venduta: 350 unità
💡 Osservazione:
Matematicamente, per una domanda lineare [math]q = a – b \cdot p[/math] e costo unitario [math]c[/math], il prezzo ottimale è [math]p^* = \frac{a + b \cdot c}{2 \cdot b}[/math].
Verifica:
[math]\displaystyle \begin{aligned}
\frac{1000 + 20 \cdot 15}{2 \cdot 20} &= \frac{1300}{40} \\
&= 32.5
\end{aligned}[/math]
L’ottimizzazione numerica conferma il risultato analitico.
Esercizio 3 (Medio): Regressione per Previsione delle Vendite
Contesto reale:
L’azienda vuole prevedere le vendite mensili in base alla spesa in pubblicità. Hai raccolto dati storici e sospetti una relazione quadratica.
Dati:
| Spesa Pubblicità (migliaia €) | Vendite (migliaia €) |
|---|---|
| 1 | 50 |
| 2 | 80 |
| 3 | 120 |
| 4 | 140 |
| 5 | 135 |
| 6 | 130 |
Compito: Trova la curva quadratica vendite = a*x² + b*x + c che meglio approssima i dati usando scipy.optimize.curve_fit.
Soluzione
import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
# 1. Definizione del modello (funzione quadratica)
def modello_quadratico(x, a, b, c):
return a * x**2 + b * x + c
# 2. Dati
x_data = np.array([1, 2, 3, 4, 5, 6])
y_data = np.array([50, 80, 120, 140, 135, 130])
# 3. Applicazione di curve_fit
# curve_fit trova i parametri che minimizzano la somma degli errori quadratici
parametri, covarianza = curve_fit(modello_quadratico, x_data, y_data)
a, b, c = parametri
print(f"Modello trovato: vendite = {a:.2f}x² + {b:.2f}x + {c:.2f}")
# 4. Previsione per spesa pubblicitaria di 7 (migliaia €)
spesa_nuova = 7
vendite_previsione = modello_quadratico(spesa_nuova, a, b, c)
print(f"\nPrevisione per spesa pubblicitaria €{spesa_nuova}000:")
print(f"Vendite previste: €{vendite_previsione:.1f}000")
# 5. Visualizzazione
x_fit = np.linspace(0.5, 7.5, 100)
y_fit = modello_quadratico(x_fit, a, b, c)
plt.figure(figsize=(10, 6))
plt.scatter(x_data, y_data, s=100, label='Dati reali', zorder=5)
plt.plot(x_fit, y_fit, 'r-', label='Modello quadratico', linewidth=2)
plt.scatter([spesa_nuova], [vendite_previsione], color='green', s=150,
label=f'Previsione: €{vendite_previsione:.1f}K', zorder=10)
plt.xlabel('Spesa pubblicitaria (migliaia €)', fontsize=12)
plt.ylabel('Vendite (migliaia €)', fontsize=12)
plt.title('Regressione quadratica: Vendite vs Spesa pubblicitaria', fontsize=14)
plt.grid(True, alpha=0.3)
plt.legend()
plt.tight_layout()
plt.show()
Modello: [math]\text{vendite} = -6.34x^2 + 61.09x – 8.50[/math]
1. Calcolo del Punto di Massimo (Ottimo di Vendite)
[math]\displaystyle \begin{aligned}
x_{max} &= -\frac{b}{2a} = -\frac{61.09}{2 \times (-6.34)} \\
&= \frac{61.09}{12.68} \approx 4.82
\end{aligned}[/math]
[math]\displaystyle \begin{aligned}
y_{max} &= -6.34(4.82)^2 + 61.09(4.82) – 8.50 \\
&\approx 138.6
\end{aligned}[/math]
Interpretazione:
La spesa pubblicitaria ottimale è €4.820 (migliaia) per massimizzare le vendite a €138.600.
2. Verifica della Previsione per €7.000
Per [math]x=7[/math]:
[math]\displaystyle \begin{aligned}
\text{vendite} &= -6.34(7)^2 + 61.09(7) – 8.50 \\
&= -6.34(49) + 427.63 – 8.50 \\
&= -310.66 + 427.63 – 8.50 = 108.47
\end{aligned}[/math]
✅ Confermato: La previsione di €108.500 (arrotondata) è corretta.
4. Significato Strategico dei Risultati
Situazione a €7.000 vs €4.820:
- €4.820: Vendite = €138.600 (massimo)
- €7.000: Vendite = €108.500
- Differenza: -€30.100 (-21.7%!)
Perdita di Efficienza:
Spendendo €2.180 in più (da 4.820 a 7.000), le vendite diminuiscono di €30.100!
Calcolo del Profitto Ottimale (Break-even Pubblicitario)
Mentre il calcolo precedente ci ha mostrato come massimizzare le vendite, un analista deve puntare a massimizzare il profitto.
Il profitto è dato dalle vendite meno la spesa pubblicitaria sostenuta.
Definiamo la funzione di profitto [math]P(x)[/math]:
[math]\displaystyle \begin{aligned}
P(x) &= \text{vendite} – \text{spesa pubblicitaria} \\
&= (-6.34x^2 + 61.09x – 8.50) – x \\
&= -6.34x^2 + 60.09x – 8.50
\end{aligned}[/math]
1. Calcolo della Spesa Ottimale per il Profitto
Per trovare il nuovo punto di massimo, utilizziamo nuovamente la formula del vertice:
[math]\displaystyle \begin{aligned}
x_{profitto} &= -\frac{b}{2a} = -\frac{60.09}{2 \times (-6.34)} \\
&= \frac{60.09}{12.68} \approx 4.74
\end{aligned}[/math]
Risultato: La spesa ideale per il massimo profitto è €4.740.
2. Calcolo del Profitto Massimo
Sostituiamo [math]x = 4.74[/math] nella funzione [math]P(x)[/math]:
[math]\displaystyle \begin{aligned}
P(4.74) &= -6.34(4.74)^2 + 60.09(4.74) – 8.50 \\
&{} \quad \text{(Calcolo dei singoli termini)} \\
&\approx -142.44 + 284.83 – 8.50 \\
&\approx 133.89
\end{aligned}[/math]
3. Sintesi Strategica Finale
| Obiettivo | Spesa Ottimale ([math]x[/math]) | Risultato Economico |
|---|---|---|
| Massime Vendite | €4.820 | Vendite: €138.600 |
| Massimo Profitto | €4.740 | Profitto: €133.890 |
Conclusione per il Management:
Conviene spendere €80 in meno rispetto al punto di massimo delle vendite (4.820 vs 4.740) perché l’incremento di vendite finale non giustifica il costo pubblicitario extra marginale.
Ottimizzazione Marginale: Oltre il Volume delle Vendite
In un mercato competitivo, l’obiettivo di un’impresa non è quasi mai “spendere il più possibile per vendere il più possibile”. Esiste un punto di rendimento decrescente oltre il quale ogni euro investito in marketing o produzione genera un ritorno inferiore all’euro speso, erodendo i margini.
Questo script Python utilizza un modello quadratico ([math]y = ax^2 + bx + c[/math]) per simulare la risposta del mercato agli investimenti. La sua funzione principale è distinguere tra due obiettivi strategici fondamentali:
- Saturazione del Mercato: Trovare il limite fisico oltre il quale le vendite non possono più crescere.
- Efficienza Economica: Identificare il punto di equilibrio perfetto dove la distanza tra ricavi e costi è massima.
Attraverso il calcolo del vertice della parabola e lo studio della derivata della funzione profitto, il codice trasforma i dati grezzi in una guida per il budget aziendale.
Fondamenti Matematici dell’Ottimizzazione
La funzione delle vendite è definita come:
[math]V(x) = ax^2 + bx + c[/math]
Per massimizzare il profitto economico, dobbiamo sottrarre il costo dell’investimento ([math]x[/math]) dalla funzione delle vendite:
[math]\displaystyle \begin{aligned}
P(x) &= V(x) – x \\
&= ax^2 + bx + c – x \\
&= ax^2 + (b – 1)x + c
\end{aligned}[/math]
L’ottimo economico si ottiene calcolando il vertice di questa nuova funzione [math]P(x)[/math]:
[math]\displaystyle \begin{aligned}
x_{ottimo} &= -\frac{b – 1}{2a} \\
&= \frac{1 – b}{2a}
\end{aligned}[/math]
Analisi della Derivata
Dal punto di vista del calcolo infinitesimale, il massimo profitto si verifica quando la derivata prima della funzione profitto è uguale a zero:
[math]\displaystyle \begin{aligned}
P'(x) &= \frac{d}{dx}(ax^2 + (b – 1)x + c) \\
&= 2ax + b – 1
\end{aligned}[/math]
Imponendo [math]P'(x) = 0[/math], confermiamo il punto di equilibrio marginale:
[math]\displaystyle \begin{aligned}
2ax + b – 1 &= 0 \\
2ax &= 1 – b \\
x &= \frac{1 – b}{2a}
\end{aligned}[/math]
In questo punto, l’ultimo euro investito produce esattamente un euro di ritorno, segnando il confine dell’efficienza pubblicitaria.
import numpy as np
def analizza_investimento(a, b, c):
"""
Calcola l'ottimo per vendite e profitto data una parabola y = ax^2 + bx + c
dove x è l'investimento (in k€) e y sono le vendite.
"""
# 1. MASSIMO DELLE VENDITE (Punto di saturazione del mercato)
# Si trova nel vertice della parabola: x = -b / (2a)
x_vendite_max = -b / (2 * a)
y_vendite_max = a * (x_vendite_max**2) + b * x_vendite_max + c
# 2. MASSIMO DEL PROFITTO (Efficienza marginale)
# Profitto = Ricavi (y) - Costi (x)
# P(x) = (ax^2 + bx + c) - x => ax^2 + (b-1)x + c
# La derivata P'(x) = 2ax + (b-1). Ponendo P'(x) = 0:
b_profitto = b - 1
x_profitto_max = -b_profitto / (2 * a)
# Calcolo del valore delle vendite in corrispondenza del profitto massimo
y_vendite_al_profitto_max = a * (x_profitto_max**2) + b * x_profitto_max + c
# Il profitto effettivo è:
profitto_netto_max = y_vendite_al_profitto_max - x_profitto_max
return {
"ottimo_vendite": (x_vendite_max, y_vendite_max),
"ottimo_profitto": (x_profitto_max, y_vendite_al_profitto_max, profitto_netto_max)
}
# Coefficienti del modello (a deve essere negativo per avere un massimo)
a_coeff = -6.34
b_coeff = 61.09
c_coeff = -8.50
risultati = analizza_investimento(a_coeff, b_coeff, c_coeff)
# --- OUTPUT FORMATTATO ---
print(f"--- ANALISI STRATEGICA DELL'INVESTIMENTO ---")
print(f"{'Obiettivo':<25} | {'Spesa (k€)':<12} | {'Vendite (k€)':<12}")
print("-" * 55)
print(f"{'Massimizzazione Volumi':<25} | {risultati['ottimo_vendite'][0]:>10.3f} | {risultati['ottimo_vendite'][1]:>10.3f}")
print(f"{'Massimizzazione Profitto':<25} | {risultati['ottimo_profitto'][0]:>10.3f} | {risultati['ottimo_profitto'][1]:>10.3f}")
print("-" * 55)
print(f"Profitto Netto Massimo: €{risultati['ottimo_profitto'][2]:.3f}k")
--- ANALISI STRATEGICA DELL'INVESTIMENTO ---
Obiettivo | Spesa (k€) | Vendite (k€)
-------------------------------------------------------
Massimizzazione Volumi | 4.818 | 138.660
Massimizzazione Profitto | 4.739 | 138.621
-------------------------------------------------------
Profitto Netto Massimo: €133.882k
Perché questo codice è utile?
Questo script non fa solo calcoli, ma risolve un dilemma classico del marketing e della produzione:
- Il Target Vendite (Saturazione): Indica quanto puoi spendere prima che ogni euro aggiuntivo diventi inutile. È il punto in cui la curva “curva” verso il basso. Nel tuo modello, spendere oltre €4.818k (circa) ridurrebbe addirittura le vendite totali (caos organizzativo, saturazione pubblicitaria).
- Il Target Profitto (Ottimizzazione): È il punto più importante. Grazie alla sottrazione del costo [math]x[/math], il codice trova dove la pendenza della parabola è uguale a 1 (ovvero dove l’ultimo euro speso genera esattamente un euro di ricavo). Oltre questo punto, stai ancora aumentando le vendite, ma stai erodendo il tuo margine.
- La differenza strategica: Nota come l’ottimo del profitto richieda sempre una spesa inferiore rispetto al massimo delle vendite. È la dimostrazione matematica che “vendere di più” non significa sempre “guadagnare di più”.
Cosa puoi fare con questo strumento:
-
Analisi “What-if”: Modificando i coefficienti
aeb, puoi simulare mercati più o meno reattivi. -
Pianificazione del Budget: Evita l’errore comune di superare il punto di massimo profitto inseguendo solo il fatturato.
Riepilogo Matematico
La condizione di ottimo per il profitto si verifica quando:
[math]\displaystyle \begin{aligned}
V'(x) &= 1 \\
2ax + b &= 1 \\
x_{profitto} &= \frac{1 – b}{2a}
\end{aligned}[/math]
Mentre la saturazione delle vendite avviene quando:
[math]\displaystyle \begin{aligned}
V'(x) &= 0 \\
x_{vendite} &= -\frac{b}{2a}
\end{aligned}[/math]
Perché questi esercizi sono interessanti per un professionista?
L’Esercizio 1 (Interpolazione) affronta il “mondo reale” dove i sensori si rompono, i database falliscono e i dati mancano. Non è solo matematica, è Data Imputation. Insegna che possiamo ricostruire il passato con coerenza logica anziché tirare a indovinare.
L’Esercizio 2 (Prezzo Ottimale) rompe il mito del “prezzo basato solo sul costo”. Introduce il concetto di elasticità della domanda. È interessante perché mostra come una piccola variazione di prezzo (da 30 a 32.50 euro) possa spostare migliaia di euro di profitto finale.
L’Esercizio 3 (Marketing Diminishing Returns) è il più sofisticato. La sua peculiarità risiede nel concetto di Efficienza Marginale. Spesso le aziende aumentano il budget pubblicitario vedendo crescere le vendite, senza accorgersi che il margine si sta assottigliando. L’esercizio insegna a trovare il “punto di arresto”, una competenza fondamentale per chiunque gestisca budget marketing (E-commerce Manager, CMO).
🚀 Bonus: Analisi del ROI – Misurare l’Efficienza degli Investimenti
Mentre il profitto ci dice quanto stiamo guadagnando in termini assoluti, il ROI (Return on Investment) ci dice quanto bene stiamo usando ogni singolo euro investito. Per un analista, questa è la bussola fondamentale: non serve a nulla aumentare le vendite se l’efficienza della spesa crolla drasticamente.
La formula del ROI applicata al nostro modello è:
[math]\displaystyle \begin{aligned}
ROI &= \frac{\text{Vendite} – \text{Spesa}}{\text{Spesa}} \times 100 \\
&= \frac{\text{Profitto}}{\text{Spesa}} \times 100
\end{aligned}[/math]
Script Python: Confronto Strategico
Questo script integra il calcolo dell’efficienza nel nostro modello di ottimizzazione:
import numpy as np
def analizza_investimento_completo(a, b, c):
"""
Calcola l'ottimo per vendite, profitto e il relativo ROI.
"""
# 1. Analisi MASSIMO VOLUMI (Saturazione)
x_v_max = -b / (2 * a)
y_v_max = a * x_v_max**2 + b * x_v_max + c
profitto_v = y_v_max - x_v_max
roi_v = (profitto_v / x_v_max) * 100
# 2. Analisi MASSIMO PROFITTO (Efficienza Marginale)
# P(x) = ax^2 + (b-1)x + c -> Vertice: -(b-1)/(2a)
x_p_max = -(b - 1) / (2 * a)
y_p_vendite = a * x_p_max**2 + b * x_p_max + c
profitto_p = y_p_vendite - x_p_max
roi_p = (profitto_p / x_p_max) * 100
return {
"vendite": {"x": x_v_max, "profitto": profitto_v, "roi": roi_v},
"profitto": {"x": x_p_max, "profitto": profitto_p, "roi": roi_p}
}
# Coefficienti del modello
a_coeff, b_coeff, c_coeff = -6.34, 61.09, -8.50
res = analizza_investimento_completo(a_coeff, b_coeff, c_coeff)
print(f"--- COMPARAZIONE STRATEGICA ---")
print(f"STRATEGIA VENDITE MAX (Volume):")
print(f"- Spesa: €{res['vendite']['x']:.2f}k | ROI: {res['vendite']['roi']:.1f}%")
print(f"\nSTRATEGIA PROFITTO MAX (Margine):")
print(f"- Spesa: €{res['profitto']['x']:.2f}k | ROI: {res['profitto']['roi']:.1f}%")
--- COMPARAZIONE STRATEGICA ---
STRATEGIA VENDITE MAX (Volume):
- Spesa: €4.82k | ROI: 2778.1%
STRATEGIA PROFITTO MAX (Margine):
- Spesa: €4.74k | ROI: 2825.1%
Osservazioni Strategiche sul ROI
L’analisi rivela una verità spesso trascurata nelle riunioni di marketing: vendere di più non significa vendere meglio.
- Il declino dell’efficienza: Noterai che il ROI nel punto di “Massimo Profitto” è sensibilmente più alto rispetto al punto di “Massimo Volume”. Questo accade perché, per strappare le ultime quote di mercato, l’azienda deve investire somme sproporzionate che “erodono” la redditività complessiva.
- Rendimenti Decrescenti: I primi euro spesi sono i più produttivi. Man mano che ci si avvicina alla saturazione, ogni euro aggiuntivo genera un ritorno sempre minore, fino a diventare negativo oltre il punto di massimo profitto.
Il dilemma del Manager
Se hai budget illimitato, punterai al Massimo Profitto ([math]x = 4.74[/math]). Ma se il capitale è limitato, la scelta più saggia potrebbe essere quella di spendere ancora meno per posizionarsi in un punto dove il ROI è ancora più alto, preservando la liquidità aziendale. Oltre il punto di profitto massimo, ogni euro speso è tecnicamente “distrutto”.
Analisi quantitativa del dilemma:
[math]\displaystyle \begin{aligned}
\text{Se } x > x_{profitto} \implies & \frac{dP}{dx} < 0 \\ & \text{(Il profitto diminuisce)} \\ \text{Se } x > x_{vendite} \implies & \frac{dV}{dx} < 0 \\
& \text{(Le vendite stesse diminuiscono)}
\end{aligned}[/math]
Ottimizzazione, pricing e decisioni data-driven
👉 Ottimizzare vendite e marketing: probabilità, BEP, Excel e Python
👉 SciPy e Scikit-learn: ottimizzazione e modelli non lineari
👉 Librerie Python per l’ottimizzazione: un viaggio completo
👉 Prezzo ottimale con Python e modello log-log
👉Elasticità al prezzo: calcolo e applicazioni strategiche
👉 Pricing intelligente: strategie data-driven per massimizzare i ricavi




