1. 相關性分析
相關性分析是指對多個可能具備相關關系的變量進行分析,從而衡量變量之間的相關程度或密切程度。
下面通過計算皮爾遜相關系數,判斷兩只股票的股價數據的相關程度。
1.1 數據讀取
import tushare as ts
# 讀取兩個股票的歷史數據,並保存為文件
data_000061 = ts.get_hist_data('000061', start='2018-01-01', end='2019-01-01')
data_399300 = ts.get_hist_data('399300', start='2018-01-01', end='2019-01-01')
data_000061.to_excel('農產品.xlsx')
data_399300.to_excel('滬深300.xlsx')
# 獲取收盤數據
import pandas as pd
stock_000061 = pd.read_excel('農產品.xlsx')
stock_000061 = stock_000061 [['date','close']]
stock_000061= stock_000061.rename(columns={'close':'price_農產品'})
stock_399300 = pd.read_excel('滬深300.xlsx')
stock_399300 = stock_399300[['date','close']]
stock_399300= stock_399300.rename(columns={'close':'price_滬深300'})
這時:
>>> pd.set_option('display.max_columns', None)
>>> data_000061
open high close low volume price_change p_change ma5 \
date
2018-12-28 4.83 4.88 4.85 4.81 36631.84 0.04 0.83 4.958
2018-12-27 4.99 5.02 4.81 4.80 59757.01 -0.10 -2.04 4.980
2018-12-26 5.02 5.02 4.91 4.87 73012.65 -0.12 -2.39 5.046
2018-12-25 5.13 5.15 5.03 4.81 93694.17 -0.16 -3.08 5.094
2018-12-24 4.98 5.22 5.19 4.96 118030.68 0.23 4.64 5.154
... ... ... ... ... ... ... ... ...
2018-08-17 5.45 5.45 5.18 5.17 38851.03 -0.25 -4.60 5.408
2018-08-16 5.41 5.44 5.43 5.28 33575.00 0.01 0.18 5.465
2018-08-15 5.51 5.53 5.42 5.39 21816.32 -0.06 -1.09 5.477
2018-08-14 5.54 5.54 5.48 5.46 23923.65 -0.05 -0.90 5.505
2018-08-13 5.53 5.62 5.53 5.43 37866.16 -0.01 -0.18 5.530
ma10 ma20 v_ma5 v_ma10 v_ma20 turnover
date
2018-12-28 5.093 5.038 76225.27 116826.84 94405.04 0.22
2018-12-27 5.121 5.040 88376.95 131476.38 96589.40 0.35
2018-12-26 5.137 5.046 92379.14 131257.01 98596.80 0.43
2018-12-25 5.135 5.051 101421.76 127253.36 98596.34 0.55
2018-12-24 5.118 5.046 120089.14 121739.25 96552.82 0.70
... ... ... ... ... ... ...
2018-08-17 5.408 5.408 31206.43 31206.43 31206.43 0.23
2018-08-16 5.465 5.465 29295.28 29295.28 29295.28 0.20
2018-08-15 5.477 5.477 27868.71 27868.71 27868.71 0.13
2018-08-14 5.505 5.505 30894.91 30894.91 30894.91 0.14
2018-08-13 5.530 5.530 37866.16 37866.16 37866.16 0.22
表格說明:
1.2 合並數據
data_merge = pd.merge(stock_000061, stock_399300, on='date', how='inner')
data_merge.to_excel('合並股價.xlsx', index=False)
這時:
>>> data_merge
date price_農產品 price_滬深300
0 2018-12-28 4.85 3010.65
1 2018-12-27 4.81 2990.51
2 2018-12-26 4.91 3002.03
3 2018-12-25 5.03 3017.28
4 2018-12-24 5.19 3038.20
.. ... ... ...
79 2018-08-17 5.18 3229.62
80 2018-08-16 5.43 3276.73
81 2018-08-15 5.42 3291.98
82 2018-08-14 5.48 3372.91
83 2018-08-13 5.53 3390.34
[84 rows x 3 columns]
1.3 求相關系數
協方差(Covariance)在概率論和統計學中用於衡量兩個變量的總體誤差。而方差是協方差的一種特殊情況,即當兩個變量是相同的情況。
標准差(Standard Deviation):
皮爾遜相關系數(Pearson correlation coefficient [ˌkɔːrəˈleɪʃn] [ˌkoʊɪˈfɪʃnt])是一個用於反映兩個隨機變量之間的線性相關程度的統計指標,通常用 r
表示。皮爾遜相關系數的計算公式如下:
其中COV(X, Y)是變量X和變量Y的協方差,D(X)和D(Y)分別為變量X和變量Y的方差,\(\sqrt{D(X))}\)和\(\sqrt{D(Y))}\)分別為變量X和變量Y的標准差。
由公式可知,皮爾遜相關系數是用兩個變量的協方差除以兩個變量的標准差得到的。
雖然協方差能反映兩個隨機變量的相關程度(協方差為正值表示兩者正相關,為負值表示兩者負相關),但是協方差值的大小並不能很好地度量兩個隨機變量的相關程度。
例如,在二維空間中分布着一些數據點,我們想知道數據點的x坐標和y坐標的相關程度,如果兩者的相關程度較小但是數據分布得比較離散,就會導致求出的協方差值較大,用這個值來度量相關程度是不合理的。
因此,為了更好地度量兩個隨機變量的相關程度,引入了皮爾遜相關系數。r的取值范圍為[-1,1]。r的正負表示相關性的類型:
- r為正值表示線性正相關,即兩個變量的增長趨勢相同;
- r為負值表示線性負相關,即兩個變量的增長趨勢相反;
- r為0表示不存在線性相關性。r的絕對值表示相關性的強弱,絕對值越接近1,說明相關性越強。
需要注意的是,r的絕對值小不一定意味着變量之間的相關性弱。這是因為r衡量的僅僅是變量之間的線性相關關系,而變量之間的關系除了線性關系之外,還有指數關系、多項式關系、冪關系等,這些“非線性相關”的關系不在r的衡量范圍之內。
>>> from scipy.stats import pearsonr
>>> data_merge = pd.read_excel('合並股價.xlsx')
>>> corr = pearsonr(data_merge['price_農產品'], data_merge['price_滬深300'])
>>> print('相關系數r:' + str(corr[0]) + '; 顯著性水平p:' + str(corr[1]))
相關系數r:0.46976676093240405; 顯著性水平p:6.538433212582671e-06
顯著性水平:是估計總體參數落在某一區間內,可能犯錯誤的概率,用α表示。1-α 為置信度或置信水平,其表明了區間估計的可靠性。
2. 假設檢驗
事物的個體差異總是客觀存在的,抽樣的誤差也就不可避免。我們不能只依據個別樣本的值來對整體數據下結論。當一些樣本均數與已知的總體均數有很大的差別時,一般來說有兩點主要原因,從而使得試驗因素不同:
- 一是抽樣誤差的偶然性;
- 二是樣本來自不同的總體;
此時,運用假設檢驗方法就能夠排除誤差的影響,區分差別在統計上是否成立,並了解誤差事件發生的概率。假設檢驗又稱為顯著性檢驗,是統計推斷中的一種重要的數據統計方法。
它首先對研究總體的參數做出某種假設,然后從總體中抽取樣本進行觀察,用樣本提供的信息對假設的正確性進行判斷,從而決定假設是否成立。若觀察結果與理論不符,則假設不成立;若觀察結果與理論相符,則認為沒有充分的證據表明假設錯誤。
在實際工作中廣泛使用的假設檢驗主要有t檢驗、z檢驗、F檢驗。
- t檢驗是一種推論統計量,用於確定在某些特征中兩組的均值之間是否存在顯著差異,主要用於數據集。t檢驗主要有兩種類型:單樣本t檢驗和雙樣本t檢驗。
- 單樣本t檢驗用於確定樣本均值是否與已知或假設的總體均值具有統計學差異。
- 雙樣本t檢驗用於比較兩個獨立組的均值,以確定是否有統計證據表明這兩個獨立組存在顯著差異。
- z檢驗用於在兩組樣本的總體方差未知時,檢驗兩組數據表現情況的差異。
它與t檢驗的區別在於:z檢驗常用於樣本量較大的情況;而t檢驗則用於樣本量較小、總體標准差未知的正態分布情況的數據。 - F檢驗用於檢驗兩個正態隨機變量的總體方差是否相等。
常用於判斷應該選擇使用t檢驗中的哪種檢驗方法,根據該檢驗方法計算出的方差比值可以用來檢驗兩組數據是否存在顯著性差異。
2.1 分析案例
如何使用t檢驗分析兩個品種水稻的產量是否存在顯著性差異。
2.2 數據
2.3 代碼
>>> import pandas as pd
>>> data = pd.read_excel('D:\git\python\code\第6章\樣本數據.xlsx')
>>> data.head()
品種 產量
0 A 85
1 A 87
2 A 56
3 A 90
4 A 84
>>> data.shape
(16, 2)
# 隨后把A品種水稻和B品種水稻的產量分別賦給變量x和變量y
>>> x = data[data['品種'] == 'A']['產量']
>>> y = data[data['品種'] == 'B']['產量']
# 導入SciPy模塊,調用進行雙樣本t檢驗的ttest_ind()函數檢驗這兩種水稻的產量是否有顯著性差異。
>>> from scipy.stats import ttest_ind
>>> print(ttest_ind(x,y))
Ttest_indResult(statistic=1.0044570121313174, pvalue=0.3322044373983689)
運行結果中的pvalue就是計算出的顯著性水平P值。如果P值小於選定的顯著性水平,則拒絕原假設;如果P值遠大於選定的顯著性水平,則不拒絕原假設。
前面選定的置信度為95%,則選定的顯著性水平為1-95%=5%=0.05。這里計算出的P值約為0.332,遠大於選定的顯著性水平0.05,因此不拒絕原假設,即認為這兩個品種水稻的產量並沒有顯著性差異。