文章目录
- [📊 Pandas销售数据分析实战教程(零基础友好)](#📊 Pandas销售数据分析实战教程(零基础友好))
-
- [🔧 第一步:导入必备库(像打开工具箱)](#🔧 第一步:导入必备库(像打开工具箱))
- [🌱 第二步:生成模拟销售数据(创造"原始数据")](#🌱 第二步:生成模拟销售数据(创造“原始数据”))
- [🧹 第三步:数据清洗(打扫脏数据)](#🧹 第三步:数据清洗(打扫脏数据))
- [📦 第四步:分组分析(按维度汇总)](#📦 第四步:分组分析(按维度汇总))
- [📈 第五步:时间序列分析(看趋势)](#📈 第五步:时间序列分析(看趋势))
- [🎨 第六步:数据可视化(一图胜千言)](#🎨 第六步:数据可视化(一图胜千言))
📊 Pandas销售数据分析实战教程(零基础友好)
下面我将带你一步步完成销售数据的生成 → 清洗 → 分析 → 可视化全流程,每步都有详细注释+小白友好说明 ✨
🔧 第一步:导入必备库(像打开工具箱)
python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from datetime import datetime, timedelta
# 设置中文字体(避免乱码)+ 美化图表
plt.rcParams['font.sans-serif'] = ['SimHei', 'Arial Unicode MS', 'DejaVu Sans']
plt.rcParams['axes.unicode_minus'] = False
sns.set_style("whitegrid")
✅ 小白提示:
pandas:处理表格数据的神器matplotlib/seaborn:画图工具- 设置中文字体是为了图表能正常显示中文
🌱 第二步:生成模拟销售数据(创造"原始数据")
python
# 设置随机种子(保证每次运行结果一致,方便学习)
np.random.seed(42)
# 生成365天的日期范围(2023全年)
dates = pd.date_range(start='2023-01-01', end='2023-12-31', freq='D')
# 创建空列表存储每行数据
data = []
products = ['手机', '笔记本', '耳机', '平板', '手表']
regions = ['华东', '华南', '华北', '西南']
for _ in range(2000): # 生成2000条销售记录
date = np.random.choice(dates)
product = np.random.choice(products)
region = np.random.choice(regions)
quantity = np.random.randint(1, 11) # 销量1-10件
# 根据产品设定基础价格,再加点随机波动
base_price = {'手机':5000, '笔记本':6000, '耳机':500, '平板':3000, '手表':2000}[product]
unit_price = base_price * np.random.uniform(0.9, 1.1)
sales = round(quantity * unit_price, 2)
data.append([date, product, region, quantity, unit_price, sales])
# 转成DataFrame(表格形式)
df = pd.DataFrame(data, columns=['日期', '产品', '地区', '销量', '单价', '销售额'])
print("✅ 原始数据生成成功!前5行预览:")
print(df.head())
print(f"\n📊 数据总览:{df.shape[0]}条记录,{df.shape[1]}个字段")
✅ 小白提示:
- 这就像"编造"一份销售记录表,包含日期、卖什么、卖到哪、卖多少、多少钱
head()只看前5行,避免刷屏
🧹 第三步:数据清洗(打扫脏数据)
python
# 1️⃣ 检查缺失值
print("\n🔍 缺失值检查:")
print(df.isnull().sum()) # 本例无缺失,但真实数据常有
# 2️⃣ 检查重复值
dup_count = df.duplicated().sum()
print(f"⚠️ 重复记录数: {dup_count}")
if dup_count > 0:
df = df.drop_duplicates()
print("✅ 已删除重复记录")
# 3️⃣ 检查异常值(销量≤0或销售额≤0)
invalid = df[(df['销量'] <= 0) | (df['销售额'] <= 0)]
print(f"❌ 异常记录数: {len(invalid)}")
if len(invalid) > 0:
df = df.drop(invalid.index)
print("✅ 已删除异常记录")
# 4️⃣ 添加辅助列(方便后续分析)
df['年份'] = df['日期'].dt.year
df['月份'] = df['日期'].dt.month
df['季度'] = df['日期'].dt.quarter
df['星期'] = df['日期'].dt.day_name() # 如"星期一"
print("\n✨ 清洗后数据预览(新增时间列):")
print(df[['日期','产品','销量','销售额','月份','季度']].head(3))
✅ 小白提示:
- 真实数据常有"脏数据":空值、重复、负数销量等
- 添加"月份""季度"列,后续分析更方便
- 清洗是数据分析最重要的一步!
📦 第四步:分组分析(按维度汇总)
python
# 1️⃣ 按产品汇总:总销量、总销售额、平均单价
product_summary = df.groupby('产品').agg({
'销量': 'sum',
'销售额': 'sum',
'单价': 'mean'
}).round(2).sort_values('销售额', ascending=False)
print("\n📦 按产品汇总(销售额降序):")
print(product_summary)
# 2️⃣ 按地区+产品交叉分析
region_product = pd.pivot_table(
df,
values='销售额',
index='地区',
columns='产品',
aggfunc='sum',
fill_value=0
).round(2)
print("\n🌍 地区×产品销售额交叉表:")
print(region_product)
# 3️⃣ 找出"销冠":单日最高销售额记录
top_sale = df.nlargest(1, '销售额')
print("\n🏆 单日销冠:")
print(top_sale[['日期','产品','地区','销量','销售额']])
✅ 小白提示:
groupby= "按...分组",像Excel数据透视表pivot_table= 交叉表,一眼看清地区和产品的关系nlargest(1, '销售额')= 找销售额最大的1条记录
📈 第五步:时间序列分析(看趋势)
python
# 按月汇总销售额
monthly_sales = df.groupby('月份')['销售额'].sum().reset_index()
# 计算环比增长率(本月比上月涨了多少%)
monthly_sales['环比增长率'] = monthly_sales['销售额'].pct_change() * 100
monthly_sales['环比增长率'] = monthly_sales['环比增长率'].round(2)
print("\n📅 月度销售额趋势:")
print(monthly_sales)
# 补充:按季度汇总
quarterly_sales = df.groupby('季度')['销售额'].sum().reset_index()
print("\n📆 季度销售额:")
print(quarterly_sales)
✅ 小白提示:
pct_change()= 自动计算"比上个月涨了百分之几"- 时间序列分析能发现:哪个月卖得好?有没有季节性?
🎨 第六步:数据可视化(一图胜千言)
python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib
import seaborn as sns
# ==============================
# 【关键配置】支持中文显示
# ==============================
matplotlib.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei', 'DejaVu Sans']
matplotlib.rcParams['axes.unicode_minus'] = False # 正常显示负号
# 假设 df 和 monthly_sales 已定义(请确保您的数据已加载)
# 示例:
# df = pd.read_csv('your_sales_data.csv')
# df['月份'] = pd.to_datetime(df['日期']).dt.month # 如果需要
# monthly_sales = df.groupby('月份')['销售额'].sum().reset_index()
# ==============================
# 开始绘图
# ==============================
plt.figure(figsize=(14, 10))
# 📌 子图1:各产品总销售额(横向柱状图)--- 仅显示 Top 20
plt.subplot(2, 2, 1)
product_sales = df.groupby('产品')['销售额'].sum().sort_values()
if len(product_sales) > 20:
product_sales = product_sales.tail(20) # 取销售额最高的20个
product_sales.plot(kind='barh', color=plt.cm.Set3(np.linspace(0, 1, len(product_sales))))
plt.title('各产品总销售额对比', fontsize=14, fontweight='bold')
plt.xlabel('销售额(元)')
for i, v in enumerate(product_sales.values):
plt.text(v * 1.01, i, f'{int(v):,}', va='center', fontsize=9)
# 📌 子图2:月度销售额趋势
plt.subplot(2, 2, 2)
# 防止异常值拉伸坐标轴
y_max = monthly_sales['销售额'].quantile(0.99) * 1.1
plt.bar(monthly_sales['月份'], monthly_sales['销售额'], alpha=0.7, color='skyblue', label='销售额')
plt.plot(monthly_sales['月份'], monthly_sales['销售额'], 'ro-', label='趋势线')
plt.ylim(0, y_max)
plt.title('2023年月度销售额趋势', fontsize=14, fontweight='bold')
plt.xlabel('月份')
plt.ylabel('销售额(元)')
plt.xticks(monthly_sales['月份'])
plt.legend()
max_idx = monthly_sales['销售额'].idxmax()
plt.annotate(f'峰值: {int(monthly_sales["销售额"].max()):,}',
xy=(monthly_sales.loc[max_idx, '月份'], monthly_sales.loc[max_idx, '销售额']),
xytext=(10, 20), textcoords='offset points',
arrowprops=dict(arrowstyle='->', color='red', lw=1.5))
# 📌 子图3:地区销售额占比(饼图)
plt.subplot(2, 2, 3)
region_sum = df.groupby('地区')['销售额'].sum()
if len(region_sum) > 10:
other_sum = region_sum.iloc[10:].sum()
region_sum = region_sum.iloc[:10]
region_sum['其他'] = other_sum
colors = sns.color_palette('pastel', len(region_sum))
plt.pie(region_sum.values, labels=region_sum.index, autopct='%1.1f%%',
colors=colors, explode=[0.05]*len(region_sum), startangle=90)
plt.title('销售额地区分布', fontsize=14, fontweight='bold')
# 📌 子图4:产品销量 vs 销售额(散点图)
plt.subplot(2, 2, 4)
x_limit = df['销量'].quantile(0.99)
y_limit = df['销售额'].quantile(0.99)
# 若数据量大则采样
plot_df = df if len(df) <= 5000 else df.sample(5000, random_state=42)
for product in plot_df['产品'].unique():
subset = plot_df[plot_df['产品'] == product]
plt.scatter(subset['销量'], subset['销售额'], label=product, alpha=0.6, s=25, edgecolors='w', linewidth=0.5)
plt.xlim(0, x_limit * 1.1)
plt.ylim(0, y_limit * 1.1)
plt.title('产品销量与销售额关系', fontsize=14, fontweight='bold')
plt.xlabel('单笔销量')
plt.ylabel('单笔销售额(元)')
plt.legend(loc='best', fontsize=8, ncol=2)
plt.grid(True, linestyle='--', alpha=0.3)
# 调整布局并添加总标题
plt.tight_layout(pad=2.5, h_pad=2.0, w_pad=1.5)
plt.suptitle('2023年销售数据分析总览', fontsize=18, fontweight='bold', y=0.995)
# 保存图像(移除 bbox_inches='tight' 避免尺寸计算异常)
plt.savefig('sales_analysis.png', dpi=150, bbox_inches=None, facecolor='white')
plt.show()
print("\n✅ 可视化图表已生成并保存为 'sales_analysis.png'")
✅ 小白提示:
- 4张图讲清核心故事:
1️⃣ 什么产品最赚钱 (手机遥遥领先)
2️⃣ 什么时候卖得好 (看11月峰值,可能是双11!)
3️⃣ 哪里客户多 (华东占比最高)
4️⃣ 产品特性(手机单价高,耳机靠走量) plt.savefig会把图存到当前文件夹,方便分享!
🌟 记住 :你不需要记住所有代码!关键是理解每一步在解决什么问题。工具会变,但分析思维永恒。