📜  在Python中计算均值,中位数和众数

📅  最后修改于: 2020-08-04 09:44:31             🧑  作者: Mango

介绍

当我们试图描述和总结数据样本时,我们可能首先找到数据的均值(或平均值),中位数模式。这些是集中趋势量度,通常是我们第一次查看数据集。

在本教程中,我们将学习如何在Python中查找或计算均值,中位数和众数。我们将首先为每个度量编写一个Python函数,然后使用Python的statistics模块来完成相同的任务。

有了这些知识,我们将能够快速查看我们的数据集并了解数据的总体趋势。

 

计算样本均值

如果我们有一个数值样本,则其平均值平均值是数值(或观察值)的总和除以数值数量。

说我们有样品[4, 8, 6, 5, 3, 2, 8, 9, 2, 5]。我们可以通过执行以下操作来计算其平均值:

(4 + 8 + 6 + 5 + 3 + 2 + 8 + 9 + 2 + 5)/ 10 = 5.2

平均值(算术平均值)是对我们数据的一般描述。假设您买了10磅西红柿。当您在家数西红柿时,您会得到25个西红柿。在这种情况下,您可以说西红柿的平均重量为0.4磅。那将是对您西红柿的一个很好的描述。

平均值也可能是对数据样本的不良描述。假设您正在分析一群狗。如果将所有狗的累计重量除以狗的数量,则可能很难描述单个狗的重量,因为不同品种的狗的体重和体重可能有很大差异。

平均值描述一个样本的好坏取决于数据的分布程度。就西红柿而言,它们的重量几乎相同,均值很好地描述了它们。对于狗,没有外用狗。它们的范围从很小的吉娃娃到巨大的德国M。因此,在这种情况下,均值本身并不是一个很好的描述。

现在是时候采取行动,学习如何使用Python计算均值了。

用Python计算平均值

为了计算数字数据样本的平均值,我们将使用Python的两个内置函数。一种用于计算值的总和,另一种用于计算样本的长度。

第一个功能是sum()。此内置函数采用数字的可迭代值,并返回其总和。

第二个功能是len()。此内置函数返回对象的长度。len()可以将序列(字符串,字节,元组,列表或范围)或集合(字典,集合或冻结集合)作为参数。

这是我们如何计算均值的方法: 

>>> def my_mean(sample):
...     return sum(sample) / len(sample)
...

>>> my_mean([4, 8, 6, 5, 3, 2, 8, 9, 2, 5])
5.2

我们首先对sampleusing中的值求和sum()。然后,我们将该总和除以的长度sample,即的结果值len(sample)

使用Python的mean()

由于计算均值是常见的操作,因此Python在statistics模块中包含此功能。它提供了一些功能来计算数据集的基本统计信息。该statistics.mean()函数获取数字数据(任何可迭代)的样本并返回其均值。

这是Python的mean()工作方式:

>>> import statistics

>>> statistics.mean([4, 8, 6, 5, 3, 2, 8, 9, 2, 5])
5.2

我们只需要导入statistics模块,然后调用mean()我们作为参数样品。这将返回样本的平均值。这是使用Python查找均值的快速方法。

寻找样本的中位数

数字数据的样本是值就在于中间的时候,我们的排序数据。数据可以升序或降序排序,中位数保持不变。

要找到中位数,我们需要:

  1. 样品排序
  2. 找到排序样本中间的值

在已排序样本的中间找到数字时,我们会遇到两种情况:

  1. 如果样本具有奇数个观测值,则排序样本中的中间值为中间值
  2. 如果样本的观察数为偶数,则需要计算排序样本中两个中间值的平均值

如果我们有样本[3, 5, 1, 4, 2]并想找到其中位数,那么我们首先将样本排序为[1, 2, 3, 4, 5]。中位数是3因为这是中间的值。

另一方面,如果我们有样本[1, 2, 3, 4, 5, 6],则其中位数将为(3 + 4) / 2 = 3.5

让我们看一下如何使用Python计算中位数。

用Python寻找中位数

要找到中位数,我们首先需要对样本中的值进行排序。我们可以使用内置sorted()函数来实现。sorted()接受一个iterable并返回一个排序list,该排序包含与原始iterable相同的值。

第二步是找到位于已排序样本中间的值。要在观察值奇数的样本中定位该值,可以将观察数除以2。结果将是排序样本中间值的索引。

