klook

#导入库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams['font.sans-serif']=['simhei']#用来正常显示中文标签P
from datetime import datetime
df=pd.read_csv('kelu.csv')

数据初识

df.info()#基本信息:数据包含16年-19年,共8k多行数据
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 8757 entries, 0 to 8756
Data columns (total 6 columns):
 #   Column     Non-Null Count  Dtype 
---  ------     --------------  ----- 
 0   author     8757 non-null   object
 1   rating     8757 non-null   int64 
 2   time       8757 non-null   object
 3   year       8757 non-null   int64 
 4   amount     8757 non-null   int64 
 5   frequency  8757 non-null   int64 
dtypes: int64(4), object(2)
memory usage: 410.6+ KB
df.head()#注:author为游客 rating为评分 amout为门票价 frequency为次数
authorratingtimeyearamountfrequency
0YOUNG602019/2/2820191101
1SHING YAN1002019/2/2820191101
2Sha602019/2/2820191101
3Mary Mae1002019/2/2820191101
4Maria Cristina1002019/2/2820191101
df.describe()
#基本信息:评分一半以上为100分满分,门票价格110
ratingyearamountfrequency
count8757.0000008757.0000008757.08757.0
mean92.4174952017.760420110.01.0
std14.2311790.6867340.00.0
min20.0000002016.000000110.01.0
25%80.0000002017.000000110.01.0
50%100.0000002018.000000110.01.0
75%100.0000002018.000000110.01.0
max100.0000002019.000000110.01.0

每日销量分析

df['time'] = pd.to_datetime(df['time'],format='%Y/%m/%d')
df.groupby('time')['rating'].count().plot(figsize=(12,4))
plt.xlabel('日期')
plt.ylabel('销量')
plt.title('16-19年每日销量分析')
#整体来看每日销量呈上升趋势,但从18年一月份带18年5月份销量有一次大幅度下滑,猜测原因可能为:台风,运营问题
#16年9月前后,销量较低,每天平均2-3张门票,猜测原因可能为观景台门票刚刚发售,且宣传活动较少
Text(0.5, 1.0, '16-19年每日销量分析')

png

每月销量分析

df['month']= df['time'].values.astype('datetime64[M]') #保留月份精度的日期
df.head()
authorratingtimeyearamountfrequencymonth
0YOUNG602019-02-28201911012019-02-01
1SHING YAN1002019-02-28201911012019-02-01
2Sha602019-02-28201911012019-02-01
3Mary Mae1002019-02-28201911012019-02-01
4Maria Cristina1002019-02-28201911012019-02-01
df.groupby('month')['rating'].count().plot(figsize=(12,4))
plt.xlabel('月份')
plt.ylabel('销售')
plt.title('16~19年每月销量分析')
#从每月销量来看,销量仍呈上升趋势,但自18年一月份到5月份销量存在异常下降,原因猜测为台风或者运营问题导致
Text(0.5, 1.0, '16~19年每月销量分析')

png

用户购买门票数量分析

df.groupby('author')['frequency'].sum().plot.hist(bins=40)
plt.xlim(1,10)
plt.xlabel('用户购买门票数')
plt.ylabel('用户数')
plt.title('用户三年来购买门票数直方图')
#绝大多数即超7000人次数的用户三年仅购买过一次门票
#多次购买用户中,两次购买用户占绝大多数
Text(0.5, 1.0, '用户三年来购买门票数直方图')

png

多次购买用户情况分析

df_f2 = df.groupby('author')['frequency'].sum().reset_index()
print(df_f2.head())
print("max:")
print(df_f2['frequency'].max())
df_f2[df_f2['frequency']>1].groupby('author')['frequency'].sum().plot.hist(bins = 40)
plt.xlabel('用户购买门票数')
plt.ylabel('用户数')
plt.title('多次购买用户情况分析直方图')
#消费两次用户占比较大,用户购买次数最多为18次
               author  frequency
0             wenbiao          1
1   Goh Yu Wen Eunice          1
2            Hui Shan          1
3              Huihui          1
4            KO-CHENG          1
max:
18





Text(0.5, 1.0, '多次购买用户情况分析直方图')

png

多次购买用户的具体人数

df_f2[df_f2['frequency']>1].groupby('frequency')['author'].count()
frequency
2     402
3      99
4      49
5      25
6      13
7       7
8       4
11      1
13      1
15      1
18      1
Name: author, dtype: int64

1-5次购买用户占比分析

