本文来源于数据从业者全栈知识库,更多体系化内容请访问知识库。
一、BI基础概念类
1. 什么是商业智能(BI)?它的核心价值是什么?
标准答案: 商业智能(Business Intelligence,BI)是一套完整的解决方案,用于收集、整合、分析和展示企业数据,帮助管理层做出更明智的商业决策。
核心价值:
- 数据驱动决策:将数据转化为洞察,支撑业务决策
- 提升运营效率:通过数据分析发现运营瓶颈和优化点
- 降低成本:通过数据分析优化资源配置
- 增强竞争优势:快速响应市场变化,抓住商业机会
深入解答:
BI系统的典型架构:数据源 → ETL → 数据仓库 → OLAP → 报表/仪表板2. OLTP和OLAP的区别是什么?
标准答案:
| 特性 | OLTP | OLAP |
|---|---|---|
| 用途 | 联机事务处理 | 联机分析处理 |
| 数据特点 | 实时、详细、当前数据 | 历史、汇总、多维数据 |
| 操作类型 | 增删改查,事务性 | 查询、分析、聚合 |
| 响应时间 | 毫秒级 | 秒级到分钟级 |
| 数据量 | 相对较小 | 大量历史数据 |
| 并发用户 | 成千上万 | 几十到几百 |
| 数据结构 | 规范化 | 维度建模(星型/雪花) |
实际应用举例:
- 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])END3. 应用到视图
- 将计算字段拖拽到行或列
- 显示参数控件供用户选择
- 测试参数切换效果
高级参数应用:
// 动态时间范围参数IF [Order Date] >= [开始日期参数] AND [Order Date] <= [结束日期参数]THEN [Sales]END
// 动态Top N参数IF [Product Rank] <= [Top N参数]THEN [Product Name]END6. 如何在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. 具体实现方案
-- 核心销售指标SQLWITH 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_rateFROM current_year cJOIN previous_year p ON c.month_num = p.month_numORDER 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 pdimport 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 fig9. 如何进行客户细分分析?
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 '重要发展客户' 本文作者:Elazer (石头)
原文链接:https://ss-data.cc/posts/kb-interview-bi-analyst
版权声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
未在播放
0:00 0:00