Warum Datenanalyse + Claude Code funktioniert
Der typische Datenanalyse-Flow: Daten laden, bereinigen, transformieren, analysieren, visualisieren. Jeder Schritt erfordert spezifisches API-Wissen (Pandas-Methoden, SQL-Syntax, Matplotlib-Optionen). Claude Code kennt diese APIs besser als die meisten Analysten.
Du beschreibst das Problem in natürlicher Sprache — Claude Code schreibt den Pandas-Code. Du checkst das Ergebnis. Repeat.
Workflow: Daten verstehen in 10 Minuten
- Dataset hochladen/referenzieren — Claude Code liest CSV/Parquet/JSON direkt
- Quick EDA Prompt — Übersicht: Spalten, Typen, Nullwerte, Ausreißer
- Qualitätsprüfung — Claude findet Inkonsistenzen, Duplikate, Typfehler
- Transformationen beschreiben — "Berechne wöchentliche Umsätze pro Region"
- Code ausführen + iterieren — Ergebnis prüfen, nachsteuern
- Visualisierung generieren — "Erstelle ein Balkendiagramm der Top-10-Produkte"
EDA — Explorative Datenanalyse
Quick EDA Prompt
Ich habe ein Dataset: sales_data.csv
Lies es und erstelle einen vollständigen EDA-Report:
1. Grundstruktur: Zeilen, Spalten, Datentypen
2. Nullwerte: welche Spalten haben wie viele?
3. Numerische Spalten: mean, median, std, min, max, Quantile
4. Kategorische Spalten: unique values, häufigste Werte
5. Zeitreihen (falls vorhanden): Trend, Saisonalität erkennbar?
6. Auffälligkeiten: Ausreißer, verdächtige Werte, Inkonsistenzen
Ausgabe: als lesbaren Bericht mit konkreten Zahlen.
# Claude Code generiert und führt aus:
import pandas as pd
import numpy as np
df = pd.read_csv('sales_data.csv')
# Grundstruktur
print(f"Shape: {df.shape}")
print("\nDatentypen:")
print(df.dtypes)
# Nullwerte
null_pct = (df.isnull().sum() / len(df) * 100).sort_values(ascending=False)
print("\nNullwerte (%):")
print(null_pct[null_pct > 0])
# Numerische Statistiken
print("\nNumerische Übersicht:")
print(df.describe().round(2))
# Ausreißer (IQR-Methode)
for col in df.select_dtypes(include=np.number).columns:
Q1 = df[col].quantile(0.25)
Q3 = df[col].quantile(0.75)
IQR = Q3 - Q1
outliers = df[(df[col] < Q1 - 1.5*IQR) | (df[col] > Q3 + 1.5*IQR)]
if len(outliers) > 0:
print(f"Ausreißer in {col}: {len(outliers)} Zeilen")
Datenbereinigung mit Claude Code
# Bereinigung per natürlicher Sprache beschreiben
# Prompt: "Bereinige das Dataset: fehlende Werte in 'price' mit Median
# füllen, 'date' in datetime konvertieren, Duplikate entfernen,
# 'country' standardisieren (DE=Deutschland, AT=Österreich)"
df['price'] = df['price'].fillna(df['price'].median())
df['date'] = pd.to_datetime(df['date'], format='%Y-%m-%d', errors='coerce')
df = df.drop_duplicates(subset=['order_id'])
country_map = {'DE': 'Deutschland', 'AT': 'Österreich',
'CH': 'Schweiz', 'de': 'Deutschland'}
df['country'] = df['country'].map(country_map).fillna(df['country'])
SQL-Abfragen optimieren
Langsame Query analysieren
Diese SQL-Query läuft 45 Sekunden auf einer Tabelle mit 10M Rows:
SELECT u.name, COUNT(o.id) as order_count, SUM(o.total) as revenue
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
WHERE o.created_at > '2026-01-01'
AND o.status = 'completed'
GROUP BY u.id, u.name
ORDER BY revenue DESC
LIMIT 100;
Analysiere das Execution-Problem und schlage Optimierungen vor.
Tabellen-Schema: users(id, name, email, created_at),
orders(id, user_id, total, status, created_at)
# Claude Code analysiert und schlägt vor:
# Problem 1: Kein Index auf orders.user_id, status, created_at
CREATE INDEX idx_orders_user_status_date
ON orders(user_id, status, created_at)
WHERE status = 'completed'; -- Partial index!
# Problem 2: LEFT JOIN verschwendet Ressourcen (WHERE filtert eh NULLs)
# Fix: INNER JOIN + Subquery zuerst aggregieren
SELECT u.name, o.order_count, o.revenue
FROM users u
INNER JOIN (
SELECT user_id,
COUNT(id) AS order_count,
SUM(total) AS revenue
FROM orders
WHERE created_at > '2026-01-01'
AND status = 'completed'
GROUP BY user_id
) o ON u.id = o.user_id
ORDER BY o.revenue DESC
LIMIT 100;
-- Ergebnis: ~0.8s statt 45s
Visualisierungen generieren
# Prompt: "Erstelle ein professionelles Dashboard mit 4 Plots:
# 1. Umsatz-Zeitreihe (täglich, gleitender 7-Tage-Durchschnitt)
# 2. Top-10 Produkte nach Umsatz (horizontales Balkendiagramm)
# 3. Conversion Rate nach Region (Heatmap)
# 4. Kundensegmente (Pie Chart)"
import matplotlib.pyplot as plt
import seaborn as sns
fig, axes = plt.subplots(2, 2, figsize=(14, 10))
fig.suptitle('Sales Dashboard Q1 2026', fontsize=16, fontweight='bold')
# Plot 1: Zeitreihe mit gleitendem Durchschnitt
daily = df.groupby('date')['revenue'].sum()
daily.plot(ax=axes[0,0], alpha=0.4, label='Täglich')
daily.rolling(7).mean().plot(ax=axes[0,0], color='red', label='7-Tage-Ø')
axes[0,0].set_title('Umsatz-Zeitreihe')
axes[0,0].legend()
plt.tight_layout()
plt.savefig('dashboard_q1_2026.png', dpi=150, bbox_inches='tight')
Automatischer Analyse-Report
# Vollautomatischer Report-Generator
# Prompt: "Schreibe ein Python-Script das täglich ausgeführt werden kann.
# Es liest sales_data.csv, berechnet KPIs und generiert einen
# Markdown-Report der per Email versendet wird."
def generate_daily_report(df):
today = pd.Timestamp.now().date()
yesterday = df[df['date'].dt.date == today - pd.Timedelta(days=1)]
last_week = df[df['date'].dt.date >= today - pd.Timedelta(days=7)]
report = f"""
# Daily Sales Report — {today}
## Gestern
- Umsatz: €{yesterday['revenue'].sum():,.0f}
- Orders: {len(yesterday):,}
- Ø Order-Wert: €{yesterday['revenue'].mean():,.2f}
## Letzte 7 Tage
- Umsatz: €{last_week['revenue'].sum():,.0f}
- WoW-Trend: {calculate_wow_trend(df):.1f}%
## Top-Produkt gestern
{yesterday.groupby('product')['revenue'].sum().idxmax()}
"""
return report
Tipp: Jupyter + Claude Code. In Jupyter Notebooks kannst du Claude Code-Outputs direkt weiterverarbeiten. Generiere Pandas-Code → führe ihn im Notebook aus → zeige Claude das Ergebnis zum nächsten Schritt.
Datenanalyse-Workflows im Kurs
Im Claude Code Mastery Kurs findest du vollständige Datenanalyse-Workflows: EDA-Templates, SQL-Optimierungs-Prompts, Visualisierungs-Rezepte und automatische Report-Generator — für Python/Pandas und SQL.
14 Tage kostenlos testen →