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()

浙公网安备 33010602011771号