📮 求内推
👩 个人简介:听障人,96年,计算机专业(本科),从事数据分析工作
🛠 语言与工具:包括但不限于Python、SQL、tableaubi、finebi、powerbi。
💻 期望岗位:数据分析、数据运营、报表开发等(hc偏技术方向)
📍 期望城市:杭州
用户消费行为在各行各业如电商、物流、医疗等非常重要,因此是在数据分析工作中经常接触到,本案例基于某电商2021年12个月的用户消费数据。
数据集:见文章顶部,可直接下载。
编程语言:Python
Python IDE:jupyer notebook
一、导入模块
import pandas as pd
from datetime import datetime as dt
import matplotlib.pyplot as plt
import numpy as np
二、数据基本情况
在正式开始分析前,对手里的数据要有一个基本的理解,例如数据体量,时间范围、字段,数据类型等。这个步骤万万不能省略。(悄悄跟你说,我刚开始那会儿习惯打开excel浏览数据,有没有人跟我一样- -一定要改掉噢...)
1、预览数据
# 读取数据
df = pd.read_excel(r'D:\pythonbag\Datas\order2021.xlsx')
# 数据预览
df.head()

通过预览了解下有哪些字段,这个数据集字段的字面意思上好理解,不过字段尽量用英文(得养成好习惯),稍后会修改列名。
2、数据信息
print(df.info())
# 数据量约10.4w,其中渠道编号有缺失值
# 订单顺序编号的数据类型需要改成object

通过info方法发现有几个小问题,订单顺序编号应该是object,渠道编号有缺失值,这些问题稍后处理。
3、描述统计信息
df.describe().round(2)
# 发现payAmount的min值为负数,有异常值,需要处理

通过describe统计指标可以掌握数据集的分布、集中趋势、离散程度等情况。
count:非缺失值的计数;mean:平均数;min:最小值;25%:第一个四分位数,即25%的数据小于或等于该值;max:最大值;std:标准差。
注意:describe只对数值、时间数据类型起到作用。
通过观察发现付款金额最小值为负数,此处应该为0才对,这个问题稍后处理。
三、数据处理
前面所发现的几个问题都在这个环节进行处理。
1、修改列名
df.columns=['id','orderID','userID','goodsID','orderAmount','payAmount','channelID','platformName','orderDate','payDate','isRefund']
df.head()
来,跟我一起回忆下。修改列名的方法还有哪些...
df.rename(index={...},columns={...})
2、修改数据类型
df['id'] = df['id'].astype('object')
df.info()

3、处理缺失值
df.isnull().sum()
# channelID有8个缺失值,可以直接删除空白所在的记录数据。
df.isnull()返回一个含有布尔值的对象。结合.sum()方法:求出每一列的缺失值数量。(也可以搭配其他方法例如.any()、.count()等等)

# 相当于df.dropna(axis=0,how=any,inplace=True)
df.dropna(inplace=True)
df.isnull().sum()
然后直接删除缺失值所在行,再检查是否还存在缺失值。

4、处理异常值
# 筛选订单金额小于0的数据,用来提取id
ycorder = df.query('payAmount < 0')
ycorder

# 提取异常值数据的索引并删除
ycindex = ycorder.index
print(ycindex) # 输出index的列表
df.drop(ycindex,inplace=True) # 默认删除行即axis=0
# 确认下是否删除成功
ycorder = df.query('payAmount < 0')
print(ycorder) # empty
df.shape

我们来梳理下思路,df.drop(index=[...])是按照index值删除数据块,所以我们想要获取需要删除数据的index是不是还得先筛选这些数据然后才能进行删除。
步骤:筛选需要删除的数据,并获取该数据块的index,再进行删除。
5、处理重复值
# 该代码是指当两条记录所有数据都相等时才是重复的
print(df.duplicated().sum())
# 可以指定某一列查看是否有重复
# print(df[columnname].duplicated().sum())
# 删除重复项
# df.drop_duplicates(colname,keep=['frise'|'last'],inplace=[True|False])
ok,该数据集没有重复值。
6、新增字段(列)
# 解析日期
# 新增paydate1列,只提取日期部分
df['payDate1'] = pd.to_datetime(df['payDate'],format='%Y-%m-%d').dt.date
# series.astype('datetime64[M]')可能会失效,在astype前加个values就好了
df['Month'] = df['payDate1'].values.astype('datetime64[M]') # 控制日期只精确到月份
df['payDate1'] = df['payDate1'].values.astype('datetime64[D]') # 虽然是精确到日,但是也会改变数据类型,把object改成datetime64
df.head()
如果数据集没有你想要的字段,可以自行增加计算字段。
在这个案例中我们要按月进行分析,所以需要提取日期部分,并且控制精确度,方便后续分组汇总计算。

7、筛选数据
数据处理工作基本上结束,最后一个步骤就是筛选需要参与数据分析的数据集。在本案例中,我们只要没有退货的数据集,所以需要剔除已退回的数据。
# 筛选退款为否的数据
ndf = df.query('isRefund == "否"')
ndf.describe()
ndf.info()
# 注意:这个数据框作为后面分析的基础

最后再info确认一遍,一共有90763行数据,数据类型、缺失值等都没问题了。
数据清洗工作到此结束啦~别看就这么点工作量,其实如果在真正的生产环境中,实际数据比想象的要复杂多了。听说,问题明确好后再到处收集数据和清洗数据等,光是这些工作其实在数据分析工作中占到至少50%以上。你想呀,如果数据错了,后面数据分析还有意义吗?都是徒劳的。另外如果你练习多了会发现数据分析基本上都是那几套方法,熟悉起来后上手比较快,只是解决问题稍微费时费脑子罢了。所以数据清洗环节是非

最低0.47元/天 解锁文章
1273

被折叠的 条评论
为什么被折叠?



