Courtesy of pxhere

Problemstellung

Datensammlung

Als Datengrundlage musst du, wie unter Vorbereitung beschrieben, einen deiner WhatsApp Chats exportieren und in R einlesen.

Datenaufbereitung

Wenn du dir nun den Datensatz anschaust, dann wirst du sehen, dass es in manchen Zeilen keinen Absender und keine Zeitangabe gibt. Das passiert, wenn jemand einen Absatz in seiner Nachricht gemacht hat. Um dies zu beheben müssen wir erst alle Zeilen identifizieren, die dieses Problem aufweisen. Nun musst du die Uhrzeit und den Absender aus der vorherigen Nachricht kopieren und in den ersten beiden Spalten der folgenden Nachricht einfügen.

Es gibt noch zwei weitere Sonderfälle in unserem Datensatz. Das sind die ausgeschlossenen Medien, oder wenn jemand dem Chat beigetreten ist bzw. ihn verlassen hat. Zweiteres kannst du wie bei den Absätzen verändern, nur dass hier nichts rein kopiert werden soll, sondern die ganze Zeile gelöscht wird.
Die ausgeschlossenen Medien entsprechen immer der gleichen Benachrichtigung, daher kannst du alle Zeilen, die dieses Muster aufweisen, auswählen und löschen.
Wenn du dir nun deinen Datensatz anschaust, sollte er keine leeren Zeilen oder Spalten mehr aufweisen. Damit hast du einen großen Schritt geschafft und wir können anfangen, mit dem Datensatz zu arbeiten.

Darstellung

Es ist immer sehr gut, wenn man vor einer Analyse erst eine Vorstellung von den Daten bekommt. Das geht am besten, indem man sie visualisiert.
Dazu gibt es verschiede Möglichkeiten: Wir können mit den Basic-Funktionen von R oder mit ggplot arbeiten. Ich habe mir ein paar Diagramme überlegt, die ich für sinnvoll halte, wenn dir aber etwas anderes einfällt, kannst du das gerne dazu machen.

  • Wer schreibt am häufigsten?
    • als Kreisdiagramm (basic)
    • als Balkendiagramm (ggplot)
  • Wann schreibt ihr am meisten?
    • über die gesammte Zeit verteilt
    • Tageszeit
    • Wochentage

Zeitanalyse

Im ersten Schritt unserer Analyse schauen wir, wer am schnellsten antwortet. Dafür vergleichen wir den Durchschnitt der Antwortzeiten aller Personen. Für die Antwortzeiten wird von jeder Uhrzeit die Uhrzeit der darauffolgenden Nachricht abgezogen. Wenn du dir die Antwortzeiten anschaust, fällt dir dann etwas auf?
Wie du vielleicht von der Datenaufbereitung noch im Hinterkopf hast, werden aus Nachrichten mit einem Zeilenumbruch zwei Nachrichten in unserem Datensatz. Daher müssen wir alle Nachrichten ausschließen, bei denen Absender und Beantworter gleich sind.
Wenn du den Durchschnitt ausrechnest, überlege zunächst welches Maß das sinnvollste ist.

Für unseren Freundetest erstellen wir nun eine neue Tabelle, in der wir Punkte vergeben. In dieser Tabelle müssen die Namen aller Teilnehmer und das Ergebnis der Zeitanalyse stehen. Für die Punktevergaben gibt es einen einfachen Befehl. Versuche ihn über die Hilfefunktion zu finden oder schaue sonst unter Tipps

Stimmungsanalyse

Für die Stimmungsanalyse benötigen wir zwei Pakete: Udpipe und ggplot2, wie in der Vorbereitung schon beschrieben. Udpipe ermöglicht es, Sprache in ihre Einzelteile zerlegen und in ein einheitliches Datenformat umwandeln zu können. Im Anschluss können wir diese Einzelteile (und damit den Text, aus dem sie kommen) auf ihre Emotionalität (Sentiment) analysieren. In unserem Beispiel benutzen wir dafür Sentistrength (z.B. Thelwall & Buckley, 2013), ein Ansatz in dem jedes Wort in einem Wörterbuch nachgeschlagen wird, um zu sehen, wie emotional geladen es ist. Wenn du es mit einem Beispielsatz ausprobieren willst, kannst du es hier mit dem “Detect Sentiment in German”-Button mal ausprobieren. Dieses Vorgehen werden wir auf den gesamten WhatsApp-Chat anwenden.

Damit das möglich ist, musst du die drei passenden Tabellen für unsere Analyse in R einlesen.
Tipp: Schau dir eine Datei vor dem Einlesen immer an - welche Trennzeichen sind vorhanden und gibt es eine Überschrift der Spalten?

