Machine Learning Mastery 数据科学教程(二)

原文:Machine Learning Mastery

协议:CC BY-NC-SA 4.0

探索字典、分类变量和填补 Ames 数据集中的数据

原文:machinelearningmastery.com/classifying_variables/

房地产市场是一个复杂的生态系统,由诸如位置、物业特征、市场趋势和经济指标等多个变量驱动。一个深入探讨这一复杂性的 数据集是 Ames Housing 数据集。该数据集来自 Iowa 的 Ames,包括各种物业及其特征,从小巷通行方式到物业的整体状况。

在这篇文章中,你的目标是通过数据科学技术更详细地了解这个数据集。具体而言,你将关注如何识别分类变量和数值变量,因为理解这些变量对于任何数据驱动的决策过程至关重要。

开始吧。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

探索字典、分类变量和填补 Ames 数据集中的数据

图片由Brigitte Tohm提供。保留所有权利。

概述

本文分为三部分:

  • 数据字典的重要性

  • 识别分类变量和数值变量

  • 缺失数据填补

数据字典的重要性

分析 Ames Housing 数据集的一个关键第一步是利用其数据字典。这个版本不仅列出了特征和定义,还将其分类为名义型顺序型离散型连续型,以指导我们的分析方法。

  • 名义型变量是没有顺序的类别,如“邻里”。它们有助于识别用于分组分析的细分领域。

  • 顺序型变量具有明确的顺序(例如“厨房质量”)。它们允许进行排序和基于顺序的分析,但不意味着类别之间的间距相等。

  • 离散型变量是可计数的数字,如“卧室”。它们在汇总或比较数量的分析中至关重要。

  • 连续型变量在连续尺度上进行测量,例如“地块面积”。它们支持广泛的统计分析,依赖于详细的细节。

理解这些变量类型也有助于选择适当的可视化技术。名义型和顺序型变量适合使用条形图,这可以有效地突出类别差异和排名。相反,离散型和连续型变量则最好通过直方图、散点图和折线图来表示,这些图表能够展示数据的分布、关系和趋势。

启动你的项目,请阅读我的书籍《数据科学初学者指南》。它提供了自学教程工作代码

识别分类变量和数值变量

基于我们对数据字典的理解,让我们深入探讨如何使用 Python 的 pandas 库在 Ames 数据集中实际区分分类和数值变量。这一步骤对指导我们后续的数据处理和分析策略至关重要。

# Load and obtain the data types from the Ames dataset
import pandas as pd
Ames = pd.read_csv('Ames.csv')

print(Ames.dtypes)
print(Ames.dtypes.value_counts())

执行上述代码将产生以下输出,通过数据类型对每个特征进行分类:

PID                int64
GrLivArea          int64
SalePrice          int64
MSSubClass         int64
MSZoning          object
                  ...   
SaleCondition     object
GeoRefNo         float64
Prop_Addr         object
Latitude         float64
Longitude        float64
Length: 85, dtype: object

object     44
int64      27
float64    14
dtype: int64

该输出显示数据集包含object(44 个变量)、int64(27 个变量)和float64(14 个变量)数据类型。在这里,object通常表示名义变量,即没有固有顺序的分类数据。与此同时,int64float64则表示数值数据,这些数据可以是离散的(int64用于可计数的数字)或连续的(float64用于在连续范围内可测量的量)。

现在我们可以利用 pandas 的select_dtypes()方法明确区分 Ames 数据集中的数值特征和分类特征。

# Build on the above block of code
# Separating numerical and categorical features
numerical_features = Ames.select_dtypes(include=['int64', 'float64']).columns
categorical_features = Ames.select_dtypes(include=['object']).columns

# Displaying the separated lists
print("Numerical Features:", numerical_features)
print("Categorical Features:", categorical_features)

numerical_features捕获存储为int64float64的变量,分别指示可计数和可测量的量。相对而言,categorical_features包括类型为object的变量,通常表示没有量化值的名义或顺序数据:

Numerical Features: Index(['PID', 'GrLivArea', 'SalePrice', 'MSSubClass', 'LotFrontage', 'LotArea',
       'OverallQual', 'OverallCond', 'YearBuilt', 'YearRemodAdd', 'MasVnrArea',
       'BsmtFinSF1', 'BsmtFinSF2', 'BsmtUnfSF', 'TotalBsmtSF', '1stFlrSF',
       '2ndFlrSF', 'LowQualFinSF', 'BsmtFullBath', 'BsmtHalfBath', 'FullBath',
       'HalfBath', 'BedroomAbvGr', 'KitchenAbvGr', 'TotRmsAbvGrd',
       'Fireplaces', 'GarageYrBlt', 'GarageCars', 'GarageArea', 'WoodDeckSF',
       'OpenPorchSF', 'EnclosedPorch', '3SsnPorch', 'ScreenPorch', 'PoolArea',
       'MiscVal', 'MoSold', 'YrSold', 'GeoRefNo', 'Latitude', 'Longitude'],
      dtype='object')
Categorical Features: Index(['MSZoning', 'Street', 'Alley', 'LotShape', 'LandContour', 'Utilities',
       'LotConfig', 'LandSlope', 'Neighborhood', 'Condition1', 'Condition2',
       'BldgType', 'HouseStyle', 'RoofStyle', 'RoofMatl', 'Exterior1st',
       'Exterior2nd', 'MasVnrType', 'ExterQual', 'ExterCond', 'Foundation',
       'BsmtQual', 'BsmtCond', 'BsmtExposure', 'BsmtFinType1', 'BsmtFinType2',
       'Heating', 'HeatingQC', 'CentralAir', 'Electrical', 'KitchenQual',
       'Functional', 'FireplaceQu', 'GarageType', 'GarageFinish', 'GarageQual',
       'GarageCond', 'PavedDrive', 'PoolQC', 'Fence', 'MiscFeature',
       'SaleType', 'SaleCondition', 'Prop_Addr'],
      dtype='object')

值得注意的是,某些变量,例如‘MSSubClass’,尽管被编码为数值,但实际上作为分类数据使用,这突显了参考数据字典以确保准确分类的重要性。同样,像‘MoSold’(售出月份)和‘YrSold’(售出年份)这样的特征虽然在本质上是数值的,但在没有进行数学运算的情况下,它们通常可以被视为分类变量。我们可以使用 pandas 中的astype()方法将这些转换为分类特征。

# Building on the above 2 blocks of code
Ames['MSSubClass'] = Ames['MSSubClass'].astype('object')
Ames['YrSold'] = Ames['YrSold'].astype('object')
Ames['MoSold'] = Ames['MoSold'].astype('object')
print(Ames.dtypes.value_counts())

在执行此转换后,object数据类型的列数已增加到 47(之前为 44),而int64已降至 24(之前为 27)。

object     47
int64      24
float64    14
dtype: int64

对数据字典、数据集的性质和领域专业知识的仔细评估可以有助于正确地重新分类数据类型。

缺失数据填补

处理缺失数据是每个数据科学家面临的挑战。忽略缺失值或处理不当可能导致分析偏差和错误结论。填补技术的选择通常取决于数据的性质——分类数据或数值数据。此外,数据字典中的信息将会有用(例如 Pool Quality),在这些情况下,缺失值(“NA”)有其意义,即特定属性的缺失。

带缺失值的分类特征的数据填补

你可以识别分类数据类型并按缺失数据对它们的影响程度进行排序。

# Calculating the percentage of missing values for each column
missing_data = Ames.isnull().sum()
missing_percentage = (missing_data / len(Ames)) * 100
data_type = Ames.dtypes

# Combining the counts and percentages into a DataFrame for better visualization
missing_info = pd.DataFrame({'Missing Values': missing_data, 'Percentage': missing_percentage,
                             'Data Type':data_type})

# Sorting the DataFrame by the percentage of missing values in descending order
missing_info = missing_info.sort_values(by='Percentage', ascending=False)

# Display columns with missing values of 'object' data type
print(missing_info[(missing_info['Missing Values'] > 0) & (missing_info['Data Type'] == 'object')])
              Missing Values  Percentage Data Type
PoolQC                  2570   99.651028    object
MiscFeature             2482   96.238852    object
Alley                   2411   93.485847    object
Fence                   2054   79.643273    object
FireplaceQu             1241   48.119426    object
GarageCond               129    5.001939    object
GarageQual               129    5.001939    object
GarageFinish             129    5.001939    object
GarageType               127    4.924389    object
BsmtExposure              71    2.753005    object
BsmtFinType2              70    2.714230    object
BsmtFinType1              69    2.675456    object
BsmtQual                  69    2.675456    object
BsmtCond                  69    2.675456    object
Prop_Addr                 20    0.775494    object
MasVnrType                14    0.542846    object
Electrical                 1    0.038775    object

数据字典指示,类别特征缺失值的整个列表表示该特征在给定属性中缺失,除了“Electrical”外。基于这一见解,我们可以用“mode”来插补电气系统的 1 个缺失数据点,并用"None"(带引号以使其成为 Python 字符串)插补其他所有缺失值。

# Building on the above block of code
# Imputing Missing Categorical Data

mode_value = Ames['Electrical'].mode()[0]
Ames['Electrical'].fillna(mode_value, inplace=True)

missing_categorical = missing_info[(missing_info['Missing Values'] > 0)
                           & (missing_info['Data Type'] == 'object')]

for item in missing_categorical.index.tolist():
    Ames[item].fillna("None", inplace=True)

print(Ames[missing_categorical.index].isnull().sum())

这确认现在类别特征的缺失值已不再存在:

PoolQC          0
MiscFeature     0
Alley           0
Fence           0
FireplaceQu     0
GarageCond      0
GarageQual      0
GarageFinish    0
GarageType      0
BsmtExposure    0
BsmtFinType2    0
BsmtFinType1    0
BsmtQual        0
BsmtCond        0
Prop_Addr       0
MasVnrType      0
Electrical      0

缺失值的数值特征插补

我们可以应用上述演示的相同技术来识别数值数据类型,并按其受到缺失数据影响的程度进行排名。

# Build on the above blocks of code
# Import Numpy
import numpy as np

# Calculating the percentage of missing values for each column
missing_data = Ames.isnull().sum()
missing_percentage = (missing_data / len(Ames)) * 100
data_type = Ames.dtypes

# Combining the counts and percentages into a DataFrame for better visualization
missing_info = pd.DataFrame({'Missing Values': missing_data, 'Percentage': missing_percentage,
                             'Data Type':data_type})

# Sorting the DataFrame by the percentage of missing values in descending order
missing_info = missing_info.sort_values(by='Percentage', ascending=False)

# Display columns with missing values of numeric data type
print(missing_info[(missing_info['Missing Values'] > 0)
                   & (missing_info['Data Type'] == np.number)])
              Missing Values  Percentage Data Type
LotFrontage              462   17.913920   float64
GarageYrBlt              129    5.001939   float64
Longitude                 97    3.761148   float64
Latitude                  97    3.761148   float64
GeoRefNo                  20    0.775494   float64
MasVnrArea                14    0.542846   float64
BsmtFullBath               2    0.077549   float64
BsmtHalfBath               2    0.077549   float64
BsmtFinSF2                 1    0.038775   float64
GarageArea                 1    0.038775   float64
BsmtFinSF1                 1    0.038775   float64
BsmtUnfSF                  1    0.038775   float64
TotalBsmtSF                1    0.038775   float64
GarageCars                 1    0.038775   float64

上述说明了与缺失类别数据相比,缺失数值数据的实例较少。然而,数据字典对于直接插补并不十分有用。在数据科学中是否插补缺失数据在很大程度上取决于分析的目标。通常,数据科学家可能会生成多个插补值,以考虑插补过程中的不确定性。常见的多重插补方法包括(但不限于)均值、 медиан和回归插补。作为基准,我们将在这里演示如何使用均值插补,但根据任务的不同可能会参考其他技术。

# Build on the above blocks of code
# Initialize a DataFrame to store the concise information
concise_info = pd.DataFrame(columns=['Feature', 'Missing Values After Imputation', 
                                     'Mean Value Used to Impute'])

# Identify and impute missing numerical values, and store the related concise information
missing_numeric_df = missing_info[(missing_info['Missing Values'] > 0)
                           & (missing_info['Data Type'] == np.number)]

for item in missing_numeric_df.index.tolist():
    mean_value = Ames[item].mean(skipna=True)
    Ames[item].fillna(mean_value, inplace=True)

    # Append the concise information to the concise_info DataFrame
    concise_info.loc[len(concise_info)] = pd.Series({
        'Feature': item,
        'Missing Values After Imputation': Ames[item].isnull().sum(),
        # This should be 0 as we are imputing all missing values
        'Mean Value Used to Impute': mean_value
    })

# Display the concise_info DataFrame
print(concise_info)

这将打印:

         Feature Missing Values After Imputation  Mean Value Used to Impute
0    LotFrontage                               0               6.851063e+01
1    GarageYrBlt                               0               1.976997e+03
2      Longitude                               0              -9.364254e+01
3       Latitude                               0               4.203456e+01
4       GeoRefNo                               0               7.136762e+08
5     MasVnrArea                               0               9.934698e+01
6   BsmtFullBath                               0               4.353900e-01
7   BsmtHalfBath                               0               6.208770e-02
8     BsmtFinSF2                               0               5.325950e+01
9     GarageArea                               0               4.668646e+02
10    BsmtFinSF1                               0               4.442851e+02
11     BsmtUnfSF                               0               5.391947e+02
12   TotalBsmtSF                               0               1.036739e+03
13    GarageCars                               0               1.747867e+00

有时,我们也可以选择不对缺失值进行任何插补,以保留原始数据集的真实性,并在必要时删除那些没有完整和准确数据的观察值。或者,你也可以尝试建立一个机器学习模型来猜测基于同一行中的其他数据的缺失值,这就是回归插补的原理。作为上述基准插补的最终步骤,让我们交叉检查是否还有缺失值。

# Build on the above blocks of code
missing_values_count = Ames.isnull().sum().sum()
print(f'The DataFrame has a total of {missing_values_count} missing values.')

你应该看到:

The DataFrame has a total of 0 missing values.

恭喜!我们已经成功地通过基准操作插补了 Ames 数据集中的所有缺失值。值得注意的是,还有许多其他技术可以用来插补缺失数据。作为数据科学家,探索各种选项并确定最适合给定背景的方法对生成可靠和有意义的结果至关重要。

想开始学习数据科学初学者指南吗?

立即参加我的免费电子邮件速成课程(附样例代码)。

点击注册并获得课程的免费 PDF 电子书版本。

进一步阅读

资源

总结

在本教程中,我们通过数据科学技术的视角探讨了 Ames 住房数据集。我们讨论了数据字典在理解数据集变量中的重要性,并深入研究了帮助有效识别和处理这些变量的 Python 代码片段。

了解你所处理的变量的本质对于任何数据驱动的决策过程至关重要。正如我们所见,Ames 数据字典在这方面作为一个宝贵的指南。结合 Python 强大的数据处理库,处理像 Ames Housing 数据集这样的复杂数据集变得更加可控。

具体来说,你学到了:

  • 在评估数据类型和填补策略时数据字典的重要性。

数值特征和类别特征的识别与重新分类方法。** 如何使用 pandas 库填补缺失的类别特征和数值特征。****

你有任何问题吗?请在下方评论中提出你的问题,我会尽力回答。

从数据到地图:使用 Python 可视化 Ames 房价

原文:machinelearningmastery.com/data-to-map-geospatial/

地理空间可视化已成为理解和表示地理上下文中数据的必要工具。它在各种实际应用中发挥着重要作用,从城市规划和环境研究到房地产和交通。例如,城市规划者可能会使用地理空间数据来优化公共交通路线,而房地产专业人士则可以利用这些数据分析特定区域的房产价值趋势。使用 Python,你可以利用像 geopandas、Matplotlib 和 contextily 这样的库来创建引人注目的可视化。在本章中,你将深入了解一个可视化 Iowa Ames 房价的代码片段,逐步拆解每一步以理解其目的和功能。

