Kapitel 6 Graphische Darstellung von ordinalen Daten

Das wichtigste beim Rechnen mit R sind zwei Bildschirme. Und viel Kaffee (um wach zu bleiben) und Kamillentee (zum Beruhigen).

6.1 Visualisierung ordinaler Daten

Zuerst erstellen wir ein paar unterschiedliche ordinale Datentypen:

6.1.1 Likert Item Daten

Likert type items sind Fragen mit bipolaren Antwortsoptionen. Die Antwortsoptionen gehen also zum Beispiel von Stimme völlig zu bis Stimme überhaupt nicht zu, oder von Sehr zufrieden bis Sehr unzufrieden. Dies im Gegensatz zu Rating Scales die unipolar sind und zum Beispiel von Nicht zufrieden bis sehr zufrieden gehen (was nicht das Gleiche ist wie beim Likert type item sehr unzufrieden bis sehr zufrieden).

set.seed(123)
Likert_Item_mit_neutraler_Mitte_1<-sample(c(
                        "5_Sehr zufrieden", 
                        "4_Etwas zufrieden", 
                        "3_Weder zufrieden noch unzufrieden",
                        "2_Etwas unzufrieden",
                        "1_Sehr unzufrieden"), size=200, replace=TRUE, prob=c(0.1,0.2,0.25,0.15,0.1))

Tabellarisch kann man dies unterschiedlich darstellen.

Variante Paket Summarytools

summarytools::freq(Likert_Item_mit_neutraler_Mitte_1)
## Frequencies  
## Likert_Item_mit_neutraler_Mitte_1  
## Type: Character  
## 
##                                            Freq   % Valid   % Valid Cum.   % Total   % Total Cum.
## ---------------------------------------- ------ --------- -------------- --------- --------------
##                       1_Sehr unzufrieden     20     10.00          10.00     10.00          10.00
##                      2_Etwas unzufrieden     40     20.00          30.00     20.00          30.00
##       3_Weder zufrieden noch unzufrieden     58     29.00          59.00     29.00          59.00
##                        4_Etwas zufrieden     55     27.50          86.50     27.50          86.50
##                         5_Sehr zufrieden     27     13.50         100.00     13.50         100.00
##                                     <NA>      0                               0.00         100.00
##                                    Total    200    100.00         100.00    100.00         100.00
summarytools::freq(Likert_Item_mit_neutraler_Mitte_1, order="freq")
## Frequencies  
## Likert_Item_mit_neutraler_Mitte_1  
## Type: Character  
## 
##                                            Freq   % Valid   % Valid Cum.   % Total   % Total Cum.
## ---------------------------------------- ------ --------- -------------- --------- --------------
##       3_Weder zufrieden noch unzufrieden     58     29.00          29.00     29.00          29.00
##                        4_Etwas zufrieden     55     27.50          56.50     27.50          56.50
##                      2_Etwas unzufrieden     40     20.00          76.50     20.00          76.50
##                         5_Sehr zufrieden     27     13.50          90.00     13.50          90.00
##                       1_Sehr unzufrieden     20     10.00         100.00     10.00         100.00
##                                     <NA>      0                               0.00         100.00
##                                    Total    200    100.00         100.00    100.00         100.00

Variante Paket epiDisplay Diese Variante erstellt eine Graphik und eine Tabelle.

epiDisplay::tab1(Likert_Item_mit_neutraler_Mitte_1, sort.group = "decreasing", cum.percent = TRUE)
Likert Plot mit EpiDisplay

Abbildung 6.1: Likert Plot mit EpiDisplay

## Likert_Item_mit_neutraler_Mitte_1 : 
##                                    Frequency Percent Cum. percent
## 3_Weder zufrieden noch unzufrieden        58    29.0         29.0
## 4_Etwas zufrieden                         55    27.5         56.5
## 2_Etwas unzufrieden                       40    20.0         76.5
## 5_Sehr zufrieden                          27    13.5         90.0
## 1_Sehr unzufrieden                        20    10.0        100.0
##   Total                                  200   100.0        100.0

Wir können auch mit einer zweiten Variable Kreuztabellen erstellen:

Likert_Item_mit_neutraler_Mitte_2<-sample(c("5_Stimme völlig zu", 
                                            "4_Stimme zu", 
                                            "3_Stimme weder zu noch nicht zu", 
                                            "2_Stimme nicht zu",
                                            "1_Stimme überhaupt nicht zu"), 
                      size=200, replace=TRUE, prob=c(0.05,0.1, 0.15, 0.3, 0.2))
