Ein Einzelhändler registriert für einen Exklusivartikel im Verlauf von \(30\) Verkaufstagen folgende Verkaufszahlen:
Tag
1
2
3
4
5
6
7
8
9
10
Anzahl
5
2
3
0
0
1
3
6
0
2
Tag
11
12
13
14
15
16
17
18
19
20
Anzahl
1
0
1
0
2
3
5
1
0
0
Tag
21
22
23
24
25
26
27
28
29
30
Anzahl
3
5
3
1
0
0
0
6
3
1
Berechnen Sie die absoluten und relativen Häufigkeiten der Ausprägungen sowie die absolute kumulierte Häufigkeit für \(x=4\), zuerst händisch, dann mit R.
Erstellen Sie das Histogramm mithilfe der absoluten Häufigkeiten und zwar sowohl mit Bleistift und Papier als auch mit R.
Für diese Aufgabe benötigen Sie den Datensatz flights aus dem Paket nycflights23, das Sie entweder über RStudio oder mit Hilfe des Pakets pacman und der Funktion p_load() installieren müssen.
Nutzen Sie konsequent den Pipe-Operator!
Wie viele Flüge enthält der Datensatz insgesamt?
An welchem Tag gab es die größte Verspätung beim Abflug?
Sind mehr Flüge zu früh abgeflogen und zu spät angekommen oder zu spät abgeflogen und zu früh angekommen?
Wie viele der Flüge sind exakt pünktlich abgeflogen und angekommen? Wieviel Prozent aller Flüge entspricht das?
In der Datei umfrage2024.csv finden Sie Daten zu einer (fiktive) Umfrage. Ziel der Aufgabe ist es die Merkmale aufzuarbeiten, das heißt Einträge der Merkmale mit Hilfe der Funktion mutate() zu ändern. Nutzen Sie bitte konsequent die Pipe, die Funktion across() sowie die tidyselect-Funktionen.
Lesen Sie die Datei umfrage2024.csv mit Hilfe von Import Dataset >> From Text (readr) ein und verschaffen Sie sich einen Überblick über die Daten. Achten Sie beim Einlesen auf den Merkmalsnamen und den Separator.
Vereinheitlichen Sie die Groß- und Kleinschreibung in den Merkmalsnamen (letzten beiden Merkmale!).
Löschen Sie alle Beobachtungen, die irgendwo ein NA haben, sowie alle Beobachtungen bei denen das Alter kleiner als 18 oder größer als 30 ist.
Ändern sie bei den ersten drei Fragen (in einer Funktion!) die logischen Werte TRUE und FALSE zu ja und nein ab.
Die nächsten fünf Merkmale haben die Ausprägungen 1, 2, 3, 4, 5. Ändern Sie diese so, dass die Ausprägungen von 0 bis 4 gehen, indem überall die Ausprägung um 1 erniedrigt wird.
Die mit invers gekennzeichneten Merkmale sollen nun so von Ihnen verändert werden, dass die Numerierung umgekehrt wird, also 0 zu 4, 1 zu 3, 2 zu 2, 3 zu 1 und 4 zu 0. Überlegen Sie sich zuerst welche mathematische Funktion man dafür benötigt.
Das Geschlecht ist mit Zahlen kodiert. Ändern Sie diese so ab, dass 0 zu weiblich, 1 zu maennlich und 2 zu divers wird. Tipp: Nutzen Sie die Funktion case_when().
Machen Sie aus den ja/nein-Fragen, sowie dem Geschlecht und der Gruppe jeweils einen Faktor.
Schreiben Sie nun alle Änderungen, die Sie im Laufe der Aufgabe gemacht haben (mit Ausname des Einlesens), zusammenfassend in eine Zuweisung, so dass alle Schritte in Einem gemacht werden! Bemerkung: So könnte dann ein fertiges Skript aussehen, das Rohdaten einliest und konvertiert!
Nutzen sie zu guter Letzt die Funktion summary() um die Unterschiede des Datensatzes vom Anfang und zum Ende der Analyse zu sehen. Welchen Vorteil haben die Faktoren?
Lösung
library(pacman)p_load(tidyverse)# Einlesen erzeugt den Code:umfrage2024 <-read_delim("umfrage2024.csv", delim =";", escape_double =FALSE, trim_ws =TRUE)# wobei statt "umfrage2024.csv" da auch der Pfad zu der Datei stehen kann.
Bemerkung: Bei den folgenden Aufgabenteilen stehen die runden Klammern um den Ausdruck, damit nicht nur eine Zuweisung erfolgt, sondern das entehende Objekt auch ausgegeben wird.
# A tibble: 44 × 11
Frage01_log Frage02_log Frage03_log Frage04_num_invers Frage05_num_invers
<chr> <chr> <chr> <dbl> <dbl>
1 ja nein nein 0 2
2 nein ja ja 3 1
3 ja nein nein 2 3
4 nein ja ja 0 4
5 ja ja ja 0 1
6 nein nein ja 1 3
7 ja nein nein 2 0
8 ja nein nein 2 3
9 ja nein nein 1 3
10 nein nein ja 0 0
# ℹ 34 more rows
# ℹ 6 more variables: Frage06_num <dbl>, Frage07_num <dbl>,
# Frage08_num_invers <dbl>, Frage09_geschlecht <dbl>, Frage10_gruppe <chr>,
# Frage11_alter <dbl>
umfrage7 <- umfrage6 |>mutate(across(Frage09_geschlecht, \(x) case_when(x ==0~"weiblich", x ==1~"maennlich", x ==2~"divers")))# sinnvollen Teil ansehen:umfrage7 |>select(Frage09_geschlecht)
# A tibble: 44 × 11
Frage01_log Frage02_log Frage03_log Frage04_num_invers Frage05_num_invers
<fct> <fct> <fct> <dbl> <dbl>
1 ja nein nein 0 2
2 nein ja ja 3 1
3 ja nein nein 2 3
4 nein ja ja 0 4
5 ja ja ja 0 1
6 nein nein ja 1 3
7 ja nein nein 2 0
8 ja nein nein 2 3
9 ja nein nein 1 3
10 nein nein ja 0 0
# ℹ 34 more rows
# ℹ 6 more variables: Frage06_num <dbl>, Frage07_num <dbl>,
# Frage08_num_invers <dbl>, Frage09_geschlecht <fct>, Frage10_gruppe <fct>,
# Frage11_alter <dbl>
summary(umfrage2024)
Frage01_log Frage02_log Frage03_log Frage04_num_invers
Mode :logical Mode :logical Mode :logical Min. :1.00
FALSE:23 FALSE:29 FALSE:21 1st Qu.:3.00
TRUE :26 TRUE :19 TRUE :29 Median :4.00
NAs :1 NAs :2 Mean :3.58
3rd Qu.:5.00
Max. :5.00
Frage05_num_invers Frage06_num Frage07_num Frage08_num_invers
Min. :1.00 Min. :1.00 Min. :1.00 Min. :2.00
1st Qu.:2.00 1st Qu.:1.25 1st Qu.:1.00 1st Qu.:3.00
Median :3.50 Median :2.50 Median :2.00 Median :4.00
Mean :3.44 Mean :2.52 Mean :2.62 Mean :3.70
3rd Qu.:5.00 3rd Qu.:3.00 3rd Qu.:4.00 3rd Qu.:4.75
Max. :5.00 Max. :5.00 Max. :5.00 Max. :5.00
Frage09_geschlecht Frage10_GRUPPE Frage11_ALTER
Min. :0.00 Length :50 Min. :14.0
1st Qu.:0.00 N.unique : 2 1st Qu.:20.0
Median :1.00 N.blank : 0 Median :22.0
Mean :0.56 Min.nchar: 1 Mean :24.3
3rd Qu.:1.00 Max.nchar: 1 3rd Qu.:25.0
Max. :2.00 Max. :83.0
summary(umfrageEnde)
Frage01_log Frage02_log Frage03_log Frage04_num_invers Frage05_num_invers
ja :21 ja :16 ja :25 Min. :0.000 Min. :0.000
nein:23 nein:28 nein:19 1st Qu.:0.000 1st Qu.:0.000
Median :1.000 Median :1.500
Mean :1.409 Mean :1.568
3rd Qu.:2.250 3rd Qu.:3.000
Max. :4.000 Max. :4.000
Frage06_num Frage07_num Frage08_num_invers Frage09_geschlecht
Min. :0.000 Min. :0.000 Min. :0.000 divers : 1
1st Qu.:0.000 1st Qu.:0.000 1st Qu.:0.750 maennlich:23
Median :1.500 Median :1.000 Median :1.000 weiblich :20
Mean :1.477 Mean :1.659 Mean :1.295
3rd Qu.:2.000 3rd Qu.:3.000 3rd Qu.:2.000
Max. :4.000 Max. :4.000 Max. :3.000
Frage10_gruppe Frage11_alter
A:22 Min. :19.00
B:22 1st Qu.:20.00
Median :22.00
Mean :22.48
3rd Qu.:24.25
Max. :28.00
Erläutern Sie in wenigen Sätzen den konzeptionellen Aufbau einer ggplot-Grafik. Ihre Erklärung könnte die Stichworte Daten(tabelle), Merkmale, Beobachtungen, +, Mapping / Aesthetics, geometrische Funktion, Schichten / Layer enthalten.
Es wurden sechs Grafiken mit ggplot erstellt wurden. Geben Sie für die dargestellten Merkmale sinnvolle Skalenniveaus an, sowie die verwendeten geometrischen Funktionen. Nicht jede Graphik zeigt drei Merkmale! Markieren Sie, wenn ein Merkmal nicht benötigt wird (z.B. durch ein X in der jeweiligen Zelle).
Welches Paket kann man nutzen um die Grafiken in einem Dokument derart anzuordnen wie sie es in der Grafik sehen?
Wie lautet die konkrete Syntax zu dieser Anordnung, wenn die Grafiken die Objekte g1, g2, g3, g4, g5 und g6 sind?
Nr.
Merkmal 1
Merkmal 2
Merkmal 3
Geometrische Funktion(en)
(1)
(2)
(3)
(4)
(5)
(6)
Lösung
Grundlage für Graphiken in `ggplot2 sind Data Frames bzw.~Tibbles. Merkmale sind separiert in Spalten, eine Beobachtung ist eine Zeile.
Graphiken, die mit ggplot2 erstellt werden sind in Layern aufgebaut.
Das Grundgerüst ist ein ggplot()-Aufruf, alle weiteren Befehle werden mit + verbunden. Hier bzw.~in den geometrischen Funktionen, wir den Achsen, Farben, Formen, etc. ein Merkmal mit Hilfe der Funktion aes() (Aesthetics) zugeordnet.
Geometrische Funktionen stellen die eigentliche Graphik dar.
Das Finetuning (Achsen beschriften, Legende, Themenwahl (Farbe, Hintergrund,etc.) wird schichtweise mit weiteren Funktionen hinzugefügt.
Nr.
Merkmal 1
Merkmal 2
Merkmal 3
Geometrische Funktion(en)
(1)
nominal
X
X
geom_bar()
(2)
metrisch
metrisch
X
geom_point()
(3)
metrisch
metrisch
nominal
geom_point(), facet_grid()
(4)
metrisch
nominal
X
geom_violin()
(5)
nominal
nominal
X
geom_mosaic()
(6)
metrisch
metrisch
nominal
geom_line()
Ein Paket mit dem das möglich ist heißt patchwork.
die konkrete Syntax wäre (nachdem man das Paket geladen hat): (g1|g2)/(g3|g4)/(g5|g6).
Aufgabe 4.5: KI Aufgabe
Für diese Aufgabe sollen Sie die KI nutzen! Bitte achten Sie aber darauf, dass Sie Funktionen aus dem Tidyverse nutzen! Versuchen Sie zu verstehen was passiert.
Für diese Aufgabe benötigen Sie neben tidyverse die Pakete dslabs, ggrepel und scales. Ziel der Aufgabe ist es Graphiken zu erstellen und die Darstellung (Farbgebung, Achsenbeschriftungen, Legende, Logarithmische Skala, etc.) anzupassen.
Betrachten sie die Datentabelle gapminder aus dem Paket dslabs. Wandeln Sie die Tabelle in einen Tibble um und verschaffen sie sich eine kurze Übersicht über den Datensatz.
Erstellen Sie ein Liniendiagramm in der Sie die Entwicklung der Bevölkerung der Länder: China, Indien, Deutschland, Vereinigte Staaten, Kanada und Großbritannien im Zeitraum von 1960 bis 2015 darstellen. Was fällt auf? Tipp: Nutzen Sie beim Filtern den Operator %in%.
Ändern sie die Graphik aus dem vorherigen Aufgabenteil derart ab, dass Sie die relative Entwicklung der Bevölkerung ablesen können (logarithmische Skala). Kann man nun allein anhand der Graphik sagen welche Länder den relativ größten Zuwachs hatten?
Beschriften sie die Achsen derart, dass die \(x\)-Achse alle 10 Jahre zeigt, und die \(y\)-Achse eine schöne wissenschaftliche Darstellung (zum Beispiel \(10^{8}\) statt \(10e8\)) hat.
Ändern Sie nun die Achsen- und Legendenbeschriftung, so dass diese entweder übersetzt oder zumindest kapitalisiert sind, und geben Sie der Graphik eine Überschrift.
Ändern Sie mit Hilfe der Funktionen theme_*() den Hintergrund der Graphik.
Die Standardeinstellung ist, dass die Legende rechts neben der Graphik eingeblendet ist. Versetzen sie diese so, dass sie unterhalb der Graphik erscheint.
# Problem: China und Indien ein bis zwei Größenordnungen (Zehnerpotenzen) größer als andere # iii)gapminder |>filter(country %in% mycountries,between(year, 1960, 2015)) |>ggplot(aes(x = year, y = population)) +geom_line(aes(color = country)) +scale_y_continuous(trans ='log10')
# Log-Skala besser, da relativer Zuwachs sichtbar: # Indien, China, Canada, USA, GB, Deutschland# Rechnung (nicht gefragt in der Aufgabe): gapminder |>select(country, year, population) |>filter(between(year, 1960, 2015)) |>filter(country %in% mycountries) |># auskommentieren ist interessant!pivot_wider(names_from = year, values_from = population) |>transmute(country, popratio =`2015`/`1960`) |>arrange(desc(popratio))
# A tibble: 6 × 2
country popratio
<fct> <dbl>
1 India 2.92
2 China 2.14
3 Canada 2.01
4 United States 1.73
5 United Kingdom 1.23
6 Germany 1.10
# iv)# Eine kurze Recherche liefert, dass es gut ist das Paket scales zu nutzen:p_load(scales)gapminder |>filter(country %in% mycountries,between(year, 1960, 2015)) |>ggplot(aes(x = year, y = population)) +geom_line(aes(color = country)) +scale_y_continuous(trans =log10_trans(),breaks =trans_breaks("log10", function(x) 10^x),labels =trans_format("log10", math_format(10^.x))) +scale_x_continuous(breaks =seq(1960,2010,10))
Bemerkung: Im letzten Schritt würden alle Labels, inklusiv der der Legende geändert. Die Syntax labs(color = "Länder")) überrascht vielleicht. Die Idee hier ist, color das Argument ist mit dem die Farben vergeben wurden und daher auch darüber die Legende einen Namen bekommt. Analoges geht für fill, size und so weiter.