alt text

GET00100 - Estatística I

Jony Arrais Pinto Junior

Análise Exploratória Bivariada de Dados no R

Conteúdo

  • Tabelas usando o pacote expss;
  • Gráficos usando ggplot2.

1 - Importando e tratando a base de dados

Inicialmente importaremos o arquivo base_app.csv.

# Carregando o pacote
library(readr)

#Importando o arquivo base_app.csv
baseApp = read_csv2(file = "base_app.csv", #nome do arquivo com extensão e entre aspas
                    na = "8888", #indicando o código usado para informar dado faltante
                    col_types = cols(codigo = col_character())) #importando a variável col_types como um character

#Visualizando o objeto
baseApp
# A tibble: 120 × 9
   codigo aplicativo  sexo classe umano idade satisfacao_preco satisfacao_carro
   <chr>       <dbl> <dbl>  <dbl> <dbl> <dbl>            <dbl>            <dbl>
 1 4440            4     1      3     0    49               92               71
 2 2448            4     1      3     0    43               92               68
 3 2611            1     0      1     0    24               45               66
 4 4800            4     1      3     1    63              105               71
 5 4653            3     0      2     0    29               75               67
 6 1402            3     0      1     0    23               80               72
 7 1565            1     1      3     1    59               66               78
 8 2350            3     0      2     0    25               74               73
 9 2641            2     1      3     1    30               74               75
10 4185            1     0      1     1    41               60               70
# … with 110 more rows, and 1 more variable: satisfacao_servico <dbl>
#Obtendo resumos rápidos da base
summary(baseApp)
    codigo            aplicativo         sexo            classe     
 Length:120         Min.   :1.000   Min.   :0.0000   Min.   :1.000  
 Class :character   1st Qu.:1.500   1st Qu.:0.0000   1st Qu.:1.000  
 Mode  :character   Median :2.000   Median :1.0000   Median :2.000  
                    Mean   :2.286   Mean   :0.5667   Mean   :2.092  
                    3rd Qu.:3.000   3rd Qu.:1.0000   3rd Qu.:3.000  
                    Max.   :4.000   Max.   :1.0000   Max.   :3.000  
                    NA's   :1                                       
     umano           idade       satisfacao_preco satisfacao_carro
 Min.   :0.000   Min.   :18.00   Min.   : 35.00   Min.   :56.00   
 1st Qu.:0.000   1st Qu.:24.00   1st Qu.: 61.00   1st Qu.:68.00   
 Median :1.000   Median :29.00   Median : 71.00   Median :70.00   
 Mean   :0.625   Mean   :32.97   Mean   : 70.84   Mean   :70.19   
 3rd Qu.:1.000   3rd Qu.:40.00   3rd Qu.: 80.00   3rd Qu.:72.25   
 Max.   :1.000   Max.   :63.00   Max.   :105.00   Max.   :80.00   
                 NA's   :1                                        
 satisfacao_servico
 Min.   :68.00     
 1st Qu.:76.00     
 Median :79.00     
 Mean   :79.38     
 3rd Qu.:83.00     
 Max.   :91.00     
                   
#Transformando as variáveis qualitativas em fatores

baseApp$aplicativo = factor(x = baseApp$aplicativo, #conjunto de valores que serão transformados
                            levels = c(1,2,3,4), #sequência de valores que a variável assume
                            labels = c("Táxi Rio", "Uber", "99 Pop", "Drive-in")) #sequência de rótulos, obedece a sequência de levels

baseApp$sexo = factor(x = baseApp$sexo, 
                            levels = c(0,1),
                            labels = c("Feminino", "Masculino"))

baseApp$classe = factor(x = baseApp$classe, 
                            levels = c(1,2,3),
                            labels = c("A", "B", "Outras"))

baseApp$umano = factor(x = baseApp$umano, 
                            levels = c(0,1),
                            labels = c("Não", "Sim"))

