探索性数据分析(EDA)在理解问题陈述的内容,原因和方式方面起着至关重要的作用。
最初发布于 kite.com 。

目录
- 介绍
- 定义探索性数据分析
- 总览
- EDA的详细说明
- 快速浏览功能
- 单变量和双变量分析
- 缺失值分析
- 离群值检测分析
- 基于百分位数的离群值去除
- 相关矩阵
- 结论
介绍
当今世界上有大量数据。 现代企业和学者都收集了大量有关无数过程和现象的数据。 尽管世界上许多数据都是使用Excel或(手动!)处理的,但新的数据分析和可视化程序可以使您获得更深入的了解。 Python的编程语言及其英语命令和易于遵循的语法为传统技术和应用程序提供了功能强大(免费!)的惊人开源替代品。
数据分析使企业能够了解其效率和绩效,并最终帮助企业做出更明智的决策。 例如,一家电子商务公司可能对分析客户属性感兴趣,以便显示有针对性的广告以改善销售。 如果人们了解可用于处理信息的工具,则数据分析几乎可以应用于企业的任何方面。
定义探索性数据分析
探索性数据分析 (EDA)在理解问题陈述的内容,原因和方式方面起着至关重要的作用。 这是数据分析师在处理新数据源和问题陈述时将执行的操作顺序的第一位。
这是一个直接的定义:探索性数据分析是一种通过可视化总结数据集的主要特征来分析数据集的方法。 EDA过程是构建模型之前的关键步骤,以揭示各种见解,这些见解对以后开发强大的算法模型至关重要。
让我们尝试打破这个定义,并了解EDA发挥作用的不同操作:
- 首先,EDA提供了一个阶段,可以将问题陈述分解为较小的实验,从而可以帮助理解数据集
- EDA提供相关的见解,可帮助分析师制定关键业务决策
- EDA步骤提供了运行所有思想实验的平台,并最终指导我们做出关键的决定
总览
这篇文章介绍了探索性数据分析的关键组成部分,并提供了一些示例,帮助您开始分析自己的数据。 我们将介绍一些相关的理论解释,并以示例代码为例,因此最终,您可以将这些技术应用于自己的数据集。
介绍性文章的主要目的是介绍如何:
- 读取并检查数据集并按变量类型对变量进行分类:定量与分类
- 处理带有数字编码值的类别变量
- 执行单变量和双变量分析,并获得有关数据集的有意义的见解
- 识别和处理缺失值并删除数据集异常值
- 建立相关矩阵以识别相关变量
最重要的是,我们将学习python软件包的重要API,这些API将帮助我们执行各种EDA技术。
关于销售数据的EDA的详细说明
在本节中,我们将研究一些代码,并学习解释我们执行的不同操作中的关键见解。
在开始之前,让我们安装并导入用于执行分析的所有相关python软件包。 我们的要求包括pandas , numpy , seaborn和matplotlib python软件包。
Python的名为Pip的程序包管理系统使诸如安装依赖项,维护和交付Python项目之类的任务变得更加容易。 启动您的终端并运行以下命令:
import python -m pip install --user numpy scipy matplotlib ipython pandas sympy nose statsmodels patsy seaborn
请注意,您需要在系统上已经安装Python和Pip才能使上述命令起作用,并且名称与您不相称的软件包是我们想要的主要软件包的内部依赖项,现在您可以忽略那些。
完成此步骤后,我们准备安装所有必需的Python依赖项。 接下来,我们需要建立一个可以进行分析的环境-随时启动您喜欢的Python文本编辑工具,并从加载以下软件包开始:
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib
from matplotlib import pyplot as plt
为了读取数据和执行EDA操作,我们将主要使用numpy和pandas Python软件包,这些软件包提供了简单的API,使我们可以插入数据源并执行所需的操作。 对于输出,我们将使用Seaborn软件包,该软件包是基于Matplotlib构建的基于Python的数据可视化库。 它提供了一个高级界面,用于绘制引人入胜且内容丰富的统计图形。 数据可视化是分析的重要组成部分,因为它甚至可以使非程序员也能够理解趋势和模式。
让我们开始阅读要使用的数据集并解密其变量。 对于此博客文章,我们将分析有关公司销售和库存模式的Kaggle数据集 。 Kaggle是一个由数据科学家组成的伟大社区,它们共同分析数据-在这里可以找到数据以实践本文所涵盖的技能。
数据集包含库存中一组详细的产品,此处的主要问题陈述是确定应继续销售的产品以及从库存中删除的产品。 该文件包含对历史销售和活动库存数据的观察。 这里的最终解决方案是创建一个模型,该模型将预测保留哪些产品以及从库存中删除哪些产品-我们将对这些数据执行EDA,以更好地理解数据。 您可以在此处跟随配套的Kaggle记事本。

