基于《python数据分析与数据运营》的总结与部分代码修正
缺失值的处理
整体思路:找到缺失值——分析缺失值在整体样本中分布占比及是否具有显著的无规律分布特征——后续使用的模型中是否能满足缺失值的自动处理——采用哪种处理方式
1.丢弃
缺失值超过总体的10%以及存在明显数据分布规律或特征的不宜丢弃
2.补全
统计法:对于数值型数据使用均值、加权均值、中位数等方法补全;对于分类数据使用类别众数最多的值补足
模型法:将缺失西段作为目标变量进行预测得到最为可能的补全值。带有缺失值的列是数值变量,采用回归模型补全;分类变量,采用分类模型补全。
专家补全
其他方法:随机法、特殊值法、多重填补等
3.真值转换法
无法采用上述方法,或认为数据缺失也是一种规律,不应该轻易对缺失值随意处理。
把数据缺失也视为数据分布规律的一部分
4.不处理
这种主要看后期的数据分析和建模应用,很多模型对于缺失值有容忍度或灵活的处理方法,因此在预处理阶段可以不作处理。
常见的能够自动处理缺失值的模型包括:KNN、决策树和随机森林、神经网络和朴素贝叶斯、DBSCAN(基于密度的带有噪声的空间聚类)
KNN:忽略,缺失值不参与距离计算
决策树及其变体:将缺失值作为分布的一种状态并参与到建模过程
DBSCAN:不基于距离做计算,因此基于值的距离做计算,本身的影响就消除。
代码实操
sklearn.impute中的SimpleImputer类、pandas、numpy
import pandas as pd
import numpy as np
from sklearn.impute import SimpleImputer
df=pd.DataFrame(np.random.randn(6,4),columns=['col1','col2','col3','col4'])#生成一份数据
df.iloc[1:2,1]=np.nan#增加缺失值
df.iloc[4,3]=np.nan#增加缺失值
nan_all=df.isnull()#获取数据框中所有N值
nan_col1=df.isnull().any()#获取含有NA的列
nan_col2=df.isnull().all()#获取全部为NA的列
df2=df.dropna()#直接丢弃含有NA的行记录
#使用sklearn将缺失值替换为特定值
nan_model=SimpleImputer(missing_values=np.nan,strategy='mean')#建立规则将NaN用均值代替
nan_result=nan_model.fit_transform(df)
#使用Pandas将缺失值替换为特定值
nan_result_pd1=df.fillna(method='backfill')#用后面的值替换缺失值
nan_result_pd2=df.fillna(method='bfill',limit=1)#用后面的值替换缺失值,限制每列只能替换一个缺失值
nan_result_pd3=df.fillna(method='pad')#用前面的值替换缺失值
nan_result_pd4=df.fillna(0)#用0替换缺失值
nan_result_pd5=df.fillna({'col2':1.1,'col4':1.2})#用不同值替换不同列的缺失值
nan_result_pd6=df.fillna(df.mean()['col2':'col4'])#用平均数代替,选择各列的均值替换缺失值
异常值的处理
不要轻易抛弃异常数据
伪异常:由于业务特定运营动作产生,正常反应业务状态而不是数据本身的异常规律
真异常:并不是由特定业务动作引起的,而是客观的反映了数据本省分布异常的个案
无需对异常值进行处理的情景:
1.异常值正常反映了业务运营结果
2.异常检测模型
3.包容异常值的数据建模(例如决策树,异常值本身就可以当做一种分裂结点)
代码实操
处理异常值的方式:
Z标准化得到的阈值作为判断标准:当标准化后得分超过阈值则为异常。
import pandas as pd
df=pd.DataFrame({'col1':[1,120,3,5,2,12,13],
'col2':[12,17,31,53,22,32,43]})
#通过Z-Score方法判断异常值
df_zscore=df.copy()#复制一个用来存储Z-Score得分的数据框
cols=df.columns#获得数据框的列名
for col in cols:#循环读取每列
df_col=df[col]
z_score=(df_col-df_col.mean())/df_col.std()#计算每列的Z-Score得分
df_zscore[col]=z_score.abs()>2.2#判断Z-Score得分是否大于2.2,如果是则为True,否则为False
print(df_zscore)
对于有固定业务规则的可直接套用业务规则,对于没有固定业务规则的可以采用常见的数学模型进行判断,如基于概率分布的模型(例如正态分布的标准差范围)、基于聚类的方法(例如KMeans)、基于密度的方法(例如LOF)、基于分类的方法(例如KNN)、基于统计的方法(例如分位数法)等。
重复值处理
慎重去重的情景:
1.重复的记录用于分析演变规律
2.重复的记录用于样本不均衡处理
开展分类数据建模工作时,样本不均衡是影响分类模型效果的关键因素之一,解决分类方法的一种方法是对少数样本类别做简单过采样,通过随机过采样采取简单复制样本的策略来增加少数类样本。这样处理之后会产生相同记录的多条数据,此时不能对其中重复值进行处理。
3.重复的记录用于检测业务规则问题
对于以分析应用为主的数据集来说,存在重复记录不会直接影响实际运营;
对于事务型的数据来说,重复数据可能意味着重大运营规则问题,尤其当这些重复值出现在与企业经营中金钱相关的业务场景中,例如重复的订单、重复的充值、重复的预约项、重复的出库申请
代码实操
import pandas as pd
new_df1=df.drop_duplicates()#删除数据记录中所有列值相同的记录
new_df2=df.drop_duplicates(['col1'])#删除数据记录中col1值相同的记录
new_df3=df.drop_duplicates(['col2'])#删除数据记录中col2值相同的记录
new_df4=df.drop_duplicates(['col1','col2'])#删除数据记录中指定列(col1/col2)值相同的记录