Go to main content
Regression as geometry - official lesson image on GinnyTech

Regression as geometry + intuitive optimization

Regression seen as geometric projection and minimization problem.

AD
Created byAndrii Dyshkantiuk
Lesson 158 / 236Level: AdvancedDuration: 22 minPrerequisites: 1

What you will learn

  • Risolvere le equazioni normali Xᵀ·X·β = Xᵀ·y per stimare i coefficienti OLS
  • Leggere R² come quota di varianza spiegata e riconoscere la collinearità
  • Applicare la penalità Ridge quando i coefficienti diventano instabili

Regression as geometry + intuitive optimization

Questa lezione viaggia sul binario ml-tabellare, quello in cui i dati stanno in tabelle e le risposte nascono da modelli addestrati su righe e colonne. Hai una nuvola di punti con prezzo, sconto, traffico e conversione, e il management chiede quanto pesa davvero lo sconto. La regressione promette una risposta, ma quella risposta ha senso solo se sai che geometricamente sta cercando una direzione che spiega i dati meglio di altre. Pensare la regressione come geometria ti evita due errori opposti: trattarla come una scatola magica o come una formula da applicare sempre.

Che cosa fa la regressione, senza formule

La regressione proietta il fenomeno su una struttura semplice e misura quanto errore resta fuori dalla proiezione.

La procedura, passo per passo

  1. Organizza i predittori nella matrice X e il target nel vettore y.
  2. Formula il problema come min ||y − Xβ||², cioè trova il punto dello spazio delle colonne più vicino a y.
  3. Risolvi le equazioni normali Xᵀ·X·β = Xᵀ·y per ottenere i coefficienti.
  4. Calcola predizioni ŷ = Xβ e residui e = y − ŷ, verificando che Xᵀ·e = 0.
  5. Read R² come quota di varianza spiegata e usa la versione aggiustata se aggiungi predittori.
  6. Se i coefficienti sono instabili per collinearità, aggiungi la penalità Ridge λ||β||² e confronta.

Regression as projection

Hai un vettore target y of size n×1 e una matrice di predittori X of size n×p. Lo spazio delle colonne di X è un sottospazio p-dimensionale di ℝⁿ. La regressione OLS, cioè i minimi quadrati ordinari, trova il punto in questo sottospazio più vicino a y in distanza euclidea.

Geometricamente: ŷ = Xβ = X(X^T·X)⁻¹·X^T·y = Hy, where H è la matrice di proiezione detta hat.

I residui e = y − ŷ sono ortogonali allo spazio delle colonne di X. Questa ortogonalità definisce la soluzione OLS: X^T·e = 0, quindi X^T·(y − Xβ) = 0 e infine X^T·X·β = X^T·y. Queste sono le equazioni normali.

What geometry tells us

R² = cos²(θ), where θ è l’angolo tra y e ŷ. Più y è vicino allo spazio delle colonne, più R² è alto. Se y è già nello spazio, R² = 1.

Sulla collinearità: se due colonne di X sono quasi parallele, lo spazio delle colonne è quasi degenere. Allora X^T·X è quasi singolare e i coefficienti diventano instabili. La geometria mostra questo caso come un sottospazio schiacciato.

Aggiungere un predittore espande lo spazio delle colonne, quindi la proiezione può solo migliorare o restare uguale. R² non può mai diminuire aggiungendo predittori. Questo è il motivo per cui l’R² aggiustato penalizza il numero di predittori.

OLS as optimization

OLS risolve min_β ||y − Xβ||².

Azzerando il gradiente: −2X^T·(y − Xβ) = 0, quindi X^T·X·β = X^T·y.

Il gradiente punta nella direzione di massimo aumento dell’errore. Azzerarlo individua il minimo. Se aggiungi regolarizzazione Ridge, il problema diventa min ||y − Xβ||² + λ||β||² e la soluzione geometrica è una proiezione smorzata.

Verdetto: resta su OLS quando le colonne sono stabili e i coefficienti interpretabili, passa a Ridge quando la collinearità li rende instabili, e non confrontare mai i due modelli solo su R².

