Apunte de Python 2
Análisis de Componentes Principales
Preparación del ambiente
Tratamiento de datos
import numpy as np
import pandas as pd
import [Link] as sm
Gráficos
import [Link] as plt
import seaborn as sns
import matplotlib.font_manager
from matplotlib import style
[Link]('ggplot') or [Link]('ggplot')
Preprocesado y modelado
from [Link] import PCA
from [Link] import make_pipeline
from [Link] import StandardScaler
from [Link] import scale
Configuración warnings
import warnings
[Link]('ignore')
Carga de datos
df = pd.read_excel("/content/[Link]")
df
Carga el archivo y agrega una variable como índice
df = pd.read_excel("/content/[Link]", index_col="variable_id")
Correlación entre las variables originales del data set
corr = [Link]()
corr
1
Mapa de calor
import numpy as np
import seaborn as sns
import [Link] as plt
Crear el mapa de calor con las correlaciones entre las variables (heatmap)
[Link](corr, xticklabels = True , yticklabels = True ,cmap='coolwarm', annot=True,
fmt=".3f")
# Muestra el gráfico
[Link]()
En Pandas, "axis = 0" se refiere al eje horizontal o a las filas, y "axis = 1" al eje vertical o a
las columnas.
[Link](axis=0)
[Link](axis=0)
[Link](axis=0)
Modelo PCA
Entrenamiento modelo PCA con escalado de los datos
pca_pipe = make_pipeline(StandardScaler(), PCA()) # Le indico el modelo a aplicar
pca_pipe.fit(df) # Entrena el modelo con los datos de df
# Se extrae el modelo entrenado del pipeline
modelo_pca = pca_pipe.named_steps['pca']
# Se convierte el array a dataframe para añadir nombres a los ejes.
[Link](
data = modelo_pca.components_,
columns = [Link],
index = ['PC1', 'PC2', 'PC3', 'PC4', 'PC5', 'PC6', 'PC7'] # Cantidad de PC según la cantidad
de variables x
Mapa de calor (Heatmap) de las componentes
fig, ax = [Link](nrows=1, ncols=1, figsize=(5, 5))
componentes = modelo_pca.components_
[Link](componentes.T, cmap='viridis', aspect='auto')
[Link](range(len([Link])), [Link])
2
[Link](range(modelo_pca.n_components_),[f"PC{i+1}" for i in
range(modelo_pca.n_components_)])
[Link](False)
[Link]();
Biplot
import [Link] as plt
import numpy as np
# Nombres de las variables originales
features = [Link]
# Primeras dos componentes
pc1 = X_pca[:, 0]
pc2 = X_pca[:, 1]
[Link](figsize=(10, 7))
# 1) Graficamos los individuos (observaciones)
[Link](pc1, pc2, alpha=0.6, color="lightblue")
# 2) Agregamos vectores de las variables originales
# Tomamos los coeficientes (loadings) de PCA
loadings = pca.components_.T[:, :2]
for i, feature in enumerate(features):
[Link](0, 0,
loadings[i, 0]*5, # factor de escala
loadings[i, 1]*5,
color="red", alpha=0.7, head_width=0.05)
[Link](loadings[i, 0]*5.2, loadings[i, 1]*5.2, feature, color="red")
# Etiquetas
[Link]("PC1 ({}%)".format(round(pca.explained_variance_ratio_[0]*100, 2)))
[Link]("PC2 ({}%)".format(round(pca.explained_variance_ratio_[1]*100, 2)))
[Link]("Biplot de las dos primeras componentes principales")
[Link](True)
[Link](0, color="grey", lw=1)
3
[Link](0, color="grey", lw=1)
[Link]()
Distancia entre los puntos
import numpy as np
from [Link] import pdist
Distancia euclídea
pdist(x)
Distancia de Minkowski
pdist(x, metric='minkowski', p=3.5)
Distancia de Manhattan
pdist(x, metric='cityblock')
Distancia de Chebyshev
pdist(x, 'chebyshev')
Generación de variables Dummy para categóricas
df = pd.get_dummies(df, columns=["Gender"])
Normalizar columnas
df["V1"] = (df["V1"] - df["V1"].min()) / (df["V1"].max() - df["V1"].min())
K-means
V1 vs V2
Cálculo de la inercia para determinar la cantidad de cluster
c1 = "V1"
c2 = "V2"
inercias = []
for n in range(1, 11):
km = KMeans(n_clusters=n, init='k-means++', random_state=42)
[Link](df[[c1, c2]])
[Link](km.inertia_)
inercias
# Inercia: Suma de las distancias al cuadrado de los puntos a su centroide más cercano
4
# Graficamos la curva de inercias para ver el codo
[Link](1, figsize=(5, 5))
[Link](range(1, 11) , inercias , 'o')
[Link](range(1, 11) , inercias , '-' , alpha=0.5)
[Link]('Cantidad de clusters')
[Link]('Inercias')
[Link]()
Tomamos k=3 y entrenamos (Se puede elegir el valor según el método del codo)
k=3
km = KMeans(n_clusters=k, init='k-means++', random_state=42)
[Link](df[[c1, c2]])
km.fit_predict(df[[c1, c2]])
labels = km.labels_
centroids = km.cluster_centers_
# Graficamos
[Link](1, figsize=(10, 5))
[Link](x=c1, y=c2, data=df[[c1, c2]], c=labels, s=100)
[Link](x=centroids[:, 0] , y=centroids[:, 1], s=120 , c="red", alpha=0.5)
[Link](c1)
[Link](c2)
[Link]()
Se agregar el número de cluster al conjunto de datos
df['Cluster']=km.fit_predict(df[[c1, c2]])
df=df[['V1', 'V2', 'Cluster']]
df
Coeficiente de Silhouette
x=df[['V1','V2']].values
scaler = StandardScaler()
x_scale = scaler.fit_transform(x)
5
max_score = -1
best_k = None
for k in range(2, 11):
kmeans = KMeans(n_clusters=k, random_state=42)
y = kmeans.fit_predict(x_scale)
score = silhouette_score(x_scale, y)
if score > max_score:
max_score = score
best_k = k
print(f"k={k}, silhouette score={score:.3f}")
print(f"\nBest k={best_k} with silhouette score={max_score:.3f}")
Cluster Jerárquico
Vecino más cercano, distancia euclideana
single_clustering = linkage(df, method="single", metric="euclidean")
[Link](3, figsize=(20, 10))
dendrogram(single_clustering, above_threshold_color='#bcbddc')
# Otra orientación del dendrograma
#dendrogram(single_clustering, above_threshold_color='#bcbddc', orientation='right')
[Link]()
Para agregar el cluster al conjunto de datos
# Queremos, por ejemplo, 2 clusters
k=2
clusters = fcluster(single_clustering, k, criterion="maxclust")
df["Cluster"] = clusters
[Link]()
Vecino más lejano, distancia euclideana
complete_clustering = linkage(df, method="complete", metric="euclidean")
[Link](1, figsize=(20, 10))
dendrogram(complete_clustering)
[Link]()
6
Vinculación promedio de puntos, distancia euclideana
average_clustering = linkage(df, method="average", metric="euclidean")
[Link](2, figsize=(20, 10))
dendrogram(average_clustering)
[Link]()
UPGMA ponderado, distancia euclideana
weighted_clustering = linkage(df, method="weighted", metric="euclidean")
[Link](4, figsize=(20, 10))
dendrogram(weighted_clustering)
[Link]()
Método del centroide, distancia euclideana
centroid_clustering = linkage(df, method="centroid", metric="euclidean")
[Link](5, figsize=(20, 10))
dendrogram(centroid_clustering)
[Link]()
Médodo de la mediana, distancia euclideana
median_clustering = linkage(df, method="median", metric="euclidean")
[Link](5, figsize=(20, 10))
dendrogram(median_clustering)
[Link]()
Médodo ward mínima varianza, distancia euclideana
ward_clustering = linkage(df, method="ward", metric="euclidean")
[Link](5, figsize=(20, 10))
dendrogram(ward_clustering)
[Link]()