Table of Contents

[ Sammlung: Einstieg in die Statistik mit R ]

Übungseinheit 2: Arbeiten mit nominalen Daten

Was sind „nominale Daten“?

Phänomene, die wir wissenschaftlich untersuchen wollen, lassen sich auf verschiedene Arten kategorisieren. Im einfachsten Fall geben wir den verschiedenen Ausprägungen eines Phänomens Namen, wobei jeder dieser Namen eine klar definierte Kategorie bezeichnet. Diese Kategorien sind in einem Forschungsdesign typischerweise aufeinander bezogen sein — sie sind Unterkategorien einer übergeordneten Kategorie, oder, anders gesagt, unterschiedliche Ausprägungen (Werte) einer Variable.

Die Kategorien könnten z.B. Namen für die unterschiedlichen Werte sein, die die Variable „Haustier“ annehmen kann — etwa „Hund“, „Katze“, „Meerschweinchen“, „Hamster“ und „Maus“. Daten, die auf diese Weise kategorisiert sind (z.B. die Haustiere der Studierenden in einem bestimmten Seminar), können wir zählen und wir können das Ergebnis in absoluten Häufigkeiten oder in relativen Häufigkeiten (z.B. Prozent) ausdrücken.

Wir können die Daten aber aus sich heraus in keine Rangfolge bringen und wir können auch keinen Mittelwert (also das „durchschnittliche“ Haustier) ausrechnen. Letzterem entspricht bei nominalen Daten am ehesten der Modus, also der Wert, der am häufigsten vorkommt.

Mit solchen nominalen Daten befassen wir uns in dieser Übungseinheit.

Nominale Daten zählen

Einfache Häufigkeiten

In der Sprachwissenschaft haben wir es oft mit nominalen Daten zu tun. Wörter selbst sind zum Beispiel nominale Daten (wir können zählen, wie häufig welches Wort in einem Text vorkommt, aber wir können Wörter nicht in eine inhärente Rangfolge bringen und wir können kein „durchschnittliches Wort“ ausrechnen). Dasselbe gilt für typische sprachwissenschaftliche Analysekategorien, wie „Wortart“ (Substantiv, Verb, Adjektiv, …), „lexikalische Relation“ (Synonym, Antonym, Homonym, …), „Metapher“ usw.

Der folgende Vektor enthält zum Beispiel den ersten Satz aus Jane Austens Pride and Prejudice:

aust_prid_first <- c("It","is","a","truth","universally","acknowledged",",","that","a","single","man","in","possession","of","a","good","fortune",",","must","be","in","want","of","a","wife",".")

Um die Wörter in diesem Satz zu zählen, können wir den Befehl table() verwenden:

table(aust_prid_first)

Diese Häufigkeitsliste ist nicht sehr übersichtlich formatiert — in der Übungseinheit 4 („Datenstrukturen“) erfahren Sie u.a., wie man solche Listen umformatieren kann, um sie lesbarer zu machen oder in R weiterzuverwenden.

Wir können Häufigkeitslisten auch aus einzelnen Spalten eines Data Frames erzeugen. Laden Sie sich zunächst die Datei https://userpage.fu-berlin.de/~structeng/data/notwithstanding.csv herunter und lesen Sie sie in R ein, wie sie es in Übungseinheit 1 gelernt haben. Geben Sie ihr den Namen nwth. 1)

Lassen Sie sich mit head(ntwth) die ersten sechs Zeilen anzeigen, um sicher zu gehen, dass der Import funktioniert hat. Das Ergebnis muss so aussehen:

> head(ntwth)
      Source Year Variety  TxtType      AdpType Example
1  BROWN-G28 1961     AmE    essay postposition s denials of extensive reading notwithstanding , it is no doubt safe to assum
2  BROWN-H05 1961     AmE    admin  preposition sales tax at the state level . notwithstanding state aid , the local governme
3  BROWN-J39 1961     AmE academic  preposition ops and sells at the bottoms , notwithstanding occasional individual exceptio
4  BROWN-J39 1961     AmE academic  preposition r a bear in a given instance , notwithstanding any amount of forethought and 
5    LOB-A30 1961     BrE    press  preposition ncerned with council affairs . notwithstanding this terrific strain , the May
6    LOB-B18 1961     BrE    press  preposition he risk in the winter months , notwithstanding the promise of a free pint of 

Der Data Frame enthält alle Treffer für die Adposition notwithstanding aus den Korpora BROWN (Amerikanisches Englisch, 1961), LOB (Britisches Englisch, 1961), FROWN (Amerikanisches Englisch, 1991) und FLOB (Britisches Englisch, 1991). In der ersten Spalte findet sich die Quellenangabe (Korpus und Dateiname), in der zweiten Spalte das Jahr, in der dritten Spalte die Varietät, in der vierten Spalte die Textsorte und in der fünften Spalte die Information, ob die adposition als Präposition oder Postposition verwendet wird.

