python数据分析与数据挖掘,python 数据 分析 挖掘
本文旨在探讨Python 3在数据分析与数据挖掘方面的实际应用案例。通过分享一些典型的数据分析场景实例和相关代码实现方法,并结合实际项目经验进行深入解析。同时分享了学习Python数据分析所需掌握的核心知识点。期待能为您提供有价值的学习资源。如需更多学习资料,请关注并收藏我们网站。

文章目录
以下是对原文的同义改写版本
数据挖掘的基本流程:
定义挖掘目标数据采样数据探索数据预处理挖掘建模模型评价
数据探索
数据质量分析
在数据分析流程中进行质量评估被视为一个关键步骤,在这个过程中我们需要确保所使用的原始数据库具有完整性与一致性;同时这也是确保后续预处理工作的必要条件;其结果对于提高后续分析的有效性与准确性具有决定性作用;其核心职责在于识别并评估原始数据库中的污损信息;其中污损信息通常指那些不符合既定规范且无法直接应用于后续分析的数据类型;例如缺失值 异常值 不一致的值 重复数据以及含有特殊符号的值等
可采取基础统计分析及描述性统计等多种手段进行数据处理;此外还可以采用西格玛原则检验数据分布情况,并通过箱线图绘制图形进行分析;在Python编程语言中,则可以直接调用describe()函数来完成相关计算。
可采取基础统计分析及描述性统计等多种手段进行数据处理;此外还可以采用西格玛原则检验数据分布情况,并通过箱线图绘制图形进行分析;在Python编程语言中,则可以直接调用describe()函数来完成相关计算。
数据特征分析
分布分析
通过进行分布分析可以深入理解数据的特性及其类型。针对定量数据而言,在探索其是否呈对称或非对称分布时需注意识别出一些异常的大值或小值;为此可采取制作频率分布表、绘制直方图以及茎叶图等手段以直观观察其特征;而对于定性分类数据则适合采用饼图或条形图来直观展示各类别所占比例
定量数据:计算极差;确定收集数据范围的方式及其数量;确定组限的划分点;整理出频数分布表;绘制频数分布直方图
对比分析
对比分析旨在将两个相互关联的指标进行比较,并从数量上展示研究对象规模大小及其水平高低、变化速度快慢程度等特征,并特别适用于对指标间的横向及纵向变化趋势进行分析以及时间序列数据的变化特征研究。
绝对指标分析与相对指标分析:包括结构相对指标、比例相对指标、比较相对指标、强度相对指标、计划完成程度relative indicator以及动态relative indicator等
统计量分析
通过统计指标分析定量数据的基本特征, 通常从集中趋势与离中趋势两个维度展开分析. 其中衡量集中趋势的关键指标包括均值, 中位数以及众数; 而衡量数据分布分散程度的关键指标包括极差, 标准差(方差), 变异系数以及四分位间距等.
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%'] # 四分位数间距
周期性分析
研究某个变量是否随时间发展表现出某种规律性的重复变化模式。不同时间尺度上的周期表现包括年循环特征、季相循环特征;较短的时间尺度则涉及月度循环特征和周日循环特征;甚至在更微观的时间尺度上出现日间循环特征。
贡献度分析
贡献度分析法也称帕累托分析法,其理论基础是帕累托原理,即著名的20/80定律.同样的资源投入放在不同位置会产生显著的不同经济效益.例如,在一个企业中,约有80%的利润来自其20%最畅销的产品组合,而剩余80%的产品仅能获取20%的利润.
通过调用plot函数生成柱状图表示数据分布情况;计算累积总和与总数据量的比例;随后绘制红色曲线图;其中曲线采用- o样式连接各点;线宽设定为2;并在图表上标注格式化后的比例值;具体位置设于图表中的85%处;同时附加了箭头样式设置以增强图表可读性
相关性分析
研究两个连续变量之间是否存在线性关系,并用合适的统计指标来衡量这种关系的强弱程度的过程被称为相关分析
可以直接绘制散点图、绘制散点图矩阵、计算相关系数
correlation_matrix = data.corr() # 计算数据的相关性矩阵 correlation_matrix[u'百合酱蒸凤jaw'] # 显示"百合酱蒸凤jaw"与其他菜品的相关性 correlation_matrix.loc[u'百合酱蒸凤jaw', :] .corr(correlation_matrix.loc[u'翡翠蒸香茜饺', :]) # 计算"百合酱蒸凤jaw"与"翡翠蒸香茜饺"的相关系数
数据预处理
数据预处理不仅旨在提高数据质量,同时也能使其更适合特定的挖掘技术或工具。
统计显示,在数据分析的整体流程中,数据预处理所占的工作量达到了60%。
数据清洗
主要是去除非相关和重复的数据;消除噪声干扰;去除与挖掘主题无关联的数据;消除缺失或异常的数据影响。
缺失值处理
删除插补不处理
拉格朗日插值代码 import pandas as pd from scipy.interpolate import lagrange # 导入拉格朗日插值函数 data[u'销量'][(data[u'销量'] < 400) | (data[u'销量'] > 5000)] = None # 过滤异常值,将其变为空值 # 自定义列向量插值函数 # s为列向量,n为被插值的位置,k为取前后的数据个数,默认为5 def ployinterp_column(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 - data.min()) 除以 (data.max() - data.min()) 来实现数据范围缩放。\n\n通过计算 (data - data.mean()) 除以 data 标准差 来实现零均值缩放。\n\n通过计算 data 除以 10 的 log10 绝对值的最大值 向上取整次方 来实现小数定标缩放。\n\n注释如下:\n# 范围缩放\n# 零均值缩放\n# 小数定标缩放
连续属性离散化
一类数据挖掘算法中的一些特定分类方法(例如ID3与Apriori)要求处理的数据必须采用基于分类属性的数据格式。
基于数据的整体范围,在特征空间中设置若干关键点作为分隔符,并将整个数值范围划分为多个区间段。最终会使用特定的符号或整数值来标识落在每个区间段内的具体数值特征。因此,在这一过程中有两个主要步骤:一是确定类别数量;二是实现连续属性与分类变量之间的映射关系。
k = 4 d1 = pd.cut(data, k, labels = range(k)) # 等宽离散化,各个类比依次命名为0,1,2,3 #等频率离散化 w = [1.0i/k for i in range(k+1)] w = data.describe(percentiles = w)[4:4+k+1] # 使用describe函数自动计算分位数 w[0] = w[0](1-1e-10) d2 = pd.cut(data, w, labels = range(k)) from sklearn.cluster import KMeans # 引入KMeans kmodel = KMeans(n_clusters = k, n_jobs = 4) # 建立模型,n_jobs是并行数,一般等于CPU数较好 kmodel.fit(data.reshape((len(data), 1))) # 训练模型 c = pd.DataFrame(kmodel.cluster_centers_).sort(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.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()
属性构造
在数据挖掘的过程中, 为了获取更有意义的数据, 探索更为复杂的模式, 提升数据挖掘结果的质量, 我们需基于现有属性集合开发新增特征, 并整合到现有的属性系统中
数据规约
意义
主分量分析(PCA) from sklearn.decomposition import PCA; 该模型用于降维处理;通过调用fit方法对输入数据进行建模;其components_属性输出各维度上的基向量集合;而explained_variance_ratio_则提供每个分量所占总方差的比例信息
数值规约 :直方图;聚类;抽样;参数回归
挖掘建模
分类与预测
在分析中将问题划分为两类:分类与预测。其中分类关注于对离散属性进行标记与识别,而****预测则侧重于构建能够映射输入至输出的连续值函数模型,用于根据给定输入变量推导出相应输出变量的具体数值。
回归分析
Logistic回归
在Logistic回归模型中被预测变量Y仅包含两个可能的数值:成功与失败(Yes与No)、事件发生与否(Occur与Not Occur)。假设存在多个独立自变量X₁,X₂,…,X_p的影响下,则Y等于某一个具体数值的概率可以用条件概率表示为P(Y=¹|X)=p;对应的Y等于另一个数值的概率则为P(Y=0|X)=¹−p;两者的比值即称为事件的优势比(Odds)。将Odds进行自然对数转换得到的就是Logit函数。设我们有logit(p)=ln[p/(¹−p)]=z,则解得概率估计值可表示为: p̂ = ¹/(¹+e^{−z}) ,这就是著名的逻辑斯蒂函数
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('有效特征为:', end=' ') print(','.join(data.columns[rlr.get_support()])) x = data[data.columns[rlr.get_support()]].values # 根据筛选结果提取相关特征 lr = LR() # 建立最终的逻辑回归模型 lr.fit(x, y) # 使用提取出的关键变量进行建模 print('模型平均准确率为:', end=' ') print(lr.score(x, y)) # 输出评估指标
从本质上看, 逻辑回归仍属于一种线性模型. 因此, 对于这个模型的有效性检验, 实际上相当于在考察变量间的线性关联程度. 这些筛选出的变量与结果之间显示出较强的线性关联. 然而, 被筛除的变量并非完全没有关联, 只是它们之间的相互作用可能呈现出非线性的特征. 其中较为常用的方法包括决策树和神经网络等技术.
决策树
在构建决策树的过程中,关键在于每一步应如何选取合适的属性来进行样本划分。对于一个分类问题而言,在已标记类别的训练样本基础上进行学习并构建决策树,则是一个自顶向下、分而治之的操作流程。
数据是类别标签,要将它转换为数据 # 用1来表示“好”“是”“高”这三个属性,用-1来表示“坏”“否”“低” data[data == u'好'] = 1 data[data == u'是'] = 1 data[data == u'高'] = 1 data[data != 1] = -1 x = data.iloc[:,:3].as_matrix().astype(int) y = data.iloc[:,3].as_matrix().astype(int) from sklearn.tree import DecisionTreeClassifier as DTC dtc = DTC(criterion='entropy') # 建立决策树模型,基于信息熵 dtc.fit(x, y) # 训练模型 # 导入相关函数,可视化决策树。 # 导出的结果是一个dot文件,需要安装Graphviz才能将它转换为pdf或png等格式。 from sklearn.tree import export_graphviz from sklearn.externals.six import StringIOwith open("tree.dot", 'w') as f: f = export_graphviz(dtc, feature_names = x.columns, out_file = f)
人工神经网络
数据属于类别标签类型,请将其转换为数值型数据 # 使用1来表示"好"、"是"、"高"这三个属性特征 # 使用0来表示"坏"、"否"、"低"这三个属性特征 data[data == u'好'] = 1 data[data == u'是'] = 1 data[data == u'高'] = 1 data[data != 1] = 0 x = data.iloc[:,:3].as_matrix().astype(int) y = data.iloc[:,3].as_matrix().astype(int) from keras.models import Sequential from keras.layers.core import Dense, Activation model = Sequential() # 搭建模型框架 model.add(Dense(3, 10)) model.add(Activation('relu')) # 使用relu激活函数以提高分类精度 model.add(Dense(10, 1)) model.add(Activation('sigmoid')) # 因输出结果范围在0-1之间故选择sigmoid函数作为激活函数 model.compile(loss='binary_crossentropy', optimizer='adam', class_mode='binary') # 编译模型配置 loss函数选择二元交叉熵损失函数 model.fit(x, y, nb_epoch=1000, batch_size=10) # 使用Adam优化器进行训练 yp=model.predict_classes(x).reshape(len(y)) # 进行分类预测并调整预测结果形状 from cm_plot import * # 导入自编写的混淆矩阵可视化工具包 cm_plot(y,yp).show() # 展示混淆矩阵可视化结果
聚类分析
与分类不同,在没有预先指定类别的情况下进行分析时,聚类分析通过考察数据间的相似程度对样本进行分组。与基于有标签训练集构建的分类模型不同,在没有类别先验知识的情况下,聚类建模能够直接处理未预先指定类别(或无标签)的数据,并采用非监督学习方法进行建模。其输入是一组未预先指定类别(或无标签)的数据样本,在依据数据间的相似程度将样本分组成若干类别时遵循同类样本间差异最小化、异类样本间差异最大的原则。
K-MEANS算法
该算法以其对数据进行聚类的能力著称,在最小化误差函数的基础上将样本划分为预先设定数量K的类别,并以距离作为衡量对象间的相似程度的标准;并主张样本间的接近程度与其之间的距离呈现正相关关系
从提供的N个样本数据中随机选择K个代表点作为初始聚类中心。通过计算每个样本与各个聚类中心之间的距离关系,在最短距离原则下将样本分配到最近的簇中。完成所有样本分类后,在新的簇基础上重新确定K个簇的新质心位置。当质心位置不再变化时终止迭代并输出最终结果参数:类别数目k=3;最大迭代次数iteration=500;输入文件路径inputfile;标准化处理已实施;使用sklearn.cluster.KMeans算法模型,默认使用4个子进程完成计算任务;模型拟合训练基于标准化后的数据集data_zs;通过调用model.fit()方法启动无监督学习过程;使用pandas库生成统计表r1来记录各类别数量分布情况;构建包含各簇中心坐标的r2 DataFrame对象;将两个对象合并形成r DataFrame以展示质心坐标与类别数量对应关系;调整列名使其与原始数据字段一致;运行print(r)命令以显示详细分析结果表格;附加一列用于记录各类别所包含的数据实例数量信息;通过自定义函数density_plot()生成各类别属性的概率密度分布图,并根据类别编号i依次保存为不同文件名的一组图像。
关联规则
关联规则分析被归类为购物篮分析的一种方法...最早的目的在于发现超市销售数据库中不同商品间的潜在联系...旨在在一个数据集中识别各项之间的潜在联系...然而这些关联并未直接以显式形式体现在该数据集中。
Apriori算法
from future import print_function
import pandas as pd
from apriori import * # 导入自己编写的apriori模块
ct = lambda x : pd.Series(1, index = x[pd.notnull(x)]) # 定义转换0-1矩阵的过渡函数
b = map(ct, data.as_matrix()) # 通过map函数来执行
data = pd.DataFrame(list(b)).fillna(0) # 实现矩阵转换并填充缺失值为0
del b # 释放中间变量b以节省内存空间
support = 0.2 # 设置最小支持度为20%
confidence = 0.5 # 设置最小置信度为50%
ms = '---' # 设置分隔符,默认采用'--'来区分不同元素,默认使用'---'
find_rule(data, support, confidence, ms).to_excel(outputfile) # 将发现的规则保存到指定位置
时序模式
时间序列预处理
对于一个观察值序列而言,在进入数据分析之前首先要对它的是否具有白噪声特性以及平稳特性的性质进行检验。这两个关键检验被称为序列为后续分析所做的预处理。
对于完全随机的时间序列为白噪声过程来说,其各项之间不存在任何相关性,即它们之间既不存在自相关也不存在互相关,这使得这些变量表现出完全无序的状态,因此无法从中提取任何信息,进而停止对该时间序列为纯随机过程的进一步分析。然而,这样的白噪声过程却无法提供任何有用的信息,因为它所具有的特性表明它不具备任何结构性特征或规律性特征。对于大多数实际应用而言,我们遇到的时间序列为非纯随机的情况,即通常所说的非白噪声时间序列。这类时间序列为具有均值与方差恒定且自相关函数衰减至零的性质的时间系列数据集;由于这类数据集具有一定的结构性特征或规律性特征,因此能够从中提取出一些有意义的信息并建立相应的统计模型来进行预测与控制等目的;其中最为常用的就是自回归移动平均(ARMA)模型这一类统计建模方法;然而在面对非稳定的时间序列为时序数据时,由于其均值与方差不恒定从而导致传统的时间系列建模方法难以直接应用于此类问题中;因此我们需要找到一种能够将这种不稳定性转化为稳定性的处理手段;通常的方法是将这种不稳定性转化为稳定性的一种变换方法即是将原始的时间系列数据经过差分运算之后得到的新时间系列数据集就被称为经过了差分处理后的数据集;如果一个经过差分处理后的新生成的数据集呈现出稳定性则说明这个原始的时间系列数据集属于一种称为一阶差分平稳过程的数据类型;对于这样的情况我们可以采用自回归移动平均扩展型(ARIMA)模型来进行建模与预测等操作
平稳性的检验
时序图检验 。根据平稳时间序列的均值均为常数以及方差均为常数的特点,在平稳序列的情况下其时序图通常会显示出数据始终围绕某一个常数值上下波动,并且这种波动是有界的;如果观察到明显的趋势性或者周期性则可以推断该序列为非平稳序列。自相关图检验 。对于平稳时间序列而言其自相关函数具有短期相关性这一性质即只有近期观测值对当前观测值的影响较为显著而间隔较远的历史观测值对当前观测值的影响则相对较小随着延迟期数k的增加其自相关系数ρ_k(延迟k期)会逐渐衰减并趋向于零这一现象可以作为判断时间序列平稳性的依据而非平稳时间序列则会在较高的延迟阶数下呈现出更为缓慢的衰减特性这正是通过自相关图来判断时间序列是否为平稳过程的关键依据之一单位根检验 。单位根检验的目的在于检测时间序列中是否存在单位根如果存在单位根则表明该序列为非平稳时间序列
如果一个序列为纯随机序列,则其各时刻之间的数值不存在明显关联;即其样本自相关函数在所有延迟k≠0时均为零,在理论模型中被视为一种理想状态。然而,在实际应用中观察到的样本自相关系数通常不会严格等于零值,则而是非常接近于零值,并在其周围呈现出随机波动的趋势。
平稳时间序列分析
The full name of the ARMA model is the autoregressive moving average model. It is widely used for modeling stationary time series data. It includes AR models, MA models, and the three major categories of ARMA models. These can all be regarded as a type of multivariate linear regression model.
非平稳时间序列分析
可以分为确定性因素分解的时序分析和随机时序分析两大类。
确定性因素分解的方法将所有序列的变化归因于4个因素(长期趋势、季节变动、循环变动和随机波动)的综合影响。其中,长期趋势与季节变动所包含的规律性信息通常相对容易提取出来;然而由随机因素所导致的波动相对难以确定并加以分析研究,在这种情况下对随机信息进行过度浪费会严重影响模型的拟合精度
随机时间序列分析方法的建立旨在弥补确定性因素分解方法的局限性。基于时间序列的不同特征以及研究需求的不同特点,在实际应用中能够构建出多种类型的分析模型包括ARIMA模型残差自回归模型季节模型以及异方差模型等
p阶差分 : 相距一期的两个序列值之间的减法运算称为1阶差分运算。k步差分 : 相距k期的两个序列值之间的减法运算称为k步差分运算.# ARIMA模型 import pandas as pd # 参数初始化 discfile = '../data/arima_data.xls' forecastnum = 5 # 读取数据,指定日期列为指标,Pandas自动将“日期”列识别为Datetime格式 data = pd.read_excel(discfile, index_col = u'日期') # 时序图 import matplotlib.pyplot as plt data.plot() plt.show() # 自相关图 from statsmodels.graphics.tsaplots import plot_acf plot_acf(data).show() # 平稳性检测 from statsmodels.tsa.stattools import adfuller as ADF print(u'原始序列的ADF检验结果为:', ADF(data[u'销量'])) # 返回值依次为adf、pvalue、usedlag、nobs、critical values、icbest、regresults、resstore#差分后的结果 D_data = data.diff().dropna()D_data.columns = [u'销量差分'] D_data.plot() # 时序图 plt.show() plot_acf(D_data).show() # 自相关图 from statsmodels.graphics.tsaplots import plot_pacf plot_pacf(D_data).show() # 偏自相关图 print(u'差分序列的ADF检验结果为:', ADF(D_data[u'销量差分'])) # 平稳性检测 # 白噪声检验 from statsmodels.stats.diagnostic import acorr_ljungbox print(u'差分序列的白噪声检验结果为:', acorr_ljungbox(D_data, lags=1)) # 返回统计量和p值 from statsmodels.tsa.arima_model import ARIMA # 定阶 pmax = int(len(D_data)/10) # 一般阶数不超过length/10 qmax = int(len(D_data)/10) # 一般阶数不超过length/10 bic_matrix = [] # bic矩阵 for p in range(pmax+1): tmp = [] for q in range(qmax+1): try: # 存在部分报错,所以用try来跳过报错。 tmp.append(ARIMA(data, (p,1,q)).fit().bic) except: tmp.append(None) bic_matrix.append(tmp) bic_matrix = pd.DataFrame(bic_matrix) # 从中可以找出最小值 p,q = bic_matrix.stack().idxmin() # 先用stack展平,然后用idxmin找出最小值位置。 print(u'BIC最小的p值和q值为:%s、%s' %(p,q)) model = ARIMA(data, (p,1,q)).fit() # 建立ARIMA(0, 1, 1)模型 model.summary2() # 给出一份模型报告 model.forecast(5) # 作为期5天的预测,返回预测结果、标准误差、置信区间。
离群点检测
离群点检测已被广泛应用于多个领域包括电信网络诈骗案件以及信用卡诈骗 detection 信贷系统中的信用贷款审批流程 网络安全中的网络入侵检测 电子商务中的反欺诈监测 以及气象部门的天气预报预警系统等。通过运用离群点检测方法对运动员统计数据进行分析 能够帮助识别出表现异常或有潜在风险的运动员
主要成因 有:数据来源于不同的类、自然变异、数据测量和收集误差。
以下是改写后的内容
笔记摘自于《python数据分析与挖掘实战》
