基于Python的电商销售数据分析系统

#  电商销售数据分析系统:从数据预处理到可视化洞察

需求分析与技术选型

本系统旨在帮助中小电商企业快速分析销售数据,找出业务增长点。传统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()

#

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
迷失自我的头像 - 鹿快
评论 抢沙发

请登录后发表评论

    暂无评论内容