2  Conhecendo os dados

2.1 Conhecendo os dados

O pacote tidyverse abriga um conjunto de pacotes para facilitar a manipulação, limpeza, transformação e visualização de dados. Com uma sintaxe consistente e funções intuitivas, ele permite realizar tarefas complexas de forma clara e encadeada, usando o operador %>%.

library(tidyverse)
tidyverse_packages(include_self = TRUE)
 [1] "broom"         "conflicted"    "cli"           "dbplyr"       
 [5] "dplyr"         "dtplyr"        "forcats"       "ggplot2"      
 [9] "googledrive"   "googlesheets4" "haven"         "hms"          
[13] "httr"          "jsonlite"      "lubridate"     "magrittr"     
[17] "modelr"        "pillar"        "purrr"         "ragg"         
[21] "readr"         "readxl"        "reprex"        "rlang"        
[25] "rstudioapi"    "rvest"         "stringr"       "tibble"       
[29] "tidyr"         "xml2"          "tidyverse"    

Faça Perguntas aos Dados!

No universo da análise de dados, saber extrair o máximo de informações valiosas de um dataset é essencial. Um passo fundamental para isso é fazer perguntas inteligentes aos dados e, para auxiliar nessa tarefa, os pacotes {dplyr} e {tidyr} se destacam. Veja como eles podem te ajudar a obter respostas rápidas e relevantes.

Como posso selecionar apenas as informações mais relevantes?
Para focar nas colunas que realmente interessam, utilize select(coluna1, coluna2, coluna3) e reduza o dataset ao essencial.

Quero analisar apenas um subconjunto específico de dados. Como fazer?
Filtre observações que atendam a um critério com filter(coluna1 == "categoria") ou filter(coluna2 > valor).

Como posso comparar valores entre diferentes grupos?
Agrupe os dados por categorias usando group_by(coluna1) e depois calcule estatísticas com summarise(media = mean(coluna2), total = sum(coluna3)).

Como posso contar rapidamente quantas observações existem por categoria?
Use group_by(coluna1) %>% summarise(n = n()) para obter contagens detalhadas por grupo.

Como posso lidar com dados faltantes ao calcular estatísticas com o summarise?
Inclua na.rm = TRUE dentro de funções como mean(), sum() ou median() para ignorar valores ausentes e obter medidas corretas.

Como posso ver rapidamente quais são os valores mais altos ou mais baixos?
Organize seus dados com arrange(coluna1) ou arrange(desc(coluna1)) para ordenar em ordem crescente ou decrescente.

Preciso criar novas informações a partir das existentes. É possível?
Sim, utilize mutate(nova_coluna = coluna1 + coluna2) para gerar variáveis derivadas ou indicadores adicionais.

Quero identificar rapidamente valores duplicados ou repetidos. Como faço?
Use distinct(coluna1, coluna2) para ver apenas combinações únicas de variáveis, removendo duplicatas.

Quero criar categorias a partir de valores contínuos. É possível?
Sim! Use mutate(nova_categoria = case_when(coluna <= 10 ~ "baixa", coluna <= 20 ~ "media", TRUE ~ "alta")) para transformar números em faixas ou grupos.

Como posso combinar informações de dois datasets diferentes?
Utilize left_join(df1, df2, by = "coluna_chave") para adicionar colunas de outro dataset com base em uma chave comum.

Preciso reorganizar dados de várias colunas em um formato longo para análise.
Use pivot_longer(cols = c(coluna1, coluna2, coluna3), names_to = "nova_coluna", values_to = "valor") para transformar várias colunas em duas: “nome da variável” e “valor”.

Como posso transformar dados de formato longo para formato largo, criando colunas a partir de categorias?
Use pivot_wider(names_from = coluna_categorias, values_from = coluna_valores) para espalhar os valores de uma coluna em várias colunas novas, deixando o dataset mais “largo”.

Quero juntar ou separar informações que estão em uma única coluna. Como faço?
Separe dados com separate(coluna, into = c("parte1", "parte2")) ou combine várias colunas com unite("nova_coluna", coluna1, coluna2).

Ao fazer perguntas certas e usar funções adequadas do {dplyr}, torna-se muito mais fácil encontrar padrões, tendências e responder questões cruciais em qualquer análise de dados. Porém, para que essas respostas sejam confiáveis, é importante lembrar que, mesmo que você já tenha pensado em tudo que deseja visualizar e tenha preparado seus dados, há um detalhe fundamental: se os dados estiverem errados, incompletos ou duplicados, seus gráficos vão mentir.

Por que preparar os dados?

“Um gráfico bonito com dados ruins é apenas uma ilusão bem apresentada.”

2.2 Dados bons vs Dados ruins

Dados: https://www.kaggle.com/datasets/arianazmoudeh/airbnbopendata

library(tidyverse)
library(patchwork)

