Aplicando k-Means em famílias do CadÚnico usando o RStudio no GovData

Aplicando k-Means em famílias do CadÚnico usando RStudio no GovData

Resumo

Neste tutorial, será exemplificado como fazer uso da plataforma GovData, através da ferramenta RStudio e da linguagem R a fim de acessar os dados do Hadoop via Hive.

Acessando o RStudio

O primeiro passo é acessar o link do RStudio:

https://rs.govdata.gov.br/

Em seguida, digite o seu CPF e a senha para fazer login na ferramenta. Aparecerá a tela abaixo:

Criando um script R

Agora é hora de criar o script em linguagem R. Para tal, acesse o menu File > New File > R Script. Uma janela em branco na área central do RStudio será aberta:

Conectando ao Hadoop do GovData

Para acessar os dados a que você tem direito no GovData no RStudio, é preciso importar o pacote RODBC e em seguida executar a função connectGovData(). Cole os trechos abaixo no script e execute-os passo a passo (ex: através do Control+Enter):

# instalar pacote R
library(RODBC)

# criar conexão com o GovData
con <- connectGovData()

Em seguida, cole o trecho abaixo para verificar a quais bases de dados do GovData você possui direito de acesso no Hadoop:

# obter lista de bancos de dados disponíveis
dados <- sqlQuery(con, "SHOW DATABASES");
dados

Conhecendo os dados no Hadoop via HUE

Em outra aba do navegador web, acesse a ferramenta HUE (Hadoop User Experience) do GovData através do link a seguir:

http://hu.govdata.gov.br/

Faça o login (com as mesmas credenciais usadas no RStudio) e entre na tela de edição do Hive.

Comece explorando quais são as tabelas, colunas e tipos de dados disponíveis para os dados de interesse. No exemplo em questão, faremos uso dos dados de famílias do Cadastro Único.

Uma sugestão é executar instruções SQL para começar a entender o conteúdo dos dados. Vide:

Montando a instrução SQL para a extração dos dados

Nesse exemplo, escolhemos alguns atributos existentes na tabela de famílias do CadÚnico a serem usadas posteriormente no algoritmo de aprendizagem de máquina em linguagem R. A instrução SQL será a seguinte:

SELECT
  qtd_pessoa_domicilio, qtd_familia_domicilio, vlr_renda_media,
  tip_local_domicilio, tip_especie_domicilio,
  idt_familia_indigena, idt_familia_quilombola
FROM cadunico.familia;

Acessando os dados selecionados no RStudio

De volta à ferramenta RStudio, insira a instrução SQL criada anteriormente em uma função sqlQuery(), conforme trecho a seguir:

