Datenanalyse-Skill-Beispiel

Ein Skill für Data-Science-Workflows und Analytics-Best-Practices.

Anwendungsfall

Dieser Skill hilft bei:

  • Datenexploration und -bereinigung
  • Statistische Analyse
  • Best Practices für Visualisierung
  • Python/Pandas-Workflows

Vollständige SKILL.md

markdown
---
name: Data Analysis Best Practices
description: Guide for exploratory data analysis and statistical workflows
version: 1.0.0
author: Data Science Community
platforms:
  - claude-code
  - codex
categories:
  - data
  - ai-ml
tags:
  - python
  - pandas
  - statistics
  - visualization
---

# Data Analysis Best Practices

## Workflow-Überblick

1. **Verstehen** - Die Frage definieren
2. **Erkunden** - Die Daten untersuchen
3. **Bereinigen** - Probleme behandeln
4. **Analysieren** - Methoden anwenden
5. **Visualisieren** - Erkenntnisse kommunizieren
6. **Dokumentieren** - Prozess aufzeichnen

## Datenexploration

### Erste Bewertung

\`\`\`python
import pandas as pd

def explore_dataset(df: pd.DataFrame) -> None:
    """Umfassende erste Datenexploration."""
    print(f"Form: {df.shape}")
    print(f"\nSpaltentypen:\n{df.dtypes}")
    print(f"\nFehlende Werte:\n{df.isnull().sum()}")
    print(f"\nGrundstatistiken:\n{df.describe()}")
    print(f"\nBeispielzeilen:\n{df.head()}")
\`\`\`

### Spaltenanalyse

\`\`\`python
def analyze_column(df: pd.DataFrame, column: str) -> dict:
    """Detaillierte Analyse einer einzelnen Spalte."""
    col = df[column]

    analysis = {
        'dtype': col.dtype,
        'missing': col.isnull().sum(),
        'unique': col.nunique(),
        'memory': col.memory_usage(deep=True),
    }

    if pd.api.types.is_numeric_dtype(col):
        analysis.update({
            'mean': col.mean(),
            'median': col.median(),
            'std': col.std(),
            'min': col.min(),
            'max': col.max(),
        })

    return analysis
\`\`\`

## Datenbereinigung

### Fehlende Werte

\`\`\`python
# Strategie 1: Zeilen mit fehlenden Werten entfernen
df_clean = df.dropna()

# Strategie 2: Mit Mittelwert/Median/Modus füllen
df['column'] = df['column'].fillna(df['column'].median())

# Strategie 3: Vorwärts-/Rückwärtsfüllung (Zeitreihen)
df['column'] = df['column'].fillna(method='ffill')

# Strategie 4: Interpolation
df['column'] = df['column'].interpolate(method='linear')
\`\`\`

### Ausreißer

\`\`\`python
def detect_outliers_iqr(df: pd.DataFrame, column: str) -> pd.Series:
    """Ausreißer mit IQR-Methode erkennen."""
    Q1 = df[column].quantile(0.25)
    Q3 = df[column].quantile(0.75)
    IQR = Q3 - Q1

    lower_bound = Q1 - 1.5 * IQR
    upper_bound = Q3 + 1.5 * IQR

    return (df[column] < lower_bound) | (df[column] > upper_bound)
\`\`\`

## Statistische Analyse

### Hypothesentests

\`\`\`python
from scipy import stats

# T-Test zum Vergleich zweier Gruppen
t_stat, p_value = stats.ttest_ind(group_a, group_b)

# Chi-Quadrat-Test für kategoriale Daten
chi2, p_value, dof, expected = stats.chi2_contingency(contingency_table)

# Korrelation
correlation, p_value = stats.pearsonr(x, y)
\`\`\`

### Effektstärke

\`\`\`python
def cohens_d(group1, group2):
    """Cohens d Effektstärke berechnen."""
    n1, n2 = len(group1), len(group2)
    var1, var2 = group1.var(), group2.var()

    pooled_std = np.sqrt(((n1-1)*var1 + (n2-1)*var2) / (n1+n2-2))
    return (group1.mean() - group2.mean()) / pooled_std
\`\`\`

## Visualisierung

### Best Practices

1. **Klare Titel** - Angeben, was das Diagramm zeigt
2. **Beschriftete Achsen** - Einheiten einbeziehen
3. **Angemessener Diagrammtyp** - Daten mit Visual abgleichen
4. **Farbe mit Zweck** - Bedeutungsvoll, zugänglich
5. **Minimale Unordnung** - Unnötige Elemente entfernen

### Diagrammauswahl

| Datentyp | Beziehung | Diagrammtyp |
|-----------|--------------|------------|
| Kategorial | Verteilung | Balkendiagramm |
| Numerisch | Verteilung | Histogramm |
| Zwei numerische | Korrelation | Streudiagramm |
| Zeitreihe | Trend | Liniendiagramm |
| Teile eines Ganzen | Zusammensetzung | Kreis-/Gestapeltes Balken |
| Vergleich | Rangfolge | Horizontales Balken |

### Beispielvisualisierung

\`\`\`python
import matplotlib.pyplot as plt
import seaborn as sns

def create_distribution_plot(df: pd.DataFrame, column: str):
    """Eine saubere Verteilungsvisualisierung erstellen."""
    fig, ax = plt.subplots(figsize=(10, 6))

    sns.histplot(data=df, x=column, kde=True, ax=ax)

    ax.set_title(f'Verteilung von {column}', fontsize=14, fontweight='bold')
    ax.set_xlabel(column, fontsize=12)
    ax.set_ylabel('Häufigkeit', fontsize=12)

    # Zusammenfassende Statistiken hinzufügen
    mean_val = df[column].mean()
    median_val = df[column].median()
    ax.axvline(mean_val, color='red', linestyle='--', label=f'Mittelwert: {mean_val:.2f}')
    ax.axvline(median_val, color='green', linestyle='--', label=f'Median: {median_val:.2f}')

    ax.legend()
    plt.tight_layout()

    return fig
\`\`\`

## Dokumentation

### Notebook-Struktur

1. **Titel und Überblick**
2. **Daten laden**
3. **Exploration**
4. **Bereinigung**
5. **Analyse**
6. **Schlussfolgerungen**
7. **Nächste Schritte**

### Code-Kommentare

\`\`\`python
# Gut: Erklärt WARUM
# Einträge vor 2020 entfernen, da die Datenqualität unzuverlässig ist
df = df[df['date'] >= '2020-01-01']

# Schlecht: Erklärt WAS (offensichtlich aus dem Code)
# Dataframe nach Datum filtern
df = df[df['date'] >= '2020-01-01']
\`\`\`

Nächste Schritte