# 电商销售数据分析系统:从数据预处理到可视化洞察
需求分析与技术选型
本系统旨在帮助中小电商企业快速分析销售数据,找出业务增长点。传统Excel处理海量数据效率低下,而Python的Pandas库能高效处理数十万行数据,结合Matplotlib和Seaborn实现专业级可视化。
核心功能模块:
数据加载与异常值处理
销售趋势与月度分析
客户价值RFM模型
商品关联规则挖掘
自动化报告生成#
#
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from datetime import datetime, timedelta
import numpy as np
import warnings
warnings.filterwarnings('ignore')
class ECommerceAnalyzer:
“””
电商销售数据分析系统
功能:销售趋势分析、客户分群、商品关联分析、自动报告生成
“””
def __init__(self, file_path=None):
“””
初始化分析器,可接受外部数据文件或使用示例数据
“””
plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决中文显示问题
plt.rcParams['axes.unicode_minus'] = False
self.df = None
self.clean_df = None
if file_path:
self.load_data(file_path)
else:
self.generate_sample_data()
def generate_sample_data(self):
“””生成示例销售数据(如用户有数据文件可忽略)”””
np.random.seed(42)
dates = pd.date_range('2024-01-01', '2024-12-31', freq='D')
products = ['iPhone15', '华为Mate60', '小米14', 'iPad Pro', 'MacBook Air',
'AirPods', '三星S24', 'ThinkPad X1']
categories = ['手机', '手机', '手机', '平板', '笔记本', '耳机', '手机', '笔记本']
regions = ['北京', '上海', '广州', '深圳', '杭州', '成都', '武汉', '南京']
data = []
for i in range(10000):
date = np.random.choice(dates)
product_idx = np.random.randint(0, len(products))
quantity = np.random.poisson(3) + 1
price = np.random.uniform(1000, 15000)
region = np.random.choice(regions)
customer_id = f”C{np.random.randint(1000, 9999)}”
data.append({
'订单日期': date,
'产品名称': products[product_idx],
'产品类别': categories[product_idx],
'数量': quantity,
'单价': round(price, 2),
'销售额': round(quantity * price, 2),
'地区': region,
'客户ID': customer_id
})
self.df = pd.DataFrame(data)
print(f”示例数据生成完成,共{len(self.df)}条记录”)
def load_data(self, file_path):
“””加载外部数据文件”””
try:
if file_path.endswith('.csv'):
self.df = pd.read_csv(file_path)
elif file_path.endswith('.xlsx'):
self.df = pd.read_excel(file_path)
else:
raise ValueError(“仅支持CSV或Excel文件”)
print(f”数据加载成功,共{len(self.df)}条记录”)
except Exception as e:
print(f”数据加载失败: {e}”)
self.generate_sample_data()
def data_cleaning(self):
“””数据清洗与预处理”””
print(“开始数据清洗…”)
# 备份原始数据
self.clean_df = self.df.copy()
# 处理缺失值
missing_info = self.clean_df.isnull().sum()
print(“缺失值统计:”)
for col, count in missing_info.items():
if count > 0:
print(f” {col}: {count}个缺失值”)
# 删除关键字段缺失的记录
self.clean_df = self.clean_df.dropna(subset=['订单日期', '产品名称', '销售额'])
# 处理异常值(销售额为负或极大)
self.clean_df = self.clean_df[self.clean_df['销售额'] > 0]
self.clean_df = self.clean_df[self.clean_df['销售额'] < self.clean_df['销售额'].quantile(0.99)]
# 确保日期格式正确
self.clean_df['订单日期'] = pd.to_datetime(self.clean_df['订单日期'])
print(f”数据清洗完成,有效记录数: {len(self.clean_df)}”)
return self.clean_df
def sales_trend_analysis(self):
“””销售趋势分析”””
print(“进行销售趋势分析…”)
# 月度销售趋势
monthly_sales = self.clean_df.set_index('订单日期')['销售额'].resample('M').sum()
plt.figure(figsize=(12, 6))
plt.plot(monthly_sales.index, monthly_sales.values, marker='o', linewidth=2)
plt.title('月度销售额趋势分析', fontsize=15, fontweight='bold')
plt.xlabel('月份')
plt.ylabel('销售额(元)')
plt.grid(True, alpha=0.3)
plt.xticks(rotation=45)
plt.tight_layout()
plt.savefig('月度销售趋势.png', dpi=300, bbox_inches='tight')
plt.show()
return monthly_sales
def customer_rfm_analysis(self):
“””客户价值RFM分析(最近购买、购买频率、购买金额)”””
print(“进行客户RFM分析…”)
# 计算RFM值
max_date = self.clean_df['订单日期'].max()
rfm_data = self.clean_df.groupby('客户ID').agg({
'订单日期': lambda x: (max_date – x.max()).days, # 最近购买
'客户ID': 'count', # 购买频率
'销售额': 'sum' # 购买金额
}).rename(columns={'订单日期': 'Recency', '客户ID': 'Frequency', '销售额': 'Monetary'})
# RFM分箱(1-4分,4分最好)
rfm_data['R_Score'] = pd.qcut(rfm_data['Recency'], 4, labels=[4, 3, 2, 1])
rfm_data['F_Score'] = pd.qcut(rfm_data['Frequency'], 4, labels=[1, 2, 3, 4])
rfm_data['M_Score'] = pd.qcut(rfm_data['Monetary'], 4, labels=[1, 2, 3, 4])
# RFM总分
rfm_data['RFM_Score'] = rfm_data['R_Score'].astype(int) +
rfm_data['F_Score'].astype(int) +
rfm_data['M_Score'].astype(int)
# 客户分群
def rfm_segment(row):
if row['RFM_Score'] >= 10:
return '高价值客户'
elif row['RFM_Score'] >= 7:
return '潜力客户'
elif row['RFM_Score'] >= 5:
return '一般客户'
else:
return '流失客户'
rfm_data['客户类型'] = rfm_data.apply(rfm_segment, axis=1)
# 可视化客户分布
plt.figure(figsize=(10, 6))
rfm_data['客户类型'].value_counts().plot(kind='pie', autopct='%1.1f%%',
colors=['#ff9999','#66b3ff','#99ff99','#ffcc99'])
plt.title('客户价值分布RFM分析')
plt.ylabel('')
plt.tight_layout()
plt.savefig('客户RFM分析.png', dpi=300, bbox_inches='tight')
plt.show()
return rfm_data
def product_analysis(self):
“””商品销售分析”””
print(“进行商品销售分析…”)
# 热销商品TOP10
top_products = self.clean_df.groupby('产品名称')['销售额'].sum().nlargest(10)
plt.figure(figsize=(12, 8))
sns.barplot(y=top_products.index, x=top_products.values, palette='viridis')
plt.title('热销商品TOP10(按销售额)', fontsize=15, fontweight='bold')
plt.xlabel('销售额(元)')
plt.tight_layout()
plt.savefig('热销商品分析.png', dpi=300, bbox_inches='tight')
plt.show()
return top_products
def regional_analysis(self):
“””区域销售分析”””
print(“进行区域销售分析…”)
regional_sales = self.clean_df.groupby('地区')['销售额'].sum().sort_values(ascending=False)
plt.figure(figsize=(10, 6))
sns.barplot(x=regional_sales.values, y=regional_sales.index, palette='coolwarm')
plt.title('各地区销售额对比', fontsize=15, fontweight='bold')
plt.xlabel('销售额(元)')
plt.tight_layout()
plt.savefig('区域销售分析.png', dpi=300, bbox_inches='tight')
plt.show()
return regional_sales
def generate_report(self):
“””生成综合分析报告”””
print(“生成分析报告…”)
# 数据清洗
if self.clean_df is None:
self.data_cleaning()
report = {
“总销售额”: f”¥{self.clean_df['销售额'].sum():,.2f}”,
“总订单数”: len(self.clean_df),
“平均订单价值”: f”¥{self.clean_df['销售额'].mean():.2f}”,
“客户总数”: self.clean_df['客户ID'].nunique(),
“商品种类数”: self.clean_df['产品名称'].nunique(),
“数据时间范围”: f”{self.clean_df['订单日期'].min().strftime('%Y-%m-%d')} 至 “
f”{self.clean_df['订单日期'].max().strftime('%Y-%m-%d')}”
}
print(”
” + “=”*50)
print(“电商销售分析报告”)
print(“=”*50)
for key, value in report.items():
print(f”{key}: {value}”)
# 执行各项分析
self.sales_trend_analysis()
self.customer_rfm_analysis()
self.product_analysis()
self.regional_analysis()
return report
# 使用示例和测试代码
if __name__ == “__main__”:
# 创建分析器实例(无参数使用示例数据,有文件路径参数则加载外部数据)
analyzer = ECommerceAnalyzer() # 使用示例数据
# analyzer = ECommerceAnalyzer('你的销售数据.csv') # 使用自己的数据
# 生成完整分析报告
report = analyzer.generate_report()
# 单独调用特定分析功能
# monthly_sales = analyzer.sales_trend_analysis()
# rfm_result = analyzer.customer_rfm_analysis()
# top_products = analyzer.product_analysis()
# regional_result = analyzer.regional_analysis()
#

















暂无评论内容