数据科学家会直观呈现数据,以更好地理解数据。 他们可以扫描原始数据、检查摘要度量值(如平均值)或绘制数据图表。 图表是一种可视化数据的强有力方式,数据科学家经常使用图表快速了解适度复杂的模式。
直观地表示数据
绘制图表是为了提供对数据的快速定性评估,这有助于理解结果、查找离群值、了解数字的分布方式等。
尽管有时候我们提前知道哪种图表最有用,但其他时候我们以探索性的方式使用图表。 若要了解数据可视化效果的强大功能,请考虑以下数据:无人驾驶汽车的位置 (x,y)。 在数据的原始形式下,很难看到任何真实的模式。 平均值告诉我们,汽车的路径以 x = 0.2 和 y = 0.3 为中心,数值范围似乎介于 -2 和 2 之间。
使用Matplotlib直观呈现数据
加载上一次的数据,在这次尝试图形化
DataFrames提供了一种探索和分析表格数据的好方法,但有时一张图片胜过一千行和一千列。Matplotlib库提供了绘制数据可视化的基础,可以大大增强您分析数据的能力。
让我们从一个简单的条形图开始,它显示了每个学生的成绩。
好吧,这是有效的,但图表可以使用一些改进,使它更清楚我们正在看什么。
请注意,您使用了Matplotlib中的pyplot类来绘制图表。这个类提供了许多方法来改进绘图的视觉元素。例如,下面的代码:
Specifies the color of the bar chart.
指定条形图的颜色。
Adds a title to the chart (so we know what it represents)
在图表中添加标题(以便我们知道它代表什么)
Adds labels to the X and Y axes (so we know which axis shows which data)
向X和Y轴添加标签(以便我们知道哪个轴显示哪个数据)
Adds a grid (to make it easier to determine the values for the bars)
添加网格(以便于确定条形图的值)
Rotates the X markers (so we can read them)
旋转X标记(以便我们可以读取它们)
我们可以通过figure()方法,来控制图形的大小
一个图形可以包含多个子图,每个子图都在自己的轴上。
例如,下面的代码创建一个具有两个子图的图形:一个是显示学生成绩的条形图,另一个是比较及格与不及格成绩的饼图。
到目前为止,您一直使用Matplotlib.pyplot对象的方法绘制图表。然而,Matplotlib是Python中图形的基础,许多包,包括Pandas,提供了抽象底层Matplotlib函数和简化绘图的方法。例如,DataFrame提供了自己的方法来绘制数据,如下面的示例所示,该示例绘制了学习时数的条形图。
统计分析入门
现在你已经知道如何使用Python来操作和可视化数据,你可以开始分析它了。
许多数据科学都植根于统计学,因此我们将探索一些基本的统计技术。
(仅仅是一些统计概念和技术)
描述性统计和数据分布
在检查变量(例如,学生成绩样本)时,数据科学家对其分布特别感兴趣(换句话说,所有不同的成绩值如何在样本中分布)。这种探索的起点通常是将数据可视化为直方图,并查看变量的每个值出现的频率。
等级的直方图是对称的形状,其中最常出现的等级往往在范围的中间(大约50),在尺度的极端处的等级较少。
集中量数
为了更好地理解分布,我们可以研究所谓的集中趋势的度量,这是一种描述代表数据“中间”的统计数据的奇特方式。这种分析的目的是试图找到一个“典型”值。定义数据中间的常见方法包括:
The mean: A simple average based on adding together all of the values in the sample set and then dividing the total by the number of samples.
平均值:将样本集中的所有值相加,然后将总和除以样本数得到的简单平均值。
The median: The value in the middle of the range of all of the sample values.
中位数:所有样本值范围中间的值。
The mode: The most commonly occurring value in the sample set*.
众数:样品组*中最常出现的值。
让我们计算这些值,沿着最小值和最大值以进行比较,并将它们显示在直方图上。
箱形图以不同于直方图的格式显示坡率值的分布。图的方框部分显示数据的内部两个四分位数所在的位置。在这种情况下,一半的等级在大约36到63之间。从方框中延伸出来的胡须显示了外部的两个四分位数,因此本例中的另一半等级介于0和36之间或63和100之间。框中的线表示中值。
对于学习,将直方图和箱线图结合起来是很有用的,其中箱线图的方向被改变以使其与直方图对齐。(在某些方面,将直方图视为分布的“正视图”,将箱形图视为分布的“平面图”是有帮助的。
所有集中趋势的测量值都位于数据分布的中间,这是对称的,从中间开始,值在两个方向上逐渐变低。
为了更详细地探索这种分布,您需要了解统计学的基本原理是获取数据样本并使用概率函数来推断有关整个数据总体的信息。
这是什么意思呢?样本指的是我们手头上的数据,比如这22名学生的学习习惯和成绩等信息。人口是指我们可以收集的所有可能的数据,例如历史上每个教育机构的每个学生的成绩和学习习惯。通常,我们感兴趣的是人口,但收集所有这些数据是不切实际的。相反,我们需要尝试从我们拥有的少量数据(样本)中估计人口是什么样的。
如果我们有足够的样本,我们可以计算一个称为概率密度函数的东西,它估计了整个人口的等级分布。
Matplotlib中的pyplot类提供了一个有用的plot函数来显示这个密度。
真实世界的数据分布
现在让我们来看看学习时间数据的分布
学习时间数据的分布与年级的分布有显著差异。
请注意,箱形图的须线仅从6. 0左右开始开始,这表明第一季度的绝大多数数据都高于此值。最小值用o标记,表明它在统计上是一个离群值:一个显著位于分布其余部分范围之外的值。
异常值的出现有多种原因。也许一个学生打算记录“10”小时的学习时间,但输入了“1”,错过了“0”。又或者,这学生平时学习的时候,就是异常的懒!无论哪种方式,这是一个统计异常,并不代表一个典型的学生。让我们看看没有它的分布是什么样的。
出于学习的目的,我们只是将值1视为真正的离群值并将其排除在外。在真实的世界中,当我们的样本量如此之小时,在没有更多理由的情况下排除极端数据是不寻常的。这是因为我们的样本量越小,我们的抽样越有可能代表整个人口。(Here,人口意味着所有学生的成绩,而不仅仅是我们的22。例如,如果我们对另外1,000名学生的学习时间进行抽样,我们可能会发现,学习不多实际上是很常见的!
当我们有更多的数据可用时,我们的样本变得更可靠。这使得更容易将离群值视为低于或高于大多数数据所在的范围的值。例如,以下代码使用Pandas分位数函数排除低于第0.01百分位数(99%的数据位于该值之上)的观测。
提示:可以通过在高百分位值处定义阈值来消除分布上端的离群值。例如,你可以使用分位数函数来查找0.99百分位数,99%的数据位于该百分位数以下。
去除离群值后,箱形图显示了四个四分位数内的所有数据。请注意,该分布不像坡度数据那样对称。有些学生的学习时间非常长,大约为16小时,但大部分数据都在7到13小时之间。少数极高的值将平均值拉向量表的高端。
让我们看看这个分布的密度。
这种分布称为右偏分布。大量数据位于分布的左侧,由于极端高端的值将均值拉到右侧,因此向右创建了一个长尾。
方差度量
所以现在我们有一个很好的想法,在年级和学习时间数据分布的中间。然而,我们应该检查分布的另一个方面:数据中有多少可变性?
衡量数据可变性的典型统计量包括:
Range: The difference between the maximum and minimum. There's no built-in function for this, but it's easy to calculate using the min and max functions.
范围:最大值和最小值之间的差值。没有内置的函数,但使用min和max函数很容易计算。
Variance: The average of the squared difference from the mean. You can use the built-in var function to find this.
方差:与平均值的平方差的平均值。您可以使用内置的var函数来找到它。
Standard Deviation: The square root of the variance. You can use the built-in std function to find this.
标准差:方差的平方根。你可以使用内置的std函数来找到它。
在这些统计数据中,标准差通常是最有用的。它以与数据本身相同的尺度提供数据方差的度量(因此,等级分布的等级点和学习时间分布的小时数)。标准差越高,将分布中的值与分布均值进行比较时的方差就越大;换句话说,数据更加分散。
当使用正态分布时,标准差与正态分布的特定特征一起使用,以提供更好的洞察力。运行以下单元格以查看标准差与正态分布中的数据之间的关系。
水平线显示在平均值的一个、两个和三个标准差(正或负)内的数据的百分比。
在任何正态分布中:.
大约68.26%的值在平均值的一个标准差内。
大约95.45%的值落在平均值的两个标准差内。
大约99.73%的值落在平均值的三个标准差内。
所以,因为我们知道平均成绩是49.18,标准差是21.74,成绩分布近似正态分布,我们可以计算出68.26%的学生应该达到27.44和70.92之间的成绩。
我们用来了解学生数据变量分布的描述性统计是统计分析的基础。因为它们是探索数据的重要部分,所以DataFrame对象有一个内置的describe方法,它返回所有数值列的主要描述性统计信息。
比较数据
现在您已经了解了数据集中数据的统计分布,可以检查数据以确定变量之间的任何明显关系。
首先,让我们删除任何包含离群值的行,以便我们拥有代表典型学生班级的样本。我们发现StudyHours列包含一些值极低的离群值,因此我们将删除这些行。
比较数据和分类变量
数据包括两个数值变量(学习时间和成绩)和两个分类变量(姓名和通过)。让我们首先将数值StudyHours列与分类Pass列进行比较,以查看学习的小时数与及格分数之间是否存在明显的关系。
为了进行这种比较,让我们创建箱形图,显示每个可能的Pass值(true和false)的StudyHours分布。
比较数值变量
现在让我们比较两个数值变量。我们将首先创建一个显示成绩和学习时间的条形图。
图表显示了每个学生的成绩和学习时间,但由于数值在不同的尺度上,因此不容易进行比较。一个等级是以等级点来衡量的(范围从3到97),学习时间以小时来衡量(范围从1到16)。
在处理不同尺度的数值数据时,一种常见的技术是对数据进行归一化,以便值保持其比例分布,但在相同的尺度上进行测量。为了实现这一点,我们将使用一种称为MinMax缩放的技术,该技术将值按比例分布在0到1的范围内。你可以编写代码来应用这种转换,但Scikit-Learn库提供了一个缩放器来为你做这件事。
将数据标准化后,更容易看到成绩和学习时间之间的明显关系。这不是一个完全匹配的结果,但看起来分数高的学生学习得更多。
因此,学习时间和成绩之间似乎存在相关性。事实上,我们可以使用统计相关性度量来量化这些列之间的关系。
相关性统计量是一个介于-1和1之间的值,表示关系的强度。大于0的值表示正相关(一个变量的高值往往与另一个变量的高值一致),而小于0的值表示负相关(一个变量的高值往往与另一个变量的低值一致)。在这种情况下,相关值接近于1,显示出学习时间和成绩之间的强正相关。
可视化两个数字列之间明显相关性的另一种方法是使用散点图
再次,看起来有一个明显的模式,学习时间最长的学生也是成绩最高的学生。
我们可以通过在显示数据总体趋势的图中添加回归线(或最佳拟合线)来更清楚地看到这一点。为此,我们将使用一种称为最小二乘回归的统计技术。
还记得你在学校学习如何解线性方程组的时候,记得线性方程的斜率截距形式看起来像这样:
在这个等式中,y和x是坐标变量,m是直线的斜率,B是y轴截距(直线通过Y轴的位置)。
在学生数据的散点图中,我们已经有了x(StudyHours)和y(Grade)的值,所以我们只需要计算最接近这些点的直线的截距和斜率。然后,我们可以形成一个线性方程,为我们的每个x(StudyHours)值计算该线上的新y值。为了避免混淆,我们将这个新的y值称为f(x)(因为它是基于x的线性方程函数的输出)。原始y(等级)值和f(x)值之间的差是我们的回归线和学生实际等级之间的误差。我们的目标是计算具有最低总体误差的直线的斜率和截距。
具体来说,我们通过对每个点的误差进行平方,并将所有平方误差相加来定义总误差。最佳拟合线是为我们提供平方误差之和的最低值的线,因此称为最小二乘回归。
幸运的是,您不需要自己编写回归计算代码。SciPy包包括一个stats类,它提供了一个linregress方法来为您完成这项艰巨的工作。这将返回斜率方程所需的系数:基于要比较的给定变量样本对的斜率(m)和截距(B)。
请注意,这一次,代码绘制了两个不同的东西:像以前一样绘制了样本学习时间和成绩的散点图,然后绘制了基于最小二乘回归系数的最佳拟合线。
图上方显示了回归线计算的斜率和截距系数。
该线基于为每个StudyHours值计算的f(x)值。运行以下单元格以查看包含以下值的表:
每个学生的学习时间
每个学生取得的成绩
使用回归线系数计算的f(x)值
计算的f(x)值与实际坡率值之间的误差
有些错误,特别是在极端情况下,是相当大的(高达17.5级以上)。但是,总的来说,这条线非常接近实际成绩。
使用回归系数预测