alt text

GET00100 - Estatística I

Jony Arrais Pinto Junior

Análise Exploratória Univariada 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 - Resumindo uma variável qualitativa

Suponha que o nosso desejo seja o de resumir a variável aplicativo. Como já vimos, o summary já nos forneceu as frequências absolutas das categorias desta variável, mas possuímos outras formas de obter mais frequências associadas a esta variável, por exemplo, usando a função fre

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

#Criando uma tabela de distribuições de frequência para uma variável
baseApp |> #comece informando a base de dados
  select(aplicativo) |> #depois selecione da base a variável para a qual será criada a tabela
  fre() #a seguir use a função que cria a tabela
select(baseApp, aplicativo)  Count   Valid percent   Percent   Responses, %   Cumulative responses, % 
 Táxi Rio  30 25.2 25.0 25.2 25.2
 Uber  45 37.8 37.5 37.8 63.0
 99 Pop  24 20.2 20.0 20.2 83.2
 Drive-in  20 16.8 16.7 16.8 100.0
 #Total  119 100 99.2 100
 <NA>  1 0.8

Se o nosso interesse fosse uma análise da variável aplicativo, mas somente para indivíduos do sexo masculino?

#Criando uma tabela de distribuições de frequência para uma variável
baseApp |> #comece informando a base de dados
  filter(sexo == "Masculino") |> #selecione somente as linhas em que sexo está preenchida com Masculino
  select(aplicativo) |> #depois selecione da base a variável para a qual será criada a tabela
  fre() #a seguir use a função que cria a tabela
select(filter(baseApp, sexo == “Masculino”), aplicativo)  Count   Valid percent   Percent   Responses, %   Cumulative responses, % 
 Táxi Rio  15 22.1 22.1 22.1 22.1
 Uber  30 44.1 44.1 44.1 66.2
 99 Pop  13 19.1 19.1 19.1 85.3
 Drive-in  10 14.7 14.7 14.7 100.0
 #Total  68 100 100 100
 <NA>  0 0.0

E se o desejo fosse fazer um gráfico para resumir a variável aplicativo?

Poderíamos começar fazendo um gráfico de barras.

#Carregando pacote
library(ggplot2)

#Criando um gráfico de barras
baseApp |> #comece informando a base de dados
  ggplot(mapping = aes(x = aplicativo)) + #estamos definindo que no eixo x será apresentado as categorias da variável aplicativo
  geom_bar() #estamos definindo o formato do gráfico, que será um gráfico de barras

Como fazer o gráfico retirando o NA?

#Criando um gráfico de barras retirando os NA da variável
baseApp |> #comece informando a base de dados
  filter(!is.na(aplicativo)) |> #selecionando somente as linhas diferentes de NA para a variável aplicativo
  ggplot(mapping = aes(x = aplicativo)) + #estamos definindo que no eixo x será apresentado as categorias da variável aplicativo
  geom_bar() #estamos definindo o formato do gráfico, que será um gráfico de barras

Vamos realizar algumas melhorias estéticas no gráfico??

#Criando um gráfico de barras retirando os NA da variável
baseApp |> #comece informando a base de dados
  filter(!is.na(aplicativo)) |> #selecionando somente as linhas diferentes de NA para a variável aplicativo
  ggplot(mapping = aes(x = aplicativo)) + #estamos definindo que no eixo x será apresentado as categorias da variável aplicativo
  geom_bar(fill = "red") + #estamos definindo o formato do gráfico, que será um gráfico de barras preenchidas com vermelho
  labs(x = "Aplicativo", y = "Frequência") + #Modificando os rótulos dos eixos
  theme_classic() #Mudando o tema do gráfico

Como fazer o gráfico em proporção?

#Carregando pacote
library(scales)

#Criando um gráfico de barras retirando os NA da variável
baseApp |> #comece informando a base de dados
  filter(!is.na(aplicativo)) |> #selecionando somente as linhas diferentes de NA para a variável aplicativo
  ggplot(mapping = aes(x = aplicativo,
                       y = ..prop..,
                       group = 1)) + #estamos definindo que no eixo x será apresentado as categorias da variável aplicativo e no y as proporções
  geom_bar(fill = "red") + #estamos definindo o formato do gráfico, que será um gráfico de barras preenchidas com vermelho
  labs(x = "Aplicativo", y = "Porcentagem") + #Modificando os rótulos dos eixos
  theme_classic() + #Mudando o tema do gráfico
  scale_y_continuous(labels = scales::percent_format()) #Fazendo com que o rótulo seja em formato de percentual

3 - Resumindo uma variável quantitativa

Suponha que o nosso desejo seja o de resumir a variável idade. Como já vimos, o summary já nos forneceu algumas medidas de posição da variável, mas poderíamos obter outras? Como obter medidas de dispersão?

