Geospatial Data Science (6): Spatial clustering

这篇博客探讨了空间聚类在地理数据分析中的应用,特别是针对内伦敦AirBnb数据的K-means聚类。通过对AirBnb房源的评级进行分析,将内伦敦的地区分为不同类别,揭示了各区域的特点和相似性。此外,还讨论了区域化算法,通过空间约束重新划定区域边界,以展现基于AirBnb数据的有机分区与行政区域的对比。

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

Geospatial Data Science (6): Spatial clustering

1.Clustering, spatial clustering, and geodemographics

本节涉及空间观测的统计聚类。许多问题和主题都是复杂的现象,涉及多个维度,难以归纳为一个单一的变量。在统计学术语中,我们把这一类问题称为多变量,而不是在分析中只考虑单一变量的单变量情况。聚类处理这类问题的方法是降低其维度–分析师需要查看的相关变量的数量,并将其转换为更直观的类集,即使是非技术性的受众也可以查看并理解。出于这个原因,它被广泛用于决策或营销等应用场合。此外,由于这些方法不需要很多关于数据结构的初步假设,它是一种常用的探索性工具,因为它可以迅速提供关于数据集的形状、形式和内容的线索。

统计聚类的基本思想是通过创建相对较少的类别来总结几个变量中包含的信息。然后,数据集中的每个观测值都被分配到一个,而且只有一个类别,这取决于它在分类中最初考虑的变量的值。如果做得正确,这种做法可以减少多维问题的复杂性,同时保留原始数据集中包含的所有有意义的信息。这是因为,一旦分类,分析师只需要看每一个观察结果属于哪个类别,而不是考虑与每个变量相关的多个值,并试图找出如何将它们连贯起来。当对代表地区的观测值进行聚类时,这种技术通常被称为地理人口分析。

尽管存在许多技术来对数据集中的观测值进行统计分组,但所有这些技术都基于这样一个前提,即使用一组属性来定义观测值的类或类别,这些类或类别在每个组内是相似的,但在组之间是不同的。如何定义组内的相似性和组间的不相似性,以及如何操作分类算法是使技术不同的原因,也是使每个技术特别适合于特定问题或数据类型的原因。作为一个例子,我们将只涉足其中的一种方法–K-means,它可能是最常用的统计聚类技术。

在分析空间数据的情况下,有一个方法子集对地理数据科学的许多常见情况特别感兴趣。这些是所谓的区域化技术。区域化方法也可以有很多形式和面貌,但就其核心而言,它们都涉及观察值的统计聚类,并有一个额外的约束条件,即观察值需要是地理上的邻居,才能归入同一类别。正因为如此,我们将对每个观测值使用区域一词,对每个类别使用区域一词,因此区域化,即从较小的区域中构建区域。

%matplotlib inline

