| name | data-analysis |
| description | Analyze datasets to extract insights, identify patterns, and generate reports. Use when exploring data, creating visualizations, or performing statistical analysis. Handles CSV, JSON, SQL queries, and Python pandas operations. |
| allowed-tools | Bash(python:*), Read, Write |
Data Analysis
Analyze datasets to extract insights, identify patterns, and generate reports.
When to Use
- Data exploration: Understand a new dataset
- Report generation: Derive data-driven insights
- Quality validation: Check data consistency
- Decision support: Make data-driven recommendations
Prerequisites
pip install pandas numpy matplotlib seaborn scipy
Step 1: Load and Explore Data
import pandas as pd
import numpy as np
df = pd.read_csv('data.csv')
print(df.info())
print(df.describe())
print(df.head(10))
print(df.isnull().sum())
print(df.dtypes)
Step 2: Data Cleaning
df['column'].fillna(df['column'].mean(), inplace=True)
df.dropna(subset=['required_column'], inplace=True)
df.drop_duplicates(inplace=True)
df['date'] = pd.to_datetime(df['date'])
df['category'] = df['category'].astype('category')
Q1 = df['value'].quantile(0.25)
Q3 = df['value'].quantile(0.75)
IQR = Q3 - Q1
df = df[(df['value'] >= Q1 - 1.5*IQR) & (df['value'] <= Q3 + 1.5*IQR)]
Step 3: Statistical Analysis
print(df['numeric_column'].describe())
grouped = df.groupby('category').agg({
'value': ['mean', 'sum', 'count'],
'other': 'nunique'
})
print(grouped)
correlation = df[['col1', 'col2', 'col3']].corr()
print(correlation)
pivot = pd.pivot_table(df,
values='sales',
index='region',
columns='month',
aggfunc='sum'
)
Step 4: Visualization
import matplotlib.pyplot as plt
import seaborn as sns
plt.figure(figsize=(10, 6))
df['value'].hist(bins=30)
plt.title('Distribution of Values')
plt.savefig('histogram.png')
plt.figure(figsize=(10, 6))
sns.boxplot(x='category', y='value', data=df)
plt.title('Value by Category')
plt.savefig('boxplot.png')
plt.figure(figsize=(10, 8))
sns.heatmap(correlation, annot=True, cmap='coolwarm')
plt.title('Correlation Matrix')
plt.savefig('heatmap.png')
plt.figure(figsize=(12, 6))
df.groupby('date')['value'].sum().plot()
plt.title('Time Series of Values')
plt.savefig('timeseries.png')
Step 5: Derive Insights
top_10 = df.nlargest(10, 'value')
bottom_10 = df.nsmallest(10, 'value')
df['month'] = df['date'].dt.to_period('M')
monthly_trend = df.groupby('month')['value'].sum()
growth = monthly_trend.pct_change() * 100
segments = df.groupby('segment').agg({
'revenue': 'sum',
'customers': 'nunique',
'orders': 'count'
})
segments['avg_order_value'] = segments['revenue'] / segments['orders']
Output Format
# Data Analysis Report
## 1. Dataset Overview
- Dataset: [name]
- Records: X,XXX
- Columns: XX
- Date range: YYYY-MM-DD ~ YYYY-MM-DD
## 2. Key Findings
- Insight 1
- Insight 2
- Insight 3
## 3. Statistical Summary
| Metric | Value |
|--------|-------|
| Mean | X.XX |
| Median | X.XX |
| Std dev | X.XX |
## 4. Recommendations
1. [Recommendation 1]
2. [Recommendation 2]
Best Practices
- Understand first: Learn structure before analysis
- Incremental: Move from simple to complex
- Visualize: Use charts to spot patterns
- Validate: Always verify assumptions
- Document: Record analysis process
Constraints
Required (MUST)
- Preserve raw data (work on copy)
- Document analysis process
- Validate results
Prohibited (MUST NOT)
- Expose sensitive personal data
- Draw unsupported conclusions
SQL Alternative
For databases, use SQL queries:
SELECT
COUNT(*) as total_rows,
COUNT(DISTINCT column) as unique_values,
MIN(value) as min_val,
MAX(value) as max_val,
AVG(value) as avg_val
FROM table_name;
SELECT
category,
COUNT(*) as count,
AVG(value) as avg_value
FROM table_name
GROUP BY category
ORDER BY count DESC;