A la lliçó anterior vam dibuixar l'histograma dels imports de comanda de MercaFresh i vam parlar de la seva "forma": una massa central i una cua a la dreta. Les distribucions de probabilitat són els models matemàtics d'aquestes formes: descriuen com es reparteixen els valors que pot prendre una variable aleatòria. Entendre-les és imprescindible en Machine Learning perquè molts algorismes assumeixen que les dades segueixen certes distribucions, i perquè comparar les dades reals amb una distribució esperada és la base de la detecció d'anomalies. En aquesta lliçó coneixeràs les distribucions discretes i contínues més importants, estudiaràs la normal en profunditat i aprendràs a generar-les i visualitzar-les amb NumPy i scipy.
Contingut
- Variable aleatòria i funció de probabilitat
- Distribucions discretes: Bernoulli, binomial i Poisson
- Distribucions contínues: uniforme, normal i exponencial
- La distribució normal en detall: regla 68-95-99.7 i z-scores
- Per què importen les distribucions en Machine Learning
- Generació i visualització amb NumPy i scipy
Variable aleatòria i funció de probabilitat
Una variable aleatòria és una variable el valor de la qual depèn de l'atzar: no sabem què valdrà a la propera observació, però sí que podem descriure amb quina probabilitat prendrà cada valor possible.
Exemples a MercaFresh:
- X = "el proper client abandona el cistell?" → pren valors 0 o 1.
- Y = "nombre de comandes que arribaran la propera hora" → 0, 1, 2, 3...
- Z = "import de la propera comanda" → qualsevol valor real positiu.
La manera de descriure aquestes probabilitats depèn del tipus de variable (recordes la classificació de 02-01?):
| Variable discreta | Variable contínua | |
|---|---|---|
| Funció | Funció de massa de probabilitat (PMF): P(X = k) | Funció de densitat de probabilitat (PDF): f(x) |
| Interpretació | Probabilitat exacta de cada valor | Densitat; la probabilitat és l'àrea sota la corba en un interval |
| P(X = valor exacte) | Pot ser > 0 | Sempre 0 (un punt no té àrea) |
| Suma/integral total | Σ P(X=k) = 1 | ∫ f(x) dx = 1 |
Un matís que confon al principi: per a una variable contínua, la pregunta "quina és la probabilitat que la comanda valgui exactament 50,00 €?" té resposta 0. El que sí que té resposta és "quina és la probabilitat que valgui entre 45 i 55 €?": l'àrea sota la corba de densitat en aquest interval. Per calcular àrees acumulades es fa servir la funció de distribució acumulada (CDF): F(x) = P(X ≤ x), que scipy ens dona feta.
Distribucions discretes: Bernoulli, binomial i Poisson
Bernoulli: un experiment de sí/no
Modela un únic assaig amb dos resultats: èxit (1) amb probabilitat p, fracàs (0) amb probabilitat 1−p.
- MercaFresh: "un client concret fa churn aquest mes" amb p = 0,08.
- És el maó bàsic: la binomial i molts models de classificació (com la regressió logística del mòdul 4) es construeixen sobre ella.
Binomial: comptar èxits en n assajos
Si repetim n assajos Bernoulli independents amb la mateixa p, el nombre total d'èxits segueix una binomial B(n, p).
- MercaFresh: de 500 clients amb p = 0,08 de churn cadascun, quants faran churn aquest mes? → B(500, 0,08), amb mitjana n·p = 40 clients.
from scipy import stats
# Probabilitat que facin churn exactament 40 de 500 clients?
print(stats.binom.pmf(k=40, n=500, p=0.08).round(4)) # 0.0657
# Probabilitat que facin churn 50 o mes? (1 - P(X <= 49))
print(1 - stats.binom.cdf(k=49, n=500, p=0.08)) # ~0.064stats.binom.pmf(k, n, p)retorna P(X = k): la probabilitat d'exactament k èxits.stats.binom.cdf(k, n, p)retorna P(X ≤ k); restar-la d'1 dona la probabilitat de la cua superior. Aquest patró1 - cdfes fa servir constantment.
Lectura de negoci: encara que "el que s'espera" són 40 baixes, hi ha més d'un 6 % de mesos en què n'hi haurà 50 o més només per atzar. Saber quanta variació és normal evita alarmes injustificades.
Poisson: comptar esdeveniments per unitat de temps
Modela el nombre d'esdeveniments en un interval fix quan passen de manera independent a un ritme mitjà λ (lambda).
- MercaFresh: si arriben de mitjana λ = 12 comandes per hora, quina probabilitat hi ha de rebre'n 20 o més en una hora (i saturar el repartiment)?
| Distribució | Modela | Paràmetres | Exemple MercaFresh |
|---|---|---|---|
| Bernoulli | Un assaig sí/no | p | Aquest client fa churn? |
| Binomial | Nre. d'èxits en n assajos | n, p | Baixes entre 500 clients |
| Poisson | Nre. d'esdeveniments per interval | λ | Comandes per hora |
Regla mnemotècnica: Bernoulli = una moneda, binomial = n monedes, Poisson = "quantes vegades sona el timbre en una hora".
Distribucions contínues: uniforme, normal i exponencial
Uniforme
Tots els valors d'un interval [a, b] són igual de probables; la seva densitat és un altiplà pla. Apareix poc en dades reals, però és la base de la simulació (els generadors aleatoris produeixen uniformes i d'aquí es deriva tota la resta) i un model honest de "no sé res dins d'aquest rang".
Normal (gaussiana)
La campana simètrica definida per la seva mitjana μ (centre) i la seva desviació estàndard σ (amplada). És la reina de les distribucions pel teorema central del límit (avançament: sumes i mitjanes de molts efectes petits i independents tendeixen a ser normals; ho demostrarem amb una simulació a la lliçó 02-04). Per això tantes magnituds agregades —errors de mesura, mitjanes de mostres— tenen forma de campana.
- MercaFresh: el temps de preparació d'una comanda al magatzem ronda una normal amb μ = 18 min i σ = 4 min.
Exponencial
Modela el temps entre esdeveniments d'un procés de Poisson. Si arriben λ = 12 comandes/hora, el temps entre dues comandes consecutives segueix una exponencial amb mitjana 1/λ = 5 minuts. És asimètrica amb cua dreta i "sense memòria": la probabilitat d'esperar 5 minuts més no depèn de quanta estona portes esperant.
# Si arriben 12 comandes/hora, probabilitat d'estar mes de 15 min sense comandes?
scale = 60 / 12 # mitjana: 5 minuts entre comandes
print(1 - stats.expon.cdf(15, scale=scale)) # ~0.05Fixa't en la parella Poisson/exponencial: compten el mateix des de dos angles (quants esdeveniments per interval vs. quant de temps entre esdeveniments).
| Distribució | Forma | Paràmetres | Exemple MercaFresh |
|---|---|---|---|
| Uniforme | Altiplà pla | a, b | Simulacions; descompte aleatori entre 5 i 15 % |
| Normal | Campana simètrica | μ, σ | Temps de preparació al magatzem |
| Exponencial | Decau des de 0, cua dreta | λ (o la seva inversa, la mitjana) | Minuts entre comandes consecutives |
La distribució normal en detall
La regla 68-95-99.7
Si X segueix una normal amb mitjana μ i desviació estàndard σ:
- El 68,3 % dels valors cau dins de μ ± 1σ.
- El 95,4 % cau dins de μ ± 2σ.
- El 99,7 % cau dins de μ ± 3σ.
Per al temps de preparació de MercaFresh (μ = 18, σ = 4):
- El 68 % de les comandes es preparen entre 14 i 22 minuts.
- El 95 % entre 10 i 26 minuts.
- El 99,7 % entre 6 i 30 minuts. Una comanda que triga 35 minuts a preparar-se és a més de 4σ: alguna cosa estranya ha passat.
Z-scores: mesurar en "nombre de desviacions estàndard"
El z-score d'un valor x és:
z = (x − μ) / σ
Respon a: a quantes desviacions estàndard de la mitjana és aquest valor? És una regla universal de "raresa" que no depèn de les unitats:
import numpy as np
mu, sigma = 18, 4
x = 31 # una comanda va trigar 31 min a preparar-se
z = (x - mu) / sigma
print(z) # 3.25 -> molt atipic
# Quina proporcio de comandes triga mes de 31 min?
print(1 - stats.norm.cdf(x, loc=mu, scale=sigma)) # ~0.0006- Un |z| < 2 és terreny normal; |z| > 3 és un candidat seriós a anomalia.
stats.norm.cdf(x, loc=mu, scale=sigma)dona P(X ≤ x) per a la normal de mitjanaloci desviacióscale; el seu complement diu que només un 0,06 % de comandes trigaria tant per pur atzar.
Aquí fem servir el z-score com a detector de rareses. Al mòdul 3 (lliçó 03-05) reapareixerà amb un altre paper: estandarditzar variables com a pas de preprocessament per als models. Mateixa fórmula, propòsit diferent.
Per què importen les distribucions en Machine Learning
- Supòsits dels models. Diversos algorismes funcionen millor (o només tenen garanties) sota certes distribucions: la regressió lineal (04-01) assumeix errors normals, el Naive Bayes gaussià (04-06) assumeix normalitat per classe, K-means (05-01) rendeix millor amb grups "rodons" de tipus gaussià. Conèixer la distribució real de les teves dades et diu si aquests supòsits són raonables.
- Detecció d'anomalies. El plantejament clàssic és: modela la distribució d'allò normal i marca com a anòmal el que sigui molt improbable sota ella. Per a MercaFresh: si els imports de comanda d'un client segueixen aproximadament una distribució coneguda, una comanda amb probabilitat baixíssima (z-score enorme, cua de la Poisson, etc.) mereix revisió abans d'acceptar-se: pot ser un error o un frau.
- Dades sintètiques i simulació. Generar dades amb distribucions controlades (com vam fer a 02-01) permet provar pipelines i models abans de tenir dades reals.
- Cues i transformacions. Reconèixer una cua dreta (imports, temps) anticipa que potser convé transformar la variable (p. ex., amb logaritmes), tècnica que es desenvolupa a la lliçó 03-03.
Generació i visualització amb NumPy i scipy
Divisió de la feina entre llibreries:
- NumPy (
np.random.default_rng()): generar mostres aleatòries. - scipy.stats: calcular PMF/PDF, CDF, quantils i ajustar distribucions.
- matplotlib: visualitzar i comparar mostra vs. corba teòrica.
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
rng = np.random.default_rng(7)
fig, axes = plt.subplots(2, 2, figsize=(11, 7))
# 1) Binomial: baixes mensuals entre 500 clients (p=0.08)
baixes = rng.binomial(n=500, p=0.08, size=2000)
axes[0, 0].hist(baixes, bins=range(20, 65), color="steelblue", edgecolor="white")
axes[0, 0].set_title("Binomial: baixes/mes entre 500 clients")
# 2) Poisson: comandes per hora (lambda=12)
comandes_hora = rng.poisson(lam=12, size=2000)
axes[0, 1].hist(comandes_hora, bins=range(0, 30), color="darkorange", edgecolor="white")
axes[0, 1].set_title("Poisson: comandes per hora")
# 3) Normal: temps de preparacio, mostra vs. densitat teorica
prep = rng.normal(loc=18, scale=4, size=2000)
axes[1, 0].hist(prep, bins=40, density=True, color="seagreen",
edgecolor="white", alpha=0.7)
x = np.linspace(4, 32, 300)
axes[1, 0].plot(x, stats.norm.pdf(x, loc=18, scale=4), "k--", label="PDF teorica")
axes[1, 0].set_title("Normal: minuts de preparacio")
axes[1, 0].legend()
# 4) Exponencial: minuts entre comandes (mitjana = 5)
entre_comandes = rng.exponential(scale=5, size=2000)
axes[1, 1].hist(entre_comandes, bins=40, density=True, color="indianred",
edgecolor="white", alpha=0.7)
x = np.linspace(0, 30, 300)
axes[1, 1].plot(x, stats.expon.pdf(x, scale=5), "k--", label="PDF teorica")
axes[1, 1].set_title("Exponencial: minuts entre comandes")
axes[1, 1].legend()
plt.tight_layout()
plt.show()Claus del codi:
rng.binomial,rng.poisson,rng.normal,rng.exponentialgeneren mostres de cada distribució;size=2000demana 2.000 observacions simulades.density=Truea l'histograma normalitza l'eix Y perquè l'àrea total sigui 1, i així l'histograma sigui comparable amb la corba de densitat teòrica que dibuixem al damunt ambstats.<dist>.pdf.- Superposar la mostra amb la PDF teòrica és la comprovació visual més simple de "les meves dades s'assemblen a aquesta distribució?". A la lliçó 02-04 veurem contrastos formals per respondre amb nombres.
- Observa les formes: binomial i Poisson són campanes discretes gairebé simètriques (amb aquests paràmetres), la normal és la campana contínua perfecta i l'exponencial decau des de zero amb cua dreta, com els temps entre comandes reals.
Errors Comuns i Consells
- Interpretar la densitat com a probabilitat. f(x) pot valer més d'1 (per exemple, en una uniforme estreta); la probabilitat és l'àrea sota la corba en un interval, no l'alçada.
- Assumir normalitat perquè sí. Imports i temps solen tenir cua dreta (asimetria); aplicar la regla 68-95-99.7 a dades no normals dona conclusions errònies. Dibuixa l'histograma primer.
- Confondre els paràmetres de scipy.
scaleastats.exponés la mitjana (1/λ), no λ. Istats.normrep la desviació estàndard (scale), no la variància. Consulta sempre la parametrització a la documentació. - Oblidar la independència. La binomial exigeix assajos independents amb la mateixa p. Si el churn d'un client arrossega el dels seus veïns (efecte boca-orella), el model binomial es queda curt.
- Fer servir z-scores amb distribucions molt asimètriques. Un z-score de 3 en una exponencial no és tan estrany com en una normal. La regla |z| > 3 pressuposa campana.
- Consell: memoritza les parelles "fenomen → distribució" de les taules d'aquesta lliçó; reconèixer el patró correcte en un problema nou és el 80 % de la feina.
Exercicis
Exercici 1
MercaFresh envia una campanya d'email a 200 clients amb una probabilitat de conversió del 5 % cadascun. (a) Quina distribució segueix el nombre de conversions i amb quins paràmetres? (b) Calcula amb scipy la probabilitat d'aconseguir exactament 10 conversions i (c) la d'aconseguir-ne 15 o més.
Exercici 2
El temps de preparació de comandes segueix una normal amb μ = 18 min i σ = 4 min. Fent servir només la regla 68-95-99.7 (sense codi): (a) entre quins valors hi ha el 95 % central de les comandes? (b) Quin percentatge aproximat triga més de 26 minuts? (c) Una comanda va trigar 6 minuts: quin és el seu z-score i com l'interpretes?
Exercici 3
Al centre logístic de MercaFresh arriben de mitjana 12 comandes per hora. Simula amb NumPy 10.000 hores d'activitat i estima empíricament la probabilitat de rebre 20 o més comandes en una hora. Compara el resultat amb el valor exacte de 1 - stats.poisson.cdf(19, mu=12).
Solucions
Solució 1
(a) Binomial B(n=200, p=0,05): 200 assajos Bernoulli independents. La seva mitjana és n·p = 10 conversions.
from scipy import stats
print(stats.binom.pmf(10, n=200, p=0.05).round(4)) # (b) ~0.1288
print((1 - stats.binom.cdf(14, n=200, p=0.05)).round(4)) # (c) ~0.0744(b) Un 12,9 % de probabilitat d'exactament 10. (c) Un 7,4 % d'aconseguir-ne 15 o més. Nota: per a la cua "15 o més" es resta la CDF en 14, no en 15.
Solució 2
- (a) μ ± 2σ = 18 ± 8 → entre 10 i 26 minuts.
- (b) Fora de μ ± 2σ queda el 5 % repartit en dues cues; només la superior: ≈ 2,5 % de les comandes triga més de 26 min.
- (c) z = (6 − 18) / 4 = −3. És a tres desviacions estàndard per sota de la mitjana: una comanda preparada sospitosament ràpid (es va registrar malament el temps?, comanda d'un sol article?). Les anomalies també existeixen per l'esquerra.
Solució 3
import numpy as np
from scipy import stats
rng = np.random.default_rng(0)
hores = rng.poisson(lam=12, size=10_000)
print((hores >= 20).mean()) # ~0.0210 (varia amb la llavor)
print(1 - stats.poisson.cdf(19, mu=12)) # 0.0213 (exacte)(hores >= 20) crea un array de booleans i .mean() calcula la proporció de True: la freqüència amb què passa l'esdeveniment a la simulació. Amb 10.000 repeticions, l'estimació empírica (~2,1 %) coincideix gairebé exactament amb la teòrica. Aquest patró "simular i comptar" és una eina potentíssima quan la fórmula exacta no existeix o no la recordes.
Conclusió
Ja saps què és una variable aleatòria i coneixes les sis distribucions de treball del dia a dia: Bernoulli, binomial i Poisson per comptar; uniforme, normal i exponencial per mesurar. Has aprofundit en la normal —la regla 68-95-99.7 i els z-scores— i has vist per què les distribucions importen en ML: sustenten els supòsits dels models i la detecció d'anomalies a les comandes de MercaFresh, a més de permetre simulacions amb NumPy i càlculs exactes amb scipy. Fins ara hem mirat cada variable per separat; el pas següent és estudiar com es relacionen entre elles: a la propera lliçó, la covariància i la correlació ens diran quines variables de MercaFresh es mouen juntes i quines avisen del churn.
Curs de Machine Learning
Mòdul 1: Introducció al Machine Learning
- Què és el Machine Learning?
- Història i evolució del Machine Learning
- Tipus de Machine Learning
- Aplicacions del Machine Learning
- El flux de treball d'un projecte de Machine Learning
Mòdul 2: Fonaments d'Estadística i Probabilitat
- Conceptes bàsics d'estadística
- Distribucions de probabilitat
- Correlació i covariància
- Inferència estadística
- Teorema de Bayes
Mòdul 3: Preprocessament de Dades
- Neteja de dades
- Gestió de dades mancants
- Transformació de dades
- Codificació de variables categòriques
- Normalització i estandardització
- Enginyeria de característiques
Mòdul 4: Algorismes de Machine Learning Supervisat
- Regressió lineal
- Regressió logística
- Arbres de decisió
- Màquines de suport vectorial (SVM)
- K veïns més propers (K-NN)
- Naive Bayes
- Xarxes neuronals
Mòdul 5: Algorismes de Machine Learning No Supervisat
- Clustering: K-means
- Clustering jeràrquic
- Anàlisi de components principals (PCA)
- Anàlisi d'agrupament DBSCAN
- Visualització de dades amb t-SNE i UMAP
Mòdul 6: Avaluació i Validació de Models
- Divisió de dades: entrenament, validació i prova
- Mètriques d'avaluació
- Validació creuada
- Corba ROC i AUC
- Overfitting i underfitting
Mòdul 7: Tècniques Avançades i Optimització
- Regularització: Ridge, Lasso i Elastic Net
- Ensemble Learning
- Gradient Boosting
- Xarxes neuronals profundes (Deep Learning)
- Optimització d'hiperparàmetres
Mòdul 8: Implementació i Desplegament de Models
- Frameworks i biblioteques populars
- Implementació de models en producció
- Manteniment i monitoratge de models
- Consideracions ètiques i de privadesa
Mòdul 9: Projectes Pràctics
- Projecte 1: Predicció de preus d'habitatges
- Projecte 2: Classificació d'imatges
- Projecte 3: Anàlisi de sentiments a les xarxes socials
- Projecte 4: Detecció de fraus
- Projecte 5: Segmentació de clients
