个性化阅读
专注于IT技术分析

Python探索性数据分析教程

本文概述

如你现在所知, Python数据操作库Pandas用于数据操作。对于刚起步的人来说, 这可能意味着该软件包仅在预处理数据时才有用, 但事实并非如此:Pandas还非常适合探索数据并在对数据进行预处理后将其存储。

另外, 对于那些一直在关注srcmini的Python教程或已经被SciPy, NumPy, Matplotlib和Pandas入门的人来说, 回顾一下你已经积累的一些知识可能是一个好主意。

今天的教程实际上将为你介绍一些使用上述所有软件包来有效探索数据的方法, 以便你可以开始对数据进行建模:

  • 首先, 你将学习如何导入数据, 这是你需要成功完成的第一步, 然后才能开始分析。
  • 如果你不确定什么是探索性数据分析(EDA), 以及EDA和数据挖掘之间的确切区别是什么, 本节将在开始教程之前为你进行解释!
  • 然后, 你将获得有关数据的基本描述。你将集中精力获取一些描述性统计信息, 检查DataFrame的第一行和最后一行, 从数据中检索样本, 等等。你将看到, 这是一种很好的方式, 可以使你对数据有初步的了解, 并可能了解它已经好一点了!
  • 在收集了有关数据的一些信息之后, 最好通过查询或索引数据来更深入地了解它。你可以使用此技术来测试关于数据的一些基本假设。
  • 现在, 你已经检查了数据, 你可能已经发现有些特征可能对你的分析感兴趣:你将看到哪些特征可以通过特征工程和特征选择对分析产生积极影响。
  • 接下来, 你会发现初步探索是好的, 但是你还需要了解数据可能带来的挑战, 例如缺失值或离群值, 当然, 以及如何应对这些挑战, 和
  • 最后, 你还将学习如何通过使用Python数据可视化包Matplotlib和Bokeh轻松, 快速地可视化数据, 或使用特定函数计算属性之间的相关性来发现数据中的模式。

你有兴趣参加熊猫课程吗?考虑参加我们与Continuum Analytics合作开发的三门课程之一, 这是Anaconda的创建者和推动力, 例如Pandas Foundations课程!

导入数据

要开始浏览数据, 你需要首先实际加载数据。你可能已经知道了这一点, 但是由于有了Pandas库, 这变得容易了:按照约定将包作为pd导入, 并使用read_csv()函数, 并向其中传递URL。可以找到数据和标头参数。最后一个参数是可用于确保正确读取数据的参数:数据的第一行不会被解释为DataFrame的列名。

另外, 你还可以指定其他参数来确保正确读取数据:你可以指定与sep或delimiter参数一起使用的定界符, 与名称一起使用的列名或用作行的列带有index_col的结果DataFrame的标签。

但是, 这些并不是你可以添加到read_csv()函数的几乎所有参数。在文档中阅读此函数及其参数。

请注意, 在这种情况下, 你使用了read_csv(), 因为数据碰巧是逗号分隔的格式。如果你有使用其他分隔符的文件, 则还可以考虑使用其他函数来加载数据, 例如read_table(), read_excel(), read_fwf()和read_clipboard, 以读取常规定界文件, Excel文件, Fixed-宽度格式化的数据和复制到剪贴板的数据。

另外, 你会发现read_sql()是将SQL查询或数据库表读入DataFrame的选项之一。要获得更多输入功能, 请考虑熊猫文档的本部分。

什么是探索性数据分析(EDA)?

探索性数据分析(EDA)一方面用于回答问题, 测试业务假设, 生成假设以进行进一步分析。另一方面, 你也可以使用它来准备用于建模的数据。这两个人可能有一个共同点, 那就是你对数据有充分的了解, 可以获取所需的答案, 也可以建立直觉来解释未来建模的结果。

有许多方法可以实现这些目标:你可以获取数据的基本描述, 对其进行可视化, 识别其中的模式, 确定使用数据的挑战等。

