🚀 快速安装

复制以下命令并运行,立即安装此 Skill:

npx skills add https://github.com/wshobson/agents --skill kpi-dashboard-design

💡 提示:需要 Node.js 和 NPM

KPI 仪表盘设计

设计有效的关键绩效指标(KPI)仪表盘以驱动业务决策的全面模式。

何时使用此技能

  • 设计高管仪表盘
  • 选择有意义的 KPI
  • 构建实时监控展示
  • 创建部门特定的指标视图
  • 改进现有的仪表盘布局
  • 建立指标治理体系

核心概念

1. KPI 框架

层级 关注点 更新频率 受众
战略层 长期目标 月度/季度 高管
战术层 部门目标 每周/每月 经理
运营层 日常运营 实时/每日 团队

2. SMART 原则的 KPI

具体性:定义清晰明确
可衡量:能够量化
可实现:目标切合实际
相关性:与目标对齐
时限性:有明确的时间周期

3. 仪表盘层级结构

├── 高管摘要(1 页)
│   ├── 4-6 个核心 KPI
│   ├── 趋势指标
│   └── 关键告警
├── 部门视图
│   ├── 销售仪表盘
│   ├── 市场仪表盘
│   ├── 运营仪表盘
│   └── 财务仪表盘
└── 详细下钻视图
    ├── 单个指标详情
    └── 根本原因分析

各部门常见 KPI

销售部门 KPI

收入指标:
  - 月度经常性收入 (MRR)
  - 年度经常性收入 (ARR)
  - 每用户平均收入 (ARPU)
  - 收入增长率

管道指标:
  - 销售管道总值
  - 赢单率
  - 平均交易额
  - 销售周期长度

活动指标:
  - 每位销售代表的通话/邮件数
  - 已安排的产品演示
  - 已发送的方案书
  - 成交率

市场部门 KPI

获客指标:
  - 每获取成本 (CPA)
  - 客户获取成本 (CAC)
  - 线索量
  - 市场认可线索 (MQL)

互动指标:
  - 网站流量
  - 转化率
  - 邮件打开率/点击率
  - 社交媒体互动

投资回报:
  - 市场投资回报率
  - 营销活动效果
  - 渠道归因
  - CAC 回收周期

产品部门 KPI

使用指标:
  - 日/月活跃用户 (DAU/MAU)
  - 会话时长
  - 功能采用率
  - 用户粘性 (DAU/MAU)

质量指标:
  - 净推荐值 (NPS)
  - 客户满意度 (CSAT)
  - 缺陷/问题数量
  - 解决时长

增长指标:
  - 用户增长率
  - 激活率
  - 留存率
  - 流失率

财务部门 KPI

盈利能力:
  - 毛利率
  - 净利润率
  - 息税折旧摊销前利润 (EBITDA)
  - 营业利润率

流动性:
  - 流动比率
  - 速动比率
  - 现金流
  - 营运资本

效率指标:
  - 人均营收
  - 营业费用率
  - 应收账款周转天数
  - 库存周转率

仪表盘布局模式

模式 1:高管摘要

┌─────────────────────────────────────────────────────────────┐
│  高管仪表盘                                  [日期范围 ▼]  │
├─────────────┬─────────────┬─────────────┬─────────────────┤
│    营收     │    利润     │   客户数    │    NPS 得分     │
│   240 万    │   45 万     │   12,450    │       72        │
│   ▲ 12%     │    ▲ 8%     │    ▲ 15%    │     ▲ 5 点     │
├─────────────┴─────────────┴─────────────┴─────────────────┤
│                                                             │
│  营收趋势                          │  按产品划分的营收      │
│  ┌───────────────────────┐       │  ┌──────────────────┐   │
│  │    /\    /\          │       │  │ ████████ 45%     │   │
│  │   /  \  /  \    /\   │       │  │ ██████   32%     │   │
│  │  /    \/    \  /  \  │       │  │ ████     18%     │   │
│  │ /            \/    \ │       │  │ ██        5%     │   │
│  └───────────────────────┘       │  └──────────────────┘   │
│                                                             │
├─────────────────────────────────────────────────────────────┤
│  🔴 告警:客户流失率超出阈值 (>5%)                            │
│  🟡 警告:支持工单量高于平均值 20%                             │
└─────────────────────────────────────────────────────────────┘

模式 2:SaaS 指标仪表盘

