Pandas Nutzerverhaltensanalyse in Aktion
Die Analyse des Nutzerverhaltens ist eine wichtige Grundlage für die Produktoptimierung. Dieser Fall zeigt, wie man Nutzerzugriffe, Retention, Konversion und andere Verhaltensdaten analysiert.
Datenvorbereitung
Nutzerverhaltensdaten simulieren
Beispiel
import pandas as pd
import numpy as np
np.random.seed(42)
n_users = 500
n_events = 5000
# Grundlegende Nutzerinformationen
users = pd.DataFrame({
"User ID": range(1, n_users + 1),
"Registration Date": pd.date_range("2024-01-01", periods=n_users, freq="D")[:n_users],
"Channel": np.random.choice(["Organic Search", "Advertising", "Empfehlung", "Social"], n_users),
"Gerät": np.random.choice(["PC", "Mobil", "Tablet"], n_users, p=[0.3, 0.6, 0.1])
})
# Ereignisse zum Nutzerverhalten
events = pd.DataFrame({
"Ereignis-ID": range(1, n_events + 1),
"Benutzer-ID": np.random.randint(1, n_users + 1, n_events),
"Ereignistyp": np.random.choice(
["Ansicht", "Klick", "Favorit", "Zum Warenkorb hinzufügen", "Bestellung", "Kommentar"],
n_events,
p=[0.4, 0.25, 0.1, 0.1, 0.1, 0.05]
),
"Ereigniszeit": pd.date_range("2024-01-15", periods=n_events, freq="10min")
})
# Daten zusammenführen
events = events.merge(users[["User ID", "Channel", "Device"]], on="User ID")
print("Benutzerdaten:")
print(users.head())
print(f"\nAnzahl der Benutzer: {len(users)}")
print("\n"Ereignisdaten:")
print(events.head())
print(f"\nAnzahl der Ereignisse: {len(events)}")
import numpy as np
np.random.seed(42)
n_users = 500
n_events = 5000
# Grundlegende Nutzerinformationen
users = pd.DataFrame({
"User ID": range(1, n_users + 1),
"Registration Date": pd.date_range("2024-01-01", periods=n_users, freq="D")[:n_users],
"Channel": np.random.choice(["Organic Search", "Advertising", "Empfehlung", "Social"], n_users),
"Gerät": np.random.choice(["PC", "Mobil", "Tablet"], n_users, p=[0.3, 0.6, 0.1])
})
# Ereignisse zum Nutzerverhalten
events = pd.DataFrame({
"Ereignis-ID": range(1, n_events + 1),
"Benutzer-ID": np.random.randint(1, n_users + 1, n_events),
"Ereignistyp": np.random.choice(
["Ansicht", "Klick", "Favorit", "Zum Warenkorb hinzufügen", "Bestellung", "Kommentar"],
n_events,
p=[0.4, 0.25, 0.1, 0.1, 0.1, 0.05]
),
"Ereigniszeit": pd.date_range("2024-01-15", periods=n_events, freq="10min")
})
# Daten zusammenführen
events = events.merge(users[["User ID", "Channel", "Device"]], on="User ID")
print("Benutzerdaten:")
print(users.head())
print(f"\nAnzahl der Benutzer: {len(users)}")
print("\n"Ereignisdaten:")
print(events.head())
print(f"\nAnzahl der Ereignisse: {len(events)}")
Benutzeraktivitätsanalyse
Verteilung der Ereignistypen
Beispiel
# Statistik der Ereignistypen
event_dist = events["Event Type"].value_counts()
event_pct = events["Event Type"].value_counts(normalize=True) * 100
print("=== Verteilung der Ereignistypen ==="\n")
event_analysis = pd.DataFrame({
"Anzahl": event_dist,
"Prozentsatz": event_pct.round(2)
})
print(event_analysis)
print()
# Anzahl der Benutzer nach Ereignistyp
event_users = events.groupby("Event Type")["User ID"].nunique()
print("Anzahl der Benutzer, die an jedem Ereignistyp teilnehmen:")
print(event_users)
event_dist = events["Event Type"].value_counts()
event_pct = events["Event Type"].value_counts(normalize=True) * 100
print("=== Verteilung der Ereignistypen ==="\n")
event_analysis = pd.DataFrame({
"Anzahl": event_dist,
"Prozentsatz": event_pct.round(2)
})
print(event_analysis)
print()
# Anzahl der Benutzer nach Ereignistyp
event_users = events.groupby("Event Type")["User ID"].nunique()
print("Anzahl der Benutzer, die an jedem Ereignistyp teilnehmen:")
print(event_users)
Benutzerengagement
Beispiel
# Nutzerereignisstatistiken
user_events = events.groupby("User ID").agg({
"Event ID": "count",
"Event Type": lambda x: x.nunique()
}).rename(columns={
"Event ID": "Total Events",
"Event Type": "Number of Event Types"
})
print("=== Nutzerengagement ==="\n")
print(f"Durchschnittliche Ereignisse pro Nutzer: {user_events['Total Events'].mean():.1f}")
print(f"Median: {user_events['Total Events'].median():.0f}")
print(f"Max: {user_events['Total Events'].max()}")
print()
# Nutzersegmentierung
user_events["Activity Level"] = pd.cut(
user_events["Ereignisse gesamt"],
bins=[0, 3, 10, 20, float("inf")],
labels=["Geringe Aktivität", "Normal", "Aktiv", "Hohe Aktivität"]
)
print("Verteilung der Benutzeraktivitätsstufen:")
print(user_events["Aktivitätsstufe"].value_counts())
user_events = events.groupby("User ID").agg({
"Event ID": "count",
"Event Type": lambda x: x.nunique()
}).rename(columns={
"Event ID": "Total Events",
"Event Type": "Number of Event Types"
})
print("=== Nutzerengagement ==="\n")
print(f"Durchschnittliche Ereignisse pro Nutzer: {user_events['Total Events'].mean():.1f}")
print(f"Median: {user_events['Total Events'].median():.0f}")
print(f"Max: {user_events['Total Events'].max()}")
print()
# Nutzersegmentierung
user_events["Activity Level"] = pd.cut(
user_events["Ereignisse gesamt"],
bins=[0, 3, 10, 20, float("inf")],
labels=["Geringe Aktivität", "Normal", "Aktiv", "Hohe Aktivität"]
)
print("Verteilung der Benutzeraktivitätsstufen:")
print(user_events["Aktivitätsstufe"].value_counts())
Conversion-Funnel-Analyse
Conversion-Pfad
Beispiel
# Benutzer nach Ereignistyp zählen
funnel = events.groupby("Ereignistyp")["Benutzer-ID"].nunique()
funnel = funnel.reindex(["Ansicht", "Klick", "Favorit", "In den Warenkorb", "Bestellung", "Kommentar"])
# Conversion-Raten berechnen
funnel_df = pd.DataFrame({
"Users": funnel,
"Absolute Conversion Rate": (funnel / funnel["View"] * 100).round(2),
"Step Conversion Rate": (funnel / funnel.shift(1) * 100).round(2)
}).fillna(100)
print("=== Conversion-Funnel ==="\n")
print(funnel_df)
print()
# Funnel-Daten visualisieren
print("Funnel-Daten:")
for step, row in funnel_df.iterrows():
print(f"{step}: {row['Users']} Benutzer ({row['Absolute Conversion Rate']:.1f}%)")
funnel = events.groupby("Ereignistyp")["Benutzer-ID"].nunique()
funnel = funnel.reindex(["Ansicht", "Klick", "Favorit", "In den Warenkorb", "Bestellung", "Kommentar"])
# Conversion-Raten berechnen
funnel_df = pd.DataFrame({
"Users": funnel,
"Absolute Conversion Rate": (funnel / funnel["View"] * 100).round(2),
"Step Conversion Rate": (funnel / funnel.shift(1) * 100).round(2)
}).fillna(100)
print("=== Conversion-Funnel ==="\n")
print(funnel_df)
print()
# Funnel-Daten visualisieren
print("Funnel-Daten:")
for step, row in funnel_df.iterrows():
print(f"{step}: {row['Users']} Benutzer ({row['Absolute Conversion Rate']:.1f}%)")
Kanalanalyse
Leistung nach Kanal
Beispiel
# Kanalnutzeranalyse
channel_analysis = events.groupby("Channel").agg({
"User ID": "nunique",
"Event ID": "count"
}).rename(columns={
"User ID": "Users",
"Event ID": "Events"
})
channel_analysis["Events per User"] = (
channel_analysis["Events"] / channel_analysis["Users"]
).round(2)
print("=== Kanalanalyse ==="\n")
print(channel_analysis)
print()
# Kanal-Konversionsvergleich
channel_funnel = events[events["Event Type"].isin(["View", "Order"])].groupby(
["Channel", "Event Type"]
)["User ID"].nunique().unstack()
channel_funnel["Conversion Rate"] = (
channel_funnel["Order"] / channel_funnel["View"] * 100
).round(2)
print("Konversionsrate nach Kanal:")
print(channel_funnel)
channel_analysis = events.groupby("Channel").agg({
"User ID": "nunique",
"Event ID": "count"
}).rename(columns={
"User ID": "Users",
"Event ID": "Events"
})
channel_analysis["Events per User"] = (
channel_analysis["Events"] / channel_analysis["Users"]
).round(2)
print("=== Kanalanalyse ==="\n")
print(channel_analysis)
print()
# Kanal-Konversionsvergleich
channel_funnel = events[events["Event Type"].isin(["View", "Order"])].groupby(
["Channel", "Event Type"]
)["User ID"].nunique().unstack()
channel_funnel["Conversion Rate"] = (
channel_funnel["Order"] / channel_funnel["View"] * 100
).round(2)
print("Konversionsrate nach Kanal:")
print(channel_funnel)
Geräteanalyse
Beispiel
# Geräteanalyse
device_analysis = events.groupby("Device").agg({
"User ID": "nunique",
"Event ID": "count"
}).rename(columns={
"User ID": "Users",
"Event ID": "Events"
})
device_analysis["Events per User"] = (
device_analysis["Events"] / device_analysis["Users"]
).round(2)
print("=== Geräteverteilung ==="\n")
print(device_analysis)
print()
# Gerätekonversionsrate
device_funnel = events[events["Event Type"].isin(["View", "Order"])].groupby(
["Device", "Event Type"]
)["User ID"].nunique().unstack()
device_funnel["Conversion Rate"] = (
device_funnel["Order"] / device_funnel["View"] * 100
).round(2)
print("Konversionsrate nach Gerät:")
print(device_funnel)
device_analysis = events.groupby("Device").agg({
"User ID": "nunique",
"Event ID": "count"
}).rename(columns={
"User ID": "Users",
"Event ID": "Events"
})
device_analysis["Events per User"] = (
device_analysis["Events"] / device_analysis["Users"]
).round(2)
print("=== Geräteverteilung ==="\n")
print(device_analysis)
print()
# Gerätekonversionsrate
device_funnel = events[events["Event Type"].isin(["View", "Order"])].groupby(
["Device", "Event Type"]
)["User ID"].nunique().unstack()
device_funnel["Conversion Rate"] = (
device_funnel["Order"] / device_funnel["View"] * 100
).round(2)
print("Konversionsrate nach Gerät:")
print(device_funnel)
Retention-Analyse
Beispiel
# Vereinfachte Retention-Analyse
# Es wird angenommen, dass eine Aktivität innerhalb von 7 Tagen nach der Registrierung als Retention gilt
users_with_events = events.groupby("User ID")["Event Time"].agg(["min", "max"])
users_with_events.columns = ["First Active", "Last Active"]
# Registrierungsinformationen zusammenführen
users_analysis = users.merge(users_with_events, left_on="User ID", right_index=True, how="left")
# Aktive Tage berechnen
users_analysis["Active Days"] = (
users_analysis["Last Active"] - users_analysis["First Active"]
).dt.days + 1
print("=== Benutzerbindungsanalyse ==="\n")
print(f"Benutzer mit Verhalten: {len(users_with_events)}")
print(f"Durchschnittliche aktive Tage: {users_analysis['Active Days'].mean():.1f} Tage")
print()
# Retention am nächsten Tag (vereinfacht)
retention_1d = len(users_analysis[users_analysis["Active Days"] >= 2]) / len(users_analysis) * 100
retention_3d = len(users_analysis[users_analysis["Active Days"] >= 3]) / len(users_analysis) * 100
print(f"Retention-Rate am nächsten Tag: {retention_1d:.1f}%")
print(f"3-Tage-Retention-Rate: {retention_3d:.1f}%")
# Es wird angenommen, dass eine Aktivität innerhalb von 7 Tagen nach der Registrierung als Retention gilt
users_with_events = events.groupby("User ID")["Event Time"].agg(["min", "max"])
users_with_events.columns = ["First Active", "Last Active"]
# Registrierungsinformationen zusammenführen
users_analysis = users.merge(users_with_events, left_on="User ID", right_index=True, how="left")
# Aktive Tage berechnen
users_analysis["Active Days"] = (
users_analysis["Last Active"] - users_analysis["First Active"]
).dt.days + 1
print("=== Benutzerbindungsanalyse ==="\n")
print(f"Benutzer mit Verhalten: {len(users_with_events)}")
print(f"Durchschnittliche aktive Tage: {users_analysis['Active Days'].mean():.1f} Tage")
print()
# Retention am nächsten Tag (vereinfacht)
retention_1d = len(users_analysis[users_analysis["Active Days"] >= 2]) / len(users_analysis) * 100
retention_3d = len(users_analysis[users_analysis["Active Days"] >= 3]) / len(users_analysis) * 100
print(f"Retention-Rate am nächsten Tag: {retention_1d:.1f}%")
print(f"3-Tage-Retention-Rate: {retention_3d:.1f}%")
Analysezusammenfassung
Beispiel
print("""
=== Zusammenfassung der Nutzerverhaltensanalyse ===
1. Nutzerengagement
- Ereignistypen werden von Aufrufen dominiert, gefolgt von Klicks
- Die durchschnittliche Anzahl von Ereignissen pro Nutzer ist niedrig; die Nutzerbindung muss verbessert werden
2. Conversion-Funnel
- Es gibt einen signifikanten Abbruch; die Nutzererfahrung muss optimiert werden
- Die Konversionsrate von der Ansicht zur Bestellung ist relativ niedrig
3. Kanaleffektivität
- Es wird empfohlen, sich auf die Optimierung des Conversion-Pfads von Kanälen mit hohem Traffic zu konzentrieren
- Die Performance variiert je nach Kanal; es sind fein abgestimmte Maßnahmen erforderlich
4. Geräteleistung
- Mobile ist das primäre Gerät; das mobile Erlebnis muss optimiert werden
5. Optimierungsvorschläge
- 1) Produktdarstellung optimieren, um die Ansicht-zu-Klick-Konversion zu verbessern
- 2) Den Kaufprozess vereinfachen, um Bestellabbrüche zu reduzieren
- 3) Die Seitenladegeschwindigkeit für Mobilgeräte optimieren
- 4) Ein abgestuftes System für die Nutzerbetreuung einführen
""")
=== Zusammenfassung der Nutzerverhaltensanalyse ===
1. Nutzerengagement
- Ereignistypen werden von Aufrufen dominiert, gefolgt von Klicks
- Die durchschnittliche Anzahl von Ereignissen pro Nutzer ist niedrig; die Nutzerbindung muss verbessert werden
2. Conversion-Funnel
- Es gibt einen signifikanten Abbruch; die Nutzererfahrung muss optimiert werden
- Die Konversionsrate von der Ansicht zur Bestellung ist relativ niedrig
3. Kanaleffektivität
- Es wird empfohlen, sich auf die Optimierung des Conversion-Pfads von Kanälen mit hohem Traffic zu konzentrieren
- Die Performance variiert je nach Kanal; es sind fein abgestimmte Maßnahmen erforderlich
4. Geräteleistung
- Mobile ist das primäre Gerät; das mobile Erlebnis muss optimiert werden
5. Optimierungsvorschläge
- 1) Produktdarstellung optimieren, um die Ansicht-zu-Klick-Konversion zu verbessern
- 2) Den Kaufprozess vereinfachen, um Bestellabbrüche zu reduzieren
- 3) Die Seitenladegeschwindigkeit für Mobilgeräte optimieren
- 4) Ein abgestuftes System für die Nutzerbetreuung einführen
""")