本次案例还是适合人文社科领域,金融或者新闻专业。本科生做线性回归和主成分回归就够了,研究生还可以加随机森林回归,其方法足够人文社科领域的硕士毕业论文了。


案例背景

有八个自变量,['微博平台可信度','专业性','可信赖性','转发量','微博内容质量','时效性','验证程度','人际信任']   ,一个因变量: 投资信息可信度。

研究这八个自变量对因变量的影响。


数据读取

导入包

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.preprocessing import StandardScaler
import statsmodels.formula.api as smf
plt.rcParams ['font.sans-serif'] ='SimHei'               #显示中文
plt.rcParams ['axes.unicode_minus']=False               #显示负号
sns.set_style("darkgrid",{"font.sans-serif":['KaiTi', 'Arial']})

读取,我数据格式这里是spss 的sav格式,但是python也能读取。

# 读取数据清洗后的数据
spss = pd.read_spss('数据2.sav')
#spss

选取需要的变量,展示前五行

data=spss[['微博平台可信','专业性','可信赖性','转发量','微博内容质量','时效性','验证程度','人际信任','投资信息可信度']]
data.head()

取出列名称

columns1=data.columns

描述性统计,算一下均值方差分位数等等

data.describe()  #描述性统计

我这数据量并不多....

取出X和y

X=data.iloc[:,:-1]
y=data.iloc[:,-1]

画图展示

对八个自变量和一个因变量画箱线图

column = data.columns.tolist() # 列表头
fig = plt.figure(figsize=(10,10), dpi=128)  # 指定绘图对象宽度和高度
for i in range(9):plt.subplot(3,3, i + 1)  # 2行3列子图sns.boxplot(data=data[column[i]], orient="v",width=0.5)  # 箱式图plt.ylabel(column[i], fontsize=16)
plt.tight_layout()
plt.show()

画核密度图

column = data.columns.tolist() # 列表头
fig = plt.figure(figsize=(10,10), dpi=128)  # 指定绘图对象宽度和高度
for i in range(9):plt.subplot(3,3, i + 1)  # 2行3列子图sns.kdeplot(data=data[column[i]],color='blue',shade= True)  plt.ylabel(column[i], fontsize=16)
plt.tight_layout()
plt.show()

变量两两之间的散点图

sns.pairplot(data[column],diag_kind='kde')
#plt.savefig('散点图.jpg',dpi=256)

变量之间的相关系数热力图

#画皮尔逊相关系数热力图
corr = plt.subplots(figsize = (14,14))
corr= sns.heatmap(data[column].corr(),annot=True,square=True)

可以看到很多x之间的相关系数都挺高的,线性回归模型应该存在严重的多重共线性。


线性回归分析

导入包

import statsmodels.formula.api as smf

打印回归方程

all_columns = "+".join(data.columns[:-1])
print('x是:'+all_columns)
formula = '投资信息可信度~' + all_columns
print('回归方程为:'+formula)

拟合模型

results = smf.ols(formula, data=data).fit()
results.summary()

可以看到拟合优度还挺高,84%。再看每个变量的p值,0.05的显著性水平下,几乎都不显著.....

应该是多重共线性导致的。

还可以这样查看回归结果:

print(results.summary().tables[1])

系数p值什么的和上面一样。

对数回归

在计量经济学里面有一种常用的手段就是将数据去对数,这样可以减小异方差等影响。我们来试试,取了对数再回归:

data_log=pd.DataFrame(columns=columns1)
for i in columns1:data_log[i]=data[i].apply(np.log)

拟合

results_log = smf.ols(formula, data=data_log).fit()
results_log.summary()

也好不到哪去....只有时效性的p值小于0.05,是显著的,别的都不显著。

接下来使用主成分回归


主成分回归

主成分回归会压缩你的变量,弄出几个新的变量,这样变量之间的多重共线性就能处理掉了。

新的变量就是老变量的线性组合,但是不好解释,失去了经济或者新闻上的实际意义。

导包

from sklearn.decomposition import PCA
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import LeaveOneOut
from mpl_toolkits import mplot3d

想找一下几个主成分回归,要用几个主成分会好一些:

model = PCA()
model.fit(X)
#每个主成分能解释的方差
model.explained_variance_
#每个主成分能解释的方差的百分比
model.explained_variance_ratio_
#可视化
plt.plot(model.explained_variance_ratio_.cumsum(), 'o-')
plt.xlabel('Principal Component')
plt.ylabel('Cumulative Proportion of Variance Explained')
plt.axhline(0.9, color='k', linestyle='--', linewidth=1)
plt.title('Cumulative PVE')

可以看到当主成分个数为4时就能解释原始数据的90%以上了(坐标轴上是3是因为从0 开始的..)

下面采用四个主成分进行回归分析:

将X转化为4个主成分矩阵,查看数据形状。

model = PCA(n_components = 4)
model.fit(X)
X_train_pca = model.transform(X)
X_train_pca.shape

25是我的样本量,4是主成分个数。(25个确实少了....)

变成数据框:(主成分得分矩阵)

columns = ['PC' + str(i) for i in range(1, 5)]
X_train_pca_df = pd.DataFrame(X_train_pca, columns=columns)
X_train_pca_df.head()

上面只展示了前5行。

还可以计算主成分核载矩阵,显示了原始变量和主成分之间的关系。

pca_loadings= pd.DataFrame(model.components_.T, columns=columns,index=columns1[:-1])
pca_loadings

打印主成分回归方程

X_train_pca_df['财经信息可信度']=y
all_columns = "+".join(X_train_pca_df.columns[:-1])
print('x是:'+all_columns)
formula = '财经信息可信度~' + all_columns
print('回归方程为:'+formula)

拟合模型

results = smf.ols(formula, data=X_train_pca_df).fit()
results.summary()

只有第一个和第四个主成分是显著的。

打印查看:

print(results.summary().tables[1])

主成分回归效果也一般。

这种传统的统计学模型——参数模型,线性模型,限制和假定太多了,不好用。

一遇见多重共线性,异方差等问题就G了

下面采用非参数的回归方法——随机森林,可以避免多重共线性的影响,得到变量的重要特征排序。


随机森林回归

像随机森林,支持向量机,梯度提升这种机器学习模型放在人文社科领域都是降维打击。人文社科领域用的还是老一套的传统统计学模型,效果都不太好。

随机森林回归在统计、计算机等学科里面都是很简单的模型了,但若在人文社科学科,这种模型写在论文里面肯定算高级的了。

先将数据标准化

# 数据标准化
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(data)
data = scaler.transform(data)
data[:5]

取出X和y

airline_scale = data
airline_scale.shapeX=airline_scale[:,:-1]
y=airline_scale[:,-1]
X.shape,y.shape

拟合模型:

from sklearn.ensemble import RandomForestRegressor
model = RandomForestRegressor(n_estimators=5000, max_features=int(X.shape[1] / 3), random_state=0)
model.fit(X,y)
model.score(X,y)

上面这段代码生成了一个含有5000棵决策树的随机森林模型,拟合,评价。

拟合优度高达95%!!

查看真实值和拟合值对比的图:

pred = model.predict(X)
plt.scatter(pred, y, alpha=0.6)
w = np.linspace(min(pred), max(pred), 100)
plt.plot(w, w)
plt.xlabel('pred')
plt.ylabel('y_test')
plt.title('模型预测的财经信息可信度和真实值对比')

很接近。

计算变量的重要性:

model.feature_importances_
sorted_index = model.feature_importances_.argsort()plt.barh(range(X.shape[1]), model.feature_importances_[sorted_index])
plt.yticks(np.arange(X.shape[1]), columns1[:-1][sorted_index],fontsize=14)
plt.xlabel('Feature Importance',fontsize=14)
plt.ylabel('Feature')
plt.title('特征变量的重要性排序图',fontsize=24)
plt.tight_layout()

可以看到,对于 投资信息可信度这样因变量,信息的时效性,转发量,平台可信度是最重要的,其次就是人际信任,可信赖性等等变量。

上面是每个变量对于y的重要性,

下面画出每个变量分别是怎么影响y的,偏依赖图:

X2=pd.DataFrame(X,columns=columns1[:-1])
from sklearn.inspection import PartialDependenceDisplay
#plt.figure(figsize=(12,12),dpi=100)
PartialDependenceDisplay.from_estimator(model, X2,['时效性','转发量','微博平台可信'])
#画出偏依赖图

我们可以很清楚得看到,时效性,转发量,微博平台可信度,三个变量的取值变化是怎么影响y的变化的,明显不是一个线性的关系,虽然大致的方向是正相关,但是影响的程度是一个非线性的关系,先慢后快再慢。


总结

本次用了三种方法做了一个财经新闻领域的回归问题,每个方法都有优缺点吧,但是效果肯定还是机器学习的模型好。有的同学肯定在想机器学习模型怎么没有p值什么的,怎么看显不显著?

其实机器学习的方法没有参数估计和假设检验的,没有p值什么的,所以做不了统计推断,这也是它的一个缺点。传统的线性回归,主成分回归,虽然可以统计推断,但是效果很差。

看每个人的需求做什么样的模型了,但是在人文社科的论文写一歌机器学习的模型还是算得上创新吧。

