Dieses Projekt zielt darauf ab, Kaufabsichten im E-Commerce vorherzusagen. Mithilfe historischer und Echtzeitdaten sollen Nutzer mit hoher Konvertierungswahrscheinlichkeit identifiziert werden. Ziel ist es, Marketingmaßnahmen zu optimieren, Abwanderung zu reduzieren und Konversionsraten zu steigern. https://archive.ics.uci.edu/dataset/468/online+shoppers+purchasing+intention+dataset
To upload files, please first save the app
import streamlit as st
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestClassifier
import plotly.express as px
import plotly.graph_objects as go
# Page config
st.set_page_config(page_title="E-Commerce Kaufabsicht Prognose", layout="wide")
# Titel und Einführung
st.title("🛍️ E-Commerce Kaufabsicht Prognose")
st.markdown("""
Diese App analysiert und prognostiziert Kaufabsichten von Online-Shop-Besuchern basierend auf
verschiedenen Verhaltensmetriken und Session-Informationen.
""")
# Daten laden
@st.cache_data
def load_data():
# NOTE: Using corsproxy.io because we're in a WASM environment. If running locally,
# you can remove the corsproxy.io prefix.
url = "https://corsproxy.io/?https://archive.ics.uci.edu/ml/machine-learning-databases/00468/online_shoppers_intention.csv"
data = pd.read_csv(url)
return data
data = load_data()
# Sidebar für Filteroptionen
st.sidebar.header("Datenfilter")
selected_visitor_type = st.sidebar.multiselect(
"Besuchertyp",
options=data["VisitorType"].unique(),
default=data["VisitorType"].unique()
)
selected_weekend = st.sidebar.multiselect(
"Wochentag/Wochenende",
options=["Werktag", "Wochenende"],
default=["Werktag", "Wochenende"]
)
# Daten filtern
filtered_data = data[
(data["VisitorType"].isin(selected_visitor_type)) &
(data["Weekend"].isin([True if x == "Wochenende" else False for x in selected_weekend]))
]
# Dashboard Layout mit Tabs
tab1, tab2, tab3 = st.tabs(["📊 Datenübersicht", "🔮 Prognosemodell", "📈 Visualisierungen"])
with tab1:
st.header("Datenübersicht")
# Basis-Statistiken
col1, col2, col3 = st.columns(3)
with col1:
st.metric("Gesamtanzahl Sessions", len(filtered_data))
with col2:
conversion_rate = (filtered_data["Revenue"].mean() * 100).round(2)
st.metric("Konversionsrate", f"{conversion_rate}%")
with col3:
avg_duration = filtered_data["Administrative_Duration"].mean() + \
filtered_data["Informational_Duration"].mean() + \
filtered_data["ProductRelated_Duration"].mean()
st.metric("Durchschn. Sessiondauer (s)", f"{avg_duration:.2f}")
# Datentabelle
st.subheader("Rohdaten")
st.dataframe(filtered_data)
with tab2:
st.header("Kaufabsicht-Prognosemodell")
# Modelltraining
@st.cache_resource
def train_model(data):
# Features vorbereiten
categorical_columns = ["Month", "VisitorType", "Weekend", "Revenue"]
X = pd.get_dummies(data, columns=categorical_columns)
y = X.pop("Revenue_True")
# Train-Test-Split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Modell trainieren
model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X_train, y_train)
return model, X.columns
model, feature_names = train_model(data)
# Interaktive Vorhersage
st.subheader("Prognose für eine einzelne Session")
col1, col2 = st.columns(2)
with col1:
administrative = st.number_input("Administrative Seitenaufrufe", 0, 100, 0)
informational = st.number_input("Informational Seitenaufrufe", 0, 100, 0)
product_related = st.number_input("Produktbezogene Seitenaufrufe", 0, 100, 0)
with col2:
bounce_rate = st.slider("Bounce Rate", 0.0, 1.0, 0.2)
exit_rate = st.slider("Exit Rate", 0.0, 1.0, 0.2)
page_value = st.slider("Page Value", 0.0, 100.0, 0.0)
if st.button("Kaufwahrscheinlichkeit berechnen"):
# Beispieldaten für Vorhersage vorbereiten
sample_data = pd.DataFrame({
"Administrative": [administrative],
"Administrative_Duration": [0],
"Informational": [informational],
"Informational_Duration": [0],
"ProductRelated": [product_related],
"ProductRelated_Duration": [0],
"BounceRates": [bounce_rate],
"ExitRates": [exit_rate],
"PageValues": [page_value],
"SpecialDay": [0],
"Month": ["May"],
"VisitorType": ["Returning_Visitor"],
"Weekend": [False]
})
# One-hot encoding
sample_data_encoded = pd.get_dummies(sample_data)
# Fehlende Spalten mit 0 auffüllen
for col in feature_names:
if col not in sample_data_encoded.columns:
sample_data_encoded[col] = 0
# Spalten in gleiche Reihenfolge bringen
sample_data_encoded = sample_data_encoded[feature_names]
# Vorhersage
prediction = model.predict_proba(sample_data_encoded)[0]
st.success(f"Die Wahrscheinlichkeit eines Kaufs beträgt: {prediction[1]:.2%}")
with tab3:
st.header("Datenvisualisierungen")
# Visualisierung 1: Konversionsrate nach Besuchertyp
conversion_by_visitor = filtered_data.groupby("VisitorType")["Revenue"].mean().reset_index()
fig1 = px.bar(
conversion_by_visitor,
x="VisitorType",
y="Revenue",
title="Konversionsrate nach Besuchertyp",
labels={"Revenue": "Konversionsrate", "VisitorType": "Besuchertyp"}
)
st.plotly_chart(fig1)
# Visualisierung 2: Seitenaufrufe vs. Conversion
fig2 = px.scatter(
filtered_data,
x="ProductRelated",
y="PageValues",
color="Revenue",
title="Produktbezogene Seitenaufrufe vs. Page Value",
labels={"ProductRelated": "Produktbezogene Seitenaufrufe", "PageValues": "Page Value"}
)
st.plotly_chart(fig2)
# Visualisierung 3: Monatliche Verteilung
monthly_dist = filtered_data.groupby(["Month", "Revenue"]).size().reset_index(name="count")
fig3 = px.bar(
monthly_dist,
x="Month",
y="count",
color="Revenue",
title="Monatliche Verteilung der Käufe",
barmode="group"
)
st.plotly_chart(fig3)
Hi! I can help you with any questions about Streamlit and Python. What would you like to know?