2  Daten

Damit wir sinnvoll mit verschiedenen Arten von Daten arbeiten können, brauchen wir eine geeignete Terminologie - sozusagen ein Vokabular, das präzise allgemeine Aussagen über Daten ermöglicht, ohne auf den jeweiligen speziellen Anwendungsfall einzugehen.

2.1 Grundbegriffe

2.1.1 Population

Die Population oder Grundgesamtheit (engl. population) umfasst alle erfassten Einheiten. In den Wirtschaftswissenschaften sind diese Einheiten oft Personen, Haushalte, Firmen, Branchen oder Regionen. Eine genaue Definition der Population ist wichtig, aber oftmals gar nicht einfach, weil Abgrenzungsfragen geklärt werden müssen.

Die Einheiten der Population werden auch Merkmalsträger (engl. units) genannt.

Beispiele:

  • Population: Alle privaten Haushalte in Deutschland am 1. Januar 2024. Hier muss man festlegen, wann ein Haushalt ein privater Haushalt ist. Was ist mit WGs? Was ist mit Untermietern? Was ist mit Gemeinschaftseinrichtungen? Man muss abgrenzen, wann ein Haushalt in Deutschland lebt. Was ist, wenn eine oder mehrere Personen längerfristig im Ausland leben (aber die anderen Personen des Haushalts in Deutschland)?

  • Population: Alle Handwerksbetriebe in Münster am 1. April 2024. Hier muss definiert werden, welche Betriebe Handwerksbetriebe sind. Was ist mit dem Klamottengeschäft, das auch eine Änderungsschneiderei betreibt?

  • Population: Alle Studierenden der Wirtschaftswissenschaften zu Beginn des Sommersemesters 2024. Welche Studierenden sind hier genau gemeint? Was ist z.B. mit Nebenfächlern?

Derartige Abgrenzungsfragen ignorieren wir in diesem Modul komplett. Wir gehen immer davon aus, dass klar definiert wurde, welche Population betrachtet wird.

2.1.2 Variablen

Die Variablen oder Merkmale (engl. variables) sind die Größen, die man bei den Einheiten der Population misst. In allgemeiner Notation schreiben wir für die untersuchte Variable meist einfach \(X\). Wenn zwei oder drei Variablen erhoben werden, schreiben wir \(X\) und \(Y\) oder \(X\), \(Y\) und \(Z\). Und bei mehr als drei Variablen ist eine gängige Notation \(X_1,X_2,\ldots\)

In den konkreten Anwendungen sollte man im Programm-Code aussagekräftigere Variablennamen wählen, z.B. einkommen, wenn man sich für das Einkommen von Haushalten interessiert, oder gewinn, wenn man den Gewinn von Unternehmen analysiert.

Beispiele:

  • In der Population der privaten Haushalte interessieren wir uns für das monatliche Haushaltsnettoeinkommen. Auch hier muss natürlich wieder genau definiert werden, was darunter zu verstehen ist. Hier ist die Variable \(X\): monatliches Haushaltsnettoeinkommen.
  • In der Population der münsteraner Handwerksbetriebe untersuchen wir die Variable \(X\): Anzahl der Beschäftigten. Außerdem erheben wir Informationen über \(Y\): Gewinn im Vorjahr.
  • In der Population der WiWi-Studierenden erheben wir die Merkmale \(X\): Geschlecht, \(Y\): Abiturnote und \(Z\): Fachsemester.

Für jedes Merkmal muss wieder genau definiert werden, was gemeint ist. Auch hier gehen wir in diesem Modul davon aus, dass alle Abgrenzungsfragen geklärt sind.

2.1.3 Variablenwerte

Die Werte, die eine Variable annehmen kann, nennt man Variablenwerte, Ausprägungen oder Merkmalswerte (engl. values). Je nach Variablenart gibt es ganz unterschiedliche Arten von Werten. Darauf gehen wir in Kapitel 2.5 detailliert ein.

2.2 Dataframes