让我们开始吧。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从数据到地图:使用 Python 可视化 Ames 房价

图片来源于Annie Spratt。保留部分权利。

概述

本文分为六部分;它们是:

  • 安装必需的 Python 包

  • 导入必要的库

  • 加载和准备数据

  • 设置坐标参考系统(CRS)

  • 创建凸包

  • 可视化数据

安装必需的 Python 包

在我们深入探索 Python 的地理空间可视化之前,正确设置你的开发环境至关重要。在 Windows 上,你可以打开命令提示符或 PowerShell。如果你使用的是 macOS 或 Linux,终端应用程序是你进入命令行世界的入口。此外,为了确保你能够访问所有必需的 Python 库,必须访问 Python 包索引(PyPI),这是 Python 包的官方第三方软件库。

要安装必需的软件包,你可以在终端或命令行界面中使用以下命令:

pip install pandas
pip install geopandas
pip install matplotlib
pip install contextily
pip install shapely

一旦你成功安装了所需的软件包,你就可以导入必要的库,并开始你的地理空间可视化之旅。

启动你的项目,请参考我的书籍 《数据科学入门指南》。它提供了自学教程可运行的代码

导入必要的库

在深入可视化之前,导入将支持我们可视化的必要库是至关重要的。

import pandas as pd
import geopandas as gpd
import matplotlib.pyplot as plt
import contextily as ctx
from shapely.geometry import Point

我们将使用几个 Python 库,包括:

  • pandas: 用于数据操作和分析。

  • geopandas: 用于处理地理空间数据。

  • matplotlib: 用于创建静态、动画和交互式可视化。

  • contextily: 用于将底图添加到我们的图表中。

  • shapely: 用于处理和分析平面几何对象。

加载和准备数据

Ames.csv 数据集 包含有关 Iowa, Ames 房屋销售的详细信息。这包括房屋的各种属性,如大小、年龄和状况,以及其地理坐标(纬度和经度)。这些地理坐标对我们的地理空间可视化至关重要,因为它们使我们能够在地图上绘制每个房屋,为销售价格提供空间背景。

# Load the dataset
Ames = pd.read_csv('Ames.csv')

# Convert the DataFrame to a GeoDataFrame
geometry = [Point(xy) for xy in zip(Ames['Longitude'], Ames['Latitude'])]
geo_df = gpd.GeoDataFrame(Ames, geometry=geometry)

通过将 pandas DataFrame 转换为 GeoDataFrame,我们可以在数据集上利用地理空间功能,将原始数据转化为适合地理空间分析和可视化的格式。

设置坐标参考系统(CRS)

坐标参考系统(CRS)是准确的地理空间操作和制图的基本方面,决定了我们的数据在地球表面上的对齐方式。不同 CRS 下两点之间的距离会有所不同,地图的显示也会有所不同。在我们的示例中,我们使用“EPSG:4326”这一标注设置了 GeoDataFrame 的 CRS,该标注对应于广泛使用的 WGS 84(或世界大地测量系统 1984)纬度-经度坐标系统。

# Set the CRS for the GeoDataFrame
geo_df.crs = "EPSG:4326"

WGS 84 是一个于 1984 年建立的全球参考系统,是卫星定位、GPS 和各种映射应用的事实标准。它使用三维坐标系统,以纬度和经度定义地球表面的位置信息,高度表示相对于参考椭球体的高度。

除了 WGS 84 之外,还有许多坐标参考系统满足不同的映射需求。选择包括提供适用于区域映射的平面笛卡尔坐标的通用横轴墨卡托(UTM),例如用于基于网页的映射的欧洲石油勘测组(EPSG)选项,如“EPSG:3857”,以及提供美国内州特定系统的州平面坐标系统(SPCS)。选择合适的 CRS 取决于规模、精度和数据的地理范围等因素,以确保地理空间分析和可视化的精确性。

创建凸包

凸包提供了一个包围所有数据点的边界,提供了我们数据地理分布的视觉表示。

# Create a convex hull around the points
convex_hull = geo_df.unary_union.convex_hull
convex_hull_geo = gpd.GeoSeries(convex_hull, crs="EPSG:4326")
convex_hull_transformed = convex_hull_geo.to_crs(epsg=3857)
buffered_hull = convex_hull_transformed.buffer(500)

从“EPSG:4326”到“EPSG:3857”的转换至关重要,原因有几个:

  • 基于网页的可视化: “EPSG:3857”被优化用于像 Google Maps 和 OpenStreetMap 这样的网页映射应用程序。通过将数据转换为该 CRS,我们确保它可以正确叠加在基于网页的底图上。

  • 以米为单位的缓冲: 缓冲操作在凸包周围添加边距。在“EPSG:4326”中,坐标是以度为单位的,这使得以米为单位的缓冲变得困难。通过转换到“EPSG:3857”,我们可以准确地将凸包缓冲 500 米,为 Ames 提供清晰的边界。

通过缓冲凸包,我们不仅可视化了数据的分布,还为可视化提供了地理背景,突出显示了关注区域。

想要开始学习数据科学的初学者指南吗?

立即参加我的免费邮件速成课程(包括示例代码)。

点击注册并获得课程的免费 PDF 电子书版本。

数据可视化

数据准备好后,是时候通过可视化来展现它。我们将在地图上绘制单个房屋的销售价格,使用颜色梯度表示不同的价格范围。

# Plotting the map with Sale Prices, a basemap, and the buffered convex hull as a border
fig, ax = plt.subplots(figsize=(12, 8))
geo_df.to_crs(epsg=3857).plot(column='SalePrice', cmap='coolwarm', ax=ax, legend=True, 
                              markersize=20)
buffered_hull.boundary.plot(ax=ax, color='black', label='Buffered Boundary of Ames')
ctx.add_basemap(ax, source=ctx.providers.CartoDB.Positron)
ax.set_axis_off()
ax.legend(loc='upper right')
colorbar = ax.get_figure().get_axes()[1]
colorbar.set_ylabel('Sale Price', rotation=270, labelpad=20, fontsize=15)
plt.title('Sale Prices of Individual Houses in Ames, Iowa with Buffered Boundary', 
          fontsize=18)
plt.show()

使用的颜色梯度,‘coolwarm’,是一个发散的颜色映射。这意味着它有两种不同的颜色代表光谱的两个端点,中间有一个中性色。在我们的可视化中:

  • 较冷的颜色(蓝色) 代表房价较低的房屋。

  • 较暖的颜色(红色) 表示房价较高的房屋。

这种颜色映射选择使读者能够快速识别房产价值高低的区域,提供了对 Ames 房屋销售价格分布的见解。缓冲边界进一步强调了关注区域,为可视化提供了背景。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这张地图是几个组件的组合:由 contextily 从 OpenStreetMap 导入的基图展示了特定经纬度的地形。彩色点基于来自 pandas DataFrame 的数据,但通过 geopandas 转换为地理 CRS,应该与基图对齐。

进一步阅读

本节提供了更多相关资源,如果你想深入了解。

教程
资源

总结

在这篇文章中,我们深入探讨了使用 Python 进行地理空间可视化的复杂性,重点关注了爱荷华州 Ames 房屋销售价格的可视化。通过对代码的详细逐步解析,我们揭示了从初始数据加载和准备到最终可视化的各个阶段。理解地理空间可视化技术不仅仅是学术上的练习;它具有深远的现实世界意义。掌握这些技术可以使各领域的专业人士,如城市规划和房地产领域的从业者,能够做出基于地理背景的明智数据驱动决策。随着城市的增长和世界变得越来越数据驱动,将数据叠加到地理地图上将对制定未来策略和洞察力至关重要。

具体来说,通过本教程,你学到了:

  • 如何利用关键 Python 库进行地理空间可视化。

  • 数据准备和转换在地理空间操作中的关键作用。

  • 可视化地理空间数据的有效技巧,包括设置颜色渐变和整合底图的细节。

你有任何问题吗?请在下面的评论中提问,我会尽力回答。

解读数据:Ames 房价数据集的描述性统计入门

原文:machinelearningmastery.com/decoding-data-descriptive-statistics/

你在 Ames 数据集上开始了你的数据科学之旅,通过描述性统计来分析数据。Ames 房价数据集的丰富性使得描述性统计能够将数据提炼成有意义的总结。这是分析中的初步步骤,提供了数据集主要方面的简洁总结。它们的意义在于简化复杂性,帮助数据探索,促进比较分析,并启用数据驱动的叙述。

当你深入研究 Ames 属性数据集时,你将探索描述性统计的变革力量,将大量数据提炼成有意义的总结。在这个过程中,你将发现关键指标及其解释的细微差别,比如均值大于中位数的偏度含义。

让我们开始吧。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

解读数据:Ames 房价数据集的描述性统计入门

图片来源:lilartsy。保留部分权利。

概述

本文分为三个部分;它们是:

  • 描述性统计的基本概念

  • Ames 数据集的数据深入分析

  • 视觉叙事

描述性统计的基本概念

本文将展示如何利用描述性统计来理解数据。让我们回顾一下统计学如何帮助描述数据。

中心趋势:数据的核心

中心趋势捕捉数据集的核心或典型值。最常见的衡量指标包括:

  • 均值(平均值): 所有值之和除以值的数量。

  • 中位数: 当数据有序时的中间值。

  • 众数: 出现频率最高的值。

离散度:分布和变异性

离散度揭示了数据集内的分布和变异性。主要的衡量指标包括:

  • 范围: 最大值和最小值之间的差异。

  • 方差: 均值的平方差的平均值。

  • 标准差: 方差的平方根。

  • 四分位距(IQR): 第 25 百分位数和第 75 百分位数之间的范围。

形状和位置:数据的轮廓和标志

形状和位置揭示了数据集的分布形式和关键标记,其特征由以下指标描述:

  • 偏度: 分布的不对称性。如果中位数大于均值,我们说数据是左偏的(大值更常见)。相反,它是右偏的。

  • 峰度: 分布的“尾部程度”。换句话说,就是你看到异常值的频率。如果你比正常分布更频繁地看到极端的大值或小值,你可以说数据是尖峰分布的。

  • 百分位数: 某个百分比的观测值低于的值。第 25、第 50 和第 75 百分位数也称为四分位数

描述性统计使数据能够清晰而简明地讲述其故事。

通过我的书 《数据科学入门指南》 启动你的项目。它提供了自学教程有效的代码

使用艾姆斯数据集进行数据分析

要深入了解艾姆斯数据集,我们的重点是“SalePrice”属性。

# Importing libraries and loading the dataset
import pandas as pd
Ames = pd.read_csv('Ames.csv')

# Descriptive Statistics of Sales Price
sales_price_description = Ames['SalePrice'].describe()
print(sales_price_description)

Python

count 2579.000000
mean 178053.442420
std 75044.983207
min 12789.000000
25% 129950.000000
50% 159900.000000
75% 209750.000000
max 755000.000000
Name: SalePrice, dtype: float64

这总结了“SalePrice”,展示了计数、均值、标准差和百分位数。

median_saleprice = Ames['SalePrice'].median()
print("Median Sale Price:", median_saleprice)

mode_saleprice = Ames['SalePrice'].mode().values[0]
print("Mode Sale Price:", mode_saleprice)
Median Sale Price: 159900.0
Mode Sale Price: 135000

在艾姆斯的房屋平均“SalePrice”(或均值)大约为$178,053.44,而中位数价格为$159,900,这表明一半的房屋售价低于这个值。这些测量值之间的差异暗示了高价值房屋对平均值的影响,而众数则提供了最频繁的售价洞察。

range_saleprice = Ames['SalePrice'].max() - Ames['SalePrice'].min()
print("Range of Sale Price:", range_saleprice)

variance_saleprice = Ames['SalePrice'].var()
print("Variance of Sale Price:", variance_saleprice)

std_dev_saleprice = Ames['SalePrice'].std()
print("Standard Deviation of Sale Price:", std_dev_saleprice)

iqr_saleprice = Ames['SalePrice'].quantile(0.75) - Ames['SalePrice'].quantile(0.25)
print("IQR of Sale Price:", iqr_saleprice)
Range of Sale Price: 742211
Variance of Sale Price: 5631749504.563301
Standard Deviation of Sale Price: 75044.9832071625
IQR of Sale Price: 79800.0

“SalePrice”的范围从$12,789 到$755,000,展示了艾姆斯房地产价值的巨大多样性。方差大约为$5.63 亿,突显了价格的显著波动,标准差约为$75,044.98 进一步强调了这一点。四分位间距(IQR),表示数据中间的 50%,为$79,800,反映了房价的集中范围。

skewness_saleprice = Ames['SalePrice'].skew()
print("Skewness of Sale Price:", skewness_saleprice)

kurtosis_saleprice = Ames['SalePrice'].kurt()
print("Kurtosis of Sale Price:", kurtosis_saleprice)

tenth_percentile = Ames['SalePrice'].quantile(0.10)
ninetieth_percentile = Ames['SalePrice'].quantile(0.90)
print("10th Percentile:", tenth_percentile)
print("90th Percentile:", ninetieth_percentile)

q1_saleprice = Ames['SalePrice'].quantile(0.25)
q2_saleprice = Ames['SalePrice'].quantile(0.50)
q3_saleprice = Ames['SalePrice'].quantile(0.75)
print("Q1 (25th Percentile):", q1_saleprice)
print("Q2 (Median/50th Percentile):", q2_saleprice)
print("Q3 (75th Percentile):", q3_saleprice)
Skewness of Sale Price: 1.7607507033716905
Kurtosis of Sale Price: 5.430410648673599
10th Percentile: 107500.0
90th Percentile: 272100.0000000001
Q1 (25th Percentile): 129950.0
Q2 (Median/50th Percentile): 159900.0
Q3 (75th Percentile): 209750.0

艾姆斯的“SalePrice”显示出约 1.76 的正偏度,表明分布右侧有较长或较胖的尾巴。这种偏度突显了平均售价受到一部分高价房产的影响,而大多数房屋的成交价格低于这个平均值。这种偏度量化了分布的不对称性或偏离对称性,突出了高价房产在提升平均值方面的不成比例影响。当平均值(均值)超过中位数时,微妙地表示存在高价房产,导致右偏分布,尾部显著向右延伸。大约 5.43 的峰度值进一步强调了这些洞察,表明可能存在增加分布尾部重量的极端值或异常值。

深入探讨,四分位值提供了数据中央趋势的见解。Q1 为$129,950,Q3 为$209,750,这些四分位数涵盖了四分位数间距,代表数据中间的 50%。这种划分强调了价格的中央分布,提供了定价范围的细致描绘。此外,10 百分位和 90 百分位分别位于$107,500 和$272,100,作为关键界限。这些百分位划定了 80%房价所在的范围,突显了物业估值的广泛范围,并强调了 Ames 住房市场的多面性。

视觉叙事

视觉化为数据注入了生命,讲述了其故事。让我们深入探讨 Ames 数据集中“SalePrice”特征的视觉叙事。

# Importing visualization libraries
import matplotlib.pyplot as plt
import seaborn as sns

# Setting up the style
sns.set_style("whitegrid")

# Calculate Mean, Median, Mode for SalePrice
mean_saleprice = Ames['SalePrice'].mean()
median_saleprice = Ames['SalePrice'].median()
mode_saleprice = Ames['SalePrice'].mode().values[0]

