跳到正文

更多文章

影响力日常操作系统:21天习惯养成计划 从技能雇佣者到价值创造者 互惠账户的运营 影响力的三层架构 组织的注意力经济学
BI分析师高频面试真题

本文来源于数据从业者全栈知识库,更多体系化内容请访问知识库。

一、BI基础概念类

1. 什么是商业智能(BI)?它的核心价值是什么?

标准答案: 商业智能(Business Intelligence,BI)是一套完整的解决方案,用于收集、整合、分析和展示企业数据,帮助管理层做出更明智的商业决策。

核心价值:

  • 数据驱动决策:将数据转化为洞察,支撑业务决策
  • 提升运营效率:通过数据分析发现运营瓶颈和优化点
  • 降低成本:通过数据分析优化资源配置
  • 增强竞争优势:快速响应市场变化,抓住商业机会

深入解答:

BI系统的典型架构:
数据源 → ETL → 数据仓库 → OLAP → 报表/仪表板

2. OLTP和OLAP的区别是什么?

标准答案:

特性OLTPOLAP
用途联机事务处理联机分析处理
数据特点实时、详细、当前数据历史、汇总、多维数据
操作类型增删改查,事务性查询、分析、聚合
响应时间毫秒级秒级到分钟级
数据量相对较小大量历史数据
并发用户成千上万几十到几百
数据结构规范化维度建模(星型/雪花)

实际应用举例:

  • OLTP:电商下单系统、银行转账系统
  • OLAP:销售分析报表、财务分析仪表板

3. 什么是维度建模?星型模型和雪花模型的区别?

维度建模基础概念: 维度建模是专门为数据仓库和BI系统设计的建模方法,核心思想是将数据分为事实和维度两类。

事实表 vs 维度表:

  • 事实表:存储业务过程的度量值(如销售额、数量)
  • 维度表:存储分析的角度和上下文(如时间、地点、产品)

星型模型 vs 雪花模型:

特性星型模型雪花模型
结构维度表直接连接事实表维度表规范化,多层结构
存储空间较大(冗余)较小(规范化)
查询性能快(JOIN少)相对慢(JOIN多)
维护复杂度简单复杂
可理解性相对复杂

实际建模示例:

-- 星型模型示例
-- 事实表:销售事实
CREATE TABLE fact_sales (
date_key INT,
product_key INT,
customer_key INT,
store_key INT,
sales_amount DECIMAL(10,2),
quantity INT
);
-- 维度表:产品维度
CREATE TABLE dim_product (
product_key INT PRIMARY KEY,
product_name VARCHAR(100),
category VARCHAR(50),
brand VARCHAR(50),
price DECIMAL(8,2)
);

二、BI工具使用类

4. 你熟悉哪些BI工具?它们的优缺点对比?

主流BI工具对比:

工具优点缺点适用场景
Tableau可视化强大、交互性好价格昂贵、学习成本高大型企业、复杂分析
Power BI与Office集成好、成本低功能相对有限中小企业、Office环境
FineReport中国化程度高、报表强可视化相对弱传统企业、报表需求
QlikView/Sense内存计算快、关联分析强学习曲线陡峭快速分析、探索性分析
Apache Superset开源免费、可定制需要技术维护技术型团队、成本敏感

深入分析Tableau特色功能:

Tableau核心优势:
1. 拖拽式界面:快速创建可视化
2. 数据连接:支持100+种数据源
3. 计算字段:内置函数和自定义计算
4. 参数控制:动态筛选和交互
5. 地图功能:内置地理信息可视化

5. 在Tableau中如何创建参数化报表?

参数化报表创建步骤:

1. 创建参数

右键点击参数 → 创建参数
- 名称:选择度量
- 数据类型:字符串
- 当前值:销售额
- 值列表:销售额、利润、数量

2. 创建计算字段

// 参数化度量计算字段
CASE [选择度量]
WHEN "销售额" THEN SUM([Sales])
WHEN "利润" THEN SUM([Profit])
WHEN "数量" THEN SUM([Quantity])
END