Die Daten, mit denen wir arbeiten, werden in R als Dataframes gespeichert. Es gibt noch spezielle Varianten von Dataframes (z.B. sogenannte tibbles), aber wir bezeichnen im folgenden alle Varianten einfach als Dataframes. Ein Dataframe ist wie eine Matrix aufgebaut, es gibt Zeilen (engl. rows) und Spalten (engl. columns). Jede Spalte ist eine Variable, jede Zeile ist eine Beobachtung. Wie die Daten in einen Dataframe hineinkommen, behandeln wir in Kapitel 3. Hier gehen wir zunächst davon aus, dass der Dataframe bereits gegeben ist.

Den Inhalt der Dataframes kann man sich in der Konsole anzeigen lassen mit dem Befehl print, also beispielsweise print(D), wenn der Dataframe D heißt. Den Befehl print kann man zur Vereinfachung sogar weglassen und für die Ausgabe einfach D eingeben.

Ein kleiner Beispiel-Dataframe D sieht so aus:

print(D)
# A tibble: 8 × 3
  Geschlecht Monatslohn Kinder
  <fct>           <dbl>  <int>
1 M                2390      0
2 M                3803      3
3 F                2502      2
4 F                3134      0
5 M                 450      1
6 F                9871      1
7 F                4401      0
8 M                3170      2

Man erkennt, dass dieser Dataframe drei Variablen (Spalten) hat, nämlich Geschlecht, Monatslohn und Kinder. Der Dataframe hat acht Beobachtungen, jede Variable wird acht Mal beobachtet, z.B. hat die Variable Monatslohn bei der dritten Beobachtung den Wert 2502.

In den meisten Fällen sind die Dataframes zu groß, um alle Daten auszugeben. Um einen ersten Eindruck von der Organisation der Daten zu bekommen, reicht es oft aus, sich den Anfang oder das Ende des Dataframes anzusehen. Das geschieht mit den beiden Funktionen head und tail. Sie geben die Variablennamen und die ersten bzw. letzten sechs Zeilen des Dataframes aus. Will man mehr oder weniger Zeilen anzeigen lassen, kann man die gewünschte Anzahl in der Funktion als zweites Argument ergänzen.

head(D)
# A tibble: 6 × 3
  Geschlecht Monatslohn Kinder
  <fct>           <dbl>  <int>
1 M                2390      0
2 M                3803      3
3 F                2502      2
4 F                3134      0
5 M                 450      1
6 F                9871      1

oder

tail(D,2)
# A tibble: 2 × 3
  Geschlecht Monatslohn Kinder
  <fct>           <dbl>  <int>
1 F                4401      0
2 M                3170      2

Manchmal reicht es für einen Einblick in die Struktur des Datensatzes sogar aus, die Variablennamen zu kennen. Man kann sie mit der Funktion names anzeigen lassen,

names(D)
[1] "Geschlecht" "Monatslohn" "Kinder"    

Die Größe des Dataframes wird durch die Funktion dim (für Dimension) abgerufen. Ein Dataframe hat zwei Dimensionen, nämlich die Anzahl der Zeilen als erste Dimension und die Anzahl der Spalten als zweite Dimension.

Eselsbrücke: Zuerst die Zeilen, Später die Spalten”.

Die Funktion dim gibt einen Vektor der Länge 2 als Ergebnis zurück, beispielsweise

dim(D)
[1] 8 3

Der Dataframe D hat also acht Zeilen und drei Spalten. Um die Zahl der Beobachtungen (Zeilenzahl) abzuspeichern, können wir das erste Element des Vektors auslesen und einem Objekt (hier n) zuweisen.

n <- dim(D)[1]

Wollen wir die Spaltenzahl als K speichern, können wir eingeben

K <- dim(D)[2]

Sowohl n als auch K erscheinen nun im Environment (im oberen rechten Fenster).

2.3 Vektoren in R

Jede Spalte eines Dataframes enthält die Beobachtungen zu einer Variable. In manchen Situationen ist es in R sinnvoll, eine einzelne Spalte aus einem Dataframe herauszuziehen und als eigenständiges Objekt - als sogenannten Vektor - zu speichern.