┌─────────────────────────────────────────────────────────────┐
│  SAAS 指标                           2024年1月 [月度 ▼]     │
├──────────────────────┬──────────────────────────────────────┤
│  ┌────────────────┐  │  MRR 增长                            │
│  │      MRR       │  │  ┌────────────────────────────────┐  │
│  │    $125,000    │  │  │                          /──   │  │
│  │     ▲ 8%       │  │  │                    /────/      │  │
│  └────────────────┘  │  │              /────/            │  │
│  ┌────────────────┐  │  │        /────/                  │  │
│  │      ARR       │  │  │   /────/                       │  │
│  │   $1,500,000   │  │  └────────────────────────────────┘  │
│  │     ▲ 15%      │  │  1  2  3  4  5  6  7  8  9 10 11 12  │
│  └────────────────┘  │                                      │
├──────────────────────┼──────────────────────────────────────┤
│  单位经济模型        │  群组留存率                           │
│                      │                                      │
│  CAC:     $450       │  第1个月: ████████████████████ 100%  │
│  LTV:     $2,700     │  第3个月: █████████████████    85%   │
│  LTV/CAC: 6.0x       │  第6个月: ████████████████     80%   │
│                      │  第12个月: ██████████████      72%   │
│  回本周期: 4个月     │                                      │
├──────────────────────┴──────────────────────────────────────┤
│  流失分析                                                   │
│  ┌──────────┬──────────┬──────────┬──────────────────────┐ │
│  │ 总流失率 │ 净流失率 │ 客户流失 │ 扩张收入              │ │
│  │ 4.2%     │ 1.8%     │ 3.1%     │ 2.4%                  │ │
│  └──────────┴──────────┴──────────┴──────────────────────┘ │
└─────────────────────────────────────────────────────────────┘

模式 3:实时运营中心

┌─────────────────────────────────────────────────────────────┐
│  运营中心                                实时 ● 上次: 10:42:15 │
├────────────────────────────┬────────────────────────────────┤
│  系统健康                  │  服务状态                        │
│  ┌──────────────────────┐  │                                │
│  │  CPU   内存   磁盘   │  │  ● API 网关        健康        │
│  │  45%    72%    58%   │  │  ● 用户服务         健康        │
│  │   ███    ████   ███  │  │  ● 支付服务         性能下降   │
│  │   ███    ████   ███  │  │  ● 数据库           健康        │
│  │   ███    ████   ███  │  │  ● 缓存             健康        │
│  └──────────────────────┘  │                                │
├────────────────────────────┼────────────────────────────────┤
│  请求吞吐量                │  错误率                          │
│  ┌──────────────────────┐  │  ┌──────────────────────────┐  │
│  │ ▁▂▃▄▅▆▇█▇▆▅▄▃▂▁▂▃▄▅ │  │  │ ▁▁▁▁▁▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁  │  │
│  └──────────────────────┘  │  └──────────────────────────┘  │
│  当前: 12,450 请求/秒      │  当前: 0.02%                     │
│  峰值: 18,200 请求/秒      │  阈值: 1.0%                      │
├────────────────────────────┴────────────────────────────────┤
│  最近告警                                                    │
│  10:40  🟡 支付服务高延迟 (p99 > 500ms)                       │
│  10:35  🟢 已解决:数据库连接池恢复                           │
│  10:22  🔴 支付服务断路器触发                                 │
└─────────────────────────────────────────────────────────────┘

实现模式

用于 KPI 计算的 SQL

-- 月度经常性收入 (MRR)
WITH mrr_calculation AS (
    SELECT
        DATE_TRUNC('month', billing_date) AS month,
        SUM(
            CASE subscription_interval
                WHEN 'monthly' THEN amount
                WHEN 'yearly' THEN amount / 12
                WHEN 'quarterly' THEN amount / 3
            END
        ) AS mrr
    FROM subscriptions
    WHERE status = 'active'
    GROUP BY DATE_TRUNC('month', billing_date)
)
SELECT
    month,
    mrr,
    LAG(mrr) OVER (ORDER BY month) AS prev_mrr,
    (mrr - LAG(mrr) OVER (ORDER BY month)) / LAG(mrr) OVER (ORDER BY month) * 100 AS growth_pct
FROM mrr_calculation;

-- 群组留存率
WITH cohorts AS (
    SELECT
        user_id,
        DATE_TRUNC('month', created_at) AS cohort_month
    FROM users
),
activity AS (
    SELECT
        user_id,
        DATE_TRUNC('month', event_date) AS activity_month
    FROM user_events
    WHERE event_type = 'active_session'
)
SELECT
    c.cohort_month,
    EXTRACT(MONTH FROM age(a.activity_month, c.cohort_month)) AS months_since_signup,
    COUNT(DISTINCT a.user_id) AS active_users,
    COUNT(DISTINCT a.user_id)::FLOAT / COUNT(DISTINCT c.user_id) * 100 AS retention_rate
FROM cohorts c
LEFT JOIN activity a ON c.user_id = a.user_id
    AND a.activity_month >= c.cohort_month
GROUP BY c.cohort_month, EXTRACT(MONTH FROM age(a.activity_month, c.cohort_month))
ORDER BY c.cohort_month, months_since_signup;

