Agenten für statistische Zusammenfassungen
Verteilungsanalyse, Korrelation und Ausreißererkennung in von Agenten erstellten Berichten.
Agenten für statistische Zusammenfassungen ist eine kostenlose AI Agents-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 Agents-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der AI Agents-Kurs umfasst insgesamt 4 Lektionen.
Warum statistische Zusammenfassungen wichtig sind
Rohdaten sind für sich genommen selten nützlich. Ein Datenanalyseagent wird wirklich wertvoll, wenn er statistische Zusammenfassungen automatisch berechnen und Zahlen in leicht verständliche Erkenntnisse übersetzen kann.
Diese Lektion behandelt die grundlegenden statistischen Operationen: Beschreiben, Korrelation, Ausreißererkennung, Verteilungsermittlung und automatische Erkenntnisgenerierung.
df.describe(): Der Ausgangspunkt
df.describe() berechnet Anzahl, Mittelwert, Standardabweichung, Minimum, Quartile und Maximum für alle numerischen Spalten in einem Aufruf. Dies ist der standardmäßige erste Schritt jeder explorativen Datenanalyse.
import pandas as pd
df = pd.read_csv('sales_data.csv')
# Basic numeric summary
print(df.describe())
# Also describe categorical columns
print(df.describe(include='object'))
# Custom percentiles
print(df.describe(percentiles=[0.05, 0.25, 0.5, 0.75, 0.95]))
# Convert to clean dict for agent use
def get_numeric_summary(df):
desc = df.describe().round(2)
return {
col: desc[col].to_dict()
for col in desc.columns
}Korrelationsmatrix
Die Korrelationsmatrix zeigt paarweise lineare Beziehungen zwischen allen numerischen Spalten. Die Werte reichen von -1 (stark negativ) bis +1 (stark positiv). Werte nahe 0 weisen auf keine lineare Beziehung hin.
import pandas as pd
import numpy as np
def compute_correlation_matrix(df):
numeric = df.select_dtypes(include='number')
corr = numeric.corr().round(3)
return corr.to_dict()
def find_strong_correlations(df, threshold=0.7):
numeric = df.select_dtypes(include='number')
corr = numeric.corr()
strong = []
cols = corr.columns
for i in range(len(cols)):
for j in range(i + 1, len(cols)): # upper triangle only
val = corr.iloc[i, j]
if abs(val) >= threshold:
strong.append({
'col_a': cols[i],
'col_b': cols[j],
'correlation': round(val, 3),
'direction': 'positive' if val > 0 else 'negative'
})
return sorted(strong, key=lambda x: abs(x['correlation']), reverse=True)Ausreißererkennung: IQR-Methode
Die Interquartilsabstand-Methode (IQR-Methode) identifiziert Werte als Ausreißer, wenn sie mehr als das 1,5-Fache des IQR über Q3 oder unter Q1 liegen. Sie ist robust gegenüber Extremwerten – anders als der Z-Score funktioniert sie auch dann gut, wenn bereits Ausreißer in den Daten vorhanden sind.
import pandas as pd
def detect_outliers_iqr(df, columns=None, multiplier=1.5):
numeric = df.select_dtypes(include='number')
if columns:
numeric = numeric[columns]
outlier_report = {}
for col in numeric.columns:
q1 = numeric[col].quantile(0.25)
q3 = numeric[col].quantile(0.75)
iqr = q3 - q1
lower = q1 - multiplier * iqr
upper = q3 + multiplier * iqr
outliers = numeric[(numeric[col] < lower) | (numeric[col] > upper)][col]
outlier_report[col] = {
'q1': round(q1, 3),
'q3': round(q3, 3),
'iqr': round(iqr, 3),
'lower_bound': round(lower, 3),
'upper_bound': round(upper, 3),
'outlier_count': len(outliers),
'outlier_pct': round(len(outliers) / len(df) * 100, 1),
'outlier_values': outliers.tolist()[:10] # first 10
}
return outlier_reportVerteilungstyp bestimmen
Die Bestimmung des Verteilungstyps (normalverteilt, schief, bimodal, gleichverteilt) hilft dem Agenten, die richtigen statistischen Tests auszuwählen und Daten genau zu beschreiben.
Verwenden Sie Schiefe und Kurtosis als schnelle Heuristiken, bevor Sie formale Tests durchführen.
import pandas as pd
from scipy import stats
def identify_distribution(series):
'''Classify distribution type using skewness, kurtosis, and normality test.'''
clean = series.dropna()
if len(clean) < 8:
return {'type': 'insufficient_data'}
skewness = clean.skew()
kurtosis = clean.kurtosis()
# Shapiro-Wilk normality test (reliable up to ~5000 samples)
sample = clean.sample(min(500, len(clean)), random_state=42)
_, p_value = stats.shapiro(sample)
distribution = 'normal' if p_value > 0.05 else 'non-normal'
if abs(skewness) < 0.5 and p_value > 0.05:
dist_type = 'normal'
elif skewness > 1.0:
dist_type = 'right-skewed (long right tail)'
elif skewness < -1.0:
dist_type = 'left-skewed (long left tail)'
elif abs(skewness) < 0.5 and kurtosis < -1:
dist_type = 'uniform-like'
else:
dist_type = 'approximately normal'
return {
'type': dist_type,
'skewness': round(skewness, 3),
'kurtosis': round(kurtosis, 3),
'normality_pvalue': round(p_value, 4),
'is_normal': p_value > 0.05
}Normalverteilungstests
Es stehen mehrere formale Tests auf Normalverteilung zur Verfügung. Shapiro-Wilk eignet sich am besten für kleine Stichproben, D'Agostino-Pearson für größere Datensätze. Der Schwellenwert für den p-Wert liegt typischerweise bei 0,05 – verwerfen Sie die Annahme der Normalverteilung, wenn p < 0,05 ist.
from scipy import stats
import numpy as np
def test_normality(series, alpha=0.05):
clean = series.dropna().values
n = len(clean)
results = {}
# Shapiro-Wilk (best for n < 5000)
if n <= 5000:
stat, p = stats.shapiro(clean)
results['shapiro_wilk'] = {
'statistic': round(stat, 4),
'p_value': round(p, 4),
'is_normal': p > alpha
}
# D'Agostino-Pearson (n >= 20)
if n >= 20:
stat, p = stats.normaltest(clean)
results['dagostino_pearson'] = {
'statistic': round(stat, 4),
'p_value': round(p, 4),
'is_normal': p > alpha
}
# Kolmogorov-Smirnov
mean, std = np.mean(clean), np.std(clean)
stat, p = stats.kstest(clean, 'norm', args=(mean, std))
results['kolmogorov_smirnov'] = {
'statistic': round(stat, 4),
'p_value': round(p, 4),
'is_normal': p > alpha
}
return resultsVollständiges statistisches Profil
Fassen Sie alle statistischen Analysen in einer einzigen Funktion full_profile() zusammen, die für jede numerische Spalte eines DataFrames eine umfassende statistische Zusammenfassung zurückgibt.
def full_statistical_profile(df):
numeric = df.select_dtypes(include='number')
profiles = {}
for col in numeric.columns:
series = numeric[col].dropna()
profile = {
'count': len(series),
'null_count': df[col].isnull().sum(),
'mean': round(series.mean(), 4),
'median': round(series.median(), 4),
'std': round(series.std(), 4),
'min': round(series.min(), 4),
'max': round(series.max(), 4),
'range': round(series.max() - series.min(), 4),
'q1': round(series.quantile(0.25), 4),
'q3': round(series.quantile(0.75), 4)
}
profile['distribution'] = identify_distribution(series)
outliers = detect_outliers_iqr(df, columns=[col])
profile['outliers'] = outliers.get(col, {})
profiles[col] = profile
return {
'profiles': profiles,
'correlations': find_strong_correlations(df),
'shape': {'rows': len(df), 'columns': len(df.columns)}
}Automatische Erkenntnisgenerierung
Übergeben Sie das statistische Profil an das LLM und bitten Sie es, Erkenntnisse in leicht verständlicher Sprache zu generieren. Das Modell erkennt Muster, weist auf Anomalien hin und macht Ergebnisse sichtbar, die für geschäftliche Nutzer relevant sind.
import json
INSIGHT_PROMPT = '''You are a data analyst. Generate 3-5 key insights from this statistical summary.
Dataset: {dataset_name}
Statistical profile:
{profile_json}
For each insight:
- Be specific (use actual numbers)
- Focus on business relevance
- Flag any data quality concerns (high null counts, extreme outliers)
- Note unexpected patterns
Format as bullet points.'''
def generate_insights(df, dataset_name='dataset'):
profile = full_statistical_profile(df)
profile_text = json.dumps(profile, indent=2, default=str)[:3000]
return llm_call(INSIGHT_PROMPT.format(
dataset_name=dataset_name,
profile_json=profile_text
))
# Example output:
# - Revenue column has 3.2% outliers; max value ($48,500) is 12x the median ($3,900)
# - Customer age follows a right-skewed distribution (skewness: 1.4) with most users under 35
# - Strong positive correlation (r=0.87) between session_count and lifetime_valueTrenderkennung in Zeitreihen
Ermitteln Sie bei Zeitreihendaten den Gesamttrend (steigend, fallend oder gleichbleibend) mithilfe einer linearen Regression. Dadurch können Agenten Aussagen treffen wie „Der Umsatz steigt um 2.400 $ pro Monat.“
import numpy as np
from scipy import stats
def detect_trend(values):
if len(values) < 3:
return {'trend': 'insufficient_data'}
x = np.arange(len(values))
y = np.array(values, dtype=float)
slope, intercept, r_value, p_value, std_err = stats.linregress(x, y)
if p_value > 0.05:
trend = 'flat (no significant trend)'
elif slope > 0:
trend = 'increasing'
else:
trend = 'decreasing'
return {
'trend': trend,
'slope_per_period': round(slope, 4),
'r_squared': round(r_value ** 2, 4),
'p_value': round(p_value, 4),
'significant': p_value < 0.05
}
# Example: monthly revenue trend
monthly_revenue = [10000, 11200, 10800, 12500, 13100, 14200, 15000]
print(detect_trend(monthly_revenue))
# {'trend': 'increasing', 'slope_per_period': 834.2, 'r_squared': 0.95, ...}Vergleichende Statistik
Oft ist der nützlichste Erkenntnisgewinn der Vergleich von Gruppen: „Segment A hat einen um 40 % höheren durchschnittlichen Bestellwert als Segment B.“ Verwenden Sie für Gruppenvergleiche t-Tests oder den Mann-Whitney-Test.
from scipy import stats
import pandas as pd
def compare_groups(df, group_column, value_column):
groups = df.groupby(group_column)[value_column].apply(list)
group_names = list(groups.index)
comparison = []
for i, g1 in enumerate(group_names):
for j, g2 in enumerate(group_names):
if j <= i:
continue
a, b = groups[g1], groups[g2]
mean_a = pd.Series(a).mean()
mean_b = pd.Series(b).mean()
# Mann-Whitney U (non-parametric, no normality assumption)
stat, p = stats.mannwhitneyu(a, b, alternative='two-sided')
pct_diff = (mean_a - mean_b) / mean_b * 100 if mean_b != 0 else 0
comparison.append({
'group_a': g1, 'group_b': g2,
'mean_a': round(mean_a, 2),
'mean_b': round(mean_b, 2),
'pct_difference': round(pct_diff, 1),
'p_value': round(p, 4),
'significant': p < 0.05
})
return comparisonAnalyse fehlender Werte
Analysieren Sie fehlende Werte, bevor Sie Statistiken berechnen. Ein hoher Anteil an Nullwerten in einer Spalte macht daraus berechnete Statistiken ungültig. Geben Sie die Anzahl und den prozentualen Anteil der Nullwerte sowie Muster an (sind die Nullwerte zufällig oder systematisch?).
import pandas as pd
import numpy as np
def analyze_missing_values(df):
total_rows = len(df)
missing_report = {}
for col in df.columns:
null_count = df[col].isnull().sum()
if null_count == 0:
continue
null_pct = null_count / total_rows * 100
# Check if nulls correlate with another column (systematic pattern)
pattern = 'random'
if null_pct > 5:
for other_col in df.select_dtypes(include='object').columns:
if other_col == col:
continue
null_rates = df.groupby(other_col)[col].apply(
lambda x: x.isnull().mean()
)
if null_rates.max() - null_rates.min() > 0.3: # 30% difference
pattern = f'correlated_with_{other_col}'
break
missing_report[col] = {
'null_count': int(null_count),
'null_pct': round(null_pct, 1),
'severity': 'high' if null_pct > 20 else 'medium' if null_pct > 5 else 'low',
'pattern': pattern
}
return missing_reportWissenscheck
Warum wird die IQR-Methode bei der Ausreißererkennung in Agentenanwendungen dem Z-Score vorgezogen?
Rückblick: Agenten für statistische Zusammenfassungen
Agenten für statistische Zusammenfassungen kombinieren: df.describe() für grundlegende Statistiken, Korrelationsmatrizen zur Erkennung von Zusammenhängen, die IQR-Ausreißererkennung (robust gegenüber Extremwerten), die Verteilungsermittlung anhand von Schiefe und Normalverteilungstests sowie die Trenderkennung durch lineare Regression.
Übergeben Sie das statistische Profil zur automatischen Erkenntnisgenerierung an das LLM – so werden Zahlen in leicht verständliche geschäftliche Ergebnisse übersetzt. Vergleichende Statistiken (Gruppenvergleiche mit Signifikanztests) machen besonders konkrete Erkenntnisse sichtbar.
Lerne AI Agents mit einem KI-Tutor — kostenlos
Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.
- Kurse
- 60
- Lektionen
- 239
Häufig gestellte Fragen
Ist die Lektion „Agenten für statistische Zusammenfassungen“ kostenlos?
Ja — der vollständige Text von „Agenten für statistische Zusammenfassungen“ 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 Agents-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der AI Agents-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Agenten für statistische Zusammenfassungen“?
Verteilungsanalyse, Korrelation und Ausreißererkennung in von Agenten erstellten Berichten. Du übst AI Agents 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 Agents zu starten?
Keine Vorkenntnisse erforderlich. AI Agents 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 „Agenten für statistische Zusammenfassungen“?
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 Agents-Lektion Code schreiben und ausführen?
Ja. Jede AI Agents-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
- Code-Interpreter-Muster für Datenanalysen
- Pandas-basierte Daten-Agent-Tools
- Automatische Erstellung von Diagrammen und Visualisierungen
- Agenten für statistische Zusammenfassungen