kaggle利用RFM模型对电子商务数据在线零售商的实际交易数据分析
import numpy as np
import pandas as pd
import warnings
warnings.filterwarnings('ignore') #忽略警告信息
import matplotlib.pyplot as plt
import seaborn as sns
import os
#下面是可视化库
import plotly as py
import plotly.graph_objs as go
pyplot = py.offline.iplot
py.offline.init_notebook_mode()
os.chdir('C:\\Users\\asus\\Desktop\\七天成为数据分析师\\数据集\\data') #表示定位到需要的文件夹
data = pd.read_csv('', encoding = 'ISO-8859-1', dtype = {'CustomerID': str})
data.shape #显示数据的行数和列数
#数据处理
data.info() #显示数据的基本信息,查看是否存在缺失值
data.apply(lambda x: sum(x.isnull()) / len(x), axis = 0) #sum(()) / len(x)表示缺失率,axis=0表示沿着纵向进行检索(对每一列进行操作)
data.drop(['Description'], axis = 1, inplace = True)
#drop函数为删除函数,因为Description为产品描述信息,对我们的分析无影响,因此把其删掉,axis=1表示沿着横向进行检索(对每一行进行操作)
data['CustomerID'] = data['CustomerID'].fillna('U') #fillna表示用某些值对缺失的数据进行填充,这里我把缺失的用户名用U进行填充
data['amount'] = data['Quantity'] * data['UnitPrice'] #消费总额=数量×单价
data['date'] = [x.split(' ')[0] for x in data['InvoiceDate']] #获取年月日
#split(' ')[0]表示以空格为分割符进行分割然后获取第一个元素,for x in data['InvoiceDate']]表示获取时间,相当于列表推导式
data['time'] = [x.split(' ')[1] for x in data['InvoiceDate']] #获取时分
data.drop(['InvoiceDate'], axis = 1, inplace = True)
data['year'] = [x.split('/')[2] for x in data['date']] #获取年
data['month'] = [x.split('/')[0] for x in data['date']] #获取月
data['day'] = [x.split('/')[1] for x in data['date']] #获取日
data[['date', 'year', 'month', 'day']].head() #查看切分后的结果
data['date'] = pd.to_datetime(data['date']) #开始的时候日期的格式为字符型,这里把字符型数据转为日期型数据
data = data.drop_duplicates() #删除重复数据
data.describe() #对数据进行探索,即对数据进行描述性统计(最大、小值,均值等)
data2 = data.loc[data['Quantity'] < 0] #提取出交易数量<0的数据即退款的商品,因为这个会影响均值等不能正确反映出顾客的购买力
data2.shape[0] / data.shape[0] #查看数据异常率
data2['UnitPrice'].groupby(data2['UnitPrice']).count() #查看异常值的单价分类
#数据分析
#退货率=退货金额/消费总额
thl = pd.pivot_table(data2, index = 'year', columns = 'month', values = 'amount', aggfunc = {'amount': np.sum},margins = False)
#pivot_table表示透视图,按照年和月做一个透视图来查看退货率,不同的年对应不同的月的退货金额分别是多少
data3 = data[(data['Quantity'] > 0) & (data['UnitPrice'] > 0)] #有效的订单数
xfze = pd.pivot_table(dat3, index = 'year', columns = 'month', values = 'amount', aggfunc = {'amount': np.sum}, margins = False)
np.abs(thl / xfze) #thl / xfze退货率,abs表示转化为正数
np.abs(thl / xfze).loc['2011'] #提取出2011年的退货率
np.abs(thl / xfze).loc['2011'].mean() #2011年退货率的均值
R_value = data3.groupby('CustomerID')['date'].max()#根据用户名进行分组看顾客最大的购买日期是多少(最近消费时间)
R_value = (data3['date'].max() - R_value).dt.days
#data3['date'].max()参考时间,R_value最近消费时间,表示把days提取出去,整个式子表示顾客最近一次消费时间距参考时间的长度
F_value = data3.groupby('CustomerID')['InvoiceNo'].nunique()#根据用户名进行分组再对订单编号进行去重然后统计订单个数即客户消费频次
M_value = data3.groupby('CustomerID')['amount'].sum()#每个客户的消费总额
R_value.describe()
sns.set(style = 'darkgrid') #建立画布,style表示背景色,只能为white, dark, whitegrid, darkgrid, ticks
plt.hist(R_value, bins = 30) #hist表示直方图,bins表示有多少个柱状
plt.title('R_value', fontsize = 18)
plt.show()