Die sechs ehrlichen Signale
Aus den blossen Zeitstempeln eines echten Chats — ganz ohne den Inhalt zu lesen — berechnest du Antwortzeiten, Beitragsbalance und das Verhältnis von Geben und Nehmen. Aus einer Intuition über eine Gruppe wird eine Messgrösse.
Kurz gesagt
Was: Du exportierst einen WhatsApp-Chat (z. B. eurer Klassen- oder Projektgruppe) und lässt Python daraus Muster lesen — nicht, worüber geredet wird, sondern wie: Wer schreibt wie viel? Wie schnell wird geantwortet? Antworten alle aufeinander, oder reden einige nur für sich?
Warum: Genau diese Muster gehören zu den sechs ehrlichen Signalen, mit denen sich voraussagen lässt, ob eine Gruppe kreativ blüht. Du verwandelst ein Bauchgefühl über eine Gruppe in Zahlen — und legst damit die Vorstufe zum Symbionten-Werkzeug des nächsten Kapitels.
Du brauchst: einen exportierten Chatverlauf (.txt) und Python mit pandas. Läuft
auch im Browser (Pyodide).
Worum es geht
Setz fünf Menschen in einen Raum und gib ihnen eine Aufgabe — nach wenigen Minuten entsteht etwas, das man fast greifen kann: eine Stimmung, ein Rhythmus, eine Art Chemie. Lange galt das als unmessbar. Dieses Kapitel zeigt, dass es messbar ist, weil die Chemie einer Gruppe in ihren ehrlichen Signalen steckt — in Dingen, die niemand bewusst steuert.
Sechs solcher Signale sagen erstaunlich gut voraus, ob eine Gruppe produktiv wird: ob es eine starke, verbindende Führung gibt und ob sie wechselt, statt bei einer Person zu kleben; wie schnell die Mitglieder aufeinander reagieren; wie ausgewogen die Beiträge verteilt sind; wie ehrlich Stimmungen geäussert werden dürfen; und wie sehr die Gruppe eine eigene Sprache entwickelt. In dieser Aktivität greifst du drei davon heraus, die sich schon aus blossen Zeitstempeln berechnen lassen — Antwortzeit, Beitragsbalance und Geben und Nehmen. Die Führungs-Frage (die Betweenness-Zentralität) folgt in Aktivität 8.1.
Nur Muster, nie Inhalt — und nur mit Einwilligung
Diese Auswertung liest keine Inhalte, nur Zeitstempel und Absender. Trotzdem: Ein Chatverlauf gehört allen, die darin schreiben. Hol dir das Einverständnis der Gruppe, anonymisiere die Namen (Person A, B, C …), und teile die Ergebnisse nicht ausserhalb. Das ist die goldene Regel dieses Buches: Was du über andere herausfindest, gehört ihnen, nicht dir. Am saubersten nimmst du einen Chat, in dem du selbst Mitglied bist.
Ein bisschen Hintergrund
Was wir aus Zeitstempeln lesen. Jede Chatzeile trägt drei nüchterne Angaben: wann, wer, und (die wir hier ignorieren) was. Allein aus wann und wer entstehen drei Masse:
- Beitragsbalance — wie gleichmässig die Beiträge über die Personen verteilt sind. Reden alle ungefähr gleich viel, oder dominieren wenige? Ein sehr unausgewogener Chat ist ein Warnsignal.
- Antwortzeit — wie viel Zeit im Median zwischen einer Nachricht und der nächsten einer anderen Person vergeht. Kurze Antwortzeiten heissen: Man hört einander zu und reagiert.
- Geben und Nehmen — reagiert jemand ungefähr so oft auf andere („geben“), wie seine eigenen Beiträge Reaktionen anderer auslösen („nehmen“)? Wir zählen beides in einem kurzen Zeitfenster. Wessen Nachrichten viel Resonanz erzeugen, der aber selbst wenig reagiert, fällt hier auf — ebenso, wer am lebendigen Hin und Her kaum teilnimmt.
Das sind grobe, aber ehrliche Näherungen — sie machen aus „die Gruppe wirkt lebendig“ eine Zahl, die man vergleichen kann.
Chat exportieren
- Export starten. In WhatsApp den Chat öffnen → Menü → „Mehr“ → „Chat
exportieren“ → „Ohne Medien“. Du bekommst eine
.txt-Datei. - Einverständnis & Anonymisieren. Frag die Gruppe. Ersetze vor der Analyse die echten Namen durch A, B, C … — oder lass das den Code tun (siehe unten).
- Datei bereitlegen. Als
chat.txtin denselben Ordner wie das Skript. - Auswerten. Skript laufen lassen und die drei Masse ablesen.
Auswerten mit Python
Der Code zerlegt jede Zeile in Zeitpunkt und Absender, wirft den Inhalt weg und rechnet die drei Masse aus. Vollständiger, kommentierter Code auf GitHub.
import re
import pandas as pd
FENSTER = 60 # Minuten: was noch als "Reaktion" zaehlt
# WhatsApp-Zeile: "15.03.26, 17:44 - Mira: Text..."
muster = re.compile(r"^(\d{1,2}\.\d{1,2}\.\d{2,4}),?\s+(\d{1,2}:\d{2})\s+-\s+([^:]+):")
zeilen = []
for z in open("chat.txt", encoding="utf-8"):
m = muster.match(z)
if m:
datum, uhr, name = m.groups()
zeit = pd.to_datetime(f"{datum} {uhr}", dayfirst=True, errors="coerce")
zeilen.append((zeit, name.strip()))
df = pd.DataFrame(zeilen, columns=["zeit", "wer"]).dropna().sort_values("zeit").reset_index(drop=True)
# --- anonymisieren: echte Namen -> A, B, C ... ---
namen = {n: chr(65+i) for i, n in enumerate(df["wer"].unique())}
df["wer"] = df["wer"].map(namen)
# 1) Beitragsbalance
anteil = df["wer"].value_counts() / len(df)
p = anteil.sort_values().values # Ungleichheit als Gini
gini = 1 - 2*sum((len(p)-i-0.5)/len(p) * pi for i, pi in enumerate(p))
# 2) Antwortzeit: Median bis zur naechsten Nachricht EINER ANDEREN Person
df["dt_min"] = df["zeit"].diff().dt.total_seconds() / 60
df["andere"] = df["wer"].ne(df["wer"].shift())
antwortzeit = df.loc[df["andere"], "dt_min"].median()
# 3) Geben & Nehmen im Zeitfenster
zeit, wer, n = df["zeit"].tolist(), df["wer"].tolist(), len(df)
gibt = {p: 0 for p in set(wer)} # ich reagiere auf eine andere Person
nimmt = {p: 0 for p in set(wer)} # meine Nachricht loest Reaktionen aus
for i in range(n):
for j in range(i-1, -1, -1): # Geben: reagiere ich?
if wer[j] != wer[i]:
if (zeit[i]-zeit[j]).total_seconds()/60 <= FENSTER:
gibt[wer[i]] += 1
break
responders = set() # Nehmen: wer reagiert auf mich?
for k in range(i+1, n):
if (zeit[k]-zeit[i]).total_seconds()/60 > FENSTER or wer[k] == wer[i]:
break
responders.add(wer[k])
nimmt[wer[i]] += len(responders)
print("Beitragsanteil (%):")
print((anteil*100).round(1).sort_values(ascending=False).to_string())
print(f"\nUngleichheit (Gini, 0=gleich .. 1=einer): {gini:.2f}")
print(f"Mediane Antwortzeit zwischen Personen: {antwortzeit:.0f} min\n")
print("Geben & Nehmen (gegeben / erhalten):")
for pn in sorted(set(wer), key=lambda x: -nimmt[x]):
g, e = gibt[pn], nimmt[pn]
print(f" {pn} gegeben {g:2d} erhalten {e:2d} G/N {g/e:.2f}" if e
else f" {pn} gegeben {g:2d} erhalten {e:2d} G/N –")
Was du sehen solltest
Eine Rangliste, wer wie viel Prozent schreibt; einen Gini-Wert (nahe 0 = alle ähnlich viel, nahe 1 = einer dominiert); eine mediane Antwortzeit; und je Person, wie viele Reaktionen sie gibt und wie viel Resonanz sie erhält. Beim mitgelieferten Beispiel-Chat (fünf Personen, Projektwoche) schreibt die Organisatorin mit rund 38 % am meisten, der stillste Teilnehmer nur etwa 10 % (Gini ≈ 0,23), die mediane Antwortzeit liegt bei rund 15 Minuten. Beim Geben und Nehmen zeigt sich das Schöne: Die Organisatorin erhält etwa doppelt so viel Resonanz, wie sie selbst gibt (G/N ≈ 0,5) — ihre Beiträge bewegen die Gruppe —, während der stillste Teilnehmer am lebendigen Hin und Her kaum teilnimmt (er reagiert erst Stunden später und löst keine schnelle Reaktion aus, darum „–“). Kippt ein Chat in „einer sendet, alle schweigen“, siehst du es sofort am hohen Gini.
Arbeitsblatt
Aus dem Bauchgefühl wird eine Zahl
- Bevor du den Code laufen lässt: Schätze aus dem Bauch, wer in eurem Chat am meisten schreibt und ob die Gruppe „ausgewogen“ ist. Danach vergleiche mit den Zahlen — wo lagst du daneben?
- Warum lesen wir hier bewusst nur die Zeitstempel und nicht den Inhalt? Nenne einen Vorteil für die Aussagekraft und einen für den Datenschutz.
- Die Antwortzeit misst den Abstand zur nächsten Nachricht einer anderen Person. Warum wäre es falsch, einfach den Abstand zur nächsten Nachricht überhaupt zu nehmen?
- Jemand hat ein Geben-Nehmen-Verhältnis von 0,3. Was bedeutet das — und ist das automatisch „schlecht“? Nenne eine harmlose Erklärung.
- Welches der sechs Signale kannst du aus Zeitstempeln nicht berechnen, und warum brauchst du dafür ein anderes Werkzeug (Kapitel 7 oder 8)?
Lösung anzeigen
1. Individuell. Ziel ist die Erfahrung, dass die Intuition oft grob stimmt, aber bei „wer genau wie viel“ und bei den Antwortzeiten regelmässig danebenliegt — genau deshalb misst man.
2. Aussagekraft: Die Muster (wer, wann, wie schnell) sind ehrliche Signale, die kaum gesteuert werden — im Gegensatz zu den Worten, die man schönen kann. Datenschutz: Ohne Inhalte entsteht kein Mitlesen privater Nachrichten; man wertet nur Struktur aus, nicht Geheimnisse.
3. Weil zwei schnelle Nachrichten derselben Person keine Reaktion sind, sondern ein fortgesetzter Monolog. „Antwort“ heisst, dass jemand anderes reagiert — nur das misst Zuhören und Aufeinander-Eingehen.
4. Die Person reagiert deutlich seltener auf andere, als andere auf sie reagieren — sie „nimmt“ mehr, als sie „gibt“. Das ist nicht automatisch schlecht: Vielleicht ist sie die Ideengeberin oder Moderatorin, deren Beiträge viele Antworten auslösen. Zahlen deuten, nicht urteilen.
5. Die verbindende Führung (Betweenness-Zentralität) lässt sich nicht aus der blossen Reihenfolge ablesen — dafür braucht man das Netzwerk, wer mit wem verbunden ist (Aktivität 8.1). Und die gemeinsame Sprache / ehrliche Stimmung verlangt eine Inhaltsanalyse (das Symbionten-Werkzeug aus Kapitel 7).
Wenn's klemmt
| Problem | Wahrscheinliche Ursache & Lösung |
|---|---|
Keine Zeilen erkannt (leeres df) | Das Datums-/Zeitformat des Exports weicht ab (Handy-Sprache, 12-Stunden-Format). Eine Beispielzeile ansehen und das muster anpassen (z. B. AM/PM). |
| Mehrzeilige Nachrichten zählen falsch | Fortsetzungszeilen ohne Zeitstempel werden korrekt ignoriert — nur der Zeilenkopf zählt als Nachricht. Das ist gewollt. |
| Systemzeilen („… hat die Gruppe erstellt“) | Haben keinen „Name:“-Teil und fallen durch das Muster. Bei Bedarf zusätzlich herausfiltern. |
| Antwortzeit unrealistisch gross | Lange Pausen über Nacht verzerren den Median weniger als den Mittelwert — deshalb Median nehmen. Optional Nachrichten mit Abstand > 8 h ausschliessen. |
| Emojis/Sonderzeichen brechen das Einlesen | Datei mit encoding="utf-8" öffnen (im Code schon so); bei Fehlern errors="ignore" ergänzen. |
Zum Nachdenken
- Du hast eine Gruppe vermessen, ohne ein einziges Wort ihres Inhalts zu lesen — allein aus dem Muster der Kommunikation. Genau das tat der Autor einst mit seinem Deloitte-Postfach (Kapitel 8): Nicht den Inhalt der Mails, sondern ihr Muster. Struktur verrät oft mehr als Inhalt.
- Diese Masse sind Näherungen, keine Urteile. Ein hoher Gini heisst nicht „schlechte Gruppe“ — vielleicht hält gerade jemand einen wichtigen Vortrag. Zahlen sind ein Anlass zum Hinschauen, nicht das Urteil selbst.
- Weil diese Signale so schwer zu fälschen sind, sind sie mächtig — und darum heikel. Wer solche Auswertungen macht, trägt Verantwortung: aggregiert fürs Team, persönlich nur für die Person. Das ist die Linie, die aus Beobachtung Vertrauen macht.
Erweiterung
- Über die Zeit. Teile den Chat in Wochen und schau, ob die Beitragsbalance wandert — wechselt die dominierende Person, oder klebt die Führung? Das Wandern ist selbst eines der sechs Signale.
- Tagesrhythmus. Trage die Nachrichten nach Uhrzeit auf. Wann ist die Gruppe am aktivsten? Ein erster Blick auf den „Puls“ einer Gemeinschaft.
- Brücke zu 8.1. Aus dem „wer antwortet auf wen“ dieser Aktivität lässt sich direkt ein Netzwerk zeichnen — und darin die verbindende Führung (Betweenness) berechnen. Genau das tust du als Nächstes.
- Brücke zu Kapitel 7. Jetzt hast du die Struktur gemessen. Das Symbionten-Werkzeug des nächsten Kapitels liest zusätzlich den Inhalt und ordnet jeder Person eine Rolle zu — Biene, Ameise, Schmetterling, Capybara, Egel.