0Pricing
AI Engineering Academy · Lektion

Einen Datenanalyse-Agent entwickeln

Erstellen Sie einen durchgängigen Datenanalyse-Agenten, der eine CSV-Datei und eine Frage in natürlicher Sprache entgegennimmt, iterativ pandas- und matplotlib-Code schreibt und einen ausgereiften Bericht erstellt.

Einen Datenanalyse-Agent entwickeln ist eine kostenlose AI Engineering Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des AI Engineering Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der AI Engineering Academy-Kurs umfasst insgesamt 4 Lektionen.

Die Vision des Datenanalyse-Agenten

Ein Datenanalyse-Agent nimmt eine CSV-Datei und eine in natürlicher Sprache formulierte Frage entgegen, untersucht die Daten anschließend autonom, bereinigt sie, berechnet Statistiken, erstellt Visualisierungen und erzeugt einen ausgearbeiteten Bericht – alles durch iterative Codegenerierung und -ausführung. Dies ist eine der praktischsten Anwendungen von Code-Agenten und bildet den Arbeitsablauf eines Datenanalysten direkt nach, nur ohne den manuellen Aufwand.

Die Gesamtarchitektur des Agenten

Der Datenanalyse-Agent umfasst vier konzeptionelle Phasen: Exploration (Struktur, Datentypen und Qualität der Daten verstehen), Bereinigung (fehlende Werte, Ausreißer und Typkonvertierungen behandeln), Analyse (die zur Beantwortung der Frage erforderlichen Kennzahlen und Statistiken berechnen) und Berichterstellung (Diagramme erzeugen und Ergebnisse in Textform zusammenfassen). Jede Phase entspricht 1–5 Codeausführungsiterationen.

DATA_AGENT_SYSTEM_PROMPT = '''
You are a data analysis agent. Given a CSV file and a question, answer it through iterative Python code.

Phases to follow:
1. EXPLORE: Load the data, print shape, dtypes, head(), describe(), and check for nulls.
2. CLEAN: Handle missing values, fix dtypes, remove outliers.
3. ANALYZE: Compute statistics, groupbys, correlations - whatever answers the question.
4. REPORT: Generate a matplotlib chart saved to /workspace/chart.png and write a text summary.

Rules:
- Write code in ```python ... ``` blocks.
- Save intermediate results to /workspace/ for use in later steps.
- Print key findings after each computation so you can observe them.
- When all phases are done, say TASK COMPLETE and summarize the answer.
'''

Phase 1: Code zur Datenexploration

In der Explorationsphase werden die Daten geladen und sofort alle Informationen ausgegeben, die zur Planung der Analyse erforderlich sind: Form, Spaltennamen und -typen, Beispielzeilen, zusammenfassende Statistiken und die Anzahl der Nullwerte. Das LLM liest diese Ausgabe und nutzt sie, um in den folgenden Iterationen fundierte Entscheidungen über Bereinigung und Analyse zu treffen.

import pandas as pd
import numpy as np

# Load dataset
df = pd.read_csv('/workspace/data.csv')

# Basic exploration
print('=== SHAPE ===' )
print(df.shape)

print('\n=== DTYPES ===')
print(df.dtypes)

print('\n=== HEAD ===')
print(df.head())

print('\n=== DESCRIBE ===')
print(df.describe(include='all'))

print('\n=== NULL COUNTS ===')
print(df.isnull().sum())

print('\n=== UNIQUE VALUES (categorical) ===')
for col in df.select_dtypes(include='object').columns:
    print(f'{col}: {df[col].nunique()} unique values: {df[col].unique()[:5]}')

# Save for next iteration
df.to_parquet('/workspace/raw.parquet')
print('\nData saved to workspace.')

Phase 2: Datenbereinigung

Nach der Exploration schreibt der Agent auf Grundlage seiner Beobachtungen gezielten Bereinigungscode. Die Bereinigungsstrategie ist dynamisch: Wenn das LLM in einer Spalte 15 % Nullwerte festgestellt hat, entscheidet es, ob diese entfernt oder imputiert werden. Wenn es in einer Spalte negative Werte erkannt hat, die nicht negativ sein sollten, filtert es diese heraus. Diese adaptive, beobachtungsbasierte Bereinigung macht den Agenten wirklich nützlich, anstatt lediglich eine festgelegte Pipeline auszuführen.

