**[ [[r:de:introduction|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 [[r:de:first-steps#data_frames_tabellen|Übungseinheit 1]] gelernt haben. Geben Sie ihr den Namen nwth. ((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.)) 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. ((Das geht mit dem Befehl ''table(ntwth$Variety)''.)) ==== 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? ((Das geht mit dem Befehl ''table(ntwth$AdpType,ntwth$Variety)''; die postpositionale Verwendung scheint für das amerikanische Englisch typischer zu sein.)) 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" rownames(ntwth_atyr) [1] "postposition" "preposition" 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. ((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.)) === 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. * die linke obere Zelle: ntwth_atyr[1,1] * die erste Zeile: ntwth_atyr[1,] 1960s 1990s 1 9 * die zweite Spalte 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. ((Das geht mit dem Befehl ''ntwth_atyr[,c(2,1)]''.)) 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. ((Das geht mit ''barplot(ntwth_atyr,ylim=c(0,20), beside=TRUE, col=c("darkblue","darkred"), legend=T,space=c(0.1,0.4))''.)) 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. ((Da der höchste Wert nun 21 ist (der Gesamtwert der zweiten Spalte), müssen Sie den Wert der Y-Achse wieder heraufsetzen.)) 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 [[https://en.wikipedia.org/wiki/Web_colors|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.