PROF. GUILHERME AUGUSTO VELOSO
PRIMEIRO SEMESTRE DE 2023
Até agora vimos como organizar e resumir informações pertinentes a uma única variável.
Frequentemente estamos interessados em analisar o comportamento conjunto de duas ou mais variáveis. Vocês perceberam que os dados aparecem em um formato retangular, usualmente com as colunas indicando as variáveis e as linhas os indivíduos (ou elementos).
O principal objetivo das análises nessa situação é explorar relações (similaridades) entre as variáveis. Como no caso de apenas uma variável, a distribuição conjunta das frequências será um instrumento poderoso para a compreensão do comportamento dos dados.
Inicialmente, iremos focar no caso de duas variáveis apenas e, nesse contexto, temos as seguintes situações:
Aqui estamos interessados em uma análise conjunta de duas variáveis qualitativas. Veremos como construir tabelas de frequência cruzada, gráficos e o cálculo de índices de associação. Para isso, vamos ler os dados de alteração alimentar durante a pandemia:
# Carregando o universo tidyverse
library("tidyverse")
## Warning: package 'tidyverse' was built under R version 4.2.3
## Warning: package 'readr' was built under R version 4.2.3
## Warning: package 'forcats' was built under R version 4.2.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.0 ✔ readr 2.1.4
## ✔ forcats 1.0.0 ✔ stringr 1.5.0
## ✔ ggplot2 3.4.1 ✔ tibble 3.1.8
## ✔ lubridate 1.9.2 ✔ tidyr 1.3.0
## ✔ purrr 1.0.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the ]8;;http://conflicted.r-lib.org/conflicted package]8;; to force all conflicts to become errors
# Carregando a biblioteca readr
library("readr")
# Lendo a base de dados no formato .csv
dados = read_csv("Dados1.csv")
## Rows: 2210 Columns: 7
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (4): Genero, Regiao, Renda_familiar, Alteracao_Pandemia
## dbl (3): Idade, Peso, Altura
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# Filtrando apenas os generos feminino e masculino (os demais gêneros possuem pouquíssimos valores)
dados = dados%>%filter(Genero =="Feminino"|Genero=="Masculino")
Em sala, vimos como fazer 4 tipos de tabelas para dados bivariados qualitativos:
No R, essas tabelas podem ser construídas com o
pacote expss a partir das funções
cross_cases, cross_tpct,
cross_rpct e cross_cpct, respectivamente. Para
exemplificar, vamos investigar o comportamento conjunto entre
gênero e alteração alimentar durante a pandemia:
library(expss)
## Warning: package 'expss' was built under R version 4.2.3
## Carregando pacotes exigidos: maditr
## Warning: package 'maditr' was built under R version 4.2.3
##
## To aggregate several columns with one summary: take(mtcars, mpg, hp, fun = mean, by = am)
##
## Attaching package: 'maditr'
## The following objects are masked from 'package:dplyr':
##
## between, coalesce, first, last
## The following object is masked from 'package:purrr':
##
## transpose
## The following object is masked from 'package:readr':
##
## cols
##
## Attaching package: 'expss'
## The following objects are masked from 'package:stringr':
##
## fixed, regex
## The following objects are masked from 'package:dplyr':
##
## compute, contains, na_if, recode, vars, where
## The following objects are masked from 'package:purrr':
##
## keep, modify, modify_if, when
## The following objects are masked from 'package:tidyr':
##
## contains, nest
## The following object is masked from 'package:ggplot2':
##
## vars
library(dplyr)
#Criando uma tabela de frequência cruzada com as frequências observadas
Tabela1 = dados %>% cross_cases(Genero,Alteracao_Pandemia)
Tabela1
| Alteracao_Pandemia | ||
|---|---|---|
| Não | Sim | |
| Genero | ||
| Feminino | 389 | 1244 |
| Masculino | 212 | 354 |
| #Total cases | 601 | 1598 |
#Criando uma tabela de frequência relativa de acordo com o total geral
Tabela2 = dados %>% cross_tpct(Genero,Alteracao_Pandemia,total_row_position = "none")
Tabela2
| Alteracao_Pandemia | ||
|---|---|---|
| Não | Sim | |
| Genero | ||
| Feminino | 17.7 | 56.6 |
| Masculino | 9.6 | 16.1 |
#Criando uma tabela de frequência relativa de acordo com o total linha
Tabela3 = dados %>% cross_rpct(Genero,Alteracao_Pandemia,total_row_position = "none")
Tabela3
| Alteracao_Pandemia | ||
|---|---|---|
| Não | Sim | |
| Genero | ||
| Feminino | 23.8 | 76.2 |
| Masculino | 37.5 | 62.5 |
#Criando uma tabela de frequência relativa de acordo com o total coluna
Tabela4 = dados %>% cross_cpct(Genero,Alteracao_Pandemia,total_row_position = "none")
Tabela4
| Alteracao_Pandemia | ||
|---|---|---|
| Não | Sim | |
| Genero | ||
| Feminino | 64.7 | 77.8 |
| Masculino | 35.3 | 22.2 |
Construa as mesmas tabelas acima para começarmos a investigar a associação entre região e alteração nutricional durante a pandemia.
Para investigar visualmente o comportamento conjunto entre duas variáveis, abordaremos os seguintes gráficos:
Todos eles serão construídos com o pacote ggplot2. Para
exemplificar, utilizaremos novamente as variáveis genero e alteração
alimentar durante a pandemia.
Para fazer esse gráfico, basta utilizar a função
geom_bar(position="fill"), conforme os comandos abaixo:
library(ggplot2)
# fill é a variável que será preenchida nas barras
# scale_fill_discrete para colocar nome na legenda
ggplot(dados,mapping = aes(x = Genero, fill=Alteracao_Pandemia)) +
geom_bar(position = "fill") + theme_bw() + scale_y_continuous(labels = scales::percent_format()) + xlab("Gênero") + ylab("Frequência Relativa (%)")+scale_fill_discrete(name = "Alteração Alimentar")
Invertendo
ggplot(dados,mapping = aes(x = Alteracao_Pandemia, fill=Genero)) +
geom_bar(position = "fill") + theme_bw() + scale_y_continuous(labels = scales::percent_format()) + xlab("Alteração Alimentar") + ylab("Frequência Relativa (%)")+scale_fill_discrete(name = "Gênero")
Construa o gráfico de barras empilhado relativo para investigar o comportamento conjunto entre Regiao e Alteração Alimentar durante a Pandemia.
O gráfico mosaico é uma adaptação do gráfico anterior
trazendo a informação da frequência relativa da variável que está no
eixo x. Para construir esse gráfico no R,
precisamos instalar o pacote ggmosaic e utilizar a sua
função geom_mosaic. Seguem os comandos:
# install.packages(ggmosaic)
library(ggmosaic)
## Warning: package 'ggmosaic' was built under R version 4.2.3
# Estrutura: geom_mosaic(x=product(variavel fill, variavel x))
ggplot(dados) +
geom_mosaic(aes(x=product(Alteracao_Pandemia,Genero),fill=Alteracao_Pandemia)) + theme_bw() + scale_y_continuous(labels = scales::percent_format()) + xlab("Gênero") + ylab("Frequência Relativa (%)")+scale_fill_discrete(name = "Alteração Alimentar")
## Warning: `unite_()` was deprecated in tidyr 1.2.0.
## ℹ Please use `unite()` instead.
## ℹ The deprecated feature was likely used in the ggmosaic package.
## Please report the issue at <]8;;https://github.com/haleyjeppson/ggmosaichttps://github.com/haleyjeppson/ggmosaic]8;;>.
Invertendo:
# Estrutura: geom_mosaic(x=product(variavel fill, variavel x))
ggplot(dados) +
geom_mosaic(aes(x=product(Genero,Alteracao_Pandemia),fill=Genero)) + theme_bw() + scale_y_continuous(labels = scales::percent_format()) + xlab("Alteração Alimentar") + ylab("Frequência Relativa (%)")+scale_fill_discrete(name = "Gênero")
Construa o gráfico mosaico relativo para investigar o comportamento conjunto entre Regiao e Alteração Alimentar durante a Pandemia.
Um dos principais objetivos de se construir uma distribuição conjunta de duas variáveis qualitativas é descrever a associação entre elas. Queremos conhecer o grau de dependência entre elas, de modo que possamos prever melhor o resultado de uma delas quando conhecermos a realização da outra.
Em sala, vimos a construção do Qui-Quadrado de Pearson, que é utilizado para o cálculo dos coeficientes de Contingência e Crámer, interpretáveis e capazes de medir a associação entre as variáveis.
Para exemplificar o cálculo dessas quantidades, considere as variáveis Genero e Alteração nutricional durante a pandemia. O cálculo do Qui-Quadrado de Pearson é feito com os comandos:
# table cria uma tabela
# chisq.test calcula o qui-quadrado
Qui = chisq.test(table(dados$Genero, dados$Alteracao_Pandemia),correct = FALSE)$statistic
Qui
## X-squared
## 39.34269
Já os coeficientes de contingência e de Crámer são calculados manualmente com os comandos:
# Contingência
C = sqrt(Qui/(Qui+2199))
C
## X-squared
## 0.1325772
# Cramer
V = sqrt(Qui/(2199*(min(2,2)-1)))
V
## X-squared
## 0.1337579
Ambos os índices apontam para uma associação fraca entre as variáveis
Calcule o Qui-Quadrado de Pearson e os coeficientes de Contingência e Crámer para investigar o comportamento conjunto entre Regiao e Alteração Alimentar durante a Pandemia.
Nesta segunda parte da análise bivariada, consideramos a situação em que temos uma variável qualitativa e uma variável quantitativa. Quando temos uma variável qualitativa e outra quantitativa, analisamos o que acontece com a variável quantitativa dentro de cada categoria da variável qualitativa.
Continuamos com o objetivo de encontrar as possíveis relações ou associações entre as duas variáveis. Essas relações podem ser detectadas por meio de métodos gráficos, tabelas e medidas numéricas.
Consideraremos os dados de mortalidade por acidentes de
trânsito nos estados brasileiros no ano de 2019. A base de
dados está armazenada no arquivo Dados2.csv e contem as
seguintes variáveis:
Para ler os arquivos, utilize os seguintes comandos:
# Carregando o universo tidyverse
library("tidyverse")
# Carregando a biblioteca readr
library("readr")
# Lendo a base de dados no formato .csv
# Para corrigir problemas de acentuação, utilize o argumento locale = locale(encoding = "UTF-8")
dados = read_csv("Dados2.csv",locale = locale(encoding = "UTF-8"))
## Rows: 54 Columns: 4
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (2): Estado, Sexo
## dbl (2): Moto, Carro
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
Para ilustrar os métodos descritivos abaixo, será considerado o exemplo de avaliar conjuntamente o comportamento descritivo das variáveis Sexo e Moto.
Considera-se a construção de uma tabela pra variável quantitativa em cada categoria da variável qualitativa.Para a construção das faixas de classe pode ser utilizado a regra de Sturges pra cada tabela ou construir as tabelas com os mesmos pontos de corte.
No R, utilizamos o pacote fdth e as tabelas
podem ser feitas da seguinte maneira:
library(fdth)
## Warning: package 'fdth' was built under R version 4.2.3
##
## Attaching package: 'fdth'
## The following objects are masked from 'package:stats':
##
## sd, var
library(dplyr)
dados$Sexo = as.factor(dados$Sexo)
dados %>%
select(Sexo,Moto) %>% # o comando by especifica a variável categórica
fdt(breaks="Sturges",by="Sexo") %>%
summary()
## Feminino.Moto
## Class limits f rf rf(%) cf cf(%)
## [0.6738,1.072) 2 0.07 7.41 2 7.41
## [1.072,1.47) 8 0.30 29.63 10 37.04
## [1.47,1.868) 9 0.33 33.33 19 70.37
## [1.868,2.266) 2 0.07 7.41 21 77.78
## [2.266,2.664) 3 0.11 11.11 24 88.89
## [2.664,3.062) 3 0.11 11.11 27 100.00
##
## Masculino.Moto
## Class limits f rf rf(%) cf cf(%)
## [5.1873,9.2609) 8 0.30 29.63 8 29.63
## [9.2609,13.335) 5 0.19 18.52 13 48.15
## [13.335,17.408) 5 0.19 18.52 18 66.67
## [17.408,21.482) 8 0.30 29.63 26 96.30
## [21.482,25.556) 0 0.00 0.00 26 96.30
## [25.556,29.629) 1 0.04 3.70 27 100.00
Construa as mesmas tabelas acima para começarmos a investigar a associação entre sexo e carro.
Considera-se a construção de um gráfico da variável
quantitativa para cada categoria da variável qualitativa. O
gráfico mais utilizado para esse contexto é o boxplot
múltiplo. Por ser um gráfico muito simples, traz uma
visualização bastante eficiente, principalmente quando
existem muitas ca-tegorias na variável qualitativa. No R,
isso é feito com a função geom_boxplot, adaptando o
que já vimos anteriormente.
library(ggplot2)
ggplot(dados,mapping = aes(x = Sexo, y = Moto )) +
geom_boxplot() +
theme_bw()+
xlab("Sexo")+
ylab("Taxa de Mortalidade por 100 mil habitantes")
Para colorir, acrescente fill:
library(ggplot2)
ggplot(dados,mapping = aes(x = Sexo, y = Moto , fill=Sexo)) +
geom_boxplot() +
theme_bw()+
xlab("Sexo")+
ylab("Taxa de Mortalidade por 100 mil habitantes")+
theme(legend.position="none")
Para acrescentar o violino:
library(ggplot2)
ggplot(dados,mapping = aes(x = Sexo, y = Moto , fill=Sexo)) +
geom_violin()+
geom_boxplot(width=0.1) +
theme_bw()+
xlab("Sexo")+
ylab("Taxa de Mortalidade por 100 mil habitantes")+
theme(legend.position="none")
Construa o boxplot múltiplo para investigar a associação entre sexo e carro.
Em aulas anteriores, vimos as seguintes medidas-resumo:
Todas essas medidas podem ser calculadas para a variável
quantitativa dentro de cada categoria da variável qualitativa.
No R, basta adaptar o que fizemos anteriormente no cálculo
de medidas resumo acrescentando a função group_by
do pacote dplyr. Essa função informa pro
R que toda a análise subsequente será feita pra
cada categoria da variável informada no group_by.
Essa função pode receber mais de uma variável também. Seguem os comandos
abaixo para algumas medidas-resumo:
# Carregando o pacote moments
# CV é o coeficiente de variação
# n=n() calcula a frequencia de cada categoria
library("moments")
Resumo = dados %>% group_by(Sexo)%>%
summarise(n=n(),
Min = min(Moto),
Media = mean(Moto),
Q_1 = quantile(Moto, 0.25),
Mediana = median(Moto),
Q_3 = quantile(Moto, 0.75),
Max = max(Moto),
Desv_Pad = sd(Moto),
Var = var(Moto),
Assimetria = skewness(Moto),
CV = (Desv_Pad/Media)*100)
Construa as medidas resumo para as taxas de mortalidade envolvendo carros considerando os sexos masculino e feminino.
É conveniente poder contar com uma medida que quantifique o grau de dependência entre as variáveis. Convém observar que as variâncias podem ser usadas como insumos para construir essa medida. Sem usar a informação da variável categorizada, a variância calculada para a variável quantitativa para todos os dados mede a dispersão dos dados globalmente. Vimos em sala de aula a construção do R2, utilizado para quantificar essa associação. Esse índice pode ser calculado manualmente com os seguintes comandos:
# Variância global
Var = var(dados$Moto)
# Variância ponderada
Var_Barra = sum(Resumo$n*Resumo$Var)/sum(Resumo$n)
# R2
R2 = (1-Var_Barra/Var)*100
R2
## [1] 70.39009
Calcule o R2 para investigar a associação entre as variáveis sexo e carro.