《Python数据分析与数据挖掘实战》学习笔记(数据挖掘基础)
-
- 前言
- 1、获取数据(获取【爬虫采集或从一些统计网站下载】--->取样)
- 2、数据探索
-
- 2.1、缺失、异常值分析
- 2.2、统计量分析
- 3、数据预处理(清洗【去掉脏数据】、集成【集中】、变换【规范化】、规约【精简】)
-
- 3.1、数据清洗
- 3.2、数据集成
- 3.3、数据变换
- 3.4、数据规约
- 4、挖掘建模(分类、聚类、关联、预测)
-
- 4.1、分类与预测
-
- 逻辑回归
-
- 逻辑回归建模步骤:
- 案例:对银行在降低货款拖欠率的数据进行逻辑回归建模
- 4.2、聚类分析
- 4.3、关联规则
- 4.4、时序模式
- 4.5、离群点检测
- 5、模型评价与分布
前言
数据分析是对已知的数据进行分析,然后提取出一些有价值的信息,数据量不会太大;数据挖掘,是指对大量数据进行分析与挖掘,得到一些未知的,潜在的信息;数据挖掘是数据分析的提升。
数据挖掘是:从历史保存的大量数据(包括文本)中挖掘出隐含的、未知的、对决策有潜在价值的关系、模式和趋势,并用这些知识和规则建立用于决策支持的模型,提供预测性决策支持的方法、工具和过程。它利用各种分析工具在大量数据中寻找其规律和发现模型与数据之间关系的过程,是统计学、数据库技术和人工智能技术的综合。
数据挖掘的基本任务:利用分类与预测、聚类分析、关联规则、时序模式、偏差检测、智能推荐等方法,帮助企业提取数据中的商业价值。
数据挖掘建模过程包括:定义挖掘目标、数据取样、数据探索、数据预处理、挖掘建模、模型评价六个步骤。
1、获取数据(获取【爬虫采集或从一些统计网站下载】—>取样)
数据取样是在明确了挖掘目标后,从数据仓库中抽取一个相关的样本子集。通过对数据样本的精选,不仅能减少数据处理量,节省系统资源,还能是规律更容易凸显。
抽取数据的标准,一是相关性,二是可靠性,三是有效性。数据取样的质量一定要把关,若原始数据有误,则很难挖掘探索出数据的规律性。
抽样方法:
1、随机抽样:数据集中的每组观测值都有相同的被抽样的概率;
2、等距抽样:如100组观测值按5%的比例等距抽样,则取第20,40,60,80,100组这5组观测值;
3、分层抽样:首先将样本总体分成若干层,每层中的观测值都有相同的被选用的概率,但不同层可设定不同概率;
4、从起始顺序抽样:从输入数据集的起始处开始抽样;
5、分类抽样:依据某种属性的取值来选择数据子集。
2、数据探索
数据探索和预处理的目的是为了保证样本数据的质量。
数据探索主要包括:数据质量分析(异常值、缺失值、一致性) 和数据特征分析(分布、对比、统计量、相关性、周期性和贡献度)
2.1、缺失、异常值分析
缺失值的处理分为删除存在缺失记录、对可能值进行插补、不处理三种情况。
异常值也称为离群点。指样本中个别值的数值明显偏离其余的观测值。三种常见的离群点分析方法:
(1)简单统计量分析 :使用pandas库中的describe()函数,可以查看数据基本参数(平均值、标准差、最大最小值、25%50%75%三个分位数)
(2)3 δ { \delta} δ原则
(3)箱型图分析
餐饮销售额数据异常值检测代码:
import pandas as pd
#定义路径
catering_sale="E:\\《Python数据分析与挖掘实战》源数据和代码\\Python数据分析与挖掘实战\\chapter3\\demo\\data\\catering_sale.xls"
'''
读取Excel文件
catering_sale=r"\catering_sale.xls"
'''
#读取数据,指定“日期”为索引列
data=pd.read_excel (catering_sale ,index_col=u'日期')
'''
查看数据基本情况:均值,标准差,最小、最大值,分位值
print(data.describe())
'''
import matplotlib.pyplot as plt #导入图像库
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
# 画出箱型图,并把异常数据标出来
plt.figure()
p=data.boxplot(return_type='dict')#画箱型图
x=p['fliers'][0].get_xdata() #fliter为异常值的标签
y=p['fliers'][0].get_ydata()
y.sort() #从小到大排序,直接改变原对象
# 用annotate添加注释
# 其中有些相近的点,注释会出现重叠,难以看清,需要技巧来控制
# 以下参数都是经过调试的,需要具体问题具体调试
for i in range(len(x)):
if i>0:
plt.annotate(y[i],xy=(x[i],y[i]),xytext=(x[i]+0.05-0.8/(y[i]-y[i-1]),y[i]))
else:
plt.annotate (y[i],xy=(x[i],y[i]),xytext=(x[i]+0.08,y[i]))
plt.show()
p要指定类型,否则报错不能读取p。故将原句p=data.boxplot( ) 改为 p=data.boxplot(return_type=‘dict’)
2.2、统计量分析
从集中趋势(度量参数:均值、中位数、众数)、离中趋势(极差、标准差、变异系数、四分位数间距)两个方面进行分析
均值对极端值很敏感。可以使用截断均值或中位数来度量数据的集中趋势。
#销售数的统计量情况
import pandas as pd
catering_sale="E:\\《Python数据分析与挖掘实战》源数据和代码\\Python数据分析与挖掘实战\\chapter3\\demo\\data\\catering_sale.xls"
data=pd.read_excel (catering_sale ,index_col=u'日期')
data=data[(data[u'销量']>400)&(data[u'销量']<5000)]
statistics=data.describe()
statistics .loc['range']=statistics .loc['max']-statistics.loc['min']#极差
statistics .loc['var']=statistics .loc['std']/statistics .loc ['mean']#变异系数
statistics .loc['dis']=statistics .loc['75%']-statistics .loc['25%']#四分位数间距
print(statistics)
3、数据预处理(清洗【去掉脏数据】、集成【集中】、变换【规范化】、规约【精简】)
数据预处理包括:数据清洗(缺失值处理、异常值处理)、数据集成(实体识别、冗余属性识别)、数据变换(简单函数变换、规范化、连续属性离散化、属性构造、小波变换)和数据规约(属性规约和数值规约)。
3.1、数据清洗
A.缺失值
在数据探索部分提到,缺失值的处理分为删除存在缺失记录、对可能值进行插补、不处理三种情况。常见的插补方法有:均值/中位数/众数插补,使用固定值,最近邻插补,回归方法,插值法。
插值法是利用已知点建立合适的插值函数,未知值由对应点求出的函数值近似替代。重点学习了拉格朗日插值法和牛顿插值法。
用拉格朗日进行插补:
#自定义列向量插值函数
def ployinterp_column(s,n,k=5):#s为列向量,n为被插值的位置,k为取前后的数据个数,默认为5
y=s[list(range (n-k,n))+list(range(n+1,n+1+k))]
y=y[y.notnull()]#剔除空值
return lagrange(y.index,list(y))(n)#插值并返回插值结果
#逐个元素判断是否需要插值
for i in data.columns:
for j in range(len(data)):
if (data[i].isnull())[j]:#如果为空即插值
data[i][j]=ployinterp_column(data[i],j)
data.to_excel(outputfile)#输出结果,写入文件入文件
B.异常值
异常值处理方式包括:删除、视为缺失值、平均值修正、不处理
3.2、数据集成
A.实体识别
目的是统一不同数据源的矛盾(同名异义,异名同义,单位不统一)。
3.3、数据变换
A.简单函数变换
简单函数变换常用来将不具有正态分布的数据变换成具有正态分布的数据,包括平方、开方、取对数、差分运算等
B.规范化
为了消除指标之间的量纲和取值范围差异的影响,需要进行标准化处理,将数据按比例进行缩放,使之落到特定区域, 便于综合分析。
离差标准化(最小最大规范化):将数据映射到[0,1]之内,是对原始数据的线性变换。
x ∗ = x − m i n m a x − m i n x^* = \frac{x-min}{max-min} x∗=max−minx−min
标准差标准化(零-均值规范化):经处理的数据均值为0,标准差为1。 δ { \delta} δ为原始数据的标准差
x ∗ = x − x m e a n δ x^* = \frac{x-x{\\mean} }{ \delta} x∗=δx−xmean
小数定标规范化
用三种方法进行数据规范:
#_*_coding:utf-8 _*_
import pandas as pd
import numpy as np
datafile='E:\\《Python数据分析与挖掘实战》源数据和代码\\Python数据分析与挖掘实战\\chapter4\\demo\\data\\normalization_data.xls'
data=pd.read_excel (datafile,header= None )
x1=(data-data.min())/(data.max()-data.min())
x2=(data-data.mean())/data.std()
x3=data/10**np.ceil(np.log10(data.abs().max()))
print(x1,x2,x3)
C.连续属性离散化
等宽离散化、等频离散化、基于聚类分析的方法
用三种方法进行数据离散化:
import pandas as pd
datafile='E:\\《Python数据分析与挖掘实战》源数据和代码\\Python数据分析与挖掘实战\\chapter4\\demo\\data\\discretization_data.xls'
data=pd.read_excel (datafile)
data=data[u'肝气郁结证型系数'].copy()
k=4
#等宽离散化
d1=pd.cut(data,k,labels=range(k))
#等频率离散化
w=[1.0*i/k for i in range(k+1)]
w=data.describe(percentiles=w)[4:4+k+1]
w[0]=w[0]*(1-1e-10)
d2=pd.cut(data,w,labels=range(k))
#聚类离散化
from sklearn.cluster import KMeans
kmodel=KMeans(n_clusters=k,n_jobs=1)
kmodel.fit(data.reshape((len(data),1)))
c=pd.DataFrame(kmodel.cluster_centers_ ).sort_values(0)
w=pd.rolling_mean(c,2).iloc[1:]
w=[0]+list(w[0])+[data.max()]
d3=pd.cut(data,w,labels=range(k))
def cluster_plot(d,k):
import matplotlib.pyplot as plt
plt.rcParams ['font.sans-serif']=['SimHei']#显示中文标签
plt.rcParams['axes.unicode_minus'] = False#显示负号
plt.figure (figsize= (8,3))
for j in range(0,k):
plt.plot(data[d==j],[j for i in d[d==j]],'o')
plt.ylim(-0.5,k-0.5)
return plt
cluster_plot(d1, k).show()
cluster_plot(d2, k).show()
cluster_plot(d3, k).show()
D.属性构造
利用已有的属性集构造新的属性。
线损率属性构造:
import pandas as pd
inputfile='E:/《Python数据分析与挖掘实战》源数据和代码/Python数据分析与挖掘实战/chapter4/demo/data/electricity_data.xls'
outputfile='E:/代码/Data_A_M/.idea/tmp/electricity_data.xls'
data=pd.read_excel (inputfile)
data[u'线损率']=(data[u'供入电量']-data[u'供出电量'])/data[u'供入电量']
data.to_excel(outputfile,index=False)
E.小波变换
小波变换是一种信号分析手段,提供了一种非平稳信号的时频分析手段。
小波变换特征提取代码:
import pandas as pd
import pywt
inputfile='E:/《Python数据分析与挖掘实战》源数据和代码/Python数据分析与挖掘实战/chapter4/demo/data/leleccum.mat'
from scipy .io import loadmat
mat=loadmat(inputfile)
signal=mat['leleccum'][0]
coeffs=pywt.wavedec(signal,'bior3.7',level=5)
3.4、数据规约
A.属性规约
属性规约方法 | 合并属性 | 逐步向前选择 | 逐步向后删除 | 决策树归纳 | 主成分分析 |
---|---|---|---|---|---|
方法描述 | 将旧属性合为新属性 | 从空属性集合开始,每次从原来属性集合选择一个最优属性添加到当前子集,直到无法选出最优或达到阈值为止 | 每次从原来属性集合选择一个最差属性添加到当前子集… | 利用决策树的归纳方法对初始数据进行分类归纳学习,获得一个初始决策树,未出现在该决策树上的属性维为无关属性可删除,便获得较优子集 | 将相关性很高的变量转化成彼此独立不相关的变量 |
方法类别 | 创建新的属性维度 | 直接删除不相关属性 | 直接删除不相关属性 | 直接删除不相关属性 | 连续属性的数据降维 |
用主成分分析进行数据降维:
import pandas as pd
inputfile='E:/《Python数据分析与挖掘实战》源数据和代码/Python数据分析与挖掘实战/chapter4/demo/data/principal_component.xls'
outputfile='E:/代码/Data_A_M/.idea/tmp/dimention_reducted.xls'
data=pd.read_excel(inputfile,header=None)
from sklearn.decomposition import PCA
pca=PCA()
pca.fit(data)
pca.components_#返回模型的各个特征向量
pca.explained_variance_ratio_ #返回各个成分各自的方差百分比(贡献率)
pca=PCA(3)#取前三个主成分,即n_components=3
pca.fit(data)
low_d=pca.transform(data)#用它来降低维度
pd.DataFrame(low_d).to_excel (outputfile)
pca.inverse_transform(low_d)
print(low_d)
B.数值规约
数值规约方法分为有参数方法和无参数方法两类。
有参数方法 | 无参数方法 |
---|---|
使用一个模型来评估数据,只需存放参数,不需存放实际数据 | 只需存放实际数据 |
回归(线性回归和多元回归) | 直方图、聚类、抽样 |
4、挖掘建模(分类、聚类、关联、预测)
建模主要考虑两个问题:第一、本次建模属于哪类问题(分类、聚类、关联规则、时序模式、智能推荐)?第二、选用哪种算法构建模型?
4.1、分类与预测
逻辑回归
逻辑回归建模步骤:
1)根据分析目标设置指标变量(自变量和因变量),然后收集数据,根据收集的数据,对特征再次进行筛选。
2)y取1的概率是 p = P ( y = 1 ∣ X ) p=P(y=1|X) p=P(y=1∣X) ,取0的概率是 1 − p 1- p 1−p
用 l n ( p / ( 1 − p ) ) ln(p/(1-p)) ln(p/(1−p))和自变量累出线性回归方程,故居出模型中的回归系数。
3)进行模型检验。模型有效性的检验指标包括:最基本的有正确率,其次有混淆矩阵、ROC曲线、KS值等
4)模型的应用:输入自变量的取值,就可以得到预测变量的值,或者根据预测变量的值去控制自变量的取值
案例:对银行在降低货款拖欠率的数据进行逻辑回归建模
#逻辑回归
import pandas as pd
#初始化参数
datafile='E:\\《Python数据分析与挖掘实战》源数据和代码\\Python数据分析与挖掘实战\\chapter5\\demo\\data\\bankloan.xls'
data=pd.read_excel (datafile)
x=data.iloc[:,:8].values
y=data.iloc[:,8].values
from sklearn.linear_model import LogisticRegression as LR
from sklearn.linear_model import RandomizedLogisticRegression as RLR
rlr=RLR()#建立随机逻辑回归模型,筛选变量
rlr.fit(x,y)#训练模型
rlr.get_support()#获得特征筛选结果
print(u'通过随机逻辑回归模型筛选特征结束。')
print(u'有效特征为:%s'%','.join(data.columns[rlr.get_support(indices=True) ]))
x=data[data.columns[rlr.get_support(indices=True) ]].values
lr=LR()
lr.fit(x,y)
print(u'逻辑回归模型训练结束。')
print(u'模型的平均正确率为:%s'% lr.score(x,y))