
01 引
我們手里有一份餐廳統(tǒng)計的用餐信息,包括餐費、小費、性別、吸煙習慣、用餐時段、用餐人數等信息。下面讓我們用這份數據表練手python吧。
本次練習主要圍繞一下幾點:
- groupby方法
- plot箱線圖
- plot散點圖
來吧,讓我們開始吧!
目的:分析小費比例與其他因素的關系,出手最闊綽的人群長什么樣?
02 實操
其實根據這份數據可以分析出很多好玩的東西,比如:
- 餐費高低與性別、用餐時段、用餐日期的關系
- 吸煙顧客的畫像、不吸煙顧客的畫像
- 小費比例與性別、吸煙習慣、用餐時段等因素的關系
篇幅有限,舉一反三,今天我們就來看看小費比例與性別、吸煙習慣、用餐時段等因素的關系吧。
2.1 數據結構
首先我們來看看這份數據長什么樣
import pandas as pd
%matplotlib inline
%config InlineBackend.figure_format="retina"
tips=pd.read_csv("/Users/dengsudden/Documents/python_course/tips.csv",sep=";")
tips.head()

其中,各字段意義如下:
- total_bill:賬單總額
- tip: 所付小費
- sex: 性別
- smoker:是否吸煙
- day:周一至周日的一天
- time:晚餐(dinner)還是午餐(lunch)
- size: 用餐人數
我們還可以通過一個散點圖更直觀地感受數據情況。
tipa.plot(kind="scatter",x="total_bill",y="tip",color="blue",label="bill_tip",figsize=(10,6))

橫軸表示消費額,縱軸表示小費,可以大致看到一個趨勢——小費隨消費額的增加而增加。(不過后面的分析我們會發(fā)現,小費比例隨消費額的增加而減少)
2.2 分析思路
- 首先計算出小費比例
- 提出假設:小費比例與消費額成正比,與用餐人數成正比,有吸煙習慣的人小費比例更高,男性比女性小費比例高,晚餐比午餐小費比例高,周末小費比例更高
- 驗證假設
2.3 數據清洗
首先來看看離群值是否是異常值,思路如下:
- 畫出整體數據小費比例的箱線圖,可以看到離群值
- 根據箱線圖中離群值范圍,找出離群值具體數據情況,判別是否為異常值
- 使用df.drop([index1,index2,])去除數據中的異常值
# 計算小費比例
tips["pct"]=tips.tip/tips.total_bill*100
tips.head()
#整體數據的小費比例箱線圖
tips.pct.plot(kind="box",label="tips pct%",figsize=(10,6))

從整體數據來看,小費比例最小在3%左右,最大在70%左右,中位數在15%左右,均值為16%,這是一個很大的范圍,我們需要深入到各個緯度去研究小費比例的關聯因素。小費比例高于30%被認為是離群值,下面我看來看看這幾個離群值是否是異常值。
tips[tips.pct>30]

可以看到,小費比例較高的這幾個離群值,小費總額都不到10美元,而小費比例就超出一半,可以認為這是異常值,因此我們剔除掉這些異常值。然后再開始數據挖掘。
# 去除異常值
tipa=tips.drop([67,172,178])
tipa[tipa.pct>30]
2.4 正題來了:數據挖掘
- 小費比例與性別、日期、吸煙習慣、用餐時段的關系
#按男女分組,繪制小費比例箱線圖
tipa[["pct","sex"]].boxplot(grid=False,by="sex",figsize=(10,6))
#按星期幾分組,繪制小費比例箱線圖
tipa[["pct","day"]].boxplot(grid=False,by="day",figsize=(10,6))
# 是否吸煙與小費比例關系
tipa[["pct","smoker"]].boxplot(grid=False,by="smoker",figsize=(10,6))
# 按性別分組,尋找吸煙與否與小費比例關系
tipsm=tipa[tipa.sex=="Male"]
tipsf=tipa[tipa.sex=="Female"]
tipsm[["pct","smoker"]].boxplot(grid=False,by="smoker",figsize=(10,6))
tipsf[["pct","smoker"]].boxplot(grid=False,by="smoker",figsize=(10,6))
#小費比例與用餐時段的關系
tipa[["pct","time"]].boxplot(grid=False,by="time",figsize=(10,6))
輸出如下(僅挑選有意義的輸出):

按性別分組來看,男女性的中位數接近,男性的小費比例分布非常均勻,女性的小費比例下四分位數更加靠上,說明女性更容易給出更高的小費。

按日期分組來看,周四到周天的小費比例中位數區(qū)別不大,節(jié)假日的周六周天人們給小費更加隨意一點,特別是周六,小費比例范圍跨度達到了25%,原因可能在于周末人們擁有更加輕松愉快的心情(說不定周末相親的人也更多,小費比例高呢)。而這兩天也更容易出現高到離譜的小費比例,我猜猜是不是周末喝高了,小手一抖,小費出手。

按吸煙習慣來看,吸煙的人出手更加隨意,小費比例范圍更廣,而不吸煙的人出手更加謹慎。我想其中的原因可能在于吸煙者覺得自己帶給了別人更多不方便,當然,也可能和吸煙者的經濟狀況、付費習慣有關。
將數據按性別分組,男性中的不吸煙群體的小費比例比吸煙群體要高,其中的原因可能是不吸煙的男性可能擁有更高的教育水平和經濟能力。女性中的吸煙群體的小費比例明顯高于不吸煙群體,中位數超過女性不吸煙群體3%左右,分布范圍也更廣。

從用餐時段來看,午餐的小費比例范圍較窄,晚餐時段的小費比例隨意性較大,這可能是由于晚餐時段用餐時長更長、餐費更高、很可能用了酒類飲料,使得小費比例較高。
接下來我們再來看看小費比例和用餐人數的關系。
#小費比例與用餐人數的關系
tipa.groupby("size").mean()

可以看到,小費比例隨用餐人數的增加而降低。
小費狂魔畫像
基于上述分析,我們現在可以給出一個小費狂魔的畫像了。
*小費狂魔:給小費比例較高的群體
周六單獨來餐廳吃晚餐的吸煙男性
03 結語
今天我們通過一張餐廳用餐信息表,針對python的groupby和可視化函數進行了實操練習,給出了小費狂魔的畫像。
其中涉及到數據清洗以及groupby、散點圖、箱線圖等方法的調用,希望對你有幫助。