🍽️ 一顿饭能讲出多少故事?用 Python 分析“小费数据”,发现人性真相!
❝“你以为只是吃饭付钱?不,这是大数据时代的‘社交实验’。”
今天咱们不聊房价、不谈股市,来聊聊一个看似普通却充满玄机的数据集——小费数据(Tips Dataset)。
别小看这顿饭,它藏着性别、吸烟、时间、人数与慷慨之间的秘密。而我们的主角,正是 Pandas + Matplotlib,它们将带你从“吃喝”走向“洞察”。
🧩 实训目标:用 Python 挖掘一顿饭背后的人性密码
本实训基于 Seaborn 自带的 tips.xls 数据集(已转为 Excel 格式),主要完成:
✅ 数据导入与查看✅ 列名翻译 & 新增字段✅ 条件查询与统计分析✅ 可视化探索变量关系
❝💡 这不是数学作业,是一场关于“谁更愿意给小费”的社会学研究!
🔧 第一步:导入模块 —— “装备齐全才能上战场”
import pandas as pdimport numpy as npimport matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = ['SimHei'] # 中文显示plt.rcParams['axes.unicode_minus'] = False# 负号正常显示%matplotlib inline
❝🎯 解释一下:
- 设置中文字体,防止图表乱码(不然老板看到“Fri”还以为是外星人)
📥 第二步:加载数据 —— 打开“餐厅账本”
fdata = pd.read_excel('D:/dataset/tips.xls')fdata.head()
输出前5行:
❝🍽️ 看起来像不像你周末和朋友聚餐的账单?但注意:这不是一家店的记录,而是数百次用餐的真实数据!
📊 第三步:数据分析大揭秘 —— 从数字里读出人性
(1)先看整体情况:描述统计
fdata.describe()
输出:
❝📈 关键信息:
- 最高小费竟然有 10 元!(这得是多感动的服务员 😂)
(2)改列名:让中文更亲切
fdata.rename(columns={'total_bill': '消费总额','tip': '小费','sex': '性别','smoker': '是否吸烟','day': '星期','time': '聚餐时间段','size': '人数'}, inplace=True)
❝✅ 告别英文列名,现在连妈妈都能看懂你的代码了!
(3)算人均消费:谁才是“人均王者”?
fdata['人均消费'] = round(fdata['消费总额'] / fdata['人数'], 2)fdata.head()
前5行新增“人均消费”列:
❝💡 举个例子:第0行两人花了16.99元,人均8.5元;第1行三人只花10.34元,人均才3.45元——后者更会过日子!
(4)筛选高手:找“抽烟+男性+人均>15”的人
方法1:fdata[(fdata['是否吸烟'] == 'Yes') & (fdata['性别'] == 'Male') & (fdata['人均消费'] > 15)]
方法2:fdata[(fdata.是否吸烟 == 'Yes') & (fdata.性别 == 'Male') & (fdata.人均消费 > 15)]方法3:fdata.query('是否吸烟 == "Yes" & 性别 == "Male" & 人均消费 > 15')
输出结果(共3行):
❝🕵️♂️ 发现规律了吗?这三位都是周六消费,且金额高达48元以上,人均超16元——妥妥的“高消费烟民男”!
(5)散点图:小费 vs 消费总额 —— 正相关吗?
fdata.plot(kind='scatter', x='消费总额', y='小费')
👉 图形显示:数据点大致呈上升趋势 → 消费越多,小费也越多!
❝🤔 为什么?因为人们通常按比例给小费(比如 15%),所以金额越大,小费自然越高。
(6)谁更慷慨?男 vs 女
fdata.groupby('性别')['小费'].mean()
输出:
性别Female 2.833448Male 3.089618Name: 小费, dtype: float64
❝🚨 结论来了:男性平均小费 3.09 元,女性 2.83 元 → 男性略大方!
(7)星期影响小费吗?—— 周末更舍得?
r = fdata.groupby('星期')['小费'].mean()r.plot(kind='bar', x='星期', y='小费', fontsize=12, rot=30)
📊 柱状图结果:
❝🎉 原因猜测:周六是聚会高峰,情绪高涨,愿意多给一点;周五刚下班,可能只想快点回家。
(8)性别 + 吸烟:组合拳有多猛?
r = fdata.groupby(['性别', '是否吸烟'])['小费'].mean()r.plot(kind='bar', x=['性别', '是否吸烟'], y='小费', fontsize=12, rot=30)
📌 柱状图结果:
- Male + No(不吸烟男性) 最高(约 3.1)
- Female + Yes(吸烟女性) 最低(约 2.7)
❝🧩 有趣现象:不吸烟的男性最慷慨,吸烟的女性最“精打细算”。
(9)午餐 vs 晚餐:哪个时段更“大方”?
r = fdata.groupby('聚餐时间段')['小费'].mean()r.plot(kind='bar', x='聚餐时间段', y='小费', fontsize=15, rot=30)
📈 柱状图结果:
- Dinner(晚餐) 小费明显高于 Lunch(午餐)
❝🍷 合理推测:晚餐通常是正式场合,喝酒聊天氛围好,容易放松心情;午餐匆匆忙忙,只想快点吃完回工位。
🎯 总结:一顿饭里的大数据智慧
| | |
|---|
| .describe() | |
| .rename() | |
| | |
| | |
| | |
| .groupby() | |
| .plot() | |
🧠 学习启示:数据分析不只是写代码
这次实训告诉我们:
✅ 数据是沉默的证人,但它会说话✅ 每一个变量背后都有社会意义✅ 可视化是说服力最强的语言
❝🎮 就像你玩《模拟人生》,每个角色的行为都受环境影响。我们分析的不是数字,是人类行为模式。
💌 给你的建议
- 别怕复杂操作:
.groupby() 和布尔索引是数据分析利器