df<-data.frame(Likert_Item_mit_neutraler_Mitte_1,Likert_Item_mit_neutraler_Mitte_2 )
knitr::kable(gmodels::CrossTable(df$Likert_Item_mit_neutraler_Mitte_1, df$Likert_Item_mit_neutraler_Mitte_2, prop.t=TRUE, prop.r=TRUE, prop.c=TRUE, format="SPSS"))
## 
##    Cell Contents
## |-------------------------|
## |                   Count |
## | Chi-square contribution |
## |             Row Percent |
## |          Column Percent |
## |           Total Percent |
## |-------------------------|
## 
## Total Observations in Table:  200 
## 
##                                      | df$Likert_Item_mit_neutraler_Mitte_2 
## df$Likert_Item_mit_neutraler_Mitte_1 |     1_Stimme überhaupt nicht zu  |               2_Stimme nicht zu  | 3_Stimme weder zu noch nicht zu  |                     4_Stimme zu  |              5_Stimme völlig zu  |                       Row Total | 
## -------------------------------------|---------------------------------|---------------------------------|---------------------------------|---------------------------------|---------------------------------|---------------------------------|
##                   1_Sehr unzufrieden |                              5  |                              8  |                              3  |                              2  |                              2  |                             20  | 
##                                      |                          0.035  |                          0.001  |                          0.132  |                          0.000  |                          0.100  |                                 | 
##                                      |                         25.000% |                         40.000% |                         15.000% |                         10.000% |                         10.000% |                         10.000% | 
##                                      |                         10.870% |                          9.877% |                          8.108% |                         10.000% |                         12.500% |                                 | 
##                                      |                          2.500% |                          4.000% |                          1.500% |                          1.000% |                          1.000% |                                 | 
## -------------------------------------|---------------------------------|---------------------------------|---------------------------------|---------------------------------|---------------------------------|---------------------------------|
##                  2_Etwas unzufrieden |                             11  |                             13  |                              6  |                              6  |                              4  |                             40  | 
##                                      |                          0.352  |                          0.632  |                          0.265  |                          1.000  |                          0.200  |                                 | 
##                                      |                         27.500% |                         32.500% |                         15.000% |                         15.000% |                         10.000% |                         20.000% | 
##                                      |                         23.913% |                         16.049% |                         16.216% |                         30.000% |                         25.000% |                                 | 
##                                      |                          5.500% |                          6.500% |                          3.000% |                          3.000% |                          2.000% |                                 | 
## -------------------------------------|---------------------------------|---------------------------------|---------------------------------|---------------------------------|---------------------------------|---------------------------------|
##   3_Weder zufrieden noch unzufrieden |                             11  |                             23  |                             13  |                              6  |                              5  |                             58  | 
##                                      |                          0.410  |                          0.010  |                          0.480  |                          0.007  |                          0.028  |                                 | 
##                                      |                         18.966% |                         39.655% |                         22.414% |                         10.345% |                          8.621% |                         29.000% | 
##                                      |                         23.913% |                         28.395% |                         35.135% |                         30.000% |                         31.250% |                                 | 
##                                      |                          5.500% |                         11.500% |                          6.500% |                          3.000% |                          2.500% |                                 | 
## -------------------------------------|---------------------------------|---------------------------------|---------------------------------|---------------------------------|---------------------------------|---------------------------------|
##                    4_Etwas zufrieden |                             11  |                             24  |                             10  |                              5  |                              5  |                             55  | 
##                                      |                          0.215  |                          0.134  |                          0.003  |                          0.045  |                          0.082  |                                 | 
##                                      |                         20.000% |                         43.636% |                         18.182% |                          9.091% |                          9.091% |                         27.500% | 
##                                      |                         23.913% |                         29.630% |                         27.027% |                         25.000% |                         31.250% |                                 | 
##                                      |                          5.500% |                         12.000% |                          5.000% |                          2.500% |                          2.500% |                                 | 
## -------------------------------------|---------------------------------|---------------------------------|---------------------------------|---------------------------------|---------------------------------|---------------------------------|
##                     5_Sehr zufrieden |                              8  |                             13  |                              5  |                              1  |                              0  |                             27  | 
##                                      |                          0.516  |                          0.390  |                          0.000  |                          1.070  |                          2.160  |                                 | 
##                                      |                         29.630% |                         48.148% |                         18.519% |                          3.704% |                          0.000% |                         13.500% | 
##                                      |                         17.391% |                         16.049% |                         13.514% |                          5.000% |                          0.000% |                                 | 
##                                      |                          4.000% |                          6.500% |                          2.500% |                          0.500% |                          0.000% |                                 | 
## -------------------------------------|---------------------------------|---------------------------------|---------------------------------|---------------------------------|---------------------------------|---------------------------------|
##                         Column Total |                             46  |                             81  |                             37  |                             20  |                             16  |                            200  | 
##                                      |                         23.000% |                         40.500% |                         18.500% |                         10.000% |                          8.000% |                                 | 
## -------------------------------------|---------------------------------|---------------------------------|---------------------------------|---------------------------------|---------------------------------|---------------------------------|
## 
## 
Likert_Item_ohne_neutraler_Mitte_1<-sample(c("5_Stimme völlig zu", 
                                            "4_Stimme zu", 
                                            "3_Stimme weder zu noch nicht zu", 
                                            "2_Stimme nicht zu",
                                            "1_Stimme überhaupt nicht zu"), 
                      size=200, replace=TRUE, prob=c(0.05,0.1, 0.15, 0.3, 0.2))