Es gibt mehrere Wege, einen Vektor aus einem Dataframe heraus zu ziehen. Der Dataframe D aus dem letzten Abschnitt hat drei Variablen: Geschlecht (Spalte 1), Monatslohn (Spalte 2) und Kinder (Spalte 3). Wie kann man die Beobachtungen zu der Variable Geschlecht in einen Vektor geschl kopieren?

Dazu gibt es im wesentlichen zwei Wege (wir werden später noch einen weiteren Weg kennen lernen):

  1. Spaltennummer in doppelten Klammern
geschl <- D[[1]]
  1. Auswahl mit dem Dollarzeichen und dem Spaltennamen
geschl <- D$Geschlecht

Um einen kurzen Vektor “per Hand” in R einzugeben, ist die Funktion c (für “concatenate”, also “verknüpfen”) praktisch. Die Syntax zum Erzeugen eines Vektors a mit den sieben Werten 6, 1, 2, -3, 0, 0 und 4 lautet

a <- c(6,1,2,-3,0,0,4)

Der Inhalt eines Vektors kann mit

print(a)
[1]  6  1  2 -3  0  0  4

oder einfach nur

a
[1]  6  1  2 -3  0  0  4

angezeigt werden.

Auf ein einzelnes Element eines Vektors greift man durch Indizierung mit eckigen Klammern zu. Zum Beispiel liefert

a[3]
[1] 2

das dritte Element des Vektors a.

Anders als in der Mathematik üblich, gibt es in R auch Vektoren, deren Elemente Strings (Zeichenketten) sind. Auch solche Vektoren kann man (wenn sie kurz sind) “per Hand” eingeben, z.B. so

b <- c("m","m","w","d","w","m","w")

Zeichenketten werden immer durch Anführungszeichen eingeschlossen. Auch hier kann ein einzelnes Element durch Indizierung mit eckigen Klammern herausgelesen werden, beispielsweise

b[5]
[1] "w"

Da ein Vektor die Beobachtungen für eine Variable enthält, kann man aus mehreren Vektoren wieder ein Dataframe erstellen. Natürlich müssen in diesem Fall alle Vektoren gleich viele Elemente, also gleich viele Beobachtungen, enthalten. Die Länge eines Vektors ermittelt man mit der Funktion length.

length(a)
[1] 7
length(b)
[1] 7

Wenn die Vektoren gleich lang sind, können sie mit der Funktion data.frame zu einem Dataframe zusammengefügt werden. Die Syntax sieht vor, dass man auch die Variablennamen mit eingibt. Um aus den beiden Vektoren a und b einen Dataframe mit dem Namen D und den Variablennamen VarName1 und VarName2 zu erstellen, geht man so vor:

W <- data.frame(VarName1=a, 
                VarName2=b)

Der neue Dataframe W sieht dann so aus:

W
  VarName1 VarName2
1        6        m
2        1        m
3        2        w
4       -3        d
5        0        w
6        0        m
7        4        w

2.4 Fehlende Werte

Alle Variablen können fehlende Werte (engl. missing values) haben. Für fehlende Werte gibt es in R eine eigene Ausprägung, nämlich NA (für not available). Wir betrachten wieder den Dataframe D.

D
# A tibble: 8 × 3
  Geschlecht Monatslohn Kinder
  <fct>           <dbl>  <int>
1 M                2390      0
2 M                3803      3
3 F                2502      2
4 F                3134      0
5 M                 450      1
6 F                9871      1
7 F                4401      0
8 M                3170      2

Angenommen, das Geschlecht der zweiten Person und der Monatslohn der fünften Person fehlen, dann sieht der Dataframe wie folgt aus:

D$Geschlecht[2] <- NA
D$Monatslohn[5] <- NA
print(D)
# A tibble: 8 × 3
  Geschlecht Monatslohn Kinder
  <fct>           <dbl>  <int>
1 M                2390      0
2 <NA>             3803      3
3 F                2502      2
4 F                3134      0
5 M                  NA      1
6 F                9871      1
7 F                4401      0
8 M                3170      2

Bei allen Berechnungen berücksichtigt R, dass diese Werte fehlen. Wenn beispielsweise die Summe aller Monatslöhne bestimmt werden soll, lautet das Ergebnis

