数据挖掘:也就是data mining,是一个很宽泛的概念,字面意思就是从大型数据存储库中挖掘有用的信息。
数据挖掘是统计学,机器学习,数据库三者的统一。它利用的思想有:
(1)统计学的抽样、估计、假设检验;
(2)人工智能、机器学习的算法、建模技术和理论;
(3)此外需要数据库提供有效的存储、索引、查询等处理支持。
之后的数据挖掘学习就分这几部分去学习:
数据预处理,关联分析,回归分析,分类,聚类,预测,诊断
在开始数据挖掘六大任务之前的,先了解数据预处理相关知识。
由于数据挖掘的数据基本来自生产、生活、商业中的实际数据,现实中我们采集到的数据往往存在:不正确、不完整、不一致这三个问题。因此需要提高数据质量,满足数据挖掘的需要。
数据预处理一般就四种:
数据清洗
用来清除数据中的噪声,纠正不一致。一般包括缺失值处理和异常值处理。
一、缺失值的处理:
总的来说分删除法和插补法
判断是否有缺失值:isnull(缺失True)、notnull(缺失False)
结合bool索引筛选不为空的数据:df[df['col1'].notnull()]
删除缺失值:df.dropna( )
填充缺失值:df.fillna()填充缺失值
替换缺失数据:df.replace()
缺失值插补-均值mean/中位数median/众数mode
临近值插补:method参数:pad / ffill → 用之前的数据填充,backfill / bfill → 用之后的数据填充
(1)删除法:删除存在缺失值的记录(仅当样本量很大且缺失值记录所占样本比例<5%时可行)
# 判断是否有缺失值数据 - isnull,notnull
df = pd.DataFrame({'value1':[12,33,45,23,np.nan,np.nan,66,54,np.nan,99,190],
'value2':['a','b','c','d','e',np.nan,np.nan,'f','g',np.nan,'g']})
print(df.notnull()) # Dataframe直接判断是否是缺失值,返回一个两列的Series
print(df['value1'].notnull()) # 通过索引判断
# 删除缺失值 - dropna
s = pd.Series([12,33,45,23,np.nan,np.nan,66,54,np.nan,99])
df = pd.DataFrame({'value1':[12,33,45,23,np.nan,np.nan,66,54,np.nan,99,190],
'value2':['a','b','c','d','e',np.nan,np.nan,'f','g',np.nan,'g']})
s.dropna(inplace = True) # 5.26发现可以这样写:s[s>0]
df2 = df['value1'].dropna()
(2)插补法:对称数据可以使用均值,倾斜数据应该使用中位数。
# 填充/替换缺失数据 - fillna、replace
s = pd.Series([12,33,45,23,np.nan,np.nan,66,54,np.nan,99])
s.fillna(0,inplace = True)
s.replace(np.nan,'缺失数据',inplace = True)
# 缺失值插补
# 几种思路:均值/中位数/众数插补、临近值插补、插值法
# 1)均值/中位数/众数插补
s.fillna(s.mean(),inplace = True) # 用均值填补,s.median() # 中位数
s.replace(np.nan,s.mean(),inplace = True)
# 2)临近值插补
s.fillna(method = 'ffill',inplace = True) # 用前值插补
# method参数:# pad / ffill → 用之前的数据填充 # backfill / bfill → 用之后的数据填充
二、异常值处理方法
异常值是指样本中的个别值,其数值明显偏离其余的观测值。异常值也称离群点,异常值的分析也称为离群点的分析。
异常值分析:
3σ原则:数据服从正态分布,异常值被定义为一组测定值中与平均值的偏差超过3倍的值 → p(|x - μ| > 3σ) ≤ 0.003 error=data[np.abs(data-u)>3*std]
箱型图:dat.plot.box()借助describe函数计算分位差IQR,下限mi=q1-1.5*iqr,上限ma=q3+1.5*iqrerror = data[(data < mi) | (data > ma)]
散点图:利用散点图观察异常点位置
(1)、3σ原则:如果数据服从正态分布,异常值被定义为一组测定值中与平均值的偏差超过3倍的值 → p(|x - μ| > 3σ) ≤ 0.003
data = pd.Series(np.random.randn(10000)*100) # 创建数据
u = data.mean() # 计算均值
error = data[np.abs(data - u) > 3*std] # 筛选出异常值error
data_c = data[np.abs(data - u) <= 3*std] # 剔除异常值之后的数据data_c
print('异常值共%i条' % len(error))
(2)、箱型图分析
s = data.describe()
q1 = s['25%']
q3 = s['75%']
iqr = q3 - q1 # # 计算分位差
mi = q1 - 1.5*iqr
ma = q3 + 1.5*iqr
print('分位差为:%.3f,下限为:%.3f,上限为:%.3f' % (iqr,mi,ma))
ax2 = fig.add_subplot(2,1,2)
error = data[(data < mi) | (data > ma)] # 筛选出异常值error
data_c = data[(data >= mi) & (data <= ma)]
print('异常值共%i条' % len(error)) # 剔除异常值之后的数据data_c
数据集成
将数据由多个数据源合并成一个一致的数据存储,减少数据集的冗余和不一致,去除重复。
数据规约
删除冗余特征或聚类降低数据的规模,仍接近原始数据的完整性。
数据变换
数据变化是将数据由一种表现形式变为另一种表现形式。常见的数据变换方式是:数据标准化、数据离散化、语义转换。
0-1标准化 将数据的最大最小值记录下来,并通过Max-Min作为基数(即Min=0,Max=1)进行数据的归一化处理 x = (x - Min) / (Max - Min)
Z-score标准化z=(x-μ)/σ,其中x为某一具体分数,μ为平均数,σ为标准差Z值的量代表着原始分数和母体平均值之间的距离,有正负。在分类、聚类算法中,需要使用距离来度量相似性的时候,Z-score表现更好
(1)数据标准化
0-1标准化:
# 将数据的最大最小值记录下来,并通过Max-Min作为基数(即Min=0,Max=1)进行数据的归一化处理
# x = (x - Min) / (Max - Min)
Z-score标准化:
# Z分数(z-score),是一个分数与平均数的差再除以标准差的过程 → z=(x-μ)/σ,其中x为某一具体分数,μ为平均数,σ为标准差
# Z值的量代表着原始分数和母体平均值之间的距离,是以标准差为单位计算。在原始分数低于平均值时Z则为负数,反之则为正数
# 数学意义:一个给定分数距离平均数多少个标准差?
# 经过处理的数据符合标准正态分布,即均值为0,标准差为1
# 什么情况用Z-score标准化:
# 在分类、聚类算法中,需要使用距离来度量相似性的时候,Z-score表现更好
(2)离散化
指将连续性数据切分为多个“段”,有些数据挖掘算法要求数据是分类属性的形式。
(3)语义转换
将{非常好,好,一般,差,非常差}这种转化为{1,2,3,4,5}来替代。