Quando “Di Più” Smette di Essere “Meglio”
Spesso pensiamo che “di più” sia sempre “meglio”. Più ore di studio, più budget di marketing, più ore di allenamento. Ma la realtà è quasi sempre più complessa. Cosa succede se, dopo un certo punto, i risultati smettono di crescere e iniziano a calare?
È il classico caso del “troppo che stroppia”: l’atleta che, esagerando con gli allenamenti, entra in overtraining e peggiora le sue performance; la campagna pubblicitaria che satura il mercato; o perfino la troppa concimazione che danneggia un raccolto.
Questo andamento—una curva che prima sale e poi scende—non può essere catturato da una semplice linea retta (regressione lineare), che ci direbbe (erroneamente) di continuare ad aumentare l’impegno all’infinito.
Ecco dove un modello leggermente più avanzato, la regressione quadratica, diventa uno strumento essenziale. Ci permette di capire questa curvatura e, soprattutto, di trovare quel “punto ottimale” oltre il quale non ha senso spingersi. In questo esercizio pratico, vedremo come implementarlo in Python e, soprattutto, come interpretare i suoi risultati.
Il Dataset: Allenamento vs. Prestazione
Supponiamo di avere i dati di 8 atleti. Osserviamo la relazione tra le ore settimanali di allenamento ([math]X[/math]) e un punteggio di prestazione ([math]Y[/math]).
| Ore ([math]X[/math]) | Prestazione ([math]Y[/math]) |
|---|---|
| 1 | 52 |
| 2 | 57 |
| 3 | 63 |
| 4 | 70 |
| 5 | 74 |
| 6 | 73 |
| 7 | 69 |
| 8 | 62 |
A occhio, la prestazione cresce fino a 5 ore (punteggio 74), ma poi inizia a calare (a 6 ore è 73, a 8 ore è 62). Questo è il segnale perfetto per un modello quadratico.
Step 1. Il Modello Teorico
Il modello di regressione quadratica è un caso speciale di regressione multipla. Aggiungiamo semplicemente il quadrato della nostra variabile indipendente ([math]x^2[/math]) come secondo regressore:
[math]\displaystyle \begin{aligned}
y &= \beta_0 + \beta_1 x + \beta_2 x^2 + \varepsilon
\end{aligned}[/math]
Dove:
- [math]\beta_0[/math]: È l’intercetta (il valore di [math]y[/math] quando [math]x=0[/math]).
- [math]\beta_1[/math]: È l’effetto lineare (la pendenza iniziale).
- [math]\beta_2[/math]: È l’effetto quadratico. È il coefficiente più importante: se [math]\beta_2 < 0[/math], la parabola ha la concavità verso il basso, descrivendo il nostro scenario di “picco e calo”.
Step 2. Analisi Statistica con statsmodels
Per analizzare la relazione e ottenere i coefficienti [math]\beta[/math], usiamo la libreria statsmodels. È ideale per l’inferenza statistica perché fornisce un report dettagliato con [math]p[/math]-value, [math]R[/math]-squared e intervalli di confidenza.
import numpy as np
import pandas as pd
import statsmodels.api as sm
import matplotlib.pyplot as plt
# Dataset
X_raw = np.array([1, 2, 3, 4, 5, 6, 7, 8])
Y = np.array([52, 57, 63, 70, 74, 73, 69, 62])
# 1. Creiamo la variabile quadratica
X_quad = X_raw**2
# 2. Costruiamo la matrice dei regressori (X, X^2)
# Usiamo column_stack per affiancare i due array
X_design = np.column_stack((X_raw, X_quad))
# 3. Aggiungiamo la costante (per il beta_0)
# sm.add_constant aggiunge una colonna di '1'
X_design = sm.add_constant(X_design, prepend=True)
# 4. Eseguiamo la regressione OLS
# (Y è la variabile dipendente, X_design i regressori)
model = sm.OLS(Y, X_design).fit()
# 5. Stampiamo il summary
print(model.summary())
Step 3. Interpretazione dei Risultati (Il Punto Chiave)
L’esecuzione dello snippet produce la seguente tabella di output. È qui che troviamo i nostri coefficienti.
OLS Regression Results
==============================================================================
Dep. Variable: y R-squared: 0.944
Model: OLS Adj. R-squared: 0.922
Method: Least Squares F-statistic: 42.15
Date: Sat, 25 Oct 2025 Prob (F-statistic): 0.000742
Time: 09:24:02 Log-Likelihood: -15.778
No. Observations: 8 AIC: 37.56
Df Residuals: 5 BIC: 37.79
Df Model: 2
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const 38.0000 3.069 12.383 0.000 30.112 45.888
x1 12.8810 1.565 8.233 0.000 8.859 16.903
x2 -1.2143 0.170 -7.155 0.001 -1.651 -0.778
==============================================================================
Analisi dei Coefficienti ([math]\hat{\beta}[/math])
Dalla colonna coef, ricaviamo il nostro modello stimato:
const([math]\hat{\beta}_0[/math]): 38.000x1([math]\hat{\beta}_1[/math]): 12.881x2([math]\hat{\beta}_2[/math]): -1.214
Il modello stimato è: [math]\hat{y} = 38.0 + 12.88x – 1.21x^2[/math]
Interpretazione:
- I [math]p[/math]-value ([math]P>|t|[/math]) sono tutti bassissimi (0.000 o 0.001), indicando che tutti i nostri coefficienti (inclusa la curvatura [math]x2[/math]) sono statisticamente significativi.
- [math]\hat{\beta}_1 = 12.88[/math] ([math]> 0[/math]): L’effetto lineare è fortemente positivo. All’inizio, ogni ora in più di allenamento migliora la prestazione.
- [math]\hat{\beta}_2 = -1.21[/math] ([math]< 0[/math]): L’effetto quadratico è negativo. Questo è il risultato cruciale. Conferma la nostra ipotesi di concavità verso il basso: man mano che le ore ([math]x[/math]) aumentano, il loro quadrato ([math]x^2[/math]) cresce più velocemente, e l’effetto negativo di [math]\beta_2[/math] diventa dominante, “frenando” la crescita fino a invertirla.
Calcolo del Vertice (Le Ore Ottimali)
Il punto di massimo (o minimo) di una parabola è il suo vertice ([math]x_v[/math]). La sua formula è:
[math]\displaystyle \begin{aligned}
x_v &= -\frac{\hat{\beta}_1}{2\hat{\beta}_2}
\end{aligned}[/math]
Usiamo i coefficienti reali che abbiamo appena trovato:
[math]\displaystyle \begin{aligned}
x_v &= -\frac{12.881}{2(-1.214)} \\
&= -\frac{12.881}{-2.428} \\
&\approx 5.30 \text{ ore}
\end{aligned}[/math]
Conclusione dell’analisi: Il modello stima che il picco di prestazione, ovvero il punto oltre il quale l’allenamento diventa controproducente (overtraining), si raggiunge a circa 5.3 ore. Questo risultato è perfettamente coerente con i nostri dati, che mostravano il massimo (74) a 5 ore e un leggero calo (73) già a 6 ore.
Step 4. Visualizzazione (Lineare vs. Quadratica)
Ora visualizziamo perché questo modello è migliore di una semplice regressione lineare. Useremo la libreria sklearn per questo passaggio, poiché gestisce la creazione delle “features polinomiali” in modo molto pulito, rendendo semplice il confronto.
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
# Dati (bisogna rimodellarli per sklearn)
X = np.array([1, 2, 3, 4, 5, 6, 7, 8]).reshape(-1, 1)
y = np.array([52, 57, 63, 70, 74, 73, 69, 62])
# --- Modello lineare ---
linear_model = LinearRegression()
linear_model.fit(X, y)
y_pred_linear = linear_model.predict(X)
# --- Modello quadratico (grado 2) ---
# 1. Crea il trasformatore
poly = PolynomialFeatures(degree=2, include_bias=False)
# 2. Trasforma X in [X, X^2]
X_poly = poly.fit_transform(X)
# 3. Addestra il modello sui dati trasformati
quadratic_model = LinearRegression()
quadratic_model.fit(X_poly, y)
y_pred_quadratic = quadratic_model.predict(X_poly)
# --- Grafico comparativo ---
plt.style.use('seaborn-v0_8')
plt.figure(figsize=(10, 6))
plt.scatter(X, y, color='black', label='Dati osservati', s=50)
plt.plot(X, y_pred_linear, color='blue', linestyle='--', label='Regressione lineare (modello errato)')
plt.plot(X, y_pred_quadratic, color='red', label='Regressione quadratica (modello corretto)')
plt.title('Confronto: Regressione Lineare vs Quadratica')
plt.xlabel('Ore di allenamento')
plt.ylabel('Prestazione')
plt.legend()
plt.grid(True)
plt.show()
Il grafico parla da solo. La linea blu (lineare) fallisce completamente nel descrivere i dati, suggerendo che allenarsi 8 ore sia meglio di 5. La curva rossa (quadratica) cattura perfettamente l’andamento osservato, mostrando il picco e il successivo calo.
Perché Questo Esercizio è Importante
Questo mini-esercizio è un esempio perfetto di come un piccolo passo in complessità possa produrre un enorme balzo in termini di insight.
- È il “ponte” perfetto: È il primo e più intuitivo passo oltre la regressione lineare. Pur essendo un modello curvilineo, è ancora un modello lineare nei parametri ([math]\beta[/math]), quindi può essere risolto con i metodi standard (OLS) e interpretato facilmente.
- È interpretabile e azionabile: A differenza di modelli “scatola nera” (come reti neurali complesse), il modello quadratico ci dà un output direttamente azionabile. Il calcolo del vertice ([math]x_v = 5.3[/math]) non è solo un esercizio matematico, ma un KPI strategico: ci dice qual è il punto di investimento ottimale.
- Cattura i “Rendimenti Decrescenti”: L’esercizio insegna a riconoscere e modellare uno dei pattern più comuni in natura e negli affari: la legge dei rendimenti decrescenti. Il modello quadratico con [math]\beta_2 < 0[/math] è la sua rappresentazione statistica più semplice.
Questo stesso identico approccio può essere usato per rispondere a domande come:
- Marketing: Qual è la spesa pubblicitaria ottimale prima che il costo per cliente aumenti troppo?
- Agricoltura: Quanto fertilizzante massimizza il raccolto prima di diventare tossico per le piante?
- Economia: Qual è l’aliquota fiscale che massimizza il gettito (la famosa “Curva di Laffer”)?
Altri articoli di approfondimento
- 👉 Validazione del modello di regressione lineare: un’analisi approfondita dei residui
- 👉 Curvare i dati: un’introduzione alla regressione quadratica
- 👉 Prevedere il DAX con la regressione quadratica in Python: guida completa e codice
- 👉 Regressione quadratica: guida pratica con esercizi svolti (parabola e dati)
- 👉 Guida alla regressione quadratica: stimare e interpretare i coefficienti (con esercizi)
- 👉 Il quartetto di Anscombe: perché devi sempre visualizzare i tuoi dati (statistiche identiche, storie diverse)
- 👉 Che cos’è l’interpolazione?
- 👉 Metodo dei minimi quadrati vs metodo delle medie
- 👉 R-quadro vs correlazione: differenza, calcolo e guida pratica





