logo

Python数据分析:价格分布与总额计算实战指南

作者:谁偷走了我的奶酪2025.09.17 10:20浏览量:0

简介:本文深入探讨如何使用Python分析价格分布特征并计算价格总额,涵盖数据预处理、可视化分析及统计计算全流程,提供可复用的代码示例和实用建议。

Python数据分析:价格分布与总额计算实战指南

在电商运营、金融分析或供应链管理等场景中,价格数据的分布特征与总额计算是决策支持的核心环节。Python凭借其强大的数据处理库(如Pandas、NumPy)和可视化工具(如Matplotlib、Seaborn),能够高效完成从数据清洗到结果呈现的全流程分析。本文将通过具体案例,系统讲解如何使用Python实现价格分布分析与总额计算。

一、价格分布分析的核心价值

价格分布分析旨在揭示数据集中价格的集中趋势、离散程度及异常值特征,为定价策略、库存管理或市场定位提供依据。例如:

  • 电商场景:通过分析商品价格分布,识别主力价格带(如100-200元区间占比60%),优化促销活动设计。
  • 金融场景:评估资产价格波动范围,计算风险价值(VaR)。
  • 供应链场景:检测供应商报价异常值,防范成本风险。

典型的分布特征包括:

  • 集中趋势:均值、中位数、众数。
  • 离散程度:标准差、四分位距。
  • 分布形态:正态分布、偏态分布、多峰分布。

二、数据准备与预处理

1. 数据加载与初步检查

使用Pandas读取CSV或Excel文件,并检查数据质量:

  1. import pandas as pd
  2. # 加载数据
  3. df = pd.read_csv('prices.csv') # 假设列包含'product_id', 'price'
  4. # 检查缺失值与异常值
  5. print(df.isnull().sum()) # 缺失值统计
  6. print(df['price'].describe()) # 基础统计量

2. 数据清洗

处理缺失值与异常值:

  1. # 删除缺失值
  2. df_clean = df.dropna(subset=['price'])
  3. # 剔除异常值(如价格<0或>10000)
  4. df_clean = df_clean[(df_clean['price'] >= 0) & (df_clean['price'] <= 10000)]

3. 数据分组与标签化

按价格区间分组以分析分布:

  1. # 定义价格区间
  2. bins = [0, 50, 100, 200, 500, 1000]
  3. labels = ['0-50', '50-100', '100-200', '200-500', '500-1000']
  4. # 添加分组列
  5. df_clean['price_range'] = pd.cut(df_clean['price'], bins=bins, labels=labels)

三、价格分布可视化分析

1. 直方图:观察分布形态

  1. import matplotlib.pyplot as plt
  2. import seaborn as sns
  3. plt.figure(figsize=(10, 6))
  4. sns.histplot(df_clean['price'], bins=30, kde=True)
  5. plt.title('Price Distribution')
  6. plt.xlabel('Price')
  7. plt.ylabel('Frequency')
  8. plt.show()
  • 解读:若呈现双峰分布,可能反映市场存在高低端两个细分市场。

2. 箱线图:检测离群值

  1. plt.figure(figsize=(8, 6))
  2. sns.boxplot(x=df_clean['price'])
  3. plt.title('Boxplot of Prices')
  4. plt.show()
  • 解读:箱线图可直观显示中位数、四分位距及离群点(通常定义为Q1-1.5IQR或Q3+1.5IQR之外的值)。

3. 分组占比分析

  1. # 计算各价格区间占比
  2. range_counts = df_clean['price_range'].value_counts(normalize=True) * 100
  3. # 可视化
  4. plt.figure(figsize=(10, 6))
  5. range_counts.plot(kind='bar')
  6. plt.title('Price Range Distribution (%)')
  7. plt.xlabel('Price Range')
  8. plt.ylabel('Percentage')
  9. plt.xticks(rotation=45)
  10. plt.show()
  • 输出示例
    1. 100-200 45.2%
    2. 50-100 30.1%
    3. 200-500 15.7%
    4. 0-50 6.3%
    5. 500-1000 2.7%

四、价格总额计算方法

1. 基础总额计算

  1. # 计算所有价格总和
  2. total_price = df_clean['price'].sum()
  3. print(f'Total Price: {total_price:.2f}')
  4. # 按分组计算总额
  5. grouped_total = df_clean.groupby('price_range')['price'].sum()
  6. print(grouped_total)

