Python数据分析案例67——因子分析回归分析

news2024/12/16 4:23:56

背景

线性回归,主成分回归都做烂了,我之前的案例有很多这些模型,但是一直没写因子分析的回归案例,这个也是传统统计学流行的方法,在金融经济心理学等人文社科用得非常多。这个案例就演示一下python怎么做因子分析。


数据介绍

很早之前的财经新闻的数据了,问卷获取的,SAV格式,要用spss软件打开,但是python肯定也可以读取。

我们直接用python读取SAV格式的数据会,这个数据之前案例是做过线性回归,主成分,随机森林回归。

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

为什么本文还是用这个数据?因为这个数据的变量之间有很强的相关性,具有多重共线性,所以很适合用主成分,因子分析等方法。本文就做一点描述性统计分析,因子分析,然后进行因子分析回归。

需要本案例数据和全部代码文件的同学还是可以参考:因子分析


代码实现

首先导入包

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 = pd.read_spss('数据2.sav')
#spss

选取所需要的变量

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

做点描述性统计

data.describe() 

取出X和y,y就是投资信息可靠度,也就是数据框的最后一列。

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

 


可视化

画出变量的核密度图

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

都是类似正态分布,没有极端的异常值。

变量两两之前的散点图

sns.pairplot(data[column],diag_kind='kde')

可以看到变量两两之间都有较强的相关性,基本都是正相关。

画出变量之间的相关性热力图:

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

可以看到越红相关性越高,都很红。

统计学学得还不错的同学可能会说,计算相关性数值没用啊,因为有的相关性系数不一定是显著的,是的,所以我自定义了一个函数,可以计算相关性系数和其显著性。

 

def calculate_correlation_with_significance(dataframe):
    significance_levels = [(0.001, '***'), (0.01, '**'), (0.05, '*'), (1.0, '')]
    
    # 生成一个相关系数和显著性符号的数据框
    result_df = pd.DataFrame({
        var1: {
            var2: ( f"{1.0} " if var1 == var2 else
                    f" {next(sign for threshold, sign in significance_levels if p < threshold)}{r:.3f}"
            )
            for var2 in dataframe.columns
            for r, p in [stats.pearsonr(dataframe[var1], dataframe[var2])]
        }
        for var1 in dataframe.columns
    })
    
    # 仅保留下三角数据
    mask = np.tril(np.ones(result_df.shape), k=0).astype(bool)
    result_df = result_df.where(mask, '')

    return result_df
merged_df = calculate_correlation_with_significance(data)
merged_df

可以看到,很多X之间都存在很显著很高的相关性,直接线性回归的话可能会受到多重共线性的影响。 而这种X变量之间存在高度相关性的数据适合使用因子分析。


线性回归

我们做因子分析前肯定要做线性回归进行对比

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

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

查看主要的几个回归系数

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

可以看到基本都不显著,可能是多重共线性导致的,计算VIF看看

def VIF_calculate(df_all,y_name):
    x_cols=df_all.columns.to_list()
    x_cols.remove(y_name)
    
    def vif(df_exog,exog_name):
        exog_use = list(df_exog.columns)
        exog_use.remove(exog_name)
        model=smf.ols(f"{exog_name}~{'+'.join(list(exog_use))}",data=df_exog).fit()
        return 1./(1.-model.rsquared)
 
    df_vif=pd.DataFrame()
    for x in x_cols:
        df_vif.loc['VIF',x]=vif(df_all[x_cols],x)
        
    df_vif.loc['tolerance']=1/df_vif.loc['VIF']
    df_vif=df_vif.T.sort_values('VIF',ascending=False)
    df_vif.loc['mean_vif']=df_vif.mean()
    return df_vif
VIF_calculate(data,'投资信息可信度')

VIF虽然没到10,但是每个变量都有5-8多,也很高了,说明模型存在中等程度的多重共线性,这种X变量之间存在高度相关性的数据适合使用因子分析。


因子分析

from sklearn.decomposition import FastICA
from sklearn.decomposition import FactorAnalysis

首先我们要选择最优的因子数量

fa = FactorAnalysis(n_components=len(X.columns))
fa.fit(X)
loadings= fa.components_
cumulative_variance_ratio = np.cumsum(np.sum(loadings**2, axis=1) /len(X.columns))

print(cumulative_variance_ratio)

plt.plot(range(1, len(cumulative_variance_ratio) + 1), cumulative_variance_ratio, marker='o')
plt.title('Scree Plot')
plt.xlabel('Factor Number')
plt.ylabel('cumulative_variance_ratio')
plt.show()

就选3个因子吧,3个因子就有基本能解释原数据的所有的方差了。

