一.AI&Python基础语法
1️⃣AI&Python数据类型(上)
2️⃣AI&Python数据类型(下)
3️⃣AI&Python逻辑判断与循环
4️⃣AI&Python函数的应用
5️⃣AI&Python面向对象的编程
二.AI&Python金融数据统计分析
一元线性回归是分析只有一个自变量(自变量x和因变量y)线性相关关系的方法。一个经济指标的数值往往受许多因素影响,若其中只有一个因素是主要的,起决定性作用,则可用一元线性回归进行预测分析。
其中,Y:样本的预测值,即回归模型中的因变量;
X:样本的特征数值,即回归模型中的自变量;
ϵ:回归模型中的误差项,误差项说明了包含在y里面,但不能被x与y之间线性关系解释的变异性。
通常,一元线性回归的基本假设包括:
①线性关系:x和y之间存在线性关系。
②独立性:每个观测值都是独立的。
③正态性:对于固定的x值,y的分布是正态分布。
④同方差性:对于所有的x值,y的方差保持恒定。
在实际应用中,我们会有一组观测数据点(xi,yi),我们的目标是找到最佳的b1和b2值,使得所有数据点到直线的距离平方和最小化。这个过程通常称为最小二乘法(Ordinary Least Squares,OLS)。
一旦模型被拟合,它就可以用来对新的x值进行y值的预测。此外,通过检査模型的系数、R2值(决定系数)、残差图等,我们可以评估模型的性能和适配度。(1)决定系数R2
R2(决定系数)衡量的是模型解释的数据变异性的比例,即模型能够解释因变量变化的比例。R2的值介于0到1之间。值越接近1表示模型对数据的拟合越好。然而,需要注意的是,即使R2高,也不能保证模型没有过拟合或存在其他问题。
(2)调整的R2
在一元线性回归中调整后的R2并不常见,因为它主要用来处理多元回归中的变量增加导致R2自然增大的问题。但在某些情况下,它也可以用于考虑样本大小的影响。
(3)t检验
t检验是用于检验单个回归系数(包括截距项和斜率项)是否显著不为零,从而判断自变量对因变量的影响是否统计上显著。在回归结果中,每个回归系数计算出的t值的绝对值越大,说明该系数越可能不等于0。p值是用来判断t检验的结果是否显著。通常,如果p值小于选定的显著性水平(如0.05),则认为该系数显著不为零(即该变量更重要)。
例如,一个自变量的t值为2.5,p值为0.01,则在0.05的显著性水平下,可以拒绝原假设(即该自变量的系数为0),并认为这个自变量对因变量有显著影响。
(4)F检验
F检验(F-test)是用于检验所有回归系数(除了截距项之外)是否至少有一个显著不为零。即测试整个模型的显著性,而不是单个参数。回归会计算出一个F统计量及其对应的p值(Prob(F-statistic))。
F统计量是衡量的是模型整体解释的变异与未解释的变异之间的比率。F值越大,说明模型的整体拟合度越好。p值是用于判断F检验的结果是否显著。如果p值低于选定的显著性水平(如0.05),则可以拒绝所有系数均为零的原假设,表明至少有一个自变量对因变量有显著影响。
例如,F统计量为175.7,p值为1.40e-23,在0.05的显著性水平下,我们可以说整个模型是显著的,至少有一个自变量对因变量有显著影响。
(5)残差分析
在实际应用中,查看残差数据对于判断模型的好坏至关重要。它帮助我们确定残差是否为随机分布,从而确保模型假设的有效性。
①Durbin-Watson统计量
Durbin-Watson统计量是用来检测回归分析中的残差(预测值与实际值之间的差异)是否存在一阶自相关性的统计测试。它对于时间序列数据尤为重要,因为如果存在自相关性,那么意味着模型可能没有充分利用所有可用的信息,或者可能遗漏了某些重要的变量或模式。
②Jarque-Bera(JB)统计量与Prob(JB)
Jarque-Bera(JB)统计量是一个用于检验残差数据是否符合正态分布的统计测试。它通过同时考虑残差数据的偏度(Skewness)和峰度(Kurtosis)来评估数据与正态分布之间的差异。JB统计量越小,表示数据越符合正态分布。JB统计量越大,表示数据越偏离正态分布,可能是由于偏度或峰度或两者共同作用的结果。如果是查看Prob(JB)值,Prob(JB)较高(例如大于0.05),这意味着我们没有足够的证据拒绝原假设(即残差是正态分布的)。在这种情况下,我们可以接受数据可能是正态分布的假设。
③残差图(ResidualPlot)
绘制残差与预测值或某个自变量之间的散点图。如果残差随机分布且没有明显的模式(例如,随着预测值增加,残差的散布范围没有明显变化),则表明可能存在同方差性。
【实例5】接上篇Excel数据集regression_data.xlsx信息,绘制营业收入与研发人数的散点图并做线性回归分析。
【分析解答】首先,我们绘制散点图查看数据情况。这里需要使用的是matplotlib库,详细的绘图会在第五章完整介绍。通过将前述基础数据和需求描述提交至通义灵码,并经过多轮迭代优化代码。最终优化完成后的代码如下:
import pandas as pd #未安装请pip install pandasimport matplotlib #未安装,先pip install matplotlibimport matplotlib.pyplot as pltmatplotlib.use('TkAgg')plt.rcParams['font.family'] = ['Microsoft YaHei'] # 使用 Microsoft YaHei 字体plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] # 如果你正在使用 sans-serif 字体from matplotlib.font_manager import FontPropertiesfont = FontProperties(fname=r"c:\windows\fonts\msyh.ttc", size=12)#Microsoft YaHei字体#绘制营业收入与研发人数的散点图regression_test=pd.read_excel('D:/AIpython/regression_data.xlsx','Sheet1',header=0,index_col=0)plt.figure(figsize=(10,6))plt.scatter(regression_test['研发人数(人)'].values,regression_test['营业收入(万元)'].values)plt.xlabel('研发人数(人)',fontproperties=font)plt.ylabel('营业收入(万元)',fontproperties=font)plt.title('研发人数与营业收入的关系',fontproperties=font)plt.show()
第一段落的代码功能是导入绘图的库以及设定字体。第二段落的代码功能是绘制“研发人数”与“营业收入”之间的散点图,并对图表进行个性化设置,包括设置图表标题、X轴和Y轴标签,以及展示图表。
输出结果:
可以看到,随着研发人数增加,营业收入呈上升趋势,反映两者存在正相关关系;但数据点分布并不完全集中,说明研发人数虽对营收有影响,可能受其他因素共同作用。
接着,我们载入OLS回归库,进行线性回归。
import statsmodels.api as sm #未安装,先pip install statsmodels#由散点图看出营业收入与研发人数的相关性较高,故选择二者进行回归验证model1=sm.OLS(regression_test['营业收入(万元)'],sm.add_constant(regression_test['研发人数(人)']))result=model1.fit()result.summary()print(result.summary())
输出结果:
使用通义灵码解释上面的回归输出结果:
最后,我们绘制线性回归图与残差图。绘制线性回归图的Python代码如下:
#绘制散点图plt.figure(figsize=(10,6))plt.scatter(regression_test['研发人数'],regression_test['营业收入'])#绘制回归线图lower=regression_test['研发人数'].min()*0.9upper=regression_test['研发人数'].max()*1.1const=result.params['const']slope=result.params['研发人数']plt.plot([lower,upper],[lower*slope+const,upper*slope+const],linewidth=2,color='red')plt.xlabel('研发人数(人)',fontproperties=font)plt.ylabel("营业收入(万元)",fontproperties=font)plt.title('营业收入与研发人数的线性回归图',fontproperties=font)plt.show()
输出结果:
绘制残差图的Python代码如下:
#绘制残差散点图plt.figure(figsize=(10,6))plt.scatter(range(len(result.resid)),result.resid,alpha=0.5)plt.title('残差图',fontproperties=font)plt.xlabel('观测点索引',fontproperties=font)plt.ylabel('残差',fontproperties=font)plt.axhline(y=0,color='black',linestyle='--')#添加零线plt.show()
输出结果:
我们可以先保存上面残差图,然后上传至通义灵码进行解释。