3. 应用到视图

  • 将计算字段拖拽到行或列
  • 显示参数控件供用户选择
  • 测试参数切换效果

高级参数应用:

// 动态时间范围参数
IF [Order Date] >= [开始日期参数]
AND [Order Date] <= [结束日期参数]
THEN [Sales]
END
// 动态Top N参数
IF [Product Rank] <= [Top N参数]
THEN [Product Name]
END

6. 如何在Power BI中创建DAX计算?

DAX(Data Analysis Expressions)基础语法:

1. 基础聚合函数

-- 总销售额
总销售额 = SUM(Sales[Amount])
-- 平均订单价值
平均订单价值 = AVERAGE(Sales[Amount])
-- 订单数量
订单数量 = COUNTROWS(Sales)

2. 时间智能函数

-- 去年同期销售额
去年销售额 = CALCULATE(
SUM(Sales[Amount]),
SAMEPERIODLASTYEAR(Calendar[Date])
)
-- 同比增长率
同比增长率 =
DIVIDE(
[总销售额] - [去年销售额],
[去年销售额]
)
-- 累计销售额
累计销售额 = CALCULATE(
SUM(Sales[Amount]),
DATESYTD(Calendar[Date])
)

3. 筛选和上下文函数

-- 指定产品类别销售额
电子产品销售额 = CALCULATE(
SUM(Sales[Amount]),
Products[Category] = "Electronics"
)
-- 排名计算
产品销售排名 = RANKX(
ALL(Products[ProductName]),
[总销售额],
,DESC
)

三、数据分析与建模类

7. 如何设计一个销售分析仪表板?

仪表板设计方法论:

1. 需求分析阶段

业务问题识别:
- 销售目标完成情况如何?
- 哪些产品/区域表现最好?
- 销售趋势是什么?
- 销售团队绩效如何?

2. 指标体系设计

一级指标(核心KPI):
- 总销售额
- 销售增长率
- 目标完成率
- 客户获取成本
二级指标(细分分析):
- 按产品类别销售额
- 按区域销售分布
- 按时间销售趋势
- 销售人员排名

3. 仪表板布局设计

经典布局结构:

区域占比内容
核心KPI卡片区顶部 25%总销售额、订单数、客户数等核心指标卡
趋势图(左)/ 排名图(右)中部 50%按时间销售趋势(左50%)/ 销售人员排名(右50%)
明细表格区底部 25%详细数据支撑表格

4. 具体实现方案

-- 核心销售指标SQL
WITH sales_kpi AS (
SELECT
SUM(amount) as total_sales,
COUNT(DISTINCT order_id) as order_count,
COUNT(DISTINCT customer_id) as customer_count,
AVG(amount) as avg_order_value
FROM sales_fact
WHERE date_key BETWEEN 20240101 AND 20241231
),
target_comparison AS (
SELECT
s.total_sales,
t.target_amount,
(s.total_sales / t.target_amount) * 100 as completion_rate
FROM sales_kpi s
CROSS JOIN (SELECT 10000000 as target_amount) t
)
SELECT * FROM target_comparison;

8. 如何进行同期对比分析?

同期对比分析方法:

1. 同比分析(Year-over-Year)

-- 月度同比分析
WITH current_year AS (
SELECT
EXTRACT(MONTH FROM order_date) as month_num,
SUM(amount) as current_sales
FROM sales_fact
WHERE EXTRACT(YEAR FROM order_date) = 2024
GROUP BY EXTRACT(MONTH FROM order_date)
),
previous_year AS (
SELECT
EXTRACT(MONTH FROM order_date) as month_num,
SUM(amount) as previous_sales
FROM sales_fact
WHERE EXTRACT(YEAR FROM order_date) = 2023
GROUP BY EXTRACT(MONTH FROM order_date)
)
SELECT
c.month_num,
c.current_sales,
p.previous_sales,
(c.current_sales - p.previous_sales) as absolute_change,
((c.current_sales - p.previous_sales) / p.previous_sales) * 100 as growth_rate
FROM current_year c
JOIN previous_year p ON c.month_num = p.month_num
ORDER BY c.month_num;