df_f5=df.groupby('author')['frequency'].sum().reset_index()
df_f5.head()
values = list(df_f5[df_f5['frequency']<=6].groupby('frequency')['frequency'].sum())
print(values)
plt.pie(values,labels=['购买一次','购买两次','购买三次','购买四次','购买五次','购买六次'],autopct='%1.1f%%')
plt.title('1-5次购买次数用户占比分析饼图')
plt.legend()
# 从图中可以看出,购买一次占比83%,其余2-6次购买次数占比较少
[7119, 804, 297, 196, 125, 78]





<matplotlib.legend.Legend at 0x25f41b69ea0>

png

2-6次购买次数用户占比分析

df_f51=df_f5[df_f5['frequency']>1].reset_index()
df_f51.head()
values = list(df_f51[df_f51['frequency']<=6].groupby('frequency')['frequency'].sum())
print(values)
plt.pie(values,labels=['购买两次','购买三次','购买四次','购买五次','购买六次'],autopct='%1.1f%%')
plt.title('2-6次购买次数用户占比分析饼图')
plt.legend()
[804, 297, 196, 125, 78]





<matplotlib.legend.Legend at 0x25f41c1d6f0>

png

复购率分析

#复购率:一月内消费次数在两次及以上的用户在总消费用户的占比
df.head()
pivot_count = df.pivot_table(index='author',
                             columns='month',
                             values='frequency',
                             aggfunc='count'
).fillna(0)

#消费次数=0,未消费用户,用na表示
#消费次数=1,非复购用户,用0表示
#消费次数>1,为复购用户,用1表示
pivot_count = pivot_count.applymap(lambda x: 1 if x>1 else np.nan if x==0 else 0)
(pivot_count.sum()/pivot_count.count()).plot()
plt.xlabel('时间(月)')
plt.ylabel('百分比(%)')
plt.title('16-19年每月用户复购率')
#16年9月份复购率最高达到了7.5%,然后开始下降,趋于平稳在1.2%
Text(0.5, 1.0, '16-19年每月用户复购率')

png

复购用户人数分析

pivot_count.sum().plot()
plt.xlabel('时间/月')
plt.ylabel('复购人数')
plt.title('16-19年复购人数')
#整体来看,复购人数呈上升趋势
#但是在18年2、3、4、10和19年2月份,复购人数下降明显,为异常信号,需要与业务部门具体分析情况
Text(0.5, 1.0, '16-19年复购人数')

png

回购率分析

#回购率:某月消费的用户,在下个月仍消费的占比
pivot_purchase = df.pivot_table(index='author',
                               columns='month',
                               values='frequency',
                               aggfunc='count').fillna(0)
print(pivot_purchase.head())
len(pivot_purchase.columns)
month               2016-08-01  2016-09-01  2016-10-01  2016-11-01  \
author                                                               
      wenbiao              0.0         0.0         0.0         0.0   
 Goh Yu Wen Eunice         0.0         0.0         0.0         0.0   
 Hui Shan                  0.0         0.0         0.0         0.0   
 Huihui                    0.0         0.0         0.0         0.0   
 KO-CHENG                  0.0         0.0         0.0         0.0   

month               2016-12-01  2017-01-01  2017-02-01  2017-03-01  \
author                                                               
      wenbiao              0.0         0.0         0.0         0.0   
 Goh Yu Wen Eunice         0.0         0.0         0.0         0.0   
 Hui Shan                  1.0         0.0         0.0         0.0   
 Huihui                    0.0         0.0         0.0         0.0   
 KO-CHENG                  0.0         0.0         0.0         0.0   

month               2017-04-01  2017-05-01  ...  2018-05-01  2018-06-01  \
author                                      ...                           
      wenbiao              0.0         0.0  ...         0.0         0.0   
 Goh Yu Wen Eunice         0.0         0.0  ...         0.0         0.0   
 Hui Shan                  0.0         0.0  ...         0.0         0.0   
 Huihui                    0.0         0.0  ...         0.0         0.0   
 KO-CHENG                  0.0         0.0  ...         0.0         0.0   

month               2018-07-01  2018-08-01  2018-09-01  2018-10-01  \
author                                                               
      wenbiao              0.0         0.0         0.0         0.0   
 Goh Yu Wen Eunice         0.0         0.0         0.0         0.0   
 Hui Shan                  0.0         0.0         0.0         0.0   
 Huihui                    0.0         0.0         0.0         0.0   
 KO-CHENG                  1.0         0.0         0.0         0.0   

