Tutorial: Agrupación de senadores estadounidenses con K-Medias

Agrupación de senadores estadounidenses en K-Medias



Tutorial: Agrupación de senadores estadounidenses en K-Medias.


La agrupación en clústeres es una forma poderosa de dividir conjuntos de datos en grupos según la similitud. Un algoritmo de agrupamiento en clústeres muy popular es el agrupamiento de K-medias. En el agrupamiento de K-medias, se dividen los datos en un número fijo de grupos mientras se intenta asegurar, en la medida de lo posible, que los elementos de cada grupo son lo más parecidos. En esta publicación, se explorará el clúster de Senadores de EE. UU. utilizando un entorno interactivo de Python. Asimosmo, se usará el historial de votaciones del 114º Congreso para dividir a los senadores en grupos.


Cargar los datos


Se tiene un archivo csv que contiene todos los votos del 114º senado de EE.UU; que se puede descargar aquí. Cada fila contiene los votos que tiene cada senador de forma individual. Los votos se codifican como 0 "No", 1 "Sí" y 0.5 "Abstención". A continuacion se muestran las primeras tres filas de los datos:


name,party,state,00001,00004,00005,00006,00007,00008,00009,00010,00020,00026,00032,00038,00039,00044,00047
Alexander,R,TN,0,1,1,1,1,0,0,1,1,1,0,0,0,0,0
Ayotte,R,NH,0,1,1,1,1,0,0,1,0,1,0,1,0,1,0

Se puede leer el archivo csv en Python usando pandas:


import pandas as pd
# Leer en el archivo csv.
votes = pd.read_csv("114_congress.csv")
# Como se puede observar, hay 100 senadores y votaron 15 proyectos de ley (restamos 3 porque las primeras 3 columnas no son proyectos de ley).
print(votes.shape)
# Se tienen más votos "Sí" que "No" en general.
print(pd.value_counts(votes.iloc[:,3:].values.ravel()))
(100, 18)
1.0    803
0.0    669
0.5    28
dtype: int64

Agrupación inicial de k-medias


La agrupación de K-medias intentará hacer agrupaciones de los senadores. Cada grupo contendrá senadores cuyos votos sean lo más similares posible entre sí. Se necesita especificar la cantidad de clústeres que se quieren por adelantado. Se intentará inicialmente con 2 para observar los resultados.


import pandas as pd

# El algoritmo kmeans se implementa mediante la biblioteca scikits-learn
from sklearn.cluster import KMeans

# Crear un modelo de kmeans con los datos, utilizando 2 clústeres. Asimismo, random_state ayuda a garantizar que el algoritmo devuelva los mismos resultados cada vez.
kmeans_model = KMeans(n_clusters=2, random_state=1).fit(votes.iloc[:, 3:])
# A continuación se ajustan las etiquetas para los grupos: el primer grupo tiene la etiqueta "0" y el segundo tiene la etiqueta "1".
labels = kmeans_model.labels_
# ¡La agrupación se ve bastante bien!
# Se ha separado a todos los senadores en partidos basándose únicamente en el historial de las votaciones
print(pd.crosstab(labels, votes["party"]))
party   D  I   R
row_0
0      41  2   0
1       3  0  54

Explorando personas en el clúster incorrecto


Ahora se puede averiguar qué senadores están en el grupo "equivocado"; es decir, los senadores que están en el grupo asociado con el partido opuesto.


# Llamemos a este tipo de votantes "bichos raros" (¿por qué no?).
# No hay bichos republicanos.
democratic_oddballs = votes[(labels == 1) & (votes["party"] == "D")]

# Parece que Reid se ha abstenido mucho, lo que cambió su grupo.
# Manchin parece una auténtica votante rara.
print(democratic_oddballs["name"])
42    Heitkamp
56     Manchin
74        Reid
Name: name, dtype: object

Graficando los clusters


Es momento de explorar los grupos un poco más graficándonlos. En este caso, cada columna de datos representa una dimensión en el gráfico; esto es, no se pueden visualizar 15 dimensiones. Por lo tanto, se usará el análisis de componentes principales para comprimir las columnas de votos en dos. Luego, se pueden trazar a todos los senadores de acuerdo con sus votos y sombrearlos por su grupo de K-medias.


import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
pca_2 = PCA(2)

# Convertir los datos del voto en dos columnas con PCA.
plot_columns = pca_2.fit_transform(votes.iloc[:,3:18])

# Graficar a los senadores en función de las dos dimensiones y sombrear por etiqueta de grupo.
# Se puede imprimir el gráfico excribiendo "plt.show()".
plt.scatter(x=plot_columns[:,0], y=plot_columns[:,1], c=votes["label"])
plt.show()


Probar aún más clústeres


Si bien, es interesante graficar en dos grupos, el resultado no proporciona información que no sepamos. En este contexto, generar más grupos podría mostrar seccionar más a cada uno de los partidos o agruparlos de manera cruzada. En consecuencia, es bueno intentar usar 5 grupos para ver qué sucede.


import pandas as pdfrom sklearn.cluster
import KMeanskmeans_model = KMeans(n_clusters=5, random_state=1).fit(votes.iloc[:, 3:])
labels = kmeans_model.labels_

# Los republicanos siguen siendo bastante sólidos. No obstante, parece que existen dos "facciones" demócratas.
print(pd.crosstab(labels, votes["party"]))
party   D  I   R
row_0   6  0   0
1       0  0  52
2      31  1   0
3       0  0   2
4       7  1   0
JeshuaNomics

JeshuaNomics - DataScience es una web de divulgación donde se puede encontrar material formativo en ciencia de datos y programación estadística (R, Python y SQL).

Publicar un comentario (0)
Artículo Anterior Artículo Siguiente