import seaborn as sns
import pandas as pd
from pysal.lib import weights
import geopandas as gpd
import contextily as cx
import numpy as np
import matplotlib.pyplot as plt
from sklearn import cluster
import esda
from splot.libpysal import plot_spatial_weights
d:\work\miniconda3\lib\site-packages\scipy\__init__.py:146: UserWarning: A NumPy version >=1.16.5 and <1.23.0 is required for this version of SciPy (detected version 1.23.3
  warnings.warn(f"A NumPy version >={np_minversion} and <{np_maxversion}"

2.Data

我们这次要使用的数据集是从在线网站AirBnb中提取的。AirBnb是一家公司,为那些在访问一个城市时寻找酒店替代品的人,以及那些想出租(部分)自己的房子以赚取额外收入的当地人提供了一个会面点。该网站有一个不断更新的清单,列出了某一城市的所有可用房产,客户可以通过该清单进行查询和预订。此外,该网站还提供了一个反馈机制,主人和客人两端都可以对他们的经验进行评价。AirBnb汇总了客人对他们所住房源的评分,为每处房源提供了额外的信息,如整体清洁度评分或主人与客人沟通的好坏指数。

原始数据是在物业层面和整个伦敦提供的。然而,由于这本笔记的目的,物业的总数非常大,他们已经在中间超级输出区(MSOA),一个由国家统计局创建的地理单位进行了汇总。虽然原始资料包含了大伦敦地区的信息,但绝大多数房产都位于内伦敦,所以我们将使用的数据也仅限于此。即使在这种情况下,也不是每个多边形都有至少一个房产。为了避免缺失值的情况,最终的数据集只包含那些至少有一个房产的MSOAs,所以可以有与之相关的平均评级。

我们在这本笔记中的目标是根据AirBnb地点的评级,对内伦敦的地区(MSOA)进行分类。这将使我们能够为伦敦的AirBnb地理学创建一个类型学,并且在AirBnb地点能够说明它们所在地区的程度上,这个分类将帮助我们更好地理解伦敦的住宅地理学。关于我们可以从像这样的分析中得出的结论,有一个一般性的警告,这来自于AirBnb数据的性质。一方面,这个数据集是数据革命使分析成为可能的一个很好的例子,因为仅仅在几年前,我们很难获得类似于这样的大型房产评级调查。另一方面,重要的是要牢记这些数据的偏见,因此,在将调查结果推广到一般人群方面存在局限性。无论如何,这个数据集是学习空间观察统计聚类的一个很好的例子,无论是在地理人口方面还是在区域化方面。

让我们从阅读MSOA的主表开始。

# Read the file in
abb = gpd.read_file(
    "files/london_abb.gpkg"
)
# Inspect the structure of the table
abb.info()
<class 'geopandas.geodataframe.GeoDataFrame'>
RangeIndex: 353 entries, 0 to 352
Data columns (total 18 columns):
 #   Column                       Non-Null Count  Dtype   
---  ------                       --------------  -----   
 0   MSOA_CODE                    353 non-null    object  
 1   accommodates                 353 non-null    float64 
 2   bathrooms                    353 non-null    float64 
 3   bedrooms                     353 non-null    float64 
 4   beds                         353 non-null    float64 
 5   number_of_reviews            353 non-null    float64 
 6   reviews_per_month            353 non-null    float64 
 7   review_scores_rating         353 non-null    float64 
 8   review_scores_accuracy       353 non-null    float64 
 9   review_scores_cleanliness    353 non-null    float64 
 10  review_scores_checkin        353 non-null    float64 
 11  review_scores_communication  353 non-null    float64 
 12  review_scores_location       353 non-null    float64 
 13  review_scores_value          353 non-null    float64 
 14  property_count               353 non-null    int64   
 15  BOROUGH                      353 non-null    object  
 16  GSS_CODE                     353 non-null    object  
 17  geometry                     353 non-null    geometry
dtypes: float64(13), geometry(1), int64(1), object(3)
memory usage: 49.8+ KB

在我们开始探索数据之前,有一个额外的步骤将在接下来的工作中派上用场。表中并非每个变量都是我们要进行聚类的属性。特别是,我们对评论评级感兴趣,所以我们将只考虑这些。因此,让我们先手动写出它们,这样它们就更容易进行子集。

ratings = [
    'review_scores_rating', 
    'review_scores_accuracy', 
    'review_scores_cleanliness', 
    'review_scores_checkin', 
    'review_scores_communication',
    'review_scores_location',
    'review_scores_value'
]

在本节的后面,我们还将使用AirBnb所说的邻里。让我们把它们装进去,这样当我们需要它们的时候,它们就准备好了。

boroughs = gpd.read_file(
    "files/london_inner_boroughs.geojson"
)
boroughs
NAME GSS_CODE HECTARES NONLD_AREA ONS_INNER SUB_2009 SUB_2006 geometry
0 Lambeth E09000022 2724.940 43.927 T None None POLYGON ((-0.12846 51.48505, -0.12843 51.48506...
1 Southwark E09000028 2991.340 105.139 T None None POLYGON ((-0.10892 51.50844, -0.10889 51.50845...
2 Lewisham E09000023 3531.706 16.795 T None None POLYGON ((-0.03241 51.49306, -0.03240 51.49303...
3 Greenwich E09000011 5044.190 310.785 F None None MULTIPOLYGON (((-0.02485 51.48555, -0.02479 51...
4 Wandsworth E09000032 3522.022 95.600 T None None POLYGON ((-0.22343 51.47152, -0.22327 51.47146...
5 Hammersmith and Fulham E09000013 1715.409 75.648 T None None POLYGON ((-0.24456 51.48870, -0.24460 51.48879...
6 Kensington and Chelsea E09000020 1238.379 25.994 T None None POLYGON ((-0.18388 51.47742, -0.18403 51.47753...
7 Westminster E09000033 2203.005 54.308 T None None POLYGON ((-0.15000 51.48548, -0.15009 51.48590...
8 Camden E09000007 2178.932 0.000 T None None POLYGON ((-0.14242 51.56912, -0.14250 51.56901...
9 Tower Hamlets E09000030 2157.501 179.707 T None None POLYGON ((-0.07938 51.50784, -0.07935 51.50791...
10 Islington E09000019 1485.664 0.000 T None None POLYGON ((-0.13839 51.55686, -0.13852 51.55701...
11 Hackney E09000012 1904.902 0.000 T None None POLYGON ((-0.09766 51.57365, -0.09756 51.57368...
12 City of London E09000001 314.942 24.546 T None None POLYGON ((-0.11157 51.51075, -0.11159 51.51091...

请注意,与以前的数据集相比,这个数据集是以一种新的格式提供的,即.geojson。GeoJSON文件是一个纯文本文件(你可以在任何文本编辑器上打开它,看到它的内容),它遵循JSON格式的结构,广泛用于在网络上交换信息,适应于地理数据,因此前面有geo。随着网络地图的兴起,GeoJSON文件得到了广泛的欢迎,并迅速成为小型数据集的事实标准,因为它们可以被人类和许多不同的平台所阅读。正如你在上面看到的,在Python中读取它们与读取shapefile完全一样,比如说。

3.Getting to know the data

开始探索AirBnb评级地理的最好方法是将每个评级绘制成不同的地图。这将使我们对我们感兴趣的每个变量有一个单变量的视角。

由于我们有很多列要绘制,我们将创建一个循环,为我们生成每张地图,并将其放在主图的 子图上。

# Create figure and axes (this time it's 9, arranged 3 by 3)<
Earth Engine和geemap是两种基于Python的地理空间数据科学工具。Earth Engine是由Google开发的一种云平台,旨在让用户能够使用多源地理空间数据进行高性能计算和分析。而geemap是一个基于地图可视化库的Python包,旨在让用户可以直观地可视化地理空间数据以及与Earth Engine进行交互。 Earth Engine提供了丰富的地理空间数据集,包括卫星影像、气候数据、地形数据等,用户可以通过Earth Engine的API来访问这些数据,并进行复杂的地理空间分析。而geemap则为用户提供了一种简单易用的方式来可视化这些地理空间数据,用户可以使用geemap库来创建交互式地图、图表和应用,从而更直观地展示地理空间数据和分析结果。 通过结合Earth Engine和geemap,用户可以利用Python这一通用的编程语言来进行地理空间数据科学研究和应用开发,而无需深入了解复杂的地理信息系统或遥感技术。这两种工具的结合为用户提供了一个强大而灵活的地理空间数据分析平台,可以在科学研究、自然资源管理、环境监测等领域发挥重要作用。 总的来说,Earth Engine和geemap为用户提供了一种简单、高效的方式来进行地理空间数据科学研究和应用开发,极大地方便了用户对地理空间数据的访问、分析和可视化。这两种工具的结合为地理空间数据科学的发展提供了新的可能性和机遇。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

rgb2gray

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值