# Plotting the histogram
plt.figure(figsize=(14, 7))
sns.histplot(x=Ames['SalePrice'], bins=30, kde=True, color="skyblue")
plt.axvline(mean_saleprice, color='r', linestyle='--', label=f"Mean: ${mean_saleprice:.2f}")
plt.axvline(median_saleprice, color='g', linestyle='-', label=f"Median: ${median_saleprice:.2f}")
plt.axvline(mode_saleprice, color='b', linestyle='-.', label=f"Mode: ${mode_saleprice:.2f}")

# Calculating skewness and kurtosis for SalePrice
skewness_saleprice = Ames['SalePrice'].skew()
kurtosis_saleprice = Ames['SalePrice'].kurt()

# Annotations for skewness and kurtosis
plt.annotate('Skewness: {:.2f}\nKurtosis: {:.2f}'.format(Ames['SalePrice'].skew(), Ames['SalePrice'].kurt()),
             xy=(500000, 100), fontsize=14, bbox=dict(boxstyle="round,pad=0.3", edgecolor="black", facecolor="aliceblue"))

plt.title('Histogram of Ames\' Housing Prices with KDE and Reference Lines')
plt.xlabel('Housing Prices')
plt.ylabel('Frequency')
plt.legend()
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

上述直方图提供了 Ames 房价的引人注目的视觉表示。接近$150,000 的显著峰值强调了在这一特定价格范围内房屋的集中度。与直方图相辅的是核密度估计(KDE)曲线,它提供了数据分布的平滑表示。KDE 本质上是直方图的估计,但具有无限窄的区间优势,提供了数据的更连续视图。它作为直方图的“极限”或精细版本,捕捉了离散分箱方法中可能遗漏的细微差别。

值得注意的是,KDE 曲线的右尾与我们之前计算出的正偏斜度一致,强调了低于均值的房屋浓度较高。颜色线条——红色表示均值,绿色表示中位数,蓝色表示众数——作为关键标记,允许快速比较和理解分布的中央趋势与更广泛数据景观的关系。这些视觉元素一起提供了对 Ames 房价分布和特征的全面洞察。

Python

from matplotlib.lines import Line2D

# Horizontal box plot with annotations
plt.figure(figsize=(12, 8))

# Plotting the box plot with specified color and style
sns.boxplot(x=Ames['SalePrice'], color='skyblue', showmeans=True, meanprops={"marker": "D", "markerfacecolor": "red",
                                                                             "markeredgecolor": "red", "markersize":10})

# Plotting arrows for Q1, Median and Q3
plt.annotate('Q1', xy=(q1_saleprice, 0.30), xytext=(q1_saleprice - 70000, 0.45),
             arrowprops=dict(edgecolor='black', arrowstyle='->'), fontsize=14)
plt.annotate('Q3', xy=(q3_saleprice, 0.30), xytext=(q3_saleprice + 20000, 0.45),
             arrowprops=dict(edgecolor='black', arrowstyle='->'), fontsize=14)
plt.annotate('Median', xy=(q2_saleprice, 0.20), xytext=(q2_saleprice - 90000, 0.05),
             arrowprops=dict(edgecolor='black', arrowstyle='->'), fontsize=14)

# Titles, labels, and legends
plt.title('Box Plot Ames\' Housing Prices', fontsize=16)
plt.xlabel('Housing Prices', fontsize=14)
plt.yticks([])  # Hide y-axis tick labels
plt.legend(handles=[Line2D([0], [0], marker='D', color='w', markerfacecolor='red', markersize=10, label='Mean')],
           loc='upper left', fontsize=14)

plt.tight_layout()
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

箱线图提供了中央趋势、范围和异常值的简洁表示,提供了 KDE 曲线或直方图难以清晰展示的见解。跨越 Q1 到 Q3 的四分位数间距(IQR)捕捉了数据中间的 50%,提供了价格中央范围的清晰视图。此外,代表均值的红色钻石位于中位数的右侧,突显了高价值物业对平均值的影响。

解读箱形图的关键在于其“胡须”。左胡须从箱体的左边缘延伸到下边界内的最小数据点,表示低于 Q1 的 1.5 倍 IQR 的价格。相对地,右胡须从箱体的右边缘延伸到上边界内的最大数据点,涵盖了高于 Q3 的 1.5 倍 IQR 的价格。这些胡须作为界限,划分了数据在中央 50%之外的扩展,超出这些范围的点通常被标记为潜在异常值。

异常值以单独的点表示,突出了价格特别高的房屋,可能是奢侈物业或具有独特特征的房屋。箱形图中的异常值是低于 Q1 的 1.5 倍 IQR 或高于 Q3 的 1.5 倍 IQR。在上图中,低端没有异常值,但高端有很多。识别和理解这些异常值至关重要,因为它们可以揭示 Ames 房地产市场中的独特市场动态或异常情况。

像这样的可视化将原始数据赋予生命,编织引人入胜的叙事,揭示可能在简单数字中隐藏的见解。随着我们前进,认识到并接受可视化在数据分析中的深远影响至关重要——它具有独特的能力,能够传达仅凭文字或数字无法捕捉的细微差别和复杂性。

想要开始学习数据科学初学者指南吗?

立即参加我的免费电子邮件速成课程(附带示例代码)。

点击注册,同时获得课程的免费 PDF 电子书版本。

进一步阅读

本节提供了更多资源,以便您深入了解该主题。

资源

总结

在本教程中,我们通过描述性统计深入探讨了 Ames Housing 数据集,以揭示关于房产销售的关键见解。我们计算并可视化了基本的统计测量,强调了集中趋势、离散度和形态的价值。通过利用可视化叙事和数据分析,我们将原始数据转化为引人入胜的故事,揭示了 Ames 房价的复杂性和模式。

具体来说,您学习了:

  • 如何利用描述性统计从 Ames Housing 数据集中提取有意义的见解,重点关注‘SalePrice’属性。

  • 均值、中位数、众数、范围和 IQR 等测量指标的意义,以及它们如何讲述 Ames 房价的故事。

  • 可视化叙事的力量,特别是直方图和箱形图,在直观呈现和解释数据的分布和变异性方面。

有任何问题吗?请在下面的评论中提问,我会尽力回答。

在大型数据集中检测和克服完美的多重共线性

原文:machinelearningmastery.com/detecting-and-overcoming-perfect-multicollinearity-in-large-datasets/

统计学家和数据科学家面临的一个重大挑战是多重共线性,特别是其最严重的形式——完美的多重共线性。这个问题常常在特征众多的大型数据集中未被察觉,可能伪装自己并扭曲统计模型的结果。

在这篇文章中,我们探讨了检测、解决和优化受完美多重共线性影响的模型的方法。通过实际分析和示例,我们旨在为您提供必要的工具,以增强模型的鲁棒性和可解释性,确保它们提供可靠的见解和准确的预测。

让我们开始吧。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在大型数据集中检测和克服完美的多重共线性

图片由 Ryan Stone 提供。部分权利保留。

概述

本文分为三个部分;它们是:

  • 探索完美的多重共线性对线性回归模型的影响

  • 使用套索回归解决多重共线性问题

  • 使用套索回归的见解来优化线性回归模型

探索完美的多重共线性对线性回归模型的影响

多重线性回归因其可解释性而特别受到重视。它可以直接理解每个预测变量对响应变量的影响。然而,它的有效性依赖于特征独立的假设。

共线性意味着一个变量可以被表示为其他变量的线性组合。因此,这些变量不是彼此独立的。

线性回归在特征集没有共线性的假设下进行。为了确保这一假设成立,理解线性代数中的一个核心概念——矩阵的秩,是至关重要的。在线性回归中,秩揭示了特征的线性独立性。本质上,没有特征应该是另一个特征的直接线性组合。这种独立性至关重要,因为特征之间的依赖关系——即秩小于特征数量——会导致完美的多重共线性。这种情况可能会扭曲回归模型的可解释性和可靠性,影响其在做出明智决策时的实用性。

让我们使用 Ames Housing 数据集来探讨这个问题。我们将检查数据集的秩和特征数量,以检测多重共线性。

# Import necessary libraries to check and compare number of columns vs rank of dataset
import pandas as pd
import numpy as np

# Load the dataset
Ames = pd.read_csv('Ames.csv')

# Select numerical columns without missing values
numerical_data = Ames.select_dtypes(include=[np.number]).dropna(axis=1)

# Calculate the matrix rank
rank = np.linalg.matrix_rank(numerical_data.values)

# Number of features
num_features = numerical_data.shape[1]

# Print the rank and the number of features
print(f"Numerical features without missing values: {num_features}")
print(f"Rank: {rank}")

我们的初步结果显示,Ames Housing 数据集存在多重共线性,具有 27 个特征但只有 26 的秩。

Numerical features without missing values: 27
Rank: 26

为了处理这一点,让我们使用定制的函数来识别冗余特征。这种方法有助于做出明智的特征选择或修改决策,从而提升模型的可靠性和可解释性。

# Creating and using a function to identify redundant features in a dataset
import pandas as pd
import numpy as np

def find_redundant_features(data):
    """
    Identifies and returns redundant features in a dataset based on matrix rank.
    A feature is considered redundant if removing it does not decrease the rank of the dataset,
    indicating that it can be expressed as a linear combination of other features.

    Parameters:
        data (DataFrame): The numerical dataset to analyze.

    Returns:
        list: A list of redundant feature names.
    """

    # Calculate the matrix rank of the original dataset
    original_rank = np.linalg.matrix_rank(data)
    redundant_features = []

    for column in data.columns:
        # Create a new dataset without this column
        temp_data = data.drop(column, axis=1)
        # Calculate the rank of the new dataset
        temp_rank = np.linalg.matrix_rank(temp_data)

        # If the rank does not decrease, the removed column is redundant
        if temp_rank == original_rank:
            redundant_features.append(column)

    return redundant_features

# Usage of the function with the numerical data
Ames = pd.read_csv('Ames.csv')
numerical_data = Ames.select_dtypes(include=[np.number]).dropna(axis=1)
redundant_features = find_redundant_features(numerical_data)
print("Redundant features:", redundant_features)

以下特征已被识别为冗余,表明它们对模型的预测能力没有独特贡献:

Redundant features: ['GrLivArea', '1stFlrSF', '2ndFlrSF', 'LowQualFinSF']

在识别出数据集中的冗余特征后,了解它们冗余的性质至关重要。具体而言,我们怀疑‘GrLivArea’可能只是第一层面积(“1stFlrSF”)、第二层面积(“2ndFlrSF”)和低质量完工平方英尺(“LowQualFinSF”)的总和。为了验证这一点,我们将计算这三个面积的总和,并将其与“GrLivArea”直接比较,以确认它们是否确实相同。

#import pandas
import pandas as pd

# Load the dataset
Ames = pd.read_csv('Ames.csv')

# Calculate the sum of '1stFlrSF', '2ndFlrSF', and 'LowQualFinSF'
Ames['CalculatedGrLivArea'] = Ames['1stFlrSF'] + Ames['2ndFlrSF'] + Ames['LowQualFinSF']

# Compare the calculated sum with the existing 'GrLivArea' column to see if they are the same
Ames['IsEqual'] = Ames['GrLivArea'] == Ames['CalculatedGrLivArea']

# Output the percentage of rows where the values match
match_percentage = Ames['IsEqual'].mean() * 100
print(f"Percentage of rows where GrLivArea equals the sum of the other three features: {int(match_percentage)}%")

我们的分析确认,“GrLivArea”在数据集中 100%的情况下正好是“1stFlrSF”、“2ndFlrSF”和“LowQualFinSF”的总和:

Percentage of rows where GrLivArea equals the sum of the other three features: 100%

在通过矩阵秩分析确认了“GrLivArea”的冗余性后,我们现在的目标是可视化多重共线性对回归模型稳定性和预测能力的影响。接下来的步骤将涉及使用冗余特征运行多重线性回归,以观察系数估计的方差。这个练习将帮助以一种具体的方式展示多重共线性的实际影响,强化了在模型构建中仔细选择特征的必要性。

# Import necessary libraries
import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import KFold
import matplotlib.pyplot as plt

# Load the data
Ames = pd.read_csv('Ames.csv')
features = ['GrLivArea', '1stFlrSF', '2ndFlrSF', 'LowQualFinSF']
X = Ames[features]
y = Ames['SalePrice']

# Initialize a K-Fold cross-validation
kf = KFold(n_splits=5, shuffle=True, random_state=1)

# Collect coefficients and CV scores
coefficients = []
cv_scores = []

for train_index, test_index in kf.split(X):
    X_train, X_test = X.iloc[train_index], X.iloc[test_index]
    y_train, y_test = y.iloc[train_index], y.iloc[test_index]

    # Initialize and fit the linear regression model
    model = LinearRegression()
    model.fit(X_train, y_train)
    coefficients.append(model.coef_)

    # Calculate R² score using the model's score method
    score = model.score(X_test, y_test)
    # print(score)
    cv_scores.append(score)

# Plotting the coefficients
plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
plt.boxplot(np.array(coefficients), labels=features)
plt.title('Box Plot of Coefficients Across Folds (MLR)')
plt.xlabel('Features')
plt.ylabel('Coefficient Value')
plt.grid(True)

# Plotting the CV scores
plt.subplot(1, 2, 2)
plt.plot(range(1, 6), cv_scores, marker='o', linestyle='-')  # Adjusted x-axis to start from 1
plt.title('Cross-Validation R² Scores (MLR)')
plt.xlabel('Fold')
plt.xticks(range(1, 6))  # Set x-ticks to match fold numbers
plt.ylabel('R² Score')
plt.ylim(min(cv_scores) - 0.05, max(cv_scores) + 0.05)  # Dynamically adjust y-axis limits
plt.grid(True)

# Annotate mean R² score
mean_r2 = np.mean(cv_scores)
plt.annotate(f'Mean CV R²: {mean_r2:.3f}', xy=(1.25, 0.65), color='red', fontsize=14),

plt.tight_layout()
plt.show()

结果可以通过下面的两个图表来演示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

左侧的箱线图展示了系数估计的显著方差。这些值的显著分布不仅指出了我们模型的不稳定性,还直接挑战了其可解释性。多重线性回归特别重视其可解释性,这依赖于其系数的稳定性和一致性。当系数在不同的数据子集之间变化很大时,很难得出清晰且可操作的见解,这对于根据模型的预测做出明智决策至关重要。鉴于这些挑战,需要一种更为稳健的方法来解决模型系数的变异性和不稳定性。

使用 Lasso 回归处理多重共线性

Lasso 回归作为一种稳健的解决方案出现。与多重线性回归不同,Lasso 可以惩罚系数的大小,并且可以将一些系数设置为零,从而有效地减少模型中的特征数量。这种特征选择在缓解多重共线性方面特别有益。让我们应用 Lasso 到之前的例子中以演示这一点。

# Import necessary libraries
import numpy as np
import pandas as pd
from sklearn.linear_model import Lasso
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import KFold
import matplotlib.pyplot as plt

# Load the data
Ames = pd.read_csv('Ames.csv')
features = ['GrLivArea', '1stFlrSF', '2ndFlrSF', 'LowQualFinSF']
X = Ames[features]
y = Ames['SalePrice']

# Initialize a K-Fold cross-validation
kf = KFold(n_splits=5, shuffle=True, random_state=1)

# Prepare to collect results
results = {}

for alpha in [1, 2]:  # Loop through both alpha values
    coefficients = []
    cv_scores = []

    for train_index, test_index in kf.split(X):
        X_train, X_test = X.iloc[train_index], X.iloc[test_index]
        y_train, y_test = y.iloc[train_index], y.iloc[test_index]

        # Scale features
        scaler = StandardScaler()
        X_train_scaled = scaler.fit_transform(X_train)
        X_test_scaled = scaler.transform(X_test)

        # Initialize and fit the Lasso regression model
        lasso_model = Lasso(alpha=alpha, max_iter=20000)
        lasso_model.fit(X_train_scaled, y_train)
        coefficients.append(lasso_model.coef_)

        # Calculate R² score using the model's score method
        score = lasso_model.score(X_test_scaled, y_test)
        cv_scores.append(score)

    results[alpha] = (coefficients, cv_scores)