sum(D$Monatslohn)
[1] NA

Der Wert der Summe ist unbekannt, wenn der Wert mindestens eines Summanden unbekannt ist. Beobachtungen mit fehlenden Variablen sind daher praktisch immer ein Problem. Wie man dieses Problem am besten löst, hängt (leider) vom Einzelfall ab. Eine oft benutzte Methode besteht darin, Beobachtungen mit fehlenden Werten aus dem Datensatz zu löschen.

2.5 Skalen

Wenn man sich verschiedene Variablen genauer anschaut, stellt man fest, dass die Werte, die sie annehmen, von unterschiedlicher Natur sind. Die Variable “Beruf” kann Werte wie “Lehrer” oder “Bäcker” annehmen. Die Variable “Bonität” (“Kreditwürdigkeit”) nimmt Werte wie AAA, AA, B etc. an. Die Variable “Vermögen” nimmt dagegen Zahlenwerte an.

Der Informationsgehalt der Werte ist in diesen Beispielen unterschiedlich. Beim Beruf lässt sich nur sagen, ob zwei Personen den gleichen Beruf haben oder nicht. Bei der Bonität kann man sagen, dass ein Unternehmen eine höhere oder niedrigere Bonität hat als ein anderes Unternehmen (oder die gleiche Bonität). Und beim Vermögen kann man sogar sagen, wie viel höher das Vermögen einer Person im Vergleich zu einer anderen Person ist.

Auf welchem “Niveau” die Variablen gemessen werden, drückt man durch die Skala oder Skalierung (engl. scale) aus.

2.5.1 Nominalskala

Die niedrigste Skala ist die Nominalskala (engl. nominal scale). Die Variablenwerte drücken nur aus, ob zwei Einheiten den gleichen Wert haben oder nicht. Es ist aber nicht möglich, die Werte in eine Rangfolge zu bringen.

Beispiele:

  • Beruf, mögliche Ausprägungen sehen Sie hier:

  • Religionszugehörigkeit, mögliche Ausprägungen sehen Sie hier:

2.5.2 Ordinalskala

Die nächsthöhere Skala ist die Ordinalskala (engl. ordinal scale). Bei ordinal skalierten Variablen lässt sich eine Rangfolge aufstellen. Man kann sagen, ob ein Wert höher oder niedriger ist als ein anderer Wert, oder ob sie gleich sind. Es lässt sich aber nicht sagen, wie viel höher oder niedriger der Wert ist.

Beispiele:

  • Schulnoten, mögliche Ausprägungen sind 1, 2, 4. Die Schulnote 4 ist schlechter als die Note 2, aber es ist nicht sinnvoll zu sagen, dass eine 4 doppelt so schlecht ist wie eine 2.
  • Bonität, mögliche Ausprägungen sind AAA, AA, B, D. Man kann zwar sagen, dass die AAA eine höhere Bonität ist als AA, aber man kann nicht sagen, dass sie doppelt so hoch ist.

In manchen Fällen ist die Unterscheidung zwischen Nominal- und Ordinalskala nicht so offensichtlich wie bei Berufen oder Schulnoten. Beispielsweise könnte man die Parteizugehörigkeit in Deutschland als nominal skaliert ansehen, wenn man nur zwischen den Parteien unterscheiden will. Aber auch eine Ordinalskala wäre denkbar, wenn man die Parteien von “links” nach “rechts” anordnet.

2.5.3 Metrische Skalen

Bei Variablen mit einer metrischen Skala oder Kardinalskala (engl. metric scale) können auch die Abstände zwischen den Werten sinnvoll interpretiert werden. Ökonomische Variablen lassen sich oft in Geldeinheiten ausdrücken, sie sind dann metrisch skaliert. Auch physikalische Größen sind metrisch skaliert, zum Beispiel Längen, Gewichte, Zeitdauern usw.

Beispiele:

  • Vermögen: Eine Person mit einem Vermögen von 20000 Euro hat ein doppelt so hohes Vermögen wie eine Person mit einem Vermögen von 10000 Euro.
  • Wenn eine Person 6 Monate arbeitslos war, dann ist sie doppelt so lange arbeitslos gewesen wie eine Person, die nur 3 Monate arbeitslos war.