Likert_Item_mit_neutraler_Mitte_2<-factor(Likert_Item_mit_neutraler_Mitte_2, labels=c(
                                            "Stimme völlig zu", 
                                            "Stimme zu", 
                                            "Stimme weder zu noch nicht zu", 
                                            "Stimme nicht zu",
                                            "Stimme überhaupt nicht zu"))


Likert_Item_ohne_neutraler_Mitte_1<-sample(c("4_Stimme völlig zu", 
                                            "3_Stimme zu", 
                                            "2_Stimme nicht zu",
                                            "1_Stimme überhaupt nicht zu"), 
                      size=200, replace=TRUE, prob=c(0.20,0.25, 0.35,  0.2))

Likert_Item_ohne_neutraler_Mitte_1<-factor(Likert_Item_ohne_neutraler_Mitte_1, labels=c(
                                            "Stimme völlig zu", 
                                            "Stimme zu", 
                                            "Stimme nicht zu",
                                            "Stimme überhaupt nicht zu"))

df_likert<-data.frame(Likert_Item_mit_neutraler_Mitte_1,Likert_Item_mit_neutraler_Mitte_2, Likert_Item_ohne_neutraler_Mitte_1)

Stellen wir nun die Daten der Items graphisch dar

Hier noch ein gutes Dokument mit Tipps (vor allem mit vielen Beispielen Wie man es nicht machen sollte)

6.1.2 Likert Plot

library(likert)

zu_plotten<-likert::likert(data.frame(factor(Likert_Item_mit_neutraler_Mitte_1)))
plot(zu_plotten,
     type="bar")
Likert Plot

Abbildung 6.2: Likert Plot

Wir können das vom Befehl likert erstellte Objekt auch mit ggplot2 weiterbearbeiten:

p<-likert::likert.bar.plot(zu_plotten)
p$labels$y<-"Prozente"
p$layers[[2]]$geom_params$width = 0.3
p$layers[[3]]$geom_params$width = 0.3
p<-p+theme_classic()
p
Likert Bar Plot

Abbildung 6.3: Likert Bar Plot

zu_plotten<-likert::likert(data.frame(Likert_Item_ohne_neutraler_Mitte_1))
plot(zu_plotten,
     type="bar")
Likert Bar Plot

Abbildung 6.4: Likert Bar Plot

Wenn wir alle Likert Items in einen Datensatz speichern, können wir alle Items auch zusammen graphisch darstellen. der likert Befehl wird die Items auch automatisch anordnen.

df_likert_script<-rio::import("df_likert_script.RData")
zu_plotten<-likert::likert(df_likert_script)
plot(zu_plotten,
     type="bar")
Likert Bar Plot.

Abbildung 6.5: Likert Bar Plot.

Übrigens: Wenn wir diesen Datensatz als .csv speichern und wieder laden, wird es nicht mehr funktionieren, da nicht bei allen Items alle Antwortsoptionen benutzt wurden.

rio::export(df_likert_script, "df_likert_script.csv")
df_likert_script<-rio::import("df_likert_script.csv")
zu_plotten2<-likert::likert(df_likert_script)
## Warning in likert::likert(df_likert_script): items parameter contains
## non-factors. Will convert to factors
## Error in likert::likert(df_likert_script): All items (columns) must have the same number of levels
plot(zu_plotten2,
     type="bar")
## Error in plot(zu_plotten2, type = "bar"): object 'zu_plotten2' not found

Wir sehen, dass R die Daten in Faktor-Variablen umwandelt, aber nicht alle Items im Datensatz haben die gleiche Länge. Das Objekt zu_plotten2 wird somit nicht erstellt (weil der Befehl wegen eines Fehlers abgebrochen wurde). Dieses Problem können wir relativ einfach beheben, indem wir die Levels und Labels vorgeben - so haben alle Items im Hintergrund die gleichen Antwortsoptionen, auch wenn bei einigen Items nicht alle Antwortsoptionen benutzt wurden:

df_likert_script<-df_likert_script %>% 
  mutate_all(factor, levels=c("Totally disagree", "Disagree", "No opinion", "Agree", "Totally Agree"))
zu_plotten3<-likert::likert(df_likert_script)
plot(zu_plotten3,
     type="bar")
