分析内容
针对台北101门票的销售情况数据,做一些简单的数据分析
- 每天的销售量
- 销售量最高和最低日期分布
- 游客购买次数密度
- 游客购买次数百分比
- 游客复购率
- 按月份游客平均平分情况
- 游客生命周期
- 游客留存率
数据分析
import os
import re
import time
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from datetime import datetime
%matplotlib inline
plt.rcParams['font.serif'] = ['SimHei']
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus']=False
sns.set_style('ticks', {'font.sans-serif':['simhei','Droid Sans Fallback']})
os.chdir(r'D:\python\test\数据分析项目——台北101门票')
df = pd.read_csv('kelu.csv')
df
数据字段有游客姓名、评分、购票时间、年份、票价、频次,
然后再看下各个字段的类型,如果不符合预期,需要先转换
可以发现'time'时间段是字符串格式,不是datetime格式,所以我们需要转换:
df['time'] = pd.to_datetime(df['time'])
第一个分析内容销售量:
result = df.groupby('time').size()
def get_values(x):
return x.index.values, x.values
xindex, vals = get_values(result)
plt.figure(figsize=(20,5))
sns.lineplot(xindex, vals, color=sns.xkcd_rgb['warm blue'])
plt.xlabel('日期', color=sns.xkcd_rgb['reddish'], fontsize=20)
plt.ylabel('门票销售量', color=sns.xkcd_rgb['reddish'], fontsize=20)
plt.title('2016-2019年每天销售量', color=sns.xkcd_rgb['reddish'], pad=10, fontsize=20)
plt.savefig('2016-2019年每天销售量.png')
从图中可以看到从2016-09开始到2018-01销售量都是稳步提升的,但是在2018-01到2018-05这四个月,销售量发生了较明显的下滑,在价格不变的前提下,可能需要从外部因素来探究此次下滑原因。
然后我们再探索下销量最好的Top10和最差的Top10的日期,看看能不能找出规律:
result_max = result.sort_values(ascending=False)
result_min = result.sort_values(ascending=True)
x = pd.PeriodIndex(result_max[:10].index,freq='D')
x2 = pd.PeriodIndex(result_min[:10].index,freq='D')
plt.figure(figsize=(20,5))
plt.subplot(121)
sns.barplot(x, result_max[:10].values, color=sns.xkcd_rgb['warm blue'])
plt.xlabel('日期', fontsize=16)
plt.xticks(rotation=30)
plt.title('每天销量最多Top10的日期', fontsize=16)
for px, py in zip(range(10), result_max[:10].values):
plt.text(px, py+0.3, f'{py}')
plt.subplot(122)
sns.barplot(x2, result_min[:10].values, color=sns.xkcd_rgb['reddish'])
plt.xlabel('日期', fontsize=16)
plt.xticks(rotation=30)
plt.title('每天销量最少Top10的日期', fontsize=16)
for px, py in zip(range(10), result_min[:10].values):
plt.text(px, py+0.01, f'{py}')
从图中可以看到销量最好的日期,集中在2018年年底和2019年年初,也是度假过年的高峰期,而销量最少的日期,均集中在3月和11月,无假期,也是旅游淡季。
下面再来探究下购买次数的密度,看看重复购买门票的游客占比都有多少:
result = df.groupby('author').frequency.count()
bins = []
for x in range(1,result.max()):
bins.append(x)
plt.figure(figsize=(10,5))
sns.distplot(result, bins=bins, kde=False,rug=True, color=sns.xkcd_rgb['yellow tan'])
plt.title('每个游客购买次数的密度统计', fontsize=12)
plt.xlabel('购买频次', fontsize=10)
plt.ylabel('人数', fontsize=10)
由密度图可以直观地看到,购买一次的游客占据了非常大的比例,但仍有少部分游客购买次数达到二次及以上,最高者3年内购买过18次!下面我们换成饼图来看下比例:
from pyecharts import Pie
result2 = df.groupby('author').count().reset_index()
tmp = result2.groupby('frequency').size()[:6]
labels = [str(x)+'次' for x in tmp.index.values]
pie = Pie('购买次数百分比', title_pos='left')
pie.add('', labels, tmp.values, radius=[25,70], is_label_show=True, legend_top='bottom')
pie
由于超过6次的人数占比实在太少,我们只取到6次,发现只购买一次的游客占据了92%,因此台北101的卖票销量是和旅游淡季旺季,假期的多少和时间息息相关的,也没必要为了增加复购率去进行过多的市场推广。
复购率的分析,虽然从上图已经看出复购率没有那么重要,但是这项指标在诸多销售中占有很重要的地位,因此下面也来看一下:
# 添加一列"month",作为复购率的周期性指标
df['month'] = pd.DatetimeIndex(df.time).to_period(freq='M')
# 定义复购率函数,只要在一个月中购买超过1次,就统统计算为1,1次计算为0,0次作NAN值处理
def rebuy(x):
if x > 1:
return 1
elif x == 1:
return 0
else:
return np.NAN
# 得到一张可计算复购率的透视表
tmp = df_pivot.applymap(rebuy)
# 作图的x轴数据,需要转换成“年-月”格式
index2 = pd.Series(tmp.columns.to_timestamp()).apply(lambda x: x.strftime('%Y-%m'))
# 坐标刻度的显示,避免太过密集,看不清
xlist = []
for m in range(0, len(index2), 5):
xlist.append(index2[m])
# 在此图中,复购率=每月复购的人次/每月购买的人次
plt.figure(figsize=(15,10))
plt.subplots_adjust(hspace=0.3)
plt.subplot(211)
sns.lineplot(index2.values, tmp.sum()/tmp.count())
plt.title('游客复购率曲线图', fontsize=15, color=sns.xkcd_rgb['reddish'])
plt.xlabel('月份', fontsize=12, color=sns.xkcd_rgb['reddish'])
plt.ylabel('复购率', fontsize=12, color=sns.xkcd_rgb['reddish'])
plt.xticks(xlist)
plt.subplot(212)
sns.lineplot(index2.values, tmp.sum().astype('i'))
plt.title('每月复购人数', fontsize=15, color=sns.xkcd_rgb['reddish'])
plt.xlabel('月份', fontsize=12, color=sns.xkcd_rgb['reddish'])
plt.ylabel('购买人数', fontsize=12, color=sns.xkcd_rgb['reddish'])
plt.xticks(xlist)
plt.savefig('复购率lineplot.png')
还记得我们最开始统计的每天销售量的图表吗?在2018-01到2018-05月发生了明显的下滑,而在复购人数中也能看到这样的趋势,这五个月间,总体购买人次降低,复购人次也降低,外部一定有因素影响着这五个月,导致数据的明显下滑。
下面我们来分析下每个月的总体评分趋势:
result = df.groupby('month').rating.agg([('平均评分','mean')]).applymap(lambda x: float('%.1f' % x))
index2 = pd.Series(result.index.to_timestamp()).apply(lambda x: x.strftime('%Y-%m'))
xlist = []
for m in range(0, len(index2), 5):
xlist.append(index2[m])
plt.figure(figsize=(10,5))
sns.lineplot(index2, result['平均评分'].values/10, color=sns.xkcd_rgb['reddish'])
plt.title('每月的平均评分', fontsize=15, pad=10)
plt.xlabel('月份', fontsize=15, labelpad=7)
plt.ylabel('平均评分,满分10', fontsize=15,labelpad=10)
plt.xticks(xlist)
plt.savefig('每月的平均评分lineplot.png')
可以看到台北101的整体评价还是非常好的,最低的2017-08月份左右,也有8.6,而大部分时间维持在9.0以上,那么这个评价和销售量,是否有一定的相关性呢?
result2 = df.groupby('month').frequency.count().to_frame()
new_r = result.join(result2)
from scipy import statsg = sns.jointplot(x='平均评分', y='frequency', data=new_r)
g.annotate(stats.pearsonr)
g.savefig('平均评分和销售量的关系.png')
通过上面的散点图可以发现,皮尔逊相关系数只有0.36,呈现弱相关,p<.05,因此信度较高,可以认为,台北101的销售量和评分没有相关性。