www.juanbarrios.com
import pandas as pd
import seaborn as sb
from pandas.plotting import table
import numpy as np
import six
import seaborn as sns
from matplotlib import pyplot as plt
from matplotlib.dates import date2num, num2date
from matplotlib import dates as mdates
from matplotlib import ticker
from matplotlib.colors import ListedColormap
from matplotlib.patches import Patch
from matplotlib import animation
plt.style.use("ggplot")# for pretty graphs
from IPython.display import clear_output
import ftplib
import os
import math
from sklearn.cluster import KMeans
import scipy.cluster.hierarchy as sch
from sklearn.cluster import AgglomerativeClustering
%matplotlib inline
%config InlineBackend.figure_format = 'retina'
data2=pd.read_csv('https://covid.ourworldindata.org/data/owid-covid-data.csv')
data2['date']=pd.to_datetime(data2['date'],format='%Y-%m-%d')
today_data=data2[data2.date==data2.date.max()]
## Verificando la cantidad de datos en la serie , en caso de blancos se asignará ceros
sum(today_data.duplicated(subset = 'location')) == 0
fig, axs = plt.subplots(2,2,figsize = (15,15))
# densidad poblacional -top 10 de paises
top10_population = today_data[['location','population_density']].sort_values('population_density', ascending = False).head(10)
plt1 = sns.barplot(x='location', y='population_density', data= top10_population, ax = axs[0,0])
plt1.set(xlabel = '', ylabel= 'Population density')
# Pobrza extrema -top 10 de paises
top10_total_fer = today_data[['location','extreme_poverty']].sort_values('extreme_poverty', ascending = False).head(10)
plt1 = sns.barplot(x='location', y='extreme_poverty', data= top10_total_fer, ax = axs[0,1])
plt1.set(xlabel = '', ylabel= 'Extreme Poverty')
# Esperanza de vida: paises con la esperanza mas baja
bottom10_life_expec = today_data[['location','life_expectancy']].sort_values('life_expectancy', ascending = True).head(10)
plt1 = sns.barplot(x='location', y='life_expectancy', data= bottom10_life_expec, ax = axs[1,0])
plt1.set(xlabel = '', ylabel= 'Life Expectancy')
# Producto Interno Bruto PIB -últimos 10 paises
bottom10_gdpp = today_data[['location','gdp_per_capita']].sort_values('gdp_per_capita', ascending = True).head(10)
plt1 = sns.barplot(x='location', y='gdp_per_capita', data= bottom10_gdpp, ax = axs[1,1])
plt1.set(xlabel = '', ylabel= 'GDP per capita')
for ax in fig.axes:
plt.sca(ax)
plt.xticks(rotation = 90)
plt.tight_layout()
plt.savefig('eda')
plt.show()
colormap = plt.cm.viridis
plt.figure(figsize=(12,12))
plt.title('Correlación de Pearson para los atributos', y=1.05, size=15)
sb.heatmap(data2.corr(), linewidths=0.1,vmax=1.0, square=True, cmap=colormap, linecolor='white', annot=True)
## países excluidos del análisis
excluded_cntry=['World', 'China', 'India']
## variables disponibles
print(data2.columns)
##variables a incluir, si se deja en blanco se utilizarán todas.
cols_needed=['total_cases_per_million','total_cases',
'total_deaths_per_million',
'new_deaths_per_million','total_tests_per_thousand','hospital_beds_per_thousand','population', 'population_density','new_tests_per_thousand','positive_rate' ]
data2=data2[~data2.location.isin(excluded_cntry)]
if len(cols_needed)==0:
data2_sub=data2.select_dtypes(include='float')
else:
data2_sub=data2[cols_needed]
data2_sub=pd.concat([data2_sub,data2[['location']]],axis=1)
data2_sub=data2_sub.groupby('location').mean().reset_index()
data2_sub.fillna(0,inplace=True)
# Análisis del método del hombro para determinar el número ideal de grupos utilizando Inertia
inertias = []
K = range(1,10)
for k in K:
#Building and fitting the model
kmeanModel = KMeans(n_clusters=k).fit(data2_sub.drop(['location'],axis=1))
kmeanModel.fit(data2_sub.drop(['location'],axis=1))
inertias.append(kmeanModel.inertia_)
plt.plot(K, inertias, 'bx-')
plt.xlabel('Numero de grupos')
plt.ylabel('Inertia')
plt.title('Método del Hombro con la herramienta Inertia')
plt.show()
# ajustado el algoritmo Kmeans ak conjunto de datos
from sklearn.cluster import KMeans
## Numero de clústers a utilizar. En este caso 4 clústers
kmeans = KMeans(n_clusters = 4, init = 'k-means++', random_state = 42)
y_kmeans = kmeans.fit_predict(data2_sub.drop(['location'],axis=1))
y_kmeans1=y_kmeans+1
cluster = pd.DataFrame(y_kmeans1)
today_sub=data2_sub.drop(['location'],axis=1)
# Adding cluster to the Dataset
today_sub['cluster'] = cluster
#Mean of clusters
kmeans_mean_cluster = pd.DataFrame(round(today_sub.groupby('cluster').mean(),1))
## Identificación de los valores promedio ( centroides)
kmeans_mean_cluster
Ejemplo de datos de 10 primeros países
today_Sub_2=pd.concat([data2_sub[['location']],today_sub],axis=1)
today_Sub_2.head(10)
for i in range(1,5):
print('****Países incluídos en el grupo {}*****'.format(str(i)))
print(list(today_Sub_2[today_Sub_2.cluster==i]['location'].values))
import plotly.express as px
fig = px.treemap(today_Sub_2, path=['cluster','location'], values='total_cases')
fig.update_layout(autosize=False,width=800,height=700)
fig.show()
La agrupación jerárquica por acumulación difiere del algoritmo k-means en el hecho de que elige una cantidad de grupos y comienza con centroides (púntos medios) aleatorios. Luego, va buscando los puntos más cercanos y los va agregando en el mismo grupo. Luego continua encontrando mas puntos cercanos y al final eso termina siendo un grupo. El dendograma final se dividirá en el número de grupos que el algoritmo haya identificado, aunque ese número se puede variar de forma manual.
# creando el Dendograma
dendrogram = sch.dendrogram(sch.linkage(data2_sub.drop(['location'],axis=1), method='ward'))
# creando los grupos
hc = AgglomerativeClustering(n_clusters=4, affinity = 'euclidean', linkage = 'ward')# save clusters for chart
y_hc = hc.fit_predict(data2_sub.drop(['location'],axis=1))
heirarchy=data2_sub.copy()
heirarchy['cluster'] = y_hc
# Aca se anota el numero de clústers si se desea poner de forma manual
for i in range(4):
print('****Name of countries in cluster {}*****'.format(str(i)))
print(list(heirarchy[heirarchy.cluster==i]['location'].values))
# grafico de los grupos de países
fig = px.treemap(heirarchy, path=['cluster','location'], values='total_cases')
fig.update_layout(autosize=False,width=800,height=700)
fig.show()