Likert Bar Plot.

Abbildung 6.6: Likert Bar Plot.

6.1.3 Rating Skalen

Rating Scales bei denen jede Antwortsoption eine Beschreibung hat, werden auch Adjectival scales (Streiner, David L.; Norman, Geoffrey R.; Cairney, John. Health Measurement Scales: A practical guide to their development and use (p. 43). OUP Oxford. Kindle Edition) oder auch Verbal Rating Scale (VRS), respektive verbale Rating Skalen genannt.

Rating_Skala_1<-sample(c("4_Äusserst hilfreich",
                          "3_Sehr hilfreich",
                          "2_Etwas hilfreich",
                          "1_Nur bedingt hilfreich",
                          "0_Überhaupt nicht hilfreich"), 
                                size=200, replace=TRUE, prob=c(0.025,0.1, 0.35, 0.275,0.25))
Rating_Skala_1<-as.factor(Rating_Skala_1)

  
Rating_Skalen_Haeufigkeiten<-sample(c("nie", 
                                "kaum",
                                "selten",
                                "gering",
                                "mässig",
                                "mittel",
                                "deutlich",
                                "überwiegend",
                                "oft",
                                "grösstenteils",
                                "immer"), 
                                size=200, replace=TRUE, prob=c(0.025,0.05, 0.025, 0.175,0.25, 0.175,0.1,0.1, 0.025, 0.05,0.025))
Rating_Skalen_Haeufigkeiten<-factor(Rating_Skalen_Haeufigkeiten, labels=c(
                                "nie", 
                                "kaum",
                                "selten",
                                "gering",
                                "mässig",
                                "mittel",
                                "deutlich",
                                "überwiegend",
                                "oft",
                                "grösstenteils",
                                "immer"))

Rating_Skalen_Wahrscheinlichkeiten<-sample(c("unmöglich", 
                                        "höchst unwahrscheinlich",
                                        "unwahrscheinlich", 
                                        "eher unwahrscheinlich",
                                        "eventuell", 
                                        "vielleicht",
                                        "möglich",
                                        "eher wahrscheinlich", 
                                        "wahrscheinlich", 
                                        "höchst wahrscheinlich",
                                        "sicher"),
                                size=200, replace=TRUE, prob=c(0.025,0.05, 0.025, 0.25,0.175, 0.175,0.1,0.1, 0.025, 0.05,0.025))

Rating_Skalen_Wahrscheinlichkeiten<-factor(Rating_Skalen_Wahrscheinlichkeiten, labels=c(
                                        "unmöglich", 
                                        "höchst unwahrscheinlich",
                                        "unwahrscheinlich", 
                                        "eher unwahrscheinlich",
                                        "eventuell", 
                                        "vielleicht",
                                        "möglich",
                                        "eher wahrscheinlich", 
                                        "wahrscheinlich", 
                                        "höchst wahrscheinlich",
                                        "sicher"))

Rating_Scale_Probabilities<-sample(c("No chance, almost no chance", 
                                        "Very slight possibility",
                                        "Slight possibility", 
                                        "Some possibility",
                                        "Fair possibility",
                                        "Fairly good possibility",
                                        "Good possibility", 
                                        "Probable", 
                                        "Very probably",
                                        "Almost sure", 
                                        "Certain, practically certain"),
                                size=200, replace=TRUE, prob=c(0.025,0.05, 0.025, 0.25,0.175, 0.175,0.1,0.1, 0.025, 0.05,0.025))
# https://journals.sagepub.com/doi/abs/10.1177/147078539303500405?journalCode=mreb
Rating_Scale_Probabilities<-factor(Rating_Scale_Probabilities, labels=c(
                                          "No chance, almost no chance", 
                                        "Very slight possibility",
                                        "Slight possibility", 
                                        "Some possibility",
                                        "Fair possibility",
                                        "Fairly good possibility",
                                        "Good possibility", 
                                        "Probable", 
                                        "Very probably",
                                        "Almost sure", 
                                        "Certain, practically certain"))

Rating_Skalen_phq9_1<-sample(c("Überhaupt nicht", "An einzelnen Tagen", "An mehr als der Hälfte der Tage", "Beinahe jeden Tag"), 
                             size=200, replace=TRUE, prob=c(0.1,0.35,0.4, 0.15))

Rating_Skalen_phq9_1<-factor(Rating_Skalen_phq9_1, labels=c(
                                        "Überhaupt nicht", "An einzelnen Tagen", "An mehr als der Hälfte der Tage", "Beinahe jeden Tag"))


