python数据化分析习题2

45 阅读6分钟

内容:

题目 1:外卖平台订单数据分析

题目 2:酒店预订数据分析

题目 3:企业销售业绩数据分析

题目 1:外卖平台订单数据分析

“外卖订单数据.csv” 包含字段:“订单 ID”“商家类别”“配送距离 (km)”“配送时长 (分钟)”“订单金额 (元)”“配送费 (元)”“下单时间”。 请使用 pandas、numpy 和 matplotlib 完成以下任务:

    1. 读取 CSV 文件数据,计算实际收入(订单金额 + 配送费),添加为新列。 屏幕截图 2025-12-07 185355.png

    1. 按 “商家类别” 分组,统计各类别的订单数、平均配送时长和总实际收入。

屏幕截图 2025-12-07 185544.png

    1. 提取 “下单时间” 中的星期信息,统计每周各天的订单金额均值,绘制折线图。

屏幕截图 2025-12-07 185740.png

    1. 计算配送距离与配送时长的相关系数。

屏幕截图 2025-12-07 185854.png

    1. 找出总实际收入最高的 4 类商家,用饼图展示它们的收入占比。

屏幕截图 2025-12-07 185935.png

屏幕截图 2025-12-07 190003.png

题目 2:酒店预订数据分析

“酒店预订数据.csv” 包含字段:“预订 ID”“酒店星级 (1-5 星)”“入住天数”“人均房价 (元)”“入住人数”“预订日期”“是否取消”。请使用 pandas 和 matplotlib 完成以下任务:

    1. 读取 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("✓ 已添加'订单总金额'列")

    1. 按 “酒店星级” 分组,统计未取消订单的平均入住天数、平均总金额和预订成功率(未取消数 / 总预订数)。
  • 代码如下:
# 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'")

    1. 提取 “预订日期” 中的月份,统计每月的总预订量,绘制柱状图。
  • 代码如下:
# 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}%")

    1. 计算入住天数与总金额的相关系数。
  • 代码如下:
# 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()

    1. 筛选出未取消且入住天数 ≥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 完成以下任务:

    1. 读取 CSV 文件数据,计算成交总金额(成交数量 × 产品单价),添加为新列。

屏幕截图 2025-12-07 191307.png

    1. 按 “区域” 和 “客户等级” 双重分组,统计不同区域、不同客户等级的平均成交金额。

屏幕截图 2025-12-07 191347.png

    1. 提取 “成交日期” 中的季度信息(Q1-Q4),统计各季度的总成交金额,绘制柱状图。

屏幕截图 2025-12-07 191443.png

屏幕截图 2025-12-07 191513.png

    1. 找出总成交金额最高的 5 位销售代表,绘制水平柱状图展示结果。

屏幕截图 2025-12-07 191617.png

以上就是所有习题及其对应的代码解释,感谢观看!