#Refazendo o summary
summary(baseApp)
    codigo             aplicativo        sexo       classe   umano   
 Length:120         Táxi Rio:30   Feminino :52   A     :36   Não:45  
 Class :character   Uber    :45   Masculino:68   B     :37   Sim:75  
 Mode  :character   99 Pop  :24                  Outras:47           
                    Drive-in:20                                      
                    NA's    : 1                                      
                                                                     
                                                                     
     idade       satisfacao_preco satisfacao_carro satisfacao_servico
 Min.   :18.00   Min.   : 35.00   Min.   :56.00    Min.   :68.00     
 1st Qu.:24.00   1st Qu.: 61.00   1st Qu.:68.00    1st Qu.:76.00     
 Median :29.00   Median : 71.00   Median :70.00    Median :79.00     
 Mean   :32.97   Mean   : 70.84   Mean   :70.19    Mean   :79.38     
 3rd Qu.:40.00   3rd Qu.: 80.00   3rd Qu.:72.25    3rd Qu.:83.00     
 Max.   :63.00   Max.   :105.00   Max.   :80.00    Max.   :91.00     
 NA's   :1                                                           

2 - Analisando existência de relação entre duas variáveis qualitativas

Suponha que o nosso desejo seja o de verificar a existência de associação/relação entre as variáveis aplicativo e classe.

# Carregando o pacote
library(expss)
library(dplyr)

#Criando uma tabela de contingência com as frequências observadas
baseApp |> #comece informando a base de dados
  cross_cases(classe,aplicativo) #função que faz a tabela de dupla entrada com as frequências observadas alimentada com as duas variáveis de interesse
 aplicativo 
 Táxi Rio   Uber   99 Pop   Drive-in 
 classe 
   A  20 10 5 1
   B  8 15 9 4
   Outras  2 20 10 15
   #Total cases  30 45 24 20
#Criando uma tabela de contingência com os percentuais por coluna
baseApp |> #comece informando a base de dados
  cross_cpct(classe,aplicativo) #função que faz a tabela de dupla entrada com os % por coluna alimentada com as duas variáveis de interesse
 aplicativo 
 Táxi Rio   Uber   99 Pop   Drive-in 
 classe 
   A  66.7 22.2 20.8 5
   B  26.7 33.3 37.5 20
   Outras  6.7 44.4 41.7 75
   #Total cases  30 45 24 20
#Criando uma tabela de contingência com os percentuais por linha
baseApp |> #comece informando a base de dados
  cross_rpct(classe,aplicativo) #função que faz a tabela de dupla entrada com os % por linha alimentada com as duas variáveis de interesse
 aplicativo 
 Táxi Rio   Uber   99 Pop   Drive-in 
 classe 
   A  55.6 27.8 13.9 2.8
   B  22.2 41.7 25.0 11.1
   Outras  4.3 42.6 21.3 31.9
   #Total cases  30 45 24 20
#Criando uma tabela de contingência com os percentuais pelo total
baseApp |> #comece informando a base de dados
  cross_tpct(classe,aplicativo) #função que faz a tabela de dupla entrada com os % pelo total alimentada com as duas variáveis de interesse
 aplicativo 
 Táxi Rio   Uber   99 Pop   Drive-in 
 classe 
   A  16.8 8.4 4.2 0.8
   B  6.7 12.6 7.6 3.4
   Outras  1.7 16.8 8.4 12.6
   #Total cases  30 45 24 20

E se o desejo fosse fazer um gráfico para resumir a relação entre as duas variáveis?

#Carregando pacote
library(ggplot2)
library(scales)

#Gráfico de barras empilhadas
baseApp |> #comece informando a base de dados
  filter(!is.na(aplicativo)) |> #retirando as linhas que são NA para aplicativo
  ggplot(mapping = aes(x = aplicativo, 
                       fill = classe)) + #estamos definindo que no eixo x será apresentado as categorias da variável aplicativo e cada coluna do aplicativa sera particionada nas categorias de classe
  geom_bar(position = "fill") + #definimos que o formato do gráfico é de barras e as barras são empilhadas
  labs(x = "Aplicativo", 
       y = "%",
       fill = "Classe") + #cuidando dos rótulos
     scale_y_continuous(labels = scales::percent_format()) + #fazendo o eixo y ser apresentado em %
  theme_classic() #modificando o tema do gráfico