Rating_Skale_Schmerzintensität_6<-sample(c(
                                            "Momentan habe ich keine Schmerzen. (0)", 
                                            "Ich habe im Moment sehr geringe Schmerzen. (1)", 
                                            "Ich habe im Moment mässige Schmerzen. (2)", 
                                            "Ich habe im Moment ziemlich starke Schmerzen. (3)", 
                                            "Ich habe im Moment sehr starke Schmerzen. (4)", 
                                            "Ich habe im Moment die stärksten Schmerzen, die ich mir vorstellen kann. (5)"),
                                         size=200, replace=TRUE, prob=c(0.1,0.2,0.20,0.225,0.125,0.15))

Rating_Skale_Schmerzintensität_6<-factor(Rating_Skale_Schmerzintensität_6, labels=c(
                                            "Momentan habe ich keine Schmerzen. (0)",
                                            "Ich habe im Moment sehr geringe Schmerzen. (1)", 
                                            "Ich habe im Moment mässige Schmerzen. (2)", 
                                            "Ich habe im Moment ziemlich starke Schmerzen. (3)", 
                                            "Ich habe im Moment sehr starke Schmerzen. (4)", 
                                            "Ich habe im Moment die stärksten Schmerzen, die ich mir vorstellen kann. (5)"))

Beispiel englische Skala für Wahrscheinlichkeiten, auch Juster scale genannt. Beispiel aus: Streiner, David L.; Norman, Geoffrey R.; Cairney, John. Health Measurement Scales: A practical guide to their development and use (p. 43). OUP Oxford. Kindle Edition.

Beispiel PhQ

Beispiel Schmerzintensität 6 Optionen Neck Disability Index

6.1.4 Graphische Darstellung der Rating Skalen

Zuerst erstellen wir eine Graphik, von der eigentlich immer abgeraten wird: die Kuchengraphik (Pie-Chart, auf Deutsch oft auch Kreisdiagramm genannt).

Warum wird von der Kuchengraphik abgeraten? Weil wir nicht gut sind, Flächen zu vergleichen. Wir können besser Distanzen vergleichen. Deswegen ist eine Balkengraphik oder noch besser eine Lollipop Graphik besser.

Wenn wir mit ggplot2 arbeiten, ist es oft hilfreich, die Daten zuerst in einem neuen Dataframe zusammenzufassen. Wir tun dies relativ einfach mit den group_by und summarise Befehlen aus dem dplyr Paket

library(dplyr)
wieHilfreich = as.data.frame(Rating_Skala_1)
summary_wieHilfreich<-wieHilfreich %>% 
  group_by(Rating_Skala_1) %>% 
  dplyr::summarise(absoluteFreq=n()) %>% 
  mutate(relativeFreq = round(absoluteFreq / sum(absoluteFreq)*100))

summary_wieHilfreich$label = paste(summary_wieHilfreich$Rating_Skala_1,": ", summary_wieHilfreich$absoluteFreq," (", summary_wieHilfreich$relativeFreq,"%)", sep = "")
pie(summary_wieHilfreich$absoluteFreq, labels = summary_wieHilfreich$label, col = colors()[340+summary_wieHilfreich$absoluteFreq])
Balkengraphik

Abbildung 6.7: Balkengraphik

pie(summary_wieHilfreich$absoluteFreq, labels = summary_wieHilfreich$label, col = rainbow(nrow(summary_wieHilfreich)))
Balkengraphik

Abbildung 6.8: Balkengraphik

Wer mehr über Alternativen für Kreisdiagramme lesen möchte findet hier ein gutes Tutorial.

Hier ein Video, das uns mehr über Pie-Charts lehrt:

Die nächste Variante wäre die Balkengraphik (der Barplot)

Wir erstellen zuerst noch eine Variable mit dem Text für die Beschriftung der Balken. Hier wollen wir die absolute Häufigkeiten (die Anzahl Nennungen) und die relative Häufigkeiten (Proportionen oder Prozente) anzeigen. wir benutzen dazu den paste Befehl.

summary_wieHilfreich$label_kurz = paste(summary_wieHilfreich$absoluteFreq," (", summary_wieHilfreich$relativeFreq,"%)", sep = "")

ggplot(summary_wieHilfreich, aes(x=Rating_Skala_1, y=absoluteFreq,))+
  geom_col()+
  geom_text(aes(label = label_kurz), vjust = -0.5)+
  theme_classic()
Balkengraphik

Abbildung 6.9: Balkengraphik

Jetzt sollten wir noch die Reihenfolge der Balken ändern (und wir können auch noch die Beschriftungen der Achsen ändern):

summary_wieHilfreich %>% 
  mutate(Rating_Skala_1 = forcats::fct_reorder(Rating_Skala_1, desc(relativeFreq))) %>%
ggplot(aes(x=Rating_Skala_1, y=absoluteFreq,))+
  geom_col(width=0.5)+
  geom_text(aes(label = label_kurz), vjust = -0.5)+
  theme_classic()+
  scale_y_continuous(breaks=seq(0,100,10), limits=c(0,100))+ 