import pandas as pd
import numpy as np

# Load from previous iteration
df = pd.read_parquet('/workspace/raw.parquet')

# Fill numeric nulls with median (robust to outliers)
for col in df.select_dtypes(include='number').columns:
    if df[col].isnull().sum() > 0:
        median_val = df[col].median()
        df[col] = df[col].fillna(median_val)
        print(f'Filled nulls in {col} with median {median_val:.2f}')

# Drop rows where categorical key columns are null
df = df.dropna(subset=['category', 'date'])

# Fix date column type
df['date'] = pd.to_datetime(df['date'], errors='coerce')
df = df.dropna(subset=['date'])  # drop unparseable dates

# Remove clear outliers: revenue > 3 std deviations from mean
if 'revenue' in df.columns:
    z_scores = (df['revenue'] - df['revenue'].mean()) / df['revenue'].std()
    df = df[z_scores.abs() < 3]
    print(f'Removed outliers, rows remaining: {len(df)}')

df.to_parquet('/workspace/cleaned.parquet')
print('Cleaning complete:', df.shape)

Phase 3: Die Frage beantworten

In der Analysephase konzentriert sich der Agent darauf, die konkrete Antwort auf die Frage des Benutzers zu berechnen. Wenn die Frage lautet: „Welche Produktkategorie hatte im letzten Quartal den höchsten Umsatz?“, schreibt der Agent Code, um nach Datum zu filtern, nach Kategorie zu gruppieren, den Umsatz zu summieren und die Ergebnisse zu sortieren. Der Analysecode wird auf Grundlage sowohl der Frage als auch der Beobachtungen aus der Exploration neu generiert – er ist keine allgemeine Vorlage.

import pandas as pd
import matplotlib
matplotlib.use('Agg')  # non-interactive backend for server use
import matplotlib.pyplot as plt

df = pd.read_parquet('/workspace/cleaned.parquet')

# Analysis: revenue by category for last quarter
df['date'] = pd.to_datetime(df['date'])
last_quarter = df[df['date'] >= '2024-10-01']

revenue_by_category = (
    last_quarter
    .groupby('category')['revenue']
    .sum()
    .sort_values(ascending=False)
)
print('Revenue by category (last quarter):')
print(revenue_by_category)
print(f'\nTop category: {revenue_by_category.index[0]} (${revenue_by_category.iloc[0]:,.0f})')

# Save analysis result
revenue_by_category.to_json('/workspace/analysis_result.json')

Phase 4: Diagramme erzeugen

Visualisierungen machen analytische Erkenntnisse klar und überzeugend. Der Datenanalyse-Agent erstellt matplotlib-Diagramme und speichert sie als PNG-Dateien im Arbeitsbereich. Wichtige Entscheidungen beim Diagrammdesign – Diagrammtyp, Farbpalette, Achsenbeschriftungen, Titel und Anmerkungen – trifft das LLM auf Grundlage der jeweiligen Daten. Der Agent speichert Diagramme immer unter /workspace/, damit sie in den Abschlussbericht aufgenommen werden können.

import pandas as pd
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import json

with open('/workspace/analysis_result.json') as f:
    data = json.load(f)

categories = list(data.keys())
values = [data[k] / 1e6 for k in categories]  # convert to millions

fig, ax = plt.subplots(figsize=(10, 6))
bars = ax.barh(categories, values, color='steelblue', edgecolor='white')

# Add value labels on bars
for bar, val in zip(bars, values):
    ax.text(bar.get_width() + 0.05, bar.get_y() + bar.get_height()/2,
            f'${val:.1f}M', va='center', fontsize=11)

ax.set_xlabel('Revenue ($ Millions)', fontsize=12)
ax.set_title('Revenue by Product Category - Q4 2024', fontsize=14, fontweight='bold')
ax.invert_yaxis()  # highest on top
plt.tight_layout()
plt.savefig('/workspace/chart.png', dpi=150, bbox_inches='tight')
print('Chart saved to /workspace/chart.png')

Den schriftlichen Bericht erstellen

