Sumário

  1. Introdução
  2. Análise de Cluster
  3. \(k\)-means
  4. Análise de Componentes Principais
  5. Conclusão
  6. Referências

Carregando bibliotecas

# "limpar" ambiente
rm(list = ls())

# Carregar bibliotecas
library(tibble)
library(tidyverse)
library(FactoMineR)
library(factoextra)
library(PerformanceAnalytics)
library(readxl)


library(dplyr)

library(cluster) #algoritmo de cluster
library(dendextend) #compara dendogramas
library(fpc) #algoritmo de cluster e visualizacao
library(gridExtra) 

Introdução

A identificação de agrupamentos setoriais entre os estados, considerando vínculos empregatícios, é essencial para visualizar a concentração setorial do mercado de trabalho e avaliar a dinâmica geográfica. Catela e Porcile (2013) consideram que a estrutura econômica dos países em desenvolvimento é especializada (em poucos setores, principalmente commodities de exportação) e heterogênea (diferenças marcantes nos níveis de produtividade do trabalho), é concluindo que o progresso técnico se difunde de forma lenta e desigual não apenas entre países, mas especialmente no interior das economias periféricas. Dessa forma, a ideia é captar a concentração de empregos por setor em escala geográfica e observar se há homogeneidade nas Unidades Federativas.

Os dados usados para análise, relaciona o número de vínculos empregatícios por unidade federativa (UF) do Brasil com a classificação setorial do IBGE (grande setor). O presente exercício realizará uma análise de Clusters, com objetivo de identificar agrupamentos setoriais entre os estados. Como essa análise é sensível a outliers, foi retirado as informações dos estados de São Paulo, Rio de Janeiro e Minas Gerais. Dado que foi identificado previamente que esses três estados sozinhos faziam um grupo isolado para cada um deles. Os dados foram obtidos da consulta da Relação Anual de Informações Sociais (RAIS) para o último ano disponível (2021). Os dados são normalizados com a função scale().

Com dados padronizados temos que:

\[\mathbf{S}= \frac{1}{n-1}\mathbf{X}^\top \mathbf{X}= \frac{1}{n}\sum \mathbf{x}_i\mathbf{x}_i^\top \tag{1}\]

# Carregar dados
dados <- read_excel("C:/Users/kassy/OneDrive - caen.ufc.br/1. CAEN/3. Doutorado/4. Machine Learning/Work/vinculos uf setor/raissprjmg1.xlsx")

# ajustar nomes das UFs como nomes de linhas e normalizar
 df <- dados %>% 
    column_to_rownames(var="UF") %>% 
    scale()
summary(dados)
##       UF            Extrativa Mineral Indústria de Transformação
##  Length:24          Min.   :   26     Min.   :  3029            
##  Class :character   1st Qu.: 1264     1st Qu.: 37104            
##  Mode  :character   Median : 2194     Median : 83150            
##                     Mean   : 4957     Mean   :167242            
##                     3rd Qu.: 6520     3rd Qu.:216681            
##                     Max.   :25062     Max.   :743702            
##  Servicos Industriais de Utilidade Pública Construção Civil    Comércio     
##  Min.   : 1365                             Min.   :  5003   Min.   : 21443  
##  1st Qu.: 5014                             1st Qu.: 19960   1st Qu.: 89918  
##  Median : 7698                             Median : 34792   Median :147450  
##  Mean   :10747                             Mean   : 45756   Mean   :209333  
##  3rd Qu.:12984                             3rd Qu.: 63903   3rd Qu.:270787  
##  Max.   :30269                             Max.   :139656   Max.   :682647  
##     Serviços       Administração Pública
##  Min.   :  23357   Min.   : 54166       
##  1st Qu.: 135650   1st Qu.:129299       
##  Median : 225485   Median :203713       
##  Mean   : 356655   Mean   :240889       
##  3rd Qu.: 553148   3rd Qu.:330728       
##  Max.   :1111869   Max.   :625526       
##  Agropecuária, Extração Vegetal, Caça e Pesca
##  Min.   :  1085                              
##  1st Qu.: 11351                              
##  Median : 22779                              
##  Mean   : 39137                              
##  3rd Qu.: 59141                              
##  Max.   :129835
# Verificar missing values
colSums(is.na(dados))
##                                           UF 
##                                            0 
##                            Extrativa Mineral 
##                                            0 
##                   Indústria de Transformação 
##                                            0 
##    Servicos Industriais de Utilidade Pública 
##                                            0 
##                             Construção Civil 
##                                            0 
##                                     Comércio 
##                                            0 
##                                     Serviços 
##                                            0 
##                        Administração Pública 
##                                            0 
## Agropecuária, Extração Vegetal, Caça e Pesca 
##                                            0
chart.Correlation(df, histogram=TRUE, pch=19)

