INTRODUÇÃO À ESTATÍSTICA

SEMANA 6: ANÁLISE BIVARIADA: PARTES I E II

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:

  • As duas variáveis são qualitativas (Parte I);
  • Uma variável é qualitativa e a outra é quantitativa (Parte II);
  • As duas variáveis são quantitativas (Parte III).

1 Análise Bivariada (Parte I)

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

1.1 Tabelas

Em sala, vimos como fazer 4 tipos de tabelas para dados bivariados qualitativos:

  • Tabela de frequência absoluta cruzada
  • Tabela de frequência relativa cruzada considerando o total geral
  • Tabela de frequência relativa cruzada considerando o total linha
  • Tabela de frequência relativa cruzada considerando o total coluna

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

1.1.1 Exercício

Construa as mesmas tabelas acima para começarmos a investigar a associação entre região e alteração nutricional durante a pandemia.

1.2 Gráficos

Para investigar visualmente o comportamento conjunto entre duas variáveis, abordaremos os seguintes gráficos:

  • Gráfico de Barras Empilhadas Relativo.
  • Gráfico Mosaico.

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.

1.2.1 Gráfico de Barras Empilhadas Relativo

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

1.2.1.1 Exercício

Construa o gráfico de barras empilhado relativo para investigar o comportamento conjunto entre Regiao e Alteração Alimentar durante a Pandemia.

1.2.2 Gráfico Mosaico

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

1.2.2.1 Exercício

Construa o gráfico mosaico relativo para investigar o comportamento conjunto entre Regiao e Alteração Alimentar durante a Pandemia.

1.3 Coeficientes de Associação

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

1.3.1 Exercício

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.

2 Análise Bivariada (Parte II)

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.

2.1 Aplicação Prática

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:

  • Estado: os 26 estados brasileiros mais o Distrito Federal
  • Sexo: Masculino e Feminino
  • Moto: Taxa de mortalidade por 100.000 habitantes para acidentes de trânsito envolvendo motociclistas.
  • Carro: Taxa de mortalidade por 100.000 habitantes para acidentes de trânsito envolvendo carro.

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.

2.2 Tabelas

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

2.2.1 Exercício

Construa as mesmas tabelas acima para começarmos a investigar a associação entre sexo e carro.

2.3 Gráficos

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

2.3.1 Exercício

Construa o boxplot múltiplo para investigar a associação entre sexo e carro.

2.4 Medidas-Resumo

Em aulas anteriores, vimos as seguintes medidas-resumo:

  • Medidas de Posição;
  • Medidas de Posição Relativa;
  • Medidas de Dispersão;
  • Medidas de Forma.

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)

2.4.1 Exercício

Construa as medidas resumo para as taxas de mortalidade envolvendo carros considerando os sexos masculino e feminino.

2.5 Medidas de Associação

É 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

2.5.1 Exercício

Calcule o R2 para investigar a associação entre as variáveis sexo e carro.