labs(y="Prozente", x="Item Rating Skala 1")+
    theme(axis.title.x = element_text(margin = margin(t = 10, r = 0, b = 5, l = 0)))+
    theme(axis.title.y = element_text(margin = margin(t = 0, r = 0, b = 0, l = 5)))
Balkengraphik

Abbildung 6.10: Balkengraphik

Noch besser ist die Graphik, wenn wir sie umdrehen. So sind die Labels der Balken besser zu lesen.

summary_wieHilfreich %>% 
  mutate(Rating_Skala_1 = forcats::fct_reorder(Rating_Skala_1, desc(relativeFreq))) %>%
ggplot(aes(x=Rating_Skala_1, y=absoluteFreq,))+
  geom_col(width=0.5)+
  geom_text(aes(label = label_kurz), hjust = -0.1)+
  theme_classic()+
  scale_y_continuous(breaks=seq(0,100,10), limits=c(0,100))+ 
labs(y="Absolute Häufigkeit", x="Item Rating Skala 1")+
    theme(axis.title.x = element_text(margin = margin(t = 10, r = 0, b = 10, l = 0)))+
    theme(axis.title.y = element_text(margin = margin(t = 0, r = 10, b = 0, l = 5)))+
  coord_flip()
Balkengraphik

Abbildung 6.11: Balkengraphik

Oder wir geben einen Titel und lassen dafür die Beschriftung der horizontalen Achse weg. Natürlich können wir auch noch die Farben ändern.

summary_wieHilfreich %>% 
  mutate(Rating_Skala_1 = forcats::fct_reorder(Rating_Skala_1, desc(relativeFreq))) %>%
ggplot(aes(x=Rating_Skala_1, y=absoluteFreq,fill=absoluteFreq))+
  geom_col(width=0.5)+
  geom_text(aes(label = label_kurz), hjust = -0.1)+
  theme_classic()+
  scale_y_continuous(breaks=seq(0,100,10), limits=c(0,100))+ 
labs(y="Absolute Häufigkeit", x="",title="Item Rating Skala 1")+
    theme(axis.title.x = element_text(margin = margin(t = 10, r = 0, b = 10, l = 0)))+
    theme(axis.title.y = element_text(margin = margin(t = 0, r = 10, b = 0, l = 5)))+
    theme(legend.position="none")+
  coord_flip()
Balkengraphik

Abbildung 6.12: Balkengraphik

6.1.5 Lollipop als alternative zum Balkendiagramm

Das Verhältnis Tinte zu Inhalt sollte möglichst klein sein (d.h. mehr Inhalt als Tinte). Balkendiagramme brauchen relativ viel Tinte, deshalt wird oft die Lollipop oder die Dot-Graphik empfohlen.

Lollipop Graphik:

summary_wieHilfreich %>% 
  mutate(Rating_Skala_1 = forcats::fct_reorder(Rating_Skala_1, desc(relativeFreq))) %>%
ggplot(aes(x=Rating_Skala_1, y=absoluteFreq,colour=absoluteFreq))+
    geom_point(size=5) + 
    geom_segment(aes(x=Rating_Skala_1, 
                   xend=Rating_Skala_1, 
                   y=0, 
                   yend=absoluteFreq), size=1.8) + 
  geom_text(aes(label = label_kurz), hjust = -0.3)+
  theme_classic()+
  scale_y_continuous(breaks=seq(0,100,10), limits=c(0,100))+ 
labs(y="Absolute Häufigkeit", x="",title="Item Rating Skala 1")+
    theme(axis.title.x = element_text(margin = margin(t = 10, r = 0, b = 10, l = 0)))+
    theme(axis.title.y = element_text(margin = margin(t = 0, r = 10, b = 0, l = 5)))+
  theme(legend.position="none")+
  coord_flip()
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
Lollipop Graphik

Abbildung 6.13: Lollipop Graphik

Dot Plot:

summary_wieHilfreich %>% 
  mutate(Rating_Skala_1 = forcats::fct_reorder(Rating_Skala_1, desc(relativeFreq))) %>%
ggplot(aes(x=Rating_Skala_1, y=absoluteFreq,colour=absoluteFreq))+
    geom_point(size=5) + 
  geom_segment(aes(x=Rating_Skala_1, 
                   xend=Rating_Skala_1, 
                   y=min(absoluteFreq), 
                   yend=max(absoluteFreq)), 
               linetype="dashed", 
               size=0.7) +    
  geom_text(aes(label = label_kurz), vjust=-0.6,hjust = -0.2)+
  theme_classic()+
  scale_y_continuous(breaks=seq(0,100,10), limits=c(0,100))+ 
