
Probability: axioms, events, conditioning
Probability fundamentals: from the three axioms to Bayes' theorem, with analytical applications.
What you will learn
- Verificare gli assiomi di Kolmogorov e calcolare probabilità condizionali P(A|B)
- Distinguere probabilità del segnale e probabilità della causa su classi sbilanciate
- Verificare l'indipendenza prima di moltiplicare probabilità
Probability: axioms, events, conditioning
Questa lezione appartiene al binario ml-tabellare e tratta la probabilità come una scelta operativa, non come un capitolo di teoria da memorizzare. Parti da una dashboard con due numeri: il 12% degli utenti che visitano la pagina prezzi converte, il 3% degli altri converte. Sembra una storia semplice, finché non arriva la domanda scomoda: gli utenti convertono perché hanno visto la pagina prezzi, oppure visitano quella pagina perché erano già più intenzionati a comprare?
Che cosa fa la probabilità, in una frase
La probabilità assegna un numero coerente a ogni evento, a condizione di dichiarare sempre universo, condizione e popolazione di riferimento.
Come si lavora con gli eventi
- Definisci lo spazio campionario
Ωe l’eventoAdi interesse in modo osservabile. - Verifica gli assiomi:
P(A) ≥ 0,P(Ω) = 1e additività su eventi disgiunti. - Se hai osservato
B, condiziona conP(A|B) = P(A ∩ B) / P(B). - Aggiorna con Bayes quando arriva nuova evidenza invece di rileggere il prior da zero.
- Verifica l’indipendenza con
P(A ∩ B) = P(A) × P(B)prima di moltiplicare probabilità. - Riporta sempre evento, condizione e baseline insieme al numero finale.
The three Kolmogorov axioms (1933)
Andrey Kolmogorov diede alla probabilità una fondazione matematica solida con tre assiomi semplici. Per ogni evento A in uno spazio campionario Ω:
- Non negatività:
P(A) ≥ 0 - Normalizzazione:
P(Ω) = 1 - Additività: se
AeBsono mutuamente esclusivi,P(A ∪ B) = P(A) + P(B)
Questi tre assiomi bastano per costruire tutto il resto. La probabilità non è per definizione ciò che succede nel lungo periodo, né un semplice grado di credenza: è una misura matematica che soddisfa questi assiomi. Come la interpreti è una scelta successiva, non parte della matematica.
Verdetto: usa la lettura frequentista quando stimi frequenze ripetibili su grandi campioni e quella bayesiana quando aggiorni una decisione con prior noti, senza mai presentare un numero bayesiano come frequenza osservata.
Conditional probability: the most powerful concept
P(A|B) = P(A ∩ B) / P(B), con P(B) > 0.
La domanda centrale è: qual è la probabilità di A, sapendo che B è vero? Questo passaggio guida la maggior parte delle analisi dati:
P(churn | no_login_30gg) = ?P(conversione | visitato_pagina_prezzi) = ?P(frode | transazione >10.000€ e paese_insolito) = ?
La probabilità condizionale è il meccanismo dell’aggiornamento delle credenze. Parti da P(A), la probabilità a priori, osservi B e passi a P(A|B), la probabilità a posteriori.
Un caso reale è la diagnosi medica e la fallacia della probabilità condizionale. Un test per una malattia rara, 1 su 10.000, ha accuratezza del 99%. Se risulti positivo, qual è la probabilità di avere davvero la malattia? Non è il 99%.
P(malattia | positivo) = P(positivo | malattia) × P(malattia) / P(positivo) = 0.99 × 0.0001 / (0.99 × 0.0001 + 0.01 × 0.9999) ≈ 0.0098 = 0.98%
Un test accurato al 99% lascia meno dell’1% di probabilità di essere malato quando la malattia è rara. Questa è la potenza e la controintuitività della probabilità condizionale. Nell’analisi dati vale lo stesso: i modelli con alta accuracy su classi sbilanciate, per esempio frodi allo 0,1% delle transazioni, soffrono dello stesso problema. Un modello che dice sempre nessuna frode ha accuracy del 99,9%, e questo non significa che funzioni.
Independence: when knowing B tells you nothing about A
A e B sono indipendenti se P(A|B) = P(A), cioè P(A ∩ B) = P(A) × P(B).
Questa è l’assunzione più usata e più abusata in statistica. I modelli Naive Bayes assumono indipendenza tra feature, non perché sia vera, ma perché il modello funziona sorprendentemente bene anche quando l’assunzione è violata.
References:
- Kolmogorov, A.N. (1933). Foundations of the Theory of Probability. Chelsea Publishing.
- Blitzstein, J.K. & Hwang, J. (2019). Introduction to Probability, 2nd ed. CRC 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']])
Sally Clark: quando moltiplicare le probabilità tradisce
Nel 1999 Sally Clark fu condannata in Regno Unito anche sulla base di un calcolo di probabilità presentato in aula: due morti in culla nella stessa famiglia avrebbero avuto probabilità di 1 su 73 milioni, ottenuta moltiplicando tra loro due probabilità singole come se gli eventi fossero indipendenti. Nell’ottobre 2001 la Royal Statistical Society dichiarò pubblicamente che quel calcolo era privo di fondamento statistico, perché trattava come indipendenti eventi che indipendenti non sono. Nel 2003 la condanna fu annullata in appello. Il caso resta il monito più citato contro l’uso ingenuo della moltiplicazione di probabilità in aula e in azienda.
Domande per chiudere la lezione
- Perché un test accurato al 99% dà meno dell’1% su una malattia rarissima?
- Quando puoi moltiplicare due probabilità e quando questa mossa ti tradisce?
- Cosa cambia tra probabilità del segnale e probabilità della causa in un alert?
- Quale controllo fai prima di trattare due eventi come indipendenti?
Bloccato su questo argomento o vuoi applicarlo al tuo caso? Prenota una call di 15 minuti con un analista esperto.
Related Path
Lessons to read together
Questi collegamenti portano la lezione dentro il resto del corso: basi da riprendere, passaggi successivi e connessioni tematiche tra moduli.