Nearly one year ago, I analyzed how we use emojis in our Slack messages. Since then, STATWORX grew, and we are a lot more people now! So, I just wanted to check if something changed.

Last time, I did not show our custom emojis, since they are, of course, not available in the fonts I used. This time, I will incorporate them with geom_image(). It is part of the ggimage package from Guangchuang Yu, which you can find here on his Github. With geom_image() you can include images like .png files to your ggplot.

What changed since last year?

Let’s first have a look at the amount of emojis we are using. In the plot below, you can see that since my last analysis in October 2018 (red line) the amount of emojis is rising. Not as much as I thought it would, but compared to the previous period, we now have more days with a usage of over 100 emojis per day!

Like last time, our top emoji is 👍, followed by 😂 and 😄. But sneaking in at number ten is one of our custom emojis: party_hat_parrot!

top-10-used-emojis

How to include custom images?

In my previous blogpost, I hid all our custom emojis behind❓since they were not part of the font. It did not occur to me to use their images, even though the package is from the same creator! So, to make up for my ignorance, I grabbed the top 30 custom emojis and downloaded their images from our Slack servers, saved them as .png and made sure they are all roughly the same size.

To use geom_image() I just added the path of the images to my data (the are just an abbreviation for the complete path).

                NAME COUNT REACTION IMAGE
1:         alnatura   25       63 .../custom/alnatura.png
2:             blog   19       20 .../custom/blog.png
3:           dataiku   15       22 .../custom/dataiku.png
4: dealwithit_parrot     3     100 .../custom/dealwithit_parrot.png
5:     deananddavid   31       18 .../custom/deananddavid.png

This would have been enough to just add the images now, but since I wanted the NAME attribute as a label, I included geom_text_repel from the ggrepel library. This makes handling of non-overlapping labels much simpler!

ggplot(custom_dt, aes( x = REACTION, y = COUNT, label = NAME)) +
  geom_image(aes(image = IMAGE), size = 0.04) +
  geom_text_repel(point.padding = 0.9, segment.alpha = 0) +
  xlab("as reaction") +
  ylab("within message") +
  theme_minimal()

Usually, if a label is „too far“ away from the marker, geom_text_repel includes a line to indicate where the labels belong. Since these lines would overlap the images, I used segment.alpha = 0 to make them invisible. With point.padding = 0.9 I gave the labels a bit more space, so it looks nicer. Depending on the size of the plot, this needs to be adjusted. In the plot, one can see our usage of emojis within a message (y-axis) and as a reaction (x-axis).

To combine the emoji font and custom emojis, I used the following data and code — really… why did I not do this last time? 🤔 Since the UNICODE is NA when I want to use the IMAGE, there is no „double plotting“.

                     EMOJI REACTION COUNT  SUM PLACE    UNICODE   IMAGE
1:                   :+1:     1090     0 1090     1 U0001f44d
2:                   :joy:     609   152 761     2 U0001f602
3:                 :smile:       91   496 587     3 U0001f604
4:                   :-1:     434     9 443     4 U0001f44e
5:                 :tada:     346   38 384     5 U0001f389
6:                 :fire:     274   17 291     6 U0001f525
7: :slightly_smiling_face:       1   250 251     7 U0001f642
8:                 :wink:       27   191 218     8 U0001f609
9:                 :clap:     201   13 214     9 U0001f44f
10:     :party_hat_parrot:     192     9 201   10       <NA> .../custom/party_hat_parrot.png
quartz()
ggplot(plotdata2, aes(x = PLACE, y = SUM, label = UNICODE)) +
  geom_bar(stat = "identity", fill = "steelblue") +
  geom_text(family="EmojiOne") +
  xlab("Most popular emojis") +
  ylab("Number of usage") +
  scale_fill_brewer(palette = "Paired") +
  geom_image(aes(image = IMAGE), size = 0.04) +
  theme_minimal()
ps = grid.export(paste0(main_path, "plots/top-10-used-emojis.svg"), addClass=T)
dev.off()

The meaning behind emojis

Now we know what our top emojis are. But what is the rest of the world doing? Thanks to Emojimore for providing me with this overview! On their site, you can find meanings for a lot more emojis.

Behind each of our custom emojis is a story as well. For example, all the food emojis are helping us every day to decide where to eat and provide information on what everyone is planning for lunch! And if you do not agree with the decision, just react with sadphan to let the others know about your feelings. If you want to know the whole stories behind all custom emojis or even help create new ones, then maybe you should join our team — check out our available job offers here!

 