airbnb <- read.csv("Airbnb_Open_Data.csv")
glimpse(airbnb)
Rows: 102,599
Columns: 26
$ id                             <int> 1001254, 1002102, 1002403, 1002755, 100…
$ NAME                           <chr> "Clean & quiet apt home by the park", "…
$ host.id                        <dbl> 80014485718, 52335172823, 78829239556, …
$ host_identity_verified         <chr> "unconfirmed", "verified", "", "unconfi…
$ host.name                      <chr> "Madaline", "Jenna", "Elise", "Garry", …
$ neighbourhood.group            <chr> "Brooklyn", "Manhattan", "Manhattan", "…
$ neighbourhood                  <chr> "Kensington", "Midtown", "Harlem", "Cli…
$ lat                            <dbl> 40.64749, 40.75362, 40.80902, 40.68514,…
$ long                           <dbl> -73.97237, -73.98377, -73.94190, -73.95…
$ country                        <chr> "United States", "United States", "Unit…
$ country.code                   <chr> "US", "US", "US", "US", "US", "US", "US…
$ instant_bookable               <lgl> FALSE, FALSE, TRUE, TRUE, FALSE, TRUE, …
$ cancellation_policy            <chr> "strict", "moderate", "flexible", "mode…
$ room.type                      <chr> "Private room", "Entire home/apt", "Pri…
$ Construction.year              <int> 2020, 2007, 2005, 2005, 2009, 2013, 201…
$ price                          <chr> "$966 ", "$142 ", "$620 ", "$368 ", "$2…
$ service.fee                    <chr> "$193 ", "$28 ", "$124 ", "$74 ", "$41 …
$ minimum.nights                 <int> 10, 30, 3, 30, 10, 3, 45, 45, 2, 2, 1, …
$ number.of.reviews              <int> 9, 45, 0, 270, 9, 74, 49, 49, 430, 118,…
$ last.review                    <chr> "10/19/2021", "5/21/2022", "", "7/5/201…
$ reviews.per.month              <dbl> 0.21, 0.38, NA, 4.64, 0.10, 0.59, 0.40,…
$ review.rate.number             <int> 4, 4, 5, 4, 3, 3, 5, 5, 3, 5, 3, 4, 4, …
$ calculated.host.listings.count <int> 6, 2, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, …
$ availability.365               <int> 286, 228, 352, 322, 289, 374, 224, 219,…
$ house_rules                    <chr> "Clean up and treat the home the way yo…
$ license                        <chr> "", "", "", "", "", "", "", "", "", "",…

Nem todos os dados são iguais. Por isso precisamos explorar cada banco de dados de maneira a identificar potenciais problemas que podem surgir e até mesmo comprometer as análises posteriores.

Veja alguns problemas comuns que encontramos logo ao carregar o dataset:

  • Valores ausentes (NA)

  • Duplicatas que distorcem médias e contagens

  • Variáveis com tipos incorretos (datas como texto, preços como string)

  • Escalas ou unidades inconsistentes

Lidando com valores ausentes

Primeiro iremos identificar a quantidade de NA em cada coluna:

colSums(is.na(airbnb))
                            id                           NAME 
                             0                              0 
                       host.id         host_identity_verified 
                             0                              0 
                     host.name            neighbourhood.group 
                             0                              0 
                 neighbourhood                            lat 
                             0                              8 
                          long                        country 
                             8                              0 
                  country.code               instant_bookable 
                             0                            105 
           cancellation_policy                      room.type 
                             0                              0 
             Construction.year                          price 
                           214                              0 
                   service.fee                 minimum.nights 
                             0                            409 
             number.of.reviews                    last.review 
                           183                              0 
             reviews.per.month             review.rate.number 
                         15879                            326 
calculated.host.listings.count               availability.365 
                           319                            448 
                   house_rules                        license 
                             0                              0 

Podemos ver que as colunas number.of.reviews, review.rate.numbers, calculated.host.listings.count, long, instant_bookable, Construction.year, minimum.nights, reviews.per.month e availability.365 tem muitos valores ausentes.

Assim, surgem perguntas:

Qual será o impacto disso na nossa análise? O que devemos fazer?

  • Remover linhas quando poucos valores estão ausentes.

  • Excluir colunas inteiras quando a maioria dos valores está ausente.

  • Imputar valores quando a variável é importante e não podemos perder informação.

A decisão de como lidar com valores ausentes depende do contexto e da importância da variável para a análise.

Exclusão de linhas

airbnb_limpo <- na.omit(airbnb)
nrow(airbnb) - nrow(airbnb_limpo)
[1] 17155

Exclusão de colunas

airbnb_limpo <- airbnb[, colSums(is.na(airbnb)) == 0]
ncol(airbnb) - ncol(airbnb_limpo)
[1] 10

Imputação de valores

Podemos usar a média ou a mediana, por exemplo, dependendo do tipo de variável e da distribuição dos dados.

