标准差是一种量化数据集中多样性或分散程度的指标。标准差小意味着数据点倾向于接近平均值,而标准差大则表明数据点广泛分散。
在本教程的以下部分中,我们将深入探讨如何使用 Python 计算和理解标准差的更多细节。
标准差的类型
标准差有两种类型:总体标准差和样本标准差。
The总体标准差当您的数据包括人口的所有成员时使用。它只是计算值与平均值的均方根偏差。
The 样本标准差当您的数据是整个总体的子集或样本时使用。它假设您的数据不包括整个可能数据集。
但样本数据不仅要小,而且要覆盖总体数据的全范围。
假设您的人口数据是[2, 4, 6, 8, 10]
。为了覆盖整个范围,您的示例数据可以是以下之一:
[2, 6, 8]
[2, 8, 10]
[2, 8]
[2,10]
如果你的样本数据覆盖了整个人群,总体标准差将低于或至少等于样本标准差当根据相同的数据集计算时。
如果样本数据没有覆盖全范围的总体数据。这将导致样本数据的标准偏差较低。
因此,根据样本计算的任何统计数据(例如平均值或标准差)可能无法准确反映真实的总体值。
样本数据不良覆盖率示例:
[2, 4]
[2, 4, 6]
手动计算标准差
如果您想了解标准差的底层计算,您应该手动实现它。
标准差的公式是方差的平方根,其中方差是与平均值的偏差平方的平均值。
我们可以这样做:
- 计算数据集的平均值。
- 对于数据集中的每个数字,减去平均值并计算结果的平方。
- 计算这些平方偏差的平均值。
- 对步骤 3 的结果求平方根。
让我们使用以下方法来实现math module:
import math
data = [2, 4, 6, 8, 10]
# Step 1: Calculate the mean
mean = sum(data) / len(data)
# Step 2 and 3: Calculate the average of the squared deviations
variance = sum((x - mean) ** 2 for x in data) / len(data)
# Step 4: Calculate the standard deviation
std_dev = math.sqrt(variance)
print("Population Standard Deviation: ", std_dev)
Output:
Population Standard Deviation: 2.8284271247461903
计算样本标准差与总体标准差略有不同。
计算样本标准差的公式也是方差的平方根,但不是除以数据点的数量(N
),我们除以N-1
.
import math
data = [2, 8, 10]
# Step 1: Calculate the mean
mean = sum(data) / len(data)
# Step 2 and 3: Calculate the average of the squared deviations
variance = sum((x - mean) ** 2 for x in data) / (len(data) - 1)
# Step 4: Calculate the standard deviation
std_dev = math.sqrt(variance)
print("Sample Standard Deviation: ", std_dev)
Output:
Sample Standard Deviation: 4.163331998932266
使用statistics.stdev()
Python 标准库的statistics
模块提供了方便的功能stdev()
计算样本标准差。这是一个例子:
import statistics
data = [2, 8, 10]
# Calculate standard deviation
std_dev = statistics.stdev(data)
print("Standard Deviation: ", std_dev)
Output:
Standard Deviation: 4.163331998932265
在这个例子中,我们首先导入statistics
模块,然后使用它的stdev()
计算标准差的函数data
list.
结果 (4.16
) 表示数据点平均与平均值相差大约 4.16 个单位。
这是为样本计算的标准偏差。如果您正在与全体人群一起工作,请使用statistics.pstdev()
反而。
使用 stats.pstdev()
使用Python的内置计算总体标准差statistics
模块,您可以使用pstdev()
功能。
该函数的工作原理类似于stdev()
,但它计算标准差时假设所提供的数据代表整个总体。
这是一个例子:
import statistics
# Population data
data = [2, 4, 6, 8, 10]
# Calculate population standard deviation
std_dev = statistics.pstdev(data)
print("Standard Deviation: ", std_dev)
Output:
Standard Deviation: 2.8284271247461903
在此示例中,我们计算的标准差data
using statistics.pstdev()
。所得标准差 (2.82
)告诉我们,平均而言,每个数据点data
大约偏离2.82
从平均值。
请记住,当您的数据代表整个总体而不仅仅是样本时,应使用此函数。
使用 numpy.std()
The np.std()
NumPy 中的函数允许您计算标准差。
该函数用途广泛,不仅可以计算列表或 NumPy 数组的标准差,还可以沿多维数组的指定轴进行计算。
以下是您可以如何使用np.std()
:
import numpy as np
# Data as a numpy array
data = np.array([2, 4, 6, 8, 10])
# Calculate standard deviation
std_dev = np.std(data)
print("Standard Deviation: ", std_dev)
Output:
Standard Deviation: 2.8284271247461903
默认情况下,np.std()
计算总体标准差。如果您想计算样本标准差,您可以设置ddof
(自由度增量)参数1
:
# Calculate sample standard deviation
data=np.array([2, 8, 10])
sample_std_dev = np.std(data, ddof=1)
print("Sample Standard Deviation: ", sample_std_dev)
Output:
Sample Standard Deviation: 4.163331998932266
在这种情况下,标准偏差较大,反映出处理样本时不确定性增加。
使用 pandas.DataFrame.std()
The pandas.DataFrame.std()
函数旨在逐列处理大型 DataFrame 的标准差计算。
这是一个简单的例子:
import pandas as pd
data = pd.DataFrame({
'A': [1, 2, 3, 4, 5],
'B': [2, 4, 6, 8, 10],
'C': [3, 6, 9, 12, 15]
})
# Calculate standard deviation
std_dev = data.std()
print("Standard Deviation: ")
print(std_dev)
Output:
Standard Deviation:
A 1.581139
B 3.162278
C 4.743416
dtype: float64
在这个例子中,pandas.DataFrame.std()
计算数据帧中每一列的标准差,并返回包含这些值的新数据帧。
默认情况下,此函数计算样本标准差。
如果要计算总体标准差,可以设置ddof
参数为0
:
# Calculate population standard deviation
pop_std_dev = data.std(ddof=0)
print("Population Standard Deviation: ")
print(pop_std_dev)
Output:
Population Standard Deviation:
A 1.414214
B 2.828427
C 4.242641
dtype: float64
与 NumPy 函数一样,设置ddof
to 0
计算总体标准差,得到稍小的值。
友谊的标准差
这是朋友亚当发来的短信,他现在是一名小投资者。
短信内容如下:“嘿,你能帮我做点什么吗?我一直在涉足一些股票,你能用你的 Python 魔法检查一下我的一只股票在过去 10 天内收盘价的波动情况吗?”
尽管我不是金融专家,但我的 Python 编程技能确实可以提供帮助。
“当然,”我回复道,“只需发送数据即可。”
一分钟后,亚当又弹出一条短信,显示他的股票的收盘价:100、105、102、106、102、107、104、103、105、106。
首先,计算每个时期的回报。对于股票价格,每个时期的简单回报可以计算为(price_now - price_previous) / price_previous
.
回报率代表从一个时期到下一时期的价格变化百分比。
然后,计算这些回报的标准差。
import pandas as pd
import numpy as np
prices = pd.Series([100, 105, 102, 106, 102, 107, 104, 103, 105, 106])
# Calculate returns
returns = prices.pct_change()
# Calculate volatility
volatility = np.std(returns, ddof=1) # ddof=1 for sample standard deviation
print(f"Volatility: {volatility*100:.2f}%")
The pct_change()
函数计算当前元素与先前元素之间的百分比变化。这np.std()
然后函数计算这些回报的标准差。
我们可以达到相同的结果,无需pct_change()
功能:
import numpy as np
prices = np.array([100, 105, 102, 106, 102, 107, 104, 103, 105, 106])
# Calculate returns
returns = np.diff(prices) / prices[:-1]
# Calculate volatility
volatility = np.std(returns, ddof=1)
print(f"Volatility: {volatility*100:.2f}%")
输出为 3.46%,一个简洁的数字代表 Adam 选择的股票的波动性。标准差越高,波动性越高,反之亦然。
我很快给亚当发短信:“完成了。波动率:3.46%。
过了一会儿,我的手机响起了亚当的回复:“你是救星!这真的很有帮助!
F.A.Q
问:什么是Python统计模块?
答:Python 统计模块是 Python 中用于数学统计任务的内置库。
它提供了计算样本数据数学统计的函数,例如平均值、中位数、众数、方差和标准差等。
问:如何在 Python 中计算列表的标准差?
答:要使用统计模块计算 Python 中列表的标准差,您可以将列表作为参数传递给 stdev() 函数,然后该函数返回列表的标准差。
问:如何获取数组的 NumPy 标准差?
答:NumPy 提供了 numpy.std() 函数来计算数组的标准差。
默认情况下,会计算展平数组的标准差,但您也可以指定 axis 参数来计算沿指定轴的标准差。
问:标准差小或标准差大是什么意思?
答:较小的标准差表明值接近数据集的平均值,而较大的标准差表明值远离平均值。它反映了数据的分散程度。
问:NumPy 标准差函数是否同时计算样本和总体标准差?
答:是的,您可以使用 NumPy 计算样本和总体标准差。默认情况下,numpy.std() 函数计算总体标准差。
要计算样本标准差,您需要将可选参数 ddof(增量自由度)设置为 1。
资源
https://en.wikipedia.org/wiki/Standard_deviation
https://docs.python.org/3/library/statistics.html