数据挖掘03--质量分析

目录

apply()函数和applymap()函数:

1.apply()函数

2.applymap()函数

重复数据:

重复数据的处理:

 缺失值:

判断缺失值:

缺失值处理:

dropna 的主要参数为

 fillna()函数详解:

scikit-learn中SimpleImputer完成缺失值填充:

fit_transform(X)

get_params()

自定义值填补

numpy中reshape函数的几种常见相关用法

 项目案例:

异常值:

3σ原则

 四分位间距 (IQR) (箱形图)

实践:

apply()函数和applymap()函数:

1.apply()函数

apply()函数主要作用是对DataFramed的每一column和每一index执行一个处理函数。先来看看apply()函数的参数。

参数    说明
func    函数参数。该函数会应该在dataframe的每一行或每一列上。
axis    axis=0时,func函数会应用在每个column上。而当axis=1时,func函数会应用在每一index上。
broadcast    
布尔型的可选参数。当为None或False时,会返回一个与原dataframe的column或index长度相同的 Series。 当为True时,会返回一个index和column跟原dataframe相同的dataframe(想当然结果进行了广播)。

在0.23版本以后,这个参数会被替换成 result_type='broadcast'

raw    布尔型。默认为False。当为False时,会将dataframe中的每一个columadn或每一个index上以Series的形式传到函数中。当为True时,则会把数据以np.array的形式传到函数中,如果这个时候func用的就是numpy的函数,则执行效率会非常高。
reduce    布尔型或None,默认为None。当DataFrame为空,reduce为True时,函数会返回Series,当为False时,会返回一个DataFrame。
result_type    
可选值包括以下几种:expand、reduce、broardcast、None。确定返回形式。(0.23.0以后版本才有并且只有当axis=1时这个参数才能发挥作用)

agrs    传递到func中的位置参数
**kwds    传到到func中的关键字参数

2.applymap()函数

applymap()函数的主要作用是对DataFrame中的每一个元素执行一个func函数。applymap()函数中只有一个func参数。

#数据转换时遇到不能转换的数据转为NaN的参数设置,errors=' coerce

pd.to_numeric(df['Jan Units'], errors='coerce')

#df[['Active']]=df[['Active']].replace("Y",1).replace("N",0)

df[['Active']].apply(lambda x:x.replace("Y","1").replace("N","0"))

#任务:将 "Momr" "Day" "ear三个特征的数据合并为个日期类型的特征,

pd.to_datetime(df[['Month', 'Day', 'Year']])

数据质量分析

  • 数据质量分析是数据挖掘中数据准备过程的重要一环,是数据预处理的前提,也是数据挖掘分析结论有效性和准确性的基础,没有可信的数据,数据挖掘构建的模型将是空中楼阁。

  • 数据质量分析的主要任务是检查原始数据中是否存在脏数据,脏数据一般是指不符合要求,以及不能直接进行相应分析的数据。

  • 数据质量分析也叫数据清洗是发现并纠正数据文件中可识别的错误,如移除重复数据,处理缺失值和空格值,检测和过滤异常值,并检查数据一致性等。通过数据清洗不仅要使通过清洗后的数据变得可用,而且还要使数据变得更加适合进行后续的数据分析工作。