Wir können mit dem Befehl table() nun zum Beispiel eine Häufigkeitstabelle der Spalte AdpType erstellen, um zu sehen, wie häufig das Wort jeweils as Präposition bzw. Postposition verwendet wird.

table(ntwth$AdpType)

postposition  preposition 
          10           27 
AUFGABE: Erstellen Sie eine Häufigkeitstabelle für die Spalte „Variety“ um zu sehen, ob die Adposition im Britischen oder amerikanischen Englisch häufiger ist. 2)

Bedingte Häufigkeiten

Einfache Häufigkeitsverteilungen spielen in den Philologien manchmal eine Rolle — etwa im Fall von Listen mit Wortform- oder Lemmahäufigkeiten. Typischerweise untersuchen wir aber nicht die Häufigkeit der verschiedenen Ausprägungen einer Variable, sondern die Häufigkeit des gemeinsamen Auftretens der verschiedenen Ausprägungen von (mindestens) zwei Variablen — oder anders gesagt, die Häufigkeiten der verschiedenen Ausprägungen einer Variable unter verschiedenen Bedingungen. Solche bedingten Häufigkeiten — das gemeinsame Vorkommen der Ausprägungen von zwei Variablen — werden typischerweise in Kreuztabellen dargestellt.

Kreuztabellen

Auch Kreuztabellen können wir mit dem Befehl table() erzeugen, indem wir statt einer zwei Spalten einer Tabelle angeben.

Um z.B. eine Kreuztabelle für die Variablen „Adpositionstyp“ und „Jahr“ zu erstellen, geben wir Folgendes ein:

table(ntwth$AdpType,ntwth$Year)

Das Ergebnis sieht so aus — es scheint, dass die postpositionale Verwendung seit den 1960er Jahren zugenommen hat.

               1961 1991
  postposition    1    9
  preposition    15   12

Legen wir diese Kreuztabelle in der Variable ntwth_atyr (kurz für “notwithstanding, adposition type, year”) ab, um sie weiter zu bearbeiten:

table(ntwth$AdpType, ntwth$Year) -> ntwth_atyr
AUFGABE: Erstellen Sie eine Kreuztabelle für die Variablen „Adpositionstyp“ und „Varietät“. Für welche Varietät ist die postpositionale Verwendung typischer? 3)

Alternativ können wir Kreuztabellen auch von Hand erzeugen. Dazu erstellen wir zunächst einen Vektor mit den Werten, die wir spaltenweise von oben nach unten eingeben. In unserem Fall also c(1, 15, 9, 12). Dann verwenden wir den Befehl matrix() um daraus eine Kreuztabelle zu machen. Dieser Befehl erfordert zwei Parameter: erstens einen Vektor mit den Daten, zweitens den Parameter ncol, der angibt, wie viele Spalten die Kreuztabelle haben soll. In unserem Fall lautet der Befehl also

matrix(c(1, 15, 9, 12), ncol=2) -> ntwth_atyr

Kreuztabellen umformen

Egal, ob wir eine Kreuztabelle mittels table() aus einem Data Frame oder mittels matrix() von Hand erstellt haben, können wir sie nun auf verschiedene Arten umformen.

Spalten- und Zeilennamen ändern

Mit den Befehlen colnames() bzw. rownames() können wir uns die Spalten- bzw. Zeilennamen einer Kreuztabelle anzeigen lassen:

colnames(ntwth_atyr)
[1] "1961" "1991"

</code> rownames(ntwth_atyr) [1] “postposition” “preposition” </code>

Wir können diese Spalten- und Zeilennamen ändern, indem wir einen Vektor mit den gewünschten Namen erzeugen und wie folgt zuweisen:

rownames(ntwth_atyr) <- c("Postpos.", "Prepos.")

Wenn wir uns die Tabelle anzeigen lassen, hat sie nun die neu zugewiesenen Namen:

ntwth_atyr
          
           1961 1991
  Postpos.    1    9
  Prepos.    15   12
AUFGABE: Weisen Sie den Spalten die Namen 1960s bzw. 1990s zu. 4)

Kreuztabellen drehen

Mit dem Befehl t() können wir die Tabelle transponieren, also Spalten und Zeilen tauschen:

t(ntwth_atyr)
       
        Postpos. Prepos.
  1960s        1      15
  1990s        9      12

Spalten oder Zeilen anders anordnen

Wie schon bei Data Frames gesehen (Übungseinheit 1) können wir uns einzelne Zellen, einzelne Spalten oder einzelne Zeilen einer Kreuztabelle anzeigen lassen, indem wir den Namen der Tabelle gefolgt von der Zeilennummer und/oder Spaltennummer in eckigen Klammern eingeben, z.B.