Esse gráfico mostra a distribuição de cada variável na diagonal, gráficos de dispersão bivariados na parte inferior e o valor das correlações, com nível de significância na parte superior. A informação mais notável desse quadro é a ausência de correlação entre os setores Extrativa Mineral e Indústria de Transformação. Isso pode ser interpretado como uma indicação de que o setor Extrativa Mineral é voltado para exportação e não fornece insumos para a indústria local.

Análise de Cluster

A análise de cluster é definida como aprendizado não supervisionado geralmente é realizado como parte de uma análise exploratória de dados (JAMES, G. et al (2013)).

Clustering usa técnicas para encontrar subgrupos, ou agrupamentos de clusters em conjunto de dados, as duas abordagens mais conhecidas são o agrupamento \(K\)-means e o agrupamento hierárquico. Em particular, no clustering \(K\)-means, procuramos particionar as observações em um número pre-especificado de clusters. No clustering hierárquico, não sabemos antecipadamente quantos clusters queremos; de fato, acabamos com uma representação visual em forma de árvore das observações, chamada dendograma, que nos permite visualizar de uma só vez os agrupamentos obtidos para cada número possível de agrupamentos, de 1 a \(n\).

Para realizar o cálculo da matriz de distância entre os clusters foi usado o método da distância euclidiana.

# Matriz de distância
d <- dist(df, method = "euclidean")

# Aplicar critério de ligação
hc <- hclust(d, method = "average" )

Dendograma

Os rótulos de classe são mostrados em cores distintas. A altura da fusão (medida no eixo vertical) entre os ramos do dendograma indica quão diferentes são as observações. Assim, as observações que se unem no ponto mais baixo do dendograma são bastante semelhantes entre si, enquanto as observações que se unem próximo ao topo tendem a ser bastante diferentes entre si.

# Construir dendograma
dend3 <- as.dendrogram(hc) 
dend3 %>% set("branches_lwd", 4) %>%      # 3 refere-se a espessura da linha
    set("branches_k_color", k = 6) %>%    # k é o número de clusters
    plot(main = "average")#, cex = 10.8)     #cex é o tamanho da fonte 

O dendograma mostra que os estados do sul do país são os mais semelhantes quanto ao número de vínculos por classificação setorial. Isso é provavelmente devido a uma série de fatores, incluindo a localização geográfica, a história econômica e a cultura desses estados. Os estados do Ceará e Pernambuco na região nordeste, Mato Grosso e Mato Grosso do Sul no centro-oeste, também são semelhantes por estarem na mesma região e por possuírem características de vínculos por setor semelhantes. Há uma série de outros ramos do dendograma entre os estados que possuem características semelhantes, sendo esses pontos mais baixos do dendograma tem como um ramo em comum entre eles.

As maiores semelhanças são entre:

Esses dados indicam que os estados do Brasil podem ser agrupados em grupos com base em suas características econômicas. Esses grupos podem ser usados para identificar oportunidades de cooperação entre os estados e para desenvolver políticas públicas que atendam às necessidades específicas de cada grupo.

\(k\)-means

Número ótimo de Clusters

O método \(k\)-means visa minimizar a soma da distância quadrada de cada ponto em relação à média do cluster (temos um problema de minimizar a soma de quadrados totais).

# Número ótimo de clusters
fviz_nbclust(df, kmeans, method = "wss")#, k=6)

A localização de uma curva (joelho) na parcela é geralmente considerada como um indicador do número apropriado de clusters. Os resultados sugerem que 3 é o número ideal de clusters, pois parece ser a dobra no joelho (ou cotovelo).

#calculate gap statistic based on number of clusters
gap_stat <- clusGap(df,
                    FUN = kmeans,
                    nstart = 25,
                    K.max = 10,
                    B = 50)
#plot number of clusters vs. gap statistic
fviz_gap_stat(gap_stat)

