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

  1. Variable aleatòria i funció de probabilitat
  2. Distribucions discretes: Bernoulli, binomial i Poisson
  3. Distribucions contínues: uniforme, normal i exponencial
  4. La distribució normal en detall: regla 68-95-99.7 i z-scores
  5. Per què importen les distribucions en Machine Learning
  6. 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.064
  • stats.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 - cdf es 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)?
lam = 12
print(1 - stats.poisson.cdf(k=19, mu=lam))   # ~0.021 -> ~2% de les hores
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.05

Fixa'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 mitjana loc i 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

  1. 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.
  2. 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.
  3. 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.
  4. 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.exponential generen mostres de cada distribució; size=2000 demana 2.000 observacions simulades.
  • density=True a 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 amb stats.<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. scale a stats.expon és la mitjana (1/λ), no λ. I stats.norm rep 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

Mòdul 2: Fonaments d'Estadística i Probabilitat

Mòdul 3: Preprocessament de Dades

Mòdul 4: Algorismes de Machine Learning Supervisat

Mòdul 5: Algorismes de Machine Learning No Supervisat

Mòdul 6: Avaluació i Validació de Models

Mòdul 7: Tècniques Avançades i Optimització

Mòdul 8: Implementació i Desplegament de Models

Mòdul 9: Projectes Pràctics

Mòdul 10: Recursos Addicionals

© Copyright 2026. Tots els drets reservats