使用 Python 查找数据中的关系

发布日期:2026-07-19 09:14:05  来源 : 杭州电子商务研究院    浏览量 :0
杭州电子商务研究院 发布日期:2026-07-19 09:14:05  
0

介绍

构建高性能机器学习算法取决于识别变量之间的关系。这有助于特征工程以及决定机器学习算法。在本指南中,您将学习使用 Python 在数据中查找关系的技术。

数据

在本指南中,我们将使用一个虚构的贷款申请人数据集,其中包含 200 个观测值和 10 个变量,如下所述:

  1. Marital_status:申请人是否已婚(“是”)或未婚(“否”)

  2. `Is_graduate':申请人是否为毕业生(“是”)或不是(“否”)

  3. 收入:申请人的年收入(美元)

  4. Loan_amount:提交申请的贷款金额(美元)

  5. Credit_score:申请人的信用评分是好(“好”)还是不好(“坏”)。

  6. Approval_status:贷款申请是否被批准(“是”)或未被批准(“否”)。

  7. 投资:申请人申报的股票和共同基金投资(以美元计)

  8. 性别:申请人是“女性”还是“男性”

  9. 年龄:申请人的年龄(岁)

  10. Work_exp:申请人的工作经验(年数)

让我们首先加载所需的库和数据。

      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

# Load data
dat = pd.read_csv("data_test.csv")
print(dat.shape) 
dat.head(5)
    

输出:

      (200, 10)


|   	| Marital_status 	| Is_graduate 	| Income 	| Loan_amount 	| Credit_score 	| approval_status 	| Investment 	| gender 	| age 	| work_exp 	|
|---	|----------------	|-------------	|--------	|-------------	|--------------	|-----------------	|------------	|--------	|-----	|----------	|
| 0 	| Yes            	| No          	| 72000  	| 70500       	| Bad          	| Yes             	| 117340     	| Female 	| 34  	| 8.10     	|
| 1 	| Yes            	| No          	| 64000  	| 70000       	| Bad          	| Yes             	| 85340      	| Female 	| 34  	| 7.20     	|
| 2 	| Yes            	| No          	| 80000  	| 275000      	| Bad          	| Yes             	| 147100     	| Female 	| 33  	| 9.00     	|
| 3 	| Yes            	| No          	| 76000  	| 100500      	| Bad          	| Yes             	| 65440      	| Female 	| 34  	| 8.55     	|
| 4 	| Yes            	| No          	| 72000  	| 51500       	| Bad          	| Yes             	| 48000      	| Female 	| 33  	| 8.10     	|
    

数值变量之间的关系

许多机器学习算法要求连续变量之间不相关,这种现象称为多重共线性。建立数值变量之间的关系是检测和处理多重共线性的常见步骤。

相关矩阵

创建相关矩阵是一种识别数值变量之间多重共线性的技术。在 Python 中,可以使用corr()函数创建相关矩阵,如下面的代码行所示。

      dat.corr()
    

输出:

      |             	| Income    	| Loan_amount 	| Investment 	| age       	| work_exp  	|
|-------------	|-----------	|-------------	|------------	|-----------	|-----------	|
| Income      	| 1.000000  	| 0.020236    	| 0.061687   	| -0.200591 	| 0.878455  	|
| Loan_amount 	| 0.020236  	| 1.000000    	| 0.780407   	| -0.033409 	| 0.031837  	|
| Investment  	| 0.061687  	| 0.780407    	| 1.000000   	| -0.022761 	| 0.076532  	|
| age         	| -0.200591 	| -0.033409   	| -0.022761  	| 1.000000  	| -0.133685 	|
| work_exp    	| 0.878455  	| 0.031837    	| 0.076532   	| -0.133685 	| 1.000000  	|
    

上面的输出显示变量IncomeWork_exp之间以及InvestmentLoan_amount之间存在强线性相关性。

相关图

还可以使用相关性图来可视化相关性,这是使用seaborn包中的pairplot函数实现的。

下面的第一行代码创建了一个新数据集df,其中仅包含数字变量。第二行创建绘图,其中参数kind="scatter"创建不带回归线的绘图。第三行绘制图表。

      df = dat[['Income','Loan_amount','Investment','age','work_exp']]

sns.pairplot(df, kind="scatter")
plt.show()
    

输出:

相关性检验

相关性检验是确定两个定量变量之间是否存在线性关系以及关系程度的另一种方法。在我们的案例中,我们想从统计上检验申请人的投资和他们的工作经验之间是否存在相关性。第一步是使用散点图可视化关系,这可以使用下面的代码行完成。

      plt.scatter(dat['work_exp'], dat['Investment'])
plt.show()
    

输出:

上图表明两个变量之间不存在线性关系。我们可以通过使用下面的代码行计算相关系数来量化这种推论。

      np.corrcoef(dat['work_exp'], dat['Investment'])
    

输出:

      array([[1.        , 0.07653245],
           [0.07653245, 1.        ]])
    

0.07 的值表明两个变量之间存在正但弱的线性关系。让我们使用线性回归相关性测试来确认这一点,该测试在 Python 中使用scipy.stats模块中的linregress()函数完成。

      from scipy.stats import linregress
linregress(dat['work_exp'], dat['Investment'])
    

输出:

      LinregressResult(slope=15309.333089382928, intercept=57191.00212603336, rvalue=0.0765324479448039, pvalue=0.28142275240186065,    stderr=14174.32722882554)
    

由于p值0.2814大于0.05,我们无法拒绝申请人的投资与其工作经验之间的关系不显著的原假设。

让我们使用下面的代码行来考虑收入工作指数之间的相关性的另一个例子。

      linregress(dat['work_exp'], dat['Income'])
    

输出:

      LinregressResult(slope=6998.2868438531395, intercept=11322.214342089712, rvalue=0.8784545623577412, pvalue=2.0141691110555243e-65, stderr=270.52631667365495)
    

在这种情况下,p值小于0.05,因此我们拒绝申请人的收入与工作经验之间的关系不显著的原假设。

分类变量之间的关系

在前面的部分中,我们介绍了寻找数值变量之间关系的技术。理解和估计分类变量之间的关系也同样重要。

频率表

频率表是一种简单但有效的查找两个分类变量之间分布的方法。crosstab()函数可用于创建两个变量之间的双向表。在下面的代码行中,我们在变量marital_statusloan_approval之间创建了一个双向表

      pd.crosstab(dat.Marital_status, dat.approval_status)
    

输出:

      | approval_status 	| No 	| Yes 	|
|-----------------	|----	|-----	|
| Marital_status  	|    	|     	|
| Divorced        	| 31 	| 29  	|
| No              	| 66 	| 10  	|
| Yes             	| 52 	| 12  	|
    

上面的输出显示,离婚申请人获得贷款批准的概率(56.8%)高于已婚申请人(19.6%)。为了检验这一结论是否具有统计显著性,我们使用了独立性卡方检验。

卡方独立性检验

独立性卡方检验用于确定两个或多个分类变量之间是否存在关联。在我们的案例中,我们想测试申请人的婚姻状况是否与他们的批准状态有关。

这可以在 Python 中使用scipy.stats模块中的chi2_contingency()函数轻松完成。下面的代码行执行测试。

      from scipy.stats import chi2_contingency
chi2_contingency(pd.crosstab(dat.Marital_status, dat.approval_status))
    

输出:

      (24.09504482353403, 5.859053936061414e-06, 2, array([[44.7 , 15.3 ],
            [56.62, 19.38],
            [47.68, 16.32]]))
    

上述输出的第二个值 — 5.859053936061414e-06 — 表示测试的 p 值。显然,p 值小于 0.05,因此我们拒绝申请人的婚姻状况与批准状态无关的零假设。为了理解 chi2_contingency 函数的参数和结果,可以使用help(chi2_contingency)命令,它将提供该函数的简要文档。

结论

在本指南中,您学习了查找数值变量和分类变量数据关系的技巧。您还学习了如何通过统计验证变量之间的关系来解释测试结果。

要了解有关使用 Python 进行数据科学的更多信息,请参阅以下指南:

  1. Scikit 机器学习

  2. 使用 scikit-learn 进行线性、套索和岭回归

  3. 使用 scikit-learn 实现非线性回归树

  4. <a href="https://www-pluralsight-com.translate.goog/resources/blog/guides/machine-learning-neural-networks-scikit-learn?_x

以上内容来自杭州电子商务研究院推送
分享到:

长按或扫码识别 分享给好友

长按或扫码识别 分享给好友
关于我们
热门推荐
合作伙伴
免责声明:本站部分资讯来源于网络,如有侵权请及时联系客服,我们将尽快处理
Copyright © 2025-2027 ToB产业网址导航 公安备案 浙公网安备33010602013138号 浙ICP备16025413号-9
支持 反馈 关注 数据