A estatística gap compara a variação intracluster total para diferentes valores de \(k\) com seus valores esperados sob distribuição de referência nula dos dados (uma distribuição sem agrupamento óbvio). O resultado da estatística confirma a observação do gráfico da soma dos quadrados totais, considerando a indicação de 3 clusters.

Resultados do agrupamento

# Aplicando k-means
set.seed(123)
cluster_uf <- kmeans(df, centers = 3, nstart = 1)
cluster_uf
## K-means clustering with 3 clusters of sizes 14, 4, 6
## 
## Cluster means:
##   Extrativa Mineral Indústria de Transformação
## 1        -0.5238623                -0.55294971
## 2         0.7320825                 1.89692176
## 3         0.7342904                 0.02560148
##   Servicos Industriais de Utilidade Pública Construção Civil   Comércio
## 1                                -0.6377589       -0.6497643 -0.6478813
## 2                                 1.8385866        1.7974481  1.9072093
## 3                                 0.2623796        0.3178180  0.2402503
##     Serviços Administração Pública Agropecuária, Extração Vegetal, Caça e Pesca
## 1 -0.6217737            -0.5703763                                   -0.6070679
## 2  1.8173163             1.4407585                                    1.1062738
## 3  0.2392610             0.3703724                                    0.6789759
## 
## Clustering vector:
## RO AC AM RR PA AP TO MA PI CE RN PB PE AL SE BA ES PR SC RS MS MT GO DF 
##  1  1  1  1  3  1  1  1  1  3  1  1  3  1  1  2  3  2  2  2  1  3  3  1 
## 
## Within cluster sum of squares by cluster:
## [1] 14.88586 13.09951 22.80623
##  (between_SS / total_SS =  72.4 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"
# Calculando a soma dos quadrados
cluster_uf$tot.withinss
## [1] 50.79161
# Testando número de interação maior
cluster_uf100 <- kmeans(df, centers = 3, nstart = 100)
cluster_uf100
## K-means clustering with 3 clusters of sizes 14, 6, 4
## 
## Cluster means:
##   Extrativa Mineral Indústria de Transformação
## 1        -0.5238623                -0.55294971
## 2         0.7342904                 0.02560148
## 3         0.7320825                 1.89692176
##   Servicos Industriais de Utilidade Pública Construção Civil   Comércio
## 1                                -0.6377589       -0.6497643 -0.6478813
## 2                                 0.2623796        0.3178180  0.2402503
## 3                                 1.8385866        1.7974481  1.9072093
##     Serviços Administração Pública Agropecuária, Extração Vegetal, Caça e Pesca
## 1 -0.6217737            -0.5703763                                   -0.6070679
## 2  0.2392610             0.3703724                                    0.6789759
## 3  1.8173163             1.4407585                                    1.1062738
## 
## Clustering vector:
## RO AC AM RR PA AP TO MA PI CE RN PB PE AL SE BA ES PR SC RS MS MT GO DF 
##  1  1  1  1  2  1  1  1  1  2  1  1  2  1  1  3  2  3  3  3  1  2  2  1 
## 
## Within cluster sum of squares by cluster:
## [1] 14.88586 22.80623 13.09951
##  (between_SS / total_SS =  72.4 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"
# Calculando a soma dos quadrados
cluster_uf100$tot.withinss
## [1] 50.79161

O algoritmo do \(k\)-means utiliza os vetores de pontuação da análise dos componentes principais (PCA) para separar os cluster pelos centroides. Se existir falhas em dimensionar as variáveis antes de realizar o procedimento PCA a maioria dos componentes principais seria direcionados pela variável de maior média e variância. Dessa forma, faz-se necessário a realização da padronização das variáveis para que tenham média (zero) e desvio padrão (um) antes de realizar o PCA.

Outros testes foram realizados considerando um número de clusters maior que o ótimo e modificando o valor de nstart. Como resultado, os agrupamentos foram diferentes nas duas especificações. Quando o número de clusters é diferente de 3, o valor de nstart, que especifica o número de vezes que o algoritmo \(k\)-means será executado com diferentes inicializações aleatórias, também pode afetar o valor de tot.withinss. O valor de tot.withinss é a soma dos quadrados dos erros dentro do cluster. Um valor menor de tot.withinss indica que os dados estão mais bem agrupados.

No caso de 4 clusters, nstart=1 é 41.63597 contra 41.54623 de nstart=100. Portanto, o cluster com nstart=100 possui menor soma dos erros quadrados e é considerado que este agrupamento produz melhor convergência. Além disso, as duas especificações não produzem o mesmo agrupamento de UFs.

