Umgang mit Datensätzen in R Sitemap Übungsaufgaben zu Datensätzen

Auswertungen von Datensätzen: Zwei Beispiele

Im Folgenden werden zwei Beispiele für die Auswertung in R von Datensätzen aus Suchergebnissen von DWDS detailliert vorgestellt, eines für grafische und eines für quantitative Auswertungen. Ausgangspunkt für die Beispiele ist ein Datensatz aus den Suchergebnissen (Treffern und Metadaten) der Anfrage nach dem Lemma ‚Automobil‘ im DWDS-Kernkorpus. Zunächst führen wir die Suche durch und erstellen den Datensatz:

Für die Auswertungen fügen wir mit folgender R-Eingabe dem Datensatz eine neue Spalte hinzu, die Bezeichner für die Dekaden enthält, in denen die Treffer jeweils erscheinen:

Anmerkungen:

Jetzt machen wir die neue Spalte zur 1. Spalte des Datensatzes und löschen die Nr.- und Datum-Spalten, weil wir diese nicht mehr brauchen, und zeigen das Ergebnis:

1. Beispiel: Wortverlaufsdiagramme

Das DWDS-Abfragesystem verfügt über ein statistisches Werkzeug namens Wortverlaufskurven, das den zeitlichen Verlauf (jährlich sowie nach Dekade) eines Suchbegriffs in einer Auswahl aggregierter DWDS-Korpora sowohl nach Textklasse als auch insgesamt und unter Berücksichtigung verschiedener statistischen Einstellungen grafisch darstellt. Das Werkzeug erstellt nur Liniendiagramme und nur in aggregierten Korpora. In einer früheren Version dieses Werkzeugs konnte man zwischen zwei verschiedenen Säulendiagrammen und einem mehrfachen Liniendiagramm wählen, allerdings nur nach Dekade und Textklasse und beschränkt auf das Kernkorpus. Wir zeigen hier, wie man diese (etwas einfacheren) Darstellungen für den oben erstellten Datensatz des Lemmas ‚Automobil‘ im Kernkorpus in R nachmachen kann.

Dafür benötigen wir eine Häufigkeitsverteilung des Suchbegriffs gleichzeitig gruppiert nach Dekade und Textklasse. Solche Häufigkeitsverteilungen, die alle Kombinationen der Werte von zwei Variablen enthalten, kommen sehr oft in statistischen Untersuchungen vor und in tabellarischer Form heißen sie Kontingenztafeln. In R können wir Kontingenztafeln mit der Funktion table() bilden. Die Argumente dieser Funktion sind Vektoren der Werte aus den entsprechenden Spalten des Datensatzes:

Für die grafischen Darstellungen verwenden wir die Funktionen barplot() und plot(), jeweils mit dem Argument col, um die Verteilungen farblich zu unterscheiden. Die zwei Säulendiagramme werden durch das Argument beside unterschieden: Mit dem voreingestellten Wert FALSE werden die Säulen der Textklassen in jeder Dekade gestapelt, wodurch die Gesamthäufigkeit pro Dekade deutlich wird; mit dem Wert TRUE werden die Säulen der Textklassen in jeder Dekade nebeneinander dargestellt, wodurch der direkte Vergleich zwischen den Textklassen erleichtert wird:

Für das mehrfache Liniendiagramm ist es sinvoll, nicht nur ein Liniendiagramm pro Textklasse zu erstellen sondern auch noch eines für das gesamte Korpus, was praktisch den Darstellungen beider Säulendiagramme zusammen entspricht. Die Werte für das Gesamtkorpus sind die Summen der Werte pro Dekade, also der Spalten der oben erstellten Kontingenztafel, die man mithilfe der Funktion addmargins() erhalten kann:

Damit alle Liniendiagramme auf dieselbe grafische Fläche passen, muss man zuerst das Diagramm mit dem größten Wert der Häufigkeitstabelle erstellen, also das Liniendiagramm für das Gesamtkorpus. Das kann man mit plot() machen und anschließend die übrigen Diagramme mit der Funktion points() hinzufügen (weil weitere plot()-Aufrufe bestehende Grafiken löschen würden):

Wenn Sie alle der vorangehenden Anweisungen zur Erstellung der drei Verlaufsdiagramme in R eingeben, werden Sie sehen, dass die resultierende Grafiken ziemlich minimalistisch sind, ohne schöne und informative Beschriftungen. Außerdem ist es mühsam, diese Anweisungen für andere Kontingenztafeln jedes Mal einzeln einzugeben. Daher, um die Erstellung solcher Grafiken auch mit anderen Suchbegriffen zu erleichtern, haben wir eine R-Funktion definiert: dwds.wortverlauf() (die wie gehabt mit dem source-Aufruf in R geladen wird). Diese Funktion nimmt fünf Argumente, die ersten zwei sind obligatorisch und die übrigen optional (weil sie voreingestellte Werte haben):