-- 客户获取成本 (CAC)
SELECT
    DATE_TRUNC('month', acquired_date) AS month,
    SUM(marketing_spend) / NULLIF(COUNT(new_customers), 0) AS cac,
    SUM(marketing_spend) AS total_spend,
    COUNT(new_customers) AS customers_acquired
FROM (
    SELECT
        DATE_TRUNC('month', u.created_at) AS acquired_date,
        u.id AS new_customers,
        m.spend AS marketing_spend
    FROM users u
    JOIN marketing_spend m ON DATE_TRUNC('month', u.created_at) = m.month
    WHERE u.source = 'marketing'
) acquisition
GROUP BY DATE_TRUNC('month', acquired_date);

Python 仪表盘代码 (Streamlit)

import streamlit as st
import pandas as pd
import plotly.express as px
import plotly.graph_objects as go

st.set_page_config(page_title="KPI 仪表盘", layout="wide")

# 带有日期筛选器的头部
col1, col2 = st.columns([3, 1])
with col1:
    st.title("高管仪表盘")
with col2:
    date_range = st.selectbox(
        "时间段",
        ["过去7天", "过去30天", "上季度", "年初至今"]
    )

# KPI 卡片
def metric_card(label, value, delta, prefix="", suffix=""):
    delta_color = "green" if delta >= 0 else "red"
    delta_arrow = "▲" if delta >= 0 else "▼"
    st.metric(
        label=label,
        value=f"{prefix}{value:,.0f}{suffix}",
        delta=f"{delta_arrow} {abs(delta):.1f}%"
    )

col1, col2, col3, col4 = st.columns(4)
with col1:
    metric_card("营收", 2400000, 12.5, prefix="$")
with col2:
    metric_card("客户数", 12450, 15.2)
with col3:
    metric_card("NPS 得分", 72, 5.0)
with col4:
    metric_card("流失率", 4.2, -0.8, suffix="%")

# 图表
col1, col2 = st.columns(2)

with col1:
    st.subheader("营收趋势")
    revenue_data = pd.DataFrame({
        '月份': pd.date_range('2024-01-01', periods=12, freq='M'),
        '营收': [180000, 195000, 210000, 225000, 240000, 255000,
                    270000, 285000, 300000, 315000, 330000, 345000]
    })
    fig = px.line(revenue_data, x='月份', y='营收',
                  line_shape='spline', markers=True)
    fig.update_layout(height=300)
    st.plotly_chart(fig, use_container_width=True)

with col2:
    st.subheader("按产品划分的营收")
    product_data = pd.DataFrame({
        '产品': ['企业版', '专业版', '入门版', '其他'],
        '营收占比': [45, 32, 18, 5]
    })
    fig = px.pie(product_data, values='营收占比', names='产品',
                 hole=0.4)
    fig.update_layout(height=300)
    st.plotly_chart(fig, use_container_width=True)

# 群组留存热图
st.subheader("群组留存率")
cohort_data = pd.DataFrame({
    '群组': ['一月', '二月', '三月', '四月', '五月'],
    'M0': [100, 100, 100, 100, 100],
    'M1': [85, 87, 84, 86, 88],
    'M2': [78, 80, 76, 79, None],
    'M3': [72, 74, 70, None, None],
    'M4': [68, 70, None, None, None],
})
fig = go.Figure(data=go.Heatmap(
    z=cohort_data.iloc[:, 1:].values,
    x=['当月', '1月后', '2月后', '3月后', '4月后'],
    y=cohort_data['群组'],
    colorscale='Blues',
    text=cohort_data.iloc[:, 1:].values,
    texttemplate='%{text}%',
    textfont={"size": 12},
))
fig.update_layout(height=250)
st.plotly_chart(fig, use_container_width=True)

# 告警区域
st.subheader("告警")
alerts = [
    {"level": "error", "message": "客户流失率超出阈值 (>5%)"},
    {"level": "warning", "message": "支持工单量高于平均值 20%"},
]
for alert in alerts:
    if alert["level"] == "error":
        st.error(f"🔴 {alert['message']}")
    elif alert["level"] == "warning":
        st.warning(f"🟡 {alert['message']}")

最佳实践

应该做的

  • 限制在 5-7 个 KPI – 专注于重要事项
  • 展示上下文 – 比较、趋势、目标
  • 使用一致的颜色 – 红色=差,绿色=好
  • 支持数据下钻 – 从摘要到细节
  • 适时更新 – 匹配指标的更新频率

避免做的

  • 不要展示虚荣指标 – 专注于可操作的数据
  • 不要过度拥挤 – 留白有助于理解
  • 不要使用 3D 图表 – 它们会扭曲感知
  • 不要隐藏计算方法 – 记录清楚计算逻辑
  • 不要忽视移动端 – 确保响应式设计

📄 原始文档

完整文档(英文):

https://skills.sh/wshobson/agents/kpi-dashboard-design

💡 提示:点击上方链接查看 skills.sh 原始英文文档,方便对照翻译。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。