由于除法运算符(/)返回浮点数,因此我们需要使用地板除法运算符(//)获得整数。因此,我们可以将其用作索引操作([])中的索引。

如果样本的观察次数为偶数,则需要找到两个中间值。说我们有样品[1, 2, 3, 4, 5, 6]。如果我们使用下限除法将其长度(6)2除,则得到3。那就是我们的中上值(4)的索引。要找到我们的下中间值(3)的索引,我们可以将上中间值的索引递减1

让我们将所有这些放到计算样本中位数的函数中。这是一个可能的实现:

>>> def my_median(sample):
...     n = len(sample)
...     index = n // 2
...     # Sample with an odd number of observations
...     if n % 2:
...         return sorted(sample)[index]
...     # Sample with an even number of observations
...     return sum(sorted(sample)[index - 1:index + 1]) / 2
...

>>> my_median([3, 5, 1, 4, 2])
3

>>> my_median([3, 5, 1, 4, 2, 6])
3.5

此函数获取数值样本并返回其中位数。我们首先找到样本的长度n。然后,我们通过将计算的中间值(或上部中间值)的索引n2

if语句检查当前样本是否具有奇数个观测值。如果是这样,则中位数为的值index

return如果样本具有偶数个观察值,则最终运行。在那种情况下,我们通过计算两个中间值的平均值来找到中位数。

请注意,切片操作 [index - 1:index + 1]获得两个值。在该值index - 1在和值index,因为限幅操作排除在最后的指数值(index + 1)。

使用Python的中位数()

Python statistics.median()获取数据样本并返回其中位数。该方法的工作原理如下:

>>> import statistics

>>> statistics.median([3, 5, 1, 4, 2])
3

>>> statistics.median([3, 5, 1, 4, 2, 6])
3.5

请注意,median()对于具有奇数或偶数观察值的样本,自动处理中值的计算。

查找样本模式

模式是样本中最频繁的观察。如果我们有样本[4, 1, 2, 2, 3, 5],则其模式是2因为2在样本中出现两次,而其他元素仅出现一次。

模式不必是唯一的。一些样本具有多种模式。说我们有样品[4, 1, 2, 2, 3, 5, 4]。该示例具有两种模式- 2并且4因为它们是出现频率更高的值,并且两者出现的次数相同。

该模式通常用于分类数据。常见的分类数据类型为:

  • 布尔 -只能取两个值,就像在truefalsemalefemale
  • 标称 -可以采用两个以上的值,例如American - European - Asian - African
  • 序数 -可以采用两个以上的值,但这些值的逻辑顺序类似于few - some - many

当我们分析分类数据的数据集时,我们可以使用该模式来知道哪种分类在我们的数据中最常见。

我们可以找到没有模式的样本。如果所有观察值都是唯一的(没有重复的观察值),则您的样本将没有模式。

既然我们已经知道了有关模式的基础知识,那么让我们看一下如何使用Python查找模式。

使用Python查找模式

要使用Python查找模式,我们将首先计算当前样本中每个值的出现次数。然后,我们将获得出现次数更多的值。

由于计数对象是一种常见的操作,因此Python提供了collections.Counter该类。此类专门用于计数对象。

Counter类提供定义为一种方法.most_common([n])。此方法返回list两个项的元组,其中包含n更常见的元素及其各自的计数。如果n省略或None,则.most_common()返回所有元素。

让我们使用Counter.most_common()编写一个函数,该函数获取数据样本并返回其模式。

这是一个可能的实现:

>>> from collections import Counter

>>> def my_mode(sample):
...     c = Counter(sample)
...     return [k for k, v in c.items() if v == c.most_common(1)[0][1]]
...

>>> my_mode(["male", "male", "female", "male"])
['male']

>>> my_mode(["few", "few", "many", "some", "many"])
['few', 'many']

>>> my_mode([4, 1, 2, 2, 3, 5])
[2]

>>> my_mode([4, 1, 2, 2, 3, 5, 4])
[4, 2]

我们首先在sample使用Counter对象(c)中计算观察值。然后,我们使用列表推导创建一个list包含观察值的观察值,这些观察值在样本中出现的次数相同。

由于.most_common(1)回报list的一个tuple形式(observation, count),我们需要获取指数的观察0list,然后该项目索引1嵌套tuple。这可以通过表达式完成c.most_common(1)[0][1]。该值是我们样本的第一个模式。

请注意,理解条件会将每个观察值(v)与最常见观察值(c.most_common(1)[0][1])的计数进行比较。k对于多模式样本,这将使我们能够获得具有相同计数的多个观测值()。

使用Python的mode()

Python statistics.mode()需要一些data并返回其(第一个)模式。让我们看看如何使用它: 

>>> import statistics

>>> statistics.mode([4, 1, 2, 2, 3, 5])
2

>>> statistics.mode([4, 1, 2, 2, 3, 5, 4])
4

>>> st.mode(["few", "few", "many", "some", "many"])
'few'

对于单模式示例,Python mode()返回最常见的值2。但是,在下面的两个示例中,它返回4few。这些样本中的其他元素发生的次数相同,但未包括在内。

Python 3.8开始,我们还可以使用statistics.multimode()which接受可迭代并返回list模式。

这是一个使用方法的例子multimode(): 

>>> import statistics

>>> statistics.multimode([4, 1, 2, 2, 3, 5, 4])
[4, 2]

>>> statistics.multimode(["few", "few", "many", "some", "many"])
['few', 'many']

>>> st.multimode([4, 1, 2, 2, 3, 5])
[2]

注意:list即使传递单模样本,该函数也始终返回a 。

结论

平均值(或平均值),中位数和众数通常是我们在尝试理解数据的集中趋势时首先查看的数据样本。

在本教程中,我们学习了如何使用Python查找或计算均值,中位数和众数。我们首先逐步介绍了如何创建自己的函数以对其进行计算,然后介绍了如何使用Python的statistics模块作为查找这些度量的快速方法。