Once upon a time, we at STATWORX used Slack just as a messenger, but than everything changed when emojis came… Since then, we use them for all kinds of purposes. For example we take polls with them to see were we will eat lunch or we capture unforgettable moments by creating new emojis. The possibilities are limitless! But since we use them so much, I was wondering how often do we use them. And when? And which is the top-emoji?! Is it just the thumbsup?

To answer all these questions, I went on a little journey troughout my emotions.

Getting the data

The first part was to gather data. Well, since nearly every tool has a log history this was quite simple. I just had to get the history (the last year) of our Slack channels which was provided within JSONS. These I could easily load into R with the jsonlite package. To get a list of all possible emojis, I found this list from Cal Henderson who works at Slack. I added our own custom emojis to complete the list.

All that followed, was a little loop to go through each message and its reactions and count the occurences of each emoji. Combined with the timestamp given in seconds from January the first in 1970, I had my emoji time series data that looked like this:

                     EMOJI COUNT     TIME     TYPE       DATE
1: :slightly_smiling_face:     1 08:56:05  message 2018-08-10
2: :slightly_smiling_face:     1 17:08:19  message 2018-08-10
3:                  :gift:     2 08:36:04 reaction 2018-08-18
4:                   :joy:     1 13:47:10 reaction 2018-09-03
5:                    :+1:     1 13:56:12 reaction 2018-09-04

After evaluating each single text I found that more than every second chat (57%) either has an emoji in the messasge or as a reaction. So we really use them a lot!

The right timing

Since the majority was used as a reaction, I summed them up and did not distinguish between messages and reactions. To get a first idea of how often and when we use emojis I looked at a frequency plot over time. There are two things to notice: First, we see an increase over time. Well our company grew, so more people equals more emojis. Second, we tend to not use them during the weekend – who would have thought!?

emoji-over-year

But what about our daily usage? Well there seem to be some peaks. One peak appears right after wake up time, another one when we arrive at the office. Here we can distinguish between colleagues with the mobil app and the ones that just use Slack with the desktop app. There is another peak around our lunchbreak and it comes all to end before we go to bed at 22:00.

emoji-over-day

Cause and effect

Since I started this little project, more and more questions popped into my head. For example: Is there a link between the emoji’s usage within a message and as a reaction? Are there words, that trigger us to use emojis? To answer the first questions, I used the networkD3 package to plot the interaction as a sankey diagram.

emoji-sankey-category

Here we can see which categories of emojis used within a message lead to which reactions. The most commonly used category is Smileys & People followed by custom. And around 40% stay within the same category.

To answer the second question I made some wordclouds to see which words we use. The ones in orange are those where a reaction followed.

wordcloud

We can see, that we use more words with no emoji reaction than the other way around. If we only look at the ones with emoji reactions, then we get the following picture.

wordcloud-emoji

Seems that if we ask a question „heute wer mal bitte …“ („today someone please…“), we get an reaction – mostly positive.

The most common emojis

emoji-category

As we can see in the plot above, we use the emoji’s categories differently. First of all, Smileys and People are used the most. But if we look at the emoji density – which represents the percentage of unique used emoji wihtin this category – we only use a third of them. On the other hand, nearly 80% of our custom emojis were used.

To find the most commonly used emojis I looked at the top 50 emojis within messages and reactions. Also I stumbled upon two R packages (emoGG and emojifont) which let you add emojis to your ggplots. This sounded wonderful, but there was a catch! Since we work with RStudio on a Mac I could not use the RStudio plotting device, since it would not show the emojis. After a little bit of research, I found this post here, which suggested to use quartz() and grid.export with .svg for the plotting. The loaded font obviously did not have our own emojis, so I just added them as❓.

emoji-plot

So, as I thought in the beginning our top emoji is 👍, followed by 😂 and 😄.

Emoji message as reaction total
👍 0 482 482
😂 98 281 379
😄 260 49 309

But since there is a lot going on in the lower left corner – let’s have a closer look! We can see a variety of emojis beeing used with a lot of custom ones.

emoji-plotdetails

With this package, we can also update the plot showing our daily usage with the most commonly used one at the time.

emoji-over-day-with-icon

Conclusion

With this little project I just scratched the surface of possibilities to analyse the usage of emojis. If you have more ideas, I would like to see your approach and solutions. Just send me an email at blog@statworx.com. To get started you can use my code at our GitHub – not containing our whole data of course, but with an example folder with two jsons. Here you can add your own Slack history.

References

One of the functions I use the most is strsplit. It is quite useful if you want to separate a string by a specific character. Even if you have some complex rule for the split, most of the time you can solve this with a regular expression. However, recently I came across a problem I could not get my head around. I wanted to split the string but also keep the delimiter.

basic regular expressions

Let’s start at the beginning. If you do not know what regular expressions are, I will give you a short introduction. With regular expressions you can describe patterns in a string and then use them in functions like grep, gsub or strsplit.