在常见的数据挖掘工作中,脏数据包括如下内容

  • □重复数据
  • □缺失值。
  • □异常值。
  • □不一致的值。
  • □重复数据及含有特殊符号(如#、¥、*)的数据。

重复数据:

duplicated()⽅法处理重复值
* duplicated(subset=None,keep=“first”)
*subset:⽤于识别重复的列标签或列标签序列,默认识别所有的列标签。
* keep:删除重复项并保留第⼀次出现的项,取值可以为first、last、False,它们代表意义如下:
*irst:从前向后查找,保留重复数据的第一个。默认为此选项。
*last:从后向前查找,保留重复数据的都输第一个。
* False:所有相同的都标记为重复。
duplicated()⽅法⽤于标记pandas对象的数据是否重复,重复则标记为True,不重复则标记为False,所以该⽅法返回⼀个由布尔值组成的Series对象,它的⾏索引保持不变,数据则变为标记的布尔值

重复数据的处理:

面对重复数据,只有两个选择:删除或者保留。

选择哪一个要视实际情况而定。假如数据量足够大且重复率不很高,删除重复的数据就是一个可选项。

drop_duplicates()函数:

 缺失值:

Python中有一个特殊对象None,它可以用来表示“缺失”“没有”等对象—Python中的“没有”也是对象。

在Numpy中,提供了一种表示"缺失"数据的对象;np.nan或者np.NaN。它可以与数字进行运算,因为它本身就是浮点数类型。

判断缺失值:

df.isna()/isnull()函数:

df.isna().any()

#查看所有列是否有缺失值

缺失值处理:

数据处理中经常需要根据缺失值的大小、比例或其他特征来进行行样本或列特征的删除, pandas 中提供了 dropna 函数来进行操作。

dropna 的主要参数为

轴方向 axis (默认为0,即删除行)
删除方式 how,主要有 any 和 all 两种参数可以选择
删除的非缺失值个数阈值 thresh ( 非缺失值 没有达到这个数量的相应维度会被删除)
备选的删除子集 subset

df1.dropna(thresh=2)    # 非缺失值小于2的删除

 fillna()函数详解:

inplace参数的取值:True、False

  • True:直接修改原对象
  • False:创建一个副本,修改副本,原对象不变(缺省默认)

method参数的取值 : {‘pad’, ‘ffill’,‘backfill’, ‘bfill’, None}, default None

  • pad/ffill:用前一个非缺失值去填充该缺失值
  • backfill/bfill:用下一个非缺失值填充该缺失值

None:指定一个值去替换缺失值(缺省默认这种方式)

limit参数:限制填充个数

axis参数:修改填充方向

  • 以下关于df.fillna(10,inplace=True)语句说法正确的是:
  • A 用10填补缺失值,df不发生改变
  • B 用10填补缺失值,df发生改变
  • C 该语句返回填补缺失值后的df
  • D 该语句的返回值为True

#用指定常数填充

df.fillna(0)

# 用前一个非缺失值填充该缺失值

df['ColA'].fillna(method='ffill',inplace=True)

#用下一个非缺失值填充该对象

df['ColA'].fillna(method='bfill',inplace=True)

scikit-learn中SimpleImputer完成缺失值填充:

处理缺失数据,是数据类项目中经常要执行的操作,在著名的机器学习库scikit-learn中专门为此提供了名为的模块。

from sklearn.impute import SimpleImputer

imp_mean= SimpleImputer(missing_values=np.nan,strategy='mean')

class sklearn.impute.SimpleImputer(*, missing_values=nan, strategy=‘mean’, fill_value=None, verbose=0, copy=True, add_indicator=False)

参数含义

missing_values:int, float, str, (默认)np.nan或是None, 即缺失值是什么。
strategy:空值填充的策略,共四种选择(默认)mean、median、most_frequent、constant。mean表示该列的缺失值由该列的均值填充。median为中位数,most_frequent为众数。constant表示将空值填充为自定义的值,但这个自定义的值要通过fill_value来定义。
fill_value:str或数值,默认为Zone。当strategy == "constant"时,fill_value被用来替换所有出现的缺失值(missing_values)。fill_value为Zone,当处理的是数值数据时,缺失值(missing_values)会替换为0,对于字符串或对象数据类型则替换为"missing_value" 这一字符串。
verbose:int,(默认)0,控制imputer的冗长。
copy:boolean,(默认)True,表示对数据的副本进行处理,False对数据原地修改。
add_indicator:boolean,(默认)False,True则会在数据后面加入n列由0和1构成的同样大小的数据,0表示所在位置非缺失值,1表示所在位置为缺失值。

fit(X)

返回值为SimpleImputer()类,通过fit(X)方法可以计算X矩阵的相关值的大小,以便填充其他缺失数据矩阵时进行使用。

transform(X)

填补缺失值,一般使用该方法前要先用fit()方法对矩阵进行处理。

from sklearn.impute import SimpleImputer
import numpy as np

X = np.array([[1, 2, 3],
             [4, 5, 6],
             [7, 8, 9]])
X1 = np.array([[1, 2, np.nan],
               [4, np.nan, 6],
               [np.nan, 8, 9]])
imp = SimpleImputer(missing_values=np.nan, strategy='mean')
imp.fit(X)
print(imp.transform(X1))

# 运行结果
[[1. 2. 6.]
 [4. 5. 6.]
 [4. 8. 9.]]

#sklearn中默认不支持一维数据输入,当数据为一维时需要使用reshape(1,-1)进行维度增加 

fit_transform(X)

相当于fit() + transform(),一般使用的较多。

X1 = np.array([[1, 2, np.nan],
               [4, np.nan, 6],
               [np.nan, 8, 9]])
imp = SimpleImputer(missing_values=np.nan, strategy='mean')
print(imp.fit_transform(X1))

# 运行结果
[[1.  2.  7.5]
 [4.  5.  6. ]
 [2.5 8.  9. ]]

get_params()

获取SimpleImputer参数信息。

imp = SimpleImputer(missing_values=np.nan, strategy='mean')
print(imp.get_params())

# 运行结果
{'add_indicator': False, 'copy': True, 'fill_value': None, 
'missing_values': nan, 'strategy': 'mean', 'verbose': 0}

 inverse_transform(X)
将数据转换回原始的表示形式。反转对数组执行的转换操作。该操作只能在以add_indicator=True实例化simpleImputer后执行
注意:反变换只能在具有缺失值的二进制指示符的特征中进行反变换。如果一个特征在拟合时没有缺失值,那么该特征就没有二进制指标,变换时的赋值就不会被反向。简单说就是没有替换缺失值,就不存在还原。
 

X1 = np.array([[1, 2, np.nan],
               [4, np.nan, 6],
               [np.nan, 8, 9]])

imp = SimpleImputer(missing_values=np.nan, strategy='mean', add_indicator=True)
X1 = imp.fit_transform(X1)
print(X1)
print(imp.inverse_transform(X1))

# 运行结果
[[1.  2.  7.5 0.  0.  1. ]
 [4.  5.  6.  0.  1.  0. ]
 [2.5 8.  9.  1.  0.  0. ]]
[[ 1.  2. nan]
 [ 4. nan  6.]
 [nan  8.  9.]]

自定义值填补

fill_value自定义。

X = np.array([[1, 2, 3],
             [4, 5, 6],
             [7, 8, 9]])

imp = SimpleImputer(missing_values=1, strategy='constant', fill_value=666)
print(imp.fit_transform(X))
# 运行结果
[[666 2 3]
 [4 5 6]
 [7 8 9]]

 fill_value为默认值Zone

X = np.array([[1, 2, 3],
             [4, 5, 6],
             [7, 8, 9]])

imp = SimpleImputer(missing_values=1, strategy='constant', fill_value=None)
print(imp.fit_transform(X))

# 运行结果
[[0 2 3]
 [4 5 6]
 [7 8 9]]

  • numpy中reshape函数的几种常见相关用法

  • reshape(1,-1)转化成1行:
  • reshape(2,-1)转换成两行:
  • reshape(-1,1)转换成1列:
  • reshape(-1,2)转化成两列
  • reshape(2,8)转化成两行八列

 项目案例:

import pandas as pd
train_data = pd.read_csv("/home/aistudio/data/data154243/train.csv")
train_data.info()   
>>>
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
 #   Column       Non-Null Count  Dtype  
---  ------       --------------  -----  
 0   PassengerId  891 non-null    int64  
 1   Survived     891 non-null    int64  
 2   Pclass       891 non-null    int64  
 3   Name         891 non-null    object 
 4   Sex          891 non-null    object 
 5   Age          714 non-null    float64
 6   SibSp        891 non-null    int64  
 7   Parch        891 non-null    int64  
 8   Ticket       891 non-null    object 
 9   Fare         891 non-null    float64
 10  Cabin        204 non-null    object 
 11  Embarked     889 non-null    object 
dtypes: float64(2), int64(5), object(5)
memory usage: 83.7+ KB

train_data.isna().any()#是否含有缺失值。
>>>
PassengerId    False
Survived       False
Pclass         False
Name           False
Sex            False
Age             True
SibSp          False
Parch          False
Ticket         False
Fare           False
Cabin           True
Embarked        True
dtype: bool

从Out【34】的输出中可以看出,有几个特征下有缺失值。下面研究"Age"特征的缺失值如何填补。能不能用某个指定值?比如平均值等。此法待后续验证,先研究如何用机器学习模型填补缺失值。 如果将"Age"作为样本标签,那么利用哪些特征可以预测它的值呢?此处主观地选择 Fare(船票价格)、Parch(父母孩子在船上的数量)、SibSp(弟姐妹或配偶在船上的数量)、Pclass(客舱等级)几个特征作为自变量。

df = train_data[['Age','Fare', 'Parch', 'SibSp', 'Pclass']]    #可能跟年龄有关的特征
known_age = df[df['Age'].notnull()].values
#known_age
#known_age[:, 0]
X = known_age[:, 1:]
X

>>>
array([[ 7.25  ,  0.    ,  1.    ,  3.    ],
       [71.2833,  0.    ,  1.    ,  1.    ],
       [ 7.925 ,  0.    ,  0.    ,  3.    ],
       ...,
       [30.    ,  0.    ,  0.    ,  1.    ],
       [30.    ,  0.    ,  0.    ,  1.    ],
       [ 7.75  ,  0.    ,  0.    ,  3.    ]])

df = train_data[['Age','Fare', 'Parch', 'SibSp', 'Pclass']]    #可能跟年龄有关的特征
known_age = df[df['Age'].notnull()].values
unknown_age = df[df['Age'].isnull()].values
y = known_age[:, 0]
X = known_age[:, 1:]

from sklearn.ensemble import RandomForestRegressor    # ⑩
rfr = RandomForestRegressor(random_state=0, n_estimators=2000, n_jobs=-1)    # ○11
rfr.fit(X, y)    

pred_age = rfr.predict(unknown_age[:, 1:])    # ○13
pred_age.mean()
>>>
29.438010170664793

⑩引入了随机森林回归模型,准备用它预测缺失值。①创建随机森林回归模型实例。⑫用已知数据进行训练。⑬对含有缺失值的样本进行预测,并用预测结果填充缺失数据

train_data.loc[(train_data.Age.isnull()), 'Age'] = pred_age
train_data.isna().any()
>>>
PassengerId    False
Survived       False
Pclass         False
Name           False
Sex            False
Age            False
SibSp          False
Parch          False
Ticket         False
Fare           False
Cabin           True
Embarked        True
dtype: bool

!mkdir /home/aistudio/external-libraries
!pip install seaborn -t /home/aistudio/external-libraries



import sys
sys.path.append('/home/aistudio/external-libraries')

import sys
sys.path.append('/home/aistudio/external-libraries')

 

 将特征“Age”中的缺失数据填补了。为了直观地查看填补之后对原有数据分布是否造成太大影响,分别对填补前后的数据绘制直方图。

sns.distplot(train_data['Age'])

 

绘制了填补数据前后“Age”数据分布的情况,没有太大的变化,这说明所填补的数据是合乎原数据分布特点的。如果用平均值填充,会是什么结果呢?可以尝试一下 

df_mean = df['Age'].fillna(df['Age'].mean())
sns.distplot(df_mean)

 

异常值:

异常值对模型和预测分析的影响主要有增加错误方差,降低模型的拟合能力;异常值得随机分布会降低正态性;与真实值可能存在偏差;影响回归、方差分析等统计模型的基本假设。

3σ原则

如果数据服从正态分布,在3σ原则下,异常值被定义为一组测定值中与平均值的偏差超过3倍标准差的值。在正态分布的假设下,距离平均值3σ之外的值出现的概率为P( |x-μ| >3σ) ≤0.003,属于极个别的小概率事件。

  如果数据不服从正态分布,也可以用远离平均值的多少倍标准差来描述。

 四分位间距 (IQR) (箱形图)

箱型图提供了识别异常值的一个标准:异常值通常被定义为小于QL-1.5IQR或大于 QU+1.5IQR的值。QL称为下四分位数,表示全部观察值中有四分之一的数据取值比它小; QU称为上四分位数,表示全部观察值中有四分之一的数据取值比它大;IQR称为四分位数间距,是上四分位数QU与下四分位数 QL之差,其间包含了全部观察值的一半。 

 箱型图要求 (如服从某种特定的分布形式),它只是真实直观地表现数据分布 本来面貌;另一方面,箱型图判断异常值的标准以四分位数和 四分位距为基础,四分位数具有一定的鲁棒性:多达25%的数据可以变得任意远而不会很大地扰动四分位数,所以异常值不能对这个标准施加影响。由此可见,箱型图识别异常值的结果比较客观,在识别异常值方面有一定的优越性, 

 sns.boxplot():箱形图

#参数如下:
seaborn.boxplot(x=None, y=None, hue=None, data=None, order=None, hue_order=None, orient=None, color=None, palette=None, saturation=0.75, width=0.8, dodge=True, fliersize=5, linewidth=None, whis=1.5, notch=False, ax=None, **kwargs)

x,y:dataframe中的列名(str)或者矢量数据

data:dataframe或者数组

hue(str):dataframe的列名,按照列名中的值分类形成分类的条形图

palette:调色板,控制图像的色调

order, hue_order (lists of strings):用于控制条形图的顺序

orient:“v”|“h” 用于控制图像使水平还是竖直显示(这通常是从输入变量的dtype推断出来的,此参数一般当不传入x、y,只传入data的时候使用)默认横着放

fliersize:float,用于指示离群值观察的标记大小

whis: 确定离群值的上下界(IQR超过低和高四分位数的比例),此范围之外的点将被识别为异常值。IQR指的是上下四分位的差值。

width: float,控制箱型图的宽度
在这里插入图片描述

  

sns.swarmplot()分簇散点图

分簇散点图 可以理解为数据点不重叠的分类散点图

该函数类似于stripplot(),但该函数可以对点进行一些调整,使得数据点不重叠。

swarmplot()可以自己实现对数据分类的展现,也可以作为盒形图或小提琴图的一种补充,用来显示所有结果以及基本分布情况。

seaborn.swarmplot(x=None, y=None, hue=None, data=None, order=None, hue_order=None, dodge=False, orient=None, color=None, palette=None, size=5, edgecolor='gray', linewidth=0, ax=None, **kwargs)

 x,y,hue:数据字段变量名(如上表,date,name,age,sex为数据字段变量名) 作用:根据实际数据,x,y常用来指定x,y轴的分类名称,

hue常用来指定第二次分类的数据类别(用颜色区分)

data: DataFrame,数组或数组列表 order,

hue_order:字符串列表 作用:显式指定分类顺序,eg. order=[字段变量名1,字段变量名2,...] jitter : float类型,True/1 作用:当数据重合较多时,用该参数做一些调整,也可以设置间距 如,jitter = 0.1 (通俗讲,就是让数据分散开)

dodge:bool 作用:若设置为True则沿着分类轴,将数据分离出来成为不同色调级别的条带, 否则,每个级别的点将相互叠加

orient:方向:v或者h 作用:设置图的绘制方向(垂直或水平), 如何选择:一般是根据输入变量的数据类型(dtype)推断出来。

color:matplotlib 颜色

palette:调色板名称,list类别或者字典 作用:用于对数据不同分类进行颜色区别

size:float 作用:设置标记大小(标记直径,以磅为单位)

edgecolor:matplotlib color,gray 作用:设置每个点的周围线条颜色  

linewidth:float 作用:设置构图元素的线宽度

实践:

 箱型图检测

import seaborn as sns
sns.set(style="whitegrid")
#加载数据集
tips = sns.load_dataset("tips")
tips.sample(5)
#tips为关于顾客给小费的数据集合

 

#用箱线图检查顾客给小费的金额中有没有离群值
sns.boxplot(x="day",y="tip",data=tips,palette="Set3")

 

#显然,特征“Sat”有比较明显的离群数据。因此,如果是餐厅服务员,在周六工作是比较合算的。
#还可更细致地用下面的方式进行分析,观察相对分布状况。
ax = sns.boxplot(x="day",y="tip", data=tips)
ax = sns.swarmplot(x="day",y="tip",data=tips,color=".25")
#周五上班最不合算

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值