文章目录
- 1. 商业分析
- 2. 四种类型
- 2.1 描述性分析和诊断性分析
- 2.1.1 加载Global_Superstore数据集
- 2.1.2 描述性分析
- 2.1.3 诊断性分析
- 2.1.4 再进一步
- 各地区的订单数量和平均订单金额
- 按客户群体分析销售额和利润
- 折扣率和利润
- 产品类别和子类别的销售和利润
- 本小节小结
- 2.2 销售预测
- 2.2.1 步骤
- 2.2.2 分析
- 2.3 规范性分析
1. 商业分析
利用数据优化业务流程,用以提升绩效并支持数据驱动决策的过程。
2. 四种类型
- 描述性分析 Descriptive Analysis,总结和描述当前状态(例如销售额、平均订单量)
- 诊断性分析 Diagnostic Analysis,分析问题(例如特定地区的销售下滑)
- 预测性分析 Predictive Analysis,预测未来趋势(例如未来销售额)
- 规范性分析 Prescriptive Analysis,提供建议(例如定价策略)
2.1 描述性分析和诊断性分析
2.1.1 加载Global_Superstore数据集
我们仍旧使用这个数据集,数分基础(01)示例数据集Global_Superstore
加载数据集
import pandas as pdfile_path = "Global_Superstore2.xlsx"
excel_data = pd.ExcelFile(file_path)excel_data.sheet_namesdata = pd.read_excel(file_path, sheet_name='Sheet1')
data.head()
2.1.2 描述性分析
用数据总结和描述当前的状况,回答“发生了什么”。业务报告、仪表盘、绩效监控等。常见于日常的运营分析和月度、季度报告中。
计算总销售额
销售额字段求和,获取公司整体的销售情况。直观反映公司的业务规模和市场表现。
计算平均订单金额
总销售额除以订单数量,得出平均每笔订单的金额。反映客户的平均消费水平。
比较不同产品类别的表现
分组计算各产品类别的销售额和利润率,以识别哪些类别产品销售表现突出,哪些类别产品利润贡献较大。以便制定更有针对性的产品策略。
total_sales = data['Sales'].sum()
print(f"总销售额: {total_sales}")average_order_value = data['Sales'].mean()
print(f"平均订单金额: {average_order_value}")category_performance = data.groupby('Category')[['Sales', 'Profit']].sum().reset_index()
print(category_performance)
可以从中看出哪些产品或服务是销售的主力
2.1.3 诊断性分析
回答“为什么”的问题,帮助识别薄弱环节,并提出问题的解决方向。多用于客户反馈分析、损益分析等。
例如,找出销售低迷的区域,并分析
识别低绩效区域
按地区分组计算销售额和利润率,定位销售表现不佳的区域,便于进一步分析
对比高绩效区域
通过对比高绩效区域和低绩效区域的数据,直观发现两者之间的差异,为后续的原因分析提供线索
分析潜在原因
检查影响销售的因素,如折扣率、物流模式等,找出可能导致低销售或低利润的原因。例如,某些区域的运输方式可能导致成本上升,从而影响利润。
# 计算每个地区的销售额和利润总和,结果按地区分组显示
# 对 'Sales' 和 'Profit' 列求和,并重置索引以便于阅读
regional_performance = data.groupby('Region')[['Sales', 'Profit']].sum().reset_index()# 设置显示选项,避免使用科学计数法显示数值
pd.set_option('display.float_format', '{:.2f}'.format)# 筛选出利润为负的地区,这些地区表现较差,可能存在问题
low_performance = regional_performance[regional_performance['Profit'] < 0]
# 打印低绩效地区的数据
print("低绩效地区:")
print(low_performance)# 筛选出利润为正的地区,这些地区表现较好
high_performance = regional_performance[regional_performance['Profit'] > 0]
# 打印高绩效地区的数据
print("\n高绩效地区:")
print(high_performance)# 对低绩效区域进行进一步分析,根据运输模式分组,计算各运输模式的销售额
# 这里通过使用 isin() 函数过滤出低绩效地区的数据,并按地区和运输模式分组
potential_issues = data[data['Region'].isin(low_performance['Region'])].groupby(['Region', 'Ship Mode'])['Sales'].sum().reset_index()
# 打印低绩效区域不同运输模式下的销售额,以分析可能的原因
print("\n低绩效地区的运输模式销售情况:")
print(potential_issues)
低绩效地区
输出结果为空,即没有任何地区的利润为负。即所有地区的销售额都产生了正利润。表明公司在各个地区的业务整体上是盈利的。
高绩效地区。销售额最高的地区是 Central(中部),而销售额相对较低的加拿大和东南亚也实现了一定的利润率。
由于数据集中没有低绩效地区,因此在按运输模式分析低绩效区域的销售情况时,也没有对应的数据输出。
表明公司各区域的运营策略和市场表现整体较为健康。
2.1.4 再进一步
各地区的订单数量和平均订单金额
# 计算各地区的订单数量和平均订单金额
order_counts = data.groupby('Region')['Order ID'].nunique().reset_index().rename(columns={'Order ID': 'Order Count'})
average_order_value = data.groupby('Region')['Sales'].mean().reset_index().rename(columns={'Sales': 'Avg Order Value'})# 合并并查看结果
regional_orders = pd.merge(order_counts, average_order_value, on='Region')
print(regional_orders)
Central 地区的订单数量最多,说明这个地区的客户活跃度最高。
Central Asia 和 North Asia 的平均订单金额较高,说明这些地区的每笔订单价值较大,销售的多为高价产品
按客户群体分析销售额和利润
# 按客户群体分析销售额和利润
segment_performance = data.groupby('Segment')[['Sales', 'Profit']].sum().reset_index()
print(segment_performance)
从结果中可以看出来,Consumer 是最大的销售和利润来源,大众消费者是企业的主要市场。公司客户和家庭办公室的销售额和利润明显低于这个群体。
折扣率和利润
# 折扣率和利润之间的关系
discount_impact = data.groupby('Discount')[['Sales', 'Profit']].mean().reset_index()
print(discount_impact)
随着折扣率的增加,利润逐渐变为负值,尤其是折扣率超过 0.3 后,大部分的利润都出现了亏损。这说明高折扣策略虽然提升了销售额,但压缩了利润,甚至导致亏损。因此,应谨慎使用高折扣,在销售增长与利润之间的关系平衡上要权衡。
产品类别和子类别的销售和利润
# 按产品类别和子类别分析
category_subcategory = data.groupby(['Category', 'Sub-Category'])[['Sales', 'Profit']].sum().reset_index()
print(category_subcategory)
家具类(Furniture) 中,Tables 子类别出现了较大的亏损,说明这个产品可能存在问题(如高成本、低需求或高折扣)。
技术类(Technology) 的 Copiers 是高利润的产品,市场表现优异。
整体来看,不同类别的产品利润差异较大,应聚焦高利润产品,优化低利润或亏损产品的运营策略
本小节小结
- 各地区、客户群体、产品类别的销售和利润情况,能够反映主要贡献者和问题所在
- 折扣策略对利润的负面影响较大,应当平衡折扣和利润
- 细分分析可以看出来高利润和低利润产品
- 其他,例如,可以按照地区和客户群体表现分析,分析每个区域的客户群体的表现,有助于了解不同区域的市场需求差异;可以进一步寻找高折扣但仍然营利的产品组合,优化折扣策略等。
2.2 销售预测
预测性分析,基于历史销售数据预测未来的销售额趋势
2.2.1 步骤
提取销售日期和销售额,按时间顺序排序
构建时间序列模型,使用历史销售数据构建时间序列模型
使用模型预测未来几个月的销售额
import pandas as pd
import numpy as np
from statsmodels.tsa.holtwinters import ExponentialSmoothing
import matplotlib.pyplot as plt
from scipy.ndimage import uniform_filter1d# 设置中文字体支持
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False# 解析日期并确保日期格式正确
data['Order Date'] = pd.to_datetime(data['Order Date'], dayfirst=True)
# 按日期汇总销售数据,得到时间序列
sales_time_series = data.groupby('Order Date')['Sales'].sum().reset_index()# 数据预处理:平滑数据并进行对数变换,减少波动
# 平滑处理:使用均值平滑来减少数据中的极端波动
sales_time_series['Sales_Smoothed'] = uniform_filter1d(sales_time_series['Sales'], size=3)
# 平滑销售数据,减少极端值和噪声对模型的影响,使用窗口大小为3的滑动均值sales_time_series['Sales_Smoothed'] = sales_time_series['Sales_Smoothed'].clip(lower=1) # 确保最小值为1
# 将平滑后的销售数据最小值设为1,使得对数变换不产生负无穷sales_time_series['Sales_Log'] = np.log(sales_time_series['Sales_Smoothed'])
# 平滑后的销售数据取对数,使得模型更容易你和趋势和季节性变化# 构建并拟合时间序列模型
# 使用较简单的趋势和季节性设置,减少数值波动带来的影响
model = ExponentialSmoothing(sales_time_series['Sales_Log'], trend='add', seasonal='add', seasonal_periods=12,use_boxcox=False, initialization_method='estimated'
)# 拟合模型
model_fit = model.fit(remove_bias=True)# 预测未来12个月的销售额
forecast_log = model_fit.forecast(12)# 将预测值从对数变换还原为实际值
forecast = np.exp(forecast_log)# 绘制历史销售额和预测值
plt.figure(figsize=(12, 6))
plt.plot(sales_time_series['Order Date'], sales_time_series['Sales'], label='历史销售额')
plt.plot(pd.date_range(sales_time_series['Order Date'].max(), periods=12, freq='ME'), forecast, label='预测销售额', linestyle='--')
plt.xlabel('日期')
plt.ylabel('销售额')
plt.title('销售额预测')
plt.legend()
plt.show()
2.2.2 分析
实线代表实际的历史销售数据,销售随时间的真实表现,包括季节性模式。显示2011-2015年期间,波动上升,存在高峰和低谷,可能与季节性因素、市场促销等想相关。虽然销售额整体上升,波动较为剧烈,每年的销售高峰和低谷期并不完全一致,季节性特征受到短期因素的影响
虚线代表未来12个月的销售预测值,显示了未来可能的走势比较稳定,有略微下降,模型认为上升趋势趋于平稳,可能由于处理历史季节性数据选择了平滑的加法模式,显示为平稳的预测线,季节性捕捉不足,也需要在模型中优化对季节性因素的识别,另一方面,应当对于可能的略微下降,保持警惕,如调整运营策略、优化产品组合等。
2.3 规范性分析
结合预测性分析,提供建议。假设,预测性分析显示未来销售平稳(假如模型已经调整过了,仍然是平稳的),那么可以减少因过度波动导致的库存压力,进行库存和定价优化。
假设我们要寻找定价策略,同时考虑库存成本和时长需求,最大化企业利润。
首先,需要获取产品的销售量、价格、成本等信息
其次,构建模型,假设用线性规划模型,定义目标函数(如利润),设定约束条件(例如库存水平、市场需求)
第三,求解优化问题,求出库存和定价
通过线性规划(Linear Programming)进行定价和库存优化的示例代码(和示例数据集无关)
import pandas as pd
from scipy.optimize import linprog# 假设数据集中有以下信息:价格、成本、需求量(数据为示例)
# 可以从数据集中筛选或假设这些信息
prices = [20, 25, 30] # 产品的三个定价选项
costs = [10, 12, 15] # 对应的产品成本
demand = [100, 80, 60] # 不同定价下的市场需求量# 定义目标函数:利润 = (价格 - 成本) * 需求
profit_coefficients = [(price - cost) for price, cost in zip(prices, costs)]
# 定义约束:库存数量
A = [[1, 1, 1]] # 约束系数矩阵,表示每个产品的需求消耗库存
b = [150] # 约束条件,总库存量# 使用线性规划求解最大利润问题
# 将 method 修改为 'highs',以使用更新的求解器
result = linprog(c=-1 * pd.Series(profit_coefficients), A_ub=A, b_ub=b, method='highs')# 输出最优解
optimal_prices = [prices[i] for i, x in enumerate(result.x) if x > 0]
optimal_profit = -result.fun
print(f"最优定价策略: {optimal_prices}")
print(f"预计最大利润: {optimal_profit}")