# ---
# jupyter:
#   jupytext:
#     text_representation:
#       extension: .py
#       format_name: light
#       format_version: '1.5'
#       jupytext_version: 1.14.4
#   kernelspec:
#     display_name: Python 3
#     language: python
#     name: python3
# ---

# ## 1. Introduction

# In this part of the project, we will clusterize data obtained from the previous notebook. The `set_option` is defined to show all columns and all the importations are made before the start.

import pandas as pd
import numpy as np
pd.set_option('display.max_columns', None)
pd.set_option('max_columns', None)
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import PowerTransformer
from sklearn.preprocessing import Normalizer
from sklearn import preprocessing

df = pd.read_csv('para_cluster.csv')
df = df.drop(['Unnamed: 0'],axis=1)
df.columns

df.shape

# To avoid collinearity, variables with correlation higher than 0.9 will be dropped. In statistics, multicollinearity (also collinearity) is a phenomenon in which one predictor variable in a multiple regression model can be linearly predicted from the others with a substantial degree of accuracy. In this situation, the coefficient estimates of the multiple regression may change erratically in response to small changes in the model or the data.

corr_matrix = df.corr().abs()
upper = corr_matrix.where(np.triu(np.ones(corr_matrix.shape), k=1).astype(np.bool))
to_drop = [column for column in upper.columns if any(upper[column] >0.90)]
#to_drop

df = df.drop(['Consumo de Energia Elétrica -  Comércio e Serviços (Em MWh)',
 'Consumo de Energia Elétrica - Residencial (Em MWh)',
 'Consumo de Energia Elétrica - Iluminação e Serviços Públicos e Outros (Em MWh)',
 'Empregos Formais de Homens ',
 'Empregos Formais de Mulheres ',
 'Empregos Formais das Pessoas de até 24 Anos ',
 'Empregos Formais das Pessoas de 25 a 39 Anos ',
 'Empregos Formais das Pessoas de 40 a 59 Anos ',
 'Empregos Formais das Pessoas de 60 Anos e Mais ',
 'Empregos Formais das Pessoas com Ensino Fundamental Incompleto ',
 'Empregos Formais das Pessoas com Ensino Fundamental Completo ',
 'Empregos Formais das Pessoas com Ensino Médio Completo ',
 'Empregos Formais das Pessoas com Ensino Superior Completo ',
 'Empregos Formais da Indústria ',
 'Empregos Formais da Construção ',
 'Empregos Formais do Comércio Atacadista e Varejista e do Comércio e Reparação de Veículos Automotores e Motocicletas ',
 'Empregos Formais dos Serviços ',
 'Participação dos Empregos Formais dos Serviços no Total de Empregos Formais (Em %)',
 'Frota de Veículos - Total ',
 'Frota de Automóveis ',
 'Frota de Ônibus ',
 'Frota de Caminhões ',
 'Frota de Reboques ',
 'Frota de Motocicletas e Assemelhados ',
 'Frota de Microônibus e Camionetas ',
 'Frota de Veículos de Outro Tipo ',
 'Índice de Desenvolvimento Humano Municipal - IDHM - Ranking dos Municípios ',
 'Índice de Desenvolvimento Humano Municipal - IDHM Educação ',
 'Índice de Desenvolvimento Humano Municipal - IDHM Renda ',
 'Leitos de Internação ',
 'Leitos SUS ',
 'Leitos SUS (Coeficiente por mil habitantes)',
 'Taxa de Fecundidade Geral (Por mil mulheres entre 15 e 49 anos)',
 'Óbitos Gerais (por local de residência) ',
 'Óbitos da População de 15 a 34 Anos ',
 'Óbitos da População de 60 Anos e Mais ',
 'PIB (Em mil reais correntes)',
 'População ',
 'População Masculina ',
 'População Feminina ',
 'População de 0 a 3 Anos ',
 'População de 4 a 6 Anos ',
 'População de 6 Anos ',
 'População de 7 a 10 Anos ',
 'População de 11 a 14 Anos ',
 'População de 15 a 17 Anos ',
 'População de 18 a 19 Anos ',
 'Auxiliares de Enfermagem Registrados no COREN/SP ',
 'Dentistas Registrados no CRO/SP ',
 'Enfermeiros Registrados no COREN/SP ',
 'Fonoaudiólogos registrados no CRFa/SP ',
 'Médicos Registrados no CRM/SP ','Empregos Formais da Agricultura. Pecuária. Produção Florestal. Pesca e Aquicultura ',
             'Índice de Desenvolvimento Humano Municipal - IDHM Longevidade ',
       'Índice Paulista de Responsabilidade Social - IPRS - Dimensão Riqueza ',
       'Índice Paulista de Responsabilidade Social - IPRS - Dimensão Longevidade ',
       'Índice Paulista de Responsabilidade Social - IPRS - Dimensão Escolaridade ',
             'Taxa Geométrica de Crescimento Anual da População - 2010/2020 (Em % a.a.)',
             'Dentistas Registrados no CRO/SP (Coeficiente por dois mil habitantes)',
             'Técnicos de Prótese Dentária Registrados no CRO/SP (Coeficiente por dois mil habitantes)',
             'Fonoaudiólogos registrados no CRFa/SP (Coeficiente por mil habitantes)','Area',
              'Técnicos de Enfermagem Registrados no COREN/SP ',
 'Técnicos de Prótese Dentária Registrados no CRO/SP ',
 'Domicílios Particulares com Renda per Capita até 1/2 Salário Mínimo - Censo Demográfico (Em %)',
 'Domicílios Particulares com Renda per Capita até 1/4 do Salário Mínimo - Censo Demográfico (Em %)',
             'Consumo de Energia Elétrica - Total (Em MWh)'],axis=1)
