Python数据分析数据分析

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

2019-05-16  本文已影响21人  NXLLno

分析内容

针对台北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的销售量和评分没有相关性。

上一篇 下一篇

猜你喜欢

热点阅读