分析內容
針對臺北101門票的銷售情況數(shù)據(jù),做一些簡單的數(shù)據(jù)分析
- 每天的銷售量
- 銷售量最高和最低日期分布
- 游客購買次數(shù)密度
- 游客購買次數(shù)百分比
- 游客復購率
- 按月份游客平均平分情況
- 游客生命周期
- 游客留存率
數(shù)據(jù)分析
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\數(shù)據(jù)分析項目——臺北101門票')
df = pd.read_csv('kelu.csv')
df
數(shù)據(jù)字段有游客姓名、評分贴唇、購票時間秦陋、年份灾梦、票價野舶、頻次,
然后再看下各個字段的類型巾遭,如果不符合預期肉康,需要先轉換
可以發(fā)現(xiàn)'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銷售量都是穩(wěn)步提升的吼和,但是在2018-01到2018-05這四個月涨薪,銷售量發(fā)生了較明顯的下滑,在價格不變的前提下炫乓,可能需要從外部因素來探究此次下滑原因刚夺。
然后我們再探索下銷量最好的Top10和最差的Top10的日期,看看能不能找出規(guī)律:
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月莽红,無假期,也是旅游淡季卒茬。
下面再來探究下購買次數(shù)的密度船老,看看重復購買門票的游客占比都有多少:
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('每個游客購買次數(shù)的密度統(tǒng)計', fontsize=12)
plt.xlabel('購買頻次', fontsize=10)
plt.ylabel('人數(shù)', fontsize=10)
由密度圖可以直觀地看到咖熟,購買一次的游客占據(jù)了非常大的比例圃酵,但仍有少部分游客購買次數(shù)達到二次及以上,最高者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('購買次數(shù)百分比', title_pos='left')
pie.add('', labels, tmp.values, radius=[25,70], is_label_show=True, legend_top='bottom')
pie
由于超過6次的人數(shù)占比實在太少郭赐,我們只取到6次,發(fā)現(xiàn)只購買一次的游客占據(jù)了92%确沸,因此臺北101的賣票銷量是和旅游淡季旺季捌锭,假期的多少和時間息息相關的,也沒必要為了增加復購率去進行過多的市場推廣罗捎。
復購率的分析观谦,雖然從上圖已經(jīng)看出復購率沒有那么重要,但是這項指標在諸多銷售中占有很重要的地位桨菜,因此下面也來看一下:
# 添加一列"month"豁状,作為復購率的周期性指標
df['month'] = pd.DatetimeIndex(df.time).to_period(freq='M')
# 定義復購率函數(shù),只要在一個月中購買超過1次倒得,就統(tǒng)統(tǒng)計算為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軸數(shù)據(jù)泻红,需要轉換成“年-月”格式
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('每月復購人數(shù)', fontsize=15, color=sns.xkcd_rgb['reddish'])
plt.xlabel('月份', fontsize=12, color=sns.xkcd_rgb['reddish'])
plt.ylabel('購買人數(shù)', fontsize=12, color=sns.xkcd_rgb['reddish'])
plt.xticks(xlist)
plt.savefig('復購率lineplot.png')
還記得我們最開始統(tǒng)計的每天銷售量的圖表嗎?在2018-01到2018-05月發(fā)生了明顯的下滑菩彬,而在復購人數(shù)中也能看到這樣的趨勢缠劝,這五個月間潮梯,總體購買人次降低,復購人次也降低惨恭,外部一定有因素影響著這五個月酷麦,導致數(shù)據(jù)的明顯下滑。
下面我們來分析下每個月的總體評分趨勢:
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')
通過上面的散點圖可以發(fā)現(xiàn)氓鄙,皮爾遜相關系數(shù)只有0.36馆揉,呈現(xiàn)弱相關,p<.05抖拦,因此信度較高升酣,可以認為,臺北101的銷售量和評分沒有相關性态罪。