# executar consulta no GovData para extrair dados selecionados
dados <- sqlQuery(con, "
SELECT
  qtd_pessoa_domicilio, qtd_familia_domicilio, vlr_renda_media,
  tip_local_domicilio, tip_especie_domicilio,
  idt_familia_indigena, idt_familia_quilombola
FROM cadunico.familia;
");

Dessa forma, será criado um data frame no R com o conteúdo tabular da instrução SQL.

Adicionalmente, será preciso indicar no R os atributos que devem ser lidos como categóricos (e não numéricos). Para tal, insira e execute o trecho abaixo:

# indicar quais atributos são categóricos
dados$familia.tip_local_domicilio =
  as.factor(dados$familia.tip_local_domicilio)

Analisando os dados extraídos

Uma boa prática em linguagem R é analisar previamente os dados a serem usados nos algoritmos de estatística e aprendizagem de máquina. Para tal, insira as linhas a seguir e execute-as inidividualmente:

# analisar dados extraídos
class(dados)
str(dados)
summary(dados)
head(dados)

Tratando os valores ausentes

Faz parte da tarefa de ciência de dados tratar as situações em que os dados possuem valores ausentes, os quais interfeririam ou mesmo impediriam a execução de algoritmos.

No caso em questão, vamos remover as linhas que apresentarem valores faltantes através da instrução abaixo:

# remover nulos
dados2 <- na.omit(dados)
summary(dados2)
head(dados2)

Com isso, será criado um segundo data frame, mas dessa vez não contendo valores nulos (NA’s).

Aplicando o algoritmo k-Means

O algoritmo k-Means faz parte da técnica de agrupamento (clustering) em mineração de dados. Trata-se de um aprendizado não-supervisionado (pois não conhecemos previamente amostras do que é considerado “correto”).

No exemplo em questão, estamos interessados simplesmente que a máquina forme grupos de famílias com base nos atributos que selecionamos. Quais regras serão usadas para a composição desses grupos é justamente a tarefa do algoritmo k-Means. O único parâmetro que definimos é o k, representando a quantidade de grupos (ou clusters) a serem gerados.

Escolheremos formar 3 grupos distintos de famílias no Cadastro Único.

Pois bem, a fim de gerar tais grupos no RStudio, basta executar os trechos abaixo:

# gerar clusters
set.seed(42)
clusters <- kmeans(dados2, centers=3)
str(clusters)

Será criado um objeto, de nome clusters, contendo o resultado da execução do algoritmo. Em especial, para cada registro presente no data frame de entrada, será associado um número (de 1 a 3) indicando a qual dos 3 grupos essa família do CadÚnico pertence.

Plotando os resultados

Por fim, podemos gerar um gráfico de dispersão para visualizar como o algoritmo k-Means agrupou as famílias do Cadastro Único. Para tal, execute o trecho abaixo:

# exibir gráficos
plot(dados2[,c(1,3)], col=clusters$cluster)

O gráfico gerado, Renda Média Familiar (em R$) por Qtd. Pessoas no Domicílio, ilustra, através de cores, os 3 grupos identificados pelo algoritmo de aprendizagem de máquina.

Simples, não?! :smiley:

6 Curtidas

Olá, Rodrigo!

Interessante a sua análise. Parabéns pelo tutorial! Seria interessante observar as características comuns aos indivíduos dos grupos formados para ver se os agrupamentos fazem mesmo sentido.

Obs.: já te dei permissão para postar mais imagens. Se quiser, poderá editar a postagem para incluí-las.

1 Curtida

Parabéns pelo tutorial!
No intuito de enriquecer, você pode testar o “método do cotovelo” para validar se centers=3 é a quantidade de clusters próxima do ideal.

Você pode utilizar o broom (glance+augment) e o purrr para simular. Segue pequeno exemplo inspirado no próprio vignette do broom (https://cran.r-project.org/web/packages/broom/vignettes/kmeans.html)

PS: Não testei pois não tenho acesso ao GovData

library(broom)
library(tidyverse)
set.seed(42)
# clusters <- kmeans(dados2, centers=3)
# str(clusters)

# calcula clusters de 1 a 15 centroids
clusterss <- data.frame(centers = 1:15) %>% 
  mutate(clusters = map(centers, ~kmeans(dados2, .x)),
         stats = map(clusters, glance), # extrai as estatísticas de cada cluster
         clusters_points = map(clusters, augment, dados2))

cluster_points <- clusterss %>% 
  unnest(clusters_points)

stats <- clusterss %>% 
  unnest(stats)

# plot dos dados coloridos por cluster, facetado para diferentes centros
ggplot(cluster_points, aes(x=familia.qtd_pessoa_domicilio, y=familia.vlr_renda_media)) +
  geom_point(aes(color = .cluster)) + 
  facet_wrap(~ centers)

# "Método do cotovelo"
ggplot(stats, aes(centers, tot.withinss)) +
  geom_line()

# exibir gráficos
# plot(dados2[,c(1,3)], col=clusters$cluster)
1 Curtida

Muito interessante, Saulo! Não conhecia esse método do cotovelo.

Eis os resultados obtidos com os códigos que você sugeriu:


1 Curtida

@hjort, você pode editar a sua postagem original para incluir as imagens. Será muito mais útil para quem for ler que colocá-las em uma postagem separada.

Oi Herrmann. Nao encontrei funcionalidade para editar o post…

Coloquei o post como wiki. Agora você poderá editá-lo.

Deu certo, obrigado!