Regressione Quadratica con Python: Guida Pratica per Analizzare Andamenti Curvilinei

Cerca:

Generic selectors
Exact matches only
Search in title
Search in content
Post Type Selectors
come fare regressione quadratica python

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.

Pubblicità

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”.
Forse potrebbe interessarti anche:  Analisi Testuale Completa con Python e NLTK: Guida Passo Passo a Statistiche, Frequenza Parole e Bigrammi

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.000
  • x1 ([math]\hat{\beta}_1[/math]): 12.881
  • x2 ([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.
Forse potrebbe interessarti anche:  I Test di Ipotesi Spiegati Semplicemente: Come la Statistica Decide se i Tuoi Dati Stanno Mettendo in Discussione la Realtà

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.

Pubblicità

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.
Forse potrebbe interessarti anche:  Valutazione Clienti: La Guida Pratica a KPI e Metodi Efficaci per Manager e Data Scientist

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”)?

Pubblicità