在阅读有关EDA时, 你经常会看到的一件事是数据概要分析。数据分析与通过描述性统计信息汇总数据集有关。你想使用各种度量标准来更好地理解你的数据集。数据概要分析的目的是对数据有扎实的了解, 以便以后可以开始以各种方式查询和可视化数据。但是, 这并不意味着你不必进行迭代:正是因为数据分析与汇总数据集有关, 所以它经常用于评估数据质量。根据数据分析的结果, 你可能决定以其他方式更正, 丢弃或处理数据。

在下一篇文章中, 你将了解有关数据分析的更多信息。

EDA和数据挖掘(DM)

尽管两者紧密相关, 但EDA还是有别于数据挖掘, 因为许多EDA技术已被数据挖掘所采用。两者的目标也非常相似:EDA确实确保你以一种有趣的功能以及功能之间的关系变得更加清晰的方式来探索数据。在EDA中, 通常使用多种技术来探索和比较许多不同的变量, 以搜索和找到系统的模式。另一方面, 数据挖掘与从数据中提取模式有关。这些模式提供了可用于改善业务决策的变量之间关系的见解。此外, 在两种情况下, 你都没有先验期望或变量之间的关系不完整的期望。

但是, 一般而言, 数据挖掘可以说是面向应用程序的, 而EDA则关注基础现象的基本性质。换句话说, 数据挖掘相对较少地涉及识别所涉及变量之间的特定关系。结果, Data Mining接受了一种”黑匣子”方法进行数据探索, 不仅使用了EDA中也使用的技术, 而且还使用了诸如Neural Networks之类的技术来生成有效的预测, 但没有识别出其特定的性质。预测所基于的变量之间的关系。

数据基本说明

就像你在上面阅读的一样, EDA就是要了解你的数据。为此, 最基本的步骤之一就是获取数据的基本描述。数据的基本描述确实是一个非常宽泛的术语:你可以将其解释为获取有关数据的快速而肮脏的方式, 以及获取有关数据的一些简单易懂的信息的方式, 基本了解你的数据等

本节将不会对这两种解释进行区分:的确会向你介绍一些可以快速在DataFrame上快速收集易于理解的信息的方法。

描述数据

例如, 你可以使用describe()函数来获取各种排除NaN值的摘要统计信息。考虑这个示例, 在其中描述了著名的Iris数据集。数据已经在srcmini Light块中为你加载:

你会看到此函数返回了计数, 平均值, 标准偏差, 最小值和最大值以及数据的分位数。请注意, 当然, Python中有许多可用的软件包可以为你提供这些统计信息, 包括Pandas本身。使用此功能只是获取此信息的方法之一。

另请注意, 如果你还没有花时间深入研究描述性统计数据, 则一定要花些时间。你可以使用这些描述性统计信息来开始评估数据的质量。然后, 你可以决定是否需要以其他方式更正, 丢弃或处理数据。这通常是数据分析步骤。 EDA中的这一步骤旨在更好地理解数据元素及其异常, 并一方面查看数据如何与文档匹配, 另一方面满足业务需求。

请注意, 在进行探索性数据分析时, 你将回到数据分析步骤, 因为数据质量会受到所要执行的步骤的影响。

第一个和最后一个DataFrame行

既然你已经对数据集有了一个大致的了解, 那么仔细了解数据本身也是个好主意。借助Pandas库的head()和tail()函数, 你可以轻松地分别检出DataFrame的第一行和最后一行。

使用下面的srcmini Light块中的head()和tail()函数检查手写数字数据的前五行和后五行。数据已经在srcmini Light块中为你加载:

你会发现, 当你不熟悉此类数据时, head()和tail()函数的结果并不能说太多。

你可能只看到其中包含数值的一堆行和列。如果还没有读完数据集说明, 请考虑阅读, 这将为你提供有关如何收集数据的相关信息, 并指出属性和行的数量, 这可以方便地检查你是否已导入数据集。数据正确。

此外, 返回到你最初的发现:行中的数值。乍一看, 你可能不会认为这是有问题的, 因为整数值看起来是正确的, 并且当你初看时不会升起任何标志。

但是, 如果你将所有这些工作都放在另一个数据集上(例如日期时间信息)进行处理, 那么快速浏览一下这些代码行的结果可能会引发以下问题: :”是否已以DateTime的形式读取我的数据?”, “如何检查?”和”如何更改数据类型?”。