A identificação do número ótimo de clusters como sendo igual a 3 mostra que o valor de nstart não tem impacto na convergência dos clusters para os dados analisados.

# Vizualizar clusters com nstart=100
fviz_cluster(cluster_uf, 
             data = df, 
             ggtheme = theme_minimal(base_size=18))

#ggtitle("`nstart=100`")
#, fig.height = 7, fig.width = "100%"

Considerando os 3 clusters os agrupamentos das UFs foram:

Os estados (Rio Grande do Sul e Paraná), (Ceará e Pernambuco), (Piauí e Alagoas), (Acre e Roraima), (Rondônia e Tocantins) e (Amazonas e Paraíba), formaram clusters semelhantes aos formados pelo dendograma. Os demais foram separados, como Mato Grosso e Mato Grosso do Sul. Na análise do \(k\)-means, é considerado que quanto menor a distância entre as observações maior a semelhanças entre elas, assim, podemos considerar que no primeiro cluster agrupa as UF’s que possuem maior número de características semelhantes.

Análise de Componentes Principais

Tanto o Clustering como o PCA buscam simplificar os dados por meio de um pequeno número de resumos, mas seus mecanismos são diferentes (JAMES, G. et al (2021)):

pca.out <- prcomp(df)
pca.out
## Standard deviations (1, .., p=8):
## [1] 2.4820557 0.9541962 0.6934733 0.5582487 0.2691444 0.2035887 0.1214480
## [8] 0.0878942
## 
## Rotation (n x k) = (8 x 8):
##                                                    PC1         PC2         PC3
## Extrativa Mineral                            0.2178664  0.82883181  0.21454871
## Indústria de Transformação                   0.3485567 -0.39023146 -0.04259053
## Servicos Industriais de Utilidade Pública    0.3893603 -0.06734562 -0.03201879
## Construção Civil                             0.3947268  0.01906296  0.19263839
## Comércio                                     0.3947332 -0.16502254 -0.04234302
## Serviços                                     0.3877100 -0.21541957  0.13933442
## Administração Pública                        0.3555799  0.12730790  0.36590466
## Agropecuária, Extração Vegetal, Caça e Pesca 0.3017639  0.25693011 -0.87116411
##                                                       PC4         PC5
## Extrativa Mineral                             0.436099492 -0.06845470
## Indústria de Transformação                    0.565801597 -0.05030240
## Servicos Industriais de Utilidade Pública    -0.123616277 -0.86528928
## Construção Civil                              0.005521717  0.37450966
## Comércio                                      0.134479742  0.18909616
## Serviços                                     -0.026945707  0.20345259
## Administração Pública                        -0.645702854  0.06368372
## Agropecuária, Extração Vegetal, Caça e Pesca -0.196548378  0.15031520
##                                                       PC6         PC7
## Extrativa Mineral                             0.006120416 -0.15695217
## Indústria de Transformação                    0.515447575 -0.01909411
## Servicos Industriais de Utilidade Pública    -0.219172721  0.16615462
## Construção Civil                             -0.279582200  0.75374126
## Comércio                                      0.088996906 -0.09113896
## Serviços                                     -0.569249480 -0.59343794
## Administração Pública                         0.523354859 -0.13491658
## Agropecuária, Extração Vegetal, Caça e Pesca  0.046986385 -0.02430663
##                                                       PC8
## Extrativa Mineral                             0.000799052
## Indústria de Transformação                    0.368376371
## Servicos Industriais de Utilidade Pública    -0.056456934
## Construção Civil                              0.141907648
## Comércio                                     -0.863186766
## Serviços                                      0.255985818
## Administração Pública                         0.101876593
## Agropecuária, Extração Vegetal, Caça e Pesca  0.141329659
# Ver componentes 
names(pca.out)
## [1] "sdev"     "rotation" "center"   "scale"    "x"
# Desvio padrão
pca.out$sdev
## [1] 2.4820557 0.9541962 0.6934733 0.5582487 0.2691444 0.2035887 0.1214480
## [8] 0.0878942

A variância explicada por cada componente principal é obtida elevando ao quadrado:

# 
pr.var=pca.out$sdev^2
pr.var
## [1] 6.16060068 0.91049030 0.48090529 0.31164165 0.07243871 0.04144837 0.01474961
## [8] 0.00772539