Die letzte Iteration erstellt den schriftlichen zusammenfassenden Bericht. Das LLM liest die Analyseergebnisse und die Diagrammbeschreibung und verfasst anschließend eine präzise, korrekte Darstellung, die die ursprüngliche Frage mit konkreten Zahlen beantwortet. Der Bericht verweist auf das Diagramm und enthält die zentrale Erkenntnis, die zugrunde liegenden Daten sowie eine Empfehlung oder Implikation für das Unternehmen.

import json

with open('/workspace/analysis_result.json') as f:
    revenue_data = json.load(f)

top_category = max(revenue_data, key=revenue_data.get)
top_revenue = revenue_data[top_category]
total_revenue = sum(revenue_data.values())
share = top_revenue / total_revenue * 100

report = f'''# Q4 2024 Revenue Analysis

## Answer
The **{top_category}** category generated the highest revenue in Q4 2024:
**${top_revenue:,.0f}** ({share:.1f}% of total Q4 revenue).

## Key Findings
- Total Q4 revenue: ${total_revenue:,.0f}
- Top 3 categories: {list(revenue_data.items())[:3]}
- The top category outperformed the average by {top_revenue / (total_revenue / len(revenue_data)):.1f}x

## Chart
See chart.png for the full breakdown by category.

## Recommendation
Consider reallocating marketing budget toward {top_category} to
capitalize on its demonstrated strong performance.
'''

with open('/workspace/report.md', 'w') as f:
    f.write(report)
print('TASK COMPLETE')
print(report)

Den Agent-Orchestrator zusammenstellen

Der Orchestrator verbindet alle Phasen miteinander: Er initialisiert den Arbeitsbereich, kopiert die Eingabe-CSV-Datei, führt die Code-Ausführungsschleife aus, überwacht das Signal TASK COMPLETE und sammelt anschließend die Ausgabedateien (report.md, chart.png) ein. Außerdem behandelt der Orchestrator Fehler und Wiederholungsversuche und führt am Ende die Bereinigung temporärer Dateien durch.

import shutil
from pathlib import Path

def run_data_analysis_agent(csv_path: str, question: str) -> dict:
    workspace = setup_workspace()
    shutil.copy(csv_path, workspace / 'data.csv')
    
    messages = [
        {'role': 'system', 'content': DATA_AGENT_SYSTEM_PROMPT},
        {'role': 'user', 'content': f'File: /workspace/data.csv\nQuestion: {question}'}
    ]
    
    state = ExecutionState(task=question)
    
    for iteration in range(15):  # max 15 iterations
        response = llm.complete(messages)
        code = extract_code_block(response)
        
        if not code or 'TASK COMPLETE' in response:
            break
        
        stdout, stderr = execute_in_docker(code, workspace=workspace)
        observation = format_observation(stdout, stderr)
        messages += [
            {'role': 'assistant', 'content': response},
            {'role': 'user', 'content': observation}
        ]
        state.after_execution(stdout, f'iteration_{iteration}')
    
    return {
        'report': (workspace / 'report.md').read_text() if (workspace / 'report.md').exists() else '',
        'chart_path': str(workspace / 'chart.png'),
        'iterations': state.iteration
    }

Mit mehrdeutigen Fragen umgehen

Benutzer stellen häufig mehrdeutige Fragen wie „Welche Produkte schneiden gut ab?“. Ein robuster Datenanalyse-Agent klärt Mehrdeutigkeiten vor dem Start: Zunächst untersucht er die Daten, ermittelt, welche Metriken verfügbar sind, und leitet dann entweder die sinnvollste Interpretation ab oder bittet den Benutzer um eine Präzisierung. Dieser Reflexionsschritt verhindert, dass der Agent eine technisch korrekte, aber praktisch nutzlose Antwort erzeugt.

def handle_ambiguous_question(question: str, df_summary: dict) -> str:
    clarification_prompt = f'''The user asked: '{question}'

Available data:
- Columns: {df_summary['columns']}
- Date range: {df_summary['date_range']}
- Metrics available: {df_summary['numeric_columns']}

Is the question clear enough to answer definitively?
If yes, restate the specific interpretation you will use.
If no, list the 2-3 clarifications needed to proceed.'''
    
    response = llm.complete([{'role': 'user', 'content': clarification_prompt}])
    return response