这些是你通常会在数据分析步骤中解决的更深层的问题, 将在下一篇文章中解决。

数据采样

如果数据集很大, 则可以考虑对数据进行采样, 这是一种快速了解数据的简便方法。作为一种简便的方法, 你可以使用Pandas中包含的sample()函数, 如下所示:

另一种可能更复杂的方法是创建随机索引, 然后从DataFrame中获取随机行。你会看到以下代码使用了随机软件包, 该软件包具有一个模块样本, 该样本可与range()和len()结合使用来对数据进行抽样。请注意, 你还使用ix来选择要包含在样本中的DataFrame的确切行。

如果你不知道为什么要在这种情况下使用ix, 那么srcmini的更具体的教程会有所帮助!它详细介绍了这些更一般的主题。单击上面包含的链接, 去检查一下!

现在, 让我们练习我们的Python技能!开始进行以下练习:

仔细查看你的数据:查询

现在, 你已经快速浏览了数据并了解了数据的含义, 你可以进行更深入的研究:是时候通过查询数据进一步检查数据了。

这可以通过query()函数轻松实现, 该函数使你可以测试关于数据的一些非常简单的假设, 例如”花瓣长度通常大于萼片长度吗?”或”花瓣长度有时等于萼片长度吗?”。

你会发现此假设不成立。结果你将获得一个空的DataFrame。

注意, 该函数也可以表示为iris [iris.Petal_length> iris.Sepal_length]。

你数据的挑战

现在, 你已经收集了有关数据的一些基本信息, 这是一个好主意, 请稍微深入一点数据可能带来的挑战。如果你已经完成了数据剖析步骤, 那么就会知道缺少的值, 并且会知道哪些值可能是异常值, 等等。

本节将描述一些已经了解这些事情的基本方法, 并描述在发现数据不规则的情况下如何处理数据。再次请注意, 你将在数据剖析步骤中发现或发现这些异常情况, 或者已经做得更深入, 并且一旦你处理了数据带来的一些挑战, 通常返回到此步骤是正常的。

缺失值

在浏览数据时, 你可能还需要检查的是数据集是否缺少任何值。

检查这一点很重要, 因为当某些数据丢失时, 数据集可能失去表达能力, 这可能导致分析结果偏弱或带有偏见。实际上, 这意味着当你缺少某些功能的值时, 分类或对数据进行预测的机会只会增加。

当然, 导致数据集中的数据丢失的原因可能是数据提取或导入错误的结果, 也可能是收集过程的结果。为你提供数据的系统可能会出现故障, 或者你发送的调查结果可能有些空白, 我的受访者不予理会。同样重要的是, 还要考虑丢失的数据中是否存在某种模式, 这对于数据分析步骤很有用。请记住, 你可以使用数据概要分析来更好地了解数据质量。你可以在后续文章中了解更多有关如何发现丢失数据模式的信息。

简而言之, 丢失数据的原因可能多种多样, 并且很大程度上取决于数据上下文, 但也可能取决于你自己。这就是为什么在前面的步骤之一中导入数据时首先要检查数据的原因!

要标识包含缺失值的行, 可以使用isnull()。在返回结果中, 你会看到每个单元格中出现True或False:True表示该单元格中包含的值是缺失值, False表示该单元格包含”正常”值。

在这种情况下, 你会看到数据非常完整:没有缺失值。

请注意, 你也可以在上面链接的UCI机器学习存储库的数据集描述中阅读此内容, 在该描述中你将看到没有列出缺少的数据值。

