题目 1:酒店入住数据分析
“酒店入住数据.csv” 包含字段:“入住订单号”“入住日期”“离店日期”“房型 (单人间 / 双人间 / 套房)”“入住人数”“日房价 (元)”“额外消费 (元)”。 请使用 pandas 和 matplotlib 完成以下任务:
1. 读取 CSV 文件数据,计算订单总费用(日房价 × 入住天数 + 额外消费,需先计算入住天数:离店日期 - 入住日期),添加为新列。
df = pd.read_csv("酒店入住数据.csv")
df['入住日期'] = pd.to_datetime(df['入住日期'])
df['离店日期'] = pd.to_datetime(df['离店日期'])
df['入住天数'] = (df['离店日期'] - df['入住日期']).dt.days
df['总费用'] = df['日房价 (元)'] * df['入住天数'] + df['额外消费 (元)']
print(df)
2. 按 “入住日期” 提取月份信息,统计各月份的订单量和平均入住人数。
df['月份'] = df['入住日期'].dt.month
df_month = df.groupby('月份').agg({
"入住订单号":"count",
"入住天数":"mean"
}).rename(columns={"入住订单号":"订单量","入住天数":"平均入住人数"})
print(df_month)
3. 计算总费用的四分位数(25%、50%、75%)和中位数。
quantiles = df['总费用'].quantile([0.25,0.5,0.75])
df_median = df['总费用'].median()
print("总费用的四分位数分别为:",quantiles)
print("总费用的中位数为:",df_median)
4. 按入住人数分组(1 人、2 人、3 人及以上),统计每组的订单数和平均总费用,绘制柱状图。
def group_people(num):
if num == 1:
return "1人"
elif num == 2:
return "2人"
else:
return "3人及以上"
df['入住人数分组'] = df['入住人数'].apply(group_people)
print(df)
df_states = df.groupby("入住人数分组").agg({
"入住订单号":"count",
"总费用":"mean"
}).rename(columns={"入住订单号":"订单量","总费用":"平均总费用"})
print(df_median)
plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置为黑体
plt.bar(df_states.index,df_states['平均总费用'])
plt.title('平均总费用')
plt.show()
运行结果如图:
5. 保存房型为套房的订单数据为 “套房入住订单.csv”(不含索引)。
new_df = df[df['房型'] == '套房']
new_df.to_csv("套房入住订单.csv")
题目 2:物流配送数据分析
“物流配送数据.csv” 包含字段:“运单号”“发货时间”“签收时间”“配送距离 (km)”“配送员 ID”“基础配送费 (元)”“超重费 (元)”“是否准时签收 (是 / 否)”。 请使用 pandas 和 matplotlib 完成以下任务:
1. 读取 CSV 文件数据,计算配送总费用(基础配送费 + 超重费),并计算配送耗时(签收时间 - 发货时间,单位:小时),添加这两个新列。
df = pd.read_csv("物流配送数据.csv")
df['配送总费用'] = df['基础配送费 (元)'] + df['超重费 (元)']
df['发货时间'] = pd.to_datetime(df['发货时间'])
df['签收时间'] = pd.to_datetime(df['签收时间'])
df['配送耗时'] = (df['签收时间'] - df['发货时间']).dt.total_seconds() / 3000
print(df)
2. 按 “发货时间” 提取日期(日)信息,统计每月各日的配送订单量和平均配送距离。
df['发货月份'] = df['发货时间'].dt.month
df['发货日期'] = df['发货时间'].dt.day
df_states = df.groupby(['发货月份','发货日期']).agg(
配送订单量=('运单号','count'),
平均配送距离=('配送距离 (km)','mean')
).reset_index()
print(df_states)
3. 计算配送耗时的最大值、最小值、均值和变异系数(标准差 / 均值)。
df_time = df['配送耗时'].agg(['max','min','mean','std'])
df_time['变异系数'] = df_time['std'] / df_time['mean']
print(df_time)
4. 按配送距离分组(0-10km、10-20km、20km+),统计每组的准时签收率和平均总配送费,绘制柱状图。
def group_distance(dist):
if 0<= dist <10:
return "0-10km"
elif 10 <= dist <20:
return "10-20km"
else:
return "20km+"
df['配送距离分组'] = df['配送距离 (km)'].apply(group_distance)
df['准时签收标记'] = df['是否准时签收'].map({'是':1,'否':0})
print(df)
df_dis = df.groupby('配送距离分组').agg(
准时签收率=('准时签收标记','mean'),
平均总配送费=('配送总费用','mean')
).reset_index()
print(df_dis)
# 准时签收率
plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置为黑体
plt.bar(df_dis.index,df_dis['准时签收率'])
plt.title('准时签收率')
plt.show()
# 配送总费用
plt.bar(df_dis.index,df_dis['平均总配送费'])
plt.title('平均总配送费')
plt.show()
运行结果如图:
5. 保存配送耗时超过 24 小时的订单数据为 “超时配送订单.csv”(不含索引)。
new_df = df[df['配送耗时'] > 24]
new_df.to_csv("超时配送订单.csv")
题目 3:医院门诊数据分析
“医院门诊数据.csv” 包含字段:“就诊编号”“就诊日期”“科室 (内科 / 外科 / 儿科 / 妇科 / 骨科)”“患者年龄”“性别”“诊疗费用 (元)”“药品费用 (元)”“是否医保报销 (是 / 否)”。 请使用 pandas、numpy 和 matplotlib 完成以下任务:
1. 读取 CSV 文件数据,判断是否为高费用就诊(诊疗费用 + 药品费用 ≥ 500 元),添加 “是否高费用” 列(是 / 否)。
df = pd.read_csv("医院门诊数据.csv")
df['总费用'] = df['诊疗费用 (元)'] + df['药品费用 (元)']
df['是否高费用'] = np.where(df['总费用'] >= 500,'是','否')
print(df)
2. 按 “科室” 和 “年龄分组”(0-18、19-40、41-60、60+)双重分组,统计每组的高费用就诊比例。
def age_group(age):
if 0 <= age <= 18:
return "0-18"
elif 19 <= age <= 40:
return "19-40"
elif 41 <= age <= 60:
return "41-60"
else:
return "60+"
df['年龄分组'] = df['患者年龄'].apply(age_group)
print(df)
df_states = df.groupby(['科室','年龄分组']).agg(
总就诊数=('就诊编号','count'),
高费用就诊数=('是否高费用',lambda x:(x =='是').sum())
)
print(df_states)
ratio = df_states['高费用就诊数'] / df_states['总就诊数']
print(ratio)
3. 计算诊疗费用与药品费用的相关系数。
corr = df['诊疗费用 (元)'].corr(df['药品费用 (元)'])
print(corr)
4. 按是否医保报销分组,统计诊疗费用、药品费用的均值和方差(使用 agg 函数)
states = df.groupby("是否医保报销").agg(
诊疗费用均值=('诊疗费用 (元)', 'mean'),
诊疗费用方差=('诊疗费用 (元)', 'var'),
药品费用均值=('药品费用 (元)', 'mean'),
药品费用方差=('药品费用 (元)', 'var')
)
print(states)
5. 绘制不同科室的平均总费用(诊疗 + 药品)对比柱状图。
total_sales = df.groupby('科室')['总费用'].sum()
print(total_sales)
plt.rcParams["font.sans-serif"] = ['SimHei']
plt.bar(total_sales.index, total_sales)
plt.show()
运行结果如图:
题目 4:短视频平台用户行为数据分析
“短视频行为数据.csv” 包含字段:“用户 ID”“观看日期”“视频类型 (搞笑 / 剧情 / 科普 / 美妆 / 游戏)”“观看时长 (秒)”“点赞数”“评论数”“分享数”“是否关注作者 (是 / 否)”。
请使用 pandas 和 matplotlib 完成以下任务:
1. 读取 CSV 文件数据,将 “观看日期” 转换为 datetime 格式。
df = pd.read_csv("短视频行为数据.csv")
df['观看日期'] = pd.to_datetime(df['观看日期'])
print(df)
2. 按 “视频类型” 分组,统计平均观看时长、平均点赞数和活跃用户数(去重用户 ID 数)。
df_states = df.groupby("视频类型").agg(
平均观看时长=('观看时长 (秒)', 'mean'),
平均点赞数=('点赞数', 'mean'),
活跃用户数=('用户ID', 'nunique') # 去重
).reset_index()
print(df_states)
3. 提取 “观看日期” 中的月份信息,统计每月的总观看时长(转换为小时),绘制折线图。
df['月份'] = df['观看日期'].dt.month
month_watch = df.groupby('月份').agg(
总观看时长秒=('观看时长 (秒)', 'sum')
).reset_index()
month_watch['总观看时长小时'] = month_watch['总观看时长秒'] / 3600
print(month_watch)
plt.plot(month_watch['月份'], month_watch['总观看时长小时'])
plt.show()
运行结果如图:
4. 计算观看时长与点赞数的相关系数。
corr = df['观看时长 (秒)'].corr(df['点赞数'])
print(corr)
5. 筛选出分享数 ≥10 的记录,保存为 “高分享视频记录.csv”(不含索引)。
new_df = df[df['分享数'] >= 10]
new_df.to_csv('高分享视频记录.csv')