Qualitätsprüfungen für die Agent-Ausgabe

Überprüfen Sie nach Abschluss des Agents die Qualität seiner Ausgabe. Prüfen Sie, ob die Berichtsdatei tatsächlich erstellt wurde, ob die PNG-Datei des Diagramms eine gültige Bilddatei ist, ob die Zahlen im Bericht mit den Daten in analysis_result.json übereinstimmen und ob der Bericht die ursprüngliche Frage tatsächlich beantwortet. Ein automatisierter QA-Schritt mit einem zweiten LLM-Aufruf kann Fälle erkennen, in denen der Agent zwar die Schleife abgeschlossen, aber eine unzureichende Antwort erzeugt hat.

def validate_analysis_output(workspace: str, question: str, report: str) -> dict:
    validation_prompt = f'''Original question: {question}

Agent report:
{report[:2000]}

Rate this analysis on a scale of 1-5 for:
1. Does it directly answer the question? (1=No, 5=Yes)
2. Are specific numbers cited? (1=No, 5=Yes)
3. Is the conclusion clearly stated? (1=No, 5=Yes)

Return JSON: {{"question_answered": N, "numbers_cited": N, "clear_conclusion": N, "overall": N}}'''
    
    result = llm.complete([{'role': 'user', 'content': validation_prompt}],
                          response_format={'type': 'json_object'})
    scores = json.loads(result)
    passed = scores['overall'] >= 4
    return {'scores': scores, 'passed': passed}

Den Agent mit domänenspezifischen Tools erweitern

Der grundlegende Code-Agent wird noch leistungsfähiger, wenn Sie ihn um domänenspezifische Tools erweitern. Fügen Sie für einen Finanzdaten-Agenten Funktionen hinzu, die aktuelle Aktienkurse abrufen. Ergänzen Sie für einen Marketingdaten-Agenten den Zugriff auf die Google Analytics API. Fügen Sie für einen Vertriebsagenten Salesforce-Abfragen hinzu. Diese Tools werden dem LLM über Funktionsdefinitionen im System-Prompt oder über den @tool-Decorator von LangChain verfügbar gemacht.

Kurzer Test

Testen Sie Ihr Verständnis des Datenanalyse-Agents aus dieser Lektion.

Zusammenfassung der Lektion

In dieser Lektion haben Sie gelernt: Ein Datenanalyse-Agent durchläuft vier Phasen – Erkunden, Bereinigen, Analysieren und Berichten –, die jeweils durch iterative Codegenerierung und -ausführung umgesetzt werden. Diagrammerstellung mit matplotlib und die dateibasierte Zustandsspeicherung verbinden diese Phasen zu einem durchgängigen Workflow, und die Validierung der Ausgabe stellt sicher, dass die abschließende Antwort des Agents tatsächlich auf die ursprüngliche Frage eingeht. Als Nächstes beschäftigen wir uns mit der Beobachtbarkeit und dem Tracing von LLMs.

Häufig gestellte Fragen

Ist die Lektion „Einen Datenanalyse-Agent entwickeln“ kostenlos?

Ja — der vollständige Text von „Einen Datenanalyse-Agent entwickeln“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des AI Engineering Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der AI Engineering Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Einen Datenanalyse-Agent entwickeln“?

Erstellen Sie einen durchgängigen Datenanalyse-Agenten, der eine CSV-Datei und eine Frage in natürlicher Sprache entgegennimmt, iterativ pandas- und matplotlib-Code schreibt und einen ausgereiften Be… Du übst AI Engineering Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um AI Engineering Academy zu starten?

Keine Vorkenntnisse erforderlich. AI Engineering Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.

Wie lange dauert die Lektion „Einen Datenanalyse-Agent entwickeln“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser AI Engineering Academy-Lektion Code schreiben und ausführen?

Ja. Jede AI Engineering Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Die Code-Ausführungsschleife
  2. Sandboxing mit Docker und RestrictedPython
  3. Zustandsverwaltung über mehrere Ausführungsschritte hinweg
  4. Einen Datenanalyse-Agent entwickeln
← Zurück zu AI Engineering Academy