Transformação de dados

Abaixo estão alguns scripts do vídeo sobre transformações de dados. Procue observar o script, tentar entendo do que se trata e executar os blocos de código para ver o resultado.

library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.0     ✔ tibble    3.2.1
## ✔ lubridate 1.9.3     ✔ tidyr     1.3.1
## ✔ purrr     1.0.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(dados)



#Gráfico de histograma para uma variável que não precisa ser transformada
velho_fiel %>%
  ggplot() +
  geom_histogram(aes(x=erupcoes), color="white") +
  xlab("Tempo de erupção") +
  ylab("contagem")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

#Distribuição da população estimada dos municípios brasileiros. A variável não foi transformada
dados_socio_economicos %>%
  ggplot() +
  geom_histogram(aes(x=populacao_estimada))+
  scale_x_continuous(labels=function(x) format(x,decimal.mark=",", big.mark = ".", scientific = FALSE))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

mean(dados_socio_economicos$populacao_estimada)
## [1] 36710.54
median(dados_socio_economicos$populacao_estimada)
## [1] 11513
#Distribuição do log10 da população estimada dos municípios brasileiros.
#O eixo x apresenta valores em log10
dados_socio_economicos %>%
  ggplot() +
  geom_histogram(aes(x= log10(populacao_estimada)), color= "white")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

log(max(dados_socio_economicos$populacao_estimada))
## [1] 16.29773
log(min(dados_socio_economicos$populacao_estimada))
## [1] 6.706862
mean(log(dados_socio_economicos$populacao_estimada))
## [1] 9.466912
median(log(dados_socio_economicos$populacao_estimada))
## [1] 9.351232
#No gráfico a escala do eixo x está em log10. Internamente o R calcula o log10 dos valores, mas exibe os valores originais na escola logaritimica
options(scipen = 999)

dados_socio_economicos %>%
  ggplot() +
  geom_histogram(aes(x= populacao_estimada), color= "white") +
  scale_x_log10(labels=function(x) format(x,decimal.mark=",", big.mark = ".", scientific = FALSE))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Agora é a sua vez

Repita as práticas de transformação feitas sobre a tabela dados_socio_economicos, agora analisando a variável renda per capita

#Distribuição da população estimada dos municípios brasileiros. A variável não foi transformada
#No gráfico a escala do eixo x está em log10. Internamente o R calcula o log10 dos valores, mas exibe os valores originais na escala logaritimica

dados_socio_economicos %>%
  ggplot() +
  geom_histogram(aes(x= pib_per_capita), color= "white") +
  scale_x_log10(labels=function(x) format(x,decimal.mark=",", big.mark = ".", scientific = FALSE))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

#Box-plot

Uma aplicação interessante de transformação de dados é a possibilidade de visualizar a melhor a distribuição dos dados num gráfico box-plot. Vamos começar executando o bloco de código abaixo para perceber como é inviável fazer boas análises de box-plot para a variável populacao_estimada sem a transformação de escala.

#Gráfico sem uso de escala logaritimica
dados_socio_economicos %>%
  ggplot() +
  geom_boxplot(aes(x=uf, y= populacao_estimada)) #obervar que para gráficos box_plot usamos a geometria geom_box_plot.

Veja agora a mesma análise exploratória, agora usando a escala do eixo Y transformada para logarítimo da base 10

dados_socio_economicos %>%
  ggplot() +
  geom_boxplot(aes(x=uf, y= populacao_estimada)) + #obervar que para gráficos box_plot usamos a geometria geom_box_plot. 
  scale_y_log10(labels=function(x) format(x,decimal.mark=",", big.mark = ".", scientific = FALSE)) # a escala dos valores do eixo y é logaritmo da base 10

Agora é a sua vez

Repita as práticas de gráfico de box-plot feitas sobre a tabela dados_socio_economicos, agora analisando a variável pib per capita

#Gráfico sem uso de escala logaritimica

Veja agora a mesma análise exploratória, agora usando a escala do eixo Y transformada para logarítimo da base 10

#Gráfico com uso de escala logarítimica

dados_socio_economicos %>%
  filter(uf!="DF") %>%
  ggplot() +
  geom_boxplot(aes(x=uf, y=pib_per_capita)) + #obervar que para gráficos box_plot usamos a geometria geom_box_plot. 
  scale_y_log10(labels=function(x) format(x,decimal.mark=",", big.mark = ".", scientific = FALSE)) # a escala dos valores do eixo y é logaritmo da base 10

Correlação

Como quase toda análise de correlação é precedida pela construção de um gráfico de dispersão, veja abaixo como esse gráfico pode ser construído com ggplot.

