首页 > 编程语言 >基于Python代码的相关性热力图,VIF共线性诊断图及残差四图的使用及解释

基于Python代码的相关性热力图,VIF共线性诊断图及残差四图的使用及解释

时间:2024-03-23 21:22:26浏览次数:22  
标签:plt vif Python 残差 df 图及 import VIF data

注:热力图共线性诊断图易看易解释,这里不再阐述

残差四图(Residuals vs Fitted Plot,Normal Q-Q Plot,Scale-Location Plot,Cook's Distance Plot)

各种现象的相关解释如下:

  1. Residuals vs Fitted Plot(残差与拟合值散点图):
    这个图用于帮助检验回归模型的线性关系假设。在这个图中,我们会将模型的残差(观测值与预测值之间的差异)与模型的拟合值(预测值)进行比较,理想情况下,残差应该随着拟合值的增加而随机分布在0附近,没有明显的模式或趋势。如果残差呈现出某种趋势,可能意味着模型的线性关系假设不成立。

  2. Normal Q-Q Plot(正态概率图):
    这个图用于检验模型残差是否符合正态分布。在这个图中,残差的排序值会和一个理论的正态分布进行比较,理想情况下,残差点应该落在一条直线上,如果残差点偏离直线,可能表示残差不符合正态分布。

  3. Scale-Location Plot(标准化残差与拟合值的散点图):
    这个图也称为“Spread-Location”图,用于检验模型的同方差性假设。在这个图中,我们会将标准化残差的绝对值开方(以消除负值)与拟合值进行比较,理想情况下,点应该在一条水平线上分布,如果点呈现出聚集或特定的模式,可能意味着同方差性不成立。

  4. Cook’s Distance Plot(库克距离图):
    这个图用于识别在回归模型中对结果产生显著影响的个别观测值。Cook’s Distance是一种衡量数据点影响的统计量,这个图可以显示每个数据点的Cook’s Distance值,通常我们会关注那些Cook’s Distance远高于平均水平的数据点,它们可能是影响模型准确性的异常值或离群点。

综合使用这四种图可以帮助分析师评估线性回归模型的准确性、假设是否成立以及是否存在异常值,从而提高建模的质量和可靠性。

1>封装好的代码如下:

import matplotlib.pyplot as plt
import seaborn as sns
import statsmodels.formula.api as smf
import pandas as pd
from statsmodels.formula.api import ols
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

def Corr_heatmap(data):
    # import matplotlib.pyplot as plt
    # import seaborn as sns
    #相关性分析
    print(data.corr())
    #画出热力图
    plt.figure(figsize=(7,5),dpi=128)
    sns.heatmap(data.corr().round(2), cmap='coolwarm', annot=True, annot_kws={"size": 10})
    plt.savefig('相关系数热力图.jpg')
    plt.show()

def VIF_calculate(data, y_name):
    # import statsmodels.formula.api as smf
    # import pandas as pd
    x_cols = data.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(data[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()
    # from statsmodels.formula.api import ols
    def vif(data, col_i):
        """
        df: 整份数据
        col_i:被检测的列名
        """
        cols = list(data.columns)
        cols.remove(col_i)
        cols_noti = cols
        formula = col_i + '~' + '+'.join(cols_noti)
        r2 = ols(formula, data).fit().rsquared
        # 其实就是多元线性回归建模步骤,只是取出了参数 R 平方而已
        test = 1. / (1. - r2)
        return test

    print('vif检验结果')
    print('  变量            vif检验值')
    vif_value = []
    for i in data:
        print(i.center(7) + '    ', str(vif(data=data, col_i=i)))
        vif_value.append(vif(data=data, col_i=i))
    plt.bar([x for x in data], vif_value, color='teal')
    plt.axhline(10, color='red', lw=2, label="参考线")
    plt.title("VIF检验结果")
    plt.xlabel("变量")
    plt.ylabel("VIF_value")
    plt.show()
    return print(df_vif)

def Residuals_plot(predicts,residuals):
    import numpy as np
    import matplotlib.pyplot as plt
    import statsmodels.api as sm
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.rcParams['axes.unicode_minus'] = False

    plt.subplots(2, 2, figsize=(8, 8), dpi=128)
    plt.subplot(221)
    plt.scatter(predicts, residuals)
    plt.xlabel('Fitted Value')
    plt.ylabel('Residual')
    plt.title('(a)Residuals vs Fitted Plot', fontsize=15)
    plt.axhline(0, ls='--')

    ax2 = plt.subplot(222)
    pplot = sm.ProbPlot(residuals, fit=True)
    pplot.qqplot(line='r', ax=ax2, xlabel='Theoretical Quantiles', ylabel='Sample Quantiles')
    ax2.set_title('(b)Normal Q-Q Plot', fontsize=15)

    #创建一个序列来表示观测序号:
    obs = np.arange(1, len(residuals) + 1)
    #绘制scale-location图
    ax3 = plt.subplot(223)
    ax3.scatter(np.sqrt(obs), np.abs(residuals))
    ax3.set_xlabel("√Observation Number")
    ax3.set_ylabel("|Residuals|")
    ax3.set_title("(c)Scale-Location Plot")

    #计算库克距离并绘制库克距离图:
    model = sm.OLS(residuals, sm.add_constant(obs)).fit()  # 应用OLS回归模型
    influence = model.get_influence()
    cooks_dist = influence.cooks_distance[0]

    ax4=plt.subplot(224)
    ax4.scatter(obs, cooks_dist)
    ax4.axhline(y=4*cooks_dist.mean(), linestyle='dashed')
    ax4.set_xlabel("Observation")
    ax4.set_ylabel("Cook's Distance")
    ax4.set_title("(d)Cook's Distance Plot")
    plt.tight_layout()
    plt.show()
Multivariable_statistics.py

 2>对上述代码进行简单调用:

import Multivariable_statistics as Ms
import numpy as np
import pandas as pd
p=np.linspace(20,60,100)   #预测值
r=np.random.uniform(-1,1,100)   #残差值
print(r)
Ms.Residuals_plot(residuals=r,predicts=p)   #残差四图


#对于其他两个图的使用教程,以p,r数据为例
#得到一组100*2的数据
df=pd.DataFrame(p,columns=['p'])
df['r']=r
df['y']=np.linspace(50,80,100)   #预测值
print(df)

Ms.Corr_heatmap(df)    #皮尔逊相关系数的热力图
Ms.VIF_calculate(df,'y')        #VIF检验值以及图

3>结果图如下:

 

标签:plt,vif,Python,残差,df,图及,import,VIF,data
From: https://www.cnblogs.com/hongbao/p/18091668

相关文章

  • 【华为OD机试】真题A卷-快速开租建站(Python)
    一、题目描述【华为OD机试】真题A卷-快速开租建站(Python)题目描述:当前IT部门支撑了子公司颗粒化业务,该部门需要实现为子公司快速开租建站的能力,建站是指在一个全新的环境部署一套IT服务。1:每个站点开站会由一系列部署任务项构成,每个任务项部署完成时间都是固定和相等的,设为1......
  • 跳马【华为OD机试JAVA&Python&C++&JS题解】
    一.题目马是象棋(包括中国象棋和国际象棋)中的棋子,走法是每步直一格再斜一格,即先横着或直着走一格,然后再斜着走一个对角线,可进可退,可越过河界,俗称“马走‘日’字。给顶m行n列的棋盘(网格图),棋盘上只有有棋子象棋中的棋子“马”,并且每个棋子有等级之分,等级为k的马可以跳1~k......
  • Python实战:Lambda函数与匿名函数
    一、引言在Python编程中,Lambda函数和匿名函数是两种特殊的函数定义方式,它们可以提高代码的简洁性和可读性。Lambda函数和匿名函数通常用于简单的函数表达式,如数据处理和函数式编程。本文将详细介绍Python中的Lambda函数与匿名函数,并通过具体代码示例展示它们的应用。二、L......
  • Python日志记录
    Python的logging模块是一个内置的标准库,它为编写程序时生成、记录和管理日志信息提供了强大而灵活的功能。日志对于软件开发至关重要,尤其是在调试、监控应用状态、追踪异常行为、分析性能瓶颈以及审计等方面。入门级的logging应用主要是掌握如何在简单的Python程序中引入loggi......
  • python-day02
    python判断语句if、elif、elseif条件:结果elif条件:结果else条件:结果随件数产生importrandom#随机产生1-10的随机数num=random.randint(1,10)while循环while条件:循环体eg:while循环实现九九乘法表i=1whilei<=9:j=1whi......
  • python实现列1的数据补充到列2
    具体代码(我是以一个数据较少的csv文件做了测试,具体的csv文件需要修改部分代码才能顺利实现)importpandasaspddf01=pd.read_csv("D:\\12140\\Desktops\\111\\333\\333.csv",encoding="utf-8",dtype="str")data=df01['新增'].fillna('no_zeng......
  • python环境搭建及特定操作系统注意事项
    文章目录搭建Python环境通用的流程:**1.下载并安装Python解释器****2.验证安装****3.安装包管理器(pip)****4.安装必要的开发工具****5.创建虚拟环境(推荐)****6.安装项目所需的库****7.配置IDE/编辑器**特定操作系统(如Windows、macOS、Linux)的特定步骤或注意事项**Wi......
  • Python虚拟环境conda的安装使用
    文章目录conda虚拟环境的详细步骤和注意事项:**安装Conda****创建Conda虚拟环境****激活Conda虚拟环境****安装Python包****管理Conda环境****其他优势与特性**相较于`venv`,使用`conda`管理虚拟环境有以下优势:**性能****资源占用****其他性能与资源相关因素****结论**......
  • 2024华为OD统一考试(C卷)最新题库(Java & Python & C++)
    关于华为OD​华为的员工补充途径有三种,分别是校招、OD转正和社招。校招是华为唯一的正式员工入职途径,但是从近几届开始竞争非常激烈,尤其是在CV、AI、NLP等赛道上,所以对于C9等专业的学生来说,可以考虑转向一些冷门方向。​OD转正是指在华为工作满一年之后,可以根据部门OD......
  • python小白学习笔记Mac版本
    和win系统的不同之处python的cmd验证在win系统中,只需要输入python就可以得到相关python的版本信息但是在mac系统中,需要输入python3.12(3.12是具体版本的号码)只输入python和pip也显示找不到相关文件(已经成功的安装前提下)只有输入第三行代码python3.12才会显示pyth......