在讀 Bollinger Band 時,看到公式裡有提到 Standard Deviation (標準差,SD),想說以前總是沒有把這個基礎的東西弄懂。
今天終於花點時間看一下,順便學著用Python 算一下。
Standard Deviation 是 Variance (變異數) 的平方根。 但 Variance 又是什麼?
Variance 的定義是資料中,每一筆值與這些資料的平均值的差的平方值的平均‧ 一步一步寫出來怎麼算可能會比較清楚。
算出全部資料的平均值
把每一筆資料減掉 (1) 算出來的平均值,之後再算這個差的平方。
算出全部平方過後的差值的平均值。
但是 variance 又有分成兩種,一個是 Population Variance,一個是 Sample Variance。
他們的差別是:
Population variance 是所謂的母體變異數,是包括全部的資料。
Sample variance 是所謂的樣本變異數,是從全部資料裡的一部分。
他們的公式有一點點不一樣的是 (3), Population 是除以全部資料的筆數,Sample 是全部資料筆數再減一。
這也造成了有兩種 Standard Deviation,
Population Standard Deviation

Sample Standard Deviation

下面是個例子。下面的 code 是盡量寫到跟上面的步驟一樣。
# 先用一個 list 來存值
x = [600, 470, 170, 430, 300]
# 算出平均值,步驟 (1)。
x_mean = sum(x) / len(x); x_mean
# 算出每一筆資料和平均值的差
x_diff = [i - x_mean for i in x]; x_diff
# 算出差的平方,步驟 (2)
x_diff_square = [i*i for i in x_diff]; x_diff_square
# 算出 母體變異數 Population Variance,步驟 (3)
p_variance = sum(x_diff_square) / len(x_diff_square); p_variance
現在終於可以算 population standard deviation 了。
# 把 variance 開平方根就是 population standard deviation
import math
p_sd = math.sqrt(p_variance); p_sd
再算 sample standard deviation。
# 算出 樣本變異數 Sample Variance,步驟 (3),要注意要多減一
variance = sum(x_diff_square) / (len(x_diff_square) - 1); variance
sd = math.sqrt(variance); sd
從 Python 3.4 開始,有 statistics module 可以用了。
import statistics
# population variance
statistics.pvariance(x)
# population standard deviation
statistics.pstdev(x)
# sample variance
statistics.variance(x)
# sample standard deviation
statistics.stdev(x)
或是要用 numpy
import numpy as np
# 把 python list 換成 numpy array
x_array = np.array(x)
# population standard deviation
np.std(x_array, ddof=0)
# sample standard deviation
np.std(x_array, ddof=1)
或是要用 pandas
import pandas as pd
# 把 python list 換成 pandas series
x_series = pd.Series(x)
# population standard deviation
x_series.std(ddof=0)
# sample standard deviation
x_series.std(ddof=1)
比一下看哪種比較快,結果還是 numpy 比較快 。
%timeit statistics.pstdev(x)
%timeit np.std(x_array, ddof=0)
%timeit x_series.std(ddof=0)
平均值有時候會騙人,像下面的兩個例子:
z1 = [4, 4, -4, -4]
z2 = [7, 1, -6, -2]
z1 和 z2 的絕對值後的平均值都是 4 ,但是明明資料的差很多。
所以需要用 standard deviation 來顯示出兩份資料的差異性。
假如是用在持續性的資料上,就可以看出新的資料有沒有造成不穩定。
Jupyter(IPython) Notebook: Link
沒有留言:
張貼留言