Skip to content

Latest commit

 

History

History
321 lines (189 loc) · 17.8 KB

basic-statistics-python-descriptive-statistics.md

File metadata and controls

321 lines (189 loc) · 17.8 KB

Python 中的基础统计学:描述性统计

原文:www.kdnuggets.com/2018/08/basic-statistics-python-descriptive-statistics.html

c 评论

作者:Christian Pascual,Dataquest

统计学领域常常被误解,但它在我们日常生活中扮演着重要角色。正确进行统计学分析可以让我们从模糊、复杂和困难的现实世界中提取知识。如果使用不当,统计学也可能被用来伤害和误导。清楚地理解统计学和各种统计度量的含义对于区分真相和误导至关重要。

我们将在本文中覆盖以下内容:

  • 定义统计学

  • 描述性统计

    • 集中趋势的度量

    • 离散度的度量

前提条件:

本文假设没有统计学的先验知识,但需要至少具备一般的 Python 知识。如果你对for循环列表感到不舒服,我建议在继续之前简要了解这些内容。

加载我们的数据

我们将把统计学讨论的根基建立在现实世界的数据上,这些数据来自 Kaggle 的Wine Reviews数据集。数据本身来源于一个抓取程序,该程序扫描了Wine Enthusiast 网站

为了这篇文章的目的,假设你是一名正在培训中的侍酒师,还是一名新的品酒师。你发现了一个有趣的葡萄酒数据集,你希望比较和对比不同的葡萄酒。你将使用统计学来描述数据集中的葡萄酒,并为自己得出一些见解。也许我们可以从一组便宜的葡萄酒开始培训,或者从评分最高的葡萄酒开始?

下面的代码将数据集wine-data.csv加载到一个名为wines的变量中,作为列表的列表。我们将在整个文章中对wines进行统计。你可以使用这段代码在自己的计算机上跟随操作。

import csv
with open("wine-data.csv", "r", encoding="latin-1") as f:
    wines = list(csv.reader(f))

我们简要查看数据表的前五行,以便了解我们正在处理的值类型。

index 国家 描述 指定 分数 价格 省份 区域 _1 区域 _2 品种 酒庄
0 美国 "这款 100%..." Martha's Vineyard 96 235 加利福尼亚 纳帕谷 纳帕 赤霞珠 Heitz
1 西班牙 "成熟的无花果香气..." Carodorum Selecci Especial Reserva 96 110 西北西班牙 托罗 Tinta de Toro Bodega Carmen Rodriguez
2 美国 "Mac Watson honors... 特选晚收 96 90 加利福尼亚 骑士谷 索诺玛 长相思 Macauley
3 美国 "这款酒陈放了 20 个月..." Reserve 96 65 俄勒冈 威拉米特谷 威拉米特谷 黑比诺 Ponzi
4 法国 "这是顶级的葡萄酒..." La Brelade 95 66 普罗旺斯 邦多尔 普罗旺斯红葡萄酒混合 Domaine de la Begude

统计学究竟是什么?

这个问题非常复杂。统计学是许许多多的东西,因此试图将其压缩成简短的总结无疑会掩盖一些细节,但我们必须从某个地方开始。

作为一个整体领域,统计学可以被视为一个科学的数据处理框架。这一定义包括了与数据的收集、分析和解释相关的所有任务。统计学也可以指代表数据本身的总结或方面的个别测量。贯穿整篇文章,我们将尽力区分这一领域和实际的测量。

这自然引出了一个问题:什么是数据?幸运的是,数据的定义相对简单。数据是对世界的观察的广泛集合,性质可以是定性的也可以是定量的。研究人员通过实验收集数据,企业家通过用户收集数据,游戏公司则收集玩家行为的数据。

这些例子指出了数据的另一个重要方面:观察通常涉及一个感兴趣的总体。回到之前的例子,研究人员可能在研究一组具有特定病症的患者。对于我们的数据来说,涉及的总体是一组葡萄酒评论。术语总体有意含糊。通过清晰定义我们的总体,我们能够对数据进行统计分析,并从中提取知识。

那么,我们为什么要关注总体呢?能够比较和对比总体对于测试我们对世界的观点是非常有用的。我们希望知道接受新治疗的患者是否真的比接受安慰剂的患者表现更好,但我们也希望定量证明这一点。这就是统计学的作用:提供一种严格的方法来处理数据,并根据现实世界中的实际事件而非抽象的猜测做出决策。

关键要点:

  • 统计学是数据的科学。

  • 数据是对感兴趣的总体的任何观察集合。

  • 统计学为我们提供了一种具体的方式,通过数字而非模糊的描述来比较总体。

描述统计学

当我们拥有一组观察数据时,将数据特征总结成一个单一的陈述,即描述统计量,是很有用的。正如其名称所示,描述统计量描述了它们所总结的数据的特定特征。这些统计量分为两个主要类别:中心趋势的测量分布的测量

中心趋势的测量

