Relacion entre la altitud, precipitación y temperatura en Guatemala¶
Paris Rivera
Descripción¶
Este proyecto se centra en el análisis de datos de 48 estaciones locales de precipitación y temperatura anual del año 1970. Utilizando técnicas de clustering como K-Means y Affinity Propagation, así como Análisis de Componentes Principales (PCA), se busca identificar patrones y agrupamientos significativos en los datos. Además, se visualizan las estaciones en un mapa y se realiza un análisis gráfico para comprender mejor la relación entre las variables estudiadas.
Introducciòn¶
La comprensión del clima y sus variaciones es fundamental para diversas disciplinas, desde la meteorología hasta la agricultura y la planificación urbana. Las estaciones meteorológicas proporcionan datos esenciales sobre variables como la precipitación y la temperatura, que son cruciales para predecir el clima y tomar decisiones informadas. Sin embargo, la influencia de la altitud sobre estas variables no siempre se ha comprendido completamente, lo que limita la capacidad de desarrollar modelos climáticos precisos y estrategias de adaptación eficaces. En este estudi, se analizan datos históricos de 1970 para explorar patrones de precipitación y temperatura en diferentes altitudes.
Antecedentes¶
El análisis de datos de estaciones meteorológicas a través de técnicas de clustering y análisis de componentes principales (PCA) permite identificar patrones y relaciones que no son evidentes a simple vista. Estas técnicas han evolucionado significativamente en las últimas décadas. Por ejemplo, el método K-Means, desarrollado hace más de 50 años, sigue siendo una herramienta potente y ampliamente utilizada para el agrupamiento de datos debido a su simplicidad y eficiencia (Jain, 2010). Además, la propagación de afinidad (Affinity Propagation) es una técnica más reciente que ofrece una perspectiva alternativa sobre el agrupamiento de datos, permitiendo identificar agrupamientos basados en la similitud de datos de entrada sin necesidad de predefinir el número de clusters (Pedregosa et al., 2011).
El uso de herramientas como Scikit-learn y Geopandas ha facilitado enormemente la implementación de estos métodos en Python. Scikit-learn es una biblioteca robusta que ofrece una variedad de algoritmos de aprendizaje automático, incluyendo K-Means y Affinity Propagation, y es ampliamente utilizada en la investigación y la industria debido a su versatilidad y rendimiento (Pedregosa et al., 2011). Por otro lado, Geopandas permite manejar y visualizar datos geoespaciales de manera eficiente, lo que es crucial para proyectos que involucran datos de estaciones meteorológicas dispersas geográficamente.
La normalización de datos es un paso crítico antes de aplicar técnicas de clustering, ya que asegura que todas las variables contribuyan de manera equitativa al análisis. Una vez normalizados los datos, el método del codo se puede utilizar para determinar el número óptimo de clusters en K-Means, lo que ayuda a identificar patrones de agrupamiento significativos (Bishop, 2006). El Análisis de Componentes Principales (PCA) es otra técnica fundamental en este tipo de análisis, ya que permite reducir la dimensionalidad de los datos y destacar las variables que más contribuyen a la variabilidad observada (Bishop, 2006).
Problema¶
La falta de comprensión sobre cómo la altitud influye en la precipitación y la temperatura en diferentes regiones ha limitado la capacidad para predecir y adaptarse a las variaciones climáticas. Aunque se dispone de datos históricos de estaciones meteorológicas, no se han aplicado técnicas avanzadas de análisis de datos para identificar patrones y relaciones significativas entre estas variables. Esto ha dificultado el desarrollo de modelos climáticos precisos y la formulación de políticas efectivas en sectores críticos como la agricultura, la gestión de recursos hídricos y la planificación urbana.
Objetivo¶
Identificar patrones de agrupamiento en las estaciones meteorológicas en función de las variables de precipitación, temperatura y altitud.
Datos Utilizados¶
Estaciones meteorológicas: 48 estaciones locales. Variables: Precipitación anual, temperatura anual, altitud. Año: 1970. Formato: CSV y shapefile para el mapa geográfico.
from google.colab import drive # montar Google Drive en el entorno de Google Colab para acceder a los archivos
import geopandas as gpd # para trabajar con datos geoespaciales.
import pandas as pd # Manipulación y análisis de datos
import matplotlib.pyplot as plt # creación de gráficos y visualizaciones
import numpy as np # cálculo numérico
import seaborn as sns # para dibujar gráficos estadísticos atractivos
from sklearn.cluster import KMeans, AffinityPropagation # librería de aprendizaje automático
from sklearn.decomposition import PCA # Análisis de componentes principale
from sklearn.preprocessing import StandardScaler # normalizar datos
from sklearn.metrics import pairwise_distances_argmin_min #Calcula las distancias por pares y retorna los índices y distancias mínimas.
# Montar Google Drive
drive.mount('/content/drive')
from google.colab import drive
drive.mount('/content/drive', force_remount=True)
Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount("/content/drive", force_remount=True). Mounted at /content/drive
import os
# Listar archivos en el directorio especificado
path = '/content/drive/My Drive/Lo_curso_python_2024/shapefile'
files = os.listdir(path)
print(files)
['departamentos.shp.xml', 'departamentos.prj', 'departamentos.shx', 'departamentos.sbx', 'departamentos.sbn', 'departamentos.dbf', 'departamentos.shp']
# Ruta al archivo shape
shape_file_path = '/content/drive/My Drive/Lo_curso_python_2024/shapefile/departamentos.shp'
# Leer el archivo shape
gdf = gpd.read_file(shape_file_path)
# Verificar las columnas del GeoDataFrame
print("Columnas en el GeoDataFrame:")
print(gdf.columns)
# Mostrar una lista de los nombres de los departamentos
departamento_column = 'DEPARTAMEN' #
if departamento_column in gdf.columns:
print("\nLista de departamentos:")
print(gdf[departamento_column].unique())
else:
print(f"La columna '{departamento_column}' no se encuentra en el GeoDataFrame. Por favor, verifica el nombre de la columna.")
Columnas en el GeoDataFrame: Index(['DEPTOS4_', 'DEPTOS4_ID', 'DEPARTAMEN', 'COUNT', 'Incendios', 'geometry'], dtype='object') Lista de departamentos: ['Petén' 'Quiché' 'Huehuetenango' 'Alta Verapaz' 'Izabal' 'San Marcos' 'Baja Verapaz' 'Zacapa' 'Totonicapán' 'Quetzaltenango' 'El Progreso' 'Chiquimula' 'Chimaltenango' 'Guatemala' 'Sololá' 'Jalapa' 'Sacatepéquez' 'Retalhuleu' 'Suchitepéquez' 'Jutiapa' 'Santa Rosa' 'Escuintla']
# Ruta al archivo CSV
csv_file_path = '/content/drive/My Drive/Lo_curso_python_2024/Estaciones.csv'
# Leer el archivo CSV con la codificación 'latin1' y el delimitador ';'
df_estaciones = pd.read_csv(csv_file_path, encoding='latin1', delimiter=';')
# Mostrar las estaciones con su información como tabla
print("\nEstaciones con su información:")
print(df_estaciones)
Estaciones con su información: Estación Departamento Municipio \ 0 Alameda ICTA Chimaltenango El Tejar 1 Chixoy Quiché Chicamán 2 Cubulco Baja Verapaz Cubulco 3 El Capitán Sololá San Lucas Tolimán 4 El Tablón Sololá Santa María El Tablón 5 INSIVUMEH Guatemala Guatemala 6 Los Albores El Progreso San Agustín Acasaguastlán 7 Los Esclavos Santa Rosa Cuilapa 8 Sacapulas Quiché Sacapulas 9 San Jerónimo Baja Verapaz San Jerónimo 10 San Martín Jilotepeque Chimaltenango San Martín Jilotepeque 11 Santa Cruz Balanyá Chimaltenango Santa Cruz Balanyá 12 Santiago Atitlán Sololá Santiago Atitlán 13 Suiza Contenta Sacatepéquez San Lucas Sacatepéquez 14 San Agustín Acasaguastlán El Progreso San Agustín Acasaguastlán 15 La Aurora Guatemala Guatemala 16 Chinique Quiché Chinique 17 Catarina San Marcos Catarina 18 Retalhuleu Retalhuleu Retalhuleu 19 Sabana Grande Escuintla Guanagazapa 20 Mazatenango Suchitepéquez Mazatenango 21 Las Vegas Izabal Livingston 22 Puerto Barrios Izabal Puerto Barrios 23 Santa María Cahabón Alta Verapaz Santa María Cahabón 24 Cobán Alta Verapaz Cobán 25 Panzós Alta Verapaz Panzós 26 Nebaj Quiché Nebaj 27 Flores Petén Flores 28 Poptún Petén Poptún 29 Huehuetenango Huehuetenango Huehuetenango 30 Labor Ovalle Quetzaltenango Olintepeque 31 San Marcos San Marcos San Marcos 32 San Pedro Necta Huehuetenango San Pedro Necta 33 Todos Santos Huehuetenango Todos Santos Cuchumatán 34 Los Altos Quetzaltenango Quetzaltenango 35 Montúfar Jutiapa Moyuta 36 Puerto San José Escuintla San José 37 Champerico Retalhuleu Champerico 38 Tecún Umán San Marcos Tecún Umán 39 Camotán Chiquimula Camotán 40 Esquipulas Chiquimula Esquipulas 41 La Ceibita Jalapa Monjas 42 La Fragua Zacapa Estanzuela 43 La Unión Zacapa La Unión 44 Pasabién Zacapa Río Hondo 45 Potrero Carrillo Jalapa Jalapa 46 Asunción Mita Jutiapa Asunción Mita 47 Quesada Jutiapa Quesada Latitud Longitud Elevación pp t_max t_mean t_min 0 14.6 -90.8 1750.0 715.0 21.6 16.4 10.2 1 15.4 -90.7 680.0 1379.2 30.3 24.3 17.4 2 15.1 -90.6 994.0 1053.7 29.0 21.3 14.3 3 14.6 -91.1 1562.0 1086.2 24.5 18.3 12.0 4 14.8 -91.2 2397.0 1268.7 19.9 13.8 8.3 5 14.6 -90.5 1502.0 1113.3 24.2 18.8 14.8 6 15.1 -89.9 1900.0 1763.7 24.0 18.8 12.5 7 14.3 -90.3 737.0 1557.4 30.3 23.0 15.5 8 15.3 -91.1 1180.0 724.4 29.3 21.8 14.2 9 15.1 -90.2 1000.0 832.9 27.6 20.8 15.1 10 14.8 -90.8 1800.0 1430.9 23.1 17.4 11.0 11 14.7 -90.9 2080.0 920.5 21.8 15.9 8.5 12 14.6 -91.2 1569.0 1230.7 24.4 18.6 12.7 13 14.6 -90.7 2105.0 1040.5 20.0 15.1 7.5 14 15.0 -90.0 371.0 742.5 29.8 25.4 20.4 15 14.6 -90.5 1491.0 1094.3 24.6 19.7 15.4 16 15.0 -91.0 1880.0 1368.3 22.0 16.8 9.4 17 14.9 -92.1 233.0 2694.1 32.6 25.6 18.3 18 14.5 -91.7 205.0 3271.0 29.2 23.9 18.4 19 14.4 -90.8 730.0 4577.1 31.3 26.0 20.7 20 14.5 -91.5 352.0 2640.1 32.8 25.6 21.0 21 15.6 -88.9 10.0 1721.5 30.9 26.4 20.3 22 15.7 -88.6 2.0 2385.7 29.4 25.7 20.7 23 15.6 -89.8 380.0 2319.9 30.2 24.6 18.7 24 15.5 -90.4 1323.0 2353.8 24.1 17.8 12.7 25 15.4 -89.6 33.0 2515.8 31.9 25.6 19.9 26 15.4 -91.1 1906.0 1974.0 22.8 16.3 9.5 27 16.9 -89.9 123.0 1618.0 31.1 25.3 19.7 28 16.3 -89.4 479.0 1795.8 28.0 23.0 18.2 29 15.3 -91.5 1870.0 920.2 24.7 15.7 9.7 30 14.9 -91.5 2380.0 787.6 21.3 13.3 5.0 31 15.0 -91.8 2420.0 1152.7 19.4 12.9 5.3 32 15.5 -91.8 1641.0 1439.2 23.9 18.4 11.7 33 15.5 -91.6 2480.0 1178.1 18.1 12.9 6.1 34 14.9 -91.5 2389.0 779.6 18.6 14.8 7.2 35 13.8 -90.2 29.0 1487.0 33.0 27.9 21.0 36 13.9 -90.8 6.0 1617.8 31.3 26.3 20.7 37 14.3 -91.9 5.0 1111.8 32.4 27.7 23.0 38 14.7 -92.1 44.0 1443.3 33.5 27.7 21.4 39 14.8 -89.4 450.0 1317.4 31.7 25.5 19.5 40 14.6 -89.3 950.0 1525.5 26.6 21.0 16.9 41 14.5 -89.9 960.0 649.5 27.6 21.7 15.7 42 15.0 -89.6 227.0 776.4 33.2 26.8 20.6 43 15.0 -89.3 1000.0 1594.8 25.4 21.1 17.4 44 15.0 -89.7 260.0 706.8 32.7 26.6 20.1 45 14.8 -89.9 1760.0 1133.8 21.0 16.1 8.9 46 14.3 -89.7 478.0 1449.7 32.2 26.1 20.3 47 14.2 -90.0 980.0 1147.5 29.0 22.2 15.3
# Verificar los nombres de las columnas
print("\nNombres de las columnas en el DataFrame de estaciones:")
print(df_estaciones.columns)
Nombres de las columnas en el DataFrame de estaciones: Index(['Estación ', 'Departamento ', 'Municipio', 'Latitud ', 'Longitud ', 'Elevación ', 'pp', 't_max', 't_mean', 't_min'], dtype='object')
# Usar los nombres de las columnas para longitud y latitud
# Reemplaza 'Longitud' y 'Latitud' con los nombres correctos
longitud_col = 'Longitud '
latitud_col = 'Latitud '
# Convertir el DataFrame de estaciones a un GeoDataFrame
gdf_estaciones = gpd.GeoDataFrame(
df_estaciones,
geometry=gpd.points_from_xy(df_estaciones[longitud_col], df_estaciones[latitud_col]),
crs="EPSG:4326"
)
# Graficar todas las estaciones
fig, ax = plt.subplots(figsize=(10, 8))
gdf.plot(ax=ax, color='lightgrey', edgecolor='black') # Mapa base con los departamentos
gdf_estaciones.plot(ax=ax, color='red', markersize=10) # Estaciones
plt.title('Mapa con todas las estaciones')
plt.show()
# Verificar las columnas
print(df_estaciones.columns)
# Mostrar las primeras filas del DataFrame
print(df_estaciones.head())
Index(['Estación ', 'Departamento ', 'Municipio', 'Latitud ', 'Longitud ', 'Elevación ', 'pp', 't_max', 't_mean', 't_min'], dtype='object') Estación Departamento Municipio Latitud Longitud \ 0 Alameda ICTA Chimaltenango El Tejar 14.6 -90.8 1 Chixoy Quiché Chicamán 15.4 -90.7 2 Cubulco Baja Verapaz Cubulco 15.1 -90.6 3 El Capitán Sololá San Lucas Tolimán 14.6 -91.1 4 El Tablón Sololá Santa María El Tablón 14.8 -91.2 Elevación pp t_max t_mean t_min 0 1750.0 715.0 21.6 16.4 10.2 1 680.0 1379.2 30.3 24.3 17.4 2 994.0 1053.7 29.0 21.3 14.3 3 1562.0 1086.2 24.5 18.3 12.0 4 2397.0 1268.7 19.9 13.8 8.3
# Seleccionar las columnas necesarias
cols = ['Estación ', 'Departamento ', 'Municipio', 'Latitud ', 'Longitud ', 'Elevación ', 'pp', 't_max', 't_mean', 't_min']
df = df_estaciones[cols]
# Manejar datos faltantes (si es necesario)
df = df.dropna()
# Convertir a GeoDataFrame
gdf_estaciones = gpd.GeoDataFrame(
df,
geometry=gpd.points_from_xy(df['Longitud '], df['Latitud ']),
crs="EPSG:4326"
)
# Analisis K.Means
# Normalizar los datos
scaler = StandardScaler()
df_scaled = scaler.fit_transform(df[['pp', 'Elevación ', 't_max', 't_mean', 't_min']])
# Algoritmo del codo para determinar el número óptimo de clusters
sse = []
for k in range(1, 11):
kmeans = KMeans(n_clusters=k, random_state=0, n_init=10).fit(df_scaled)
sse.append(kmeans.inertia_)
plt.figure(figsize=(10, 6))
plt.plot(range(1, 11), sse, marker='o')
plt.xlabel('Número de clusters')
plt.ylabel('SSE')
plt.title('Algoritmo del Codo')
plt.show()
# El número óptimo de clusters es 3 segun el codo
kmeans = KMeans(n_clusters=3, random_state=0, n_init=10)
df['cluster'] = kmeans.fit_predict(df_scaled)
# Visualizar los clusters
plt.figure(figsize=(10, 6))
sns.scatterplot(x=df['pp'], y=df['Elevación '], hue=df['cluster'], palette='viridis')
plt.title('Clustering K-Means (Precipitación vs Elevación)')
plt.xlabel('Precipitación (mm)')
plt.ylabel('Elevación (m)')
plt.show()
# Visualizar los clusters
plt.figure(figsize=(10, 6))
sns.scatterplot(x=df['t_mean'], y=df['Elevación '], hue=df['cluster'], palette='viridis')
plt.title('Clustering K-Means (Temperatura media vs Elevación)')
plt.xlabel('Temperatura media (Celsius)')
plt.ylabel('Elevación (metros)')
plt.show()
# Análisis de Clustering Adicional (Affinity Propagation)
affinity_propagation = AffinityPropagation(random_state=0)
df['cluster_ap'] = affinity_propagation.fit_predict(df_scaled)
# Visualizar los clusters de Affinity Propagation
plt.figure(figsize=(10, 6))
sns.scatterplot(x=df['pp'], y=df['Elevación '], hue=df['cluster_ap'], palette='viridis')
plt.title('Clustering Affinity Propagation (Precipitación vs Elevación)')
plt.xlabel('Precipitación (mm)')
plt.ylabel('Elevación (m)')
plt.show()
# Análisis de Clustering Adicional (Affinity Propagation)
affinity_propagation = AffinityPropagation(random_state=0)
df['cluster_ap'] = affinity_propagation.fit_predict(df_scaled)
# Visualizar los clusters de Affinity Propagation
plt.figure(figsize=(10, 6))
sns.scatterplot(x=df['t_mean'], y=df['Elevación '], hue=df['cluster_ap'], palette='viridis')
plt.title('Clustering Affinity Propagation (Precipitación vs Elevación)')
plt.xlabel('Temperatura media (Celsius)')
plt.ylabel('Elevación (metros)')
plt.show()
# Cálculo de la matriz de covarianza
cov_matrix = np.cov(df_scaled.T)
print("Matriz de Covarianza:")
print(cov_matrix)
Matriz de Covarianza: [[ 1.0212766 -0.37467708 0.33656224 0.36126372 0.38874311] [-0.37467708 1.0212766 -0.96917755 -0.99605225 -0.98637623] [ 0.33656224 -0.96917755 1.0212766 0.99395365 0.95952484] [ 0.36126372 -0.99605225 0.99395365 1.0212766 1.00091748] [ 0.38874311 -0.98637623 0.95952484 1.00091748 1.0212766 ]]
Resultados¶
La matriz de covarianza proporciona información sobre la relación entre las variables. En este caso, las variables son la precipitación (pp), la elevación, y las temperaturas máximas (t_max), medias (t_men), y mínimas (t_min).
1.) Precipitación y Elevación: La covarianza positiva entre la precipitación y la elevación (0.3366) indica que a medida que la elevación aumenta, la precipitación tiende a aumentar. Esto es coherente con la noción de que las áreas montañosas tienden a recibir más precipitación que las áreas bajas.
2.) Temperaturas y Elevación: Las covarianzas negativas entre la elevación y las temperaturas (t_max, t_men, t_min) indican que a medida que la elevación aumenta, las temperaturas tienden a disminuir. Esto también es coherente con el hecho de que las áreas de mayor elevación suelen ser más frías.
3.) Precipitación y Temperaturas: Las covarianzas negativas entre la precipitación y las temperaturas indican que a medida que la precipitación aumenta, las temperaturas tienden a disminuir. Esto podría deberse al efecto de la lluvia en el enfriamiento del aire y la reducción de las temperaturas.
4.) Covarianzas entre las Temperaturas: Las covarianzas positivas entre las diferentes temperaturas (t_max, t_men, t_min) indican que estas variables tienden a moverse juntas en la misma dirección. Es decir, cuando una de las temperaturas aumenta, es probable que las otras también lo hagan, y viceversa.
# Análisis de Componentes Principales (PCA)
pca = PCA(n_components=2)
pca_components = pca.fit_transform(df_scaled)
# Convertir a DataFrame para facilidad de uso
df_pca = pd.DataFrame(data=pca_components, columns=['PC1', 'PC2'])
df_pca['cluster'] = kmeans.labels_
# Graficar los componentes principales
plt.figure(figsize=(10, 6))
sns.scatterplot(x='PC1', y='PC2', hue='cluster', data=df_pca, palette='viridis')
plt.title('PCA de las Estaciones (Primeras dos componentes)')
plt.xlabel('Componente Principal 1')
plt.ylabel('Componente Principal 2')
plt.show()
# Mostrar la varianza explicada por cada componente principal
print("Varianza explicada por cada componente principal:")
print(pca.explained_variance_ratio_)
Varianza explicada por cada componente principal: [0.81179678 0.16686039]
# Obtener los pesos de las características (loadings) de las dos primeras componentes principales
loadings = pca.components_[:2].T * np.sqrt(pca.explained_variance_[:2])
# Crear un DataFrame para visualizar los loadings
loadings_df = pd.DataFrame(loadings, columns=['PC1', 'PC2'], index=['pp', 'Elevación', 't_max', 't_men', 't_min'])
# Mostrar los loadings
print("Loadings de las variables en las dos primeras componentes principales:")
print(loadings_df)
Loadings de las variables en las dos primeras componentes principales: PC1 PC2 pp -0.463731 0.897833 Elevación 0.991971 0.094213 t_max -0.980630 -0.134079 t_men -0.999861 -0.114165 t_min -0.992439 -0.077854
Resultados¶
Los "loadings" en el análisis de componentes principales (PCA) representan la contribución de cada variable original a cada componente principal. Valores más altos (positivos o negativos) indican una mayor contribución de esa variable al componente principal correspondiente. Aquí hay una interpretación de los resultados para los loadings de las variables en las dos primeras componentes principales:
1.) Componente Principal 1 (PC1):
- Precipitación (pp): Tiene un loading negativo (-0.4637) en PC1. Esto significa que la precipitación tiene una fuerte contribución negativa a la dirección de PC1. Variables con loadings negativos altos en una componente principal tienden a estar inversamente relacionadas con esa componente.
- Elevación: Tiene un loading positivo (0.9919) en PC1. Esto indica una fuerte contribución positiva de la elevación a la dirección de PC1. Variables con loadings positivos altos en una componente principal tienden a estar directamente relacionadas con esa componente.
- Temperaturas (t_max, t_men, t_min): Todas las temperaturas tienen loadings negativos altos en PC1, con los valores más altos para t_men y t_min. Esto sugiere una fuerte contribución negativa de las temperaturas a la dirección de PC1. En otras palabras, las temperaturas más bajas están inversamente relacionadas con PC1.
2.) Componente Principal 2 (PC2):
- Precipitación (pp): Tiene un loading positivo (0.8978) en PC2. Esto indica una fuerte contribución positiva de la precipitación a la dirección de PC2. Variables con loadings positivos altos en una componente principal tienden a estar directamente relacionadas con esa componente.
- Elevación: Tiene un loading positivo (0.0942) en PC2, pero su valor es relativamente bajo en comparación con el de PC1. Aunque contribuye positivamente a PC2, su contribución es mucho menor que la de la precipitación.
- Temperaturas (t_max, t_men, t_min): Todas las temperaturas tienen loadings negativos en PC2, pero sus valores son relativamente bajos en comparación con PC1. Esto sugiere una contribución negativa de las temperaturas a PC2, pero es mucho menos significativa que su contribución a PC1.
3.) PC1 parece estar principalmente influenciado por la elevación y las temperaturas, mientras que PC2 está más influenciado por la precipitación. Esto sugiere que las estaciones con patrones similares de elevación y temperatura estarán más cercanas en el espacio de las dos primeras componentes principales, mientras que las estaciones con patrones similares de precipitación estarán más cercanas en la dirección de PC2.
# Graficar el círculo de correlación
plt.figure(figsize=(8, 8))
sns.scatterplot(x='PC1', y='PC2', data=df_pca, hue='cluster', palette='viridis')
for feature, (x, y) in loadings_df.iterrows():
plt.arrow(0, 0, x, y, color='r', head_width=0.05, head_length=0.05)
plt.text(x, y, feature, fontsize=12)
plt.xlabel('Componente Principal 1')
plt.ylabel('Componente Principal 2')
plt.title('Círculo de correlación')
plt.grid()
plt.show()
Conclusiones¶
La normalización de datos y la aplicación de técnicas de clustering permitieron identificar agrupamientos significativos en las estaciones meteorológicas.
El método del codo indicó que 3 clusters eran óptimos para el análisis de K-Means, revelando patrones distintos en las variables de precipitación y temperatura.
Affinity Propagation proporcionó una perspectiva diferente de agrupamiento, mostrando cómo los métodos alternativos pueden ofrecer insights complementarios.
El Análisis de Componentes Principales mostró que la altitud y la temperatura son las variables que explican la mayor parte de la variabilidad en los datos, mientras que la precipitación es la segunda componente principal.
Bibliografia¶
- Jain, A. K. (2010). Data clustering: 50 years beyond K-means. Pattern Recognition Letters, 31(8), 651-666.
- Scikit-learn: Machine Learning in Python. Pedregosa et al., JMLR 12, pp. 2825-2830, 2011.
- Bishop, C. M. (2006). Pattern Recognition and Machine Learning. Springer.
- "Clustering Algorithms: K-Means, Affinity Propagation" - Documentation from Scikit-learn library.
- "Geopandas: Python tools for geographic data" - Documentation from Geopandas library.