Como quantificar a relação entre aplicativo e classe?

#Caculando o qui-quadrado
aux = chisq.test(table(baseApp$aplicativo, baseApp$classe), 
                 correct = FALSE)

#Acessando o qui-quadrado
aux$statistic
X-squared 
 35.28583 
#Calculando Coeficiente de contingência
C = sqrt(aux$statistic/(aux$statistic+120))
C
X-squared 
 0.476688 
#Calculando V de Cramer
V = sqrt((aux$statistic/120)/min(4-1,3-1))
V
X-squared 
0.3834375 

3 - Analisando existência de relação entre duas variáveis quantitativas

Suponha que o nosso desejo seja o de verificar a existência de associação/relação entre as variáveis Satisfação preço e staisfação serviço.

#Gráfico de dispersão
baseApp |> #comece informando a base de dados
  ggplot(mapping = aes(x = satisfacao_preco,
                       y = satisfacao_servico)) + #estamos definindo que no eixo x será apresentado a satisfação com o preço e no eixo y a satisfação com o serviço
  geom_point() + #definimos que o formato do gráfico é de pontos (gráfico de dispersão)
  labs(x = "Satisfação preço", 
       y = "Satisfação serviço") + #cuidando dos rótulos
  theme_classic() #modificando o tema do gráfico

Como quantificar a relação entre aplicativo e classe?

#Caculando a correlação
cor(baseApp$satisfacao_preco, baseApp$satisfacao_servico)
[1] 0.9377661

4 - Analisando existência de relação entre uma variável quantitativa e uma quaitativa

Suponha que o nosso desejo seja o de verificar a existência de associação/relação entre as variáveis idade e aplicativo.

#Obtendo medidas resumos
resumo = baseApp |> #comece indicando a base
  filter(!is.na(aplicativo)) |> #retirando as linhas que são NA em aplicativo
  group_by(aplicativo) |> #defina os grupos para os quais as medidas serão caclculadas
  summarise(media = mean(idade, na.rm = TRUE), #função que calcula a média
            variancia = var(idade, na.rm = TRUE), #função que calcula a variância amostral,
            n = n() #função que contabiliza o número de linhas
  )

#Visualizando o objeto
resumo
# A tibble: 4 × 4
  aplicativo media variancia     n
  <fct>      <dbl>     <dbl> <int>
1 Táxi Rio    44       105.     30
2 Uber        24.1      12.8    45
3 99 Pop      32        54.3    24
4 Drive-in    38.2     186.     20

Graficamente?

#Criando um boxplot
baseApp |> #comece informando a base de dados
  filter(!is.na(aplicativo)) |> #retirando as linhas sem informação de aplicativo
  ggplot(mapping = aes(x = aplicativo, 
                       y = idade)) + #estamos definindo que no eixo x será apresentado os valores da variável aplicativo e no eixo y da idade
  geom_boxplot() + #estamos definindo o formato do gráfico, que será um boxplot
  theme_minimal() #modificando a temática do gráfico

Quantificando a relação

#Calculando a média ponderada entre as variâncias da idade em cada grupo
Var_med = sum((resumo$variancia*resumo$n))/sum(resumo$n)

Var_med
[1] 73.42735
#Calculando R2
R2 = 1 - Var_med/var(baseApp$idade, na.rm = TRUE)

R2
[1] 0.45633

Atividade 1: Existe relação entre aplicativo e o tempo que é cliente do serviço?

Atividade 2: Existe relação entre aplicativo e satisfação com o serviço?

Atividade 3: Existe relação entre satisfação com o preço e idade?