# 初始化因子分析,设定提取的因子数
n_factors = 3 
fa = FactorAnalysis(n_components=n_factors)
factors = fa.fit_transform(X)

# 获取因子载荷矩阵
loadings = fa.components_  
print("因子载荷矩阵形状:", loadings.shape)

3就是因子的数量,8就是原变量的变量数量。

# 计算共性方差
communalities = np.sum(loadings.T**2, axis=1)
print("共性方差:", communalities)

共性方差可以通过每个变量的因子载荷的平方和来近似计算。共性方差反映了每个变量的方差中可以被提取的因子解释的部分。

eigenvalues = np.sum(loadings**2, axis=1)
eigenvalues #  因子的特征值,表示每个因子可以解释的方差量

# 计算方差贡献率
variance_ratio = eigenvalues / X.shape[1]
variance_ratio

## 累计计算方差贡献率
cumulative_variance_ratio = np.cumsum(variance_ratio)
cumulative_variance_ratio


因子和原始变量的关系

转化的因子就是原始的变量的线性组合,其系数都在载荷矩阵

# 将载荷矩阵转换为DataFrame以便查看
loadings_df = pd.DataFrame(loadings, index=[f'Factor{i+1}' for i in range(n_factors)],columns=X.columns)
loadings_df

# Visualize FA loadings
fig, ax = plt.subplots(3, 1,figsize=(6,6),dpi=128)
plt.subplots_adjust(hspace=1, wspace=0.5)   
for i in range(1, 4):
    ax = plt.subplot(3, 1, i)
    ax.plot(loadings_df.T['Factor' + str(i)], 'o-')
    ax.axhline(0, color='k', linestyle='--', linewidth=1)
    ax.set_xticks(range(len(X.columns)))
    ax.set_xticklabels(X.columns, rotation=10)
    ax.set_title('Factor Loadings for FA' + str(i))
plt.tight_layout()
plt.show()

plt.figure(figsize=(7, 2.4),dpi=128)
# 绘制热力图
sns.heatmap(loadings_df, annot=True, fmt=".3f", cmap="viridis", cbar=True, xticklabels=loadings_df.columns, yticklabels=loadings_df.index)
# 显示图表
plt.title("因子载荷矩阵热力图")
plt.xlabel("变量")
plt.ylabel("因子")
plt.show()

因子含义分析 在因子分析中,每个因子通常代表原始变量的一组线性组合,反映共同的特质或维度。根据你的因子载荷矩阵,我们可以尝试推测和解释每个因子的潜在含义:

Factor 1: 具有较高负载的变量有:微博平台可信、专业性、可信赖性、转发量、微博内容质量、时效性、验证程度、人际信任。 因为大多数负载都为负值且较高,Factor 1可能反映了一个综合性的信任或可靠性维度,表明这些特征共同减少时,可能降低某种信任感。 简单来说就是其他几个变量取值越高,Factor1越低。Factor1这个值越大,说明了不专业不可靠 ,是一个描述不专业程度的因子。

Factor 2: 在转发量、微博内容质量、时效性上有较高的正负载。 Factor 2可能与信息传播与有效性相关,表明其可能与信息的快速传播和内容质量提升有关。

Factor 3: 变量的负载较小,且不明显。 Factor 3的含义可能较弱或特定于某些细微特征,可能代表难以解释的随机效应或特定条件下的特性。


因子回归

我们对转化的因子作为X,进行因子分析回归:

X_factors = fa.fit_transform(X)  # 生成因子得分
# 将因子得分转换为DataFrame
X_factors = pd.DataFrame(X_factors, columns=[f'Factor{i+1}' for i in range(n_factors)])
X_factors.shape

 

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

results = smf.ols(formula, data=pd.concat([X_factors,y],axis=1)).fit()
results.summary()

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

回归分析结果为OLS(最小二乘法)回归,解释了因子对于投资信息可信度的影响:

模型整体性能: R-squared: 0.805 和 Adj. R-squared: 0.777:模型能够解释投资信息可信度80.5%的方差,调整后的R平方为77.7%,表明模型拟合良好。 F-statistic: 28.82 且 Prob (F-statistic): 1.23e-07:F统计量显著,表示整体模型在统计上是显著的。

各因子的回归系数: Intercept(截距):2.9067,这意味着所有因子为零时,投资信息可信度的基线值大约为2.91。 Factor 1:系数为-0.8143(p值 < 0.001),是高度显著的,表明Factor 1对投资信息可信度有显著的负面影响。这与我们推测的信任或可靠性维度一致,可能因为信任特征的减少而降低信息可信度。 Factor 2:系数为0.3099(p值 = 0.005),表示Factor 2对可信度有显著的正面影响,支持其与信息传播有效性相关的假设。 Factor 3:系数为-0.0185(p值 = 0.884),无显著性,因而对可信度的影响可以忽略。这暗示Factor 3可能不重要或与投资信息可信度无关。

