Spatial Data Analysis(一):线性回归

news2024/12/23 13:26:16

Spatial Data Analysis(一):线性回归

来源:https://github.com/Ziqi-Li/GEO4162C/tree/main

在此示例中,我们将介绍如何在 python 中拟合线性回归模型。 我们将使用的数据集是 2020 年县级选举投票数据以及来自 ACS 的社会经济数据。

import pandas as pd
import geopandas as gpd
voting_url = "https://raw.githubusercontent.com/Ziqi-Li/GEO4162C/main/data/voting_2021.csv"
voting = pd.read_csv(voting_url)
voting.shape
(3108, 22)
voting.head()
county_idstatecountyNAMEproj_Xproj_Ytotal_popnew_pct_demsex_ratiopct_black...median_incomepct_65_overpct_age_18_29ginipct_manufln_pop_denpct_3rd_partyturn_outpct_fbpct_uninsured
0170511751Fayette County, Illinois597980.1820641.796863e+062156518.479911113.64.7...4665018.814.8991420.437314.93.3927481.74025559.0660791.38.2
11710717107Logan County, Illinois559815.8133331.920479e+062900329.59309597.26.9...5730818.017.2568350.420112.43.8471632.39205757.3957341.64.5
21716517165Saline County, Illinois650277.2148951.660710e+062399425.60594996.92.6...4409019.913.5867300.46928.74.1287311.57238459.0785331.04.2
3170971797Lake County, Illinois654006.8406982.174577e+0670147362.27588899.86.8...8942713.715.8231320.484716.37.3085821.96033871.15644618.76.8
41712717127Massac County, Illinois640398.9862581.599902e+061421925.66200589.55.8...4748120.812.3707720.40977.44.0677881.33568262.3729741.05.4

5 rows × 22 columns

shp_url = "https://raw.githubusercontent.com/Ziqi-Li/GEO4162C/main/data/County_shp_2018/County_shp_2018.shp"
shp = gpd.read_file(shp_url)
shp.plot()
<Axes: >

在这里插入图片描述

shp.head()
STATEFPCOUNTYFPCOUNTYNSAFFGEOIDGEOIDNAMELSADALANDAWATERgeoid_intgeometry
039071010740480500000US3907139071Highland0614324799921219498339071POLYGON ((1037181.007 1847418.019, 1034790.811...
106003016758400500000US0600306003Alpine061912292630125573046003POLYGON ((-2057214.391 1981928.249, -2051788.3...
212033002957370500000US1203312033Escambia06170154450256392761212033POLYGON ((797106.710 901987.747, 797133.592 90...
317101004242520500000US1710117101Lawrence06963936864507778317101POLYGON ((697325.783 1756964.285, 694889.230 1...
428153006957970500000US2815328153Wayne062099745573725547628153POLYGON ((664815.315 992438.494, 664464.412 99...

使用公共键合并两个 DataFrame。

shp_df = shp.merge(voting,left_on="geoid_int",right_on="county_id")

制作一张关于人们如何投票的地图。 非常熟悉的蓝红色景观。

shp_df.plot(column="new_pct_dem",cmap="bwr_r",vmin=0,vmax=100,legend=True,figsize=(10,10))
<Axes: >

在这里插入图片描述


线性回归

将使用“statsmodels”库来估计线性回归模型。

import statsmodels.formula.api as smf
shp_df.columns
Index(['STATEFP', 'COUNTYFP', 'COUNTYNS', 'AFFGEOID', 'GEOID', 'NAME_x',
       'LSAD', 'ALAND', 'AWATER', 'geoid_int', 'geometry', 'county_id',
       'state', 'county', 'NAME_y', 'proj_X', 'proj_Y', 'total_pop',
       'new_pct_dem', 'sex_ratio', 'pct_black', 'pct_hisp', 'pct_bach',
       'median_income', 'pct_65_over', 'pct_age_18_29', 'gini', 'pct_manuf',
       'ln_pop_den', 'pct_3rd_party', 'turn_out', 'pct_fb', 'pct_uninsured'],
      dtype='object')
import matplotlib.pyplot as plt

做一个简单的散点图,我们可以看到一点正相关。

plt.scatter(shp_df.pct_bach, shp_df.new_pct_dem)
plt.xlabel("pct_bach")
plt.ylabel("pct_dem")
Text(0, 0.5, 'pct_dem')

在这里插入图片描述

from scipy.stats import pearsonr
pearsonr(shp_df.pct_bach, shp_df.new_pct_dem)
PearsonRResult(statistic=0.533176728506252, pvalue=7.032775736251e-228)

现在让我们指定一个简单的模型:

Model_1: new_pct_dem ~ 1 + pct_bach

new_pct_dem: 因变量,投票给民主党的人的百分比

pct_bach: 自变量,拥有学士学位的人的百分比

1: 是添加截距,这个是经常需要的

model_1 = smf.ols(formula='new_pct_dem ~ 1 + pct_bach', data=shp_df).fit()
model_1.summary()
OLS Regression Results
Dep. Variable:new_pct_dem R-squared: 0.284
Model:OLS Adj. R-squared: 0.284
Method:Least Squares F-statistic: 1234.
Date:Fri, 17 Nov 2023 Prob (F-statistic):7.03e-228
Time:16:07:30 Log-Likelihood: -12560.
No. Observations: 3108 AIC: 2.512e+04
Df Residuals: 3106 BIC: 2.514e+04
Df Model: 1
Covariance Type:nonrobust
coefstd errtP>|t|[0.0250.975]
Intercept 13.9652 0.618 22.615 0.000 12.754 15.176
pct_bach 0.9055 0.026 35.124 0.000 0.855 0.956
Omnibus:376.503 Durbin-Watson: 1.927
Prob(Omnibus): 0.000 Jarque-Bera (JB): 603.255
Skew: 0.845 Prob(JB): 1.01e-131
Kurtosis: 4.342 Cond. No. 60.0


Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.

这给了我们回归函数:

pct_dem = 13.9652 + 0.9055*pct_bach

解释:

  1. Bach的%与DEM的%呈正相关。
  2. 增加1%Bach将增加0.9055%的人投票给DEM。
  3. 截距和 % Bach 的 p 值都非常小 (<0.05),表明系数/发现的关系在统计上都是显着的。
  4. R2 值 = 0.284 表明该模型具有一定程度的解释力。 请记住 0<=R2<=1。
import numpy as np
np.sqrt(0.284)
0.532916503778969

R2 的平方根也是皮尔逊相关系数。

现在让我们指定一个更复杂的模型:

Model_2: new_pct_dem ~ 1 + pct_bach + median_income + ln_pop_den

new_pct_dem: 因变量,投票给民主党的人的百分比

pct_bach: 自变量,拥有学士学位的人的百分比
median_income: 自变量,收入中位数

ln_pop_den: 自变量,人口密度的对数尺度

1: 是添加截距,这个是经常需要的

model_2 = smf.ols(formula='new_pct_dem ~ 1 + pct_bach + median_income + ln_pop_den', data=shp_df).fit()
model_2.summary()
OLS Regression Results
Dep. Variable:new_pct_dem R-squared: 0.433
Model:OLS Adj. R-squared: 0.432
Method:Least Squares F-statistic: 789.2
Date:Fri, 17 Nov 2023 Prob (F-statistic): 0.00
Time:16:07:30 Log-Likelihood: -12199.
No. Observations: 3108 AIC: 2.441e+04
Df Residuals: 3104 BIC: 2.443e+04
Df Model: 3
Covariance Type:nonrobust
coefstd errtP>|t|[0.0250.975]
Intercept 17.3905 0.898 19.361 0.000 15.629 19.152
pct_bach 0.9890 0.034 29.145 0.000 0.923 1.056
median_income -0.0004 2.23e-05 -15.804 0.000 -0.000 -0.000
ln_pop_den 3.5657 0.142 25.074 0.000 3.287 3.845
Omnibus:483.110 Durbin-Watson: 1.926
Prob(Omnibus): 0.000 Jarque-Bera (JB): 843.802
Skew: 1.002 Prob(JB): 5.90e-184
Kurtosis: 4.580 Cond. No. 2.25e+05


Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
[2] The condition number is large, 2.25e+05. This might indicate that there are
strong multicollinearity or other numerical problems.

这给了我们新的回归函数:

pct_dem = 17.3905 + 0.9890 * pct_bach + -0.0004 *median_income + 3.5657 * ln_pop_den

解释:

  1. %Bach,人口密度与%DEM呈正相关。
  2. 收入中位数与 % DEM 呈负相关。
  3. 增加 1% Bach将增加 0.9890% 的人投票给 DEM。
  4. 收入中位数每增加 1 美元,投票给 DEM 的人数就会减少 0.0004%。 这也意味着增加 10,000 美元将减少 4%。
  5. 所有变量的 p 值都非常小 (<0.05),表明所有系数/发现的关系在统计上都是显着的。
  6. R2 值 = 0.433,表明该模型与模型 1 相比具有更好的解释力。

诊断图

线性回归的四个假设是什么? 提示:线

残差与拟合图

#get the predicted value
pred = model_2.fittedvalues

#get the residual
resid = model_2.resid
shp_df.new_pct_dem
0       19.505057
1       66.111111
2       42.319648
3       22.505948
4       36.491793
          ...    
3103    28.144652
3104    63.766385
3105    58.965517
3106    32.751442
3107    46.070656
Name: new_pct_dem, Length: 3108, dtype: float64
plt.scatter(shp_df.new_pct_dem,pred)
plt.xlabel("True % DEM")
plt.ylabel("Predicted % DEM")
Text(0, 0.5, 'Predicted % DEM')

在这里插入图片描述

您可以看到任何明显的问题吗?

plt.scatter(pred, resid,alpha=0.5)

plt.axhline(y = 0.0, color = 'black', linestyle = '--')

plt.xlabel("Predicted value")
plt.ylabel("Residual")
plt.title("Model 2")
Text(0.5, 1.0, 'Model 2')

在这里插入图片描述

检查残余正态性。 是否歪斜?

plt.hist(resid)
(array([1.000e+00, 9.300e+01, 8.650e+02, 1.137e+03, 6.410e+02, 2.330e+02,
        9.500e+01, 3.200e+01, 1.000e+01, 1.000e+00]),
 array([-38.91209715, -28.29712822, -17.6821593 ,  -7.06719038,
          3.54777854,  14.16274746,  24.77771638,  35.3926853 ,
         46.00765422,  56.62262314,  67.23759207]),
 <BarContainer object of 10 artists>)

在这里插入图片描述

然后我们来画一个 Q-Q 图。 如果所有蓝点(残差)都位于代表完美正态分布的直线上,则期望是这样。 很明显,残差不正常。

import scipy.stats as stats

stats.probplot(resid, dist="norm", plot=plt)
((array([-3.51125824, -3.26814139, -3.13373139, ...,  3.13373139,
          3.26814139,  3.51125824]),
  array([-38.91209715, -27.53724546, -25.76653482, ...,  52.7401659 ,
          53.71192504,  67.23759207])),
 (11.948687014006548, 8.341427973378232e-12, 0.9739250994350543))

在这里插入图片描述

完整模型

让我们在模型中添加更多变量

shp_df.columns
Index(['STATEFP', 'COUNTYFP', 'COUNTYNS', 'AFFGEOID', 'GEOID', 'NAME_x',
       'LSAD', 'ALAND', 'AWATER', 'geoid_int', 'geometry', 'county_id',
       'state', 'county', 'NAME_y', 'proj_X', 'proj_Y', 'total_pop',
       'new_pct_dem', 'sex_ratio', 'pct_black', 'pct_hisp', 'pct_bach',
       'median_income', 'pct_65_over', 'pct_age_18_29', 'gini', 'pct_manuf',
       'ln_pop_den', 'pct_3rd_party', 'turn_out', 'pct_fb', 'pct_uninsured'],
      dtype='object')
formula = 'new_pct_dem ~ 1 + sex_ratio + pct_black + pct_hisp + pct_bach + median_income + pct_65_over + pct_age_18_29 + gini + pct_manuf + ln_pop_den + pct_3rd_party + turn_out + pct_fb + pct_uninsured'

model_3 = smf.ols(formula=formula, data=shp_df).fit()
model_3.summary()
OLS Regression Results
Dep. Variable:new_pct_dem R-squared: 0.673
Model:OLS Adj. R-squared: 0.672
Method:Least Squares F-statistic: 455.1
Date:Fri, 17 Nov 2023 Prob (F-statistic): 0.00
Time:16:07:34 Log-Likelihood: -11342.
No. Observations: 3108 AIC: 2.271e+04
Df Residuals: 3093 BIC: 2.280e+04
Df Model: 14
Covariance Type:nonrobust
coefstd errtP>|t|[0.0250.975]
Intercept -25.5366 4.843 -5.272 0.000 -35.033 -16.040
sex_ratio 0.0376 0.017 2.162 0.031 0.004 0.072
pct_black 0.5523 0.014 39.052 0.000 0.525 0.580
pct_hisp 0.3120 0.020 15.745 0.000 0.273 0.351
pct_bach 0.6819 0.039 17.542 0.000 0.606 0.758
median_income -0.0002 2.58e-05 -8.428 0.000 -0.000 -0.000
pct_65_over 0.1804 0.058 3.103 0.002 0.066 0.294
pct_age_18_29 0.1371 0.067 2.036 0.042 0.005 0.269
gini 18.0909 6.040 2.995 0.003 6.249 29.933
pct_manuf 0.0487 0.030 1.646 0.100 -0.009 0.107
ln_pop_den 2.6681 0.154 17.328 0.000 2.366 2.970
pct_3rd_party 4.3480 0.234 18.582 0.000 3.889 4.807
turn_out 0.2263 0.026 8.750 0.000 0.176 0.277
pct_fb 0.1392 0.051 2.707 0.007 0.038 0.240
pct_uninsured -0.3402 0.044 -7.683 0.000 -0.427 -0.253
Omnibus:1000.163 Durbin-Watson: 1.910
Prob(Omnibus): 0.000 Jarque-Bera (JB): 8501.905
Skew: 1.283 Prob(JB): 0.00
Kurtosis:10.686 Cond. No. 2.34e+06


Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
[2] The condition number is large, 2.34e+06. This might indicate that there are
strong multicollinearity or other numerical problems.

该模型得到了进一步改进,R2 为 0.673

#get the predicted value
pred_3 = model_3.fittedvalues

#get the residual
resid_3 = model_3.resid
plt.scatter(shp_df.new_pct_dem,pred_3)
plt.xlabel("True % DEM")
plt.ylabel("Predicted % DEM")
Text(0, 0.5, 'Predicted % DEM')

在这里插入图片描述

让我们重新制作这些诊断图,现在它们看起来好多了!

plt.scatter(pred_3, resid_3,alpha=0.5)

plt.axhline(y = 0.0, color = 'r', linestyle = '-')

plt.xlabel("Predicted value")
plt.ylabel("Residual")
plt.title("Model 3")
Text(0.5, 1.0, 'Model 3')

在这里插入图片描述

plt.hist(resid_3)
(array([3.000e+00, 1.200e+01, 5.960e+02, 1.866e+03, 5.510e+02, 6.300e+01,
        6.000e+00, 7.000e+00, 3.000e+00, 1.000e+00]),
 array([-47.50438204, -34.08283911, -20.66129618,  -7.23975325,
          6.18178968,  19.60333261,  33.02487554,  46.44641847,
         59.8679614 ,  73.28950433,  86.71104726]),
 <BarContainer object of 10 artists>)

在这里插入图片描述

QQ 图表明,除了一些极值之外,大多数点都在直线上。

import scipy.stats as stats
stats.probplot(resid_3, dist="norm", plot=plt)
((array([-3.51125824, -3.26814139, -3.13373139, ...,  3.13373139,
          3.26814139,  3.51125824]),
  array([-47.50438204, -43.62464376, -38.82786172, ...,  68.71420089,
          72.06270506,  86.71104726])),
 (8.974562038717135, 3.0034852088946733e-12, 0.963803701208645))

在这里插入图片描述

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

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

相关文章

STM32单片机项目实例:基于TouchGFX的智能手表设计(1)项目介绍及GUI界面基础

STM32单片机项目实例&#xff1a;基于TouchGFX的智能手表设计&#xff08;1&#xff09;项目介绍及GUI界面基础 一、项目介绍 1.1方案提供 1.2主控选择 1.3硬件平台 1.4 开发环境 1.5 关于华清 二、GUI界面基础 2.1.1 嵌入式绘图系统 2.1.1 色彩格式 2.1.1帧缓冲区 …

ERP软件定制开发对企业的优势|app小程序搭建

ERP软件定制开发对企业的优势|app小程序搭建 随着科技的不断发展&#xff0c;企业管理也面临了更多的挑战。为了更好地适应市场需求和提高运营效率&#xff0c;越来越多的企业开始选择使用ERP软件进行管理。然而&#xff0c;市场上现成的ERP软件并不能完全满足企业的需求&#…

css 修改滚动条样式,解决Windows浏览器中滚动条不美观问题

Windows环境中的浏览器中滚动条默认是直接显示了&#xff0c;不管光标是否进入该区域&#xff0c;这样就很不美观&#xff0c;如下图&#xff1a; 之前样式为 .well {display: block;background-color: #f2f2f2;border: 1px solid #ccc;margin: 5px;width: calc(100% - 12px);h…

HarmonyOS/OpenHarmony应用开发

OpenHarmony是由开放原子开源基金会(OpenAtom Foundation)孵化及运营的开源项目, 目标是面向全场景、全连接、全智能时代, 搭建一个智能终端设备操作系统的框架和平台, 促进万物互联产业的繁荣发展。 了解OpenHarmony HarmonyOS是华为通过OpenHarmony项目&#xff0c;结合商业…

调试GMS应用,报错“此设备未获得play保护机制认证”问题解决

不少同学在调试GMS相关应用时&#xff0c;需登录Google账号&#xff0c;有时会弹出如下通知。 Google登录界面也会出现如下提示 这个报错的原因是设备未通过Google认证&#xff0c;google服务器未配置荣耀设备的型号白名单导致 国内网页有一些指导方法在鸿蒙\荣耀的设备上消除这…

2023年江西省“振兴杯”网络信息行业职业技能竞赛 Web4 Writeup

这次振兴杯碰到的一道题&#xff0c;某些姿势之前貌似没有碰过&#xff0c;简单记一下吧 源码 <?php class Bird{public $funcs;public $salt;public $flag;function say_flag(){$secret hash_hmac(sha256, $_GET[salt], file_get_contents(/flag));$hmac hash_hmac(sha…

BearPi Std 板从入门到放弃 - 引气入体篇(5)(printf打印到串口)

简介 基于 BearPi Std 板从入门到放弃 - 引气入体篇&#xff08;4&#xff09;(Usart 中断接收), 使用printf打印到串口 步骤 覆写fputc函数 需要添加头文件#include “stdio.h” /* USER CODE BEGIN 0 */ int fputc(int ch, FILE *f) {uint8_t temp[1] {ch};{HAL_UART_Tr…

服务器托管与服务器租用的详细比较

​  在当今数字化时代&#xff0c;服务器托管和服务器租用成为了许多企业和个人选择的两种常见方式。它们都提供了一种将服务器放置在专业机房中的解决方案&#xff0c;但在具体实施和使用过程中存在一些差异。下面将详细比较这两种方式的优势和劣势。 1. 服务器托管 服务器托…

Python机器学习、深度学习入门丨气象常用科学计算库、气象海洋常用可视化库、爬虫和气象海洋数据、气象海洋常用插值方法、EOF统计分析、WRF模式后处理等

目录 专题一 Python软件的安装及入门 专题二 气象常用科学计算库 专题三 气象海洋常用可视化库 专题四 爬虫和气象海洋数据 专题五 气象海洋常用插值方法 专题六 机器学习基础理论和实操 专题七 机器学习的应用实例 专题八 深度学习基础理论和实操 专题九 深度学习的应…

力扣543. 二叉树的直径(java DFS解法)

Problem: 543. 二叉树的直径 文章目录 题目描述思路解题方法复杂度Code 题目描述 给你一棵二叉树的根节点&#xff0c;返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的 长度 由它们…

ubuntu20.04使用LIO-SAM对热室空间进行重建

一、安装LIO-SAM 1.环境配置 默认已经安装过ros sudo apt-get install -y ros-Noetic-navigation sudo apt-get install -y ros-Noetic-robot-localization sudo apt-get install -y ros-Noetic-robot-state-publisher 安装 gtsam(如果是18.04的ubuntu直接按照官网配置&…

[C国演义] 第二十三章

第二十三章 两个字符串的最小ASCLL删除和最长重复子数组 两个字符串的最小ASCLL删除和 力扣链接 求 删除字符的ASCLL和的最小值 ⇒ 正难则反 ⇒ 求公共子序列的ASCLL和的最大值 两个数组的dp问题 ⇒ 分区间讨论 ⇒ dp[i][j] -- nums1数组的[0, i] 区间 和 nums2数组的[0, j] …

文字转语音、语音转文字! AI视频生成神器!

分享一波文字转语音、语音转文字&#xff01;AI视频生成神器&#xff01;让外国人说中文&#xff0c;口型自然&#xff0c;不限语言&#xff0c;感兴趣的同学可以试试~ 可以用Al生成视频&#xff0c;Whisper语音转文字 Whisper 开源项目&#xff1a; https://github.com/Const…

【算法】Boyer-Moore 算法

目录 1.概述1.1.Boyer-Moore 算法介绍1.2.坏字符规则表1.3.好后缀规则表1.4.总结 2.代码实现3.应用 更多数据结构与算法的相关知识可以查看数据结构与算法这一专栏。 有关字符串模式匹配的其它算法&#xff1a; 【算法】Brute-Force 算法 【算法】KMP 算法 【算法】Rabin-Karp …

GateWay的路由与全局过滤器

1.断言工厂 我们在配置文件中写的断言规则只是字符串&#xff0c;这些字符串会被Predicate Factory读取并处理&#xff0c;转变为路由判断的条件 例如Path/user/**是按照路径匹配&#xff0c;这个规则是由 org.springframework.cloud.gateway.handler.predicate.PathRoutePr…

文心一言 VS 讯飞星火 VS chatgpt (149)-- 算法导论12.2 4题

五、用go语言&#xff0c;证明&#xff1a;如果一棵二叉搜索树中的一个结点有两个孩子&#xff0c;那么它的后继没有左孩子&#xff0c;它的前驱没有右孩子。 灵捷3.5 。 文心一言&#xff1a; 为了证明这个性质&#xff0c;我们首先需要明确二叉搜索树&#xff08;BST&…

有关ADW400环保监测模块的详细介绍-安科瑞 蒋静

1 概述 ADW400 环保监测模块主要用于计量低压网络的三相有功电能&#xff0c;同时可选择最大四个回路的电流输入&#xff0c;具有 RS485 通讯和 470MHz 无线通讯功能&#xff0c;方便用户进行用电监测、集抄和管理。可灵活安装于配电箱内&#xff0c;实现对不 同区域和不同负荷…

MS8231/8232微功耗、高精度、轨到轨输入输出运算放大器

产品简述 MS8231/8232 是单通道、双通道的轨到轨输入输出单电源运 放。它们具有很低的功耗和较高的精度&#xff0c;很适合电池供电和便携 式电子系统。 MS8231/8232 具有稳定的单位增益特性&#xff0c;并具有 13kHz 的信 号带宽&#xff0c;使其适合电池电流检测和传…

LeetCode | 226. 翻转二叉树

LeetCode | 226. 翻转二叉树 OJ链接 不为空就翻转&#xff0c;空空就停止翻转左子树的节点给了右子树右子树的节点给了左就完成了翻转 struct TreeNode* invertTree(struct TreeNode* root) {//不为空就进行翻转if(root){//翻转struct TreeNode* tmp root->left;root->…

信息化系列——企业信息化建设(2)

企业信息化建设常见问题 1、信息化意识薄弱 目前&#xff0c;仍有许多企业的管理者在信息化方面表现出薄弱的认识&#xff0c;他们对信息化建设的重视程度显得捉襟见肘。结果&#xff0c;企业在信息化建设的人力、物力支持方面投入甚微&#xff0c;导致信息化建设难以完成顶层…