用python理解数据---房价预测数据可视化分析kernel读后感

本文通过四个步骤探讨房价预测问题:理解问题、单变量研究、多变量分析及数据清洗。利用Python进行数据探索,借助seaborn可视化工具分析变量间关系,采用相关系数热图筛选关键特征。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

kernel原链接:https://www.kaggle.com/pmarcelino/comprehensive-data-exploration-with-python

该比赛是针对房价预测这种回归任务

开场白:生活中最难懂的是自我。

kernel关于四个方面展开

1. 理解问题:相对于问题而言,对每一个变量研究他们的意义和重要性
2. 单变量研究:该比赛中就针对目标变量(预测的房价)
3. 多变量分析:尝试分析独立变量和相关变量之间的关系
4. 清洗数据:处理缺失值,离群点和类别属性

注:其中导入的包中有一个seaborn的库特别好用,特别适合可视化分析变量
这里写图片描述
一:理解问题与单变量研究

该问题是根据关于房屋的一系列属性来预测房价,在这个问题中我们首先需要去观察房价的分布,波动范围。像这种我们能够用主观意思去分析的问题,可以尝试以自己的主观意识分析哪些变量可能和目标(房价预测)有较强的相关性。当然,主观分析不能具有理性说服力,并且在很多任务中,主观意思不准确或者无主观意思可参考。

主观意思分析问题能将我们带入问题,但是更好的方法还是从数据中分析变量的相关性。

我们先分析一下目标:房价。先describe一下,看看大致分布,也可以用(sns是seaborn的简称)sns.distplot查看房价分布,还可以进一步计算偏度,峰度信息,这些都可以由pandas的dataframe数据结构很好支持。
这里写图片描述

这里写图片描述
研究完房价后,我们将眼光放在和房价相关的属性研究上。比如在这个例子中,我们先看看数据由哪些属性列,根据属性列的数据我们根据主观意识觉得OverallQual、YearBuilt,totalBsmtSF,GrLivArea与预测的房价有较强的相关性。对于数值型属性,我们可以将属性与房价的关系用散点图描述出来,很容易发现自己猜测的属性特征究竟和房价有没有线性相关性。对于类别型属性,我们可以画出类别属性与房价的箱线图来描述它们之间的关系。(seaborn真的是绘图神器)

这里写图片描述
这里写图片描述
这里写图片描述

二:多变量研究
好了,我们已经对目标(房价)单变量作出分析,并且通过主观意识去分析哪些变量很有可能与房价相关。通过散点图、箱线图很容易验证自己的猜想。

但是数据分析需要用数据说话,而不是人为经验,当然经验起到辅助分析的作用。

下面我们通过数据计算分析,哪些属性与房价有强相关,究竟怎么相关。

想要研究变量之间相关性(包括属性与房价之间的关系)可以通过协方差矩阵来研究

通过dataframe的corr()很容易计算相关系数,然后用热图很容易可视化相关性(nice)
这里写图片描述

ok,现在来个筛选,筛选出个房价最相关的10个属性,并画出热图
这里写图片描述

nice!根据上面的热图,很容易去分析哪些属性和房价高度线性相关,并且还可以分析出哪些属性之间是高度相关的,这可以为特征筛选提供思路。

最后seaborn还有大招,就是直接可视化所有属性之间的分布情况,简直完美
这里写图片描述

三:数据清洗

缺失数据处理

对于缺失数据,我们需要考虑两个问题。第一:缺失数据的分布情况, 第二:缺失数据是随机的还是有模式的,它所在属性列与目标之间相关性如何

怀揣这疑问,我们首先看看缺失数据的分布情况
这里写图片描述

一看发现,有些列缺失率都达到90%以上了,对于缺失严重的属性列,可以采取删除这个属性列。

我们再考虑缺失数据数据属性列与目标的相关性,根据之前的协方差系数矩阵热图,我们知道GarageXX这几个属性相关性本来就很高,这儿他们的缺失率也接近,故可以考虑留下最相关的属性,删除剩余的几个。

离群点数据处理

离群点的处理还是在于离群点的发现与分析。

