设计有效的 KPI 仪表板,包括指标选择、可视化最佳实践和实时监控模式。在构建业务仪表板、选择指标或设计数据可视化布局时使用。
KPI 仪表板设计是一项面向实际任务的技能,主要用于用于设计有效的关键绩效指标(KPI)仪表板以驱动业务决策的全面模式;何时不使用此技能;
应用相关最佳实践并验证结果;提供可操作的步骤和验证方法;如需详细示例,请打开 resources/implementation-playbook.md;何时使用此技能;设计管理层仪表。
它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。
用于设计有效的关键绩效指标(KPI)仪表板以驱动业务决策的全面模式。
resources/implementation-playbook.md。| 层级 | 关注点 | 更新频率 | 受众 |
|---|---|---|---|
| 战略层 | 长期目标 | 每月/每季度 | 管理层 |
| 战术层 | 部门目标 | 每周/每月 | 管理人员 |
| 运营层 | 日常运营 | 实时/每日 | 团队 |
Specific(具体的):明确定义 Measurable(可衡量的):可量化 Achievable(可实现的):切合实际的目标 Relevant(相关的):与目标一致 Time-bound(有时限的):定义时间段
├── 执行摘要(1 页)
│ ├── 4-6 个核心 KPI
│ ├── 趋势指标
│ └── 关键告警
├── 部门视图
│ ├── 销售仪表板
│ ├── 营销仪表板
│ ├── 运营仪表板
│ └── 财务仪表板
└── 详细下钻
├── 单个指标
└── 根因分析
收入指标: - 月度经常性收入(MRR) - 年度经常性收入(ARR) - 每用户平均收入(ARPU) - 收入增长率 管道指标: - 销售管道价值 - 赢单率 - 平均交易规模 - 销售周期长度 活动指标: - 每名代表的通话/邮件数 - 已安排的演示 - 已发送的方案 - 成交率
获客: - 每次获取成本(CPA) - 客户获取成本(CAC) - 线索数量 - 营销合格线索(MQL) 参与度: - 网站流量 - 转化率 - 邮件打开/点击率 - 社交参与度 ROI: - 营销 ROI - 活动绩效 - 渠道归因 - CAC 回收期
使用情况: - 日/月活跃用户(DAU/MAU) - 会话时长 - 功能采用率 - 用户粘性(DAU/MAU) 质量: - 净推荐值(NPS) - 客户满意度(CSAT) - Bug/问题数量 - 解决时长 增长: - 用户增长率 - 激活率 - 留存率 - 流失率
盈利能力: - 毛利率 - 净利润率 - EBITDA - 营业利润率 流动性: - 流动比率 - 速动比率 - 现金流 - 营运资金 效率: - 每名员工收入 - 营业费用率 - 应收账款周转天数 - 库存周转率
┌─────────────────────────────────────────────────────────────┐ │ 管理仪表板 [日期范围 ▼] │ ├─────────────┬─────────────┬─────────────┬─────────────────┤ │ 收入 │ 利润 │ 客户数 │ NPS 分数 │ │ $2.4M │ $450K │ 12,450 │ 72 │ │ ▲ 12% │ ▲ 8% │ ▲ 15% │ ▲ 5pts │ ├─────────────┴─────────────┴─────────────┴─────────────────┤ │ │ │ 收入趋势 │ 按产品划分的收入 │ │ ┌───────────────────────┐ │ ┌──────────────────┐ │ │ │ / / │ │ │ ████████ 45% │ │ │ │ / / / │ │ │ ██████ 32% │ │ │ │ / / / │ │ │ ████ 18% │ │ │ │ / / │ │ │ ██ 5% │ │ │ └───────────────────────┘ │ └──────────────────┘ │ │ │ ├─────────────────────────────────────────────────────────────┤ │ 🔴 告警:流失率超过阈值(>5%) │ │ 🟡 警告:支持工单量比平均值高 20% │ └─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐ │ 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% │ │ │ └──────────┴──────────┴──────────┴──────────────────────┘ │ └─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐ │ 运营中心 ● 实时 上次:10:42:15 │ ├────────────────────────────┬────────────────────────────────┤ │ 系统健康 │ 服务状态 │ │ ┌──────────────────────┐ │ │ │ │ CPU MEM DISK │ │ ● API 网关 健康 │ │ │ 45% 72% 58% │ │ ● 用户服务 健康 │ │ │ ███ ████ ███ │ │ ● 支付服务 降级 │ │ │ ███ ████ ███ │ │ ● 数据库 健康 │ │ │ ███ ████ ███ │ │ ● 缓存 健康 │ │ └──────────────────────┘ │ │ ├────────────────────────────┼────────────────────────────────┤ │ 请求吞吐量 │ 错误率 │ │ ┌──────────────────────┐ │ ┌──────────────────────────┐ │ │ │ ▁▂▃▄▅▆▇█▇▆▅▄▃▂▁▂▃▄▅ │ │ │ ▁▁▁▁▁▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁ │ │ │ └──────────────────────┘ │ └──────────────────────────┘ │ │ 当前:12,450 req/s │ 当前:0.02% │ │ 峰值:18,200 req/s │ 阈值:1.0% │ ├────────────────────────────┴────────────────────────────────┤ │ 最近告警 │ │ 10:40 🟡 支付服务高延迟(p99 > 500ms) │ │ 10:35 🟢 已解决:数据库连接池已恢复 │ │ 10:22 🔴 支付服务断路器跳闸 │ └─────────────────────────────────────────────────────────────┘
-- 月度经常性收入(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);
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({
'群组': ['1月', '2月', '3月', '4月', '5月'],
'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=['M0', 'M1', 'M2', 'M3', 'M4'],
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']}")
相关专题
热门下载
相关下载
精品课程
共6课时 | 54.7万人学习
共89课时 | 134.1万人学习
共49课时 | 82.6万人学习
最新文章