python数据分析项目——台北101门票销售情况(一)

分析内容

针对台北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
1.png

数据字段有游客姓名、评分、购票时间、年份、票价、频次,
然后再看下各个字段的类型,如果不符合预期,需要先转换


2.png

可以发现'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-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}')
销量Top10.png

从图中可以看到销量最好的日期,集中在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)
每个游客购买次数的密度统计.png

由密度图可以直观地看到,购买一次的游客占据了非常大的比例,但仍有少部分游客购买次数达到二次及以上,最高者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
购买次数百分比pie.png

由于超过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')
复购率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')
每月的平均评分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')
平均评分和销售量的关系.png

通过上面的散点图可以发现,皮尔逊相关系数只有0.36,呈现弱相关,p<.05,因此信度较高,可以认为,台北101的销售量和评分没有相关性。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,783评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,360评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,942评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,507评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,324评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,299评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,685评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,358评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,652评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,704评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,465评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,318评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,711评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,991评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,265评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,661评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,864评论 2 335

推荐阅读更多精彩内容

  • 一、报告背景:2018年8月7日,境外[旅游]服务商KLOOK客路旅行已获D轮融资,成为全球旅游活动领域融资金额最...
    Hill_GM阅读 2,983评论 4 12
  • (一丿猕猴桃 祥雲缭绕舞蹁跹,宝殿灵霄聚上仙。 借问普天何果异?新吴软枣味奇鲜。 注:软枣,猕猴桃品种之一。 (二...
    追风的树叶阅读 689评论 0 0
  • 女人是愛浪漫的。 自打有了孩子,每年特殊的日子。他幾乎就很少記起,因此也就很少祝福。 記憶中,僅僅只有那麼幾次。而...
    薛静春阅读 209评论 2 0
  • 你在苍穹中 独守一份洁净 无人懂得 出污泥而不染的艰辛和伤痛 只是为了不负己心的本性 你有着万丈柔情 藕可断,情丝...
    水墨故事阅读 374评论 0 1
  • 阅读及笔记时间:2016年10月26日,20:30-22:30;2小时; 阅读书本:《狡猾的情感》,作者:【以】埃...
    时空山庄阅读 613评论 0 1