Die Funktion erstellt auch automatisch passende Beschriftungen der x- und y-Achse sowie einen Raster auf der grafischen Fläche, um die Häufigkeiten besser ablesen zu können. Hier sind drei Aufrufe dieser Funktion und die damit erzeugten Grafiken für Häufigkeitsverteilungen des Lemmas ‚Automobil‘ (wenn Sie die Grafiken gleichzeitig in je einem Fenster sehen wollen, rufen Sie dev.new() vor dem zweiten und dritten Aufruf auf):

2. Beispiel: Maße von Häufigkeitsverteilungen

Als zweites Beispiel zeigen wir, wie man verschiedene Lage- und Streuungsmaße von einzelnen und gruppierten Häufigkeitsverteilungen aus Datensätzen berechnen kann. Ausgangspunkt hier sind die Längen in Zeichen (eine Verhältnisvariable) der Treffer in unserem Auto-Datensatz auto.kk.df; diese Längen ermitteln wir mit die R-Funktion nchar() (wir könnten den sich ergebenden Vektor dem Datensatz als neue Spalte hinzufügen, wie wir es oben mit der Variable Dekade gemacht haben, aber das wäre für dieses Beispiel ein unnötiger Aufwand, daher belassen wir es beim Vektor):

Die Spannweite können wir mit range() und diff() wie vorher berechnen, oder alternativ auch, indem wir den längsten und den kürzesten Treffer mit den Funktionen max() und min() ermitteln:

Für den Modalwert der Trefferlängen müssen wir eine Häufigkeitstabelle der Trefferlängen erstellen und können dann wie schon gesehen die Funktion which.max() verwenden:

Demnach wäre der Modalwert die Trefferlänge 139 (die „Namen“ der Trefferlängen sind einfach die jeweiligen Zahlen), die das 102. Element der Häufigkeitstabelle ist. Wir haben aber schon darauf hingewiesen, dass, wenn die Verteilung mehr als einen häufigsten Wert hat, which.max() nur den ersten ausgibt. Um das zu überprüfen, können wir mit max() die größte Häufigkeit ermitteln und mit which() herausfinden, ob es mehrere Werte mit dieser Häufigkeit gibt:

Die maximale Häufigkeit der Trefferlängen ist also 8, aber wie wir sehen, weisen zwei verschiedene Längen diese Häufigkeit auf: 139 und 163. Demnach handelt es sich eigentlich um eine bimodale Verteilung.

Für die übrigen Lage- und Streuungsmaße brauchen wir nur den Vektor der Trefferlängen:

Diese Ergebnisse deuten auf eine sehr schiefe Häufigkeitsverteilung der Trefferlängen hin, und grafische Darstellungen bestätigen das:

Wiederholungen von Treffern

Der längste Treffer ist offenbar ein extremer Ausreißer – oder vielmehr, wie der plot()-Aufruf grafisch bestätigt, handelt es sich um zwei gleichwertige extreme Ausreißer. Und diese Grafik zeigt auch, dass auch die zweitlängste Trefferlänge zweimal vorkommt. Eine numerische Bestätigung der grafischen Beobachtungen gibt die folgende R-Anweisung, die die sechs größten Trefferlängen ausgibt:

Diese zwei wiederholten Längen muten seltsam an. Aber es stellt sich heraus, dass es sich bei diesen vier längsten Treffern lediglich um zwei Sätze handelt, die beide in den Suchergebnissen zweimal vorkommen, wie folgende R-Eingaben beweisen:

Warum gibt es mehr als einen Treffer desselben Satzes (bzw. derselben zwei Sätze)? Das liegt daran, dass in DWDS die absolute Häufigkeit eines Suchbegriffs mit der Anzahl der Treffer gleichgesetzt wird und als Treffer zählen komplette Sätze. Folglich, wenn der Suchbegriff mehr als einmal im selben Satz vorkommt, soll dieser Satz so oft als Treffer in DWDS erscheinen, wie es Vorkommen des Suchbegriffs im Satz gibt. Das ist für die Berechnung der absoluten Häufigkeit des Suchbegriffs nützlich aber für die Berechnung bestimmter Lage- und Streuungsmaße eines Merkmals wie Satzlänge problematisch, wie wir gleich sehen werden.

Es gibt allerdings in DWDS die Möglichkeit, die wiederholte Anzeige eines Treffersatzes zu unterbinden: Bei der Eingabe des Suchbegriffs hängt man am Ende der Anfrage das Schlüsselwort ‚#JOIN‘ dran (siehe hierzu die DWDS-Hilfeseite zu Korpussuche). Z.B. zeigt DWDS als Ergebnis der Sucheingabe ‚Automobil #JOIN‘ 722 Treffer (783 insgesamt) an, im Gegensatz zu 733 Treffer (794 insgesamt) bei der Sucheingabe ‚Automobil‘. Das Ergebnis einer „normalen“ Suche mit diesem Suchbegriff enthält also 11 wiederholte Treffersätze.