labs(y="Absolute Häufigkeit", x="",title="Item Rating Skala 1")+
    theme(axis.title.x = element_text(margin = margin(t = 10, r = 0, b = 10, l = 0)))+
    theme(axis.title.y = element_text(margin = margin(t = 0, r = 10, b = 0, l = 5)))+
  theme(legend.position="none")+
  coord_flip()
Dot Plot

Abbildung 6.14: Dot Plot

Die Antwortskategorien können auch in einem Balken gestapelst (stacked) werden.

Wir können dies entweder mit den Rohdaten tun, oder mit den zusammengefassten daten. Hier zuerst mit den Rohdaten:

p<-ggplot(wieHilfreich, aes(x='', fill=Rating_Skala_1))+
  geom_bar(position="fill")+
  labs(x="Rating Skala 1", y="Relative Häufigkeiten")+
  scale_fill_discrete(name = "Antwortsoptionen")
p
Gestapelte Balkengraphik

Abbildung 6.15: Gestapelte Balkengraphik

Mit Beschriftung der Häufigkeiten:

p<-p+  stat_count(geom = "text", 
             aes(label = stat(count)),
             position="fill", colour="#696969",vjust=0.5)
p
## Warning: `stat(count)` was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(count)` instead.
Gestapelte Balkengraphik

Abbildung 6.16: Gestapelte Balkengraphik

Hier mit den zusammgengefassten Daten

summary_wieHilfreich$label_kurz_2Zeilen = paste(summary_wieHilfreich$absoluteFreq,"\n", " (", summary_wieHilfreich$relativeFreq,"%)", sep = "")

summary_wieHilfreich %>% 
  mutate(Rating_Skala_1 = forcats::fct_reorder(Rating_Skala_1, desc(relativeFreq))) %>% 
ggplot(aes(x='',y=relativeFreq, fill=Rating_Skala_1))+
  geom_col(stat='identity')+
  coord_flip()+
  labs(x="Rating Skala 1", y="Relative Häufigkeiten")+
  scale_fill_discrete(name = "Antwortsoptionen")+
  geom_text(aes(label = label_kurz_2Zeilen),
                  position = position_stack(vjust = .5))+
  theme_classic()+
labs(y="Absolute Häufigkeit", x="",title="Item Rating Skala 1")+
    theme(axis.title.x = element_text(margin = margin(t = 10, r = 0, b = 10, l = 0)))+
    theme(axis.title.y = element_text(margin = margin(t = 0, r = 10, b = 0, l = 5)))+
  coord_flip()
## Warning in geom_col(stat = "identity"): Ignoring unknown parameters: `stat`
## Coordinate system already present. Adding new coordinate system, which will
## replace the existing one.
Gestapelte Balkengraphik

Abbildung 6.17: Gestapelte Balkengraphik

Jetzt müssen wir noch die Beschriftung besser anordnen. Dies können wir tun, indem wir anstatt geom_text geom_text_repel vom Paket ggrepel benutzen.

library(ggrepel)
summary_wieHilfreich %>% 
  mutate(Rating_Skala_1 = forcats::fct_reorder(Rating_Skala_1, desc(relativeFreq))) %>% 
ggplot(aes(x='',y=relativeFreq, fill=Rating_Skala_1))+
  geom_col(stat='identity')+
  labs(x="Rating Skala 1", y="Relative Häufigkeiten")+
  scale_fill_discrete(name = "Antwortsoptionen")+
  geom_text_repel(aes(label = label_kurz_2Zeilen),
                  position = position_stack(vjust = 0.5))+
  theme_classic()+
labs(y="Absolute Häufigkeit", x="",title="Item Rating Skala 1")+
    theme(axis.title.x = element_text(margin = margin(t = 10, r = 0, b = 10, l = 0)))+
    theme(axis.title.y = element_text(margin = margin(t = 0, r = 10, b = 0, l = 5)))+
  coord_flip()
## Warning in geom_col(stat = "identity"): Ignoring unknown parameters: `stat`
Gestapelte Balkengraphik

Abbildung 6.18: Gestapelte Balkengraphik

ggrepel positioniert hier die Zahlen etwas komisch. Ich fand jedoch dafür noch keine Lösung.

Hier finden Sie noch mehr Tipps

6.1.6 Rating Skalen bei denen nicht mehr jede Kategorie beschrieben ist

Rating_Skala_Anker_Mitte_FABQ<-sample(c(
                                        "vollständig nichteinverstanden (0)", 
                                        "1", 
                                        "2", 
                                        "Ich weiss nicht (3)", 
                                        "4", 
                                        "5", 
                                        "vollständig einverstanden (6)"), 
                             size=200, replace=TRUE, prob=c(0.1,0.2,0.10,0.125,0.125,0.2, 0.15))

Beispiel FABQ

