Der Fall von StackOverflow

Vor einigen Tagen ging die Nachricht durch Social Media, dass StackOverflow mit ChatGPT zu kämpfen hätte und dass deswegen die Visits, Pageviews und Interaktionen stark abgenommen haben. Wenngleich der Trend anhand der vorhandenen Daten unbestreitbar ist, ist doch die Frage, ob der Zusammenhang zwischen dem Release von ChatGPT und der rapiden Abnahme der Besucher von StackOverflow tatsächlich kausal ist. Oder versuchen wir viel mehr, unsere eigene Erwartung zu bestätigen?

Werfen wir einen Blick auf die Daten

Nur bestimmte Mitglieder von StackOverflow haben Zugriff auf die Interaktionsdaten der Website. Diese wurden vor kurzem geleakt. Gefunden haben wir die Daten hier: https://observablehq.com/@ayhanfuat/the-fall-of-stack-overflow. Da die verlinkte Originalquelle nicht von uns zugreifbar ist, können wir die Validität der Daten nicht verifizieren; eine Fälschung ist unwahrscheinlich aber daher  nicht auszuschließen.

Die Daten enthalten Informationen in tageweiser Auflösung. Stellt man sie dar, erkennt man nur wenig außer der Tatsache, dass ein wöchentlicher Effekt dominiertend ist. Es ist daher sinnvoll, einen gleitenden Mittelwert mit einem vielfachen von 7 als Fensterbreite auf die Daten anzuwenden. In den folgenden Graphen sieht man die Rohdaten (Page views+Visits, Posts und Votes) und darauf das jeweilige 21-Tage Mittel mit einer kräftigeren Linie abgebildet.* Wir haben auch einige wichtige Events ergänzt, die einzelne Features der Daten erläutern, sowie relevant für die Kausalitätsanalyse sind.

(*Der Code, um diese und die folgenden Graphen darzustellen, folgt am Ende dieses Artikels)

Betrachtet man die Daten, fällt im linken Graphen das "Google"-Event umittelbar ins Auge. Dieses scheint einen signifikanten Einfluss auf die Zahl der Visits und der Page views zu haben. Tatsächlich hat Google an diesem Datum eine bedeutende Änderung ihres Algorithmus durchgeführt, wodurch viele Suchtreffer anders gewichtet wurden. Als Konsequenz brechen insbesondere sogenannte "New visits" weg, so dass die Gesamtnutzerbasis aufgrund normaler Diffusionseffekte über die Zeit abnehmen muss.

Im mittleren Graph erscheint ein signifikanter Peak kurz nach der ersten COVID-19-Welle in Europa. Dieser Peak ist direkt verbunden mit der Zunahme des Interesses an COVID-19 Datenanalysen. Es lässt sich analysieren, dass die Zunahme der Posts in direktem Zusammenhang damit steht. Des Weiteren nimmt die Zahl an Posts über die Zeit hin recht stetig ab. Das ist wenig verwunderlich, da mit zunehmender Lebenszeit von StackOverflow auch die Zahl der "allgemeingültigen" und offenen Fragen abnehmen muss: vieles ist einfach schon beantwortet. Offen bleiben sehr spezifische Fragen, die für ein breites Publikum von geringerem Interesse sind.

Der rechte Graph zeigt die Votes, die Nutzer auf die Posts geben können. Diese (insbesondere die "accept votes") sind zwangsläufig direkt korreliert mit der Zahl der vorhandenen Fragen und müssen daher ebenfalls über die Zeit hin abfallen.

Es wird interessant: kurz- vs. langfristige Effekte

Wir haben bis hier schon über die wochenweisen Effekte gesprochen. Natürlich fallen auch unmittelbar Effekte auf, die im Jahresrhythmus auftreten. Diese treten zusätzlich zu sehr langfristigen Einflüssen auf, die sich nicht zu einem speziellen Rhythmus zuordnen lassen und eher den langfristigen Verlauf der Kurven vorgeben. Daher erscheint es logisch, zu versuchen, diese beiden Effekte zu trennen, um sie getrennt zu studieren.

Es gibt verschiedene Arten, diese Separation durchzuführen: Hoch- und Tiefpassfilter, Glättungen und weitere spezielle Filter. Aus Gründen der Einfachheit haben wir hier lediglich eine sehr breite Glättung verwendet von 357 Tagen (etwa 1 Jahr, aber insbesondere genau 51 Wochen). Wendet man diese Glättung auf die Daten an, so bekommt man die langfristigen Effekte (obere Reihe der folgenden Graphen). Dividiert man die 21-tage vorgeglätteten Daten durch die langfristigen Effekte, bekommt man die kurzfristigen Effekte (untere Reihe). Eine Division macht Sinn, weil man annehmen kann, dass die kurzfristigen Effekte von der total vorhandenen Menge an Besuchern (= das langfristige Mittel) abhängt und daher mit diesen skaliert. Betrachtet man die jeweiligen Ergebnisse, so findet man diese Annahme bestätigt, da keine relevante Amplitudenmodulation in den kurzfristigen Effekten zu beobachten ist.

