# machine-learning-en-python
Machine Learning en Python
Volver a la portada del cursoAnálisis de Componentes Principales
Sección 5 · Modelos de Aprendizaje No Supervisado
Análisis de Componentes Principales
Cada cliente de PyShop se describe con 7 números: edad, antigüedad, visitas al mes, minutos por sesión, compras en 12 meses, ticket promedio y gasto anual. No se puede dibujar un espacio de 7 dimensiones, y varias de esas columnas dicen casi lo mismo: el gasto anual es, en esencia, compras por ticket. El Análisis de Componentes Principales (PCA) resume esas variables en unas pocas columnas nuevas que conservan la mayor parte de la información.
La idea: direcciones de máxima varianza
PCA busca nuevas direcciones en los datos, las componentes principales. Cada una es una combinación lineal de las variables originales. La primera (PC1) es la dirección en la que los clientes varían más; la segunda (PC2) es la de mayor varianza entre las perpendiculares a PC1, y así hasta tener tantas componentes como variables. Las componentes no están correlacionadas entre sí.
Si $\lambda_j$ es la varianza de los datos a lo largo de la componente $j$, la proporción de varianza explicada es:
$$\text{VE}_j = \frac{\lambda_j}{\sum_{i=1}^{p} \lambda_i}$$
Con $p$ variables escaladas, cada una aporta varianza 1 y el denominador vale aproximadamente $p$. Quedarse con las primeras $k$ componentes conserva la suma $\text{VE}_1 + \dots + \text{VE}_k$ de la varianza total.
Varianza explicada en los clientes de PyShop
En scikit-learn, PCA funciona como cualquier transformador: fit aprende las componentes y transform proyecta los datos. Antes se escalan las 7 variables numéricas con StandardScaler:
import numpy as np
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
num = ["edad", "antiguedad_meses", "visitas_mes", "minutos_sesion",
"compras_12m", "ticket_promedio", "gasto_anual"]
Z = StandardScaler().fit_transform(df[num])
pca = PCA().fit(Z)
print(pca.explained_variance_ratio_.round(3))
print(np.cumsum(pca.explained_variance_ratio_).round(3))
# [0.302 0.28 0.163 0.133 0.071 0.044 0.008]
# [0.302 0.582 0.745 0.878 0.949 0.992 1. ]
Las dos primeras componentes explican 0.302 y 0.280: juntas, 0.582 de la varianza. Con cuatro se llega a 0.878 y con cinco a 0.949. La última aporta solo 0.008, porque casi no hay información que no esté ya en las otras: el gasto anual se deduce de compras y ticket.
Para fijar un umbral en lugar de un número de componentes, PCA(n_components=0.90) conserva las necesarias para llegar al 90 %: aquí, 5. Con 0.95 hacen falta 6, porque 5 se quedan en 0.949.
Cargas: qué mide cada componente
pca.components_ guarda las cargas: el peso de cada variable original en cada componente. Una carga grande en valor absoluto indica que esa variable define la componente.
import pandas as pd
cargas = pd.DataFrame(pca.components_[:2].T, index=num, columns=["PC1", "PC2"])
print(cargas.round(2))
# PC1 PC2
# edad -0.40 0.19
# antiguedad_meses 0.07 -0.03
# visitas_mes 0.60 -0.09
# minutos_sesion -0.09 0.46
# compras_12m 0.56 -0.19
# ticket_promedio 0.11 0.64
# gasto_anual 0.38 0.55
PC1 se parece a la actividad: visitas (0.60) y compras (0.56) en positivo, edad (−0.40) en negativo. PC2 se parece al valor del ticket: ticket (0.64), gasto (0.55) y minutos por sesión (0.46).
Reducir a 2D para graficar
El uso más directo de PCA es visual. PCA(n_components=2).fit_transform(Z) convierte cada cliente en un punto del plano PC1-PC2. Si se colorea con los segmentos que encontró K-Means en la lección anterior, los cuatro grupos aparecen separados: tecnología arriba (ticket alto), ofertas abajo a la derecha (mucha actividad, ticket bajo), ocasionales abajo a la izquierda y lectores entre ellos. El plano solo conserva 0.582 de la varianza, pero basta para ver la estructura y explicarla a alguien del negocio.
PCA antes de clustering
Otra práctica común es reducir primero y agrupar después, sobre las componentes. Puede ayudar con muchas variables correlacionadas o ruidosas, pero descarta información que quizá separaba grupos. En los clientes de PyShop, K-Means con k=4 sobre las 4 variables de comportamiento recupera los segmentos reales con un índice de Rand ajustado (ARI) de 0.983. Sobre las 2 primeras componentes de las 7 variables, la silueta queda en 0.577, casi igual que el 0.587 original, pero el ARI baja a 0.881. Los grupos se ven compactos y aun así mezclan más clientes. Compara siempre los perfiles antes de aceptar la reducción.
Trampas comunes
- No escalar. Sin
StandardScaler, PC1 explica 0.996 de la varianza y es casi solo el gasto anual (carga 0.997), porque su desviación estándar (unos 3192 pesos) es miles de veces mayor que la de las visitas. PCA solo encontraría la variable con más unidades. - Leer el signo como un hallazgo. El signo de una componente completa es arbitrario: si todas sus cargas cambian de signo, es la misma componente. Lo que importa es el signo relativo entre variables.
- Bautizar componentes con demasiada seguridad. "Actividad" y "valor del ticket" son etiquetas útiles, no definiciones. Revisa todas las cargas antes de explicar una componente.
- Ajustar PCA con todos los datos en un modelo supervisado. Si después se entrena un modelo, el
fitde PCA va dentro de unPipeliney se ajusta solo con el entrenamiento, igual que el escalador. - Confundir varianza con utilidad. Las componentes con más varianza no son necesariamente las que mejor predicen o agrupan.
Cierre
Antes de reducir dimensiones, mira la curva de varianza acumulada y la tabla de cargas. Si dos componentes explican la mitad de la varianza y tienen una lectura clara, úsalas para graficar; para modelar, compara el resultado con y sin PCA. El notebook no-supervisado reproduce todas estas cifras, incluida la comparación de K-Means con y sin componentes. La guía de PCA de scikit-learn detalla las demás opciones del estimador.