快速浏览功能:一个示例
让我们分析数据集并仔细查看其内容。 此处的目的是查找详细信息,例如列数和其他元数据,这将帮助我们衡量大小和其他属性,例如数据集列中值的范围。
sales_data = pd.read_csv("../input/SalesKaggle3.csv")
sales_data.head()

read_csv
函数将整个数据文件作为Pandas数据read_csv
加载到Python环境中,对于csv文件,默认定界符为’。
head() function
返回数据集的前5个条目,如果要增加显示的行数,可以在head()函数中指定所需的数字作为ex的参数: sales.data.head(10)
,类似地,我们可以使用命令sales_data.tail()
看到Pandas数据框的底部行。
变量类型和描述性统计
将数据集加载到Python环境后,下一步是了解这些列相对于值范围实际包含的内容,了解本质上属于类别的列等。
要获得有关数据的更多信息,有必要了解列对业务上下文的意义-这有助于为可应用于列值的潜在转换建立规则。
以下是一些专栏的定义:
- File_Type: “活动”值表示特定产品需要调查
- SoldFlag:值1 =销售,0 =过去六个月无销售
- SKU_number:这是每个产品的唯一标识符。
- 顺序:只是一个连续的计数器。 可以忽略。
- SoldFlag: 1 =过去6个月内已售出。 0 =未售出
- MarketingType:我们如何营销产品的两类。
- New_Release_Flag:具有未来版本(即版本号> 1)的任何产品
sales_data.describe()
describe函数返回一个pandas系列类型,该类型提供描述性统计信息,该统计信息总结了NaN值除外的数据集分布的集中趋势,离散度和形状。 分布中心的三个主要数值量度是众数,均值(μ)和中位数(M)。 模式是最频繁出现的值。 平均值是平均值,中位数是中间值。
sales_data.describe(include='all')
当我们使用include='all'
参数调用describe函数时,它将显示所有列的描述性统计信息,其中还包括分类列。

接下来,我们解决一些基本问题:
数据集中的条目数:
print(sales_data.shape)
我们有198917行和14列。
产品总数和列的唯一值:
print(sales_data.nunique())
nunique()
将返回每列中唯一元素的数量
历史和活跃状态的计数(我们只需分析活跃状态的产品):
print(sales_data[sales_data['File_Type'] == 'Historical']['SKU_number'].count())
print(sales_data[sales_data['File_Type'] == 'Active']['SKU_number'].count())
我们使用count函数来查找活动案例和历史案例的数量:我们有122921个活动案例需要分析。 然后,我们根据标志类型将数据集分为两部分。 为此,我们必须在方括号中将所需条件传递给sales_data对象,该对象将检查具有上述条件的所有条目,并创建一个仅包含所需值的新对象。
sales_data_hist = sales_data[sales_data['File_Type'] == 'Historical']
sales_data_act = sales_data[sales_data['File_Type'] == 'Active']

总结到目前为止的所有操作:
数据集包含198,917行和14列,其中12个数字列和2个类别列。 数据集中有122,921个活跃销售的产品,这是我们重点分析的地方。
单变量和双变量分析
与每个属性关联的数据包括一长串值(包括数字值和非数字值),将这些值作为长序列并不是特别有用-它们不提供任何独立的见解。 为了将原始数据转换为我们可以实际使用的信息,我们需要进行汇总,然后检查变量的分布 。
单变量分布图是图形,其中我们在数据上绘制直方图以及估计的概率密度函数。 这是最简单的技术之一,我们考虑单个变量并观察其传播和静态属性。 数值和分类属性的单变量分析是不同的。
对于分类列,我们绘制直方图,我们使用value_count()
和plot.bar()
函数绘制条形图,该条形图通常用于使用带有计数值的直角条形来表示分类数据。 在这种情况下,我们有两种类型的营销类型S和D。条形图显示了这些离散类别之间的比较,x轴显示了特定类别,y轴显示了测量值。
sales_data['MarketingType'].value_counts().plot.bar(title="Freq dist of Marketing Type")