mean(airbnb$reviews.per.month, na.rm = TRUE)
[1] 1.374022
airbnb$reviews.per.month[is.na(airbnb$reviews.per.month)] <- 1.374022

airbnb$reviews.per.month[is.na(airbnb$reviews.per.month)] <- median(airbnb$reviews.per.month, na.rm = TRUE)

Detectando duplicatas

Outro problema comum são as duplicatas, que podem distorcer nossas análises através de contagens e médias.

Duplicatas são linhas repetidas em um conjunto de dados.

Elas podem surgir por diversos motivos:

  • Erros na coleta → o mesmo registro foi salvo mais de uma vez.

  • Importação de dados de várias fontes → o mesmo dado aparece em bases diferentes.

  • Inserções manuais → pessoas digitando informações repetidas.

Vamos verificar se há linhas duplicadas no dataset:

sum(duplicated(airbnb))
[1] 541

Se quisermos eliminar registros idênticos:

airbnb2 <- airbnb %>% distinct() # Mantém apenas a primeira ocorrência

Comparação

col<- c("reviews.per.month", "number.of.reviews", "minimum.nights", "review.rate.number", "availability.365") 

before <- airbnb %>% summarise(across(all_of(col), mean, na.rm = TRUE))

after <- airbnb2 %>% summarise(across(all_of(col), mean, na.rm = TRUE))

before - after 
  reviews.per.month number.of.reviews minimum.nights review.rate.number
1      -0.001171496       -0.03420569    0.009204691       0.0003730864
  availability.365
1       0.08926198

Ajustando tipos de dados

Outro aspecto importante da preparação de dados é garantir que cada coluna tenha o tipo de dado correto. Isso é crucial para evitar erros em análises e visualizações. Alguns exemplos de tipos de dados comuns incluem: data, numérico, categórico (fator), texto (caractere) e lógico (booleano). Abaixo iremos ajustar alguns dados do dataset do Airbnb com a função mutate() do dplyr.

airbnb4 <- airbnb %>%
  mutate(
    # Remover o símbolo de dólar e espaços, e transformar para numérico
    price = as.numeric(gsub("\\$|\\s", "", price)), 
    # Converter para data
    last.review = as.Date(last.review, format = "%m/%d/%Y"), 
    # Converter para fator
    neighbourhood = as.factor(neighbourhood), 
    # Converter para fator
    room.type = as.factor(room.type)) 

2.3 Gráficos mentem?

Gráficos podem ser enganosos se os dados não forem preparados corretamente. Por exemplo, um gráfico de barras pode parecer indicar uma tendência clara, mas se houver valores ausentes ou duplicados, a interpretação pode ser completamente errada. Ajustes de escala, rótulos e cores também podem distorcer a percepção dos dados. A mensagem para este último ponto é que mesmo com dados corretos, ainda é possível criar narrativas distorcidas.

Vamos entender um pouco mais sobre isso.

Quando e por quais motivos gráficos podem mentir?

  • Manipulação intencional / Falta de ética → para favorecer uma narrativa. Pode se escolher os dados que “interessam”.

  • Falta de conhecimento técnico / Desatenção do analista → Eixos, proporções e agregações mal configuradas. Escolhas mal pensadas de escala ou apresentação.

Como gráficos podem manipular narrativas

2.3.1 Cortando o eixo Y

Uma das formas mais comuns de enganar visualmente é não começar o eixo Y no zero. Isso exagera pequenas diferenças, fazendo-as parecer gigantescas.

Impacto visual: o primeiro gráfico exagera as diferenças, com corte dos eixo y em 400, enquanto o segundo mostra a realidade.

2.3.2 Mudando a escala do eixo Y propositalmente

Nesse caso, o eixo Y é alterado para uma escala logarítmica, o que pode distorcer a percepção das diferenças entre categorias. Esse tipo de manipulação não é proibida, e em algumas áreas ou tipos de experimentos é necessária, mas deve ser usada com cautela e sempre de forma explicada para que o leitor entenda o porquê da escolha.

Impacto visual: o gráfico com escala logarítmica achata as diferenças e pode levar a conclusões erradas.

2.3.3 Escolhendo os dados que “interessam”

Outro problema comum é selecionar apenas uma parte dos dados para criar uma narrativa conveniente, que ajude a reforçar um ponto de vista específico.

No gráfico com os dados escolhidos, parece uma boa opção alugar um quarto compartilhado devido ao seu menor preço frente ao quarto de hotel. Entretanto, no gráfico completo vemos que há outras opções melhores com a mesma faixa de preço do quarto compartilhado.

Conclusão

  • Dados ruins → conclusões ruins.

  • Preparar os dados é tão importante quanto saber visualizá-los.

  • Gráficos são narrativas. A responsabilidade do analista é informar, não enganar.

  • Sempre questione os dados e as escolhas feitas na visualização.