Salta el contingut

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:

  1. Calcular i interpretar mètriques de biaix previ a l'entrenament (CI i DPL) sobre un dataset real.
  2. Identificar si un dataset presenta desequilibri de classes i quantificar-ne la magnitud.
  3. Aplicar tècniques de remostreig (oversampling, undersampling) i SMOTE amb la llibreria imbalanced-learn.
  4. Comparar l'efecte de cada tècnica sobre la distribució de classes i argumentar quina és més adequada per a cada cas.
  5. 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-learn i scikit-learn instal·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:

  1. Quin problema de biaix s'ha detectat al dataset original?
  2. Quina tècnica de correcció recomanaries aplicar abans d'entrenar el model de concessió de préstecs, i per què?
  3. 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