2023Python数据分析实战:五大经典项目全解析

一、数据清洗与预处理实战

在数据分析流程中,数据清洗占据60%以上的工作时间。以电商订单数据为例,原始数据常包含缺失值、重复值和异常值。使用Pandas进行清洗时,inplace=True参数可实现原地修改,避免创建数据副本。例如处理缺失列时:

  1. import pandas as pd
  2. import numpy as np
  3. # 模拟缺失数据
  4. data = pd.DataFrame({
  5. 'order_id': [1,2,3,4],
  6. 'amount': [100, np.nan, 200, np.nan],
  7. 'customer': ['A','B','C','D']
  8. })
  9. # 原地删除缺失行
  10. data.dropna(subset=['amount'], inplace=True)
  11. # 等效操作:data = data.dropna(subset=['amount'])

对于大数据集(GB级别),推荐使用Numpy进行数值计算。经基准测试,Numpy计算均值比Pandas快3-5倍:

  1. import time
  2. # 生成1000万行测试数据
  3. large_data = pd.DataFrame({'value': np.random.rand(10_000_000)})
  4. # Pandas计算
  5. start = time.time()
  6. pd_mean = large_data['value'].mean()
  7. print(f"Pandas耗时: {time.time()-start:.2f}s")
  8. # Numpy计算
  9. start = time.time()
  10. np_mean = np.mean(large_data['value'].values)
  11. print(f"Numpy耗时: {time.time()-start:.2f}s")

二、可视化定制技巧

Matplotlib作为基础可视化库,通过参数配置可实现专业级图表。绘制带标注的折线图时,需注意坐标计算与文本偏移:

  1. import matplotlib.pyplot as plt
  2. # 模拟销售数据
  3. months = ['Jan','Feb','Mar','Apr']
  4. sales = [120, 150, 180, 90]
  5. fig, ax = plt.subplots(figsize=(8,4))
  6. ax.plot(months, sales, 'r-', marker='o') # 红色实线
  7. # 添加数据标签
  8. for x, y in zip(months, sales):
  9. ax.text(x, y+2, str(y), ha='center', va='bottom') # y+2实现垂直偏移
  10. plt.title('Quarterly Sales Trend')
  11. plt.ylabel('Revenue (k$)')
  12. plt.grid(True)
  13. plt.show()

柱状图的颜色配置可通过color参数实现,建议使用色板工具(如Coolors)生成协调配色:

  1. categories = ['Electronics','Clothing','Food','Home']
  2. values = [45, 30, 15, 10]
  3. colors = ['#2E86AB', '#A23B72', '#F18F01', '#C73E1D']
  4. plt.bar(categories, values, color=colors)
  5. plt.title('Product Category Distribution')
  6. plt.xticks(rotation=45)
  7. plt.tight_layout() # 自动调整布局
  8. plt.show()

三、数据分组与聚合实战

订单数据分析中,分组聚合是核心操作。以餐饮订单数据为例,需计算各菜品销量:

  1. # 模拟订单数据
  2. orders = pd.DataFrame({
  3. 'order_id': [101,101,102,102,103],
  4. 'dish': ['Burger','Fries','Pizza','Salad','Burger'],
  5. 'quantity': [2,1,1,1,3]
  6. })
  7. # 方法1:直接分组计数
  8. dish_counts = orders['dish'].value_counts()
  9. # 方法2:创建分组表后聚合
  10. order_groups = orders.groupby(['order_id','dish']).sum().reset_index()
  11. dish_totals = order_groups.groupby('dish')['quantity'].sum().sort_values(ascending=False)
  12. # 绘制TOP10菜品
  13. top_dishes = dish_totals.head(10)
  14. plt.figure(figsize=(10,5))
  15. plt.barh(top_dishes.index, top_dishes.values, color='#4E79A7')
  16. plt.xlabel('Total Quantity Sold')
  17. plt.title('Top 10 Best-Selling Dishes')
  18. plt.gca().invert_yaxis() # 反转Y轴使最高值在上
  19. plt.show()

四、统计建模与预测

时间序列分析中,移动平均是常用平滑技术。使用Pandas的rolling方法实现7日移动平均:

  1. # 模拟每日销售数据
  2. dates = pd.date_range('2023-01-01', periods=30)
  3. daily_sales = np.random.randint(50, 200, size=30)
  4. sales_df = pd.DataFrame({'date': dates, 'sales': daily_sales})
  5. # 计算7日移动平均
  6. sales_df['7day_avg'] = sales_df['sales'].rolling(window=7).mean()
  7. # 可视化对比
  8. plt.figure(figsize=(12,6))
  9. plt.plot(sales_df['date'], sales_df['sales'], 'b-', label='Daily Sales')
  10. plt.plot(sales_df['date'], sales_df['7day_avg'], 'r--', label='7-Day MA')
  11. plt.legend()
  12. plt.title('Sales Trend with Moving Average')
  13. plt.xticks(rotation=45)
  14. plt.tight_layout()
  15. plt.show()

五、性能优化技巧

处理百万级数据时,需注意以下优化策略:

  1. 数据类型优化:将object类型转为category可节省70%内存
    ```python

    转换前

    print(orders.info()) # dish列占用高

转换后

orders[‘dish’] = orders[‘dish’].astype(‘category’)
print(orders.info()) # 内存占用显著降低

  1. 2. **分块处理**:使用`chunksize`参数读取大文件
  2. ```python
  3. chunk_iter = pd.read_csv('large_dataset.csv', chunksize=100_000)
  4. for chunk in chunk_iter:
  5. process(chunk) # 分块处理函数
  1. 向量化操作:避免循环,使用内置方法
    ```python

    低效方式

    results = []
    for val in data[‘values’]:
    results.append(val * 2)

高效方式

data[‘doubled’] = data[‘values’] * 2

  1. ### 六、项目实战完整流程
  2. 以电商用户行为分析为例,完整流程包含:
  3. 1. **数据加载**:使用`pd.read_csv()`加载JSON/CSV数据
  4. 2. **清洗转换**:处理缺失值、标准化日期格式
  5. 3. **特征工程**:创建RFM(最近购买、购买频率、购买金额)指标
  6. 4. **用户分群**:使用K-Means聚类
  7. 5. **可视化报告**:生成交互式仪表盘(可结合Plotly
  8. ```python
  9. # 示例:RFM计算
  10. from datetime import datetime
  11. # 假设有订单数据
  12. orders['order_date'] = pd.to_datetime(orders['order_date'])
  13. latest_date = orders['order_date'].max()
  14. # 计算RFM指标
  15. rfm = orders.groupby('customer_id').agg({
  16. 'order_date': lambda x: (latest_date - x.max()).days, # Recency
  17. 'order_id': 'count', # Frequency
  18. 'amount': 'sum' # Monetary
  19. })
  20. rfm.columns = ['Recency', 'Frequency', 'Monetary']
  21. # 标准化处理
  22. from sklearn.preprocessing import MinMaxScaler
  23. scaler = MinMaxScaler()
  24. rfm_scaled = pd.DataFrame(scaler.fit_transform(rfm), columns=rfm.columns)

通过系统掌握这五大实战场景,数据分析师可具备独立处理商业数据项目的能力。建议读者从实际业务需求出发,结合Jupyter Notebook的交互式开发环境,逐步构建完整的数据分析流水线。