Auch in R gibt es die Möglichkeit, aus DWDS exportierte Datensätze so zu verarbeiten, dass Wiederholungen von Treffersätzen nicht gezählt werden: die eingebaute Funktion unique() ignoriert alle Wiederholungen von identischen Elementen eines Vektors oder eines Datensatzes:

Die Auswirkungen von Wiederholungen für die Berechnungen von Lage- und Streuungsmaßen in diesem Datensatz zeigt ein Vergleich der Berechnungen mit und ohne Wiederholungen:

Ohne Treffer-Wiederholungen bleiben der Modalwert, die Feststelling einer bimodalen Verteilung, die Spannweite und der Median unverändert, und das 1. und das 3. Quartil, und damit der Interquartilsabstand, sind nur geringfügig kleiner als die entsprechenden Werte mit Wiederholungen. Dagegen sind das arithmetische Mittel und die Standardabweichung deutlich kleiner als die Werte dieser Maße mit Wiederholungen. Mit einem anderen Datensatz könnten die Daten so sein, dass auch die anderen Maße unterschiedliche Werte mit und ohne Wiederholungen haben, wenn es genug Wiederholungen mit Werten gibt, die diese Maße beinflussen.

Auch ohne die wiederholten Sätze bleibt die Gestalt der Häufigkeitsverteilung fast unverändert, wie man sehen kann, wenn man grafische Darstellungen wie die obigen mit treffer.laengen2 und tl.tab2 erstellt. Das liegt an der extremen Länge des längsten Satzes. Wenn man entsprechende Häufigkeitsverteilungen in vielen anderen Korpora erstellt und dabei feststellt, dass solche extreme Ausreißer selten vorkommen, kann man sie als statistische Anomalien betrachten und damit als nicht repräsentativ für die wirkliche Verteilung in der Sprache. Dementsprechend könnte es aufschlussreich sein die Verteilung, die Lage- und Streuungsmaße sowie grafische Darstellungen ohne diesen Ausreißer zu erstellen. Den Effekt dieser Überlegung für unser Beispiel zeigen folgende Ein- und Ausgaben in R:

Es ist zwar immer noch eine sehr schiefe Häufigkeitsverteilung aber bei weitem nicht so extrem wie vorher. Und es fällt auch hier auf, dass die Modalwerte und der Median immer noch diesselben sind, und auch der Interquartilsabstand kaum verändert bleibt, aber die Spannweite, das arithmetische Mittel und die Standardabweichung jetzt sehr viel kleiner sind.

Statistiken gruppiert nach Merkmalsausprägungen

Die bisher berechneten Lage- und Streuungsmaße beziehen sich auf den ganzen Datensatz, aber kann interessant und aufschlussreich sein, Statistiken auch bezüglich der verschiedenen Ausprägungen von Datensatzmerkmalen zu berechnen, z.B. der Textklassen und der Dekaden.

Zuerst sollten wir aber die wiederholten Sätze aus dem Datensatz entfernen, weil es ja immer noch um Statistiken von Satzlängen geht. Weil wir oben gesehen haben, dass es in unserem Datensatz bei Wiederholungen in der Treffer-Spalte auch Wiederholungen in den entsprechenden Zellen der anderen Spalten gibt, genügt folgende Eingabe zum Entfernen der Wiederholungen, wie die Ausgabe von nrow() nochmals bestätigt:

Jetzt können wir z.B. das arithmetische Mittel der Trefferlängen in Bezug auf Textklasse mit Hilfe von Indizierung ermitteln:

Diese Vorgehensweise ist zugegebenermaßen umständlich, umso mehr, wenn wir z.B. das arithmetische Mittel der Trefferlängen in Bezug auf Dekade berechnen wollen (dann bräuchten wir 10 Berechnungen). Aber R bietet eine viel einfachere Möglichkeit Kennzahlen zu gruppieren, und zwar mit der Funktion tapply():

Das erste Argument von tapply() ist ein Vektor, auf dem eine Berechnung durchgeführt werden soll; das zweite Argument bestimmt die Gruppierung der Ergebnisse; und das dritte Argument ist die Funktion, die die Berechnung macht.

Man kann mit tapply() auch mehrfache Gruppierungen machen; dann muss das zweite Argument eine Liste sein, die mit der Funktion list() gebildet wird:

Die Einträge ‚NA‘ in der Kontingenztafel bedeuten, dass es für den Suchbegriff keine Treffer mit diesen Kombinationen von Textklasse und Dekade (also Belletristik und 1990er, Wissenschaft und 1920er, Zeitung und 1960er) im Korpus gibt.

Umgang mit Datensätzen in R Sitemap Übungsaufgaben zu Datensätzen