以下练习数据来源均为seaborn库中提供,通过网络获取,如果出现网络获取慢或者失败的情况,可以到GitHub上搜索seaborn-data,下载后传入读取路径即可
代码语言:javascript复制from matplotlib import pyplot as plt
import seaborn as sns
航班乘客变化分析
代码语言:javascript复制data = sns.load_dataset("flights")
data.head()
分析年度乘客总量变化情况
按年度进行分组,并统计每个分组的总和数据
代码语言:javascript复制year_data = data.groupby(by=['year']).sum()
plt.plot(year_data.index, year_data['passengers'], color='red', linewidth=1.5, linestyle='-', marker='.')
plt.title('Annual change graph')
plt.xlabel('Year')
plt.ylabel('Passengers')
plt.legend(['Annual'],)
plt.grid(True)
plt.show()
图中可以看出,从1949年-1960年的乘机人数来看,航空业发展迅速
分析乘客在一年中各月份的分布
按月度进行分组,并统计每个分组的总和数据
代码语言:javascript复制month_data = data.groupby(by=['month']).sum()
plt.figure(figsize=(10,5))
plt.bar(month_data.index, month_data['passengers'], color='blue', alpha = 0.8)
plt.title('Annual change graph')
plt.xlabel('Month')
plt.ylabel('Passengers')
plt.ylim([0, 5000])
plt.xticks(list(month_data.index), list(month_data.index), rotation=60)
for x, y in zip(month_data.index, month_data['passengers']):
plt.text(x, y 100, '%s' % y, ha='center')
plt.legend(['Annual'], loc='upper left')
plt.show()
图中可以看出,每年的七八月份是人数最多的
鸢尾花花型尺寸分析
代码语言:javascript复制data = sns.load_dataset("iris", data_home='./seaborn-data')
data.head()
萼片(sepal)和花瓣(petal)的大小关系
要计算萼片和花瓣大小关系,我们是知道萼片长宽及花瓣长宽的,最简单的计算方式:长*宽
代码语言:javascript复制# 萼片大小
sepal = data['sepal_length'] * data['sepal_width']
# 花瓣大小
petal = data['petal_length'] * data['petal_width']
plt.scatter(sepal, petal)
plt.xlabel('sepal')
plt.ylabel('petal')
plt.show()
图中可以看出,萼片大小与花瓣大小基本成正相关关系,图上还可以看到有特殊情况出现
不同种类(species)鸢尾花萼片和花瓣的大小关系
上面是对所有花的数据进行对比,不是很严谨,我们需要按花的类型进行分类后,再看每个分类里面的萼片与花瓣大小关系
代码语言:javascript复制# 取出类型
species = data.species.unique()
# 每种类型定义不同颜色
colors = ['steelblue', '#9999ff', '#ff9999']
for i, spec in enumerate(species):
# 按类型取出花的数据,并计算大小
items = data[(data['species'] == spec)]
sepal = items['sepal_length'] * items['sepal_width']
petal = items['petal_length'] * items['petal_width']
plt.scatter(sepal, petal, c=colors[i], label=spec)
plt.xlabel('sepal')
plt.ylabel('petal')
plt.legend(loc='upper left')
plt.show()
这幅图就很明确的可以看出,萼片与花瓣大小不成正比的花是同一类型,而其他两类都是成正相关关系
餐厅消费情况分析
代码语言:javascript复制data = sns.load_dataset("tips", data_home='./seaborn-data')
data.head()
# 总消费,小费,性别,吸烟与否,就餐星期,就餐时间,就餐人数
小费和总消费之间的关系
代码语言:javascript复制plt.scatter(data['total_bill'], data['tip'])
plt.xlabel('total_bill')
plt.ylabel('tip')
从图上可以看出,总消费和小费之间基本成正相关关系,即总消费高,小费给的也多一些
男性顾客和女性顾客,谁更慷慨
按照性别分组,展示小费数量
代码语言:javascript复制tips = []
sexs = []
for sex, items in data.groupby(by=['sex']):
sexs.append(sex)
tips.append(items['tip'])
plt.boxplot(x=tips, patch_artist=True, labels=sexs, showmeans=True, medianprops = {'linestyle':'--','color':'orange'})
plt.show()
从图上可以看出男女顾客在小费的平均值上相差不大,但是男女顾客中都存在小费给的比较高的情况,这方面男性顾客要更慷慨一些
抽烟与否是否会对小费金额产生影响
按照是否吸烟分组,展示小费数量
代码语言:javascript复制tips = []
smokers = []
for smoker, items in data.groupby(by=['smoker']):
smokers.append(smoker)
tips.append(items['tip'])
plt.boxplot(x=tips, patch_artist=True, labels=smokers, showmeans=True, medianprops = {'linestyle':'--','color':'orange'})
plt.show()
从图中可以看出,平均小费金额上吸烟顾客要给的高一点,但是特例情况中不吸烟的顾客给高小费的情况要比吸烟的顾客多
工作日和周末,什么时候顾客给的小费更慷慨
按照工作日分组,展示小费数量
代码语言:javascript复制work_day = ['Mon', 'Tue', 'Wed', 'Thur', 'Fri']
# 增加一个是否工作日的记录
data['work'] = data['day'].isin(work_day)
data.head()
代码语言:javascript复制tips = []
works = []
for work, items in data.groupby(by=['work']):
works.append(work)
tips.append(items['tip'])
plt.boxplot(x=tips, patch_artist=True, labels=works, showmeans=True, medianprops = {'linestyle':'--','color':'orange'})
从图中可以看出,周末小费给的更多一些,当然也可以是因为消费人多,毕竟周内大家都上班呢
午饭和晚饭,哪一顿顾客更愿意给小费
按照就餐时间分组,统计小费情况
代码语言:javascript复制tips = []
times = []
for time, items in data.groupby(by=['time']):
times.append(time)
tips.append(items['tip'])
plt.boxplot(x=tips, patch_artist=True, labels=times, showmeans=True, medianprops = {'linestyle':'--','color':'orange'})
很明显晚餐的时候人们更愿意给小费,应该是晚餐的时候人们就餐时间长一些,所以更愿意给小费
就餐人数是否会对慷慨度产生影响
按照就餐人数分组,统计小费情况,因为数据当中就餐人数比较少,所以直接分组,如果人数变化大,可以先按照区间进行分组统计
代码语言:javascript复制tips = []
sizes = []
for size, items in data.groupby(by=['size']):
sizes.append(size)
tips.append(items['tip'])
plt.boxplot(x=tips, patch_artist=True, labels=sizes, showmeans=True, medianprops = {'linestyle':'--','color':'orange'})
plt.show()
从图上可以看出,随着就餐人数的增多,给予的小费也相对多了
性别 抽烟的组合因素对慷慨度的影响
按照性别和抽烟分组,统计小费情况
代码语言:javascript复制tips = []
groups = []
for group, items in data.groupby(by=['sex', 'smoker']):
groups.append(group)
tips.append(items['tip'])
plt.boxplot(x=tips, patch_artist=True, labels=groups, showmeans=True, medianprops = {'linestyle':'--','color':'orange'})
plt.show()
从图中可以看出,男性抽烟和女性抽烟者均比同性别不抽烟的顾客给的小费多,女性抽烟者甚至比男性不抽烟者给的多,但是在高端小费领域男性不抽烟者就比较大气慷慨了
今天先到这里,明天我们在分析一下泰坦尼克号海难幸存者状况