---
title: "Municípios Capixabas - Clusterização"
output:
flexdashboard::flex_dashboard:
orientation: rows
source_code: embed
navbar:
- { title: "Voltar para o artigo", href: "http://zambon.ai/r/mun/backup_cluster_municipio.html", align: right }
---
```{r setup, include=FALSE}
library(flexdashboard)
library(see)
pacotes <- c("ggplot2","dplyr","plotly", "tidyverse", "ggrepel", "knitr", "kableExtra", "reshape2",
"misc3d", "plot3D", "cluster", "factoextra", "ade4", "geobr", "sf", "rio", "readr",
"datawizard", "ggtext", "stringr", "forcats", "correlation", "see", "ggstatsplot")
if(sum(as.numeric(!pacotes %in% installed.packages())) != 0){
instalador <- pacotes[!pacotes %in% installed.packages()]
for(i in 1:length(instalador)) {
install.packages(instalador, dependencies = T)
break()}
sapply(pacotes, require, character = T)
} else {
sapply(pacotes, require, character = T)
}
is_installed <- function(pkg_name){
setNames(is.element(pkg_name, installed.packages()[, "Package"]), pkg_name)
}
installed <- is_installed(pacotes)
pacotes_carregados <- sessionInfo()
pack <- c()
version <- c()
title <- c()
for (i in 1:length(pacotes_carregados$otherPkgs)) {
pack[i] <- pacotes_carregados[["otherPkgs"]][[i]][["Package"]]
version[i] <- pacotes_carregados[["otherPkgs"]][[i]][["Version"]]
title[i] <- pacotes_carregados[["otherPkgs"]][[i]][["Title"]]
}
cbind(pack, version, title, ifelse(installed == TRUE, 'Carregado', 'Não Carregado'))
# Definindo Diretório de Trabalho
setwd(dirname(rstudioapi::getActiveDocumentContext()$path)) #Define o diretório de trabalho sendo onde o arquivo está gravado
getwd()
# Carregar Dados
dados <- read.csv('dados.csv', stringsAsFactors = TRUE, fileEncoding = "UTF-8", sep = ";")
# Renomeando as colunas
names(dados) <- c('municipio', 'salario_medio_mensal', 'populacao', 'pessoal_ocupado', 'pib_per_capita', 'codigo_ibge',
'area_territorial', 'densidade', 'idhm', 'numero_est_agropecuarios')
# Transformar as colunas Factor em Numéricas
convert_number <- function(x){
x <- as.character(x)
x <- gsub(pattern = ",", replacement = ".",x = x, fixed = TRUE)
x <- as.numeric(x)
return(x)
}
dados$salario_medio_mensal <- convert_number(dados$salario_medio_mensal)
dados$area_territorial <- convert_number(dados$area_territorial)
dados$densidade <- convert_number(dados$densidade)
dados$idhm <- convert_number(dados$idhm)
dados$pib_per_capita <- convert_number(dados$pib_per_capita)
# Datawizard
options(scipen = 999)
# dados %>%
# mutate(pib_per_capita = pib_per_capita/1000)
# Transformar Código do IBGE em Fator
dados$codigo_ibge <- as.factor(dados$codigo_ibge)
# Reordenar Colunas
dados <- dados[, c(1, 6, 2, 3, 4, 5, 7, 8, 9, 10)]
# Padronização das Variáveis - função scale()
dados_padronizado <- as.data.frame(scale(dados[,3:10]))
rownames(dados_padronizado) <- dados$municipio
dados_padronizado$name_muni <- dados$municipio
top10 <- dados %>%
mutate(municipio = fct_lump_n(factor(municipio), n = 10, w = populacao, other_level = "OUTROS")) %>%
group_by(municipio) %>%
summarize(populacao = sum(populacao)) %>%
arrange(municipio == "OUTROS", desc(populacao))
top10$populacao <- as.numeric(top10$populacao)
top10 %>%
str()
levels(top10$municipio)
top10 <- top10 %>% dplyr::mutate(
municipio = forcats::fct_rev(forcats::fct_inorder(municipio)),
municipio = forcats::fct_relevel(municipio, "OUTROS", after = 0)
)
top10 <- top10 %>%
# adiciona o símbolo de percentual com `scales::percent()`
dplyr::mutate(perc = scales::percent(populacao / sum(populacao), accuracy = .1, trim = FALSE))
```
Gráficos
=====================================
Row
-----------------------------------------------------------------------
### Total de Municípios
```{r}
articles <- 78
valueBox(articles, icon = "fa-pencil")
```
### População
```{r}
comments <- '3,885 milhões'
valueBox(comments, icon = "fa-comments")
```
### km<sup>2</sup>
```{r}
spam <- '46.095'
valueBox(spam,
icon = "fa-map",
color = ifelse(spam > 10, "warning", "primary"))
```
Column
-------------------------------------
### 10 municípios mais populosos
```{r}
t10 <-
ggplot(top10, aes(x = populacao, y = municipio)) +
geom_col(fill = 'darkcyan') +
ggtitle('10 municípios mais populosos') +
theme(plot.title = element_text(hjust = 0.5)) +
ylab('População') + xlab('Município') +
geom_text(aes(label = perc), hjust = 1, nudge_x = -.5,
size = 4, fontface = "bold", colour = "black") +
theme_bw()
plotly::ggplotly(t10)
```
Row {data-height=650}
-------------------------------------
### Correlograma das variáveis
```{r}
ggcorrmat(
data = dados,
colors = c("#B2182B", "white", "#4D4D4D"),
title = "Correlograma das variáveis",
subtitle = "km quadrados, renda, populacao"
)
```
### Dendograma
```{r}
#---------- Esquema de aglomeração hierárquico ---------------------------------
# Matriz de dissimilaridades
matriz_D <- dados_padronizado %>%
select(1:8) %>%
dist(method = "euclidean")
# Elaboração da clusterização hierárquica
cluster_hier <- agnes(x = matriz_D, method = "single")
# As distâncias para as combinações em cada estágio
coeficientes <- sort(cluster_hier$height, decreasing = FALSE)
# Tabela com o esquema de aglomeração. Interpretação do output:
## As linhas são os estágios de aglomeração
## Nas colunas Cluster1 e Cluster2, observa-se como ocorreu a junção
## Quando for número negativo, indica observação isolada
## Quando for número positivo, indica cluster formado anteriormente (estágio)
## Coeficientes: as distâncias para as combinações em cada estágio
esquema <- as.data.frame(cbind(cluster_hier$merge, coeficientes))
names(esquema) <- c("Cluster1", "Cluster2", "Coeficientes")
# Construção do dendrograma
#dev.off()
#fviz_dend(x = cluster_hier)
# Dendrograma com visualização dos clusters (definição de 3 clusters)
fviz_dend(x = cluster_hier,
k = 3, # Onde vamos passar a linha Horizontal
k_colors = c("deeppink4", "darkviolet", "deeppink"),
color_labels_by_k = F,
rect = T,
rect_fill = T,
lwd = 1,
show_labels = FALSE,
ggtheme = theme_bw())
```
Mapas
=====================================
```{r include=FALSE}
# Elaboração da clusterização não hieráquica k-means
#cluster_kmeans <- kmeans(dados_padronizado[,1:8], centers = 3)
## centers: parametrização da quantidade de clusters
# Método de Elbow para identificação do número ótimo de clusters
## Apresenta a variação total dentro dos clusters para várias nº de clusters
## Em geral, quando há a dobra é um indício do número ótimo de clusters
#fviz_nbclust(dados_padronizado[,1:8], kmeans, method = "wss", k.max = 15)
# Criando variável categórica para indicação do cluster no banco de dados
#dados_padronizado$cluster_K <- factor(cluster_kmeans$cluster)
# carregando shape files de todos municipios do Espírito Santo
#mun.es.07 <- read_municipality(code_muni='ES', year=2007)
# Extraíndo as Coordenadas do Centro
#xmun.es.07 <- cbind(mun.es.07, st_coordinates(st_centroid(mun.es.07)))
#xmun.es.07$grupo <- factor(cluster_kmeans$cluster)
#xmun.es.07 <- mutate(xmun.es.07, grupo.nom = ifelse(grupo == 1, 'Tamanho P', ifelse(grupo == 2, 'Tamanho M', 'Tamanho G')))
#table(xmun.es.07$grupo)
```
### Tamanho dos Módulos
```{r echo=FALSE, message=FALSE, warning=FALSE, out.width = "800px"}
load("xmun.es.07.Rda")
g1 <- ggplot() + geom_sf(data=xmun.es.07, aes(fill= grupo.nom)) +
geom_text(data = xmun.es.07, aes(X, Y, label = stringr::str_wrap(name_muni, 10)), size = 2.5, fontface = "bold",
nudge_y = xmun.es.07$nudge_y) +
scale_fill_discrete(name = "Segmentação")
g1 <- g1 + labs(subtitle="Instalção de Módulos de Atendimento",
y="Longitude",
x="Latitude",
title="Faça Mais Fácil",
caption = "P: 60, M: 14, G: 4")
plotly::ggplotly(g1) %>%
layout(xaxis = list(autorange = TRUE),
yaxis = list(autorange = TRUE))
```
### Densidade Populacional
```{r, out.width = "100%"}
xmun.es.07$densidade <- dados$densidade
g2 <- ggplot() + geom_sf(data=xmun.es.07, aes(fill= densidade)) +
geom_text(data = xmun.es.07, aes(X, Y, label = stringr::str_wrap(name_muni, 10)), size = 2.5, fontface = "bold", colour = "white",
nudge_y = xmun.es.07$nudge_y) +
scale_fill_continuous(name = "Densidade")
plotly::ggplotly(g2) %>%
layout(xaxis = list(autorange = TRUE),
yaxis = list(autorange = TRUE))
```