PR507408 — Auditoria de biaix i correcció de desequilibri
Tipus: Anàlisi de dades i programació (Python) Durada estimada: 4 hores (1-2 sessions) Lliurament: Campus Virtual — Notebook/script Python + informe curt
Objectius
Al finalitzar aquesta pràctica, l'alumne serà capaç de:
- Calcular i interpretar mètriques de biaix previ a l'entrenament (CI i DPL) sobre un dataset real.
- Identificar si un dataset presenta desequilibri de classes i quantificar-ne la magnitud.
- Aplicar tècniques de remostreig (oversampling, undersampling) i SMOTE amb la llibreria
imbalanced-learn. - Comparar l'efecte de cada tècnica sobre la distribució de classes i argumentar quina és més adequada per a cada cas.
- Redactar un informe breu que comuniqui els resultats a una audiència no necessàriament tècnica.
Materials necessaris
- Python 3.11+ amb
pandas,imbalanced-learniscikit-learninstal·lats (pip install pandas imbalanced-learn scikit-learn) - Jupyter Notebook o equivalent
- El fitxer de dades proporcionat (vegeu Part 1)
- Els materials d'aquest bloc: Biaix en les dades, Desequilibri de classes
Descripció de la pràctica
Part 1 — Dataset de treball (15 min)
Es proporciona un dataset sol_licituds_prestec.csv amb 5.000 sol·licituds de préstec personal d'una entitat financera fictícia, amb les columnes següents:
| Columna | Descripció |
|---|---|
id_sollicitud |
Identificador únic |
edat |
Edat del sol·licitant |
franja_edat |
jove (18-34), mitjana (35-59), gran (60+) |
ingressos_anuals |
Ingressos anuals declarats (€) |
import_sollicitat |
Import del préstec sol·licitat (€) |
historial_creditici |
bo, regular, dolent |
resultat |
concedit o denegat (variable objectiu) |
Si no disposes del fitxer
Si el fitxer no està disponible al Campus Virtual, genera'l tu mateix amb el següent script abans de començar, fent que la franja jove tingui deliberadament poques mostres (uns 400 registres) i una taxa de concessió molt més baixa que la resta, per poder observar el problema de biaix durant la pràctica:
import pandas as pd
import numpy as np
rng = np.random.default_rng(42)
n_mitjana, n_gran, n_jove = 2800, 1800, 400
def genera_grup(n, franja, taxa_concessio):
return pd.DataFrame({
"franja_edat": franja,
"edat": rng.integers(18, 75, n),
"ingressos_anuals": rng.normal(28000, 8000, n).clip(8000, 90000).round(0),
"import_sollicitat": rng.normal(12000, 5000, n).clip(1000, 50000).round(0),
"historial_creditici": rng.choice(["bo", "regular", "dolent"], n, p=[0.5, 0.35, 0.15]),
"resultat": rng.choice(["concedit", "denegat"], n, p=[taxa_concessio, 1 - taxa_concessio]),
})
df = pd.concat([
genera_grup(n_mitjana, "mitjana", 0.75),
genera_grup(n_gran, "gran", 0.70),
genera_grup(n_jove, "jove", 0.40),
], ignore_index=True)
df.insert(0, "id_sollicitud", range(1, len(df) + 1))
df.to_csv("sol_licituds_prestec.csv", index=False)
Part 2 — Mesura del biaix previ a l'entrenament (1,5 hores)
2.1 Desequilibri de classes (CI) per franja d'edat
Calcula i mostra, per a cada franja d'edat, el nombre i el percentatge de sol·licituds que conté el dataset. Respon: hi ha algun grup clarament infrarepresentat?
2.2 Diferència en les proporcions d'etiquetes (DPL)
Calcula, per a cada franja d'edat, la proporció de sol·licituds amb resultat concedit. Calcula la diferència entre la proporció del grup amb la taxa de concessió més alta i la del grup amb la taxa més baixa. Aquest valor és una aproximació pràctica i simplificada del DPL.
import pandas as pd
df = pd.read_csv("sol_licituds_prestec.csv")
# 2.1 — Class Imbalance (CI)
distribucio = df["franja_edat"].value_counts(normalize=True) * 100
print(distribucio)
# 2.2 — Difference in Proportions of Labels (DPL), aproximació
taxes_concessio = df.groupby("franja_edat")["resultat"].apply(
lambda s: (s == "concedit").mean()
)
print(taxes_concessio)
print(f"DPL aproximat (màx - mín): {taxes_concessio.max() - taxes_concessio.min():.3f}")
2.3 Interpretació
Respon per escrit (5-8 línies): segons els valors obtinguts a 2.1 i 2.2, hi ha indicis de biaix per edat en aquest dataset? Quin dels dos problemes et sembla més greu: la manca de representació (CI) o la diferència en la taxa de concessió (DPL)? Per què caldria corregir tots dos abans d'entrenar un model amb aquestes dades?
Part 3 — Correcció del desequilibri (2 hores)
Treballa únicament amb la variable franja_edat com a classe a equilibrar (no amb resultat).
3.1 Oversampling i undersampling aleatoris
Aplica RandomOverSampler i RandomUnderSampler de imbalanced-learn sobre el dataset, prenent franja_edat com a variable de classe. Mostra la distribució resultant en tots dos casos i el nombre total de files.
3.2 SMOTE
Codifica les variables categòriques necessàries (historial_creditici, resultat) a numèriques (per exemple amb pandas.get_dummies) i aplica SMOTE per equilibrar franja_edat. Mostra la distribució resultant.
SMOTENC per a dades mixtes
Si prefereixes no codificar manualment les variables categòriques, pots fer servir SMOTENC de imbalanced-learn, indicant amb el paràmetre categorical_features quines columnes són categòriques.
3.3 Comparativa
Construeix una taula (en Markdown o com a DataFrame) que compari, per a les 4 versions del dataset (original, oversampling, undersampling, SMOTE): nombre total de files, distribució de franja_edat, i si s'han creat dades noves o s'han duplicat/eliminat dades existents.
Part 4 — Conclusions (30 min)
Redacta un informe breu (mitja pàgina) adreçat a un responsable de negoci, sense llenguatge tècnic innecessari, que respongui:
- Quin problema de biaix s'ha detectat al dataset original?
- Quina tècnica de correcció recomanaries aplicar abans d'entrenar el model de concessió de préstecs, i per què?
- Quin risc hi hauria si el model s'entrenés directament amb el dataset original, sense corregir-ho?
Lliurament
Puja al Campus Virtual:
| Fitxer | Contingut |
|---|---|
PR507408_cognom_nom.ipynb (o .py + captures) |
Codi complet de les Parts 2 i 3, amb les sortides visibles |
| Informe de conclusions (pot anar al mateix notebook, en una cel·la Markdown final) | Respostes de les Parts 2.3 i 4 |
Consulta la Rúbrica PR507408 per als criteris detallats d'avaluació.
Pràctica PR507408 | Mòdul M5074 Sistemes de Big Data | Institut Sa Palomera (Blanes) | Curs CEIABD 2026-2027