一、引言
利用 Python 及 pandas 库对商品销售明细表进行分析,并实现从表格到图表的可视化,展示工具在商业分析中的便捷性与灵活性。
二、数据预处理
拿到数据后先进行基础清理。虽然 Excel 能直接打开 xlsx 文件,但为了后续自动化处理,我们直接在 Python 中加载数据集。
这是一个包含 40514 行、12 列的数据集。我们先查看基本信息,包括行列数、数据类型及空值情况:
import pandas as pd
df = pd.read_excel('销售明细表.xlsx')
print(df.info())
由于数据集中涉及成本、销售额和数量等数值字段,我们需要检查是否存在异常值(如小于 0 的情况):
errorcb = df[df.loc[:, '成本额'] < 0]
errorsl = df[df.loc[:, '销售额'] < 0]
errorxse = df[df.loc[:, '销售成本'] < 0]
print(f'成本额异常值有{errorcb.shape[0]}条,分别在第{errorcb.index.tolist()}行')
print(f'销售额异常值有{errorsl.shape[0]}条,分别在第{errorsl.index.tolist()}行')
print(f'销售成本异常值有{errorxse.shape[0]}条,分别在第{errorxse.index.tolist()}行')
检查结果显示一切正常,可以进行下一步。注意到数据集中只有销售额和成本额,缺少毛利额,我们可以直接增加这一列:
df.loc[:, '毛利额'] = df.loc[:, '销售额'] - df.loc[:, '成本额']
df.to_excel('销售明细表_清洗后.xlsx', index=False)
添加完成后,即可正式开始分析。
三、数据分析
3.1 热销商品分析
首先对商品的销售情况进行宏观分析。利用 value_counts 函数可以快速统计各类商品的销量分布:
print(f'各类商品销售情况如下:\n{df.loc[:, "商品类别"].value_counts()}')
数据显示日用品远高于其他种类。进一步细分日用品下的具体商品名称:
print(f'日用品里不同商品的销售情况如下:\n{df[df.loc[:, "商品类别"] == "日用品"].loc[:, "商品名称"].value_counts()}')
结果发现'微爽日用'占了一半以上的订单量,建议将资源倾斜于此产品或同种产品。
为了更直观地感受差距,我们可以使用 matplotlib 生成图表:
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体为黑体
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
df = pd.read_excel('销售明细表_清洗后.xlsx')
plt.figure(figsize=(10, 6))
plt.subplot(1, 2, 1)
df.loc[:, '商品类别'].value_counts().plot(kind='bar', title='商品类别销售情况')
plt.subplot(1, 2, 2)
df[df.loc[:, '商品类别'] == '日用品'].loc[:, '商品名称'].value_counts().plot(kind='bar', title='日用品商品名称销售情况')
plt.tight_layout()
plt.show()
3.2 热门商品热销地区
了解热门商品后,分析其销售地区有助于规划进货发货。以'微爽日用 245mm'为例:
print(f'微爽日用 245mm 的销售地区情况如下:\n{df[df.loc[:, "商品名称"] == "微爽日用 245mm"].loc[:, "省份"].value_counts()}')
数据显示不同省份差异极大,且主要与经度有关,东部地区明显销售量大于西部,初步考虑是经济和气候因素影响。
3.3 各月毛利额分析
接下来对毛利额的时间趋势进行分析。我们需要先将日期转换为 datetime 格式,再提取月份进行分组汇总:
df['日期 (年月日)'] = pd.to_datetime(df['日期 (年月日)'])
df.loc[:, '月份'] = df.loc[:, '日期 (年月日)'].dt.month
monthly_profit = df.groupby('月份')['毛利额'].sum().sort_index()
print(f'各月毛利额如下:\n{monthly_profit}')
# 计算环比增长率
monthly_growth = (monthly_profit - monthly_profit.shift(1)) / monthly_profit.shift(1) * 100
print(f'\n各月环比增长率如下:\n{monthly_growth}')
结果显示从七月份开始下滑,八月份对比七月份严重下滑。为了定位原因,我们查看每个月不同商品的毛利额:
result = df.groupby(['月份', '商品类别'])['毛利额'].sum().unstack()
print(f'各月各类商品毛利额如下:\n{result}')
可以发现 7 到 8 月份下跌严重主要是因为零食这一类造成的,可以深入调查一下零食的售卖情况。