# Plotting the results
fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(12, 12))
alphas = [1, 2]

for i, alpha in enumerate(alphas):
    coefficients, cv_scores = results[alpha]

    # Plotting the coefficients
    axes[i, 0].boxplot(np.array(coefficients), labels=features)
    axes[i, 0].set_title(f'Box Plot of Coefficients (Lasso with alpha={alpha})')
    axes[i, 0].set_xlabel('Features')
    axes[i, 0].set_ylabel('Coefficient Value')
    axes[i, 0].grid(True)

    # Plotting the CV scores
    axes[i, 1].plot(range(1, 6), cv_scores, marker='o', linestyle='-')
    axes[i, 1].set_title(f'Cross-Validation R² Scores (Lasso with alpha={alpha})')
    axes[i, 1].set_xlabel('Fold')
    axes[i, 1].set_xticks(range(1, 6))
    axes[i, 1].set_ylabel('R² Score')
    axes[i, 1].set_ylim(min(cv_scores) - 0.05, max(cv_scores) + 0.05)
    axes[i, 1].grid(True)
    mean_r2 = np.mean(cv_scores)
    axes[i, 1].annotate(f'Mean CV R²: {mean_r2:.3f}', xy=(1.25, 0.65), color='red', fontsize=12)

plt.tight_layout()
plt.show()

通过调整正则化强度(alpha),我们可以观察到增加惩罚如何影响系数和模型的预测准确性:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

左侧的箱型图显示,随着 alpha 的增加,系数的分布范围和幅度减少,表明估计更加稳定。特别是,当 alpha 设置为 1 时,‘2ndFlrSF’ 的系数开始接近零,并且当 alpha 增加到 2 时几乎为零。这一趋势表明,随着正则化强度的增加,‘2ndFlrSF’ 对模型的贡献最小,这表明它可能在模型中是冗余的或与其他特征存在共线性。这种稳定性直接归因于 Lasso 减少不重要特征影响的能力,这些特征可能会导致多重共线性。

‘2ndFlrSF’ 可以在对模型的预测能力影响最小的情况下被移除,这一点非常重要。它突显了 Lasso 在识别和消除不必要预测因子方面的高效性。值得注意的是,即使这个特征被有效地归零,模型的整体预测能力也保持不变,这展示了 Lasso 在简化模型复杂度的同时维持模型性能的鲁棒性。

使用 Lasso 回归洞见优化线性回归模型

根据 Lasso 回归获得的洞见,我们通过移除被识别为对预测能力贡献最小的特征‘2ndFlrSF’来优化我们的模型。本节评估了修订模型的系数性能和稳定性,仅使用‘GrLivArea’,‘1stFlrSF’,和‘LowQualFinSF’。

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import KFold

# Load the data
Ames = pd.read_csv('Ames.csv')
features = ['GrLivArea', '1stFlrSF', 'LowQualFinSF']  # Remove '2ndFlrSF' after running Lasso
X = Ames[features]
y = Ames['SalePrice']

# Initialize a K-Fold cross-validation
kf = KFold(n_splits=5, shuffle=True, random_state=1)

# Collect coefficients and CV scores
coefficients = []
cv_scores = []

for train_index, test_index in kf.split(X):
    X_train, X_test = X.iloc[train_index], X.iloc[test_index]
    y_train, y_test = y.iloc[train_index], y.iloc[test_index]

    # Initialize and fit the linear regression model
    model = LinearRegression()
    model.fit(X_train, y_train)
    coefficients.append(model.coef_)

    # Calculate R² score using the model's score method
    score = model.score(X_test, y_test)
    # print(score)
    cv_scores.append(score)

# Plotting the coefficients
plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
plt.boxplot(np.array(coefficients), labels=features)
plt.title('Box Plot of Coefficients Across Folds (MLR)')
plt.xlabel('Features')
plt.ylabel('Coefficient Value')
plt.grid(True)

# Plotting the CV scores
plt.subplot(1, 2, 2)
plt.plot(range(1, 6), cv_scores, marker='o', linestyle='-')  # Adjusted x-axis to start from 1
plt.title('Cross-Validation R² Scores (MLR)')
plt.xlabel('Fold')
plt.xticks(range(1, 6))  # Set x-ticks to match fold numbers
plt.ylabel('R² Score')
plt.ylim(min(cv_scores) - 0.05, max(cv_scores) + 0.05)  # Dynamically adjust y-axis limits
plt.grid(True)

# Annotate mean R² score
mean_r2 = np.mean(cv_scores)
plt.annotate(f'Mean CV R²: {mean_r2:.3f}', xy=(1.25, 0.65), color='red', fontsize=14),

plt.tight_layout()
plt.show()

我们优化后的多元回归模型的结果可以通过下面的两个图示展示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

左侧的箱型图展示了系数在不同交叉验证折中的分布情况。与包括“2ndFlrSF”的先前模型相比,系数的方差明显减少。这种方差减少突显了移除冗余特征的有效性,这可以帮助稳定模型的估计并增强其可解释性。每个特征的系数现在表现出更少的波动,这表明模型可以在不同数据子集中一致地评估这些特征的重要性。

除了保持模型的预测能力外,特征复杂性的减少显著提高了模型的可解释性。变量减少后,每个变量对结果的贡献更为明确,我们现在可以更容易地评估这些特定特征对销售价格的影响。这种清晰度允许更直接的解释,并基于模型输出做出更有信心的决策。利益相关者可以更好地理解“GrLivArea”,“1stFlrSF”和“LowQualFinSF”的变化如何影响物业价值,从而促进更清晰的沟通和更具操作性的见解。这种透明度在解释模型预测与预测本身同样重要的领域中尤其宝贵。

进一步阅读

API
教程
艾姆斯房屋数据集与数据字典

总结

这篇博客文章解决了回归模型中的完美多重共线性问题,从使用矩阵秩分析检测开始。随后我们探讨了如何通过减少特征数量、稳定系数估计并保持模型预测能力来缓解多重共线性。最后,通过战略性特征减少来改进线性回归模型,并提高其可解释性和可靠性。

具体来说,你学到了:

  • 使用矩阵秩分析检测数据集中的完美多重共线性。

  • 应用 Lasso 回归来缓解多重共线性并协助特征选择。

  • 使用 Lasso 的见解来改进线性回归模型,以提高可解释性。

有任何问题吗?请在下面的评论中提出问题,我会尽力回答。

特征关系 101:来自 Ames Housing 数据的教训

原文:machinelearningmastery.com/feature-relationships-101/

在房地产领域,了解物业特征及其对销售价格的影响至关重要。在此探索中,我们将深入分析 Ames Housing 数据集,揭示各种特征之间的关系以及它们与销售价格的相关性。通过数据可视化的力量,我们将揭示模式、趋势和见解,以指导从房主到房地产开发商的利益相关者。

让我们开始吧。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

特征关系 101:来自 Ames Housing 数据的教训

图片由 Andraz Lazic 提供。部分权利保留。

概述

本文分为三部分;它们是:

  • 揭示相关性

  • 通过热图进行可视化

  • 通过散点图分析特征关系

揭示相关性

相关性是一个统计度量,显示两个变量共同变化的程度。正相关表示一个变量增加时,另一个变量也倾向于增加,反之亦然。相反,负相关表示一个变量增加时,另一个变量倾向于减少。

# Load the Dataset
import pandas as pd
Ames = pd.read_csv('Ames.csv')

# Calculate the correlation of all features with 'SalePrice'
correlations = Ames.corr(numeric_only=True)['SalePrice'].sort_values(ascending=False)

# Display the top 10 features most correlated with 'SalePrice'
top_correlations = correlations[1:11]
print(top_correlations)

这将打印:

OverallQual     0.790661
GrLivArea       0.719980
TotalBsmtSF     0.652268
1stFlrSF        0.642623
GarageCars      0.639017
GarageArea      0.635029
YearBuilt       0.544569
FullBath        0.535175
GarageYrBlt     0.521105
YearRemodAdd    0.514720
Name: SalePrice, dtype: float64

从 Ames Housing 数据集中,与房价最相关的主要特征有:

  • OverallQual: 房屋的总体质量,评分范围从 1(非常差)到 10(非常优秀)。

  • GrLivArea: 地上生活面积,以平方英尺为单位。包括不在地下室中的生活区域。

  • TotalBsmtSF: 总地下室面积,以平方英尺表示。这包括了地下室的完成和未完成区域。

  • 1stFlrSF: 一楼平方英尺,表示房屋第一层的大小。

  • GarageCars: 车库容量。表示车库可以容纳的汽车数量。

  • GarageArea: 车库面积,以平方英尺为单位。这显示了车库所覆盖的总面积。

  • YearBuilt: 原始建设日期,指示房屋主要施工完成的年份。

  • FullBath: 地上完整浴室数量。计算不在地下室中的完整浴室数量(即有洗手池、马桶和浴缸或淋浴)。

  • GarageYrBlt: 车库建造年份。指定车库建造的年份。对于没有车库的房屋,此特征可能为空。

  • YearRemodAdd: 改造日期。指示改造或增加的年份,如果没有改造或增加,则与建设年份相同。

最相关的特征是具有最佳预测能力的特征。如果你建立一个预测房价的模型,这些特征是输入特征中成功可能性较高的子集。相关特征也可能是由某些共同因素引起的,这本身是数据科学中的一个主题,你可能会想要调查和详细阐述。

上述代码打印了correlations[1:11],因为correlations[0]是 SalesPrice,按照定义其值为 1.0。从特征选择的角度来看,你还应该检查correlations[-10:],以了解最负相关的特征,这些特征可能在解释价格方面也很强大。然而,在这个特定的数据集中并非如此。

通过我的书籍 《数据科学入门指南》 开启你的项目。它提供了自学教程工作代码

使用热图进行可视化

热图提供了一种强大的可视化工具,用于在二维空间中表示数据,颜色指示了大小或频率。在相关性分析的背景下,热图可以生动地展示多个特征之间的关系强度和方向。让我们深入了解一张展示与SalePrice最相关的顶级特征的热图。

# Import required libraries
import seaborn as sns
import matplotlib.pyplot as plt

# Select the top correlated features including SalePrice
selected_features = list(top_correlations.index) + ['SalePrice']

# Compute the correlations for the selected features
correlation_matrix = Ames[selected_features].corr()

# Set up the matplotlib figure
plt.figure(figsize=(12, 8))

# Generate a heatmap
sns.heatmap(correlation_matrix, annot=True, cmap="coolwarm", linewidths=.5, fmt=".2f", vmin=-1, vmax=1)

# Title
plt.title("Heatmap of Correlations among Top Features with SalePrice", fontsize=16)

# Show the heatmap
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

热图是同时可视化多个变量之间关系强度和方向的绝佳方式。热图中每个单元格的颜色强度对应于相关性的大小,暖色表示正相关,冷色表示负相关。由于上述热图仅涉及 10 个正相关性最高的列,因此没有蓝色。

在上面的热图中,我们可以观察到以下内容:

  • OverallQual,表示房屋的整体质量,与SalePrice的相关性最强,相关系数约为 0.79。这意味着随着房屋质量的提高,销售价格也有上升的趋势。

  • GrLivAreaTotalBsmtSF,分别表示地上生活面积和总地下室面积,也与销售价格显示出强烈的正相关。

  • 大多数特征与SalePrice呈正相关,这表明当这些特征增加或改善时,房屋的销售价格也有上升的趋势。

  • 值得注意的是,有些特征彼此相关。例如,GarageCarsGarageArea之间的相关性很强,这很有意义,因为较大的车库可以容纳更多的汽车。

这些见解对房地产领域的各类利益相关者来说非常宝贵。例如,房地产开发商可以集中精力提升房屋的特定特征,以提高其市场价值。

以下是完整的代码:

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd

# Load the Dataset
Ames = pd.read_csv('Ames.csv')

# Calculate the top 10 features most correlated with 'SalePrice'
correlations = Ames.corr(numeric_only=True)['SalePrice'].sort_values(ascending=False)
top_correlations = correlations[1:11]

# Select the top correlated features including SalePrice
selected_features = list(top_correlations.index) + ['SalePrice']

# Compute the correlations for the selected features
correlation_matrix = Ames[selected_features].corr()

# Set up the matplotlib figure
plt.figure(figsize=(12, 8))

# Generate a heatmap
sns.heatmap(correlation_matrix, annot=True, cmap="coolwarm", linewidths=.5, fmt=".2f", vmin=-1, vmax=1)
plt.title("Heatmap of Correlations among Top Features with SalePrice", fontsize=16)
plt.show()

通过散点图解剖特征关系

虽然相关性提供了对关系的初步理解,但进一步可视化这些关系至关重要。例如,散点图可以更清晰地描绘两个特征如何相互作用。此外,区分相关性和因果关系也很重要。高相关性并不一定意味着一个变量导致另一个变量的变化,它仅仅表示存在关系。

# Import required libraries
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

Ames = pd.read_csv('Ames.csv')

# Setting up the figure and axes
fig, ax = plt.subplots(2, 2, figsize=(15, 12))

# Scatter plot for SalePrice vs. OverallQual
sns.scatterplot(x=Ames['OverallQual'], y=Ames['SalePrice'], ax=ax[0, 0], color='blue', alpha=0.6)
ax[0, 0].set_title('House Prices vs. Overall Quality')
ax[0, 0].set_ylabel('House Prices')
ax[0, 0].set_xlabel('Overall Quality')

# Scatter plot for SalePrice vs. GrLivArea
sns.scatterplot(x=Ames['GrLivArea'], y=Ames['SalePrice'], ax=ax[0, 1], color='red', alpha=0.6)
ax[0, 1].set_title('House Prices vs. Ground Living Area')
ax[0, 1].set_ylabel('House Prices')
ax[0, 1].set_xlabel('Above Ground Living Area (sq. ft.)')

# Scatter plot for SalePrice vs. TotalBsmtSF
sns.scatterplot(x=Ames['TotalBsmtSF'], y=Ames['SalePrice'], ax=ax[1, 0], color='green', alpha=0.6)
ax[1, 0].set_title('House Prices vs. Total Basement Area')
ax[1, 0].set_ylabel('House Prices')
ax[1, 0].set_xlabel('Total Basement Area (sq. ft.)')

# Scatter plot for SalePrice vs. 1stFlrSF
sns.scatterplot(x=Ames['1stFlrSF'], y=Ames['SalePrice'], ax=ax[1, 1], color='purple', alpha=0.6)
ax[1, 1].set_title('House Prices vs. First Floor Area')
ax[1, 1].set_ylabel('House Prices')
ax[1, 1].set_xlabel('First Floor Area (sq. ft.)')

# Adjust layout
plt.tight_layout(pad=3.0)
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

散点图强调了销售价格与关键特征之间的强正相关关系。随着整体质量、地面生活面积、地下室面积和一楼面积的增加,房屋通常会获得更高的价格。然而,一些例外和离群点表明其他因素也影响最终销售价格。一个特别的例子是上面的“房价与地面生活面积”散点图:在 2500 平方英尺及以上,点的分布较散,表明在这个面积范围内,房价的变化不与面积有强相关或无法有效解释。

想开始数据科学初学者指南吗?

立即参加我的免费电子邮件速成课程(包括示例代码)。

点击注册并获得课程的免费 PDF 电子书版本。

进一步阅读

本节提供了更多关于该主题的资源,供你深入了解。

资源

总结

在探索 Ames Housing 数据集时,我们踏上了了解各种属性特征与销售价格之间关系的旅程。通过热力图和散点图,我们揭示了对房地产利益相关者有重大影响的模式和见解。

