Oftmals möchte man bevor man die eigentliche Datenanalyse beginnt, zuerst die Daten inspizieren und vor allem die missing values prüfen. Dazu gibt es zwei umfangreiche Pakete, die auf ggplot2
aufbauen. Dies sind: naniar
und UpSetR
.
Zuerst installieren bzw. laden wir die Pakete:
install.packages("UpSetR")
install.packages("naniar")
library("UpSetR")
library("naniar")
Wir benutzen nun den Datensatz weiterhin den Datensatz pss
. Zuerst wollen wir nun die missings pro Variable darstellen. Dazu filtern wir zuerst den Datensatz auf die ID-Variable und die folgenden vier Variablen: stfdem
, stfeco
, trstprl
und trstlgl
. Anschließend bringen wir den Datensatz in ein long-Format und schaffen eine dann dritte Spalte, die angibt, ob es ein missing-Wert ist oder nicht. Dann gruppieren wir nach Variablen und der neuen ditten Spalte und zählen die missings pro Variable (bzw. auch die nicht-missings). Danach schließen wir die nicht-missings aus und sortieren die Tabelle absteigend. Wir sehen dann, wie viele missings in jeder der vier Variablen vorhanden sind.
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
Anschließend kann man sich ein einfaches Balkendiagramm ausgeben lassen mit diesem neuen Datensatz:
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
)
)
Hier kann man alle Spielereien von oben austesten. Wir wollen aber jetzt Prozente ausgeben, um zu sehen, wie viel Prozent der Variable missings sind. Dazu wiederholen wir die Schritte von zuvor, fügen aber einen mutate
-Schritt ein, der uns die Prozente angibt.
#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()`).
Alternativ kann man auch die missings so anzeigen, dass sichtbar wird, welcher Fall auf welcher Variable missing ist. Bei großen Datensätzen wird das aber schnell unübersichtlich.
# 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
Weiter geht’s zu den libraries naniar
und UpSetR
!