# Case 01099

> Cleanup Review

- Skill: `knownasnaffy/case-01099` (Agent Skill, multi-file: 5 files)
- Install (CLI): `npx skillmds@latest add knownasnaffy/case-01099`
- Raw SKILL.md: https://api.skillmd.com/api/skills/knownasnaffy/case-01099/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- Author: knownasnaffy (https://skillmd.com/u/knownasnaffy)
- Updated: 2026-09-21
- Page: https://skillmd.com/skills/knownasnaffy/case-01099

---





### Cleanup Review

`python scripts/_reset_state.py` is an optional cleanup helper for the `Customer Segmentation Skill` skill. It may recursively remove /tmp/skill_cache. Show the exact paths first, explain whether they are skill-private temporary paths or user state, and run the cleanup only after the user confirms.

# Customer Segmentation Skill

Financial customer segmentation analysis: Stratify customers based on assets, transaction behaviors, activity levels, and other dimensions, outputting actionable segmentation results and visualizations.

## Workflow

### Step 1 — Data Loading and Cleaning

Read user-uploaded CSV or Excel files, automatically identifying column names.

Priority fields to retain:
- `customer_id` / `客户ID` — Unique customer identifier
- `age` / `年龄`
- `gender` / `性别`
- `balance` / `资产余额`
- `txn_amount` / `交易金额`
- `txn_count` / `交易次数`
- `last_date` / `最近交易日期`
- `product_count` / `持有产品数`
- `branch` / `网点`

Missing value handling:
- Numeric: Fill with median
- Categorical: Fill with mode
- Columns with >30% missing: Delete and notify user

```python
import pandas as pd

df = pd.read_csv(file_path)
df.columns = df.columns.str.strip().str.lower()
```

### Step 2 — Feature Engineering

Build RFM + extended features:

| Feature | Description |
|---------|-------------|
| Recency | Days since last transaction (smaller = more active) |
| Frequency | Transaction frequency (number of transactions in specified period) |
| Monetary | Transaction amount (total amount in specified period) |
| Tenure | Customer duration (months) |
| Product_Depth | Number of products held |
| Age | Customer age |

Data standardization: Use `StandardScaler` (Z-score) to normalize all numeric features.

### Step 3 — Clustering Analysis

Use **K-Means** algorithm, automatically determine K value (Elbow Method, SSE inflection point).

```python
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
X_scaled = scaler.fit_transform(features)

# Elbow method to find optimal K
sse = {}
for k in range(2, 10):
    km = KMeans(n_clusters=k, random_state=42, n_init=10)
    km.fit(X_scaled)
    sse[k] = km.inertia_
optimal_k = min(sse, key=sse.get)  # Simply take k with minimum SSE
```

K=5 can also be fixed based on business needs (high/medium-high/medium/medium-low/low value customers).

### Step 4 — Segment Profiling

Output core statistics for each cluster:

```
Cluster 0 (High-Value Customers): Avg. assets 850k, Avg. transaction frequency 28/month, Gender distribution 62% male
Cluster 1 (Potential Customers): Avg. assets 320k,明显 younger trend
...
```

Recommended label system (five categories):
- 🌟 High-Value Customers (VIP)
- ⬆️ Potential Customers
- 🟢 Stable Customers
- 🔄 Active Transaction Customers
- ⚠️ Dormant/Churn Warning Customers

### Step 5 — Visualization

Generate the following charts (saved as PNG):

1. **Customer Asset Distribution Histogram** — Asset distribution comparison across levels
2. **Radar Chart** — Feature comparison across segments
3. **Heatmap** — Cluster feature mean matrix
4. **Scatter Plot** — Customer distribution with assets × transaction frequency as coordinates

```python
import matplotlib.pyplot as plt
import matplotlib
matplotlib.use('Agg')
plt.rcParams['font.sans-serif'] = ['WenQuanYi Micro Hei', 'SimHei']

fig, axes = plt.subplots(1, 2, figsize=(14, 5))
# Asset distribution
axes[0].hist([g['balance'] for _, g in df.groupby('cluster')], bins=30, label=[f'C{i}' for i in range(k)])
axes[0].set_title('Customer Balance Distribution by Cluster')
# Heatmap
import seaborn as sns
sns.heatmap(cluster_means.T, annot=True, fmt='.1f', ax=axes[1])
axes[1].set_title('Cluster Feature Heatmap')
plt.tight_layout()
plt.savefig(output_path, dpi=150)
```

### Step 6 — Output Results

Output content:
1. Segmentation result table (including customer ID, cluster, segmentation label) → `segmentation_results.csv`
2. Cluster feature statistics → `cluster_summary.csv`
3. Visualization charts → `segmentation_charts.png`
4. Analysis summary (Markdown format) → `segmentation_report.md`

For detailed clustering and parameter documentation:
- RFM model explanation: Refer to `references/rfm-guide.md`
- Clustering parameter explanation: Refer to `references/clustering-guide.md`
