#!/usr/bin/env python # coding: utf-8 # # Ejercicio Python de K-means # Realizaremos un ejercicio de prueba para comprender como funciona este algoritmo # In[232]: import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sb from sklearn.cluster import KMeans from sklearn.metrics import pairwise_distances_argmin_min get_ipython().run_line_magic('matplotlib', 'inline') from mpl_toolkits.mplot3d import Axes3D plt.rcParams['figure.figsize'] = (16, 9) plt.style.use('ggplot') # ## Cargamos los datos de entrada del archivo csv # In[233]: dataframe = pd.read_csv(r"analisis.csv") dataframe.head() # In[234]: dataframe.describe() # In[235]: #vemos cuantos usuarios hay de cada categoria print(dataframe.groupby('categoria').size()) # Las categorias son: 1-actores 2-cantantes 3-modelo 4-TV 5-radio 6-tecnología 7-deportes 8-politica 9-escritor # ## Visualizamos los datos # In[236]: dataframe.drop(['categoria'],1).hist() plt.show() # In[237]: sb.pairplot(dataframe.dropna(), hue='categoria',size=4,vars=["op","ex","ag"],kind='scatter') # ## Creamos el modelo # In[268]: #Para el ejercicio, sólo seleccionamos 3 dimensiones, para poder graficarlo X = np.array(dataframe[["op","ex","ag"]]) y = np.array(dataframe['categoria']) X.shape # In[239]: fig = plt.figure() ax = Axes3D(fig) colores=['blue','red','green','blue','cyan','yellow','orange','black','pink','brown','purple'] #NOTA: asignamos la posición cero del array repetida pues las categorias comienzan en id 1. asignar=[] for row in y: asignar.append(colores[row]) ax.scatter(X[:, 0], X[:, 1], X[:, 2], c=asignar,s=60) # # Buscamos el valor K # In[240]: Nc = range(1, 20) kmeans = [KMeans(n_clusters=i) for i in Nc] kmeans score = [kmeans[i].fit(X).score(X) for i in range(len(kmeans))] score plt.plot(Nc,score) plt.xlabel('Number of Clusters') plt.ylabel('Score') plt.title('Elbow Curve') plt.show() # In[270]: # Para el ejercicio, elijo 5 como un buen valor de K. Pero podría ser otro. kmeans = KMeans(n_clusters=5).fit(X) centroids = kmeans.cluster_centers_ print(centroids) # In[243]: # Obtenemos las etiquetas de cada punto de nuestros datos labels = kmeans.predict(X) # Obtenemos los centroids C = kmeans.cluster_centers_ colores=['red','green','blue','cyan','yellow'] asignar=[] for row in labels: asignar.append(colores[row]) fig = plt.figure() ax = Axes3D(fig) ax.scatter(X[:, 0], X[:, 1], X[:, 2], c=asignar,s=60) ax.scatter(C[:, 0], C[:, 1], C[:, 2], marker='*', c=colores, s=1000) # In[244]: # Hacemos una proyección a 2D con los diversos ejes f1 = dataframe['op'].values f2 = dataframe['ex'].values plt.scatter(f1, f2, c=asignar, s=70) plt.scatter(C[:, 0], C[:, 1], marker='*', c=colores, s=1000) plt.show() # In[245]: # Hacemos una proyección a 2D con los diversos ejes f1 = dataframe['op'].values f2 = dataframe['ag'].values plt.scatter(f1, f2, c=asignar, s=70) plt.scatter(C[:, 0], C[:, 2], marker='*', c=colores, s=1000) plt.show() # In[246]: f1 = dataframe['ex'].values f2 = dataframe['ag'].values ''' # este codigo comentado agrega las categorias sobre cada punto for label, x, y in zip(dataframe['categoria'].values, f1, f2): plt.annotate( label, xy=(x, y), xytext=(-10, 10), textcoords='offset points', ha='right', va='bottom', bbox=dict(boxstyle='round,pad=0.5', fc='yellow', alpha=0.5), arrowprops=dict(arrowstyle = '->', connectionstyle='arc3,rad=0')) ''' plt.scatter(f1, f2, c=asignar, s=70) plt.scatter(C[:, 1], C[:, 2], marker='*', c=colores, s=1000) plt.show() # In[247]: # contamos cuantos usuarios hay en cada grupo copy = pd.DataFrame() copy['usuario']=dataframe['usuario'].values copy['categoria']=dataframe['categoria'].values copy['label'] = labels; cantidadGrupo = pd.DataFrame() cantidadGrupo['color']=colores cantidadGrupo['cantidad']=copy.groupby('label').size() cantidadGrupo # In[271]: # Veamos cuantos usuarios en cada categoria hay en el grupo 0 group_referrer_index = copy['label'] ==0 group_referrals = copy[group_referrer_index] diversidadGrupo = pd.DataFrame() diversidadGrupo['categoria']=[0,1,2,3,4,5,6,7,8,9] diversidadGrupo['cantidad']=group_referrals.groupby('categoria').size() diversidadGrupo # In[272]: #imprimimos en pantalla los usuarios con categoria 2 del grupo for index, row in group_referrals.iterrows(): if row["categoria"] == 2: print (row["usuario"], row["categoria"],row["label"]) # In[251]: #vemos el representante del grupo, el usuario cercano a su centroid closest, _ = pairwise_distances_argmin_min(kmeans.cluster_centers_, X) closest # In[252]: users=dataframe['usuario'].values for row in closest: print(users[row]) # In[267]: #miramos los usuarios del grupo 0 for index, row in copy.iterrows(): if row["label"] == 0: print (row["usuario"], row["categoria"],row["label"]) # # Clasificación de nuevos registros # In[273]: X_new = np.array([[45.92,57.74,15.66]]) #davidguetta personality traits new_labels = kmeans.predict(X_new) print(new_labels) #NOTA: en el array podemos poner más de un array para evaluar a varios usuarios nuevos a la vez # NOTA FINAL: Los resultados obtenidos pueden varias de ejecución en ejecución pues al inicializar aleatoriamente los centroids, podemos obtener grupos distintos o los mismos pero en distinto orden y color