dados_socio_economicos %>%
  ggplot()+
  geom_point(aes(x= populacao_estimada, y = pib_total_em_r_mi )) +
  theme(panel.grid = element_blank())

Já dá para notar que quanto maior a população estimada, maior o PIB. Porém observa-se também que o problema da distribuição desigual da população não permite perceber melhor a associação entre as duas variáveis ára populações menores. Vamos então usar a escala transformada para logaritimo base 10 para ambas as variáveis.

dados_socio_economicos %>%
  ggplot()+
  geom_point(aes(x= populacao_estimada, y = pib_total_em_r_mi )) +
  scale_x_log10() +
  scale_y_log10() +
  theme_light()

Agora sim, fica bem mais claro que quanto maior logaritimo da população estimada maior o logaritimo do PIB total, por consequência visualmente já temos uma pista que há possivelmente uma correlação muito forte entre população estimada e PIB total.

No bloco abaixo, usamos a função cor para calcular a correlação entre as duas variáveis

cor(dados_socio_economicos$populacao_estimada, dados_socio_economicos$pib_total_em_r_mi)
## [1] 0.9621635
cor.test(dados_socio_economicos$populacao_estimada, dados_socio_economicos$pib_total_em_r_mi)
## 
##  Pearson's product-moment correlation
## 
## data:  dados_socio_economicos$populacao_estimada and dados_socio_economicos$pib_total_em_r_mi
## t = 263.47, df = 5567, p-value < 0.00000000000000022
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.9601630 0.9640653
## sample estimates:
##       cor 
## 0.9621635

Agora é a sua vez

Repita as práticas de gráfico de dispersão feitas sobre a tabela dados_socio_economicos, agora analisando a correlação entre as variáveis população e PIB per capita

dados_socio_economicos %>%
  ggplot()+
  geom_point(aes(x= populacao_estimada, y = pib_per_capita )) +
  scale_x_log10() +
  scale_y_log10() +
  theme_light()

cor(dados_socio_economicos$populacao_estimada, dados_socio_economicos$pib_per_capita)
## [1] 0.07846359

Uma análise exploratória pode envolver a necessidade de analisar possíveis correlações entre as diversas variáveis quantitativas de uma base de dados. Veja como podemos fazer essa análise de forma ágil usando recursos visuais.

dados_numericos<-  
  dados_socio_economicos %>%
  select(!c(uf:nome_do_municipio, atividade_economica)) #usando a função select, seleciona-se apenas os dados das colunas numéricas relevantes para análises de correlação
  
library(DataExplorer) #a função plot_correlation abaixo foi implementada na biblioteca DataExplorer
plot_correlation(dados_numericos)

Agora é a sua vez

Analise o gráfico gerado acima e escreva logo abaixo as suas conclusões sobre as correlações entre as variáveis numéricas de dados_socio_economicos

Associação chi-quadrado

Usando a função chisq.test é possível fazer o cálculo do teste chi-quadrado. Com os dados de resíduos padronizados, podemos ver qual combinação entre variáveis numa eventual associação entre duas variáveis.

glimpse(dados::questionario)
## Rows: 21,483
## Columns: 9
## $ ano          <int> 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 200…
## $ estado_civil <fct> Nunca casou, Divorciado(a), Viúvo(a), Nunca casou, Divorc…
## $ idade        <int> 26, 48, 67, 39, 25, 25, 36, 44, 44, 47, 53, 52, 52, 51, 5…
## $ raca         <fct> Branca, Branca, Branca, Branca, Branca, Branca, Branca, B…
## $ renda        <fct> US$ 8000 - 9999, US$ 8000 - 9999, Não se aplica, Não se a…
## $ partido      <fct> "Independente, inclinação republicana", "Não fortemente r…
## $ religiao     <fct> Protestante, Protestante, Protestante, Cristã ortodoxa, N…
## $ denominacao  <fct> "Batistas do sul", "Batista, não sabe qual", "Sem denomin…
## $ horas_tv     <int> 12, NA, 2, 4, 1, NA, 3, NA, 0, 3, 2, NA, 1, NA, 1, 7, NA,…
questionario %>%
  filter(partido != "Independente")