6.1.7 Numeric Rating Scales

Bei den Numeric Rating Scales werden nur noch die Anker beschrieben. Diese Item-Typen werden oft schon wie intervallskalierte Daten analysiert.

Numeric_Rating_Scale_NoPain0_PainAsBadAsItCouldBe10<-rnorm(100, 5,2.2)
Numeric_Rating_Scale_NoPain0_PainAsBadAsItCouldBe10<-ifelse(Numeric_Rating_Scale_NoPain0_PainAsBadAsItCouldBe10<0,0,Numeric_Rating_Scale_NoPain0_PainAsBadAsItCouldBe10)
Numeric_Rating_Scale_NoPain0_PainAsBadAsItCouldBe10<-ifelse(Numeric_Rating_Scale_NoPain0_PainAsBadAsItCouldBe10>10,10,Numeric_Rating_Scale_NoPain0_PainAsBadAsItCouldBe10)

Für mehr Beispiele zur Erfassung der Schmerzintensität, siehe diesen Artikel hier (klicken Sie hier).

6.1.8 Gruppieren, wenn eine Kategorie nicht benutzt wird

Stellen wir uns vor, wir hätten eine Variable mit vier Antwortskategorien. Eine Kategorie hat jedoch die Häufigkeit 0. Wenn wir nun nach dieser Variable gruppieren, wir die Kategorie mit der Häufigkeit 0 nicht benutzt und daher erscheint diese Kategorie nicht auf der Graphik.

Für dieses Beispiel benutzen wir die Clinical Frailty Scale, Sie finden einen Artikel dazu.

set.seed(12345)
Clinical_Frailty_Scale <-sample(1:5,size=100, replace=TRUE, prob=c(0.8, 0.1, 0.05, 0.05, 0))
Anzahl_Stürze<-sample(1:5, size=100, replace=TRUE, prob=c(0.8, 0.1, 0.05, 0.03, 0.02))
data<-data.frame(Clinical_Frailty_Scale,Anzahl_Stürze ) %>% 
  mutate(Clinical_Frailty_Scale=factor(Clinical_Frailty_Scale, levels=1:5, labels=c("Sehr fit", "Durschnittlich aktiv", "Gut zurechtkommend", "Vulnerabel", "Geringgradig frail")))
  

summary_falls<-data %>% 
  group_by(Clinical_Frailty_Scale) %>% 
  summarise(n=n()) %>% 
  mutate(Prozente=n / sum(n))

ggplot(summary_falls, aes(x=Clinical_Frailty_Scale, y=n))+
  geom_col(stat="identity", fill="#E187F0")+
  theme_classic()+
  coord_flip()
## Warning in geom_col(stat = "identity", fill = "#E187F0"): Ignoring unknown
## parameters: `stat`
Balkengraphik

Abbildung 6.19: Balkengraphik

Wir sehen, dass die fünfte Kategorie “Geingradig frail” nicht vorkommt, weil die Häufigkeit der Arbeiten Null ist.

Wenn wir die Kategorien mit der Antwortsfrequenz Null in der Graphik (d.h. auf der Achsenbeschreibung) behalten möchten, können wir beim group_by Befehl die Option .drop=FALSE anfügen.

Hier unten sehen wir nun, dass die fünfte Kategorie auf der Achse auch angegeben ist.

summary_falls<-data %>% 
  group_by(Clinical_Frailty_Scale, .drop=FALSE) %>% 
  summarise(n=n()) %>% 
  mutate(Prozente=n / sum(n))

ggplot(summary_falls, aes(x=Clinical_Frailty_Scale, y=n))+
  geom_col(stat="identity", fill="#E187F0")+
  theme_classic()+
  coord_flip()
## Warning in geom_col(stat = "identity", fill = "#E187F0"): Ignoring unknown
## parameters: `stat`
Balkengraphik

Abbildung 6.20: Balkengraphik

6.2 Mosaik-Plot

library(ggplot2)
library(ggmosaic)

data2<-data %>% 
  mutate(Anzahl_Stürze=round((1+as.numeric(Clinical_Frailty_Scale)/2)*Anzahl_Stürze)) %>% 
  mutate_all(., factor)
ggplot(data = data2) +
  geom_mosaic(aes(x = product(Anzahl_Stürze, Clinical_Frailty_Scale), fill=Clinical_Frailty_Scale))
## Warning: `unite_()` was deprecated in tidyr 1.2.0.
## ℹ Please use `unite()` instead.
## ℹ The deprecated feature was likely used in the ggmosaic package.
##   Please report the issue at <]8;;https://github.com/haleyjeppson/ggmosaichttps://github.com/haleyjeppson/ggmosaic]8;;>.
Mosaikgraphik

Abbildung 6.21: Mosaikgraphik

Ende des Kapitels