Valores ausentes

Frequentemente, antes de iniciar a análise de dados propriamente dita, é importante inspecionar os dados e, principalmente, verificar os valores ausentes. Para isso, existem dois pacotes abrangentes que se baseiam no ggplot2: naniar e UpSetR.

Primeiramente, vamos instalar ou carregar os pacotes:

install.packages("UpSetR")
install.packages("naniar")

library("UpSetR")
library("naniar")

Agora vamos continuar utilizando o conjunto de dados pss. Primeiramente, queremos visualizar os valores ausentes por variável. Para isso, filtramos o conjunto de dados pela variável de ID e pelas quatro variáveis seguintes: stfdem, stfeco, trstprl e trstlgl. Em seguida, transformamos o conjunto de dados em um formato longo e criamos uma terceira coluna que indica se é um valor ausente ou não. Então, agrupamos por variáveis e pela nova terceira coluna, contamos os valores ausentes por variável (bem como os não valores ausentes). Em seguida, excluímos os não valores ausentes e classificamos a tabela em ordem decrescente. Assim, podemos ver quantos valores ausentes existem em cada uma das quatro variáveis.

missingValues <- pss %>%
  select(
    c(
      "idno", 
      "stfdem",
      "stfeco", 
      "trstprl", 
      "trstlgl"
    )
  ) %>% 
  pivot_longer(
    everything(),
    names_to = "variable",
    values_to = "val"
  ) %>%
  mutate(is.missing = is.na(val)) %>%
  group_by(
    variable, 
    is.missing
  ) %>%
  summarize(
    num.missing = n()
  ) %>%
  filter(is.missing == TRUE) %>%
  select(-is.missing) %>%
  arrange(desc(num.missing))

missingValues
## # A tibble: 4 × 2
## # Groups:   variable [4]
##   variable num.missing
##   <chr>          <int>
## 1 stfdem            95
## 2 trstprl           35
## 3 trstlgl           12
## 4 stfeco             6

Em seguida, você pode gerar um simples gráfico de barras com esse novo conjunto de dados:

missingValues %>%
  ggplot() +
  geom_bar(
    aes(
      variable, 
      num.missing
    ), 
    stat = 'identity'
  ) +
  labs(
    x = 'Variable',
    y = "Anzahl MV", 
    title = 'Missing Values pro Variable'
  ) +
  theme(
    axis.text.x = element_text(
      angle = 45, 
      hjust = 1
    )
  )

Aqui você pode experimentar todas as brincadeiras acima. Mas agora queremos exibir porcentagens para ver quanto por cento da variável missings existe. Para isso, repetimos os passos anteriores, mas adicionamos uma etapa mutate que nos dá as porcentagens.

#Prozente
missingValues <-  pss %>%
  select(
    c(
      "idno", 
      "stfdem",
      "stfeco", 
      "trstprl", 
      "trstlgl"
    )
  ) %>% 
  pivot_longer(
               everything(),
               names_to = "key",
               values_to = "val"
               ) %>%
  mutate(isna = is.na(val)) %>%
  group_by(key) %>%
  mutate(total = n()) %>%
  group_by(
           key, 
           total,
           isna
           ) %>%
  summarise(num.isna = n()) %>%
  mutate(pct = num.isna / total * 100)

levels <- (
           missingValues  %>% 
             filter(isna == T) %>%     
             arrange(desc(pct))
           )$key

missingsPercent <- missingValues %>%
  ggplot() +
  geom_bar(
           aes(
               x = reorder(
                           key, 
                           desc(pct)
                           ), 
               y = pct, 
               fill = isna
               ), 
           stat = 'identity',
           alpha = 0.8) +
  scale_x_discrete(limits = levels) +
  scale_fill_manual(
                    name = "", 
                    values = c(
                               'steelblue', 
                               'tomato3'
                               ), 
                    labels = c(
                               "vorhanden",
                               "fehlend"
                               )
                    ) +
  coord_flip() +
  labs(
       title = "Prozent von missing values", 
       x = 'Variable', 
       y = "% missing values"
       )

missingsPercent
## Warning: Removed 1 row containing missing values or values outside the scale range
## (`geom_bar()`).

Alternativamente, você também pode exibir os missings de forma que seja visível em qual caso cada variável está missing. No entanto, em conjuntos de dados grandes, isso pode se tornar rapidamente confuso.

# pro Fall (wird aber bei großen Datensätzen etwas schwer zu lesen)
rawPlot <-  pss %>%
  select(
    c(
      "idno", 
      "stfdem",
      "stfeco", 
      "trstprl", 
      "trstlgl"
    )
  ) %>% 
  pivot_longer(
               -c("idno"),
               names_to = "key",
               values_to = "val"
               ) %>%
  mutate(isna = is.na(val)) %>%
  ggplot(
         aes(
             key, 
             idno, 
             fill = isna)
        ) +
  geom_raster(alpha = 0.8) +
  scale_fill_manual(
                    name = "",
                    values = c(
                               "steelblue", 
                               "tomato3"
                               ),
                    labels = c(
                               "vorhanden",
                               "fehlend"
                               )
                    ) +
  scale_x_discrete(limits = levels) +
  labs(
       x = "Variable",
       y = "Row Number",
       title = "Missing values in rows"
       ) +
  coord_flip()

rawPlot

Vamos agora para as bibliotecas naniar e UpSetR!