Para calcular a proporção da variância explicada por cada componente principal é dividido a variância explicada por cada componente principal pela variância total explicada por todos os oito componentes principais:

#
pve=pr.var/sum(pr.var)
pve
## [1] 0.7700750852 0.1138112876 0.0601131607 0.0389552063 0.0090548392
## [6] 0.0051810465 0.0018437008 0.0009656737

Observamos que o primeiro componente principal explica 77% da variância dos dados, o próximo componente principal explica 11,38% da variância e assim por diante.

plot(pve, xlab="Principal Component", ylab="Proportion of Variance Explained", ylim=c(0,1), type='b')

plot(cumsum(pve), xlab="Principal Component", ylab = " Cumulative Proportion of Variance Explained", ylim=c(0,1), type='b')

O gráfico biplot exibe todas as observações do conjunto de dados em um plano formado pelos dois primeiros componentes principais. As setas indicam os vetores que representam a carga de cada variável nos dois principais componentes principais. Pontos próximos possuem semelhança nas variáveis analisadas.

Pontos de observação: As observações são representadas como pontos no gráfico biplot.A posição desses pontos no espaço de menor dimensão representa a relação entre as observações com base nas componentes principais. Observações próximas no gráfico são consideradas semelhantes em termos de sua composição em variáveis. As observações podem ser agrupadas em diferentes regiões, indicando diferentes clusters ou padrões nos dados. A dispersão das UF’s no plano PCA é bem semelhante ao visto na figura que indica os clusters. Pela direção dos vetores todos os setores possuem relação entre sí, entretanto, o setor que mais se diferencia dos demais é Extrativa Mineral.

# Biplot com factoextra
fviz_pca_biplot(pca.out, 
                label="all", 
                labelsize = 3, 
                pointsize = 1,) +
   xlim(-5, 5) + ylim (-3, 3)
## Warning: Removed 2 rows containing missing values (`geom_point()`).
## Warning: Removed 2 rows containing missing values (`geom_text()`).

Conclusão

Neste notebook, foi realizada uma análise de \(clusters\) dos vínculos empregatícios das Unidades Federativas (UFs) do Brasil por setor. Foi utilizado o método de clustering \(k\)-means e a análise de componentes principais (PCA) para obter percepções sobre a concentração setorial do mercado de trabalho e à similaridade entre as UFs. Observamos que o dendograma gerado a partir da análise de clustering mostrou a formação de grupos de UF’s com características semelhantes em termos de vínculos empregatícios por setor. Os estados do sul do país formaram um grupo com características semelhantes, enquanto os estados do Ceará e Pernambuco, Mato Grosso e Mato Grosso do Sul também apresentaram semelhanças devido à sua localização geográfica e características econômicas. Foi possível identificar outras semelhanças entre vários estados.

A partir do método \(k\)-means com partição das UFs em clusters, determinamos que o número ótimo de clusters foi igual a 3. Realizamos também a análise de componentes principais (PCA) para reduzir a dimensionalidade dos dados e identificar os principais componentes que explicam a variabilidade dos vínculos empregatícios por setor. O primeiro componente principal explicou a maior parte da variância dos dados, seguido pelo segundo componente.

No gráfico biplot de PCA, observamos a distribuição das UFs no plano formado pelos dois primeiros componentes principais. As setas indicaram que relação entre as variáveis são bem relacionadas, com apenas o setor Extrativo Mineral com maior diferença dos demais, mas ainda assim, no mesmo sentido. Verificamos que os posicionamentos das UFs no gráfico tinham características semelhantes com o posicionamento visto no agrupamento de cluster pelo \(k\)-means, em termos de seus vínculos empregatícios por setor.

Por fim, esta análise nos permitiu identificar agrupamentos setoriais entre as UFs do Brasil e compreender a concentração setorial do mercado de trabalho em diferentes regiões.

Referências

James, G.; Witten, D., Hastie, T., Tibshirani, R. (2021). An Introduction to Statistical Learning: with Applications in R. Second Edition. Springer.

_______. (2013). An Introduction to Statistical Learning: with Applications in R . Springer.

Catela, Eva Yamila da Silva; Porcile, Gabriel.(2013). Heterogeneidade estrutural na produtividade das firmas brasileiras. IPEA. Textos para Discussão CEPAL-IPEA, 55.