内容:
题目 1:外卖平台订单数据分析
题目 2:酒店预订数据分析
题目 3:企业销售业绩数据分析
题目 1:外卖平台订单数据分析
“外卖订单数据.csv” 包含字段:“订单 ID”“商家类别”“配送距离 (km)”“配送时长 (分钟)”“订单金额 (元)”“配送费 (元)”“下单时间”。 请使用 pandas、numpy 和 matplotlib 完成以下任务:
-
- 读取 CSV 文件数据,计算实际收入(订单金额 + 配送费),添加为新列。
- 读取 CSV 文件数据,计算实际收入(订单金额 + 配送费),添加为新列。
-
- 按 “商家类别” 分组,统计各类别的订单数、平均配送时长和总实际收入。
-
- 提取 “下单时间” 中的星期信息,统计每周各天的订单金额均值,绘制折线图。
-
- 计算配送距离与配送时长的相关系数。
-
- 找出总实际收入最高的 4 类商家,用饼图展示它们的收入占比。
题目 2:酒店预订数据分析
“酒店预订数据.csv” 包含字段:“预订 ID”“酒店星级 (1-5 星)”“入住天数”“人均房价 (元)”“入住人数”“预订日期”“是否取消”。请使用 pandas 和 matplotlib 完成以下任务:
-
- 读取 CSV 文件数据,计算订单总金额(人均房价 × 入住人数 × 入住天数),添加为新列。
- 代码如下:
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
def analyze_hotel_data():
"""
酒店预订数据分析
"""
print("=" * 50)
print("题目2:酒店预订数据分析")
print("=" * 50)
try:
# 1. 读取数据
df = pd.read_csv('酒店预订数据.csv')
print(f"数据读取成功,共{len(df)}条记录")
print(f"数据列名: {list(df.columns)}")
# 计算订单总金额
df['订单总金额'] = df['人均房价 (元)'] * df['入住人数'] * df['入住天数']
print("✓ 已添加'订单总金额'列")
-
- 按 “酒店星级” 分组,统计未取消订单的平均入住天数、平均总金额和预订成功率(未取消数 / 总预订数)。
- 代码如下:
# 2. 按酒店星级分组统计
print("\n" + "-" * 40)
print("2. 酒店星级统计 (仅统计未取消订单):")
print("-" * 40)
# 分离取消和未取消的订单
cancelled_orders = df[df['是否取消'] == '是']
not_cancelled = df[df['是否取消'] == '否']
print(f"未取消订单数: {len(not_cancelled)}")
print(f"已取消订单数: {len(cancelled_orders)}")
print(f"总体取消率: {len(cancelled_orders)/len(df)*100:.2f}%")
# 按星级分组统计
star_stats = df.groupby('酒店星级 (1-5 星)').apply(lambda x: pd.Series({
'总预订数': len(x),
'未取消数': (x['是否取消'] == '否').sum(),
'取消数': (x['是否取消'] == '是').sum(),
'预订成功率': (x['是否取消'] == '否').sum() / len(x) * 100,
'平均入住天数': x[x['是否取消'] == '否']['入住天数'].mean(),
'平均总金额': x[x['是否取消'] == '否']['订单总金额'].mean()
})).round(2)
print("\n详细统计:")
print(star_stats)
# 保存统计结果
star_stats.to_csv('酒店星级统计.csv', encoding='utf-8-sig')
print("✓ 酒店星级统计已保存到'酒店星级统计.csv'")
-
- 提取 “预订日期” 中的月份,统计每月的总预订量,绘制柱状图。
- 代码如下:
# 3. 提取月份信息并绘制柱状图
print("\n" + "-" * 30)
print("3. 每月总预订量分析:")
print("-" * 30)
# 确保日期是datetime类型
df['预订日期'] = pd.to_datetime(df['预订日期'])
df['月份'] = df['预订日期'].dt.month
# 统计每月预订量
monthly_bookings = df.groupby('月份').size()
monthly_cancellations = df[df['是否取消'] == '是'].groupby('月份').size()
monthly_success = monthly_bookings - monthly_cancellations
# 创建月份标签
month_labels = [f'{m}月' for m in monthly_bookings.index]
# 绘制堆叠柱状图
plt.figure(figsize=(12, 6))
bar_width = 0.6
x = np.arange(len(month_labels))
# 成功预订部分
plt.bar(x, monthly_success.values, width=bar_width,
label='成功预订', color='lightgreen', edgecolor='darkgreen', linewidth=1)
# 取消预订部分(堆叠在上面)
plt.bar(x, monthly_cancellations.values, width=bar_width,
bottom=monthly_success.values,
label='取消预订', color='lightcoral', edgecolor='darkred', linewidth=1)
plt.title('每月总预订量(区分成功与取消)', fontsize=16, fontweight='bold')
plt.xlabel('月份', fontsize=12)
plt.ylabel('预订数量', fontsize=12)
plt.xticks(x, month_labels, fontsize=11)
plt.legend()
plt.grid(True, alpha=0.3, axis='y')
# 添加数量标签
for i, (total, success) in enumerate(zip(monthly_bookings.values, monthly_success.values)):
plt.text(i, total + max(monthly_bookings.values)*0.01,
str(total), ha='center', va='bottom', fontsize=9)
success_rate = (success / total * 100) if total > 0 else 0
plt.text(i, success/2, f'{success_rate:.0f}%',
ha='center', va='center', fontsize=9, fontweight='bold', color='white')
plt.tight_layout()
plt.savefig('每月预订量柱状图.png', dpi=100, bbox_inches='tight')
plt.show()
# 打印结果
for month, total, cancelled in zip(month_labels, monthly_bookings.values, monthly_cancellations.values):
success = total - cancelled
success_rate = (success / total * 100) if total > 0 else 0
print(f"{month}: 总预订{total}单,成功{success}单,成功率{success_rate:.1f}%")
-
- 计算入住天数与总金额的相关系数。
- 代码如下:
# 4. 计算入住天数与总金额的相关系数
print("\n" + "-" * 30)
print("4. 相关性分析:")
print("-" * 30)
correlation = not_cancelled['入住天数'].corr(not_cancelled['订单总金额'])
print(f"入住天数与订单总金额的相关系数: {correlation:.4f}")
# 绘制散点图
plt.figure(figsize=(10, 6))
plt.scatter(not_cancelled['入住天数'], not_cancelled['订单总金额'],
alpha=0.6, s=30, color='steelblue')
# 添加回归线
z = np.polyfit(not_cancelled['入住天数'], not_cancelled['订单总金额'], 1)
p = np.poly1d(z)
plt.plot(not_cancelled['入住天数'], p(not_cancelled['入住天数']),
"r--", alpha=0.8, linewidth=2)
plt.title(f'入住天数 vs 订单总金额 (相关系数: {correlation:.4f})', fontsize=14)
plt.xlabel('入住天数', fontsize=12)
plt.ylabel('订单总金额 (元)', fontsize=12)
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('入住天数与金额相关性.png', dpi=100, bbox_inches='tight')
plt.show()
-
- 筛选出未取消且入住天数 ≥3 天的订单,保存为 “长期入住订单.csv”(不含索引)。
* 代码如下:
# 5. 筛选长期入住订单
print("\n" + "-" * 30)
print("5. 长期入住订单筛选:")
print("-" * 30)
long_stay_orders = not_cancelled[not_cancelled['入住天数'] >= 3].copy()
print(f"筛选条件: 未取消且入住天数 ≥3 天")
print(f"找到 {len(long_stay_orders)} 条符合条件的订单")
print(f"占未取消订单的 {len(long_stay_orders)/len(not_cancelled)*100:.1f}%")
if len(long_stay_orders) > 0:
# 分析长期入住订单的特征
print(f"\n长期入住订单特征:")
print(f"平均入住天数: {long_stay_orders['入住天数'].mean():.1f} 天")
print(f"平均订单金额: ¥{long_stay_orders['订单总金额'].mean():.2f}")
print(f"平均入住人数: {long_stay_orders['入住人数'].mean():.1f} 人")
# 按星级查看长期入住订单分布
long_stay_by_star = long_stay_orders['酒店星级 (1-5 星)'].value_counts().sort_index()
print("\n长期入住订单星级分布:")
for star, count in long_stay_by_star.items():
print(f" {star}星酒店: {count} 单")
# 保存长期入住订单
long_stay_orders.to_csv('长期入住订单.csv', index=False, encoding='utf-8-sig')
print("✓ 长期入住订已保存到'长期入住订单.csv'")
# 保存处理后的完整数据
df.to_csv('酒店预订数据_处理后.csv', index=False, encoding='utf-8-sig')
print("✓ 处理后的数据已保存到'酒店预订数据_处理后.csv'")
print("\n✓ 所有分析完成!")
except FileNotFoundError:
print("错误: 找不到文件 '酒店预订数据.csv'")
except Exception as e:
print(f"错误: {str(e)}")
运行分析:
analyze_hotel_data()
题目 3:企业销售业绩数据分析
“销售业绩数据.csv” 包含字段:“销售代表 ID”“区域”“产品类型”“成交数量”“产品单价 (元)”“成交日期”“客户等级 (A/B/C/D)”。请使用 pandas 和 matplotlib 完成以下任务:
-
- 读取 CSV 文件数据,计算成交总金额(成交数量 × 产品单价),添加为新列。
-
- 按 “区域” 和 “客户等级” 双重分组,统计不同区域、不同客户等级的平均成交金额。
-
- 提取 “成交日期” 中的季度信息(Q1-Q4),统计各季度的总成交金额,绘制柱状图。
-
- 找出总成交金额最高的 5 位销售代表,绘制水平柱状图展示结果。