{"id":"kpi-dashboard-design","name":"kpi-dashboard-design","summary":"指標選択、可視化のベストプラクティス、リアルタイムモニタリングパターンを備えた効果的なKPIダッシュボードを設計しましょう。","body":"# KPI Dashboard Design\n\nComprehensive patterns for designing effective Key Performance Indicator (KPI) dashboards that drive business decisions.\n\n## When to Use This Skill\n\n- Designing executive dashboards\n- Selecting meaningful KPIs\n- Building real-time monitoring displays\n- Creating department-specific metrics views\n- Improving existing dashboard layouts\n- Establishing metric governance\n\n## Core Concepts\n\n### 1. KPI Framework\n\n| Level           | Focus            | Update Frequency  | Audience   |\n| --------------- | ---------------- | ----------------- | ---------- |\n| **Strategic**   | Long-term goals  | Monthly/Quarterly | Executives |\n| **Tactical**    | Department goals | Weekly/Monthly    | Managers   |\n| **Operational** | Day-to-day       | Real-time/Daily   | Teams      |\n\n### 2. SMART KPIs\n\n```\nSpecific: Clear definition\nMeasurable: Quantifiable\nAchievable: Realistic targets\nRelevant: Aligned to goals\nTime-bound: Defined period\n```\n\n### 3. Dashboard Hierarchy\n\n```\n├── Executive Summary (1 page)\n│   ├── 4-6 headline KPIs\n│   ├── Trend indicators\n│   └── Key alerts\n├── Department Views\n│   ├── Sales Dashboard\n│   ├── Marketing Dashboard\n│   ├── Operations Dashboard\n│   └── Finance Dashboard\n└── Detailed Drilldowns\n    ├── Individual metrics\n    └── Root cause analysis\n```\n\n## Detailed worked examples and patterns\n\nDetailed sections (starting with `## Common KPIs by Department`) live in `references/details.md`. Read that file when the navigation summary above is insufficient.\n\n## Best Practices\n\n### Do's\n\n- **Limit to 5-7 KPIs** - Focus on what matters\n- **Show context** - Comparisons, trends, targets\n- **Use consistent colors** - Red=bad, green=good\n- **Enable drilldown** - From summary to detail\n- **Update appropriately** - Match metric frequency\n\n### Don'ts\n\n- **Don't show vanity metrics** - Focus on actionable data\n- **Don't overcrowd** - White space aids comprehension\n- **Don't use 3D charts** - They distort perception\n- **Don't hide methodology** - Document calculations\n- **Don't ignore mobile** - Ensure responsive design\n\n## Troubleshooting\n\n### MRR shown on dashboard contradicts finance's number\n\nThe most common cause is inconsistent treatment of annual plans. Finance may prorate to a daily rate while the dashboard normalizes to monthly. Align on a single formula and document it directly on the dashboard card:\n\n```sql\n-- Explicit formula shown in tooltip / data dictionary\n-- Annual plans: divide total contract value by 12\n-- Quarterly plans: divide by 3\n-- Monthly plans: use as-is\nCASE subscription_interval\n    WHEN 'monthly'   THEN amount\n    WHEN 'quarterly' THEN amount / 3.0\n    WHEN 'yearly'    THEN amount / 12.0\nEND AS normalized_mrr\n```\n\n### Dashboard shows green but product team reports users complaining\n\nThe dashboard likely tracks system uptime (a lagging indicator) but not user-facing quality metrics. Add customer-perceived metrics alongside infrastructure metrics:\n\n| Infrastructure (green) | User-perceived (add these) |\n|---|---|\n| API uptime 99.9% | P95 page load time |\n| Error rate 0.1% | Task completion rate |\n| Queue depth normal | Support ticket volume |\n\n### Retention cohort looks flat — no variation between cohorts\n\nCheck whether the cohort query is partitioning by signup month correctly. A common bug is using `created_at::date` instead of `DATE_TRUNC('month', created_at)`, which groups by day and produces cohorts too small to show trends:\n\n```sql\n-- Wrong: too granular, cohorts are too small\nDATE_TRUNC('day', created_at) AS cohort_date\n\n-- Correct: monthly cohorts\nDATE_TRUNC('month', created_at) AS cohort_month\n```\n\n### Real-time dashboard hammers the database\n\nA live dashboard refreshing every 10 seconds with complex cohort SQL will degrade production query performance. Separate OLAP workloads from OLTP by writing pre-aggregated metrics to a summary table via a scheduled job, and have the dashboard read from that:\n\n```python\n# Scheduled every 5 minutes via cron/Celery\ndef refresh_mrr_summary():\n    conn.execute(\"\"\"\n        INSERT INTO kpi_snapshot (metric, value, snapshot_at)\n        SELECT 'mrr', SUM(...), NOW()\n        FROM subscriptions WHERE status = 'active'\n        ON CONFLICT (metric) DO UPDATE SET value = EXCLUDED.value\n    \"\"\")\n```\n\n### Alert thresholds fire constantly, team ignores them\n\nStatic thresholds set once and never reviewed cause alert fatigue. Use dynamic thresholds based on rolling averages so alerts fire only when the metric deviates significantly from its own baseline:\n\n```python\n# Alert if current value is > 2 standard deviations from 30-day rolling mean\ndef is_anomalous(current: float, history: list[float]) -> bool:\n    mean = statistics.mean(history)\n    stdev = statistics.stdev(history)\n    return abs(current - mean) > 2 * stdev\n```\n\n## Related Skills\n\n- `data-storytelling` - Turn dashboard findings into narratives that drive executive decisions","author":"@wshobson","ownerProfile":null,"authorContacts":null,"sourceUrl":"https://github.com/wshobson/agents/tree/main/plugins/business-analytics/skills/kpi-dashboard-design","license":"MIT","category":"document","lang":"en","tokens":1122,"stars":0,"calls30d":2,"claimed":false,"visibility":"public","origin":"crawler","version":"0.1.0","createdAt":"2026-08-22","updatedAt":"2026-08-22","files":[{"path":"references/details.md","size":14987,"sha256":"2a9cda8a88845d4ebd489f9ddc93ad0d44b3aabb53ffd6947a6503073c422b47"}],"requires":{"mcp":[],"tools":[]},"safety":{"flags":[],"scannedAt":"2026-08-22","hasScripts":false,"networkEndpoints":[]}}