发现的话可以使用散点图和排序分析
这里写图片描述
从上图可以发现几个疑似的离群点:右下角两个和右上角两个。右下角两个明显有问题,可做移除处理,右上角两个虽然远离大部队,但是他们总体还是符合属性和房价的线性分布趋势的,故可以留着。

最后要说的是Normality 、Homoscedasticity 、Linearity、Absence of correlated errors

这几个概念我在原文中还是没太能理解,但是原文中作者提出用log来修正数据分布,使得符合正态分布,貌似这样处理使得数据更容易分析和处理,数据更规范?(不太明白这块)
这里写图片描述
这里写图片描述
这儿有个例子解释了log使得分布正态化,原来GrLivArea和SalePrice分布是如下图,发现有明显的锥形部分
这里写图片描述
经历过正态化后,锥形分布不见了,数据分布更加自然、线性。
这里写图片描述

最后要说的就是类别型的数据要做one-hot编码。

<think>我们正在讨论如何构建相关性模型,并通过Python实现数据分析与可视化。根据引用内容,我们主要会用到Scikit-learn进行数据预处理和模型构建,以及Matplotlib进行可视化。此外,可能还需要其他库如pandas、numpy、seaborn等。 构建相关性模型的一般步骤包括: 1. 数据生成/收集:创建或获取数据集,通常包含多个特征变量和一个目标变量(如果是监督学习)。 2. 数据预处理:处理缺失值、异常值、数据标准化/归一化、特征编码等。 3. 特征选择:选择与目标变量相关性强的特征,减少维度。 4. 模型训练:选择合适的模型(如线性回归、决策树等)进行训练。 5. 模型评估:使用适当的指标评估模型性能。 6. 可视化:展示数据分布、特征间关系、模型结果等。 但注意,用户特别提到“相关性模型”,这里我们可能有两种理解: a) 研究特征之间的相关性(如相关系数矩阵),这属于探索性数据分析(EDA)的一部分。 b) 构建一个预测模型,研究特征与目标变量之间的相关关系(如回归模型)。 由于问题没有明确,我们可以两者兼顾,但重点放在相关性分析上,并辅以简单的预测模型(如线性回归)来展示关系。 下面我们按照步骤进行: 步骤1:数据生成 我们可以使用numpy生成模拟数据,或者使用内置数据集(如波士顿房价数据集,但注意该数据集已从sklearn中移除,可以使用其他数据集如糖尿病数据集)。 步骤2:数据预处理 对数据进行标准化等处理。 步骤3:特征选择 这里我们可以计算特征与目标变量的相关系数,并选择相关性强的特征。 步骤4:模型训练(可选,为了展示关系) 使用线性回归模型。 步骤5:可视化 - 绘制散点图展示特征与目标变量的关系 - 绘制相关系数矩阵热力图 - 绘制回归线(在散点图上) 我们将使用以下库: - numpy:数值计算 - pandas:数据处理 - matplotlib:基础绘图 - seaborn:高级统计图表(如热力图) - sklearn:数据预处理、模型训练、评估 下面我们以糖尿病数据集为例,展示构建相关性模型的过程。</think>### Python构建相关性模型的方法与实现 以下基于Python数据分析流程,详细说明相关性模型的构建步骤(含数据生成、分析与可视化),结合Scikit-learn与Matplotlib实现[^1]。 --- #### **一、数据生成与预处理** 1. **模拟数据集生成** ```python import numpy as np import pandas as pd # 生成相关性特征(正相关/负相关/无关) np.random.seed(42) size = 500 data = { 'feature1': np.random.normal(50, 15, size), 'feature2': 0.8 * np.random.normal(50, 15, size) + 0.2 * data['feature1'], # 正相关 'feature3': -0.7 * data['feature1'] + np.random.normal(0, 5, size), # 负相关 'feature4': np.random.poisson(lam=30, size=size) # 无关特征 } df = pd.DataFrame(data) ``` 2. **数据标准化** ```python from sklearn.preprocessing import StandardScaler scaler = StandardScaler() df_scaled = pd.DataFrame(scaler.fit_transform(df), columns=df.columns) ``` --- #### **二、相关性分析方法** 1. **统计方法选择** | **方法** | **适用场景** | **Python实现** | |-------------------|--------------------------------|-----------------------------| | Pearson相关系数 | 连续变量线性关系 | `df.corr(method='pearson')` | | Spearman秩相关 | 非线性/等级变量关系 | `df.corr(method='spearman')`| | 互信息(Mutual Info)| 非线性/复杂依赖关系 | `sklearn.feature_selection.mutual_info_regression` | 2. **关键代码实现** ```python from sklearn.feature_selection import mutual_info_regression # 计算Pearson矩阵 pearson_corr = df_scaled.corr() # 计算互信息 mi_scores = mutual_info_regression(df_scaled, df_scaled['feature1']) mi_scores = pd.Series(mi_scores, index=df.columns) ``` --- #### **三、可视化实现** 1. **热力图展示相关系数矩阵** ```python import matplotlib.pyplot as plt import seaborn as sns plt.figure(figsize=(10, 8)) sns.heatmap(pearson_corr, annot=True, cmap='coolwarm', fmt=".2f", linewidths=0.5) plt.title("Pearson Correlation Matrix", fontsize=14) plt.show() ``` ![热力图示例](https://via.placeholder.com/400x300?text=Correlation+Heatmap) 2. **散点图矩阵观察特征关系** ```python sns.pairplot(df, diag_kind='kde') plt.suptitle("Feature Relationship Matrix", y=1.02) plt.show() ``` 3. **互信息条形图** ```python mi_scores.sort_values(ascending=False).plot.bar(figsize=(10, 5)) plt.ylabel('Mutual Information Score') plt.title("Feature Dependency Strength", fontsize=14) ``` --- #### **四、模型验证与优化** 1. **显著性检验** ```python from scipy.stats import pearsonr # 检验feature1与feature2的相关性 r, p_value = pearsonr(df['feature1'], df['feature2']) print(f"Correlation: {r:.3f}, P-value: {p_value:.4f}") # 输出: Correlation: 0.791, P-value: 0.0000 ``` 2. **非线性关系增强** - 多项式特征扩展: ```python from sklearn.preprocessing import PolynomialFeatures poly = PolynomialFeatures(degree=2, include_bias=False) df_poly = poly.fit_transform(df[['feature1', 'feature3']]) ``` - 核方法映射: ```python from sklearn.gaussian_process.kernels import RBF kernel = RBF(length_scale=1.0) ``` --- ### 完整流程示例代码 ```python # 依赖库导入 import numpy as np import pandas as pd import seaborn as sns import matplotlib.pyplot as plt from sklearn.preprocessing import StandardScaler, PolynomialFeatures from sklearn.feature_selection import mutual_info_regression from scipy.stats import pearsonr # 1. 数据生成 np.random.seed(42) df = pd.DataFrame({ 'feature1': np.random.normal(50, 15, 500), 'feature2': 0.8 * np.random.normal(50, 15, 500) + 0.2 * df['feature1'], 'feature3': -0.7 * df['feature1'] + np.random.normal(0, 5, 500), 'feature4': np.random.poisson(lam=30, size=500) }) # 2. 数据标准化 scaler = StandardScaler() df_scaled = pd.DataFrame(scaler.fit_transform(df), columns=df.columns) # 3. 相关性分析 corr_matrix = df_scaled.corr(method='pearson') mi_scores = mutual_info_regression(df_scaled, df_scaled['feature1']) mi_scores = pd.Series(mi_scores, index=df.columns) # 4. 可视化 fig, ax = plt.subplots(1, 2, figsize=(16, 6)) sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', ax=ax[0]) ax[0].set_title("Pearson Correlation") mi_scores.sort_values().plot.barh(ax=ax[1], color='teal') ax[1].set_title("Mutual Information Scores") plt.tight_layout() ``` --- ### 关键输出解读 1. **Pearson系数** - $ |r| > 0.7 $:强相关(如feature1-feature2) - $ -0.5 < r < 0.5 $:弱相关(如feature1-feature4) 2. **互信息值** - $ MI > 0.5 $:显著非线性依赖 - $ MI < 0.1 $:基本独立 > **技术要点**:当Pearson系数低但互信息值高时,提示存在非线性关系,需采用多项式回归或核方法建模[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值