其他统计量: Durbin-Watson: 1.417:接近2,表明残差自相关性较低。 Omnibus 和 Jarque-Bera (JB) Tests:用于检验残差的正态性,结果显示残差分布接近正态。

总结 综合来看,Factor 1显著地降低了投资信息的可信度,可能是因为与信任和专业相关的特征减少。Factor 2则有助于提升信息可信度,与信息传播和质量相关。Factor 3对可信度没有显著影响,可能与随机或其他未观测到的特征有关。整体模型对投资信息可信度的解释能力相当强。

所以当普通的ols因为高度相关性导致的多重共线性而不显著的时候,我们可以使用因子分析,找到有用的因子去进行回归,就可能显著了,而且也具有一定的解释性。


以前的文章可以参考:Python数据分析案例_阡之尘埃的博客

创作不易,看官觉得写得还不错的话点个关注和赞吧,本人会持续更新python数据分析领域的代码文章~(需要定制类似的代码可私信)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2260291.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FastAPI简介

FastAPI简介 一、FastAPI简介二、FastAPI安装2.1 使用pip安装FastAPI2.2 FastAPI的demo2.3 FastAPI的程序结构 三、装饰器请求方法四、用户请求4.1 路径参数4.1.1 单个路径参数4.1.2 多个路径参数4.1.3 固定路径和路径参数的冲突 4.2 查询参数4.3 默认参数4.4 可选参数 五、请求…

Django结合websocket实现分组的多人聊天

其他地方和上一篇大致相同&#xff0c;上一篇地址点击进入, 改动点1&#xff1a;在setting.py中最后再添加如下配置&#xff1a; # 多人聊天 CHANNEL_LAYERS {"default":{"BACKEND": "channels.layers.InMemoryChannelLayer"} }因此完整的se…

基础学习:(5)不同卷积:transposed convolution,deconvolution,dilated convolution

基础学习&#xff1a;&#xff08;5&#xff09;不同卷积 文章目录 基础学习&#xff1a;&#xff08;5&#xff09;不同卷积前言1 deconvlution transposed convolution2 对比2.1 Convolution animations2.2 Transposed convolution animations2.3 Dilated convolution 前言 …

Windows安装Jira

下载 Download Jira Data Center | Atlassian https://product-downloads.atlassian.com/software/jira/downloads/atlassian-jira-software-10.3.0-x64.exe 以管理员身份安装&#xff0c;否则弹出以下提醒 创建和配置MySQL数据库&#xff1a;参照 Connecting Jira applicat…

采用qL-MPC技术进行小型固定翼无人机的路径跟随控制

来自论文"Predictive Path-Following Control for Fixed-Wing UAVs Using the qLMPC Framework in the Presence of Wind Disturbances" 控制架构 采用的是 ULTRA-Extra无人机&#xff0c;相关参数如下&#xff1a; 这里用于guidance law的无人机运动学模型为&#…

计算机毕设-基于springboot的青少年心理健康教育网站的设计与实现(附源码+lw+ppt+开题报告)

博主介绍&#xff1a;✌多个项目实战经验、多个大型网购商城开发经验、在某机构指导学员上千名、专注于本行业领域✌ 技术范围&#xff1a;Java实战项目、Python实战项目、微信小程序/安卓实战项目、爬虫大数据实战项目、Nodejs实战项目、PHP实战项目、.NET实战项目、Golang实战…

28.在 Vue 3 中使用 OpenLayers 加载 MVT 格式矢量瓦片数据并显示图形

前言 随着前端开发技术的不断进步&#xff0c;越来越多的强大地图库被广泛应用于 Web 地图应用开发中。OpenLayers 是一个流行的开源 JavaScript 库&#xff0c;能够帮助开发者快速构建交互式地图应用。而 Vue 3 作为现代化的前端框架&#xff0c;已经成为开发者构建高效、响应…

Linux - MySQL迁移至一主一从

Linux - MySQL迁移至一主一从 迁移准备安装MySQL ibd文件迁移原服务器操作目标服务器操作 一主一从增量同步异常解决结尾 首先部分单独安装MySQL&#xff0c;请参考Linux - MySQL安装&#xff0c;迁移数据量比较大约400G左右且网络不通故使用文件迁移&#xff0c;需开启一段时间…

opencv-python的简单练习

题目1.读取一张彩色图像并将其转换为灰度图。 import cv2 # 读取图片文件 img cv2.imread(./1.png)# 将原图灰度化 img_gray cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)# 输出图片 cv2.imshow(img,img) cv2.imshow(img_g,img_gray) # 进行阻塞 cv2.waitKey(0) 题目2&#xff1a;…

go-zero(十三)使用MapReduce并发

go zero 使用MapReduce并发 一、MapReduce 介绍 MapReduce 是一种用于并行计算的编程模型&#xff0c;特别适合在大规模数据处理场景中简化逻辑代码。 官方文档&#xff1a; https://go-zero.dev/docs/components/mr 1. MapReduce 的核心概念 在 MapReduce 中&#xff0c;主…

探索React与Microi吾码的完美结合:快速搭建项目,低代码便捷开发教程

一、摘要 在当今的数字化时代&#xff0c;软件开发就像是一场探险&#xff0c;每个开发者都是探险家&#xff0c;探索着代码的奥秘。React作为前端开发的领军框架&#xff0c;其组件化和高效的渲染机制为开发者提供了强大的工具。而Microi吾码低代码平台的出现&#xff0c;则为…

SAP FICO物料分类账实操

物料分类账所涉及到的差异从采购入库的时候就可能已经产生&#xff0c;接下来从创建物料主数据开始对可能产生差异地方进行分析。其中有些操作步骤在标准价格估算这一篇博文中已经有过演示&#xff0c;可以先做了解。 其中的某些创建在有直接可用的情况下是非必须的&#xff0…

WordPress酱茄主题 开源版 博客资讯自媒体网站模板

一款免费开源的WordPress主题&#xff0c;主题专为WordPress博客、资讯、自媒体网站而设计 运行环境 支持WordPress版本&#xff1a;5.6 兼容Chrome、Firefox、Safari等主流浏览器 支持设备&#xff1a;响应式布局&#xff0c;不同设备不同展示效果 服务器环境建议&#x…

【HF设计模式】03-装饰者模式

声明&#xff1a;仅为个人学习总结&#xff0c;还请批判性查看&#xff0c;如有不同观点&#xff0c;欢迎交流。 摘要 《Head First设计模式》第3章笔记&#xff1a;结合示例应用和代码&#xff0c;介绍装饰者模式&#xff0c;包括遇到的问题、遵循的 OO 原则、达到的效果。 …

Linux查看是否有www-data用户,如果没有添加一个

在 Linux 系统中&#xff0c;www-data 用户通常是用来运行 Web 服务&#xff08;如 Nginx 或 Apache&#xff09;的。如果你想检查系统中是否已经存在 www-data 用户&#xff0c;并在没有的情况下添加一个&#xff0c;可以按照以下步骤操作&#xff1a; ### 1. 检查 www-data …

23.模块和包

模块 模块Module,是一个python文件&#xff0c;以.py结尾。 模块能定义函数、类和变量。 模块导入 模块在使用前需要先导入 [from 模块名] import [模块 | 类 | 变量 | 函数 | *] [as 别名] import 模块 import time print("start...") time.sleep(5) print(&…

IDEA报错:无效的源发行版、无效的目标发行版

1. 无效的源发行版 创建项目的时候&#xff0c;会遇见这个报错&#xff0c;原因就是编译的JDK版本与发布版本不一致。 解决方法&#xff1a; 1.1. 找到问题所在地 英文&#xff1a;File -> Project Structure ->Project Settings 中文&#xff1a;文件->项目结构 …

2025年,客服知识库与人工智能的结合

随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;传统客服模式正在经历前所未有的变革。特别是在2025年&#xff0c;客服知识库与AI的深度融合&#xff0c;不仅极大地提升了客服处理的效率与准确性&#xff0c;还为用户带来了更加个性化、高效的服务体验。 …

JVM 双亲委派模型以及垃圾回收机制

目录 1. JVM 内存区域划分 2. JVM 中类加载的过程 1) 类加载的基本流程 2) 双亲委派模型 3. JVM 中垃圾回收机制 1) 找到垃圾 a) 引用计数 b) 可达性分析 2) 释放垃圾 1. JVM 内存区域划分 一个运行起来的 Java 进程&#xff0c;其实就是一个 JVM 虚拟机。 而进程是…

微信小程序跳转其他小程序以及跳转网站

一、跳转其他小程序 1.1 知道appid和页面路径 wx.navigateToMiniProgram({appId: appid, // 替换为目标小程序 AppIDpath: pathWithParams, // 小程序路径envVersion: release, // 开发版、体验版或正式版success(res) {console.log("跳转到其他小程序成功&#xff01;&q…