ntwth_atyr[1,1]
ntwth_atyr[1,]
1960s 1990s 
    1     9 
ntwth_atyr[,2]
Postpos.  Prepos. 
       9       12 

Diese Funktion können wir auch nutzen, um Zeilen oder Spalten (oder beides) anders anzuordnen: Wir geben dazu statt einer Zeilen- oder Spaltennummer einen Vektor mit den Zeilen- oder Spaltennummern in der gewünschten Reihenfolge ein.

Um z.B. die erste und zweite Zeile zu tauschen (und so die Präpositionen vor den Postpositionen aufzuführen), geben wir ein:

ntwth_atyr[c(2,1),]
          
           1960s 1990s
  Prepos.     15    12
  Postpos.     1     9
AUFGABE: Tauschen Sie die erste und zweite Spalte miteinander. 5)

Wenn wir unsere Daten in das richtige Format gebracht haben, können wir in R sehr einfach verschiedene statistische Tests anwenden. Der bekannteste und flexibelste dieser Tests ist der Chi-Quadrat-Test.

Der Chi-Quadrat-Test

Der Chi-Quadrat-Test berechnet die Irrtumswahrscheinlichkeit indem er aus einer Tabelle zunächst durch den gewichteten Vergleich der erwarteten und beobachteten Häufigkeiten eine Kennzahl errechnet, deren Verteilung sich mathematisch bestimmen lässt, und aus dieser dann unter Einbeziehung der Tabellengröße den p-Wert errechnet. Die erwarteten Häufigkeiten sind dabei die Häufigkeiten, mit denen die Ausprägungen der verschiedenen Variablen gemeinsam hätten auftreten müssen, wenn sie zufällig verteilt wären.

Für Sie wichtig ist dabei: der Chi-Quadrat-Test errechnet die erwarteten Häufigkeiten und die Irrtumswahrscheinlichkeit aus einer Kreuztabelle mit beobachteten Häufigkeiten.

Der Befehl dafür lautet chisq.test().

Um den Chi-Quadrat-Test auf die Kreuztabelle ntwth_atyr anzuwenden, geben Sie folgendes ein:

chisq.test(ntwth_vryr,corr=F)

Vergessen Sie dabei nicht den Parameter corr=F: R führt sonst eine sogenannte „Kontinuitätskorrektur“ durch, eine in der statistischen Literatur umstrittene Korrektur des p-Wertes.

Die Ausgabe in diesem Fall ist:

	Pearson's Chi-squared test

data:  ntwth_atyr
X-squared = 6.1703, df = 1, p-value = 0.01299

Warning message:
In chisq.test(ntwth_atyr, corr = F) :
  Chi-squared approximation may be incorrect

Entscheidend ist die dritte Zeile, in der der Chi-Quadrat-Wert (die oben erwähnte statistische Kennzahl), die Freiheitsgrade (df, eine Kennzahl für die Größe der Tabelle), und — am wichtisten — die Irrtumswahrscheinlichkeit (der p-Wert) genannt wird. Die Warnung darunter ergibt sich aus der Tatsache, dass aufgrund unserer recht kleinen Stichprobe die erwarteten Häufigkeiten einiger Variablenkombinationen sehr klein sind — der Chi-Quadrat-Test wird in diesen Fällen etwas ungenau.

Um die erwarteten Wahrscheinlichkeiten ausgeben zu lassen, fügen Sie dem oben dargestellten Befehl hinten ein $expected an:

chisq.test(ntwth_atyr, corr = F)$expected

Das Ergebnis ist:

               1960s     1990s
  Postpos.  4.324324  5.675676
  Prepos.  11.675676 15.324324

Wir sehen: die Verwendung von notwithstanding als Postposition ist Anfang der 1990er Jahre häufiger als erwartet, der als Präposition entsprechend seltener als erwartet. Obwohl die Abweichungen gering sind, ist das Ergebnis statistisch signifikant.

Allerdings hatten wir ja die Warnung bezüglich der sehr zu geringen erwarteten Häufigkeiten: Um uns etwas abzusichern, können wir mit der Funktion chisq.test() auch einen „simulierten“ p-Wert berechnen — hier werden aus den Randhäufigkeiten der Tabelle per Zufall mögliche Kreuztabellen erzeugt und unsere beobachteten Häufigkeiten werden mit diesen Zufallshäufigkeiten verglichen.

Dazu müssen wir den Parameter simulate.p.value=TRUE hinzufügen, mit dem Parameter B können angeben, wieviele Zufallstabellen erzeugt werden sollen. Per Voreinstellung sind das 2000, aber wir gönnen uns hier einmal 10000:

chisq.test(ntwth_atyr,simulate.p.value=TRUE, B=10000)

Der Output zeigt, dass das Ergebnis auch im Vergleich zu einer algorithmisch erzeugten Zufallsverteilung statistisch signifikant ist:

	Pearson's Chi-squared test with simulated p-value (based on 10000
	replicates)

data:  ntwth_atyr
X-squared = 6.1703, df = NA, p-value = 0.0259

Wie oben erwähnt, kann der Chi-Quadrat-Test auch auf Kreuztabellen angewendet werden, die größer als 2 × 2 sind — zum Beispiel die Kreuztabelle für die Variablen Adpositionstyp und Texttyp:

table(ntwth$AdpType,ntwth$TxtType)
              
               academic admin essay fiction press
  postposition        1     0     6       0     3
  preposition        11     5     5       1     5
AUFGABE: Rechnen Sie den Chi-Quadrat-Test für diese Tabelle.

Einfache Balkendiagramme erstellen

Kreuztabellen lassen sich gut in Form von Balkendiagrammen (barplots) visualisieren. Auch das kann R. Sie verwenden dazu den Befehl barplot().

Um zum Beispiel ein einfaches Balkendiagramm für die Kreuztabelle mit Jahr und Adpositionstyp zu erstellen, verwenden Sie den Befehl wie folgt:

barplot(ntwth_atyr,ylim=c(0,30), beside=TRUE, col=c("darkblue","darkred"), legend=T,space=c(0.1,0.4))

Der erste Parameter ist der Name der Datenstruktur (einer Kreuztabelle), aus der Sie den Barplot erstellen wollen.

Der zweite Parameter (ylim) gibt das untere und obere Ende der Y-Achse an. Das untere Ende ist dabei normalerweise 0, das obere Ende müssen Sie so wählen, dass es oberhalb des höchsten Wertes in ihrer Tabelle liegt. Da der höchste Wert in unserer Kreuztabelle 15 ist, ist der Wert 30 hier höher, als er sein müsste.

AUFGABE: Setzen Sie diesen Wert stattdessen auf 20. 6)

Der dritte Parameter (beside) gibt an, ob die Balken nebeneinander angezeigt werden sollen (TRUE) oder ob sie übereinander gelegt (stacked) werden sollen.

AUFGABE: Setzen Sie den Wert auf FALSE uns sehen Sie sich das Ergebnis an. 7)

Der vierte Parameter (col) gibt an, welche Farbe die Balken haben sollen. Als Wert braucht er einen Vektor, der so viele Elemente hat, wie Ihre Tabelle Zeilen hat. Als Werte dieses Vektors können Sie alle Farbnamen des Webcolor-Farbraums angeben (siehe Wikipedia: Web colors) — sowohl als Wörter als auch als Hexadezimalcodes.

AUFGABE: Sehen Sie sich die Wikipedia-Seite an und suchen Sie sich im Abschnitt Extended Colors Ihre Lieblingsfarben heraus. Erzeugen Sie den Plot mit diesen Farben neu.

Der letzte Parameter (space) bestimmt die Räume zwischen den Balken. Er benötigt einen Vektor mit zwei Werten: erstens, dem Abstand zwischen den Balken innerhalb einer Gruppe, zweitens, dem Abstand zwischen den Gruppen von Balken.

AUFGABE: Verändern Sie diese Abstände, um ein Gefühl für diesen Parameter zu bekommen.

In der Übungseinheit 5 (Einfache Grafiken erstellen) erfahren Sie u.a. mehr über die Steuerung der verschiedenen Aspekte von Barplots.

1)
Das geht mit dem Befehl read.table(file.choose(), header=TRUE, sep=“,”, quot=“\”“) → ntwth. Statt file.choose() können Sie den Dateipfad zu der heruntergeladenen Datei natürlich auch direkt angeben, oder Sie können die URL verwenden.
2)
Das geht mit dem Befehl table(ntwth$Variety).
3)
Das geht mit dem Befehl table(ntwth$AdpType,ntwth$Variety); die postpositionale Verwendung scheint für das amerikanische Englisch typischer zu sein.
4)
Das machen Sie mit colnames(ntwth_atyr) ← c(“1960s”, “1990s”) — lassen Sie sich das Ergebnis dann mit ntwth_atyr anzeigen, um zu überprüfen, dass es funktioniert hat.
5)
Das geht mit dem Befehl ntwth_atyr[,c(2,1)].
6)
Das geht mit barplot(ntwth_atyr,ylim=c(0,20), beside=TRUE, col=c(“darkblue”,”darkred“), legend=T,space=c(0.1,0.4)).
7)
Da der höchste Wert nun 21 ist (der Gesamtwert der zweiten Spalte), müssen Sie den Wert der Y-Achse wieder heraufsetzen.