df.shape

df.head()

# New data from `municipio.csv` and `covid.csv` are stored into the notebook's memory.

municipios = pd.read_csv('municipio.csv')
municipios = municipios.drop(['Unnamed: 0'],axis=1)
municipios.head()

covid = pd.read_csv("DATA/covid.csv", sep=";", encoding='latin-1')
covid = covid.drop(['Unnamed: 5', 'Unnamed: 6'], axis=1)
covid.rename(columns={'Cod_IBGE':'Cód. IBGE'}, 
                 inplace=True)
covid.rename(columns={'Município':'Localidades'}, 
                 inplace=True)
covid.head()

# ## 2. Data Scaling

# As we have many variables with different ranges and meaning, scaler and/or normalization is necessary. Several scaler can be used. Indeed many estimators are designed with the assumption that each feature takes values close to zero or more importantly that all features vary on comparable scales. The Normalizer rescales the vector for each sample to have unit norm, independently of the distribution of the samples. 

# +
#scaler = preprocessing.RobustScaler()
#scaler = preprocessing.MinMaxScaler()
#scaler = preprocessing.StandardScaler()


df_scaled = Normalizer().fit_transform(df)
#df_scaled =  PowerTransformer(method='yeo-johnson').fit_transform(df)
names = df.columns
df_scaled = pd.DataFrame(df_scaled, columns=names)
# -

ssd = []
K = range(1,30)
for k in K:
    km = KMeans(n_clusters=k)
    km = km.fit(df_scaled)
    ssd.append(km.inertia_)

# In cluster analysis, the elbow method is a heuristic used in determining the number of clusters in a data set. The method consists of plotting the explained variation as a function of the number of clusters, and picking the elbow of the curve as the number of clusters to use. In this case, we have used 15 clusters.

import seaborn as sns
import matplotlib.pyplot as plt
plt.figure(figsize=(10,6))
plt.plot(K, ssd, 'bx-')
plt.xlabel('k')
plt.ylabel('ssd')
plt.title('Elbow Method For Optimal k')
#plt.show()

kmeans = KMeans(n_clusters=15)
model = kmeans.fit(df_scaled)

pred = model.labels_
df['cluster'] = pred

# +
from sklearn.decomposition import PCA

pca = PCA(n_components=2)
pca_model = pca.fit_transform(df_scaled)
data_transform = pd.DataFrame(data = pca_model, columns = ['PCA1', 'PCA2'])
data_transform['cluster'] = pred
# -

import seaborn as sns
import matplotlib.pyplot as plt
plt.figure(figsize=(8,8))
g = sns.scatterplot(data=data_transform, x='PCA1', y='PCA2',  hue='cluster')
title = plt.title('Countries Clusters with PCA')

df_total = pd.concat([municipios, df], axis=1)

sns.countplot(df_total['cluster'])

df_total = df_total.rename(columns={'Município': 'Localidades'})
df_total = df_total.merge(covid,on='Localidades', how='left' )

# Saving the dataframe for maping tools.

df_total.to_csv('clusterizacao_para_mapa.csv')

# ### 3. Visualization

df_ead = df_total

df_ead = df_ead.drop(['Cód. IBGE_x','Cód. IBGE_y', 'Grande região',
       'Mun_Total de casos', 'Mun_Total de óbitos'],axis=1)

# > Those are the variables that we have used in k-means. To choose which you would like to plot, go to the following cell and type the name of the variable. In this example case, we have chosen 'Índice de Desenvolvimento Humano Municipal - IDHM'. After that, you can run the last cell. A new page is going to pop up.

df_ead.columns

col = 'Índice de Desenvolvimento Humano Municipal - IDHM '

# +
#grid = sns.pairplot(df_ead5, hue="cluster", diag_kws={'bw': 0.4})
#dfl = df_ead4.set_index('cluster').stack().reset_index().rename(columns={'level_1': 'groups', 0: 'values'})
import plotly.express as px
from plotly.offline import plot

fig = px.box(df_ead, x="cluster", y=col)
plot(fig)
# -



StarcoderdataJupyterScriptsDedupFiltered