python 销售模拟数据分析

Posted on 2026-03-25 14:53  打杂滴  阅读(2)  评论(0)    收藏  举报

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
import warnings
warnings.filterwarnings('ignore')

# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

class DataAnalysisProject:
    def __init__(self):
        self.data = None
        self.model = None
       
    def load_sample_data(self):
        """加载示例数据集"""
        # 创建示例销售数据
        np.random.seed(42)
        dates = pd.date_range('2020-01-01', periods=1000, freq='D')
        sales = np.random.normal(1000, 200, 1000) + np.linspace(0, 500, 1000)  # 趋势增长
        advertising = np.random.uniform(0, 10000, 1000)
        seasonality = 200 * np.sin(2 * np.pi * np.arange(1000) / 365)
       
        self.data = pd.DataFrame({
            'date': dates,
            'sales': sales + seasonality,
            'advertising': advertising,
            'temperature': np.random.normal(25, 10, 1000),
            'promotion': np.random.choice([0, 1], 1000, p=[0.7, 0.3])
        })
       
        print("示例数据加载完成")
        print(self.data.head())
        return self.data
   
    def explore_data(self):
        """数据探索分析"""
        if self.data is None:
            print("请先加载数据")
            return
           
        print("\n=== 数据基本信息 ===")
        print(self.data.info())
       
        print("\n=== 数据统计描述 ===")
        print(self.data.describe())
       
        print("\n=== 缺失值检查 ===")
        print(self.data.isnull().sum())
       
        return {
            'info': self.data.info(),
            'describe': self.data.describe(),
            'missing': self.data.isnull().sum()
        }
   
    def visualize_data(self):
        """数据可视化"""
        if self.data is None:
            print("请先加载数据")
            return
           
        fig, axes = plt.subplots(2, 2, figsize=(15, 12))
        fig.suptitle('数据可视化分析', fontsize=16)
       
        # 销售额时间序列图
        axes[0, 0].plot(self.data['date'], self.data['sales'])
        axes[0, 0].set_title('销售额时间趋势')
        axes[0, 0].set_xlabel('日期')
        axes[0, 0].set_ylabel('销售额')
       
        # 广告投入与销售额散点图
        axes[0, 1].scatter(self.data['advertising'], self.data['sales'], alpha=0.6)
        axes[0, 1].set_title('广告投入 vs 销售额')
        axes[0, 1].set_xlabel('广告投入')
        axes[0, 1].set_ylabel('销售额')
       
        # 温度分布直方图
        axes[1, 0].hist(self.data['temperature'], bins=30, edgecolor='black')
        axes[1, 0].set_title('温度分布')
        axes[1, 0].set_xlabel('温度')
        axes[1, 0].set_ylabel('频次')
       
        # 促销活动影响箱线图
        axes[1, 1].boxplot([self.data[self.data['promotion']==0]['sales'],
                           self.data[self.data['promotion']==1]['sales']],
                          labels=['无促销', '有促销'])
        axes[1, 1].set_title('促销活动对销售额的影响')
        axes[1, 1].set_ylabel('销售额')
       
        plt.tight_layout()
        plt.show()
   
    def correlation_analysis(self):
        """相关性分析"""
        if self.data is None:
            print("请先加载数据")
            return
           
        # 计算相关系数矩阵
        corr_matrix = self.data[['sales', 'advertising', 'temperature', 'promotion']].corr()
       
        # 绘制热力图
        plt.figure(figsize=(10, 8))
        sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', center=0)
        plt.title('变量相关性热力图')
        plt.show()
       
        print("\n=== 相关性分析结果 ===")
        print(corr_matrix)
       
        return corr_matrix
   
    def build_predictive_model(self):
        """构建预测模型"""
        if self.data is None:
            print("请先加载数据")
            return
           
        # 准备特征和目标变量
        X = self.data[['advertising', 'temperature', 'promotion']]
        y = self.data['sales']
       
        # 划分训练集和测试集
        X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
       
        # 训练线性回归模型
        self.model = LinearRegression()
        self.model.fit(X_train, y_train)
       
        # 预测
        y_pred = self.model.predict(X_test)
       
        # 模型评估
        mse = mean_squared_error(y_test, y_pred)
        r2 = r2_score(y_test, y_pred)
       
        print("\n=== 模型评估结果 ===")
        print(f"均方误差(MSE): {mse:.2f}")
        print(f"决定系数(R²): {r2:.4f}")
       
        # 特征重要性
        feature_importance = pd.DataFrame({
            'feature': X.columns,
            'coefficient': self.model.coef_
        }).sort_values('coefficient', key=abs, ascending=False)
       
        print("\n=== 特征重要性 ===")
        print(feature_importance)
       
        # 预测值vs实际值散点图
        plt.figure(figsize=(10, 6))
        plt.scatter(y_test, y_pred, alpha=0.6)
        plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'r--', lw=2)
        plt.xlabel('实际销售额')
        plt.ylabel('预测销售额')
        plt.title('预测值 vs 实际值[预测模型]')
        plt.show()
       
        return {
            'model': self.model,
            'mse': mse,
            'r2': r2,
            'feature_importance': feature_importance
        }
   
    def generate_report(self):
        """生成分析报告"""
        if self.data is None:
            print("请先加载数据")
            return
           
        report = f"""
        ==================== 数据分析报告 ====================
       
        项目概述:
        - 分析数据集包含 {len(self.data)} 条记录
        - 时间范围: {self.data['date'].min()} 至 {self.data['date'].max()}
       
        核心指标:
        - 平均销售额: {self.data['sales'].mean():.2f}
        - 销售额标准差: {self.data['sales'].std():.2f}
        - 最高销售额: {self.data['sales'].max():.2f}
        - 最低销售额: {self.data['sales'].min():.2f}
       
        关键发现:
        - 广告投入与销售额的相关性: {self.data['advertising'].corr(self.data['sales']):.4f}
        - 促销活动对销售额的提升作用显著
        - 季节性因素对销售有一定影响
       
        =====================================================
        """
       
        print(report)
        return report

def main():
    # 创建数据分析项目实例
    project = DataAnalysisProject()
   
    # 加载示例数据
    project.load_sample_data()
   
    # 数据探索
    project.explore_data()
   
    # 数据可视化
    project.visualize_data()
   
    # 相关性分析
    project.correlation_analysis()
   
    # 构建预测模型
    project.build_predictive_model()
   
    # 生成分析报告
    project.generate_report()

if __name__ == "__main__":
    main()
 

image

 

博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3