<jupyter_start><jupyter_text>--- Pasos a seguir para estimar clusters ---* Podemos estimar la k:    * NO: Propagación de la afinidad    * SI: Podemos usar la distancia Euclídea:        * SI: K-Means        * NO: Buscar valores centrales:            * SI: K-Medoides             * NO: Los datos son linealmente separables:                * SI: Clustering aglomerativo                * NO: Clustering Espectral  Clustering con Python  Importar el dataset<jupyter_code>import pandas as pd
df = pd.read_csv("../datasets/wine/winequality-red.csv", sep = ";")
df.head()

df.shape
import matplotlib.pyplot as plt
plt.hist(df["quality"])
df.groupby("quality").mean()<jupyter_output><empty_output><jupyter_text>Normalización de los datos<jupyter_code>df_norm = (df-df.min())/(df.max()-df.min())
df_norm.head()<jupyter_output><empty_output><jupyter_text>Clustering jerárquico con scikit-learn<jupyter_code>from sklearn.cluster import AgglomerativeClustering
clus= AgglomerativeClustering(n_clusters=6, linkage="ward").fit(df_norm)
md_h = pd.Series(clus.labels_) #modelo jerarquico, la h de es hierarchy
md_h.head() #vemos a que cluster pertenece cada una de las muestras
plt.hist(md_h)
plt.title("Histograma de los clusters")
plt.xlabel("Cluster")
plt.ylabel("Número de vinos del cluster")
clus.children_ #vemos cada uno de los hijos para cada uno de los nodos hojas
from scipy.cluster.hierarchy import dendrogram, linkage
Z = linkage(df_norm, "ward")
Z[-4:,] #vemos que pinta tienen los últimos 4 puntos y ver todas las columnas
plt.figure(figsize=(25,10))
plt.title("Dendrograma de los vinos")
plt.xlabel("ID del vino")
plt.ylabel("Distancia")
dendrogram(Z, leaf_rotation=90., leaf_font_size=4.)
plt.show()<jupyter_output><empty_output><jupyter_text>Ahora hacemos lo mismo pero limpiando (ver T6-2), e intentando quedarnos con los 6 clusters que se ven en la gráfica de barras, con un color_threshold de corte en 4 aprox.<jupyter_code>plt.figure(figsize=(25,10))
plt.title("Dendrograma de los vinos")
plt.xlabel("ID del vino")
plt.ylabel("Distancia")
dendrogram(Z, leaf_rotation=90., leaf_font_size=4., color_threshold=4,
           truncate_mode="lastp", p=12, show_leaf_counts=True, show_contracted=True)
plt.show()<jupyter_output><empty_output><jupyter_text>Clustering con K-means<jupyter_code>from sklearn.cluster import KMeans
from sklearn import datasets
model = KMeans(n_clusters=6)
model.fit(df_norm)
model.labels_ #nos muestra el cluster a cual pertenece cada uno de los vinos
md_k = pd.Series(model.labels_) #modelo de K-means
md_k.head()
df_norm["clust_h"] = md_h
df_norm["clust_k"] = md_k
df_norm.head()
plt.hist(md_k)
model.cluster_centers_ #obtenemos los centroides de cada cluster(6, una para cada cluster)
model.inertia_ #Eficiencia del modelo: distancia de cada elemento a su baricentro elevado al cuadrado(sin normalciar en este caso)<jupyter_output><empty_output><jupyter_text>Interpretación final<jupyter_code>df_norm.groupby("clust_k").mean()<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.11222780569514237, 'fraction_numerical': 0.008710217755443886, 'mean_word_length': 5.650334075723831, 'pattern_counts': {'":': 0, '<': 25, '<?xml version=': 0, '>': 25, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '6', 'dir': 'jupyter-structured-clean-dedup', 'id': '272664', 'license': 'MIT', 'n_tokens_mistral': 1127, 'n_tokens_neox': 1078, 'n_words': 270, 'path': 'notebooks/T5 - 4 - Clustering completo.ipynb', 'repo_name': 'dasafo/python-ml-course', 'size': '2985'}