As the R (3.4.1) help file for regex states:

A regular expression is a pattern that describes a set of strings. Two types of regular expressions are used in R, extended regular expressions (the default) and Perl-like regular expressions used by perl = TRUE. There is a also fixed = TRUE which can be considered to use a literal regular expression.

If you are looking for a specific pattern in a string – let’s say "3D" – you can just use those characters:

x <- c("3D", "4D", "3a")
grep("3D", x)
[1] 1

If you instead want all numbers followed by a upper case letter you should use regular expressions:

x <- c("3D", "4D", "3a")
grep("[0-9][A-Z]", x)
[1] 1 2

Since regular expressions can get quite complicated really fast, I will stop here and refer you to a cheat sheet for more infos. In the cheat sheet you can also find the part that gave me the trouble: lookarounds

lookarounds

Back to my problem. I had a string like c("3D/MON&SUN") and wanted to separate it by / and &.

x <- c("3D/MON&SUN")
strsplit(x, "[/&]", perl = TRUE)
[[1]]
[1] "3D"  "MON" "SUN"

Since I still needed the delimiter as it contained useful information, I used the lookaround regular expressions. First up is the lookbehind which works just fine:

strsplit(x, "(?<=[/&])", perl = TRUE)
[[1]]
[1] "3D/"  "MON&" "SUN"

However, when i used the lookahead, it did not work as I expected

strsplit(x, "(?=[/&])", perl = TRUE)
[[1]]
[1] "3D"  "/"   "MON" "&"   "SUN"

In my search for a solution, I finally found this post on Stackoverflow, which explained the strange behaviour of strsplit. Well, after reading the post and the help file – it is not strange anymore. It is just what the algorithm said it would do – the very same way it is stated in help file of strsplit:

repeat {
    if the string is empty
        break.
    if there is a match
        add the string to the left of the match to the output.
        remove the match and all to the left of it.
    else
        add the string to the output.
        break.
}

Since the look arounds have zero length, they mess up the removing part within the algorithm. Luckily, the post also gave a solution which contains some regular expression magic:

strsplit(x = x, "(?<=.)(?=[/&])",perl = TRUE)
[[1]]
[1] "3D"   "/MON" "&SUN"

So my problem is solved, but I would have to remember this regular expression … uurrghhh!

a new function: strsplit 2.0

If I have the chance to write a function which eases my work – I will do it! So I wrote my own strsplit with a new argument type = c("remove", "before", "after"). Basically, I just used the regular expression mentioned above and put it into an if-condition.
To sum it all up: Regular expressions are a powerful tool and you should try to learn and understand how they work!

strsplit <- function(x,
                     split,
                     type = "remove",
                     perl = FALSE,
                     ...) {
  if (type == "remove") {
    # use base::strsplit
    out <- base::strsplit(x = x, split = split, perl = perl, ...)
  } else if (type == "before") {
    # split before the delimiter and keep it
    out <- base::strsplit(x = x,
                          split = paste0("(?<=.)(?=", split, ")"),
                          perl = TRUE,
                          ...)
  } else if (type == "after") {
    # split after the delimiter and keep it
    out <- base::strsplit(x = x,
                          split = paste0("(?<=", split, ")"),
                          perl = TRUE,
                          ...)
  } else {
    # wrong type input
    stop("type must be remove, after or before!")
  }
  return(out)
}

Wenn man mit Matrizen arbeitet, die viele Nullen enthalten, dann sind schwachbesetzte (engl. sparse) Matrizen das richtige. Hierbei wird der benötigte Speicherplatz der Matrix reduziert, in dem der Inhalt der Matrix effizienter verwaltet wird. Es gibt verschiedene Methoden Matrizen zu komprimieren – zum Beispiel in dem nur die Tupel aus Zeile, Spalte und Wert genutzt werden. Die Matrix

A= left[ {begin{array}{cccc} 1 & 0 & 0 & 1 0 & 0 & 2 & 0 4 & 0 & 0 & 0 0 & 3 & 0 & 0 end{array} } right]

reduziert sich hierbei zu

A_{sparse} = begin{cases} 1, 1, 1 1, 4, 1 2, 3, 2 3, 1, 4 4, 2, 3 end{cases}

Durch diese Umformung müssen nicht alle Werte gespeichert werden (Nullen fallen weg), wodurch weniger Platz benötigt wird.

Für Berechnungen mit sparsen Matrizen gibt es in R das package Matrix. Die Berechnungen auf diesen Matrizen sind deutlich effektiver im Speicherverbrauch als die normale base Verwendung. Sollte man nun immer sparse Matrizen verwenden?

Problem