中心趋势的度量是表示以下问题答案的指标:“我们的数据中间部分是什么样的?”“中间”这个词比较模糊,因为我们可以用多种定义来表示中间。我们将探讨每种新的度量如何改变我们对中间的定义。

均值

均值 是一个描述统计量,用于查看数据集的平均值。虽然均值是技术术语,但大多数人会理解为平均值

这个均值是如何计算的?下面的图片展示了实际的方程式,并将计算组件分解为更简单的术语。

均值分解

对于均值来说,数据集的“中间”指的是这个典型值。均值代表一个典型的观察值。如果我们随机选择一个观察值,那么很可能得到一个接近均值的值。

在 Python 中计算均值是一个简单的任务。我们来找出数据集中葡萄酒评分的平均值。

# Extract all of the scores from the data set 
scores = [float(w[4]) for w in wines]

# Sum up all of the scores 
sum_score = sum(scores)

# Get the number of observations
num_score = len(scores)

# Now calculate the average
avg_score = sum_score/num_score
avg_score
>>> 87.8884184721394

数据集中葡萄酒的平均评分告诉我们,数据集中“典型”的评分大约是 87.8。这个结果表明,大多数葡萄酒的评分很高,假设评分范围是 0 到 100。然而,我们必须注意到 Wine Enthusiast 网站选择不发布评分低于 80 的评论。

均值有多种类型,但这种形式是最常见的。这个均值被称为算术均值,因为我们是在对感兴趣的值进行求和。

中位数

我们接下来要讨论的中心趋势度量是中位数。中位数也试图定义数据集中的典型值,但与均值不同,它不需要计算。

要找到中位数,我们首先需要将数据集按升序重新排序。然后,中位数是与数据集中的中间部分相一致的值。如果有偶数个项,我们则取“包围”中间的两个值的平均值。

中位数解释

虽然 Python 的标准库不支持中位数函数,但我们仍然可以使用我们描述的过程来找到中位数。我们来尝试找出葡萄酒价格的中位数值。

# Isolate prices from the data set
prices = [float(w[5]) for w in wines if w[5] != ""]

# Find the number of wine prices 
num_wines = len(prices)

# We'll sort the wine prices into ascending order
sorted_prices = sorted(prices)

# We'll calculate the middle index 
middle = (num_wines / 2) + 0.5

# Now we can return the median
sorted_prices[middle]
>>> 24

数据集中一瓶葡萄酒的中位数价格是 $24。这一发现表明,数据集中至少有一半的葡萄酒售价为 $24 或更少。这相当不错!如果我们试图找到均值会怎样呢?考虑到它们都代表典型值,我们会期望它们大致相同。

sum(prices)/len(prices)
>>> 33.13

平均价格 $33.13 显然与我们的中位数价格相差很远,那么这里发生了什么?均值和中位数之间的差异是由于鲁棒性

异常值的问题

记住,均值是通过将我们想要的所有值相加并除以项目数量来计算的,而中位数则是通过简单地重新排列项目来找到的。如果我们的数据中有异常值,即比其他值高或低得多的项目,它可能对均值产生不利影响。也就是说,均值对异常值不稳健。中位数由于不考虑异常值,因此对异常值是稳健的。

让我们来看一下数据中的最高价和最低价。

min_price = min(prices)
max_price = max(prices)
print(min_price, max_price)
4.0, 2300.0

我们现在知道数据中存在异常值。异常值可以代表数据收集中的有趣事件或错误,因此识别它们何时存在是很重要的。中位数和众数的比较只是检测异常值存在的众多方法之一,尽管可视化通常是检测它们的更快方法。

众数

我们将讨论的最后一个中心趋势测量是众数。众数定义为在数据中出现最频繁的值。众数作为“中间”的直觉不像均值或中位数那样直接,但有明确的理由。如果一个值在数据中反复出现,我们也知道它将影响均值朝向众数值。值出现的越多,它对均值的影响也越大。因此,众数代表了对我们均值贡献最大的因素。

与中位数一样,Python 中没有内置的众数函数,但我们可以通过计算价格的出现次数并寻找最大值来确定众数。

# Initialize an empty dictionary to count our price appearances
price_counts = {}
for p in prices:
    if p not in price_counts:
        counts[p] = 1
    else:
        counts[p] += 1

# Run through our new price_counts dictionary and log the highest value
maxp = 0
mode_price = None
for k, v in counts.items():
    if maxp < v:
        maxp = v
        mode_price = k
print(mode_price, maxp)
>>> 20.0, 7860

众数与中位数相当接近,因此我们可以有信心地认为中位数和众数都代表了我们葡萄酒价格的中间值。

中心趋势的测量有助于总结我们数据中的平均观测值是什么样的。然而,它们并不能告诉我们数据的扩散程度。这些扩散的总结就是扩散测量所帮助描述的内容。

扩散测量

扩散测量(也称为离散度)回答了“我的数据有多变?”的问题。世界上很少有事物在我们观察每次都保持不变。我们都知道有人会因自然波动而抱怨体重的微小变化,而不是明显的体重增加。这种变异使世界变得模糊和不确定,因此拥有总结这种“模糊性”的度量是有用的。

