[Python] 使用 Pandas 做案例的数据分析(一)
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,因此不拒绝原假设,即认为这两个品种水稻的产量并没有显著性差异。