import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df= pd.read_csv( r"./data/kz.csv",sep=',')
该数据包含2020年4月至2020年11月从大型家用电器和电子产品在线商店购买的数据。
df.shape
df.info()
df.head()
# 对比每一列数据大小,判断有无缺失值
df.isnull().any()
# 因为数据较大,删除掉缺失数据
df=df.dropna()
# 判断有无重复值
df.duplicated()
# 删除重复值
df=df.drop_duplicates()
df.shape
df.describe()
# 修改时间列数据类型 预计时间:5~6分钟
df['event_time']=df['event_time'].apply(pd.to_datetime)
df['month'] = df.event_time.values.astype('datetime64[M]')
df.info()
df_month=df.groupby(['month'])
用户数量变化趋势同消费总额变化趋势较为一致
上下两图对比可知,在4到8月两图总体呈上升变化,均在8月份达到最高值,而后开始显现下滑趋势。
特别关注点在7月份,两图中,7月皆为拐点位置。图一中7月后增势更加明显,图二中7月后消费人数增长减缓。两者结合可知,7月用户购买单价有所提高。
在用户数量上,三星一枝独秀,遥遥领先于其他品牌。接近为苹果用户数的三倍,而两者销售额约6%,可见苹果人均用户消费远大于三星用户人均消费。 另外上述两幅图数据变化趋势,明显也满足二八原则。
df_=df.copy()
df_.index=df_['event_time']
df_user=df_["2020-04":"2020-11"].groupby('user_id')
df_user.sum().describe()
df_user.count().describe()
用户平均消费1117元,50%用户消费447元,差距较大。说明大部分用户消费较低,小部分用户发生了高消费。
根据用户分组计数后的描述性统计结果,共有89195位客户.结合上图,可知: 50%客户仅贡献了约10%的消费金额;8万名累计消费总额占比仍未超过一半,累计占比约为45%。
用户第一次购买集中在4月份,之后4月末出现剧烈波动,骤然下滑。
7至9月,新客每天稳步增长;10月,11月两月新客较少;整体新客数量呈现下滑趋势。
用户最后一次购买集中在7月中旬至9月中旬,4月至7月客户流失较少。
user_life=df_user.event_time.agg(['min','max'])
user_life.head()
(user_life['min']==user_life['max']).value_counts()
rfm=df_["2020-04":"2020-11"].pivot_table(index='user_id'
,values=['price','event_type','event_time']
,aggfunc={'price':'sum','event_type':'count','event_time':'max'}
)
rfm.head()
rfm['R']=-(rfm.event_time-rfm.event_time.max())/np.timedelta64(1,'D')
rfm.head()
rfm.rename(columns={'event_type':'F','price':'M'},inplace=True)
rfm['label'] = rfm[['R','F','M']].apply(lambda x:x-x.mean()).apply(rfm_func,axis=1)
rfm
rfm.groupby('label').agg(['sum','mean','count'])
rfm.head()
((user_life['max']-user_life['min'])/np.timedelta64(1,'D')).describe()