2. 加权平均价格计算

  1. # 假设有销售量列'quantity'
  2. weighted_avg = (df_clean['price'] * df_clean['quantity']).sum() / df_clean['quantity'].sum()
  3. print(f'Weighted Average Price: {weighted_avg:.2f}')

3. 动态总额计算(按条件筛选)

  1. # 计算价格>100的商品总额
  2. high_price_total = df_clean[df_clean['price'] > 100]['price'].sum()
  3. print(f'Total for Prices > 100: {high_price_total:.2f}')

五、进阶分析:分布拟合与预测

1. 正态分布检验

  1. from scipy.stats import norm, shapiro
  2. # 提取价格对数(若数据右偏)
  3. log_prices = np.log(df_clean['price'] + 1) # 加1避免0值
  4. # 正态性检验
  5. stat, p = shapiro(log_prices)
  6. print(f'Shapiro-Wilk Test: p-value={p:.4f}')
  7. # 若p>0.05,可认为近似正态分布
  8. if p > 0.05:
  9. mu, sigma = norm.fit(log_prices)
  10. print(f'Fitted Distribution: mu={mu:.2f}, sigma={sigma:.2f}')

2. 价格区间预测

基于历史分布预测未来价格范围:

  1. # 计算95%置信区间
  2. lower = df_clean['price'].quantile(0.025)
  3. upper = df_clean['price'].quantile(0.975)
  4. print(f'95% Price Range: [{lower:.2f}, {upper:.2f}]')

六、实用建议与最佳实践

  1. 数据质量优先:分析前务必检查缺失值与异常值,避免“垃圾进,垃圾出”。
  2. 选择合适可视化
    • 直方图:观察整体分布形态。
    • 箱线图:检测离群值。
    • 核密度图(KDE):平滑显示分布曲线。
  3. 动态计算:通过条件筛选(如df[df['category'] == 'A'])实现多维度分析。
  4. 自动化报告:使用Jupyter Notebook的to_html()pandas.ExcelWriter生成分析报告。

七、完整案例代码

  1. import pandas as pd
  2. import numpy as np
  3. import matplotlib.pyplot as plt
  4. import seaborn as sns
  5. from scipy.stats import shapiro
  6. # 1. 数据加载与清洗
  7. df = pd.read_csv('prices.csv')
  8. df_clean = df.dropna(subset=['price'])
  9. df_clean = df_clean[(df_clean['price'] >= 0) & (df_clean['price'] <= 10000)]
  10. # 2. 分布分析
  11. bins = [0, 50, 100, 200, 500, 1000]
  12. labels = ['0-50', '50-100', '100-200', '200-500', '500-1000']
  13. df_clean['price_range'] = pd.cut(df_clean['price'], bins=bins, labels=labels)
  14. # 可视化
  15. plt.figure(figsize=(15, 5))
  16. plt.subplot(1, 2, 1)
  17. sns.histplot(df_clean['price'], bins=30, kde=True)
  18. plt.title('Price Distribution')
  19. plt.subplot(1, 2, 2)
  20. df_clean['price_range'].value_counts(normalize=True).plot(kind='bar')
  21. plt.title('Price Range Distribution (%)')
  22. plt.xticks(rotation=45)
  23. plt.tight_layout()
  24. plt.show()
  25. # 3. 总额计算
  26. print(f'Total Price: {df_clean["price"].sum():.2f}')
  27. print(f'Weighted Avg Price: {(df_clean["price"] * df_clean["quantity"]).sum() / df_clean["quantity"].sum():.2f}')
  28. # 4. 正态性检验
  29. log_prices = np.log(df_clean['price'] + 1)
  30. stat, p = shapiro(log_prices)
  31. print(f'Normality Test p-value: {p:.4f}')

八、总结

通过Python实现价格分布分析与总额计算,可高效完成以下任务:

  1. 识别价格集中区间:优化产品定价或促销策略。
  2. 检测异常值:防范数据录入错误或欺诈行为。
  3. 动态计算总额:支持实时财务报告或库存估值。
  4. 预测价格范围:为采购谈判或销售预测提供依据。

建议结合具体业务场景,灵活调整分析维度(如按时间、地区或产品类别分组),以挖掘更深层次的商业洞察。

相关文章推荐

发表评论