Bei der ersten Datei „EmotionLookupTable“ handelt es sich um eine Liste von Wörtern, welche einen Score haben, der aussagt, wie stark positiv oder negativ die Bedeutung des Wortes ist. Zum Beispiel hat das Wort „grausam“ einen Score von -4, weil es sehr stark negativ geprägt ist. Im Gegensatz dazu hat das Wort „Niederlage“ einen Score von -1, weil es zwar negativ geprägt ist, aber nicht in dem gleichen Ausmaß wie „grausam“.

In der zweiten Liste „BoosterWordList“ befinden sich sogenannte Verstärker. Auch hier wird jedem Wort ein Score zwischen -1 und 2 zugewiesen . Dabei bedeutet -1, dass es sich um einen Abschwächer handelt und bei 1, um einen Verstärker. Es gibt auch Worte mit 0, die als neutral gelten.

Die dritte Datei „NegatingWordList“ ist eine Liste mit Wörtern, die die Bedeutung umkehren können. Wenn zum Beispiel später in der Chatanalyse der Satz „ich habe heute gar keine Lust!“ vorkommt, erkennt der Computer das Wort „Lust“ als ein sehr positiv geprägtes Wort. Daher benötigen wir diese Liste, um Verneinungen zu erkennen.

Um diese Dateien zu benutzten, müssen wir zunächst die “EmotionLookupTable” in einen Dataframe bringen. Die “BoosterWordList” müssen wir aufteilen in Verstärker und Abschwächer.
Die Analyse können wir sowohl nur für eine bestimmte Person machen, als auch für alle gleichzeitig. Wir werden es erst mit einer Person versuchen, um es im Anschluss auf alle zu erweitern. Such dir einfach eine Person aus deinem Chat aus und speichere alle Nachrichten von ihr als Character in einer neuen Variable.

Nun kommt unser Udpipe-Paket zum Einsatz. Schau dir den Befehl udpipe() an. Er zerlegt den Quellcode in sogenannte Tokens. Tokens sind logische Einheiten an Wörtern. Bezogen auf unser Beispiel von eben würde der Satz „Ich habe heute überhaupt keinen Spaß!“ in:

Ich | Habe | Heute | überhaupt | keinen | Spaß

zerlegt werden.

Die wichtigen Wörter hierbei sind:
- überhaupt ist ein Verstärker
- keine ist ein Negator
- Spaß ist das emotionale Wort

Diese Tokens können nun analysiert werden mit dem Befehl txt_sentiment. Schau dir den Befehl am besten als erstes einmal an. Du hast alles eingelesen, was du für den Befehl brauchst. Um dir das Ergebnis anzuschauen, musst du es einer neuen Variable zuweisen und kannst, wenn du die Spalte overall aufrufst, dein Ergebnis in der Console sehen.

Um diese Analyse mit dem ganzen Chat zu machen, benötigst du erst einen Dataframe, in dem der Chat als Character gespeichert ist. Im Anschluss musst du die Nachrichten wieder verketten. Dies ist mit allen Mitgliedern ein bisschen komplizierter, aber im Grundsatz das Gleiche wie bei der einzelnen Person.

Danach kannst du wie eben vorgehen. Wenn du dir am Ende dein Ergebnis anschaust, stehen dort keine Namen mehr. Du kannst der neuen Tabelle aber einfach die Namen aus der Chatdatei zuweisen.

Für unseren Test ist wichtig, dass jede Person einen Wert bekommen hat. Je höher dieser Wert, desto mehr positive Stimmungen wurden von ihr verbreitet. Wenn du diesen Wert in unserer Punktetabelle speicherst, dann kannst du, wie bei der Zeitanalyse, Rangpunkte vergeben.

Zum Schluss solltest du einen Endscore errechenen und so ein Ergebnis haben, wer dein bester Freund/deine beste Freundin ist. Und? Überrascht?

Hilfe und Lösungen

Falls du nicht weiterkommst, kannst du dir kleine Denkanstöße bei unseren Tipps holen. Wir bitten dich aber, dass du wirklich erst selbst probierst, das Problem zu Lösen! Wenn du fertig bist kannst du deine Lösung mit unseren Lösungen vergleichen. Du musst auch nicht immer das gleiche haben, da es oft viele Wege zum Ziel gibt.

Literatur

Thelwall, M., & Buckley, K. (2013). Topic-based sentiment analysis for the Social Web: The role of mood and issue-related words. Journal of the American Society for Information Science and Technology, 64(8), 1608–1617.