同样,通过更改上面代码中的列名,我们可以分析每个分类列。
以下是用于绘制数字列的单变量分布的代码,其中包含直方图和估计的PDF。 我们使用displot
库的displot绘制此图:
col_names = ['StrengthFactor','PriceReg', 'ReleaseYear', 'ItemCount', 'LowUserPrice', 'LowNetPrice']
fig, ax = plt.subplots(len(col_names), figsize=(16,12))
for i, col_val in enumerate(col_names):
sns.distplot(sales_data_hist[col_val], hist= True , ax=ax[i])
ax[i].set_title('Freq dist '+col_val, fontsize=10)
ax[i].set_xlabel(col_val, fontsize=8)
ax[i].set_ylabel('Count', fontsize=8)
plt.show()

我们可以看到,离开ReleaseYear列时,每隔一列向左倾斜,这表明大多数值位于较低的范围值中,反之亦然(对于ReleaseYear属性)。
双变量分布图通过分析散点图来帮助我们研究两个变量之间的关系,我们使用seaborn包的pairplot()
函数绘制双变量分布图:
sales_data_hist = sales_data_hist.drop([
'Order', 'File_Type','SKU_number','SoldFlag','MarketingType','ReleaseNumber','New_Release_Flag'
], axis=1)
sns.pairplot(sales_data_hist)

我们经常寻找散点图,这些散点图遵循清晰的线性模式,且斜率增加或减小,因此我们可以得出结论,但在此特定数据集中不会注意到这些模式。 就是说,总是有空间通过比较感兴趣的变量之间的图的性质来得出其他有用的见解。
缺失值分析
数据集中的缺失值是指那些字段为空或未分配任何值的字段,这些字段通常是由于数据输入错误,数据收集过程中发生的错误以及经常在连接来自不同表的多个列时发现的,导致缺失值。 处理缺失值的方法有很多,最简单的方法是用均值,中位数,众数或常数(我们根据领域知识得出的值)替换缺失值,另一种选择是删除条目从数据集本身。
在我们的数据集中,我们没有缺失值,因此我们没有对数据集执行任何操作,因为这里说一些示例代码片段可以帮助您在python中执行缺失值处理。
检查数据集中是否有空值
data_frame.isnull().values.any()
如果以上代码段返回true,则数据集中为空值,如果为false,则表示不存在
data_frame.isnull().sum()
上面的代码段返回不同列中缺失值的总数
现在,为了替换缺少的值,我们使用pandas的fillna函数将na值替换为我们感兴趣的值,并且inplace = True命令使该数据帧中的值永久更改。
data_frame['col_name'].fillna(0, inplace= True )

离群值检测分析
离群值可能表示数据有误(例如错别字或测量错误,季节性影响等),在这种情况下,应先将其更正或从数据中删除,然后再计算汇总统计信息或从数据中得出见解,否则会导致错误的分析。
以下是绘制列表col_names
提到的所有列名的箱形图的代码。 箱形图使我们可以直观地分析数据集中的离群值。
这里要注意的关键术语如下:
- 数据范围为我们提供了一种扩展程度,并等于最小数据点(min)和最大数据点(max)之间的值
- 四分位间距(IQR),即中间50%的数据所覆盖的范围。
- IQR = Q3-Q1,第三和第四个四分位数之间的差。 第一个四分位数(Q1)是这样的值,即四分之一(25%)的数据点低于该值或该数据下半部分的中位数。 第三四分位数是指这样的值,即四分之三(75%)的数据点低于该值,即数据上半部分的中位数。
- 可使用1.5(IQR)标准将IQR用于检测异常值。 离群值是低于Q1-1.5(IQR)或高于Q3 + 1.5(IQR)的观察值。
col_names = ['StrengthFactor','PriceReg', 'ReleaseYear', 'ItemCount', 'LowUserPrice', 'LowNetPrice']
fig, ax = plt.subplots(len(col_names), figsize=(8,40))
for i, col_val in enumerate(col_names):
sns.boxplot(y=sales_data_hist[col_val], ax=ax[i])
ax[i].set_title('Box plot - {}'.format(col_val), fontsize=10)
ax[i].set_xlabel(col_val, fontsize=8)
plt.show()

