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
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
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()