具体而言,你学到了:

  • 相关性的重要性及其在理解属性特征与销售价格之间关系中的意义。

  • 热力图在直观表示多个特征之间的相关性中的实用性。

  • 散点图所增加的深度,强调了超越简单相关系数的个体特征动态分析的重要性。

你有任何问题吗?请在下面的评论中提问,我会尽力回答。

用数据寻找价值:奢华房地产决策中的凝聚力

原文:machinelearningmastery.com/finding-value-with-data-the-cohesive-force-behind-luxury-real-estate-decisions/

房地产行业是一个庞大的利益相关者网络,包括代理商、房主、投资者、开发商、城市规划师和技术创新者,每个人都带来独特的视角和目标。在这个错综复杂的生态系统中,数据作为将这些不同利益结合在一起的关键元素,促进了合作与创新。PropTech,即房地产技术,通过将信息技术应用于房地产,展示了这种协同作用,利用数据科学的力量改变了物业的研究、购买、销售和管理方式。

从房地产列表的数字化初期到包括虚拟现实、物联网智能家居和区块链增强交易的当前格局,PropTech 的历程反映了一个越来越由数据驱动的行业。这一演变的标志不是技术本身,而是数据科学如何利用信息来简化操作、提升用户体验,并在每一个环节引入效率。

PropTech 的变革性影响核心是数据科学,它擅长从庞大的数据集中提取可操作的见解。它为房地产领域的所有参与者——从优化项目位置的开发商到塑造可持续城市环境的城市规划师——提供了基于扎实数据分析的决策工具。通过复杂的数据管理和描述性分析,数据科学为房地产行业的战略规划和运营改进奠定了基础。

探索数据科学在奢华住宅买家中的应用,你可以看到 PropTech 更广泛影响的一个具体示例。这个叙述不仅展示了数据驱动策略在评估奢华物业中的细致好处,还强调了数据在促进房地产行业更加整合、高效和以消费者为响应的基本作用。

让我们开始吧。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

用数据寻找价值:奢华房地产决策中的凝聚力

图片由 Breno Assis 提供。保留所有权利。

概述

本文分为三部分;它们是:

  • Folium:互动地图指南

  • 用数据科学赋能奢华住宅买家:在市场中寻找价值

  • 可视化机会:绘制通向可及奢华房地产的路径

Folium:互动地图指南

Folium 是一个强大的 Python 库,通过交互式地图将地理空间数据生动呈现。利用 Leaflet.js,Folium 允许用户通过几行 Python 代码创建丰富的动态可视化,使其成为房地产专业人士和数据科学家的宝贵工具。它的主要优势在于其交互性,允许缩放和点击查看细节,以及与 Python 数据科学工具栈(特别是 pandas)的无缝集成,使数据驱动的地图可视化变得简单易行。

对于房地产行业,Folium 使得可以将房产数据可视化到地理背景中,提供对市场趋势、房产估值和人口统计叠加的无与伦比的清晰度。Folium 地图可以轻松保存为 HTML 文件,方便与客户或利益相关者共享。这一功能使复杂的地理空间分析变得更加民主化,通过互动地图增强演示、报告和房源列表,提供房地产全景的全面视图。

Folium 是 PyPI 中的一个包。要安装它,你可以在终端或命令行界面中使用以下命令:

pip install folium

一旦成功安装所需的包,你就可以按照下面的示例继续操作。

启动你的项目,请参考我的书籍 《数据科学初学者指南》。它提供了自学教程可用代码

通过数据科学赋能奢侈品买家:在市场中发现价值

在今天的房地产市场中,潜在的购房者,尤其是对奢侈品领域感兴趣的人,面临的重大挑战是找到既满足他们审美和舒适度偏好又提供实质性价值的房产。这就是数据科学发挥关键作用的地方,它将寻找完美住宅的艰巨任务转变为一个充满见解和发现的旅程。

数据科学在房地产领域的力量在于其分析大量信息的能力,揭示那些一开始可能不易察觉的模式、趋势和机会。对于奢侈品买家来说,这意味着能够识别出既代表奢华又具有价值的房产,确保他们的投资既稳健又美观。

你的第一步是确定 Ames 中最昂贵的前 10 套房产。这个初步筛选作为你的起点,展示市场上被认为最有价值的房产。为此,你将使用 Python 中的 pandas 库来加载数据集并进行必要的分析。

下面是标志着你数据驱动旅程开始的代码:

# Import the pandas library and load the dataset
import pandas as pd
Ames = pd.read_csv('Ames.csv')
pd.set_option('display.max_columns', None)
pd.set_option('display.width', 1000)

# Identify the 10 most expensive homes based on SalePrice with key features
top_10_expensive_homes = Ames.nlargest(10, 'SalePrice')
features = ['SalePrice', 'GrLivArea', 'OverallQual', 'KitchenQual', 'TotRmsAbvGrd', 'Fireplaces']
top_10_df = top_10_expensive_homes[features]
print(top_10_df)

这块代码有效地筛选了 Ames 数据集,以提取 10 个最昂贵的房屋,重点关注定义奢华生活的关键属性:“SalePrice”(售价)、“GrLivArea”(地上生活面积)、“OverallQual”(整体材料和装修质量)、“KitchenQual”(厨房质量)、“TotRmsAbvGrd”(地上房间总数)和“Fireplaces”(壁炉)。这些特征为区分单纯的美学吸引力和真正的质量奠定了基础。

      SalePrice  GrLivArea  OverallQual KitchenQual  TotRmsAbvGrd  Fireplaces
1007     755000       4316           10          Ex            10           2
1325     625000       3627           10          Gd            10           1
65       615000       2470           10          Ex             7           2
584      611657       2364            9          Ex            11           2
1639     610000       2674           10          Ex             8           2
615      591587       2338            9          Gd             8           2
2087     584500       3500            9          Ex            11           1
1112     555000       2402           10          Ex            10           2
802      538000       3279            8          Ex            12           1
407      535000       2698           10          Ex            11           1

为了进一步精细化你的搜索,你应用了体现奢华生活精髓的具体标准。你关注那些总体质量评级为 10 的房屋,表示最高水平的工艺和材料。此外,你还寻找厨房质量(KitchenQual 为“Ex”)优异和奢华舒适的重要特征:至少有两个壁炉的房产。这些标准帮助你筛选出真正代表 Ames 奢华巅峰的房产。

让我们执行下一块代码,将 10 个最昂贵的房屋筛选到符合这些精英标准的房产中:

# Refine the search with highest quality, excellent kitchen, and 2 fireplaces
elite = top_10_df.query('OverallQual == 10 & KitchenQual == "Ex" & Fireplaces >= 2').copy()
print(elite)
      SalePrice  GrLivArea  OverallQual KitchenQual  TotRmsAbvGrd  Fireplaces
1007     755000       4316           10          Ex            10           2
65       615000       2470           10          Ex             7           2
1639     610000       2674           10          Ex             8           2
1112     555000       2402           10          Ex            10           2

这次精细化搜索将你的关注范围缩小到四个精英房产,这些房产不仅是 Ames 最昂贵的房产之一,而且符合奢华的严格标准。

随着你深入分析,介绍特征工程变得至关重要。特征工程是从现有数据中创建新变量或特征的过程,这些变量或特征更好地代表潜在问题。在你的案例中,特征工程有助于提升对房地产价值的理解。其中一个创新特征是每平方英尺价格(PSF)。PSF 指标成为你分析工具中的关键工具,提供了超越单纯挂牌价格的价值视角。通过计算每个房产的 PSF,你可以更公平地比较房产,无论其大小或绝对价格。这一度量标准揭示了每平方英尺生活空间的投资价值,为评估奢华房产的真正价值提供了标准化的尺度。

让我们将此计算应用到你精英选中的房屋中:

# Introduce PSF to rank the options
elite['PSF'] = elite['SalePrice']/elite['GrLivArea']
print(elite.sort_values(by='PSF'))

这一行动产生了以下见解,使你可以根据相对价值对房产进行排名:

      SalePrice  GrLivArea  OverallQual KitchenQual  TotRmsAbvGrd  Fireplaces         PSF
1007     755000       4316           10          Ex            10           2  174.930491
1639     610000       2674           10          Ex             8           2  228.122663
1112     555000       2402           10          Ex            10           2  231.057452
65       615000       2470           10          Ex             7           2  248.987854

在分析 PSF 后,很明显,并非所有奢华住宅都是相同的。尽管列表中的房产价格最高,但 PSF 最低的房产提供了最佳的价值,突显了该指标在评估奢华物业中的重要性。

现在你可以识别出符合奢华标准并根据 PSF 指标呈现出卓越价值的其他房产。通过扩大标准,包括数据集中总体质量评级为 10、厨房质量优秀、至少两个壁炉,但 PSF 低于$175 的所有房屋,目标是发现那些以更可接近价格提供奢华的房屋。

下面是你如何进行这次扩展分析的步骤:

# Cross check entire homes to search for better value
Ames['PSF'] = Ames['SalePrice']/Ames['GrLivArea']
value = Ames.query('PSF < 175 & OverallQual == 10 & KitchenQual == "Ex" & Fireplaces >=2')
print(value[['SalePrice', 'GrLivArea', 'OverallQual', 'KitchenQual', 'TotRmsAbvGrd', 'Fireplaces', 'PSF']])

这个精细的搜索产生了有趣的结果:

      SalePrice  GrLivArea  OverallQual KitchenQual  TotRmsAbvGrd  Fireplaces         PSF
1007     755000       4316           10          Ex            10           2  174.930491
2003     475000       3608           10          Ex            12           2  131.651885

在对艾姆斯数据集进行的全面搜索中,你发现了两个不仅体现了奢华顶点的卓越设施和工艺,而且在奢侈品市场中也是价值的典范的属性。值得注意的是,其中一处房产的每平方英尺价格(PSF)显著低于你设定的门槛,为奢华购房者提供了绝佳的机会。这一发现突显了数据科学在房地产中的强大作用,使买家能够找到提供卓越居住体验和卓越财务价值的房屋。

从数值分析转向空间可视化,让我们转向 Folium 在艾姆斯的地理背景中绘制这些突出的房产。这一步骤将为你的发现提供视觉背景,并展示数据科学在提升房地产选择过程中的实际应用,使寻找完美奢侈房屋的过程既有信息支持,又充满视觉吸引力。

可视化机会:绘制通向可达奢侈房地产的路径

确定了两个突出的属性后,你的下一步是利用 Folium 将这些发现呈现在互动地图上。这种可视化不仅将每个属性置于艾姆斯(Ames,Iowa)的地理背景中,还通过允许你直接在地图上嵌入详细信息来丰富你的分析。

使用 Folium,你可以为这些杰出的房产创建标记,为潜在买家和利益相关者提供一目了然的全面概览。每个标记包含关于房产的关键数据点,包括销售价格、总生活面积、质量评级以及计算出的每平方英尺价格(PSF),提供了一种直观且引人入胜的方式来探索这些奢侈房屋。下面,你详细描述了将这些丰富信息添加到地图中的过程,确保每个房产不仅仅是地图上的一个点,而是通向其独特故事和价值主张的门户。

# Visualize the results using folium
import folium
final_observation_indexes = value.index.tolist()

# Filter the dataset for these observations to get their latitude and longitude
final_locations = Ames.loc[final_observation_indexes, ['Latitude', 'Longitude']]

# Create a Folium map centered around the average location of the final observations
map_center = [final_locations['Latitude'].mean(), final_locations['Longitude'].mean()]
value_map = folium.Map(location=map_center, zoom_start=12)

# Add information to markers
for idx, row in final_locations.iterrows():
    # Extract additional information for the popup
    info = value.loc[idx, ['SalePrice', 'GrLivArea', 'OverallQual', 'KitchenQual', 'TotRmsAbvGrd', 'Fireplaces', 'PSF']]
    popup_text = f"""<b>Index:</b> {idx}<br>
                     <b>SalePrice:</b> {info['SalePrice']}<br>
                     <b>GrLivArea:</b> {info['GrLivArea']} sqft<br>
                     <b>OverallQual:</b> {info['OverallQual']}<br>
                     <b>KitchenQual:</b> {info['KitchenQual']}<br>
                     <b>TotRmsAbvGrd:</b> {info['TotRmsAbvGrd']}<br>
                     <b>Fireplaces:</b> {info['Fireplaces']}<br>
                     <b>PSF:</b> ${info['PSF']:.2f} /sqft"""
    folium.Marker([row['Latitude'], row['Longitude']],
                  popup=folium.Popup(popup_text, max_width=250)).add_to(value_map)

# Save the map to an HTML file on working directory
value_map.save('value_map.html')

执行此代码不仅会将互动标记填充到 Folium 地图中,还会将数据驱动探索的成果封装在一个 HTML 文件中,轻松保存到你的工作目录作为value_map.html。这个文件作为一个具体的实物,随时可以共享和进一步探索,邀请利益相关者以直观和动态的格式参与你的发现。以下是该文件的静态输出:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当你总结你的分析之旅时,这种可视化成为一个关键资源,引导潜在的购房者穿越一个充满隐藏宝石的市场,这些宝石通过数据科学的细致应用得以照亮。这种方法不仅赋予买家对奢华房地产价值的更深刻理解,还促使更有信息、更具战略性和最终更有成效的决策过程。

热图是 Folium 提供的另一种强大的可视化技术。它提供了在特定地理区域内的数据密度或强度的生动表现,使你能够识别 Ames 房地产市场中的活动或兴趣热点。

# Import HeatMap from folium
from folium.plugins import HeatMap

# Filter out rows with NaN values in 'Latitude' or 'Longitude'
Ames_Heat = Ames.dropna(subset=['Latitude', 'Longitude'])

# Group by 'Neighborhood' and calculate mean 'Latitude' and 'Longitude'
neighborhood_locs = Ames_Heat.groupby('Neighborhood').agg({'Latitude':'mean', 'Longitude':'mean'}).reset_index()

# Create a map centered around Ames, Iowa
ames_map_center = [Ames_Heat['Latitude'].mean(), Ames_Heat['Longitude'].mean()]
ames_heatmap = folium.Map(location=ames_map_center, zoom_start=12)

# Extract latitude and longitude data for the heatmap
heat_data = [[row['Latitude'], row['Longitude']] for index, row in Ames_Heat.iterrows()]

# Create and add a HeatMap layer to the map
HeatMap(heat_data, radius=12).add_to(ames_heatmap)

# Add one black flag per neighborhood to the map
for index, row in neighborhood_locs.iterrows():
    folium.Marker(
        location=[row['Latitude'], row['Longitude']],
        popup=row['Neighborhood'],
        icon=folium.Icon(color='black', icon='flag')
    ).add_to(ames_heatmap)

# Save the map to an HTML file in the working directory
ames_heatmap.save('ames_heatmap.html')

在输出中,你战略性地放置了标记来标示 Ames 中的每个社区,为其位置提供了即时的视觉提示。这些标记通过其黑色与每个社区的全名区分,作为你探索过程中的导航指南。此外,热图利用颜色渐变来表示属性的密度,温暖的颜色代表更高的房屋浓度。这种颜色编码不仅增强了你地图的视觉吸引力,还提供了对市场活动的直观理解,并为开发者和买家提供了潜在的兴趣区域。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

利用热图可视化的洞察可以使开发者有针对性地瞄准低密度社区。通过关注新兴社区,并优先考虑创新设计和施工效率,开发者可以引入一种新的经济型奢华住宅维度。这一策略迎合了对高质量居住空间的需求,并通过使奢华住宅更易获得,扩大市场。这个结合的数据科学、地理空间分析和领域专家的信息策略,凸显了这些学科在塑造未来可及奢华房地产中的变革潜力,确保更多人能够触及高质量生活。