References:

  • Hastie, T., Tibshirani, R. & Friedman, J. (2009). The Elements of Statistical Learning, 2nd ed. Springer. Chapter 3.
  • Strang, G. (2019). Linear Algebra and Learning from Data. Wellesley-Cambridge Press.

SQL example: building a control view

La vista seguente crea una base analitica con metrica, segmento e finestra temporale, così puoi confrontare periodi e gruppi senza riscrivere la logica ogni volta.

WITH base_events AS (
  SELECT
    user_id,
    account_id,
    event_type,
    event_time,
    DATE_TRUNC('week', event_time) AS week,
    source,
    device_type
  FROM events
  WHERE event_time >= CURRENT_DATE - INTERVAL '180 days'
    AND user_id IS NOT NULL
),
weekly_user_metrics AS (
  SELECT
    week,
    user_id,
    COALESCE(source, 'unknown') AS source,
    COALESCE(device_type, 'unknown') AS device_type,
    COUNT(*) AS total_events,
    COUNT(DISTINCT DATE(event_time)) AS active_days,
    COUNT(DISTINCT event_type) AS event_diversity,
    MAX(CASE WHEN event_type IN ('purchase', 'subscribe', 'activation') THEN 1 ELSE 0 END) AS reached_key_outcome
  FROM base_events
  GROUP BY week, user_id, source, device_type
)
SELECT
  week,
  source,
  device_type,
  COUNT(DISTINCT user_id) AS users,
  ROUND(AVG(active_days), 2) AS avg_active_days,
  ROUND(AVG(event_diversity), 2) AS avg_event_diversity,
  ROUND(AVG(reached_key_outcome) * 100, 2) AS key_outcome_rate
FROM weekly_user_metrics
GROUP BY week, source, device_type
ORDER BY week, source, device_type;

Python example: checking stability and anomalies

Il controllo seguente segnala variazioni anomale settimana su settimana senza reagire a ogni oscillazione casuale.


# df contiene: week, segment, users, key_outcome_rate
# key_outcome_rate espresso in percentuale, es. 12.4

df = df.sort_values(['segment', 'week']).copy()
df['previous_rate'] = df.groupby('segment')['key_outcome_rate'].shift(1)
df['wow_change_pp'] = df['key_outcome_rate'] - df['previous_rate']
df['rolling_mean'] = df.groupby('segment')['key_outcome_rate'].transform(
    lambda s: s.rolling(4, min_periods=2).mean()
)
df['rolling_std'] = df.groupby('segment')['key_outcome_rate'].transform(
    lambda s: s.rolling(4, min_periods=2).std()
)
df['z_score'] = (df['key_outcome_rate'] - df['rolling_mean']) / df['rolling_std']

anomalies = df[df['z_score'].abs() >= 2].sort_values('z_score')
print(anomalies[['week', 'segment', 'key_outcome_rate', 'wow_change_pp', 'z_score']])

Il quartetto di Anscombe: perché il grafico non si salta

Nel 1973 lo statistico Francis Anscombe pubblicò quattro piccoli dataset che condividono stessa media di x (9), stessa media di y (circa 7,5), stessa correlazione (0,816) e stessa retta di regressione. Disegnati su un grafico, i quattro dataset raccontano storie opposte: uno è lineare, uno è curvo, uno è dominato da un singolo outlier e uno da un punto leva verticale. Il quartetto dimostra in modo definitivo che nessuna statistica di regressione basta da sola: senza il grafico, R² e coefficienti possono descrivere quattro realtà diverse con gli stessi numeri.

Domande per chiudere la lezione

  1. Quando un R² alto nasconde un modello inutile per decidere?
  2. Cosa segnala la collinearità tra due predittori e come la confermi?
  3. Perché aggiungere un predittore non fa mai scendere R²?
  4. Quale controllo fai prima di interpretare un coefficiente come effetto causale?
Serve una mano concreta?

Bloccato su questo argomento o vuoi applicarlo al tuo caso? Prenota una call di 15 minuti con un analista esperto.

Book a call