Letztens hatte ich ein Problem mit der Laufzeit meines R Codes und konnte durch Debugging eine Zeile als Wurzel allen Übels identifizieren.

J[, c(2,3] <- J[, c(2,3)] -  const  * B 

Hierbei waren J_{n,k} und J_{n,2} als sparse Matrizen definiert und const ein numerischer Faktor. Das Ersetzen der beiden Spalten dauerte nun sehr lange und es stellte sich raus, dass J und B voll besetzt waren – also doch nicht sparse!
Mir kamen folgende Fragen auf: Bei welchen Operationen lohnen sich sparse Matrizen? Was passiert, wenn eine Matrix nicht schwachbesetzt ist, aber sie dennoch so definiert wird?

Simulation

Um diese Fragen zu beantworten, Für diese Problemstellung habe ich eine kleine Simulation durchgeführt und mir neben dem Speicherbedarf auch die Berechnugnszeiten folgender Operationen angeschaut:

t(X)                           # Transponieren
X %*% t(X)                     # Kreuzprodukt 
X + X                          # Addition 
X * X                          # Matrixmultiplikation 
X[, c(2,3)] <- X[, c(3,2)]     # Spalten vertauschen 

Weitere Einstellungen waren die Spaltenanzahl n der quadratischen Matrix X sowie die Dichte der Nullen innerhalb der Matrix.
Den genauen Code habe ich auf unserem git hinterlegt.

Auswertung

Wie erwartet ist die Reduktion des Speicherplatzes bei kleiner Spaltenanzahl n davon abhängig, wie viele Nullen in der Matrix vorhanden sind. Je höher die Dichte der Nullen, desto geringer der Speicherbedarf. Unter einer Dichte von ca. 50% lohnt es sich nicht mehr sparse Matrizen zu verwenden, um Speicherplatz zu sparen.

Abbildunug zum Speicherbedarf

Egal wie hoch der Anteil der Nullen innerhalb der Matrix ist, bei normalen Matrizen dauern die Matrixoperationen immer gleich lang. Dies erkennt man in der Abbildung daran, dass die durchgezogenen Linien übereinander verlaufen. Bei schwachbesetzten Matrizen brauchen die Berechnungen hingegen deutlich langsamer, wenn es sich um zellenbasierte Operationen handelt. Hierunter fällt auch das Ersetzten ganzer Spalten! Dies ist verständlich, wenn man sich nochmal verdeutlicht, wie die schwachbesetzten Matrizen gespeichert werden.

Abbildung zum Zeitverbrauch

Fazit

Eine Matrix für alle Fälle gibt es nicht. Die Verwendung hängt davon ab, was optimiert werden soll (Rechenzeit oder Speichergröße). Aber auch je nachdem welche Operationen durchgeführt werden müssen, können sich schwachbesetzte Matrizen lohnen oder einem die Laufzeit verlängern!

Einer der am häufigsten verwendeten statistischen Tests ist der t-Test. Er kann unter anderem dazu genutzt werden, zu prüfen, ob der Mittelwert einer Zufallsvariable einem bestimmten Wert entspricht. Auch kann er für den Vergleich zweier Mittelwerte herangezogen werden. Wie bei jedem anderen statistischen Test auch, müssen gewisse Voraussetzungen erfüllt sein, damit der t-Test sicher eingesetzt werden kann:

  • Normalverteilung der Zufallsvariablen
  • Unabhängigkeit der Beobachtungen
  • Varianzhomogenität (im Zwei-Gruppenfall)

Wenn diese Voraussetzungen nicht erfüllt sind, ist dennoch nicht aller Tage Abend! Die Robustheit des t-Testes lässt es zu, dass bei größeren Stichprobenumfängen die Normalverteilung weniger wichtig wird(1) . Bei kleinen Stichproben gibt es nicht-parametrische Alternativen, wie den Wilcoxon-Rangsummen-Test. Eine Beschreibung zu diesem Test gibt es hier.

Formeln für unterschiedliche Fälle

Wo genau spielt die Unabhängigkeit eine Rolle? Hierfür ist es wichtig zwischen verschiedenen Fällen zu unterscheiden. Hat man nur eine Variable, so bezieht sich die Unabhängigkeit auf die einzelnen Beobachtungen untereinander. Wenn zwei Zufallsvariablen verglichen werden, dann können folgende Fälle vorliegen, die zu verschiedenen Berechnungen der Teststatistik führen:

Stichprobe
Gepaart / verbunden Ungepaart / unabhängig
Varianzen bekannt  frac{(bar{X}-bar{Y}) - mu_{0} }{ sqrt{ frac{ sigma_{x}^{2}+sigma_{y}^{2} - 2sigma_{xy} }{ n } }} frac{ (bar{X}-bar{Y}) - mu_{0} }{ sqrt{ frac{ sigma_{x}^{2} }{ n_{x}} + frac{ sigma_{y}^{2} }{ n_{y} } } }
unbekannt gleich frac{ (bar{X}-bar{Y}) - mu_{0} }{ frac{ S_{D} }{sqrt{ n } }} frac{ (bar{X}-bar{Y}) - mu_{0} }{ S cdot sqrt{ frac{ n_{x} + n_{y} }{ n_{x} cdot n_{y} } } }
ungleich frac{ (bar{X}-bar{Y}) - mu_{0} }{ sqrt{ frac{ S_{x}^{2} }{ n_{x}} + frac{ S_{y}^{2} }{ n_{y} } } }

Hierbei stehen

  • sigma für die Varianz
  • S für die geschätzen Varianzen
  • S = frac{ (n_{x}-1) cdot S_{x}^{2}+ (n_{y}-1) cdot S_{y}^{2} }{ n_{x} + n_{y} -2 }
  • S_{D}^{2} = frac{ 1 }{ n-1 } sum_{ i = 1 }^n (D_{i}-bar{D})

Zum Überprüfen der Voraussetzungen sollte neben weiteren statistischen Tests auch der inhaltliche Aspekt der Variablen genutzt werden. So kann die Frage, ob es sich um eine gepaarte Stichprobe handelt, schon durch die Betrachtung der Untersuchungsmethodik geklärt werden. Wurde zum Beispiel eine Gruppe vor und nach einer Behandlung untersucht, so handelt es sich um eine gepaarte (auch verbunden genannte) Stichprobe.

Wenn die Voraussetzungen geprüft und der t-Test durchgeführt wurden, steht die eigentliche Interpretation der Ergebnisse an. Was genau bedeuten die Zahlen? Welche Schlüsse können gezogen werden? Ist das Ergebnis signifikant? Mit einem kleinen Beispiel sollen diese Fragen geklärt werden.

Beispiel für SPSS Ausgaben

Wir haben insgesamt 400 Beobachtungen simuliert – sagen wir es handelt sich um die Schlafdauer in Stunden. Wir nehmen folgende drei Szenarien an:

  1. alle Daten stammen von einer Gruppe (Test bei einer Stichprobe)
  2. die Daten stammen von einer Gruppe in einem Vorher-Nachher-Vergleich (Test bei gepaarten Stichproben)
  3. die Daten stammen von zwei verschiedenen Gruppen (Test bei unabhängigen Stichproben)

In SPSS gibt es für den t-Test genau diese drei Fälle: bei einer Stichprobe, bei unabhängigen und bei verbundenen Stichproben. Der Output unterscheidet sich leicht, wie in den Abbildungen zu erkennen ist. Dennoch sind die wesentlichen Interpretationen dieselben.

SPSS Auswertung Einstichprobentest

SPSS Ausgabe beim Einstichprobentest

SPSS Auswertung abhängiger Stichproben

SPSS Ausgabe beim Zweistichprobentest bei abhängigen Stichproben

SPSS Auswertung unabhängiger Stichproben

SPSS Ausgabe beim Zweistichprobentest bei unabhängigen Stichproben

Folgende Werte sind immer gegeben:

  • der Wert der Teststatistik „T“
  • die Anzahl der Freiheitsgrade „df“ (degree of freedom)
  • der p-Wert „Sig. (2-seitig)“
  • die „Untere“ und „Obere“ Grenze des Konfidenzintervalls
  • der „Mittelwert“ bzw. die „Mittlere Differenz“

Diese Kennzahlen hängen stark miteinander zusammen. So wird der p-Wert mittels dem Wert der Teststatistik und dem Freiheitsgrad bestimmt. Die Grenzen des Konfidenzintervalls sind eine andere Darstellung dafür, ob ein Test signifikant ist oder nicht. Sie enthalten die selbe Aussagekraft wie der p-Wert. Der „Mittelwert“ bzw. die „Mittlere Differenz“ gibt die Abweichung der Daten entweder zum Mittelwert oder unter den Gruppen an. Er hilft, die Aussage des t-Tests in Relation zur Fragestellung zu bringen: Welche Gruppe ist größer? In welche Richtung zeigt der Effekt?

Die Ausgabe des t-Test bei unabhängigen Stichproben enthält zudem noch den Levene-Test. Dieser dient zum Überprüfen der Varianzgleichheit (H_{0}: sigma_{1} = sigma_{2}). Je nachdem ob hier eine Signifikanz vorliegt, muss die entsprechende Zeile der Tabelle für die Auswertung genutzt werden. Die Werte der beiden Zeilen können sich unterscheiden, was auf die zuvor erwähnten, unterschiedlichen Formeln zurückzuführen ist.

Auswertung

Was heißt das nun für unser Beispiel? Wie zu erkennen ist, sind die Kennzahlen bei den drei Tests verschieden.

Szenario – Test bei einer Stichprobe
Es gibt hier keinen signifikanten Hinweis darauf, dass der Mittelwert nicht 4,2 in den gesamten Daten ist.

Szenario – Test bei gepaarten Stichproben
Der Unterschied zwischen Vorher und Nachher ist ganz knapp nicht signifikant für alpha = 0,05

Szenario – Test bei unabhängigen Stichproben
Es zeigt sich, dass von Varianzhomogenität ausgegangen werden kann und es einen für alpha = 0,05 signifikanten Unterschied in den Gruppen gibt.

Zusammenfassung

Die verschiedenen t-Tests können durch Unterschiede in der Berechnung auch unterschiedliche Ergebnisse liefern. Die kann im Extremfall – wie in unserem Beispiel – auch die Signifikanz beeinflussen. Es ist also wichtig sich im Vorfeld darüber klar zu werden, welche Struktur die Daten haben, die man untersucht.

Referenzen

  1. Eid, Gollwitzer, Schmitt (2015) Statistik und Forschungsmethoden, Kapitel: 12.1, S. 369ff

Ein bekanntes Beispiel aus der Statistik: Je mehr Leute in Kentucky heiraten, desto mehr Menschen ertrinken nachdem sie aus einem Fischerboot gefallen sind. Mit einem Korrelationskoeffizienten von r = 0.952 ist dieser Zusammenhang, statistisch gesehen, fast perfekt. Aber sollte man deswegen in Kentucky lieber auf das Heiraten verzichten? Oder ist etwa der Pro-Kopf-Verbrauch von Käse verantwortlich für ein unglückliches Ableben durch Verheddern im Bettlaken? Immerhin kann auch hier eine starke Korrelation beobachtet werden (r = 0.947).

Für beide Fälle lautet die Antwort wohl eher „nein“. Stattdessen sollen diese Beispiele klarmachen, dass eine Korrelation noch lange keine Kausalität nachweist. Wozu dienen also Korrelationsanalysen und worauf muss man bei deren Interpretation achten?

Korrelative Zusammenhänge

Eine Analyse der Korrelation zweier Variablen ist immer dann interessant, wenn wir wissen wollen, ob ein statistischer Zusammenhang zwischen diesen Variablen besteht und in welche Richtung dieser verläuft. Dabei unterscheiden wir vier grundlegende Szenarien, die das folgende Beispiel verdeutlichen soll: „Gibt es einen Zusammenhang zwischen der Anzahl an wöchentlichen Arbeitsstunden und der Häufigkeit an Restaurantbesuchen einer Person?“

  • Kein Zusammenhang: Durch Kenntnis der wöchentlichen Arbeitsstunden kann keinerlei Aussage über die Häufigkeit an Restaurantbesuchen gemacht werden.
  • Positiver Zusammenhang: Je mehr eine Person pro Woche arbeitet, desto häufiger besucht sie ein Restaurant.
  • Negativer Zusammenhang: Je mehr eine Person pro Woche arbeitet, desto seltener besucht sie ein Restaurant.
  • Nichtlinearer Zusammenhang: Sowohl eine unter- als auch überdurchschnittliche Anzahl an wöchentlichen Arbeitsstunden erhöht die Häufigkeit von Restaurantbesuchen.

Ob der beobachtete Zusammenhang auch eine kausale Verknüpfung hat, welche Variable Ursache und welche Wirkung ist – diese Fragen bleiben von der Korrelationsanalyse unbeantwortet. Nehmen wir an, wir würden für unser Beispiel einen positiven Zusammenhang beobachten. Dann könnte eine Erklärung lauten, dass Personen die länger arbeiten, weniger Zeit zum Kochen haben und deshalb häufiger auf Restaurants ausweichen. Alternativ denkbar wäre auch, dass Personen die gerne essen gehen mehr arbeiten müssen, um sich ihre häufigen Restaurantbesuche leisten zu können. Auch ein rein zufälliges Entstehen der Korrelation ist nicht auszuschließen, wie die zwei Eingangsbeispiele klarmachen sollten.

Keine Kausalität in Korrelation

Wir wissen also nicht, ob ein kausaler, ursächlicher Zusammenhang vorliegt, was genau Ursache und was Wirkung ist. Trotzdem kann es natürlich wünschenswert sein durch (gründlich recherchierte) inhaltliche Interpretation aus einem korrelativen Zusammenhang eine Kausalität abzuleiten. Ganz wichtig ist es aber sich bewusst zu machen, dass diese Interpretationen, so schlüssig sie erscheinen mögen, nie von der Korrelation statistisch belegt sind.

Kausalität nachweisen

Tatsächlich lässt sich ein kausaler Zusammenhang nie mit statistischen Methoden vollständig nachweisen (wobei es hier in der Statistik neue Stoßrichtungen gibt, z.B. zum Thema Causal Inference). Die beste Approximation erhalten wir durch ein kontrolliertes Experiment, d.h. durch Manipulation der unabhängigen Variable X (angenommen als Ursache, z.B. wöchentliche Arbeitsstunden) bei gleichzeitiger Beobachtung der abhängigen Variable Y (angenommen als Wirkung, z.B. Anzahl Restaurantbesuche). Verändert sich nun Y infolge der Manipulation von X, kann, zumindest statistisch von Zusammenhang der beiden Faktoren ausgegangen werden.

Korrelationskoeffizienten

Zur Berechnung von Korrelationen stehen dem Wissenschaftler verschiedene Korrelationskoeffizienten zur Verfügung. Diese werden, je nach Skalenniveau der Daten und vermutetem Zusammenhang, ausgewählt. Die beiden wichtigsten Korrelationskoeffizienten sind der Pearson-Korrelationskoeffizient sowie der Spearman-Korrelationskoeffizient. Ersterer wird verwendet, wenn beide zu korrelierenden Variablen metrisch bzw. intervallskaliert und normalverteilt sind. Die Spearman Korrelation hingegen wird basierend auf Rangdaten berechnet und ist auch für ordinale und nicht-normalverteilte Daten geeignet. Beide Koeffizienten sind im Intervall zwischen r = -1 und r = 1 definiert, wobei r = -1 einen perfekten negativen und r = 1 einen perfekten positiven Zusammenhang beschreiben.

Praktischer Einsatz von Korrelationen

In der statistischen Praxis werden Korrelationen häufig im Rahmen der explorativen Datenanalyse verwendet, d.h. als erste Indikation für etwaige statistische Effekte, die mit komplexeren Methoden, wie z.B. der Regressionsanalyse, weiter untersucht werden. Dies wird auch vor dem Hintergrund klarer, dass bei einfachen Korrelationsanalysen keine weiteren Variablen zur Kontrolle der Wirkung verwendet werden können. Man geht also davon aus, dass lediglich eine Wirkung von X auf Y vorliegt und keine anderen Faktoren Y beeinflussen. Dies ist für die meisten Experimente eine extrem unplausible Annahme.

Zusammenfassung

Wichtig ist zu verstehen, dass mit statistischen Korrelationen keine Aussagen über kausale Wirkzusammenhänge getroffen werden können. Alle statistischen Modelle sind lediglich einfache Abstraktionen der Wirklichkeit und werden in den meisten Fällen nie den tatsächlichen Kausalzusammenhang zwischen Variablen abbilden können. Aber, um es mit den Worten des berühmten Statistikers George Box zu sagen: „All models are wrong…but some of them are useful.“. Falls du Unterstützung bei der Auswahl oder Berechnung von Korrelationen benötigst, hilft dir unser Statistik Team gerne weiter.

Causal Inference: http://egap.org/methods-guides/10-things-you-need-know-about-causal-inference
All models are wrong: https://en.wikipedia.org/wiki/All_models_are_wrong

Ein bekanntes Beispiel aus der Statistik: Je mehr Leute in Kentucky heiraten, desto mehr Menschen ertrinken nachdem sie aus einem Fischerboot gefallen sind. Mit einem Korrelationskoeffizienten von r = 0.952 ist dieser Zusammenhang, statistisch gesehen, fast perfekt. Aber sollte man deswegen in Kentucky lieber auf das Heiraten verzichten? Oder ist etwa der Pro-Kopf-Verbrauch von Käse verantwortlich für ein unglückliches Ableben durch Verheddern im Bettlaken? Immerhin kann auch hier eine starke Korrelation beobachtet werden (r = 0.947).

Für beide Fälle lautet die Antwort wohl eher „nein“. Stattdessen sollen diese Beispiele klarmachen, dass eine Korrelation noch lange keine Kausalität nachweist. Wozu dienen also Korrelationsanalysen und worauf muss man bei deren Interpretation achten?

Korrelative Zusammenhänge

Eine Analyse der Korrelation zweier Variablen ist immer dann interessant, wenn wir wissen wollen, ob ein statistischer Zusammenhang zwischen diesen Variablen besteht und in welche Richtung dieser verläuft. Dabei unterscheiden wir vier grundlegende Szenarien, die das folgende Beispiel verdeutlichen soll: „Gibt es einen Zusammenhang zwischen der Anzahl an wöchentlichen Arbeitsstunden und der Häufigkeit an Restaurantbesuchen einer Person?“

Ob der beobachtete Zusammenhang auch eine kausale Verknüpfung hat, welche Variable Ursache und welche Wirkung ist – diese Fragen bleiben von der Korrelationsanalyse unbeantwortet. Nehmen wir an, wir würden für unser Beispiel einen positiven Zusammenhang beobachten. Dann könnte eine Erklärung lauten, dass Personen die länger arbeiten, weniger Zeit zum Kochen haben und deshalb häufiger auf Restaurants ausweichen. Alternativ denkbar wäre auch, dass Personen die gerne essen gehen mehr arbeiten müssen, um sich ihre häufigen Restaurantbesuche leisten zu können. Auch ein rein zufälliges Entstehen der Korrelation ist nicht auszuschließen, wie die zwei Eingangsbeispiele klarmachen sollten.

Keine Kausalität in Korrelation

Wir wissen also nicht, ob ein kausaler, ursächlicher Zusammenhang vorliegt, was genau Ursache und was Wirkung ist. Trotzdem kann es natürlich wünschenswert sein durch (gründlich recherchierte) inhaltliche Interpretation aus einem korrelativen Zusammenhang eine Kausalität abzuleiten. Ganz wichtig ist es aber sich bewusst zu machen, dass diese Interpretationen, so schlüssig sie erscheinen mögen, nie von der Korrelation statistisch belegt sind.

Kausalität nachweisen

Tatsächlich lässt sich ein kausaler Zusammenhang nie mit statistischen Methoden vollständig nachweisen (wobei es hier in der Statistik neue Stoßrichtungen gibt, z.B. zum Thema Causal Inference). Die beste Approximation erhalten wir durch ein kontrolliertes Experiment, d.h. durch Manipulation der unabhängigen Variable X (angenommen als Ursache, z.B. wöchentliche Arbeitsstunden) bei gleichzeitiger Beobachtung der abhängigen Variable Y (angenommen als Wirkung, z.B. Anzahl Restaurantbesuche). Verändert sich nun Y infolge der Manipulation von X, kann, zumindest statistisch von Zusammenhang der beiden Faktoren ausgegangen werden.

Korrelationskoeffizienten

Zur Berechnung von Korrelationen stehen dem Wissenschaftler verschiedene Korrelationskoeffizienten zur Verfügung. Diese werden, je nach Skalenniveau der Daten und vermutetem Zusammenhang, ausgewählt. Die beiden wichtigsten Korrelationskoeffizienten sind der Pearson-Korrelationskoeffizient sowie der Spearman-Korrelationskoeffizient. Ersterer wird verwendet, wenn beide zu korrelierenden Variablen metrisch bzw. intervallskaliert und normalverteilt sind. Die Spearman Korrelation hingegen wird basierend auf Rangdaten berechnet und ist auch für ordinale und nicht-normalverteilte Daten geeignet. Beide Koeffizienten sind im Intervall zwischen r = -1 und r = 1 definiert, wobei r = -1 einen perfekten negativen und r = 1 einen perfekten positiven Zusammenhang beschreiben.

Praktischer Einsatz von Korrelationen

In der statistischen Praxis werden Korrelationen häufig im Rahmen der explorativen Datenanalyse verwendet, d.h. als erste Indikation für etwaige statistische Effekte, die mit komplexeren Methoden, wie z.B. der Regressionsanalyse, weiter untersucht werden. Dies wird auch vor dem Hintergrund klarer, dass bei einfachen Korrelationsanalysen keine weiteren Variablen zur Kontrolle der Wirkung verwendet werden können. Man geht also davon aus, dass lediglich eine Wirkung von X auf Y vorliegt und keine anderen Faktoren Y beeinflussen. Dies ist für die meisten Experimente eine extrem unplausible Annahme.

Zusammenfassung

Wichtig ist zu verstehen, dass mit statistischen Korrelationen keine Aussagen über kausale Wirkzusammenhänge getroffen werden können. Alle statistischen Modelle sind lediglich einfache Abstraktionen der Wirklichkeit und werden in den meisten Fällen nie den tatsächlichen Kausalzusammenhang zwischen Variablen abbilden können. Aber, um es mit den Worten des berühmten Statistikers George Box zu sagen: „All models are wrong…but some of them are useful.“. Falls du Unterstützung bei der Auswahl oder Berechnung von Korrelationen benötigst, hilft dir unser Statistik Team gerne weiter.

Causal Inference: http://egap.org/methods-guides/10-things-you-need-know-about-causal-inference
All models are wrong: https://en.wikipedia.org/wiki/All_models_are_wrong