想开始学习数据科学入门指南吗?

现在就参加我的免费电子邮件速成课程(包含示例代码)。

点击注册,还可获得免费 PDF 电子书版本的课程。

进一步阅读

Python 库
教程
资源

总结

在这次全面的探索中,你深入探讨了数据科学和交互式地图在房地产市场中的变革性作用,特别是集中于爱荷华州艾姆斯的奢侈品市场。通过对数据分析和可视化技术的细致应用,你揭示了宝贵的洞察,这些洞察不仅使奢侈品购房者受益,还为开发商在可负担奢侈房地产领域内创新开辟了新途径。

具体而言,你学到了:

  • 数据科学在识别奢侈物业中的应用。

  • 特征工程的引入以及每平方英尺价格(PSF)的计算,作为评估相对价值的创新方法。

  • 如何利用强大的 Python 库Folium创建动态视觉效果,以提升房地产决策。

你有任何问题吗?请在下面的评论中提出你的问题,我会尽力回答。

从训练-测试到交叉验证:提升模型评估

原文:machinelearningmastery.com/from-train-test-to-cross-validation-advancing-your-models-evaluation/

许多初学者最初会依赖训练-测试方法来评估他们的模型。这种方法简单明了,似乎能清楚地指示模型在未见数据上的表现。然而,这种方法往往导致对模型能力的不完整理解。在这篇博客中,我们将讨论为什么超越基本的训练-测试分割是重要的,以及交叉验证如何提供对模型性能的更全面评估。加入我们,指导你完成实现对机器学习模型进行更深入、更准确评估的必要步骤。

让我们开始吧。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从训练-测试到交叉验证:提升模型评估

图片由Belinda Fewings提供。版权所有。

概述

本文分为三个部分;它们是:

  • 模型评估:训练-测试 vs. 交叉验证

  • 交叉验证的“为什么”

  • 深入探讨 K 折交叉验证

模型评估:训练-测试 vs. 交叉验证

机器学习模型由其设计(例如线性模型与非线性模型)和其参数(例如线性回归模型中的系数)决定。在考虑如何拟合模型之前,你需要确保模型适合数据。

机器学习模型的性能通过它在以前未见过(或测试)数据上的表现来衡量。在标准的训练-测试分割中,我们将数据集分成两部分:较大的一部分用于训练模型,较小的一部分用于测试其性能。如果测试性能令人满意,则该模型是合适的。这种方法简单直接,但并不总是最有效地利用数据。外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然而,使用交叉验证,我们更进一步。第二张图片显示了一个 5 折交叉验证,其中数据集被分成五个“折”。在每一轮验证中,使用一个不同的折作为测试集,其余的作为训练集。这个过程重复五次,确保每个数据点都被用于训练和测试。外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

下面是一个例子来说明上述内容:

# Load the Ames dataset
import pandas as pd
Ames = pd.read_csv('Ames.csv')

# Import Linear Regression, Train-Test, Cross-Validation from scikit-learn
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split, cross_val_score

# Select features and target
X = Ames[['GrLivArea']]  # Feature: GrLivArea, a 2D matrix
y = Ames['SalePrice']    # Target: SalePrice, a 1D vector

# Split data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Linear Regression model using Train-Test
model = LinearRegression()
model.fit(X_train, y_train)
train_test_score = round(model.score(X_test, y_test), 4)
print(f"Train-Test R² Score: {train_test_score}")

# Perform 5-Fold Cross-Validation
cv_scores = cross_val_score(model, X, y, cv=5)
cv_scores_rounded = [round(score, 4) for score in cv_scores]
print(f"Cross-Validation R² Scores: {cv_scores_rounded}")

虽然训练-测试方法产生一个 R²评分,但交叉验证提供了五个不同的 R²评分,分别来自数据的每一个折,提供了对模型性能的更全面视图:

Train-Test R² Score: 0.4789
Cross-Validation R² Scores: [0.4884, 0.5412, 0.5214, 0.5454, 0.4673]

五个折叠中大致相等的 R²分数表明模型稳定。然后,您可以决定该模型(即线性回归)是否提供了可接受的预测能力。

交叉验证的“为什么”

理解我们模型在不同数据子集上的表现变异性对机器学习至关重要。虽然训练-测试划分方法有用,但它只提供了我们模型在某一特定未见数据集上的表现快照。

交叉验证通过系统地使用多个数据折叠进行训练和测试,提供了对模型性能的更为稳健和全面的评估。每个折叠作为一个独立的测试,提供了模型在不同数据样本上的预期表现的见解。这种多样性不仅有助于识别潜在的过拟合,还确保性能指标(在本例中为 R²分数)不会过于乐观或悲观,而是更可靠地反映模型对未见数据的泛化能力。

为了直观展示这一点,我们来比较一次训练-测试划分和 5 折交叉验证过程中的 R²分数:

# Import Seaborn and Matplotlib
import seaborn as sns
import matplotlib.pyplot as plt

# Assuming cv_scores_rounded contains your cross-validation scores
# And train_test_score is your single train-test R² score

# Plot the box plot for cross-validation scores
cv_scores_df = pd.DataFrame(cv_scores_rounded, columns=['Cross-Validation Scores'])
sns.boxplot(data=cv_scores_df, y='Cross-Validation Scores', width=0.3, color='lightblue', fliersize=0)

# Overlay individual scores as points
plt.scatter([0] * len(cv_scores_rounded), cv_scores_rounded, color='blue', label='Cross-Validation Scores')
plt.scatter(0, train_test_score, color='red', zorder=5, label='Train-Test Score')

# Plot the visual 
plt.title('Model Evaluation: Cross-Validation vs. Train-Test')
plt.ylabel('R² Score')
plt.xticks([0], ['Evaluation Scores'])
plt.legend(loc='lower left', bbox_to_anchor=(0, +0.1))
plt.show()

这个可视化突出了单次训练-测试评估与交叉验证提供的更广泛视角之间的区别:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

通过交叉验证,我们对模型的性能有了更深入的理解,使我们更接近于开发既有效又可靠的机器学习解决方案。

深入了解 K 折交叉验证

交叉验证是可靠的机器学习模型评估的基石,cross_val_score()提供了一种快速且自动化的方式来执行此任务。现在,我们将注意力转向KFold类,这是 scikit-learn 的一个组件,提供了对交叉验证折叠的深入了解。KFold类不仅提供一个评分,还提供了对模型在不同数据片段上的表现的窗口。我们通过复制上面的示例来演示这一点:

# Import K-Fold and necessary libraries
from sklearn.model_selection import KFold
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score

# Select features and target
X = Ames[['GrLivArea']].values  # Convert to numpy array for KFold
y = Ames['SalePrice'].values    # Convert to numpy array for KFold

# Initialize Linear Regression and K-Fold
model = LinearRegression()
kf = KFold(n_splits=5)

# Manually perform K-Fold Cross-Validation
for fold, (train_index, test_index) in enumerate(kf.split(X), start=1):
    # Split the data into training and testing sets
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]

    # Fit the model and predict
    model.fit(X_train, y_train)
    y_pred = model.predict(X_test)

    # Calculate and print the R² score for the current fold
    print(f"Fold {fold}:")
    print(f"TRAIN set size: {len(train_index)}")
    print(f"TEST set size: {len(test_index)}")
    print(f"R² score: {round(r2_score(y_test, y_pred), 4)}\n")

这段代码块将显示每个训练集和测试集的大小及每个折叠的 R²分数:

Fold 1:
TRAIN set size: 2063
TEST set size: 516
R² score: 0.4884

Fold 2:
TRAIN set size: 2063
TEST set size: 516
R² score: 0.5412

Fold 3:
TRAIN set size: 2063
TEST set size: 516
R² score: 0.5214

Fold 4:
TRAIN set size: 2063
TEST set size: 516
R² score: 0.5454

Fold 5:
TRAIN set size: 2064
TEST set size: 515
R² score: 0.4673

KFold类在交叉验证过程中提供的透明度和控制能力上表现出色。虽然cross_val_score()将过程简化为一行代码,但KFold将其展开,让我们查看数据的确切划分。这在需要时非常有价值:

  • 了解您的数据是如何被划分的。

  • 在每个折叠之前实现自定义预处理。

  • 获得对模型性能一致性的见解。

通过使用KFold类,您可以手动迭代每个划分,并应用模型训练和测试过程。这不仅有助于确保您对每个阶段使用的数据完全了解,还提供了根据复杂需求修改过程的机会。

进一步阅读

APIs
教程
Ames 房价数据集与数据字典

摘要

在这篇文章中,我们探讨了通过交叉验证和KFold方法进行全面模型评估的重要性。这两种技术通过保持训练数据和测试数据的独立,细致地避免了数据泄漏的陷阱,从而确保模型性能的准确测量。此外,通过对每个数据点进行一次验证并用其进行 K-1 次训练,这些方法提供了模型泛化能力的详细视角,提高了对其在现实世界应用中的信心。通过实际示例,我们展示了将这些策略整合到评估过程中如何导致更可靠、更强大的机器学习模型,准备好应对新的和未见过的数据的挑战。

具体来说,你学到了:

  • cross_val_score()在自动化交叉验证过程中的效率。

  • 如何通过KFold提供详细的数据拆分控制,以便量身定制的模型评估。

  • 两种方法如何确保数据的充分利用并防止数据泄漏。

你有任何问题吗?请在下方评论中提出你的问题,我将尽力回答。

数据协调:分段、连接、数据透视和合并的交响曲

原文:machinelearningmastery.com/harmonizing-data-a-symphony-of-segmenting-concatenating-pivoting-and-merging/

在数据科学项目中,你收集的数据通常并不是你想要的形状。你通常需要创建派生特征,将数据子集汇总为总结形式,或根据一些复杂的逻辑选择数据的部分。这不是一种假设情况。在大大小小的项目中,你在第一步获得的数据很可能远非理想。

作为数据科学家,你必须熟练地将数据格式化为正确的形状,以使后续步骤更加轻松。在接下来的内容中,你将学习如何在 pandas 中切片和切块数据集,并将其重新组合成不同的形式,以使有用的数据更加突出,从而使分析更加容易。

让我们开始吧。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数据协调:分段、连接、数据透视和合并的交响曲

图片由 Samuel Sianipar 提供。保留部分权利。

概述

本文分为两个部分;它们是:

  • 分段与连接:与 Pandas 的编舞

  • 数据透视与合并:与 Pandas 的舞蹈

分段与连接:与 Pandas 的编舞

你可能会提出一个有趣的问题:房产建造年份如何影响其价格?为了研究这个问题,你可以将数据集按照‘SalePrice’分成四个四分位数——低、中、高和优质,并分析这些分段中的建造年份。这种系统化的数据集划分不仅为集中分析铺平了道路,还揭示了可能在整体回顾中被隐藏的趋势。

分段策略:‘SalePrice’ 的四分位数

首先,创建一个新的列,将房产的‘SalePrice’整齐地分类到你定义的价格类别中:

# Import the Pandas Library
import pandas as pd

# Load the dataset
Ames = pd.read_csv('Ames.csv')

# Define the quartiles
quantiles = Ames['SalePrice'].quantile([0.25, 0.5, 0.75])

# Function to categorize each row
def categorize_by_price(row):
    if row['SalePrice'] <= quantiles.iloc[0]:
        return 'Low'
    elif row['SalePrice'] <= quantiles.iloc[1]:
        return 'Medium'
    elif row['SalePrice'] <= quantiles.iloc[2]:
        return 'High'
    else:
        return 'Premium'

# Apply the function to create a new column
Ames['Price_Category'] = Ames.apply(categorize_by_price, axis=1)
print(Ames[['SalePrice','Price_Category']])

通过执行上述代码,你已将数据集丰富了一个新的名为‘Price_Category’的列。以下是你获得的输出的一个快照:

      SalePrice Price_Category
0        126000            Low
1        139500         Medium
2        124900            Low
3        114000            Low
4        227000        Premium
...         ...            ...
2574     121000            Low
2575     139600         Medium
2576     145000         Medium
2577     217500        Premium
2578     215000        Premium

[2579 rows x 2 columns]

使用经验累积分布函数 (ECDF) 可视化趋势

现在你可以将原始数据集分成四个 DataFrame,并继续可视化每个价格类别中建造年份的累积分布。这一视觉效果将帮助你一目了然地了解与定价相关的房产建造历史趋势。

# Import Matplotlib & Seaborn
import matplotlib.pyplot as plt
import seaborn as sns

# Split original dataset into 4 DataFrames by Price Category
low_priced_homes = Ames.query('Price_Category == "Low"')
medium_priced_homes = Ames.query('Price_Category == "Medium"')
high_priced_homes = Ames.query('Price_Category == "High"')
premium_priced_homes = Ames.query('Price_Category == "Premium"')

# Setting the style for aesthetic looks
sns.set_style("whitegrid")

# Create a figure
plt.figure(figsize=(10, 6))

# Plot each ECDF on the same figure
sns.ecdfplot(data=low_priced_homes, x='YearBuilt', color='skyblue', label='Low')
sns.ecdfplot(data=medium_priced_homes, x='YearBuilt', color='orange', label='Medium')
sns.ecdfplot(data=high_priced_homes, x='YearBuilt', color='green', label='High')
sns.ecdfplot(data=premium_priced_homes, x='YearBuilt', color='red', label='Premium')

# Adding labels and title for clarity
plt.title('ECDF of Year Built by Price Category', fontsize=16)
plt.xlabel('Year Built', fontsize=14)
plt.ylabel('ECDF', fontsize=14)
plt.legend(title='Price Category', title_fontsize=14, fontsize=14)

# Show the plot
plt.show()

下面是 ECDF 图,它提供了你所分类数据的视觉总结。ECDF,即经验累积分布函数,是一种用于描述数据集数据点分布的统计工具。它表示低于或等于某个值的数据点比例或百分比。从本质上讲,它为你提供了一种可视化不同值的数据点分布的方式,提供有关数据的形状、扩展和集中趋势的见解。ECDF 图尤其有用,因为它们便于不同数据集之间的比较。注意每个价格类别的曲线如何呈现出房屋趋势的叙述。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 从图中可以明显看出,较低和中等价格的房屋在较早的年份建造的频率更高,而高价和奢侈价格的房屋则倾向于较新的建筑。了解到房产年龄在价格段中有显著差异后,你找到了使用 Pandas.concat() 的充分理由。

使用 Pandas.concat() 叠加数据集

作为数据科学家,你们经常需要叠加数据集或其部分,以获取更深入的见解。Pandas.concat() 函数是你完成这些任务的瑞士军刀,使你能够精确而灵活地合并 DataFrame。这一强大函数类似于 SQL 的UNION操作,但Pandas.concat() 提供了更大的灵活性——它允许对 DataFrame 进行垂直和水平的拼接。当你处理具有不匹配列的数据集或需要按公共列对齐时,这一特性变得不可或缺,显著拓宽了你的分析范围。以下是如何将分段 DataFrame 合并以比较“经济型”和“豪华型”房屋的市场类别:

# Stacking Low and Medium categories into an "affordable_homes" DataFrame
affordable_homes = pd.concat([low_priced_homes, medium_priced_homes])

# Stacking High and Premium categories into a "luxury_homes" DataFrame
luxury_homes = pd.concat([high_priced_homes, premium_priced_homes])

通过这些,你可以对比和分析那些使得经济型房屋与昂贵房屋不同的特征。

通过我的书籍 数据科学初学者指南快速启动你的项目。它提供了自学教程可运行的代码

数据透视与合并:与 Pandas 共舞

在将数据集划分为“经济型”和“豪华型”房屋,并探讨其建设年份的分布后,你现在将关注于影响房产价值的另一个维度:设施,特别是壁炉的数量。在你深入了解数据集的合并——一个Pandas.merge()作为与 SQL 的JOIN相媲美的强大工具——之前,你必须首先通过更精细的视角检查你的数据。