Für die Datenanalyse ist es wichtig, die Skalierungen der Variablen zu kennen, denn einige Data-Science-Methoden sind nicht für alle Arten von Skalen geeignet. Eine interessante Frage ist oft, ob zwei Variablen gleichläufig sind (d.h. je höher die Werte der einen Variablen, desto höher sind tendenziell auch die Werte der anderen Variablen). Fragen dieser Art sind für nominal skalierte Variablen aber schlicht und einfach sinnlos.

2.6 Datentypen in R

Den drei Skalierungen entsprechen in R drei Datentypen:

Skalierung Datentyp in R
nominal factor
ordinal ordered factor
metrisch numeric / double / integer

Ordinal skalierte Variablen betrachten wir zunächst einmal nicht. Der Datentyp wird bei der Ausgabe eines Dataframes mit angezeigt. Für den oben bereits betrachteten kleinen Beispieldatensatz sieht das in R so aus:

# A tibble: 8 × 3
  Geschlecht Monatslohn Kinder
  <fct>           <dbl>  <int>
1 M                2390      0
2 <NA>             3803      3
3 F                2502      2
4 F                3134      0
5 M                  NA      1
6 F                9871      1
7 F                4401      0
8 M                3170      2

Die Variable Geschlecht in der ersten Spalte ist ein Faktor, was man an dem Kürzel <fct> (oder <fctr>) unter dem Variablennamen erkennt. Es handelt sich also um eine nominal skalierte Variable. Der Monatslohn in der zweiten Spalte ist eine numerische Variable (<dbl> für “double precision”), also metrisch skaliert. Auch die dritte Spalte (Kinder) ist metrisch skaliert, hier handelt es sich um eine ganzzahlige Variable (<int> für “integer”).

In R gibt es noch einige weitere Datentypen, z.B. Zeichenketten, Datumsangaben oder logische Werte (wahr/falsch), auf die wir nur zum Teil und erst später eingehen werden. Die R-Funktion class gibt an, welchen Typ ein R-Objekt hat. Zum Beispiel:

class(D$Geschlecht)
[1] "factor"

Das Programm R kann nicht wissen, welche Skalierung eine Variable hat. Meist gehören Zahlenangaben zu Variablen, die metrisch skaliert sind, und Strings zu Variablen, die nominal skaliert sind. Wenn man sicher sein will, dass die Skalen richtig gesetzt sind, sollte man sie beim Einlesen der Daten explizit angeben. Wie das geht, erfahren Sie in Kapitel 3 (“Daten importieren”).

2.7 Datenqualität

In der Praxis sind Daten leider fast immer von schlechterer Qualität als erhofft. Ein besonders häufiges Problem sind fehlende Werte. Andere Probleme sind Fehler in den Daten, z.B. durch ein verrutschtes Komma, uneinheitliche Trennzeichen zwischen den Variablen sowie Unklarheiten bei der Darstellung von Dezimalzahlen (werden die Nachkommastellen durch einen Punkt oder durch ein Komma abgetrennt?). Manche Daten enthalten Ausreißer, weil die Einheiten nicht in allen Beobachtungen gleich sind und z.B. manchmal Meter, manchmal Kilometer angegeben sind. Ganz simple Eingabe- oder Erfassungsfehler können zu unplausiblen Werten führen.

Eine gründliche Aufbereitung und Bereinigung der Daten sollte immer am Beginn jeder Datenanalyse stehen. Wir werden Probleme mit der Datenqualität in diesem Kurs trotzdem gelegentlich ignorieren und einfach so tun, als lägen die Daten bereits in einem sauberen Format vor.

Für die Analyse einiger Aspekte der Datenqualität braucht man Methoden, die erst im Laufe dieses Kurses vorgestellt werden. Weil das Thema Datenqualität in der praktischen Arbeit so wichtig ist, wird es in diesem Kurs als Querschnittsthema immer wieder auftauchen. Sie finden im Anhang A einen Überblick über wichtige Aspekte der Datenqualität.