panndas数据分析综合案例

文章目录

  • [📊 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 会把图存到当前文件夹,方便分享!

🌟 记住 :你不需要记住所有代码!关键是理解每一步在解决什么问题。工具会变,但分析思维永恒。

相关推荐
CDA数据分析师干货分享2 小时前
【CDA干货】预测建模——CLV与营收趋势预测——电商用户数据分析全流程:从数据到增长决策
大数据·数据挖掘·数据分析·cda证书·cda数据分析师
qunaa01012 小时前
YOLOv26太空探索目标识别与分类【地球景观、国际空间站模块及UFO检测全攻略】_包含数据集与代码实现
yolo·分类·数据挖掘
科技块儿2 小时前
如何高效查询海量IP归属地?大数据分析中的IP查询应用
网络·tcp/ip·数据分析
CDA数据分析师干货分享3 小时前
【CDA干货】客户分群建模——RFM+K-Means用户画像——电商用户数据分析全流程:从数据到增长决策
算法·机器学习·数据挖掘·数据分析·kmeans·cda证书
沃达德软件3 小时前
巡防勤务可视化管理
大数据·人工智能·数据挖掘·数据分析
一只大侠的侠3 小时前
从零搭建车联网数据分析平台:技术架构与实战落地
架构·数据挖掘·数据分析
Aloudata3 小时前
数据工程新范式:基于 NoETL 语义编织实现自助下钻分析
数据分析·指标平台·数据工程·noetl·语义层
高洁013 小时前
知识图谱在装备领域应用场景
python·深度学习·机器学习·数据挖掘·知识图谱
CodeCraft Studio4 小时前
【案例分享】SciChart高性能数据可视化,助力某大型科研平台实现海量信号实时监测
信息可视化·数据分析·数据可视化·scichart·高性能图表引擎·科研平台