<jupyter_start><jupyter_text>CLUSTERING  Importamos las librerias<jupyter_code>import pandas as pd
import numpy as np
import os

import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns 
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import animation

from sklearn.decomposition import PCA as sklearnPCA
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import normalize
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans<jupyter_output><empty_output><jupyter_text>Leemos los datos<jupyter_code>filename = "nasa/event/event_wind_summary/event_wind_summary.csv"
fd = pd.read_csv(filename);
fd.head()<jupyter_output><empty_output><jupyter_text>CLUSTERING CON DATOS CON MUY POCA INFLUENCIA DEL VIENTO  ELECCION DE DATOS<jupyter_code># Debido a que SEISMIC_TIME_SOLS declara el tiempo segun el dia, las horas y los segundos, usaremos unicamente este valor 
# como medidor de tiempo
# Vemos que elementos usar en funcion de la correlacion anterior

datos_pca = fd[['SEISMIC_TIME_SOLS','DATA_ACQUISITION_SOL', 'DATA_ACQUISITION_HOUR','WINDSPEED','PRESSURE','WIND_DIRECTION','AIR_TEMPERATURE','MAXIMUM_X_AXIS']]
datos_pca_less = datos_pca[datos_pca.WINDSPEED <= 4 ]
datos_pca_limpios = datos_pca_less[~np.isnan(datos_pca_less).any(axis=1)]

# Estandarizamos los datos 

datos_std = StandardScaler().fit_transform(datos_pca_limpios)

# Volvemos a generar el DataFrame para mejor manejo

datos_pca_std = pd.DataFrame(datos_std, columns=datos_pca.columns)
datos_pca_std.describe()<jupyter_output>C:\Users\Usuario\Anaconda3\lib\site-packages\sklearn\preprocessing\data.py:625: DataConversionWarning: Data with input dtype int64, float64 were all converted to float64 by StandardScaler.
  return self.partial_fit(X, y)
C:\Users\Usuario\Anaconda3\lib\site-packages\sklearn\base.py:462: DataConversionWarning: Data with input dtype int64, float64 were all converted to float64 by StandardScaler.
  return self.fit(X, **fit_params).transform(X)<jupyter_text>Confirmamos que todas esas variables están de alguna forma correlacionadas Ahora veremos que al estandarizar los valores, la matriz de correlación ha cambiado.<jupyter_code>f, ax = plt.subplots(figsize=(10, 8)) 
corr = datos_pca_std.corr()
sns.heatmap(corr,square=True ,cmap=sns.diverging_palette(220, 10, as_cmap=True), ax=ax , annot = True)<jupyter_output><empty_output><jupyter_text>Una vez tenemos ya los datos estandarizados, haremos uso de pca para reducir el número de variables. Debido a que k-means solo puede representar valores en 2 y 3 dimensiones, tendremos que reducir de 6 componentes a 3.  METODO PCA  Aplicaremos el modelo para reducir las variables a tres comoponentes.Una vez tenemos el modelo, aplicamos la transformación a nuestro dataset.<jupyter_code>usados = ['SEISMIC_TIME_SOLS','WINDSPEED','PRESSURE','WIND_DIRECTION','AIR_TEMPERATURE','MAXIMUM_X_AXIS']

sklearn_pca = sklearnPCA(n_components=3)
datos_pca_3 = sklearn_pca.fit_transform(datos_pca_std)
datos_pca_3<jupyter_output><empty_output><jupyter_text>METODO K-MEANS Lo primero será intuir cual es la k a la hora de tomar k grupos.Para ello usaremos la gráfica de punto de codo:<jupyter_code>Nc = range(1, 20)
kmeans = [KMeans(n_clusters=i) for i in Nc]
kmeans
score = [kmeans[i].fit(datos_pca_3).score(datos_pca_3) 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()<jupyter_output><empty_output><jupyter_text>Lo siguiente será ejecutar K-means y obtener los centroides y sus etiquetas:<jupyter_code>kmeans = KMeans(n_clusters=5).fit(datos_pca_3)
centroids = kmeans.cluster_centers_
print(centroids)<jupyter_output>[[-0.26001668 -0.04992132 -1.72555118]
 [ 2.31357945 -0.26422222 -0.30158029]
 [ 1.04120567  0.77818252  0.94946364]
 [-1.48001844  0.86081111 -0.08813519]
 [-0.93342621 -1.00201689  0.28523736]]<jupyter_text>Lo mostramos todo:<jupyter_code>labels = kmeans.predict(datos_pca_3)
# Getting the cluster centers
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(datos_pca_3[:, 0], datos_pca_3[:, 1], datos_pca_3[:, 2], c=asignar,s=60)
ax.scatter(C[:, 0], C[:, 1], C[:, 2], marker='*', c=colores, s=1000)
copy =  pd.DataFrame()
copy['label'] = labels;
cantidadGrupo =  pd.DataFrame()
cantidadGrupo['cantidad']=copy.groupby('label').size()
cantidadGrupo<jupyter_output><empty_output><jupyter_text>RELACIONAR PCA CON EL DATASET ORIGINAL Lo primero será ver que tamaño tiene ambos datasets. Por ello:<jupyter_code># Dataset original : fd
# Dataset con datos fisicos y temporales : datos_gen
# Dataset con datos pca limpios : datos_pca
# Dataset con datos pca estandarizados : datos_pca_std
# Dataset con datos pca reducidos a 3 columnas : datos_pca_3
datos_pca_std.shape
datos_pca_3.shape<jupyter_output><empty_output><jupyter_text>Podemos ver entonces que a cada tupla de valores en datos_pca_std se le asigna un valor datos_pca_3.Lo siguiente será juntar el dataset datos_pca_3 con su grupo establecido, por ello:<jupyter_code># Las estiquetas se guardan en : labels
labels
labels.shape
datos_pca_less.describe()<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.0979020979020979, 'fraction_numerical': 0.038367038367038364, 'mean_word_length': 7.054794520547945, 'pattern_counts': {'":': 0, '<': 40, '<?xml version=': 0, '>': 39, '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': '10', 'dir': 'jupyter-structured-clean-dedup', 'id': '329786', 'license': 'MIT', 'n_tokens_mistral': 2194, 'n_tokens_neox': 2046, 'n_words': 469, 'path': 'spark/cluster_resultados/cluster/NASA/.ipynb_checkpoints/Hierarchical_clustering-checkpoint.ipynb', 'repo_name': 'gabgarar/NASA---Mision-Vikings', 'size': '5291'}