但是, 并非每个遇到的数据集都是如此。这就是为什么在遇到需要丢失数据的情况下需要思考的情况时, 知道该怎么做的好原因。

  • 你可以删除丢失的数据:你可以删除整个记录, 也可以只保留仍存在感兴趣功能的记录。当然, 你必须小心执行此过程, 因为删除数据也可能会影响你的分析。因此, 你应该问自己一个问题:记录中某些数据丢失的概率是否与所有其他记录相同。如果每个记录的概率不变, 则删除丢失的数据是有效的选择。
  • 除删除外, 如果单元格包含缺少值, 则还可以使用所谓的”输入方法”来填充单元格。如果你已有丰富的统计经验, 那么你就会知道插补是用替换值替换缺失数据的过程。你可以填写均值, 众数或中位数。当然, 在这里你需要考虑是否要获取一个变量所有缺失值的平均值或中位数, 或者是否要基于另一个变量替换缺失值。例如, 对于你的记录具有特征的分类变量(例如” male”或” female”)的数据, 你可能还希望在替换缺失值之前考虑那些特征, 因为观察结果可能与男性和女性不同。如果是这种情况, 你可以只计算女性观察值的平均值, 然后用该平均值填写其他”女性”记录的缺失值。
  • 借助回归, 方差分析, 逻辑回归或其他建模技术估算值。到目前为止, 这是填写值的最复杂的方法。
  • 你用与缺少值的记录最相似的记录值填充单元格。在这种情况下, 可以使用KNN或K最近邻居。

请注意, 上述每种丢失数据的方式都有其优点和缺点!在对此做出最终决定之前, 你需要考虑诸如时间, 费用, 数据性质等因素。

当你最终决定如何处理丢失的数据时, 请继续阅读以了解如何实施要在数据中看到的更改。

填写缺失值

如果你确实决定使用插补来填充值, 则仍然可以选择实现方式!

将Pandas fillna()与NumPy必须提供的功能结合使用。考虑下面的代码块, 其中应该有一个DataFrame, 其中包含要求人们工资的调查结果。假设你的听众来自社会上同一个阶级, 并且每个人回答问题的可能性都相同, 那么你可以选择计算回答问题的人的平均值, 并使用该平均值填写没有回答的人的价值观。


# Import NumPy
import numpy as np

# Calculate the mean
mean = np.mean(df.Salary)

# Replace missing values with the mean
df. = df.Salary.fillna(mean)

当然, 你不一定需要将值传递给fillna()。你还可以通过将参数方法添加到fillna()函数来向前或向后传播非null值。传递填充或填充以指定要向后或向前填充值。

删除缺少值的标签

要排除包含缺少值的列或行, 可以使用Pandas的dropna()函数:


# Drop rows with missing values
df.dropna(axis=0)

# Drop columns with missing values 
df.dropna(axis=1)

插补

或者, 你也可以选择插入缺失值:interpolate()函数将在缺失数据点执行线性插值, 以”猜测”最有可能填充的值。


df.interpolate()

你还可以添加method参数来访问更高级的插值方法, 例如多项式插值或三次插值, 但是当你要使用这些类型的插值时, 需要安装SciPy。

当然, 插值是有限制的, 特别是如果用于插值的NaN值与上一次有效观测值相距太远时。在这种情况下, 你想在原始代码中添加一个限制参数。你向其传递一个正整数, 该数字将确定将填写非NaN值之后的多少个值。默认的限制方向是正向, 但是你也可以通过添加limit_direction来更改

离群值

就像丢失值一样, 你的数据也可能包含与大多数其他数据有很大差异的值。这些数据点称为”异常值”。要找到它们, 你可以通过箱形图检查单个变量的分布, 或者可以对数据进行散点图以识别不在该图的”预期”区域中的数据点。

数据异常的原因可能会有所不同, 从系统错误到通过数据输入或数据处理来干扰数据的人, 但重要的是要考虑它们可能对你的分析产生的影响:它们会改变统计检验的结果例如标准差, 均值或中位数, 它们可能会降低正态性并影响统计模型的结果, 例如回归或ANOVA。

要处理离群值, 你可以删除, 变换或插入它们:决定将再次取决于数据上下文。这就是为什么再次了解你的数据并找出异常原因的重要性:

  • 如果异常值是由于数据输入或数据处理错误引起的, 则可以考虑删除该值。
  • 你可以通过为观察值分配权重来变换离群值, 或使用自然对数来减少数据集中离群值引起的变化。
  • 就像缺失值一样, 你也可以使用插补方法将数据的极值替换为中值, 均值或众数。

你可以使用上一节中描述的功能来处理数据中的异常值。

你数据的功能

请注意, 此步骤是你与其他数据科学任务一起反复执行的步骤:将构建模型并进行验证, 但是此后, 你可能会决定调整功能并再次迭代以构建模型等。

特征工程

你可以使用要素工程作为通过从原始数据创建要素以帮助学习过程来提高学习算法的预测能力的一种方式。为此, 你可以根据数据中现有的原始特征创建其他相关特征。

功能工程需要花费一些时间才能掌握。并非总是很清楚如何处理原始数据, 以帮助你预测数据。但是, 当你在寻找为数据集设计特征的方法时, 以下列表可能会提供一些帮助:

  • 分解特征:使用factorize()将分类变量编码为数值变量, 例如本示例:
  • 将连续变量分组存储:使用cut()可以将某列的值切割为bins
  • 缩放功能:将数据居中于0左右。你可以使用Scikit-Learn的预处理模块:

提示:仔细研究Scikit-Learn的预处理模块, 你会发现它包含一些方便的功能, 这些功能将帮助你为数据提供新功能!

请注意, 这些只是设计新功能以使数据更具预测性的一些方式!关键是头脑风暴新功能或将旧功能组合在一起, 并尝试使用Scikit-Learn测试其有效性。

功能选择

选择要素时, 请选择原始数据要素的关键子集, 以尝试减少训练问题的维度。这似乎与你可能已经知道的其他降维技术非常相似, 例如PCA。但是, 两者之间存在差异:PCA组合了相似(相关)的属性, 并创建了新的属性, 这些属性被认为优于数据集的原始属性。功能选择不结合属性:它评估质量和预测能力并选择最佳集合。

要找到重要的功能, 可以使用RandomForest算法:它随机生成数千个决策树, 并轮流删除每个变量以拟合模型。这样, 当你将一个变量排除在等式之外时, 你可以计算模型的优劣。你可以使用Scikit-Learn Python库来实现此算法:

你会发现最好的功能集是包含花瓣长度和花瓣宽度数据的功能。

请注意, 你还可以使用Matplotlib可视化特征选择的结果:


# Import `pyplot` and `numpy`
import matplotlib.pyplot as plt
import numpy as np

# Isolate feature importances 
importance = rfc.feature_importances_

# Sort the feature importances 
sorted_importances = np.argsort(importance)

# Insert padding
padding = np.arange(len(names)-1) + 0.5

# Plot the data
plt.barh(padding, importance[sorted_importances], align='center')

# Customize the plot
plt.yticks(padding, names[sorted_importances])
plt.xlabel("Relative Importance")
plt.title("Variable Importance")

# Show the plot
plt.show()
功能选择熊猫

数据中的模式

探索数据时可以采取的下一步骤之一是识别数据中的模式, 其中包括数据属性之间或缺失数据之间的相关性。可以做到这一点的一件事就是数据的可视化。而且这不必是静态的:敢于使用Python库Bokeh或Plotly对数据进行交互式可视化。

Matplotlib的相关性识别

现在, 你已经查看了数字并以定量方式分析了数据, 还发现以可视方式考虑数据很有用。现在该还以可视方式浏览数据。

要轻松, 快速地执行此操作, 可以使用Python数据可视化库Matplotlib。具有讽刺意味的是, 唯一阻碍你前进的就是你的数据:众所周知, 你的数据具有64列或功能。当你拥有如此多的功能时, 就意味着你正在使用高维数据。

确切地说是什么尺寸数据, 你将在我们的机器学习教程中学习, 但现在最好理解一下, 如果你想在2D或3D图中可视化数据, 则只需要两个或多个数据即可。三个维度。这意味着你需要减小数据的尺寸。

这意味着你必须使用降维技术, 例如主成分分析(PCA):

当你检查精简数据时, 这些列或要素现在已精简为两个。行或观测值的数量仍然相同, 即3823。现在你的数据格式正确, 现在该开始绘图了!

选择正确的地块已经是一个不错的开始, 但是你会选择什么呢?

在这种情况下, 你正在浏览数据, 因此你可能希望发现数据属性之间的可能关联。散点图可能是可视化此方法的一种好方法:它使你可以识别从降维中获得的两个特征之间的关系。


import matplotlib.pyplot as plt

plt.scatter(reduced_data[:, 0], reduced_data[:, 1], c=labels, cmap = 'viridis')

plt.show()
关联Python

与散景的相关性识别

其次, 你还可以考虑使用Bokeh构造一个交互式图以发现数据中属性之间的相关性。 Bokeh库是一个Python交互式可视化库, 它以现代Web浏览器为目标进行演示。如果你要处理大型或流数据集, 这是理想的选择, 但是如以下示例所示, 你也可以将其用于”常规”数据。

代码非常简单:导入必要的模块, 构造散点图, 配置默认的输出状态以生成在调用show()时保存到文件的输出。最后, 调用show()来查看已构建的散点图!


# Import the necessary modules
from bokeh.charts import Scatter, output_file, show

# Construct the scatter plot
p = Scatter(iris, x='Petal_length', y='Petal_width', color="Class", title="Petal Length vs Petal Width", xlabel="Sepal Length", ylabel="Sepal Width")

# Output the file 
output_file('scatter.html')

# Show the scatter plot
show(p)

结果很优雅:

Python数据探索

请注意, 这是该图的静态保存图像, 但是在笔记本或终端中生成的图将是交互式的!当然, 这只是如何使用Bokeh制作交互式图形的一个简单示例。请务必查看”散景图库”以获得更多灵感, 或参加srcmini的”散景交互式数据可视化”课程。

与熊猫的相关性识别

在上一节中看到的图是探索数据属性之间相关性的一种直观方法。但这并不意味着你不能以定量的方式探索这一指标!当你决定这样做时, 请使用Pandas的corr()函数。但请注意, 此计算中不包括NaN或null值!

请注意, 最后两个相关度量要求你在计算系数之前对数据进行排名。你可以使用rank()轻松完成此操作:对于上面的练习, 通过为你执行iris.rank()对虹膜数据进行了排名。

此外, 还存在一些可以使这些相关性起作用的假设:Pearson相关性假设你的变量呈正态分布, 每个变量之间存在直线关系, 数据围绕回归线呈正态分布。另一方面, Spearman相关性假定你有两个序数变量或两个以某种方式关联但不是线性关联的变量。

Kendall Tau相关系数是代表两列排名数据之间的一致性程度的系数。你可以使用Spearman相关性来测量两个变量之间的关联度。它们看起来彼此非常相似, 不是吗?

尽管Kendal和Spearman相关度量看起来相似, 但是它们确实有所不同:确切的区别在于计算的不同。 Kendal Tau系数由一致对的数量减去不一致对的数量除以总对的数量得出。 Spearman系数是偏差的总和, 乘以n乘以n减去1。

Spearman的系数通常会大于Kendall的Tau系数, 但并非总是如此:当数据观测值之间的偏差很大时, 你将获得较小的Spearman系数。 Spearman相关性对此非常敏感, 在某些情况下可能会派上用场!

因此, 你什么时候要使用哪个系数, 因为这两个相关性实际上测试的是不同的东西。 Kendall的Tau代表的是一致对相对于不一致对的比例, 而Spearman系数并不代表这一点。你还可以辩称, Kendall Tau相关性具有更直观的解释, 更易于计算, 可以更好地估计相应的总体参数, 并且在小样本量中p值更准确。

提示添加print()函数以查看列的特定成对相关计算的结果。

向前!

恭喜, 你已经完成了《熊猫教程》的结尾!现在, 你已经掌握了一些基本技术, 可用于使用Python探索数据。

如果你想进一步深入研究该主题, 那么我们的Pandas课程系列非常适合:查看我们的Pandas基础知识, 将数据框架与Pandas合并或操作数据框架与Pandas课程。

但是, 如果你准备好继续学习Pandas并进一步探索Matplotlib软件包, 请考虑阅读srcmini的Python数据可视化教程或开始对数据建模!继续阅读我们的机器学习教程, 以了解如何构建机器学习模型以自动识别手写数字!

赞(0)
未经允许不得转载:srcmini » Python探索性数据分析教程

评论 抢沙发

评论前必须登录!