2. 环比分析(Month-over-Month)

-- 环比增长分析
WITH monthly_sales AS (
SELECT
DATE_TRUNC('month', order_date) as month_date,
SUM(amount) as monthly_sales
FROM sales_fact
GROUP BY DATE_TRUNC('month', order_date)
),
mom_analysis AS (
SELECT
month_date,
monthly_sales,
LAG(monthly_sales, 1) OVER (ORDER BY month_date) as previous_month_sales,
((monthly_sales - LAG(monthly_sales, 1) OVER (ORDER BY month_date))
/ LAG(monthly_sales, 1) OVER (ORDER BY month_date)) * 100 as mom_growth_rate
FROM monthly_sales
)
SELECT * FROM mom_analysis ORDER BY month_date;

3. 可视化实现

import pandas as pd
import matplotlib.pyplot as plt
# 同比对比图表
def create_yoy_chart(data):
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 8))
# 销售额对比
ax1.plot(data['month'], data['current_year'], label='2024年', marker='o')
ax1.plot(data['month'], data['previous_year'], label='2023年', marker='s')
ax1.set_title('月度销售额同比对比')
ax1.set_ylabel('销售额(万元)')
ax1.legend()
ax1.grid(True)
# 增长率
ax2.bar(data['month'], data['growth_rate'],
color=['green' if x > 0 else 'red' for x in data['growth_rate']])
ax2.set_title('同比增长率')
ax2.set_ylabel('增长率(%)')
ax2.axhline(y=0, color='black', linestyle='-', linewidth=0.5)
plt.tight_layout()
return fig

9. 如何进行客户细分分析?

RFM客户细分模型:

1. RFM指标定义

  • R (Recency):最近一次消费距今天数
  • F (Frequency):消费频次
  • M (Monetary):消费金额

2. SQL实现

-- RFM分析计算
WITH customer_rfm AS (
SELECT
customer_id,
-- R: 距离最后购买天数
DATEDIFF(CURRENT_DATE, MAX(order_date)) as recency,
-- F: 购买频次
COUNT(DISTINCT order_id) as frequency,
-- M: 总消费金额
SUM(amount) as monetary
FROM sales_fact
WHERE order_date >= DATE_SUB(CURRENT_DATE, INTERVAL 2 YEAR)
GROUP BY customer_id
),
rfm_scores AS (
SELECT
customer_id,
recency,
frequency,
monetary,
-- RFM分数计算(1-5分)
CASE
WHEN recency <= 30 THEN 5
WHEN recency <= 60 THEN 4
WHEN recency <= 90 THEN 3
WHEN recency <= 180 THEN 2
ELSE 1
END as r_score,
CASE
WHEN frequency >= 20 THEN 5
WHEN frequency >= 10 THEN 4
WHEN frequency >= 5 THEN 3
WHEN frequency >= 2 THEN 2
ELSE 1
END as f_score,
CASE
WHEN monetary >= 10000 THEN 5
WHEN monetary >= 5000 THEN 4
WHEN monetary >= 2000 THEN 3
WHEN monetary >= 500 THEN 2
ELSE 1
END as m_score
FROM customer_rfm
)
SELECT
customer_id,
CONCAT(r_score, f_score, m_score) as rfm_segment,
CASE
WHEN r_score >= 4 AND f_score >= 4 AND m_score >= 4 THEN '重要价值客户'
WHEN r_score >= 4 AND f_score >= 2 AND m_score >= 2 THEN '重要发展客户'

PRO 会员专属

本文为 PRO 会员专属内容,成为会员即可阅读全文。

PRO ¥199/年 · Pro 专属文章 + 2300+ 知识文档 + 会员社群

Elazer (石头)
Elazer (石头)

11 年数据老兵,从分析师到架构专家。用真实经历帮数据人少走弯路。

加入免费社群

和数据从业者一起交流成长

了解详情 →

成为会员

解锁全部内容 + 知识库

查看权益 →
← 上一篇 数据科学家高频面试真题精讲 下一篇 → 与光同尘