范围和四分位差

我们将讨论的第一个扩散测量是范围。范围是我们看到的测量中最简单的计算方法:只需从数据集中最大的值中减去最小的值即可。

我们在调查中位数时发现了葡萄酒价格的最小值和最大值,因此我们将使用这些来找到范围。

price_range = max_price - min_price
print(price_range)
>>> 2296.0

我们发现了一个范围为 2296,但这具体是什么意思?当我们查看各种度量时,重要的是要将所有这些信息放在数据的背景下。我们的中位数价格为 24 美元,而范围是 2296 美元。范围是中位数的两个数量级,因此这表明我们的数据非常分散。也许如果我们有另一个酒的数据集,我们可以比较这两个数据集的范围,从而了解它们的差异。否则,仅凭范围并不太有帮助。

更常见的是,我们希望查看数据与典型值的偏差程度。这个总结属于标准差方差的范畴。

标准差

标准差也是观察值分布的一种度量,但它表明了数据偏离典型数据点的程度。也就是说,标准差总结了数据与均值的差异。这种与均值的关系在标准差的计算中很明显。

标准差分解

方程的结构值得讨论。回忆一下,均值是通过将所有观察值相加并除以观察值的数量来计算的。标准差方程类似,但试图计算平均偏差,还包括一个额外的平方根操作。

你可能会在其他地方看到n作为分母而不是n-1。这些细节的具体情况超出了本文的范围,但要知道使用n-1通常被认为更为准确。有关解释的链接在本文末尾。

我们希望计算标准差以更好地描述我们的酒价格和分数,因此我们将创建一个专门的函数来实现这一点。手动计算数字的累积和很麻烦,但 Python 的for循环使这变得简单。我们正在制作自己的函数,以展示 Python 使这些统计计算变得容易,但也值得知道numpy库在std下实现了标准差。

def stdev(nums):
    diffs = 0
    avg = sum(nums)/len(nums)
    for n in nums:
        diffs += (n - avg)**(2)
    return (diffs/(len(nums)-1))**(0.5)

print(stdev(scores))
>>> 3.2223917589832167
print(stdev(prices))
>>> 36.32240385925089

这些结果是预期的。分数仅在 80 到 100 之间,因此我们知道标准差会很小。相比之下,价格数据及其异常值产生了更高的标准差。标准差越大,数据围绕均值的分布越广,反之亦然。

我们将看到方差与标准差密切相关。

方差

通常,标准差和方差被一起提及是有充分理由的。以下是方差的方程式,你觉得它看起来熟悉吗?

方差方程

方差和标准差几乎是完全一样的!方差只是标准差的平方。同样,方差和标准差代表了相同的东西——一个分散程度的测量——但值得注意的是它们的单位不同。无论你的数据单位是什么,标准差都会保持不变,而方差的单位则是单位的平方。

许多统计学初学者会问一个问题:*"但为什么我们要平方偏差?绝对值不是可以消除和中的麻烦负数吗?"*虽然消除负数是平方操作的一个原因,但这并不是唯一的原因。与均值一样,方差和标准差也受到异常值的影响。许多时候,异常值也是我们数据集中的兴趣点,因此平方与均值的差异使我们能够指出这一重要性。如果你熟悉微积分,你会发现有一个指数项可以帮助我们找到最小偏差点的位置。

通常情况下,你所做的任何统计分析都只需要均值和标准差,但方差在其他学术领域中仍然具有重要意义。集中趋势和分散度的度量允许我们总结数据集的关键方面,我们可以在这些总结的基础上从数据中获得更多洞见。

关键要点

  • 描述性统计提供了我们数据的简单总结。

  • (算术)均值计算的是我们数据集的典型值。它不是稳健的。

  • 中位数是我们数据集中确切的中间值。它是稳健的。

  • 众数是出现次数最多的值。

  • 范围是我们数据集中最大值和最小值之间的差异。

  • 方差和标准差是平均距离均值的度量。

结论

容易被统计方程和细节所困扰,但理解这些概念所代表的含义很重要。在本文中,我们探讨了一些基本描述性统计的细节,同时通过查看一些葡萄酒数据来使我们的概念更为具体。

在下一部分中,我们将讨论统计学与概率的关系。我们在这里学习的描述性统计在理解这种联系中起着关键作用,因此在继续之前,记住这些概念所代表的含义很重要。

进一步阅读:

在文章早些时候,我们略过了为什么标准差的公式中有一个n-1项而不是n。使用n-1项被称为贝塞尔修正

原文。经许可转载。

相关内容:

  • 描述性统计关键术语解析

  • 解释正态分布的 68-95-99.7 规则

  • 为什么数据科学家喜欢高斯分布


我们的前三个课程推荐

1. Google 网络安全证书 - 快速进入网络安全职业道路。

2. Google 数据分析专业证书 - 提升你的数据分析技能

3. Google IT 支持专业证书 - 为你的组织提供 IT 支持


更多相关主题