Natürlich ist die einfache Glättungsmethode nicht perfekt: der scharfe Einbruch, der in den Page views zu beobachten ist, wird (ebenso wie der COVID-19-Peak) hierdurch "verschliffen" und gleichzeitig erscheinen starke Amplituden nahe dieses Punktes in den kurzfristigen Effekten. Wenn man dies aber für die weitere Analyse im Hinterkopf behält, kann man damit trotzdem weiterarbeiten.

Betrachten wir die langfristigen Effekte nochmals genauer: im Graph links oben ist deutlich zu erkennen, dass der Gesamttrend abnehmender Page Views direkt mit den abnehmenden neuen Visits korreliert, die ja, wie wir zuvor schon festgestellt hatten, von der Algorithmusänderung bei Google ausgelöst wurden. Man scheint eine Erholung ab der GPT3-Marke zu erkennen, dies ist aber lediglich ein Effekt der Glättung (wie zuvor bereits angemerkt). GPT3 und GPT4 scheinen hier keinen Einfluss zu haben.

Ähnlich verhält es sich auch in den beiden anderen Graphen dieser Reihe: der langfristige Trend zeigt sich nicht beeinflusst von den Effekten von GPT3 und GPT4; die Änderungen bei Google verringern allerdings zusätzlich die jeweiligen Metriken. Die Annahme liegt also nahe, einen Einfluss von GPT3 und GPT4 auszuschließen.

Tatsächlich ist das aber nur die halbe Wahrheit. Die Veröffentlichungen von GPT3 und GPT4 liegen noch kein ganzes Jahr in der Vergangenheit, demzufolge können deren Effekte auch nur sehr gering Einfluss auf den langfristigen Trend nehmen. Betrachtet man die zweite Reihe der Graphen, so sieht man in allen drei Graphen deutliche Einbrüche direkt nach den Releases beider LLMs. Gleichzeitig wissen wir aber auch, dass hier noch zyklische, jahreszeitliche Effekte in den Daten sind (z.B. brechen alle Metriken nahe Neujahr stark ein). Diese sollten wir zunächst entfernen.

Korrektur der zyklischen Einflüsse

Um die zyklischen Effekte korrigieren zu können, müssen wir sie zunächst isolieren. Dazu verwenden wir die drei Jahre in den Daten, die "einigermaßen gleichförmig" sind: 2019, 2020 und 2021. Wir mitteln die Metriken für diese drei Jahre und verwenden das Ergebnis als "typischen" Jahresverlauf (die blaue Kurve in den folgenden Graphen). Dividiert man die Daten durch diesen typischen Jahresverlauf, bestimmt die 5% und 95% Perzentile des Mittlungsbereichs (also 2019-2021) und stellt dies gemeinsam dar, bekommt man die jeweils zweiten Graphen in den folgenden Abbildungen. Hier gilt: alles, das außerhalb des schattierten Bereichs liegt, stellt eine signifikante Abweichung dar.

So sieht man zum Beispiel, dass der COVID-19 Peak besonders in den Posts und den Votes zu sehen ist, jedoch kaum einen Unterschied im Traffic machte. Die Algorithmusänderung bei Google sieht man dagegen deutlich im Traffic, während sie bei den Posts und den Votes kaum einen Effekt hat. Ebenso interessant ist, dass GPT3 offenbar keinen Einfluss hat, jedoch GPT4 einen deutlichen Abfall produziert (das scheint sich zu erholen, kann aber auch ein Artefakt aus der Glättung sein). Insbesondere der Verlauf des Abfalls selbst entspricht grob einer Diffusionskurve, die man hier auch erwarten würde.

Fazit

Zusammengefasst zeigt sich, dass der größte Anteil an "StackOverflows Fall" nicht eines der beiden LLMs GPT3 oder GPT4 ist, sondern vielmehr die Marktmacht des Google-Algorithmus ist. Dessen Änderungen im Mai 2022 haben eine bedeutenden Einbruch im Traffic verursacht, der viel bedeutender als der Effekt von GPT ist. Da Traffic aber auch für Werbeeinnahmen sorgt, kann dies ein großes Problem in der Zukunft sein.

Nichtdestotrotz kann man zumindest auch GPT4 in den Daten sehen, insbesondere ist hier ein starker Einfluss in der Interaktionsquote (also Posts und Votes) zu erkennen. Dies spiegelt natürlich auch die vorherige Analyse wider: die meisten allgemeingültigen Fragen sind bereits beantwortet (und deren Antworten können auch von GPT generiert werden). Was übrig bleibt, sind die wenigen Fragen, die sehr spezifisch sind.

Bereit zum Nachmachen? Hier ist der Code: