使用 Python 统计模型解释数据
介绍
统计数据为数据中许多重要的潜在模式提供了答案。统计模型有助于简明扼要地总结和推断变量之间的关系。如果不了解这些关系,预测模型通常是不完整的。
在本指南中,读者将学习如何拟合和分析定量(线性回归)和定性(逻辑回归)目标变量的统计模型。我们将使用 Statsmodels库进行统计建模。我们将首先导入我们将要使用的库。
加载所需的库和模块
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
import warnings
warnings.filterwarnings('ignore')
import statsmodels.api as sm
数据
线性回归数据
为了建立线性回归模型,我们将使用包含 600 个观测值和 10 个变量的贷款申请人的虚构数据。在这十个变量中,我们将使用以下六个变量:
受抚养人:申请人的受抚养人人数。
Is_graduate:申请人是否是毕业生(“1”)或不是(“0”)。
Loan_amount:提交申请的贷款金额(以美元计)。
Term_months:贷款期限(以月为单位)。
年龄:申请人的年龄。
收入:申请人的年收入(美元)。这是因变量。
逻辑回归数据
为了建立逻辑回归模型,我们将使用包含 768 个观测值和 9 个变量的糖尿病数据集,如下所述:
怀孕:怀孕的次数。
葡萄糖:血浆葡萄糖浓度。
diastolic:舒张压(mm Hg)。
三头肌:皮褶厚度(毫米)。
胰岛素:小时血清胰岛素(mu U/ml)。
bmi:BMI(体重(公斤)/身高(米))。
dpf:糖尿病谱系功能。
年龄:年龄(岁)。
糖尿病:'1' 表示患有糖尿病,而 '0' 表示没有患糖尿病。这是目标变量。
线性回归
线性回归模型是预测连续标签的模型。目标是根据我们选择的评估标准,生成一个代表某些观察到的数据的“最佳拟合”的模型。这方面的好例子是预测房价、零售店的销售额或个人的预期寿命。线性回归模型假设独立变量和因变量之间存在线性关系。
让我们从加载数据开始。第一行代码将数据读入为 pandas 数据框,而第二行打印数据的形状。第三行打印数据的前五个观察值。我们将尝试根据其他变量预测“收入”。
# Load data
df = pd.read_csv("data_smodel.csv")
print(df.shape)
df.head(5)
输出:
(600, 10)
| | Marital_status | Dependents | Is_graduate | Income | Loan_amount | Term_months | Credit_score | approval_status | Age | Sex |
|--- |---------------- |------------ |------------- |-------- |------------- |------------- |-------------- |----------------- |----- |----- |
| 0 | 0 | 0 | 0 | 362700 | 44500 | 384 | 0 | 0 | 55 | 1 |
| 1 | 0 | 3 | 0 | 244000 | 70000 | 384 | 0 | 0 | 30 | 1 |
| 2 | 1 | 0 | 0 | 286500 | 99000 | 384 | 0 | 0 | 32 | 1 |
| 3 | 0 | 0 | 1 | 285100 | 55000 | 384 | 0 | 0 | 68 | 1 |
| 4 | 0 | 0 | 1 | 320000 | 58000 | 384 | 0 | 0 | 53 | 1 |
线性回归 - 单变量
我们将从一个简单的线性回归模型开始,该模型只有一个协变量“Loan_amount”,预测“收入”。下面的代码行适合单变量线性回归模型并打印结果摘要。
model_lin = sm.OLS.from_formula("Income ~ Loan_amount", data=df)
result_lin = model_lin.fit()
result_lin.summary()
输出:
| Dep. Variable: | Income | R-squared: | 0.587 |
|------------------- |------------------ |--------------------- |----------- |
| Model: | OLS | Adj. R-squared: | 0.587 |
| Method: | Least Squares | F-statistic: | 851.4 |
| Date: | Fri, 26 Jul 2019 | Prob (F-statistic): | 4.60e-117 |
| Time: | 22:02:50 | Log-Likelihood: | -8670.3 |
| No. Observations: | 600 | AIC: | 1.734e+04 |
| Df Residuals: | 598 | BIC: | 1.735e+04 |
| Df Model: | 1 | | |
| Covariance Type: | nonrobust | | |
| | coef | std err | t | P>|t| | [0.025 | 0.975] |
|------------- |----------- |---------- |-------- |------- |---------- |---------- |
| Intercept | 4.618e+05 | 2.05e+04 | 22.576 | 0.000 | 4.22e+05 | 5.02e+05 |
| Loan_amount | 0.7528 | 0.026 | 29.180 | 0.000 | 0.702 | 0.803 |
| Omnibus: | 459.463 | Durbin-Watson: | 1.955 |
|---------------- |--------- |------------------- |----------- |
| Prob(Omnibus): | 0.000 | Jarque-Bera (JB): | 10171.070 |
| Skew: | 3.186 | Prob(JB): | 0.00 |
| Kurtosis: | 22.137 | Cond. No. | 8.69e+05 |
模型系数和 P 值的解释
输出的中间部分(标题以coef开头)对于模型解释很重要。拟合模型意味着,当比较两个“贷款金额”相差一个单位的申请人时,贷款金额较高的申请人的“收入”平均会高出 0.75 个单位。这个差异具有统计学意义,因为标有 ***P>|t|*** 的列下显示的 p 值小于显著性值 0.05。这意味着有强有力的证据表明变量“收入”和“贷款金额”之间存在线性关联。
R 平方值的解释
测试模型有效性的另一个参数是R 平方值,它表示由独立变量(贷款金额)解释的因变量(收入)的百分比变化。值越高,模型的可解释性越好,最高值为 1。在我们的例子中,R 平方值为 0.587,意味着变量“收入”的 59% 变化由变量“贷款金额”解释。
相关系数的解释
皮尔逊相关系数也是衡量两个变量之间线性关系程度和强度的指标。下面的代码行计算并打印相关系数,结果为 0.766。这是两个变量之间的强正相关性,最高值为 1。
cc = df[["Income", "Loan_amount"]].corr()
print(cc)
输出:
Income Loan_amount
Income 1.00000 0.76644
Loan_amount 0.76644 1.00000
线性回归 - 多元
在上一节中,我们介绍了使用一个变量的简单线性回归。然而,在现实世界中,我们将处理多个变量。这称为多元回归。在我们的例子中,我们将使用五个独立变量构建多元统计模型。
下面的代码行适合多元线性回归模型并打印结果摘要。需要注意的是,语法Income ~ Loan_amount + Age + Term_months + Dependents + Is_graduate并不意味着这五个变量实际上是相加的。相反,它只意味着这些变量被纳入模型作为变量“收入”的预测因子。
model_lin = sm.OLS.from_formula("Income ~ Loan_amount + Age + Term_months + Dependents + Is_graduate", data=df)
result_lin = model_lin.fit()
result_lin.summary()
输出:
| Dep. Variable: | Income | R-squared: | 0.595 |
|------------------- |------------------ |--------------------- |----------- |
| Model: | OLS | Adj. R-squared: | 0.592 |
| Method: | Least Squares | F-statistic: | 174.7 |
| Date: | Fri, 26 Jul 2019 | Prob (F-statistic): | 3.95e-114 |
| Time: | 22:04:27 | Log-Likelihood: | -8664.6 |
| No. Observations: | 600 | AIC: | 1.734e+04 |
| Df Residuals: | 594 | BIC: | 1.737e+04 |
| Df Model: | 5 | | |
| Covariance Type: | nonrobust | | |
| | coef | std err | t | P>|t| | [0.025 | 0.975] |
|------------- |----------- |---------- |-------- |------- |----------- |---------- |
| Intercept | 2.68e+05 | 1.32e+05 | 2.029 | 0.043 | 8575.090 | 5.27e+05 |
| Loan_amount | 0.7489 | 0.026 | 28.567 | 0.000 | 0.697 | 0.800 |
| Age | -856.1704 | 1265.989 | -0.676 | 0.499 | -3342.530 | 1630.189 |
| Term_months | 338.6069 | 295.449 | 1.146 | 0.252 | -241.644 | 918.858 |
| Dependents | 8437.9050 | 1.84e+04 | 0.460 | 0.646 | -2.76e+04 | 4.45e+04 |
| Is_graduate | 1.365e+05 | 4.56e+04 | 2.995 | 0.003 | 4.7e+04 | 2.26e+05 |
| Omnibus: | 460.035 | Durbin-Watson: | 1.998 |
|---------------- |--------- |------------------- |----------- |
| Prob(Omnibus): | 0.000 | Jarque-Bera (JB): | 10641.667 |
| Skew: | 3.173 | Prob(JB): | 0.00 |
| Kurtosis: | 22.631 | Cond. No. | 5.66e+06 |
模型系数和 P 值的解释
上面的输出表明,当其他变量保持不变时,如果我们比较两个“贷款金额”相差一个单位的申请人,则“贷款金额”较高的申请人的“收入”平均会高出 0.75 个单位。
利用P>|t|结果,我们可以推断变量“Loan_amount”和“Is_graduate”是两个具有统计意义的变量,因为它们的 p 值小于 0.05。
每当分类变量在回归模型中用作协变量时,该变量的一个水平将被省略,并自动赋予零系数。这个水平称为协变量的参考水平。在上面的模型中,“Is_graduate”是一个分类变量,回归输出中只包含“Graduate”申请人的系数,而“Not Graduate”是参考水平。
R 平方值的解释
R平方值从 0.587 略微增加到 0.595,这意味着现在“收入”变化的 59.5% 由五个独立变量解释,而之前为 58.7%。略微增加可能是因为纳入了同样具有统计意义的“Is_graduate”变量。
逻辑回归
逻辑回归是一种用于分类问题的广义线性模型。其目标是预测分类结果,例如预测客户是否会流失,或者银行贷款是否会违约。
在本指南中,我们将构建统计模型来预测二元结果,即只能采用两个不同值的结果。让我们从加载数据开始。第一行代码将数据读入为 pandas 数据框,而第二行打印数据的形状。第三行打印前五个观察值。我们将尝试根据其他变量预测“糖尿病”。
df2 = pd.read_csv("diabetes.csv")
print(df2.shape)
df2.head(5)
输出:
(768, 9)
| | pregnancies | glucose | diastolic | triceps | insulin | bmi | dpf | age | diabetes |
|--- |------------- |--------- |----------- |--------- |--------- |------ |------- |----- |---------- |
| 0 | 6 | 148 | 72 | 35 | 0 | 33.6 | 0.627 | 50 | 1 |
| 1 | 1 | 85 | 66 | 29 | 0 | 26.6 | 0.351 | 31 | 0 |
| 2 | 8 | 183 | 64 | 0 | 0 | 23.3 | 0.672 | 32 | 1 |
| 3 | 1 | 89 | 66 | 23 | 94 | 28.1 | 0.167 | 21 | 0 |
| 4 | 0 | 137 | 40 | 35 | 168 | 43.1 | 2.288 | 33 | 1 |
逻辑回归 - 单变量
我们将从只有一个协变量“年龄”的基本逻辑回归模型开始,预测“糖尿病”。下面的代码行适合单变量逻辑回归模型并打印结果摘要。
model = sm.GLM.from_formula("diabetes ~ age", family=sm.families.Binomial(), data=df2)
result = model.fit()
result.summary()
输出:
| Dep. Variable: | diabetes | No. Observations: | 768 |
|----------------- |------------------ |------------------- |--------- |
| Model: | GLM | Df Residuals: | 766 |
| Model Family: | Binomial | Df Model: | 1 |
| Link Function: | logit | Scale: | 1.0 |
| Method: | IRLS | Log-Likelihood: | -475.36 |
| Date: | Fri, 26 Jul 2019 | Deviance: | 950.72 |
| Time: | 22:08:35 | Pearson chi2: | 761. |
| No. Iterations: | 4 | | |
| | coef | stderr | z | P>|z| | [0.025 | 0.975] |
|----------- |--------- |------- |-------- |------- |-------- |-------- |
| Intercept | -2.0475 | 0.239 | -8.572 | 0.000 | -2.516 | -1.579 |
| age | 0.0420 | 0.007 | 6.380 | 0.000 | 0.029 | 0.055 |
使用上面的<fon
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~