## # A tibble: 17,364 × 9
##      ano estado_civil  idade raca   renda  partido religiao denominacao horas_tv
##    <int> <fct>         <int> <fct>  <fct>  <fct>   <fct>    <fct>          <int>
##  1  2000 Nunca casou      26 Branca US$ 8… Indepe… Protest… Batistas d…       12
##  2  2000 Divorciado(a)    48 Branca US$ 8… Não fo… Protest… Batista, n…       NA
##  3  2000 Nunca casou      39 Branca Não s… Indepe… Cristã … Não se apl…        4
##  4  2000 Divorciado(a)    25 Branca Não s… Não fo… Nenhuma  Não se apl…        1
##  5  2000 Casado(a)        25 Branca US$ 2… Fortem… Protest… Batistas d…       NA
##  6  2000 Nunca casou      36 Branca US$ 2… Não fo… Cristã   Não se apl…        3
##  7  2000 Divorciado(a)    44 Branca US$ 7… Indepe… Protest… Sínodo lut…       NA
##  8  2000 Casado(a)        44 Branca US$ 2… Não fo… Protest… Outra              0
##  9  2000 Casado(a)        47 Branca US$ 2… Fortem… Protest… Batistas d…        3
## 10  2000 Casado(a)        53 Branca US$ 2… Não fo… Protest… Outra              2
## # ℹ 17,354 more rows
rep_democratas<-
  questionario %>%
  filter(!(partido %in% c("Sem resposta","Não sabe","Outro partido","Independente")))

#testando se há associação entre raça e partido nos EUA
teste<-chisq.test(rep_democratas$raca, rep_democratas$partido)

teste$stdres #O dado
##                    rep_democratas$partido
## rep_democratas$raca Fortemente republicano Não fortemente repubicano
##              Outra               -8.204676                 -5.887937
##              Negra              -18.573501                -20.993411
##              Branca              21.089701                 21.691116
##                    rep_democratas$partido
## rep_democratas$raca Independente, inclinação republicana
##              Outra                             -1.914778
##              Negra                            -12.678418
##              Branca                            12.059434
##                    rep_democratas$partido
## rep_democratas$raca Independente, inclinação democrata Não fortemente democrata
##              Outra                            7.452441                10.585994
##              Negra                           -1.889456                 9.299014
##              Branca                          -3.108063               -14.665566
##                    rep_democratas$partido
## rep_democratas$raca Fortemente democrata
##              Outra             -3.332188
##              Negra             37.489495
##              Branca           -29.957501

Observamos que há grande associação entre negros e classes relacionadas ao partido democrata e entre brancos e classes relacionadas ao partido republicano

Que tal mostrar esse achado num gráfico bem elaborado?

#Gráfico evidenciando o achado

library(viridis)
## Carregando pacotes exigidos: viridisLite
questionario %>%
  filter(!(partido %in% c("Sem resposta","Não sabe","Outro partido","Independente"))) %>%
  ggplot() +
  geom_bar(aes(y= raca, fill =partido), position="fill") +
  scale_fill_viridis(discrete = TRUE)+
  theme_light()

questionario %>%
  filter(!(partido %in% c("Sem resposta","Não sabe","Outro partido","Independente"))) %>%
  ggplot() +
  geom_bar(aes(y= raca, fill =partido), position="fill") +
  scale_fill_viridis(discrete = TRUE)+
  theme_light()

Agora é a sua vez

Repita as práticas de chi-quadrado feitas sobre a tabela questionario, agora analisando a possível associação entre as variáveis raça e religião

top_5_religiao<-
(questionario %>%
  group_by(religiao) %>%
  summarise(quantidade = n()) %>%
  slice_max(quantidade, n=5))$religiao

top_5_religiao<-
questionario %>%
  group_by(religiao) %>%
  summarise(quantidade = n()) %>%
  slice_max(quantidade, n=5) %>%
  select(religiao)

religiao_filtro<-
  questionario %>%
  filter(religiao %in% top_5_religiao$religiao)
  
  
teste<-chisq.test(religiao_filtro$raca, religiao_filtro$religiao)

teste$stdres #O dado
##                     religiao_filtro$religiao
## religiao_filtro$raca     Cristã    Nenhuma   Judaísmo   Católica Protestante
##               Outra    2.357940   2.043836  -4.498174  28.659727  -25.993574
##               Negra    4.392467  -6.910810  -6.788532 -24.782540   26.950211
##               Branca  -5.240528   4.469683   8.659574   2.032031   -5.604131
#Gráfico evidenciando o achado de associação entre raça e religião nos EUA
religiao_filtro %>%
  ggplot() +
  geom_bar(aes(y= raca, fill =religiao), position="fill") +
  scale_fill_viridis(discrete = TRUE)+
  theme_light()

religiao_filtro %>%
  ggplot() +
  geom_bar(aes(y= raca, fill =religiao)) +
  scale_fill_viridis(discrete = TRUE)+
  theme_light()