In diesem Abschnitt soll ein neuer Datensatz betrachtet werden. Der
Datensatz msleep
behandelt das Schlafverhalten von
Säugetieren und liegt uns als Excel-Datei vor. Für mehr Information
tippen Sie wie gewohnt ?msleep
.
library(tidyverse)
Registered S3 methods overwritten by 'dbplyr':
method from
print.tbl_lazy
print.tbl_sql
── Attaching packages ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse 1.3.2 ──✔ ggplot2 3.3.6 ✔ purrr 0.3.4
✔ tibble 3.1.8 ✔ dplyr 1.0.10
✔ tidyr 1.2.1 ✔ stringr 1.4.1
✔ readr 2.1.3 ✔ forcats 0.5.2 ── Conflicts ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag() masks stats::lag()
msleep.xlsx
aus Moodle als
tibble
msleep
in R ein. Schaffen Sie sich
einen Überblick über den Datensatz.sleep_total
und vore
. Betrachten Sie auch die
Gruppierung von sleep_total
nach vore
. Was
fällt Ihnen auf?awake
im
Bezug auf vore
. Entspricht die Verteilung Ihrer Erwartung
im Vergleich zu dem sleep_total
?awake
und
sleep_total
grafisch dar. Was stellen Sie fest?geom_violin()
mit
geom_histogram()
, welches Facetten benutzt, um Gruppen
darzustellen, und geom_freqpoly()
, welches für jede Gruppe
Farben einfügt. Verwenden Sie hierfür erneut die Variablen
awake
und vore
.vore
und
conservation
gemeinsam dar.
Verwenden Sie hierfür zwei verschiedene Darstellungsarten.
Welche Kombination tritt am häufigsten/seltensten auf?
Ändern Sie die Farben des Gradienten der vorherigen Grafik mit
Hilfe von
scale_fill_gradient(low = farbe1, high = farbe2)
.
vore
,
brainwt
und bodywt
dar.msleep.xlsx
aus Moodle als tibble
msleep
in R ein. Schaffen Sie sich einen Überblick über den
Datensatz.Der Endung entsprechend handelt es sich um eine Excel-Datei, d. h.
wir benötigen die readxl
Bibliothek:
library(readxl)
<- read_excel("../resources/msleep.xlsx") # Der Pfad muss individuell angepasst werden
msleep msleep
Passen Sie auf, dass Sie Ihren Pfad zu der Datei bringen.
Ansonsten sehen wir, dass der Datensatz scheinbar direkt korrekt (als
tibble
) eingelesen wurde (Datentypen/Header stimmen).
Für einen Überblick der Variablen können wir zusätzlich
summary()
nutzen:
summary(msleep)
name genus vore order conservation sleep_total sleep_rem sleep_cycle awake
Length:83 Length:83 Length:83 Length:83 Length:83 Min. : 1.90 Min. :0.100 Min. :0.1167 Min. : 4.10
Class :character Class :character Class :character Class :character Class :character 1st Qu.: 7.85 1st Qu.:0.900 1st Qu.:0.1833 1st Qu.:10.25
Mode :character Mode :character Mode :character Mode :character Mode :character Median :10.10 Median :1.500 Median :0.3333 Median :13.90
Mean :10.43 Mean :1.875 Mean :0.4396 Mean :13.57
3rd Qu.:13.75 3rd Qu.:2.400 3rd Qu.:0.5792 3rd Qu.:16.15
Max. :19.90 Max. :6.600 Max. :1.5000 Max. :22.10
NA's :22 NA's :51
brainwt bodywt
Min. :0.00014 Min. : 0.005
1st Qu.:0.00290 1st Qu.: 0.174
Median :0.01240 Median : 1.670
Mean :0.28158 Mean : 166.136
3rd Qu.:0.12550 3rd Qu.: 41.750
Max. :5.71200 Max. :6654.000
NA's :27
Beachten Sie, dass die ersten 5 Spalten keine Faktoren sind, sodass hier keine Häufigkeiten einzusehen sind.
Um Faktoren zu erstellen, muss jede Spalte umgewandelt werden:
<- msleep %>%
msleep mutate(genus = factor(genus),
vore = factor(vore),
order = factor(order),
conservation = factor(conservation))
summary(msleep)
name genus vore order conservation sleep_total sleep_rem sleep_cycle awake brainwt
Length:83 Panthera : 3 carni :19 Rodentia :22 cd : 2 Min. : 1.90 Min. :0.100 Min. :0.1167 Min. : 4.10 Min. :0.00014
Class :character Spermophilus: 3 herbi :32 Carnivora :12 domesticated:10 1st Qu.: 7.85 1st Qu.:0.900 1st Qu.:0.1833 1st Qu.:10.25 1st Qu.:0.00290
Mode :character Equus : 2 insecti: 5 Primates :12 en : 4 Median :10.10 Median :1.500 Median :0.3333 Median :13.90 Median :0.01240
Vulpes : 2 omni :20 Artiodactyla: 6 lc :27 Mean :10.43 Mean :1.875 Mean :0.4396 Mean :13.57 Mean :0.28158
Acinonyx : 1 NA's : 7 Soricomorpha: 5 nt : 4 3rd Qu.:13.75 3rd Qu.:2.400 3rd Qu.:0.5792 3rd Qu.:16.15 3rd Qu.:0.12550
Aotus : 1 Cetacea : 3 vu : 7 Max. :19.90 Max. :6.600 Max. :1.5000 Max. :22.10 Max. :5.71200
(Other) :71 (Other) :23 NA's :29 NA's :22 NA's :51 NA's :27
bodywt
Min. : 0.005
1st Qu.: 0.174
Median : 1.670
Mean : 166.136
3rd Qu.: 41.750
Max. :6654.000
Warum mag es wenig Sinn ergeben, aus name
einen Faktor
zu machen?
sleep_total
und
vore
. Betrachten Sie auch die Gruppierung von
sleep_total
nach vore
. Was fällt Ihnen
auf?Für die Darstellung der Verteilung von quantitativen Daten steht der Boxplot und das Histogramm zur Verfügung:
<- ggplot(msleep)
msleep_graph # Boxplot und Histogramm für alle Werte
+ geom_boxplot(aes(y = sleep_total)) msleep_graph
+ geom_histogram(aes(x = sleep_total), bins = 20) msleep_graph
Der Median liegt bei 10 Stunden Schlaf und der Großteil der Daten liegt zwischen ~8 Stunden und ~14 Stunden Schlaf.
Für das Histogramm lohnt es sich, unterschiedliche Werte für die
Anzahl der Klassen (bins
) zu testen. Hier sehen wir
Höhepunkte um 10 Stunden, aber auch um 14 Stunden und 2 Stunden.
Für kategorische Variablen verwenden wir Balkendiagramme:
+ geom_bar(aes(x = vore)) msleep_graph
Die meisten Tiere scheinen Herbivore zu sein.
Um für jede dieser Tierklassen den Gesamtschlaf zu betrachten, lassen sich Histogramm oder Boxplot entsprechend anpassen:
# Histogramm aufgeteilt nach Essverhalten
+
msleep_graph geom_histogram(aes(x = sleep_total, fill = vore), bins = 10) +
geom_freqpoly(aes(x = sleep_total, color = vore), bins = 10)
# Die Verteilung für jede Tierklasse separat:
+
msleep_graph geom_freqpoly(aes(x = sleep_total, color = vore), bins = 10)
# Beides zusammen:
+
msleep_graph geom_histogram(aes(x = sleep_total), bins = 10) +
geom_freqpoly(aes(x = sleep_total, color = vore), bins = 10)
# Boxplots:
+
msleep_graph geom_boxplot(aes(x = vore, y = sleep_total))
Aus dem Muster von geom_freqpoly()
können wir direkt
einsehen, dass der Großteil der Omnivoren um 10 Stunden Schlaf braucht
(mit ein paar Ausnahme bei ~16 Stunden), Herbivore um 4 Stunden oder 14
Stunden Schlaf benötigen, Insektivore um 6 Stunden und um 20 Stunden
Schlaf benötigen und bei Karnivoren die Verteilung relativ weit
gestreckt ist.
Um die Verteilungen direkt vergleichen zu können, lohnt es sich,
facets
zu erstellen:
+
msleep_graph geom_freqpoly(aes(x = sleep_total), bins = 10) +
facet_wrap(~ vore)
Sie sehen bereits, dass Sie aus den Daten direkt Fragen ableiten können:
Warum schlafen die meisten Omnivore so konsequent um 10 Stunden? Was ist mit denen, die sehr viel mehr schlafen (rechts unten)?
Wieso gibt es zwei Höhepunkte bei Herbivoren und Insektivoren? Warum schlafen einige sehr viel und andere sehr wenig?
Wo liegen die Unterschiede zwischen diesen Gruppen? Wer sind die “Ausreißer” bzw. untypischen Datenpunkte?
Hat die Art, auf die Essen erlangt wird, einen Einfluss auf den Schlaf?
Was sind die NAs
?
…
awake
im Bezug auf
vore
. Entspricht die Verteilung Ihrer Erwartung im
Vergleich zu dem sleep_total
?+
msleep_graph geom_freqpoly(aes(x = awake), bins = 10) +
facet_wrap(~ vore)
+
msleep_graph geom_freqpoly(aes(x = sleep_total), bins = 10) +
facet_wrap(~ vore)
Die Grafik entspricht lediglich einer Verschiebung! Das liegt daran,
dass sich awake
und sleep_total
am Tag zu 24
Stunden addieren müssen (Schlafzeit am Tag + “Wachzeit”).
awake
und sleep_total
grafisch dar. Was stellen Sie fest?+
msleep_graph geom_point(aes(x = sleep_total, y = awake))
Ein perfekter Zusammenhang! Je länger man schläft, desto weniger ist
man wach. Das ist keine neue Kenntnis. Allerdings scheinen
awake
und total_sleep
grafisch erst einmal zu
passen:
%>%
msleep mutate(zeit_gesamt = awake + sleep_total) %>%
filter(zeit_gesamt != 24)
Es gibt zwei Einträge, wo die Summe der beiden Zeitdauern nicht 24 sind. Das könnte durch Rundungsungenauigkeiten passiert sein.
Bei den kleinen Unterschieden scheinen die Einträge vermutlich keine groben Ausreißer zu sein.
geom_violin()
mit geom_histogram()
, welches
Facetten benutzt, um Gruppen darzustellen, und
geom_freqpoly()
, welches für jede Gruppe Farben einfügt.
Verwenden Sie hierfür erneut die Variablen awake
und
vore
.+
msleep_graph geom_histogram(aes(awake), bins = 10) +
facet_wrap(~ vore)
+
msleep_graph geom_freqpoly(aes(awake, color = vore), bins = 10)
+
msleep_graph geom_violin(aes(x = vore, y = awake))
Durch das Histogramm mit facets
können die Verteilungen
direkt verglichen werden. Bei der Liniengrafik mit den Farben sind die
Verteilungen teilweise etwas schwerer auseinanderzuhalten. Es ist
möglich, allerdings könnten sich hier unter Umständen auch
facets
anbieten.
Die Violinengrafik ist eine weitere interessante Darstellung, welche dem Boxplot ähnelt. Diese lässt direkt vergleichen, wo welche Kategorie häufiger (oder seltener) auftreten, indem die Breiten variieren. Zum Beispiel scheinen Omnivore meist etwa ~15 Stunden wach zu sein. Im Gegensatz zu Boxplots sind hier jedoch keine statistischen Maßzahlen zu sehen (sondern Dichten).
vore
und conservation
gemeinsam
dar.Zunächst könnte sich ein Balkendiagramm anbieten, wobei zwei
Kategorien durch Verschiebung (mit position
) oder Stapelung
dargestellt werden:
+
msleep_graph geom_bar(aes(vore, fill = conservation))
+
msleep_graph geom_bar(aes(vore, fill = conservation), position = "dodge")
Die Verschiebung bietet sich insbesondere an, um die Kategorien innerhalb zu vergleichen. Die Stapelung bietet sich insbesondere an, um die Kategorien zwischeneinander zu vergleichen.
Andere Möglichkeiten zeigen die Häufigkeiten durch
geom_count()
oder geom_tile()
an:
+
msleep_graph geom_count(aes(x = vore, y = conservation))
%>%
msleep count(vore, conservation) %>%
ggplot() +
geom_tile(mapping = aes(x = vore, y = conservation, fill = n))
%>%
msleep count(vore, conservation) %>%
filter(n == max(n) | n == min(n))
scale_fill_gradient(low = farbe1, high = farbe2)
.%>%
msleep count(vore, conservation) %>%
ggplot() +
geom_tile(mapping = aes(x = vore, y = conservation, fill = n)) +
scale_fill_gradient(low = "blue", high = "red")
vore
, brainwt
und
bodywt
dar.Hierzu gibt es wieder mehrere Möglichkeiten. Da es sich um zwei kontinuierliche und eine kategorische Variable handelt, mag beispielsweise ein Streudiagramm für den Zusammenhang sinnvoll sein:
+
msleep_graph geom_point(aes(x = bodywt, y = brainwt, color = vore))
+
msleep_graph geom_point(aes(x = bodywt, y = brainwt)) +
facet_wrap(~ vore)
Bedauerlicherweise scheinen zwei Punkte besonders hohe Werte bei
bodywt
aufzuweisen und bei 27 Einträgen fehlen Werte.
Zuerst sollten wir schauen, ob die hohen Werte tatsächlich korrekt sind oder Messfehler:
%>%
msleep filter(bodywt > 2000)
Wir sehen, dass es sich bei den Einträgen um Elephanten handelt. Es ist also nicht verwunderlich, dass diese wesentlich mehr wiegen.
Selbst nach dem Entfernen der Punkte scheint die Skalierung nicht vorteilhaft:
%>%
msleep filter(bodywt < 2000) %>%
ggplot() +
geom_point(aes(x = bodywt, y = brainwt)) +
facet_wrap(~ vore)
Um die Punkte besser einzusehen, könnte es sich lohnen, de Achsen
anders zu skalieren und geom_jitter()
zu verwenden:
%>%
msleep filter(bodywt < 2000) %>%
ggplot(aes(x = log2(bodywt), y = log2(brainwt))) +
geom_jitter() +
facet_wrap(~ vore)