Python数据分析案例22——财经新闻可信度分析(线性回归,主成分回归,随机森林回归)相关推荐

  1. 【Python金融量化】财经新闻文本分析

    内容来自:微信公众号:python金融量化 关注可了解更多的金融与Python干货. 引言 "80%的商业信息来自非结构化数据,主要是文本数据"(Seth Grimes),这一说法 ...

  2. python机器学习案例系列教程——集成学习(Bagging、Boosting、随机森林RF、AdaBoost、GBDT、xgboost)

    全栈工程师开发手册 (作者:栾鹏) python数据挖掘系列教程 可以通过聚集多个分类器的预测结果提高分类器的分类准确率,这一方法称为集成(Ensemble)学习或分类器组合(Classifier C ...

  3. Python数据分析案例—淘宝用户行为分析

    赛题与数据 一.项目背景 本数据报告以淘宝app平台为数据集,通过行业的指标对淘宝用户行为进行分析,从而探索淘宝用户的行为模式,具体指标包括:日PV和日UV分析,付费率分析,复购行为分析,漏斗流失分析 ...

  4. 视频教程-Python数据分析案例实战 视频课程-Python

    Python数据分析案例实战 视频课程 计算机硕士,多年工作经验,技术和产品负责人. 多年推荐系统/NLP/大数据工作经验. 负责公司多个AI项目产品落地,包括文本分类.关键词抽取.命名实体识别.对话 ...

  5. python数据分析实战-Python数据分析案例实战(慕课版)

    基本信息 书名:Python数据分析案例实战(慕课版) :59.80元 作者:王浩,袁琴,张明慧 著 出版社:人民邮电出版社 出版日期:2020_06_01 ISBN:9787115520845 字数 ...

  6. python数据分析实战案例-Python数据分析案例实战

    原标题:Python数据分析案例实战 至今我们网站已经开设了多个数据分析系列的课程,大部分都是基于算法思路来开展的,课程中着重点在于算法的讲授.软件的使用,案例只是辅助学习.然而很多学员反映,希望可以 ...

  7. Python数据分析案例-利用多元线性回归与随机森林回归算法预测笔记本新品价格

    1.前言 目的: 本文通过多元线性回归与随机森林算法预测笔记本新品的发售价 工具: 语言:Python 3.8 软件:Jupyter Notebook 库:pandas.numpy.matplotli ...

  8. python 数据分析 实际案例-Python数据分析案例实战

    原标题:Python数据分析案例实战 至今我们网站已经开设了多个数据分析系列的课程,大部分都是基于算法思路来开展的,课程中着重点在于算法的讲授.软件的使用,案例只是辅助学习.然而很多学员反映,希望可以 ...

  9. Python数据分析大作业 4000+字 图文分析文档 销售分析

    资源地址:Python数据分析大作业 4000+字 图文分析文档 销售分析 +完整python代码 数据来自某商场,具体商业数据保密 资源地址:Python数据分析大作业 4000+字 图文分析文档 ...

最新文章

  1. AS3 CookBook学习整理(一)
  2. python车辆识别硬件_Opencv python之车辆识别项目
  3. 分布式光伏补贴_2018年国家光伏并网补贴标准、政策
  4. SAP License:SAP的公司间销售
  5. Mybatis与JDBC的对比超详细笔记
  6. 802.11介质访问控制——CSMA/CD协议详解
  7. 手把手Java爬虫教学 - 1. 了解爬虫
  8. 植被抽稀lisp程序_地形图缩编中植被符号抽稀方法.doc
  9. Windows7硬盘安装Linux
  10. OpenNLP入门实验
  11. Linux led子系统分析之三 led设备驱动与ledtrigger驱动实现
  12. (将英尺转换为米)编写程序,读入英尺数,将其转换为米数并显示结果。一英尺等于0.305米。
  13. c语言程序压缩解压缩文件夹,【转】使用VC++压缩解压缩文件夹
  14. Matlab做一个刚体运动仿真,模拟小车避障
  15. c语言程序设计高速公路超速处罚,高速超速违章处理流程
  16. kingcms修改笔记
  17. CSS之BFC、IFC、GFC、FFC简述
  18. 如何多人协作编辑文档
  19. 什么是服务(Service)
  20. 5G全国覆盖还需6-7年时间?来看看各地5G最新进展与规划

热门文章

  1. 定义一个抽象的Role类 有姓名 年龄 性别等成员变量 .......
  2. 计算机专业可以转行医学吗,医学,会计,
  3. SQLServer STUFF 函数理解
  4. 小程序发送模板消息给用户 —— 一次性模板实现“长期订阅”
  5. ORA-00257: archiver error. Connect internal only, until freed 处理方法
  6. 重新认识java(十一)---- java中的数组
  7. 程序员的自我涵养,写好代码的实战经历分享
  8. 简历上的哪些内容才是 HR 眼中的干货?
  9. ORACLE存储过程RECORD数据类型的使用
  10. 洛谷:P5707 【深基2.例12】上学迟到