month               2018-11-01  2018-12-01  2019-01-01  2019-02-01  
author                                                              
      wenbiao              0.0         1.0         0.0         0.0  
 Goh Yu Wen Eunice         0.0         0.0         0.0         0.0  
 Hui Shan                  0.0         0.0         0.0         0.0  
 Huihui                    0.0         0.0         0.0         0.0  
 KO-CHENG                  0.0         0.0         0.0         0.0  

[5 rows x 31 columns]





31
#创建函数,储存每位用户在每月的回购信息
def purchase_return(data):
    status = []
    for i in range(30):
        if data[i]==1:
            if data[i+1]==1:
                status.append(1)
            else:
                status.append(0)
        else:
            status.append(np.nan)
    status.append(np.nan)
    return pd.Series(status,pivot_purchase.columns)
pivot_purchase_return=pivot_purchase.apply(purchase_return,axis=1)#apply对每列数据进行处理
(pivot_purchase_return.sum()/pivot_purchase_return.count()).plot()
plt.title('16年~19年每月的回购率')
plt.xlabel('月份')
plt.ylabel('回购率%')
#回购率最高在18年6月份,达到4%
#整体来看,回购率呈现微弱上升趋势
#出现了几次较大下滑,分别是17年6月份,18年1月份,18年8月份,19年1月份
Text(0, 0.5, '回购率%')

png

回购人数分析

pivot_purchase_return.sum().plot()
plt.title('16年~19年每月的回购人数')
plt.xlabel('月份')
plt.ylabel('回购人数')
print(pivot_purchase_return.sum())
#整体呈现上升趋势,回购人数最多时在18年11月份,人数未17人
#其中有几次回购人数下降较为明显,主要在分别是17年6月份,18年1月份,18年8月份,19年1月份
month
2016-08-01     0.0
2016-09-01     0.0
2016-10-01     0.0
2016-11-01     0.0
2016-12-01     2.0
2017-01-01     1.0
2017-02-01     1.0
2017-03-01     2.0
2017-04-01     2.0
2017-05-01     2.0
2017-06-01     0.0
2017-07-01     3.0
2017-08-01     2.0
2017-09-01     3.0
2017-10-01     3.0
2017-11-01     6.0
2017-12-01     4.0
2018-01-01     2.0
2018-02-01     4.0
2018-03-01     3.0
2018-04-01     2.0
2018-05-01    12.0
2018-06-01    14.0
2018-07-01    11.0
2018-08-01     6.0
2018-09-01    10.0
2018-10-01    12.0
2018-11-01    17.0
2018-12-01     8.0
2019-01-01     8.0
2019-02-01     0.0
dtype: float64

png

每月分层用户占比

#分类:活跃用户、不活跃用户、回流用户、新用户
def active_status(data):
    status = []
    for i in range(31):
        if data[i]==0:
            if len(status)==0:
                status.append('unreg')
            else:
                if status[i-1]=='unreg':
                    status.append('unreg')
                else:
                    status.append('unactive')
        else:
            if len(status)==0:
                status.append('new')
            else:
                if status[i-1]=='unactive':
                    status.append('return')
                elif status[i-1]=='unreg':
                    status.append('new')
                else:
                    status.append('active')
                    
    return pd.Series(status,pivot_purchase.columns)
pivot_purchase_status  =pivot_purchase.apply(active_status,axis=1)
pivot_status_count =pivot_purchase_status.replace('unreg',np.NaN).apply(pd.value_counts)
pivot_status_count.T.plot.area()
#可以看出,红色(不活跃用户)占据网站用户的主体
#橙色(新用户)从17年1月-19年月,呈现上升趋势;但是在18年4月份左右,新用户的量突然急剧下降,异常信号;
#以后,新用户又开始逐渐上涨,回复稳定状态
#绿色(回流用户),一直维持稳定稳定状态,但是在18年2~4月份,出现异常下降情况,异常信号;
<AxesSubplot: xlabel='month'>

png

每月不同用户的占比

return_rate = pivot_status_count.apply(lambda x:x/x.sum())
return_rate.T.plot()
#在17年1月份过后,网站用户主体由不活跃用户组成,新用户占比开始逐渐下降,并且趋于稳定,稳定在10%左右
#活跃用户和会用户,一直很稳定,并且占比较小
#16年9月前后,新用户和不活跃用户,发生较大的变化,猜测:活动或者节假日造成....
<AxesSubplot: xlabel='month'>

png

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值