透视表是总结和分析特定数据点的绝佳工具。它们让你能够汇总数据并揭示模式,从而指导后续的合并操作。通过创建透视表,你可以编制一个清晰且组织良好的概述,显示按壁炉数量分类的平均居住面积和房屋数量。这一初步分析不仅丰富了你对两个市场细分的理解,还为你展示的复杂合并技术奠定了坚实的基础。

使用透视表创建有洞察力的总结

我们首先构建‘经济型’和‘豪华型’住宅类别的透视表。这些表将总结每种壁炉类别的平均居住面积(GrLivArea)并提供每个类别的房屋数量。这种分析至关重要,因为它展示了房屋吸引力和价值的一个关键方面——壁炉的存在和数量,以及这些特征在不同的市场细分中如何变化。

# Creating pivot tables with both mean living area and home count
pivot_affordable = affordable_homes.pivot_table(index='Fireplaces', 
                                                aggfunc={'GrLivArea': 'mean', 'Fireplaces': 'count'})
pivot_luxury = luxury_homes.pivot_table(index='Fireplaces', 
                                        aggfunc={'GrLivArea': 'mean', 'Fireplaces': 'count'})

# Renaming columns and index labels separately
pivot_affordable.rename(columns={'GrLivArea': 'AvLivArea', 'Fireplaces': 'HmCount'}, inplace=True)
pivot_affordable.index.name = 'Fire'

pivot_luxury.rename(columns={'GrLivArea': 'AvLivArea', 'Fireplaces': 'HmCount'}, inplace=True)
pivot_luxury.index.name = 'Fire'  

# View the pivot tables
print(pivot_affordable)
print(pivot_luxury)

使用这些透视表,你现在可以轻松地可视化和比较壁炉等特征如何与居住面积相关,并且这些特征在每个细分中的出现频率。第一个透视表是从‘经济型’住宅数据框中创建的,显示了这个分组中的大多数房产没有壁炉。

      HmCount    AvLivArea
Fire                      
0         931  1159.050483
1         323  1296.808050
2          38  1379.947368

第二个透视表来源于‘豪华型’住宅数据框,展示了这个子集中的房产壁炉数量范围从零到四个,其中一个壁炉最为常见。

      HmCount    AvLivArea
Fire                      
0         310  1560.987097
1         808  1805.243812
2         157  1998.248408
3          11  2088.090909
4           1  2646.000000

通过创建透视表,你将数据提炼成一个适合下一步分析的形式——使用Pandas.merge()将这些洞察合并,以查看这些特征在更广泛市场中的相互作用。

上面的透视表是最简单的版本。更高级的版本允许你不仅指定索引,还指定列作为参数。思想类似:你选择两列,一列指定为index,另一列指定为columns参数,这两列的值会被聚合并形成一个矩阵。矩阵中的值就是aggfunc参数所指定的结果。

你可以考虑以下示例,它产生了与上述类似的结果:

pivot = Ames.pivot_table(index="Fireplaces",
                         columns="Price_Category",
                         aggfunc={'GrLivArea':'mean', 'Fireplaces':'count'})
print(pivot)

这将打印:

               Fireplaces                          GrLivArea
Price_Category       High    Low Medium Premium         High          Low       Medium      Premium
Fireplaces
0                   228.0  520.0  411.0    82.0  1511.912281  1081.496154  1257.172749  1697.439024
1                   357.0  116.0  207.0   451.0  1580.644258  1184.112069  1359.961353  1983.031042
2                    52.0    9.0   29.0   105.0  1627.384615  1184.888889  1440.482759  2181.914286
3                     5.0    NaN    NaN     6.0  1834.600000          NaN          NaN  2299.333333
4                     NaN    NaN    NaN     1.0          NaN          NaN          NaN  2646.000000

通过比较,例如,零壁炉的低档和中档住宅数量分别为 520 和 411,你可以看到结果是相同的,即 931 = 520+411,这与之前获得的结果一致。你会发现二级列标记为低、中、高和优质,因为你在pivot_table()中指定了“Price_Category”作为columns参数。aggfunc参数中的字典给出了顶级列。

迈向更深的洞察:利用Pandas.merge()进行比较分析

在揭示了壁炉、房屋数量和生活区域在细分数据集中的关系后,你已经做好了进一步分析的准备。使用Pandas.merge(),你可以叠加这些见解,就像 SQL 的JOIN操作根据相关列合并两个或多个表中的记录一样。这种技术将允许你在共同属性上合并细分数据,进行超越分类的比较分析。

我们的第一次操作使用外连接来合并经济型和豪华型房屋数据集,确保没有任何类别的数据丢失。这种方法特别具有启发性,因为它揭示了所有房屋的完整范围,无论它们是否共享相同数量的壁炉。

pivot_outer_join = pd.merge(pivot_affordable, pivot_luxury, on='Fire', how='outer', suffixes=('_aff', '_lux')).fillna(0)
print(pivot_outer_join)
      HmCount_aff  AvLivArea_aff  HmCount_lux  AvLivArea_lux
Fire                                                        
0           931.0    1159.050483          310    1560.987097
1           323.0    1296.808050          808    1805.243812
2            38.0    1379.947368          157    1998.248408
3             0.0       0.000000           11    2088.090909
4             0.0       0.000000            1    2646.000000

在这种情况下,外连接的功能类似于右连接,捕捉到两个市场细分中存在的每种壁炉类别。值得注意的是,在经济型价格范围内没有具有 3 个或 4 个壁炉的房产。你需要为suffixes参数指定两个字符串,因为“HmCount”和“AvLivArea”列在pivot_affordablepivot_luxury两个数据框中都存在。你会看到“HmCount_aff”在 3 和 4 个壁炉的情况下为零,因为你需要它们作为外连接的占位符,以匹配pivot_luxury中的行。

接下来,你可以使用内连接,专注于经济型和豪华型房屋共享相同数量壁炉的交集。这种方法突出了两个细分市场之间的核心相似性。

pivot_inner_join = pd.merge(pivot_affordable, pivot_luxury, on='Fire', how='inner', suffixes=('_aff', '_lux'))
print(pivot_inner_join)
      HmCount_aff  AvLivArea_aff  HmCount_lux  AvLivArea_lux
Fire                                                        
0             931    1159.050483          310    1560.987097
1             323    1296.808050          808    1805.243812
2              38    1379.947368          157    1998.248408

有趣的是,在这种情况下,内连接的功能类似于左连接,展示了两个数据集中的类别。你看不到 3 和 4 个壁炉对应的行,因为这是内连接的结果,并且在数据框pivot_affordable中没有这样的行。

最后,交叉连接允许你检查经济型和豪华型房屋属性的每一种可能组合,提供了一个全面的视图,展示不同特征在整个数据集中的交互。结果有时被称为两个数据框的笛卡尔积

# Resetting index to display cross join
pivot_affordable.reset_index(inplace=True)
pivot_luxury.reset_index(inplace=True)

pivot_cross_join = pd.merge(pivot_affordable, pivot_luxury, how='cross', suffixes=('_aff', '_lux')).round(2)
print(pivot_cross_join)

结果如下,这展示了交叉连接的结果,但在这个数据集中并没有提供任何特殊的见解。

    Fire_aff  HmCount_aff  AvLivArea_aff  Fire_lux  HmCount_lux  AvLivArea_lux
0          0          931        1159.05         0          310        1560.99
1          0          931        1159.05         1          808        1805.24
2          0          931        1159.05         2          157        1998.25
3          0          931        1159.05         3           11        2088.09
4          0          931        1159.05         4            1        2646.00
5          1          323        1296.81         0          310        1560.99
6          1          323        1296.81         1          808        1805.24
7          1          323        1296.81         2          157        1998.25
8          1          323        1296.81         3           11        2088.09
9          1          323        1296.81         4            1        2646.00
10         2           38        1379.95         0          310        1560.99
11         2           38        1379.95         1          808        1805.24
12         2           38        1379.95         2          157        1998.25
13         2           38        1379.95         3           11        2088.09
14         2           38        1379.95         4            1        2646.00

从合并数据中提取见解

完成这些合并操作后,你可以深入探究它们揭示的见解。每种连接类型都为房屋市场的不同方面提供了洞察:

  • 外连接揭示了最广泛的属性范围,强调了各个价格点上壁炉等设施的多样性。

  • 内连接细化了你的视角,专注于在壁炉数量上经济型和豪华型住宅的直接比较,提供了更清晰的标准市场情况。

  • 交叉连接提供了一个详尽的特征组合,非常适合假设分析或理解潜在市场扩展。

在进行这些合并后,你会观察到在可负担得起的住房中

  • 没有壁炉的房屋平均总生活面积约为 1159 平方英尺,占最大份额。

  • 当壁炉数量增加到一个时,平均生活面积扩展到约 1296 平方英尺,突显了生活空间的明显增加。

  • 尽管拥有两个壁炉的房屋数量较少,但其平均生活面积更大,约为 1379 平方英尺,突显了附加设施与更宽敞生活空间的关联趋势。

相比之下,你会观察到在奢华住房中

  • 奢华市场中的房屋起点是没有壁炉的房屋,平均面积为 1560 平方英尺,比可负担得起的房屋要大得多。

  • 随着壁炉数量的增加,平均生活面积的跃升更加明显,单壁炉房屋的平均面积约为 1805 平方英尺。

  • 拥有两个壁炉的房屋进一步放大了这一趋势,提供了接近 1998 平方英尺的平均生活面积。少见的三或四个壁炉的房屋标志着生活空间的显著增加,四个壁炉的房屋的生活空间高达 2646 平方英尺。

这些观察提供了一个迷人的视角,展示了壁炉等设施不仅增加了房屋的吸引力,还似乎是更大生活空间的标志,尤其是从可负担得起的市场细分到奢华市场细分。

想要开始学习《数据科学初学者指南》吗?

现在就参加我的免费电子邮件速成课程(包含示例代码)。

点击注册,并获得课程的免费 PDF 电子书版本。

进一步阅读

教程
资源

总结

在这次关于使用 Python 和 Pandas 进行数据协调技术的全面探索中,你已深入了解了数据集的分段、连接、透视和合并的复杂性。从基于价格类别将数据集划分为有意义的部分,到可视化建筑年份的趋势,再到使用Pandas.concat()堆叠数据集以分析更广泛的市场类别,以及利用数据透视表在细分中总结和分析数据点,你覆盖了一系列必备的数据操作和分析技巧。此外,通过利用Pandas.merge()比较分段数据集,并从不同类型的合并操作(外连接、内连接、交叉连接)中获取洞察,你解锁了数据集成和探索的强大能力。掌握这些技术,数据科学家和分析师可以自信地导航复杂的数据领域,发现隐藏的模式,并提取有价值的洞察,从而推动明智的决策制定。

具体来说,你学到了:

  • 如何基于价格类别将数据集划分为有意义的部分,并可视化建筑年份的趋势。

  • 使用Pandas.concat()堆叠数据集并分析更广泛的市场类别。

  • 数据透视表在总结和分析数据点中的作用。

  • 如何利用Pandas.merge()比较分段数据集,并从不同类型的合并操作(外连接、内连接、交叉连接)中获取洞察。

有任何问题吗?请在下面的评论中提问,我会尽力回答。

推断性见解:置信区间如何揭示艾姆斯房地产市场的情况

原文:machinelearningmastery.com/inferential-insights-confidence-intervals/

在数据的广阔宇宙中,有时重要的不是你能看到什么,而是你能推断出什么。置信区间,作为推断统计学的基石,使你能够根据样本数据对更大的人群做出有根据的猜测。利用艾姆斯住房数据集,让我们揭开置信区间的概念,并看看它们如何为房地产市场提供可操作的见解。

让我们开始吧。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

推断性见解:置信区间如何揭示艾姆斯房地产市场的情况。

图片来源:Jonathan Klok。部分权利保留。

概述

本文分为以下几个部分:

  • 推断统计学的核心

  • 什么是置信区间?

  • 使用置信区间估算销售价格

  • 理解置信区间背后的假设

推断统计学的核心

推断统计学使用数据样本对所抽样的总体进行推断。主要组成部分包括:

  • 置信区间: 人口参数可能落在的范围。

  • 假设检验: 对总体参数进行推断的过程。

当研究整个总体不切实际,需要从代表性样本中得出见解时,推断统计学是不可或缺的,就像在Ames 属性数据集的情况一样。

通过我的书籍 《数据科学入门指南》 来启动你的项目。它提供了自学教程可运行的代码

什么是置信区间?

想象一下你从一个城市随机抽取了一些房屋,并计算了平均销售价格。虽然这为你提供了一个单一的估算值,但如果有一个范围可以表示整个城市的真实平均销售价格可能落在何处,那不是更有信息量吗?这个范围估计就是置信区间提供的。实际上,置信区间给了我们一个范围,在这个范围内,我们可以合理地确定(例如,95% 确定)真实的人口参数(如均值或比例)位于其中。

使用置信区间估算销售价格

虽然像均值和中位数这样的点估计能让我们了解中心趋势,但它们无法告知我们真实的总体参数可能落在什么范围内。置信区间填补了这一空白。例如,如果你想估计所有房屋的平均销售价格,你可以使用数据集计算 95%的置信区间。这一区间将给我们一个范围,我们可以 95%确信所有房屋的真实平均销售价格落在这个范围内。

你将使用 t 分布来找到置信区间:

# Import the necessary libraries and load the data
import scipy.stats as stats
import pandas as pd
Ames = pd.read_csv('Ames.csv')

#Define the confidence level and degrees of freedom
confidence_level = 0.95
degrees_freedom = Ames['SalePrice'].count() - 1

#Calculate the confidence interval for 'SalePrice'
confidence_interval = stats.t.interval(confidence_level, degrees_freedom,
                                       loc=Ames['SalePrice'].mean(),
                                       scale=Ames['SalePrice'].sem())

# Print out the sentence with the confidence interval figures
print(f"The 95% confidence interval for the "
      f"true mean sales price of all houses in Ames is "
      f"between \${confidence_interval[0]:.2f} and \${confidence_interval[1]:.2f}.")
The 95% confidence interval for the true mean sales price of all houses in Ames 
is between $175155.78 and $180951.11.

置信区间提供了一个范围,依据一定的置信水平,我们相信这个范围涵盖了真实的总体参数。解释这个范围可以让我们理解估计的变异性和精确度。如果均值‘SalePrice’的 95%置信区间是($175,156, $180,951),我们可以 95%确信所有 Ames 物业的真实平均销售价格介于$175,156 和$180,951 之间。

# Import additional libraries
import matplotlib.pyplot as plt

# Plot the main histogram
plt.figure(figsize=(10, 7))
plt.hist(Ames['SalePrice'], bins=30, color='lightblue', edgecolor='black', alpha=0.5, label='Sales Prices Distribution')

# Vertical lines for sample mean and confidence interval with adjusted styles
plt.axvline(Ames['SalePrice'].mean(), color='blue', linestyle='-', label=f'Mean: ${Ames["SalePrice"].mean():,.2f}')
plt.axvline(confidence_interval[0], color='red', linestyle='--', label=f'Lower 95% CI: ${confidence_interval[0]:,.2f}')
plt.axvline(confidence_interval[1], color='green', linestyle='--', label=f'Upper 95% CI: ${confidence_interval[1]:,.2f}')

# Annotations and labels
plt.title('Distribution of Sales Prices with Confidence Interval', fontsize=20)
plt.xlabel('Sales Price', fontsize=16)
plt.ylabel('Frequency', fontsize=16)
plt.xlim([min(Ames['SalePrice']) - 5000, max(Ames['SalePrice']) + 5000])
plt.legend()
plt.grid(axis='y')
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

