In [108]:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from scipy.spatial.distance import cdist, pdist
import seaborn as sns
sns.set()
%matplotlib inline
In [99]:
data = pd.read_csv("./data/UN.csv")
print(data.columns)
data
#Para ver la relación entre las variable podemos usar
#sns.pairplot(data)
#Que grafica scatter plots e histogramas de cada variable.
Out[99]:
In [109]:
#Habiendo analizado los datos, se elige las siguientes features, y se elimina las entradas con NA
features = ["country", "lifeMale", "lifeFemale", "GDPperCapita", "infantMortality"]
data = data[features].copy()
data.dropna(inplace=True)
X = data[data.columns[1:]] #Me deshago del país, estos son los datos a modelizar
In [107]:
km = KMeans(3, init='k-means++') # initialize
#dtf = model.fit_transform(X)
#plt.scatter(x=dtf[:,0],y=dtf[:,1], cmap = plt.cm.get_cmap("RdYlGn"))
#plt.plot(data[c==0]["lifeMale"],data[c==0]["GDPperCapita"],'ro')
#plt.plot(data[c==1]["lifeMale"],data[c==1]["GDPperCapita"],'go')
#plt.plot(data[c==2]["lifeMale"],data[c==2]["GDPperCapita"],'bo')
Para encontrar significado a los datos, podemos reducir las dimensiones, pero en este caso no tiene mucho sentido o generar clusters de datos, que permite separar en diferentes casos. El método de K-Means necesita a priori saber la cantidad de clusters, para lo cual vamos a usar el método del codo
In [116]:
K = range(1,10)
KM = [KMeans(n_clusters=k).fit(X) for k in K] #Listas de modelos, todos con un k diferente.
centroids = [k.cluster_centers_ for k in KM] #Centros de los clusters, donde voy a definir distancia
D_k = [cdist(X, cent, 'euclidean') for cent in centroids] #Distancias de los puntos a los centros
dist = [np.min(D,axis=1) for D in D_k]
avgWithinSS = [sum(d)/X.shape[0] for d in dist] #Promedio pesado en la cantidad de datos
#Acá graficamos laa distancia promedio frente a la cantidad de clusters.
fig = plt.figure()
plt.plot(K, avgWithinSS, 'b*-')
plt.grid(True)
plt.xlabel('Cantidad de clusters')
plt.ylabel('Promedio de distancia a los centroides');
In [87]:
digits = load_digits()
digits.data.shape
model = Isomap(n_components=2)
model.fit(digits.data)
dtf = model.fit_transform(digits.data)
plt.scatter(x=dtf[:,0],y=dtf[:,1], c = digits.target, cmap = plt.cm.get_cmap("RdYlGn"))
plt.colorbar()
Out[87]: