1 R 4 Datenvisualisierung

Hier sollen Beispiele der Datenvisualisierung gezeigt werden. Die Beispiele folgen dem Buch: “R for Data Science” von Hadley Wickham und Garret Grolemund. Der Link zum freien Onlinebuch finden Sie hier: https://r4ds.had.co.nz/index.html

(Edit: 22.Dez. 2023.) Es gibt auch davon schon eine zweite Auflage, die ebenfalls frei online verfügbar ist: https://r4ds.hadley.nz/. In weiterer Folge werde ich mich an die Beispiele der zweiten Auflage halten. Ich habe das zweite Kapitel dieses Buches ausgelassen, da in diesem Kapitel nochmals kurz auf das Basiswissen eingegangen wird. Dafür gibt es andere, weit ausführlichere Quellen, wie zb: http://www.cookbook-r.com/.

Das ist weitgehend eine Lernseite für mich selbst, um in R besser zu werden. Ich halte mich, so weit es geht, an die Codes im Buch, werde aber hin und wieder abweichen, da ich mit dem Code “herumspielen” werde. Die Seite wird von mir unregelkmäßig aktualisierrt. R Code steht in leicht grau hinterlegten Feldern. Weiße Felder zeigen den Output des Befehles oder Wahrnhinweise. Weitere Informationen zum Package findet man unter folgendem Link zusammengefasst: https://www.tidyverse.org/

Eine weitere sehr gute Hompage für Datenvisualisierung mit ggplot2 ist: https://r-graph-gallery.com/ggplot2-package.html

1.1 Kapitel 1. Vorbereitungen zu den weiteren Arbeitsschritten

Hier wird zuerst die Umgebung gelöscht. Danach werden die benötigten Libraries eingelesen. Aktuell ist nur die tidyverse Bibliothek wichtig. Es umfasst alle anderen Libraries, die für die Erstellung von Grafiken und Datenanalysen benötigt werden. In Auflage 2 wird ein weiterer Datensatz - palmerpenguins- benötigt. Der muss mit einer weiteren Library -ggthemes- zusätzlich geladen werden.

# Löscht alle einträge
rm(list = ls())

# Einlesen der Libraries, die benötigt werden 
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.4
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.4.4     ✔ tibble    3.2.1
## ✔ lubridate 1.9.3     ✔ tidyr     1.3.0
## ✔ purrr     1.0.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
# weitere Libraries aus Auflage 2.
library(ggthemes)
library(palmerpenguins)
library(knitr)             # für die Tabellen

Der Datensatz, mpg, ist in R defaultmäßig integierert und wird in weiterer Folge verwendet. Der Datensatz umfasst Autodaten über Spritwirtschaftlichkeit von 1999 bis 2008, die die US-Umweltbehörde EPA auf folgendem Link öffentlich macht: https://fueleconomy.gov/

head(mpg)
## # A tibble: 6 × 11
##   manufacturer model displ  year   cyl trans      drv     cty   hwy fl    class 
##   <chr>        <chr> <dbl> <int> <int> <chr>      <chr> <int> <int> <chr> <chr> 
## 1 audi         a4      1.8  1999     4 auto(l5)   f        18    29 p     compa…
## 2 audi         a4      1.8  1999     4 manual(m5) f        21    29 p     compa…
## 3 audi         a4      2    2008     4 manual(m6) f        20    31 p     compa…
## 4 audi         a4      2    2008     4 auto(av)   f        21    30 p     compa…
## 5 audi         a4      2.8  1999     6 auto(l5)   f        16    26 p     compa…
## 6 audi         a4      2.8  1999     6 manual(m5) f        18    26 p     compa…

1.2 2. Erste Grafiken

Hier werden die ersten Grafiken dargestellt. Der Code bleibt eingeblendet. Zur Erstellung der Grafiken wird die Library ggplot2 verwendet. Weitere nützliche Informationen zu diesem R-Package findet man unter folgender Seite: https://ggplot2.tidyverse.org/

1.2.1 2.1 Einfaches Punktwolkendiagram.

Es sollte die Beziehung zwischen der zu erklärenden Variablen, hwy, welche den Verbrauch in Meilen pro Galone mißt, und der erklärenden Variable, disp, welcher den Hubraum in ccm darstellt. Die Grafik ist recht einfach gehalten. Im Befehl ggplot() werden die Basisinformationen festgelegt. In diesem Beispiel ist es nur der Datensatz. Danach wird die Grafik selbst gewählt. Hier ist es der befehl geom_point() verwendet. Mit dem Befehl aes -Aestetics- werden die visuellen Eigenschaften der Grafik festgelegt. In diesem Beispiel ist es nur die x- bzw. y-Achse.

# 2.0.1 Erster, simpler ggplott

ggplot(data = mpg) +                            # ggplot ist immer die Eröffnungsphrase
  geom_point(aes(x = displ,                     # displ ist der hubraum
                 y = hwy))                      # Verbrauch auf der Autobahn in Meilen pro Galone

Es gibt, wie auch angenommen, einen negativen Zusammenhang zwischen dem Verbrauch und der Motorgröße. Je größer der Motor, desto weniger Meilen können mit einer Galone zurückgelegt werden.

1.2.1.1 2.1.1 Das Punktwolkendiagram wird um eine Klassifikation erweitert

Im einfachen Diagram werden alle Fahrzeugtypen zusammengefasst. Im nächsten Beispiel soll noch zwischen den einzelnen Fahrzeugklassen unterschieden werden. Dafür werden die Einzellnen Fahrzeugklassen farblich unterschieden. Der Befehl, aes, wird um eine weitere Eigenschaft der Grafik, Fahrzeugklassen werden farblich unterschieden, erweitert

# 2.0.2 Der gleiche Plott mit einer farblichen unterscheidung der Aufbauarten der Autos

ggplot(data = mpg) +
  geom_point(aes(x = displ,
                 y = hwy,
                 color = class))

1.2.2 2.1.2 Statt farblich sollte nach größe der Punkte unterschieden werden.

Der Code ändert sich nur im aes-Befehl. Dabei werden die Klassen unterschiedlich große Punkte zugeteilt.

# 2.0.2 Unterscheidung der Fahrzeigklasse durch die Größe der Punkte
ggplot(data = mpg) +
  geom_point(mapping = aes(x = displ,
                           y = hwy,
                           size = class),
             na.rm = T)           # falls keine werte vorhanden, werden sie nicht einbezogen
## Warning: Using size for a discrete variable is not advised.

1.2.2.1 2.1.2.1 Erweiterung der Beispiel der zweiten Auflage

Hier werden der Body Mass und die Flossengrösse verglichen. Es soll nach der Pinguinart unterschieden werden.

zuerst soll der Anfang des Data Frames als tabelle dargestellt werden

kable(penguins[1:7,          #nur die ersten 7 Zeilen des DF werden dargestellt
                      ], caption = "Anfang des Pinguins Data Frame")
Anfang des Pinguins Data Frame
species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g sex year
Adelie Torgersen 39.1 18.7 181 3750 male 2007
Adelie Torgersen 39.5 17.4 186 3800 female 2007
Adelie Torgersen 40.3 18.0 195 3250 female 2007
Adelie Torgersen NA NA NA NA NA 2007
Adelie Torgersen 36.7 19.3 193 3450 female 2007
Adelie Torgersen 39.3 20.6 190 3650 male 2007
Adelie Torgersen 38.9 17.8 181 3625 female 2007

als Grafik (weiterer Text folgt):

# Pinguin DS

ggplot(data = penguins, 
       mapping = aes(x = flipper_length_mm,
           y = body_mass_g
           )) + 
  geom_point(mapping = aes(color = species,                 # Die Arten farblich unterscheiden
                 shape = species),
             na.rm = T) +              # Den arten auch eine Punktform zuweisen
  geom_smooth(method = lm,
              na.rm = T) +                       # Es sollte eine lineare Regression dargestellt werden
  theme(plot.caption = element_text(hjust = 0))+  # caption ist normalerweise rechts ausgerichtet. mit dem Befehl ist sie links
  labs(                               #hier erden die Beschriftiungen der Grafik eingefügt 
    title = "Vergleich des Gewichtes in Gramm zur Flossengröße",
    subtitle = "Verglichen werden drei Pinguinarten",
    x = " Flossengröße (in mm)",
    y = " Gewicht (in gr)",
    caption = "Quelle: https://r4ds.hadley.nz/data-visualize"
  )
## `geom_smooth()` using formula = 'y ~ x'

Wieder drei Regressionen machen. Für jede Spezies eine Regression.

ggplot(data = penguins, 
       mapping = aes(x = flipper_length_mm,
           y = body_mass_g,
           color = species)) + 
  geom_point(mapping = aes(shape = species),
             na.rm = T) +              # Den arten auch eine Punktform zuweisen
  geom_smooth(method = lm,
              na.rm = T) +                       # Es sollte eine lineare Regression dargestellt werden
  theme(plot.caption = element_text(hjust = 0))+  # caption ist normalerweise rechts ausgerichtet. mit dem Befehl ist sie links
  labs(                               #hier erden die Beschriftiungen der Grafik eingefügt 
    title = "Vergleich des Gewichtes in Gramm zur Flossengröße",
    subtitle = "Verglichen werden drei Pinguinarten. Hier mit drei linearen Regressionen",
    x = " Flossengröße (in mm)",
    y = " Gewicht (in gr)",
    caption = "Quelle: https://r4ds.hadley.nz/data-visualize"
  )
## `geom_smooth()` using formula = 'y ~ x'

1.2.3 2.1.3 Die Fahrzeugklasse als unterschiedlich transparent sind

# 2.0.3 Mit alpha = werden die Punkte in unterschiedlicher Transparenz zugeordnet
ggplot(data = mpg) + 
  geom_point(mapping = aes(x = displ, 
                           y = hwy, 
                           alpha = class),
             color = "darkblue")            # Ausserhalb des aes-Befehls bezeichnet color = die Farbe der Punkte
## Warning: Using alpha for a discrete variable is not advised.

1.2.4 2.1.4 Unterschiedliche Punktformen

# 2.0.4 Unterschiedliche Formen an "Punkten"
ggplot(data = mpg) + 
  geom_point(mapping = aes(x = displ, 
                           y = hwy, 
                           shape = class),
             na.rm = T)
## Warning: The shape palette can deal with a maximum of 6 discrete values because more
## than 6 becomes difficult to discriminate
## ℹ you have requested 7 values. Consider specifying shapes manually if you need
##   that many have them.

2 2.2 Jede Klasse in einem Graph darstellen

Um die jeweilige Klasse in einen individuellen Graph darzustellen wird der Befehl facet_wrap verwendet.

# 2.1.0 Die Klassen auf unterschiedliche Graphen aufteilen.

ggplot(data = mpg) +
  geom_point(aes(x = displ,
                 y = hwy,
                 color = class),
             na.rm = T) +
  facet_wrap(~ class,           # Der Befehl teilt die einzelnen Klaasen in eine eigene Grafik
             nrow = 3)          # Anzahl der Spalten

2.0.1 2.2.1 Individuelle Graphen mit 2 Variablen

Hier sollen die individuellen Graphen mit 2 Variablen weiter aufgeteilt werden. In diesem Beispiel wird der Basisdatensatz noch zwischen Zylindern- 4 bis 8 Zylinder, auf der x-Achse - und dem Antriebsart - 4, f, r- aufgeteilt.

# 2.1.1 Individuelle Graphen mit zwei Variablen

ggplot(data = mpg) +
  geom_point(aes(x = displ,
                 y = hwy,
                 color = class),
             na.rm = T) +
  facet_grid(drv ~ cyl)

2.1 2.3 Weitere Darstellungsmöglichkeiten

2.1.1 2.3.1 Darstellung als Linie (Regressionsmodell)

Die gleichen Daten können auch als Liniendiagram, eine Art von Regression, darstellen

ggplot(data = mpg) +
  geom_point(aes(x = displ,
                 y = hwy))

ggplot(data = mpg) +
  geom_smooth(aes(x = displ,
                  y = hwy))
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'

ggplot(data = mpg) +
  geom_smooth(aes(x = displ,
                  y = hwy,
                  linetype = drv))
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'

Hier wurden drei Regressionen generiert. Es wird dabei nach den Antriebsarten des Autos unterschieden. Im Befehl geom_smooth() wird im Argument linetype die Variable drv (Antriebsart) zugeordnet

2.1.2 2.3.2 Darstellung beider Grafiken in einem Plot

Dabei werden im Plot beide Grafiken, die Punktwolke über geom_point() und die Regressionsgeraden geom_smooth() übereinander legen

ggplot(data = mpg,
       mapping =aes(x = displ,
           y = hwy,
           color = drv)
       )+
  geom_point() +
  geom_smooth(mapping = aes(linetype = drv))
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'

### 2.2.2 Nur eine Klasse als Regressionslinie darstellen


ggplot(data = mpg,
       mapping = aes(x = displ,
                     y = hwy,
                     color = class)
)+
  geom_point() +
  geom_smooth(data = filter(mpg,                   # es wird nach der klasse gefiltert
                            class == "subcompact"),
              se = FALSE)                          # standardfehler wird nicht angezeigt
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'

2.1.3 2.3.2 mit mehereren Variablen arbeiten

text folgt

# mit mehreren Variablen arbeiten

ggplot(penguins,
       aes(x = flipper_length_mm,
           y = body_mass_g,
           color = species,
           shape = island)) +
  geom_point()
## Warning: Removed 2 rows containing missing values (`geom_point()`).

# aufgeteilt in facets
ggplot(penguins,
       aes(x = flipper_length_mm,
           y = body_mass_g,
           color = species,
           shape = island)) +
  geom_point() + 
  facet_grid(~ island)
## Warning: Removed 2 rows containing missing values (`geom_point()`).

2.2 2.4 Statistische Transformation von Daten

DS ist diamonds (Text folgt)

2.2.1 2.4.1 Balkendiagramme

# 2.3.1 Einfaches Balkendiagramme mit dem Datensats "diamonds)
ggplot(data = diamonds,
       mapping = aes( x= cut)) +
  geom_bar()

Gleicher graph mit stat_count()

ggplot(data = diamonds,
       mapping = aes(x = cut)) +
  stat_count()

Text folgt

demo <- diamonds %>%
  count(cut) %>%
  rename("Anzahl" = "n") %>%
  arrange(str_rank(cut))
  

ggplot(data = demo) +
  geom_bar(mapping = aes(x = cut,
                         y = Anzahl),
           stat = "identity",
           color = "red",
           fill = "red")

2.2.2 2.4.2.1 Balkendiagramme mit zwei kathegorischen Variablen

Weiterer (ausführlicherer) Text folgt. Hier wird als x-Wert die kathegorische Variable, island, noch weiter, durch die kathegorische Variable, species, unterteilt.

#    Balken diagram mit zwei kathegorischen variablen island und species

ggplot(penguins,
       aes(x = island,
           fill = species)) +
  geom_bar()

Die gleichen Daten können auch als “100% Balken dargestellt werden. Dabei wird die Pinguinpopulation der jeweiligen Insel als 100% Balken dargestellt:

#  Balkendiagram auf 100%

ggplot(penguins,
       aes(x = island,
           fill = species)) +
  geom_bar(position = "fill") +  # Erzeugt die Grafik auf 100%
  labs(title = "Aufschlüsselung der Pinguinpopulation jeh Insel nach Spezies",
       y = "Anzahl",
       x = "Insel")

2.3 2.4.3 Einfaches Histogram

Weiterer Text folgt

# einfaches histogram
ggplot(penguins,
       aes(x = body_mass_g)) +
  
  geom_histogram(binwidth = 150,
                 na.rm = T,
                 fill = "red") +
  geom_density(color = "darkblue") 
## Warning: Removed 2 rows containing non-finite values (`stat_density()`).

2.4 2.4.3 Boxplots

Text folgt

####
# 1 5 Zusamenhänge in der Visualisierung

# bspl boxplot

ggplot(penguins,
       aes(x = species,
           y = body_mass_g)) +
  geom_boxplot()
## Warning: Removed 2 rows containing non-finite values (`stat_boxplot()`).

2.4.1 2.4.3.1 Gleiche darstellung als Dichtefunktion

Text folgt

ggplot(penguins,
       aes( x= body_mass_g,
            color = species,
            fill = species)) + 
  geom_density(linewith = 0.7,
               alpha = 0.5)
## Warning in geom_density(linewith = 0.7, alpha = 0.5): Ignoring unknown
## parameters: `linewith`
## Warning: Removed 2 rows containing non-finite values (`stat_density()`).

Link zum nächsten Kapittel https://rpubs.com/Exilkaerntner1970/1133217