销售价格和均值的分布

在上面的可视化中,直方图表示了 Ames 住房数据集中的销售价格分布。蓝色垂直线对应样本均值,提供了平均销售价格的点估计。虚线红色和绿色线分别表示 95%的下限和上限置信区间。

让我们深入了解在$150,000 和$200,000 之间的价格区间。

# Creating a second plot focused on the mean and confidence intervals
plt.figure(figsize=(10, 7))
plt.hist(Ames['SalePrice'], bins=30, color='lightblue', edgecolor='black', alpha=0.5, label='Sales Prices')

# Zooming in around the mean and confidence intervals
plt.xlim([150000, 200000])

# Vertical lines for sample mean and confidence interval with adjusted styles
plt.axvline(Ames['SalePrice'].mean(), color='blue', linestyle='-', label=f'Mean: ${Ames["SalePrice"].mean():,.2f}')
plt.axvline(confidence_interval[0], color='red', linestyle='--', label=f'Lower 95% CI: ${confidence_interval[0]:,.2f}')
plt.axvline(confidence_interval[1], color='green', linestyle='--', label=f'Upper 95% CI: ${confidence_interval[1]:,.2f}')

# Annotations and labels for the zoomed-in plot
plt.title('Zoomed-in View of Mean and Confidence Intervals', fontsize=20)
plt.xlabel('Sales Price', fontsize=16)
plt.ylabel('Frequency', fontsize=16)
plt.legend()
plt.grid(axis='y')
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

置信区间的解释如下:我们 95%确信所有房屋的真实平均销售价格介于$175,156 和$180,951 之间。这个范围考虑了从样本估计总体参数时固有的变异性。从收集的样本中计算出的均值是$178,053,但整个总体的实际值可能有所不同。换句话说,这个区间较窄,因为它是基于大量样本计算得出的。

想要开始数据科学初学者指南吗?

立即参加我的免费邮件速成课程(包括示例代码)。

点击注册并获得课程的免费 PDF 电子书版本。

理解置信区间背后的假设

在 Ames 房地产市场这个动态环境中熟练应用置信区间,关键在于理解支撑我们分析的基础假设。

**假设 1:随机抽样。**我们的分析假设数据是通过随机抽样过程收集的,确保 Ames 中的每个物业都有相等的被包含机会。这种随机性增强了我们对整个房地产市场发现的推广性。

**假设 2:中心极限定理 (CLT) 和大样本。**我们分析中的一个关键假设是中心极限定理 (CLT),它使得在计算置信区间时可以使用 t 分布。中心极限定理认为,对于大样本,样本均值的抽样分布近似于正态分布,无论总体的分布如何。在我们的案例中,有 2,579 个观察值,中心极限定理得到了可靠满足。

**假设 3:独立性。**我们假设各个房屋的销售价格彼此独立。这个假设至关重要,确保一个房屋的销售价格不会影响另一个房屋的销售价格。这在 Ames 多样化的房地产市场中特别相关。

**假设 4:已知或估计的总体标准差(用于 Z-区间)。**虽然我们的主要方法涉及使用 t 分布,但值得注意的是,置信区间也可以通过 Z 分数计算,这要求知道或可靠估计总体标准差。然而,我们的分析偏向于 t 分布,当样本量较小或总体标准差未知时,t 分布更为稳健。

假设 5: 连续数据。 置信区间应用于连续数据。在我们的背景中,Ames 的房屋销售价格是连续变量,因此置信区间适合用于估计总体参数。

这些假设构成了我们分析的基础,认识它们的作用并评估其有效性对可靠且有洞察力的房地产市场分析至关重要。违反这些假设可能会危及我们结论的可靠性。总之,我们的方法论基于 t 分布,利用这些假设为 Ames 的市场趋势和物业价值提供了细致的洞察。

进一步阅读

教程
资源

总结

在这次探索中,我们通过 Ames 房地产数据集介绍了置信区间的概念。通过理解 Ames 房屋真实平均销售价格可能落在的范围,利益相关者可以在房地产市场中做出更明智的决策。

具体来说,你学到了:

  • 推断统计中的置信区间的基础概念。

  • 如何估计和解释 Ames 房地产市场中平均销售价格的 95% 置信区间。

  • 置信区间计算的关键假设。

你有任何问题吗?请在下面的评论中提问,我将尽力回答。

结合 Scikit-Learn 和 Statsmodels 进行回归

原文:machinelearningmastery.com/integrating-scikit-learn-and-statsmodels-for-regression/

统计学和机器学习都旨在从数据中提取洞察,但它们的方法大相径庭。传统统计学主要关注推断,使用整个数据集来检验假设和估计关于更大人群的概率。相对而言,机器学习强调预测和决策,通常采用训练-测试分割的方法,其中模型从数据的一个部分(训练集)学习,并在未见过的数据(测试集)上验证其预测。

在这篇文章中,我们将展示一个看似简单的线性回归技术如何从这两个角度来看待。我们将通过使用 Scikit-Learn 进行机器学习和 Statsmodels 进行统计推断,探讨它们的独特贡献。

让我们开始吧。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

结合 Scikit-Learn 和 Statsmodels 进行回归。

图片由Stephen Dawson提供。版权所有。

概述

本文分为三个部分:

  • 监督学习:分类与回归

  • 从机器学习角度深入回归

  • 通过统计洞察提升理解

监督学习:分类与回归

监督学习是机器学习的一个分支,其中模型在标记的数据集上进行训练。这意味着训练数据集中的每个示例都与正确的输出配对。训练完成后,模型可以将其学到的知识应用于新的、未见过的数据。

在监督学习中,我们遇到两个主要任务:分类和回归。这些任务取决于我们要预测的输出类型。如果目标是预测类别,例如确定一封邮件是否为垃圾邮件,那么我们处理的是分类任务。相反,如果我们估计一个值,例如根据汽车的特征计算每加仑多少英里(MPG),这属于回归。输出的性质——一个类别还是一个数字——引导我们选择合适的方法。

在这一系列中,我们将使用Ames 住房数据集。该数据集提供了与房屋相关的全面特征,包括建筑细节、条件和位置,旨在预测每栋房屋的“SalePrice”(销售价格)。

Python

# Load the Ames dataset
import pandas as pd
Ames = pd.read_csv('Ames.csv')

# Display the first few rows of the dataset and the data type of 'SalePrice'
print(Ames.head())

sale_price_dtype = Ames['SalePrice'].dtype
print(f"The data type of 'SalePrice' is {sale_price_dtype}.")

这应该输出:

         PID  GrLivArea  SalePrice  ...          Prop_Addr   Latitude  Longitude
0  909176150        856     126000  ...    436 HAYWARD AVE  42.018564 -93.651619
1  905476230       1049     139500  ...       3416 WEST ST  42.024855 -93.663671
2  911128020       1001     124900  ...       320 S 2ND ST  42.021548 -93.614068
3  535377150       1039     114000  ...   1524 DOUGLAS AVE  42.037391 -93.612207
4  534177230       1665     227000  ...  2304 FILLMORE AVE  42.044554 -93.631818
[5 rows x 85 columns]

The data type of 'SalePrice' is int64.

“SalePrice” 列的数据类型为 int64,表示它代表整数值。由于 “SalePrice” 是一个数值型(连续型)变量而非分类变量,因此预测 “SalePrice” 将是一个回归任务。这意味着目标是根据数据集中提供的输入特征预测一个连续的量(房屋的售价)。

从机器学习的角度深入回归分析

机器学习中的监督学习专注于基于输入数据预测结果。在我们的案例中,使用 Ames Housing 数据集,我们的目标是根据房屋的生活面积预测其售价——这是一项经典的回归任务。为此,我们使用 scikit-learn,该工具因其在构建预测模型方面的简单性和有效性而闻名。

首先,我们选择 “GrLivArea”(地面生活面积)作为特征,“SalePrice” 作为目标。下一步是使用 scikit-learn 的 train_test_split() 函数将数据集分为训练集和测试集。这一步至关重要,它使我们能够在一组数据上训练模型,并在另一组数据上评估其性能,从而确保模型的可靠性。

下面是我们如何做:

# Import Linear Regression from scikit-learn
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split

# Select features and target
X = Ames[['GrLivArea']]  # Feature: GrLivArea, 2D matrix
y = Ames['SalePrice']    # Target: SalePrice, 1D vector

# Split data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Initialize and fit the Linear Regression model
model = LinearRegression()
model.fit(X_train, y_train)

# Scoring the model
score = round(model.score(X_test, y_test), 4)
print(f"Model R² Score: {score}")

这应该输出:

Model R² Score: 0.4789

上述代码中导入的 LinearRegression 对象是 scikit-learn 的线性回归实现。模型的 R² 分数为 0.4789 表明我们的模型仅凭生活面积就能解释大约 48% 的售价变异——对于这样一个简单的模型来说这是一个重要的见解。这一步标志着我们初步涉足机器学习,展示了我们如何轻松地评估模型在未见或测试数据上的性能。

通过统计见解增强理解

在探讨了 scikit-learn 如何帮助我们评估模型在未见数据上的性能后,我们现在将注意力转向 statsmodels,这是一个提供不同分析角度的 Python 包。虽然 scikit-learn 在构建模型和预测结果方面表现出色,但 statsmodels 通过深入分析数据和模型的统计方面脱颖而出。让我们看看 statsmodels 如何从不同的层面为你提供见解:

import statsmodels.api as sm

# Adding a constant to our independent variable for the intercept
X_with_constant = sm.add_constant(X)

# Fit the OLS model
model_stats = sm.OLS(y, X_with_constant).fit()

# Print the summary of the model
print(model_stats.summary())

第一个关键区别是 statsmodels 使用我们数据集中的所有观察值。与预测建模方法不同,预测建模方法中我们将数据分为训练集和测试集,statsmodels 利用整个数据集提供全面的统计见解。这种完全利用数据的方法使我们能够详细理解变量之间的关系,并提高统计估计的准确性。上述代码应该输出以下内容:

OLS Regression Results                            
==============================================================================
Dep. Variable:              SalePrice   R-squared:                       0.518
Model:                            OLS   Adj. R-squared:                  0.518
Method:                 Least Squares   F-statistic:                     2774.
Date:                Sun, 31 Mar 2024   Prob (F-statistic):               0.00
Time:                        19:59:01   Log-Likelihood:                -31668.
No. Observations:                2579   AIC:                         6.334e+04
Df Residuals:                    2577   BIC:                         6.335e+04
Df Model:                           1                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
const       1.377e+04   3283.652      4.195      0.000    7335.256    2.02e+04
GrLivArea    110.5551      2.099     52.665      0.000     106.439     114.671
==============================================================================
Omnibus:                      566.257   Durbin-Watson:                   1.926
Prob(Omnibus):                  0.000   Jarque-Bera (JB):             3364.083
Skew:                           0.903   Prob(JB):                         0.00
Kurtosis:                       8.296   Cond. No.                     5.01e+03
==============================================================================

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

请注意,这与 scikit-learn 中的回归不同,因为此处使用的是整个数据集,而没有进行训练-测试分割。

让我们深入 statsmodels 对我们 OLS 回归的输出,并解释 p 值、系数、置信区间和诊断信息告诉我们关于我们模型的什么,特别是关注于从 “GrLivArea” 预测 “SalePrice”:

p 值和系数

  • “GrLivArea”的系数: “GrLivArea”的系数为 110.5551。这意味着每增加一平方英尺的生活面积,房屋的销售价格预计会增加约$110.55。这个系数量化了生活面积对房屋销售价格的影响。

  • “GrLivArea”的 p 值:与“GrLivArea”系数相关的 p 值基本为 0(由P>|t|接近 0.000 指示),表明生活面积是一个高度显著的销售价格预测因素。在统计学上,我们可以拒绝系数为零(无效应)的原假设,并且可以自信地表示生活面积与销售价格之间存在强关系(但不一定是唯一因素)。

信赖区间

  • “GrLivArea”的信赖区间: “GrLivArea”系数的信赖区间为[106.439, 114.671]。这个范围告诉我们我们可以有 95%的信心认为生活面积对销售价格的真实影响落在这个区间内。它提供了我们对系数估计值精确度的度量。

Diagnostics

  • R-squared (R²):R²值为 0.518,表示生活面积可以解释约 51.8%的销售价格变动。这是衡量模型拟合数据的程度的指标。由于数据不同,因此预计这个数值与 scikit-learn 回归中的情况不相同。

  • F-statistic 和 Prob (F-statistic):F-statistic 是衡量模型整体显著性的指标。F-statistic 为 2774,Prob (F-statistic)基本为 0,这表明模型在统计上是显著的。

  • Omnibus, Prob(Omnibus):这些测试评估残差的正态性。残差是预测值 y ^ \hat{y} y^和实际值 y y y之间的差异。线性回归算法基于残差服从正态分布的假设。Prob(Omnibus)值接近 0 表明残差不是正态分布的,这可能对某些统计测试的有效性构成担忧。

  • Durbin-Watson:Durbin-Watson 统计量测试残差中的自相关性。它的范围在 0 到 4 之间。接近 2 的值(1.926)表明没有强自相关。否则,这表明 X X X y y y之间的关系可能不是线性的。

statsmodels提供的这份全面输出深入了解了“GrLivArea”如何以及为何影响“SalePrice”,并以统计证据为基础。它强调了不仅仅依赖模型进行预测的重要性,还要对模型进行解释,以便根据扎实的统计基础做出明智的决策。这些见解对于那些希望探索数据背后统计故事的人来说极为宝贵。

进一步阅读

APIs
教程

书籍

Ames 住房数据集与数据字典

总结

在这篇文章中,我们探讨了监督学习的基础概念,特别是回归分析。通过使用 Ames 住房数据集,我们展示了如何使用scikit-learn进行模型构建和性能评估,以及使用statsmodels获取对数据的统计见解。从数据到见解的过程凸显了预测建模和统计分析在有效理解和利用数据中的关键作用。

具体而言,你学到了:

  • 监督学习中分类任务和回归任务的区别。

  • 如何根据数据的性质确定使用哪种方法。

  • 如何使用scikit-learn实现一个简单的线性回归模型,评估其性能,并理解模型的 R²得分的重要性。

  • 使用statsmodels探索数据的统计方面,包括系数、p 值和置信区间的解释,以及诊断测试对模型假设的重要性。

你有任何问题吗?请在下方评论中提出你的问题,我会尽力回答。

机器学习是一种人工智能领域的研究,通过让计算机从数据中模式中学习和改进,可以让计算机具备从经验中学习的能力。R是一种流行的编程语言,被广泛用于数据分析和统计学习。在R中,可以使用不同的机器学习算法来处理和分析数据。 "Machine Learning Mastery with R" 是一本书籍或教程,旨在帮助读者掌握使用R进行机器学习的技能。该书可能包含以下内容: 1. R的基础知识:介绍R编程语言的基本语法和数据结构,帮助读者理解如何在R环境中进行数据处理和分析。 2. 机器学习算法:介绍常见的机器学习算法,如线性回归、逻辑回归、决策树、随机森林等,并提供使用R实现这些算法的示例。 3. 特征工程:介绍如何选择和处理数据的特征,以提高机器学习算法的性能。这可能包括特征选择、特征缩放和特征转换等技术。 4. 模型评估和调优:介绍如何评估和优化机器学习模型的性能。这可能包括交叉验证、网格搜索和模型选择等技术。 5. 实际案例:提供一些真实世界的案例研究,展示如何应用机器学习和R来解决实际问题。 通过学习"Machine Learning Mastery with R",读者可以了解机器学习的基本概念和技术,并掌握使用R语言进行机器学习的实践技能。这将使他们能够在实际项目中应用机器学习算法,从而更好地理解和分析数据,并做出准确的预测和决策。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值