#Obtendo medidas resumos
resumo = baseApp |> #comece indicando a base
  summarise(media = mean(idade, na.rm = TRUE), #função que calcula a média
            mediana = median(idade, na.rm = TRUE), #função que calcula a mediana
            q_0.9 = quantile(idade, probs = 0.9, na.rm = TRUE), #função que calcula um quantil qualquer, probs é a % abaixo do valor calculado
            q_0.1 = quantile(idade, probs = 0.1, na.rm = TRUE),
            q1 = quantile(idade, probs = 0.25, na.rm = TRUE),
            q3 = quantile(idade, probs = 0.75, na.rm = TRUE),
            maximo = max(idade, na.rm = TRUE), #função que calcula o máximo
            dp = sd(idade, na.rm = TRUE), #função que calcula o desvio padrão amostral
            var = var(idade, na.rm = TRUE), #função que calcula a variância amostral
            dam = mad(idade, na.rm = TRUE) #função que calcula o desvio absoluto mediano
  )

#Visualizando o objeto
resumo
# A tibble: 1 × 10
  media mediana q_0.9 q_0.1    q1    q3 maximo    dp   var   dam
  <dbl>   <dbl> <dbl> <dbl> <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>
1  33.0      29    49    20    24    40     63  11.6  135.  11.9

E se quiséssemos acrescentar medidas calculadas CV, Coeficiente de assimetria e curtose?

#Incluindo outras medidas resumos
resumo = resumo |> #inicie indicando o objeto que contém as medidas resumos
  mutate(CV = dp/media*100,
         AS = 3*(media - mediana)/dp,
         Curtose = (q3-q1)/(2*(q_0.9-q_0.1)))

#Visualizando o objeto
resumo
# A tibble: 1 × 13
  media mediana q_0.9 q_0.1    q1    q3 maximo    dp   var   dam    CV    AS
  <dbl>   <dbl> <dbl> <dbl> <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1  33.0      29    49    20    24    40     63  11.6  135.  11.9  35.2  1.03
# … with 1 more variable: Curtose <dbl>

E como podemos resumir graficamente?

#Criando um histograma
baseApp |> #comece informando a base de dados
  ggplot(mapping = aes(x = idade)) + #estamos definindo que no eixo x será apresentado os valores da variável idade
  geom_histogram() #estamos definindo o formato do gráfico, que será um hitograma

Mudando o número de classes e a estética do gráfico.

#Criando um histograma
baseApp |> #comece informando a base de dados
  ggplot(mapping = aes(x = idade)) + #estamos definindo que no eixo x será apresentado os valores da variável idade
  geom_histogram(bins = 10,
                 fill = "lightblue",
                 colour = "red") + #estamos definindo o formato do gráfico, que será um hitograma e definindo a quantidade de classes, preenchido de azul e as linhas serão vermelhas
  labs(x = "Idade", y = "Frequência") +
  theme_light() #modificando a temática do gráfico

Poderíamos definir onde começa e onde termina cada classe do histograma?

#Criando um histograma
baseApp |> #comece informando a base de dados
  ggplot(mapping = aes(x = idade,
                       y = ..density..)) + #estamos definindo que no eixo x será apresentado os valores da variável idade e no eixo y a densidade
  geom_histogram(breaks = c(18,30,40,50,70),
                 fill = "lightblue") + #estamos definindo o formato do gráfico, que será um hitograma e definindo a quantidade de classes +
  labs(x = "Idade") +
  theme_light() #modificando a temática do gráfico

Como fazer um boxplot?

#Criando um histograma
baseApp |> #comece informando a base de dados
  ggplot(mapping = aes(y = idade)) + #estamos definindo que no eixo y será apresentado os valores da variável idade
  geom_boxplot(fill = "pink") + #estamos definindo o formato do gráfico, que será um boxplot e definindo que ele será preenchido de rosa +
  labs(y = "Idade") +
  theme_minimal() #modificando a temática do gráfico

O boxplot poderia ser feito deitado?

#Criando um histograma
baseApp |> #comece informando a base de dados
  ggplot(mapping = aes(y = idade)) + #estamos definindo que no eixo y será apresentado os valores da variável idade
  geom_boxplot(fill = "pink") + #estamos definindo o formato do gráfico, que será um boxplot e definindo que ele será preenchido de rosa +
  labs(y = "Idade") +
  theme_minimal() + #modificando a temática do gráfico
  coord_flip() #invertendo os eixos

Atividade 1: Crie uma tabela e um gráfico para as variáveis sexo e classe.

Atividade 2: Obtenha medidas de posição e dispersão e faça um gráfico adequado para as variáveis satisfacao_preco e satisfacao_servico.