av81847305
数据集:https://www.kaggle.com/lakshmi25npathi/online-retail-dataset
为了不花钱买 强行从kaggle上对比着名字和大小找到了这份数据
就是要等待它以20kb/s左右的速度下载
发现我kaggle的账号还是之前上挖掘课的时候注册的dm+学号 且改不了……
字段:
InvoiceNo:订单编号,每笔交易有6个整数,退货订单编号以字母C开头
StockCode:产品编号,由5个整数组成
Description:产品描述
Quantity:产品数量,有负号的表示退货
InvoiceDate:订单日期和时间
UnitPrice:单价(英镑),单位产品的价格
CustomerID:客户编号,由5位数字组成
Country:每个客户所在国家/地区的名称
目标:
建立用户分类RFM模型,对比分析不同用户群体在时间、地区等维度下的交易量和交易金额指标,并根据分析结果提出优化建议
R:最近一次消费时间(最近一次消费到参考时间的时间长度)
F:消费的频次(单位时间内消费了多少次)
M:消费的金额(单位时间内总消费金额)
整理数据:
下载的数据为xlsx格式且文件中有两个表单,所以需要合并成一个csv格式来处理
参考链接:https://blog.csdn.net/WenWu_Both/article/details/70945914
作者:WenWu_Both
出处:http://blog.csdn.net/wenwu_both/article/
版权:本文版权归作者和CSDN博客共有
转载:欢迎转载,但未经作者同意,必须保留此段声明;必须在文章中给出原文链接;否则必究法律责任
第一步,将包含多个sheet的xlsx表格都转为csv文件
alt+f11打开vba编辑窗口 贴入以下代码
Sub SaveToCSVs()
Dim fDir As String
Dim wB As Workbook
Dim wS As Worksheet
Dim fPath As String
Dim sPath As String
fPath = "C:\Users\JiaoTong\Desktop\data\"
sPath = "D:\csvdata\"
fDir = Dir(fPath)
Do While (fDir <> "")
If Right(fDir, 4) = ".xls" Or Right(fDir, 5) = ".xlsx" Then
On Error Resume Next
Set wB = Workbooks.Open(fPath & fDir)
'MsgBox (wB.Name)
For Each wS In wB.Sheets
wS.Copy 'to a new workbook
wS.SaveAs sPath & wB.Name & ".csv", xlCSV
Next wS
wB.Close False
Set wB = Nothing
End If
fDir = Dir
On Error GoTo 0
Loop
End Sub
其中,fPath为存放原始数据(excel文件)的路径,sPath为存放生成数据(csv文件)的路径
第二步,合并多个csv文件
在所在文件夹地址栏中输入cmd打开命令行窗口
执行copy *.csv data.csv
即可将所有csv文件集合生成data.csv
数据清洗:
1、缺失值统计
有比较多缺失值的有description和customerid两个字段
2、缺失值处理
description字段由于是描述商品信息的,与分析无关,所以可以直接删去
#删除对分析无意义的description字段
df.drop(['Description'],axis=1,inplace=True)
customerid空缺较多但对分析有用,对其进行补全
#填充customerID的空缺值
df['Customer ID'] = df['Customer ID'].fillna('U')
#因为这些字段都只有一个缺失值 对整体影响不大 暂且删除
#how:any-只要有空值就删除(默认),all-全部为空值才删除
df = df.dropna(axis=0, how='any')
3、数据类型归一
quantity&price应该改为数值类型,便于之后计算分析
#列的类型都转化为数值型,出错的地方填入NaN,再把NaN的地方补0
df['Quantity'] = df['Quantity'].apply(pd.to_numeric, errors='coerce').fillna(0)
#列的类型都转化为数值型,出错的地方填入NaN,再把NaN的地方补0
df['Price'] = df['Price'].apply(pd.to_numeric, errors='coerce').fillna(0)
#增加合计金额字段便于分析
#Quantity:产品数量,有负号的表示退货
df['amount'] = df['Quantity'] * df['Price']
对时间字段进行处理
在试图用split拆分时间字段时报错了,程序运行只有取split后的list[0]时没问题,取list[1]&list[2]都提示out of range
开始觉得应该是因为有的行这个字段有错,没有可以分割的符号,所以分割完成后只有list[0]
尝试用for+if判断是否为none出了好几次错且吃完饭回来还没跑完
尝试用filter()也大失败
最后想看看都是哪几行有问题就尝试输出异常值(好像是用的df[df['year].str.len() > 4] 不是很好的方法)
发现是当时合并csv时把第二个表的表头也一起加进数据里了,以后记得要把表头删掉……
取指定数字行:df.iloc[0]
df.drop(labels=525461,axis=0,inplace=True)
删掉这行就可以正常split了
#拆分年月日
df['year'] = [x.split('/')[2] for x in df['date']]
df['month'] = [x.split('/')[0] for x in df['date']]
df['day'] = [x.split('/')[1] for x in df['date']]
在写后面的数据分析part的时候发现我把月和日弄反了 出现了第31个月 还是要看仔细……
最后把date的格式变成datetime
df['date'] = pd.to_datetime(df['date'])
4、数值统计找到异常值
观察异常值的特点并分析为何出现这种情况
df2['Price'].groupby(df2['Price']).count()
5、删除重复行
df = df.drop_duplicates()