根据上面我们如何识别异常值的定义,黑点是强度因子属性中的异常值,红色框是IQR范围。
基于百分位数的离群值去除
我们想到的下一步是消除这些异常值的方法。 最常用的技术之一是基于百分位数的离群值去除,其中我们根据固定的百分位数值过滤掉离群值。 此类别中的其他技术包括基于z分数的删除,常量值等
def percentile_based_outlier (data, threshold=95):
diff = (100 - threshold) / 2
minval, maxval = np.percentile(data, [diff, 100 - diff])
return (data maxval)
col_names = ['StrengthFactor','PriceReg', 'ReleaseYear', 'ItemCount', 'LowUserPrice', 'LowNetPrice']
fig, ax = plt.subplots(len(col_names), figsize=(8,40))
for i, col_val in enumerate(col_names):
x = sales_data_hist[col_val][:1000]
sns.distplot(x, ax=ax[i], rug= True , hist= False )
outliers = x[percentile_based_outlier(x)]
ax[i].plot(outliers, np.zeros_like(outliers), 'ro', clip_on= False )
ax[i].set_title('Outlier detection - {}'.format(col_val), fontsize=10)
ax[i].set_xlabel(col_val, fontsize=8)
plt.show()

在图表的x轴下方标有点的值是根据设置的阈值百分位数(在本例中为95)从列中删除的值,也是基于百分位数的默认值离群值去除。
相关矩阵
相关矩阵是一个表,显示变量集之间的相关系数的值(统计中使用相关系数来测量两个变量之间的关系的强弱)。 将数据集的每个属性与其他属性进行比较,以找出相关系数。 通过此分析,您可以查看哪些对具有最高的相关性,高度相关的对代表数据集的相同方差,因此我们可以进一步分析它们,以了解这些对中的哪个属性对于构建模型最重要。
f, ax = plt.subplots(figsize=(10, 8))
corr = sales_data_hist.corr()
sns.heatmap(corr,
xticklabels=corr.columns.values,
yticklabels=corr.columns.values)

在上方可以看到所有选定变量的相关网络,相关值在-1至+1之间。 高度相关的变量将具有接近+1的相关值,而较少相关的变量将具有接近-1的相关值。
在此数据集中,我们没有看到任何要关联的属性,并且矩阵值的对角元素始终为1,因为我们发现同一列之间具有相关性,因此这里的推论是所有数值属性都很重要,需要考虑建立模型。
结论
最终,在EDA流程中可以执行的实验数量没有限制-它完全取决于您要分析的内容以及Pandas和matplotlib等软件包的知识,我们的工作变得更加轻松。
我们示例的代码也可在此处获得 。 该代码非常简单,您可以克隆内核并将其应用于您选择的数据集。 如果您有兴趣进一步扩展EDA工具包,则可能需要研究更高级的技术,例如使用基于回归的技术进行提前的缺失值处理,或者甚至考虑探索多元因素和聚类分析。
当要分析的属性很多时,通常会使用这些技术,并且其中许多代表相同的信息,通常包含数百个变量(取决于域)。 通常对于模型构建,我们考虑30–40个奇数变量,在这种情况下,必须使用更高级的技术来提出能够更好地表示数据集中方差的因子变量。
一旦练习了本文中的示例,就可以继续分析自己的数据! 几乎所有生成数据的过程都将从我们在这里使用的分析技术中受益,因此有很多机会可以发挥您的新技能。 如果有需要,我很乐意提供帮助,并听听您的经历!
Vigneshwer是Epsilon的数据科学家,负责处理实时数据并构建用于复杂业务问题的最新AI算法。 他认为,技术需要以人为本的设计来满足不同受众的解决方案。 他是Mozilla的官方技术发言人,也是Rust Cookbook的作者。
这篇文章是Kite关于Python的新系列的一部分。 您可以从 GitHub存储库中的 这篇文章和其他文章中查看代码 。