数据挖掘中的PCA和KMeans:Airbnb房源案例研究

news2024/11/20 13:31:43

目录

一、PCA简介

二、数据集概览

三、数据预处理步骤

四、PCA申请

五、KMeans 聚类

六、PCA成分分析

七、逆变换

八、质心分析

九、结论

十、深入探究

10.1 第 1 步:确定 PCA 组件的最佳数量

10.2 第 2 步:使用 9 个组件重做 PCA

10.3 解释 PCA 加载和特征贡献

10.4 9项常设仲裁法院的分析与解读

10.5 如何进行主题分析


一、PCA简介

        主成分分析 (PCA) 是一种统计技术,可简化高维数据的复杂性,同时保留趋势和模式。它通过将数据转换为较少的维度来实现此目的,这些维度充当特征的摘要,称为主成分 (PC)。这些分量彼此正交,确保它们表示数据中的独立方差。

二、数据集概览

        在我们的案例研究中,我们使用的是 Airbnb 房源数据集,其中包含位置、房间类型、价格等各种功能。我们的目标是发现这个数据集中的潜在模式,这可以帮助我们将列表细分为有意义的组。

import pandas as pd
from sklearn.preprocessing import StandardScaler, LabelEncoder
from sklearn.decomposition import PCA
from sklearn.cluster import KMeans

# Load the dataframe from the CSV file
df = pd.read_csv('https://raw.githubusercontent.com/fenago/datasets/main/airbnb.csv')

三、数据预处理步骤

        在深入研究 PCA 之前,我们需要确保我们的数据是干净的,并且采用正确的分析格式:

  • 缺失值:我们通过用各自列的平均值填充缺失值来处理缺失值,确保没有遗漏任何数据点。
  • 分类编码:我们使用标签编码将分类变量(如 、 、 和 )转换为数字,而该特征是一次性编码的。此步骤至关重要,因为 PCA 需要数字输入。host_is_superhostneighbourhoodproperty_typeinstant_bookablecity
  • 功能扩展:我们过去常常扩展功能。缩放对于 PCA 至关重要,因为它对初始变量的方差很敏感。StandardScaler
# Fill missing values with the mean of the column
df_filled = df.fillna(df.mean())

# Convert categorical columns to numeric using label encoding
# Initialize label encoder
label_encoder = LabelEncoder()

# Columns to label encode
label_encode_columns = ['host_is_superhost', 'neighbourhood', 'property_type', 'instant_bookable']

# Apply label encoding to each column
for column in label_encode_columns:
    df_filled[column] = label_encoder.fit_transform(df_filled[column])

# Apply one-hot encoding to 'city' using get_dummies
df_filled = pd.get_dummies(df_filled, columns=['city'])

# Redefine and refit the scaler to the current dataset
scaler = StandardScaler()
scaled_features = scaler.fit_transform(df_filled)

四、PCA申请

        将 PCA 应用于我们的缩放数据集,我们决定了三个主要组成部分。这个数字通常是根据解释的方差来选择的,方差表示每个组件从数据中捕获的信息量。

# Apply PCA
pca = PCA(n_components=3)
pca_result = pca.fit_transform(scaled_features)

五、KMeans 聚类

        由于我们的数据现在位于三维PCA空间中,我们应用KMeans聚类来识别四个不同的聚类。此方法对数据点进行分组,以便每个聚类中的数据点彼此之间比其他聚类中的数据点更相似。

# Apply KMeans clustering on the PCA result
kmeans_pca = KMeans(n_clusters=4, random_state=42)
kmeans_pca.fit(pca_result)

六、PCA成分分析

        每个主成分都代表了原始特征的组合,但它们究竟捕获了什么?

# Get the PCA components (loadings)
pca_components = pca.components_

让我们深入研究每个 PCA 的负载:

  • PC1:似乎很重视地理坐标(纬度和经度),表明该组成部分可能代表列表的地理分布。
  • PC2:该组件与 host_since_datekey 负相关,表明它可能正在捕获主机经验或任期的某些方面。
  • PC3:由于内住物和listing_size_sqft的负载较高,该组件可以反映列表的大小和容量。

七、逆变换

        通过逆变换 PCA 聚类中心,我们将聚类映射回原始空间,以根据原始特征解释质心。这一步就像将我们的 PCA 结果翻译回我们可以理解的语言。

# Inverse transform the cluster centers from PCA space back to the original feature space
original_space_centroids = scaler.inverse_transform(pca.inverse_transform(kmeans_pca.cluster_centers_))

# Create a new DataFrame for the inverse transformed cluster centers with column names
centroids_df = pd.DataFrame(original_space_centroids, columns=df_filled.columns)

# Calculate the mean of the original data for comparison
original_means = df_filled.mean(axis=0)

# Prepare the PCA loadings DataFrame
pca_loadings_df = pd.DataFrame(pca_components, columns=df_filled.columns, index=[f'PC{i+1}' for i in range(3)])

八、质心分析

        与原始数据的平均值相比,聚类的质心告诉我们每个聚类的中心趋势。例如,如果质心的价格值高于平均值,则相应的聚类可能表示更多的优质列表。

# Append the mean of the original data to the centroids for comparison
centroids_comparison_df = centroids_df.append(original_means, ignore_index=True)

# Store the PCA loadings and centroids comparison DataFrame for further analysis
pca_loadings_df.to_csv('/mnt/data/pca_loadings.csv', index=True)
centroids_comparison_df.to_csv('/mnt/data/centroids_comparison.csv', index=False)

pca_loadings_df, centroids_comparison_df.head()  # Displaying the PCA loadings and the first few rows of the centroids comparison DataFrame

九、结论

        PCA使我们能够降低数据集的维度,揭示最初并不明显的内在模式。当与聚类相结合时,我们可以将房源细分为不同的组,每个组代表Airbnb市场的不同方面。

十、深入探究

10.1 第 1 步:确定 PCA 组件的最佳数量

        当我们执行 PCA 时,我们将原始特征集转换为一组新的正交特征,称为主成分 (PC)。每个主成分捕获数据集中总方差的一定百分比。第一个主成分捕获的方差最大,每个后续组件捕获的方差较小。通过查看累积解释方差,我们可以看到随着我们包含越来越多的分量,捕获了多少总方差。

        累积解释方差图显示了通过包含最多 n 个主成分来捕获的数据集总方差的比例。这个想法是选择最少数量的主成分,这些主成分仍捕获总方差的很大一部分。一个常见的经验法则是选择足够的组件来捕获至少 95% 的总方差,这使我们能够在保留数据集中大部分信息的同时降低维度。

        让我们重新审视累积解释方差图,以确定满足此条件的分量数。我们将查找累积解释方差超过 95% 的点,这通常被认为足以捕获数据集中的大部分信息。这种组件数量通常是信息保留和降维之间的良好平衡。

        我们将再次分析情节并提供更直观的解释。

# Fit PCA to the data without reducing dimensions and compute the explained variance ratio
pca_full = PCA()
pca_full.fit(scaled_features)

# Calculate the cumulative explained variance ratio
explained_variance_ratio = pca_full.explained_variance_ratio_
cumulative_explained_variance = explained_variance_ratio.cumsum()

# Plot the cumulative explained variance ratio to find the optimal number of components
plt.figure(figsize=(10, 6))
plt.plot(range(1, len(cumulative_explained_variance) + 1), cumulative_explained_variance, marker='o', linestyle='--')
plt.title('Cumulative Explained Variance by PCA Components')
plt.xlabel('Number of PCA Components')
plt.ylabel('Cumulative Explained Variance')
plt.grid(True)
plt.axhline(y=0.95, color='r', linestyle='-')  # 95% variance line for reference
plt.text(0.5, 0.85, '95% cut-off threshold', color = 'red', fontsize=16)

# Determine the number of components that explain at least 95% of the variance
optimal_num_components = len(cumulative_explained_variance[cumulative_explained_variance >= 0.95]) + 1

# Highlight the optimal number of components on the plot
plt.axvline(x=optimal_num_components, color='g', linestyle='--')
plt.text(optimal_num_components + 1, 0.6, f'Optimal Components: {optimal_num_components}', color = 'green', fontsize=14)

plt.show()

# Returning the optimal number of components
optimal_num_components

        更新后的图更清楚地说明了累积解释方差如何随着主成分数量的增加而增加。绿色垂直线标记分量数共同解释数据集中总方差的至少 95% 的点。

        从图中可以看出,这个阈值有 9 个主成分。这意味着通过使用 9 个分量,我们可以捕获数据中 95% 的可变性,这通常被认为足以满足许多应用的需求。这比原始特征数量大幅减少,同时仍保留了大部分信息。

        因此,在我们的分析上下文中,我们可以执行 PCA 并将维度降低到 9 个主成分,而不是使用所有原始特征,以实现更简单但仍然信息丰富的数据集表示。

10.2 第 2 步:使用 9 个组件重做 PCA

# Redo PCA with 9 components
pca_9 = PCA(n_components=9)
pca_result_9 = pca_9.fit_transform(scaled_features)

# Get the PCA loadings for 9 components
pca_components_9 = pca_9.components_

# Analyze the PCA loadings to determine which features contribute most to each of the 9 principal components
# We will look at the absolute values of the loadings to assess their contribution
pca_loadings_analysis_9 = pd.DataFrame(
    pca_components_9, 
    columns=df_filled.columns, 
    index=[f'PC{i+1}' for i in range(9)]
).abs().T  # Transpose to have features as rows

# Sorting the loadings for each component to see the top contributing features
top_features_per_pc_9 = pca_loadings_analysis_9.apply(lambda s: s.abs().nlargest(5).index.tolist(), axis=0)

top_features_per_pc_9

        为了提供前九个主成分中每个特征的实际加载分数,我们可以输出 PCA 加载矩阵的数值。将显示给定主成分中每个特征的载荷,显示它们的贡献。

# Display the actual loadings for the top 5 features for each of the 9 principal components
# We will extract the top 5 features based on the absolute values of the loadings and display their actual loadings
import numpy as np
# Function to get top n features for each principal component with their loadings
def get_top_features_loadings(pca_loadings, n_features):
    top_features = {}
    for i in range(pca_loadings.shape[0]):
        # Get the index of the n largest absolute values in the i-th principal component
        top_indices = np.argsort(np.abs(pca_loadings[i]))[-n_features:]
        # Create a dictionary of the top features and their loadings for the i-th principal component
        top_features[f'PC{i+1}'] = {df_filled.columns[j]: pca_loadings[i][j] for j in top_indices}
    return top_features

# Get the top 5 features and their loadings for each of the 9 principal components
top_features_loadings_9 = get_top_features_loadings(pca_components_9, 5)
top_features_loadings_9_df = pd.DataFrame(top_features_loadings_9).T

top_features_loadings_9_df

        上表显示了前九个主组件中每个主组件的顶部特征的实际载荷。载荷是表示每个特征对主成分的贡献程度的系数。以下是每个主要组件的主要贡献功能及其负载的摘要:

  • PC1:地理特征和城市的影响最大,载荷显示正负值,在地图上表示相反的方向。
  • PC2:与主机相关的功能,如具有高负负载,这意味着这些功能与 PC2 有很强的反比关系。host_since_datekeyhost_id
  • PC3:与属性相关的特征,如 、 和 具有很强的正载荷,这意味着它们直接影响 PC3。accommodateslisting_size_sqftbedrooms
  • PC4 到 PC9:与城市、物业类型、预订选项和评论分数相关的各种其他功能有助于这些组件具有不同程度的正负负载。

        要解释这些负载,请执行以下操作:

  • 正载荷意味着随着特征值的增加,主成分的分数也会增加。
  • 负载荷意味着随着特征值的增加,主成分的分数会降低。
  • 载荷的大小(距零的距离)表示特征与主成分之间关系的强度。

        要执行详细分析并推断每个 PCA 的含义,需要考虑数据集的领域知识,并了解每个主要功能与 Airbnb 列表的上下文之间的关系。这涉及考虑每个功能所代表的内容(例如,位置、物业大小、房东体验),以及它们如何组合在一起以形成由主组件表示的主题。

        我们已经成功地对 9 个主要组件执行了 PCA,并列出了对每个组件贡献最大的前 5 个功能。以下是我们如何解释负载以确定特征贡献:

10.3 解释 PCA 加载和特征贡献

        PCA 组件的载荷反映了原始变量与主成分之间的相关性。以下是解释这些负载的方法:

  • 高正载荷(接近 1):表示特征与元件具有很强的正相关。
  • 高负载荷(接近 -1):表示特征与元件具有很强的负关联。
  • 加载接近 0:表示特征与组件的关联较弱。

        每个主成分的主要贡献特征是具有最高绝对载荷的特征,无论它们是正载荷还是负载荷。这些特征被认为对组件的方差影响最大。

10.4 9项常设仲裁法院的分析与解读

        现在,我们将根据主要贡献功能来解释 9 个主要组件中每个组件的主题:

  • PC1:以城市相关特征和地理坐标为主,暗示了地理位置的主题。
  • PC2:受房东标识符和日期的影响,表示房东经历或任期的主题。
  • PC3:包括与房源面积和容量相关的功能,指向房产面积和住宿容量的主题。
  • PC4:具有与城市相关的变量和接受率,暗示了托管偏好和位置可取性的主题。
  • PC5:以城市和价格为标志,可能反映不同地点的定价策略主题。
  • PC6:包含即时可预订和房东超赞房东状态,建议以出租服务和设施为主题。
  • PC7:以回复率和评论分数为特色,指向房东响应能力和客人满意度的主题。
  • PC8:还包括房东总房源和评价分数,表明房东组合和体验质量的主题。
  • PC9:捕获邻域和主机列表计数,这可能表示邻域受欢迎程度和主机活动。

10.5 如何进行主题分析

要对PCA组件进行专题分析:

  1. 对 PCA 负载进行排序:按每个主组件的加载对特征进行排序。
  2. 识别主要特征:确定具有最高绝对载荷的顶级特征。
  3. 了解要素重要性:了解这些要素在数据集上下文中的重要性。
  4. 寻找模式:在顶级特征中寻找模式以推断主题。
  5. 考虑正负贡献:请注意,具有高正载荷的特征和具有高负载荷的特征对主题的贡献不同。
  6. 验证主题:使用领域知识或其他数据分析来验证推断的主题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1570260.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

高度不同的流体瀑布css实现方法

商城商品列表 实现瀑布流展示,通过flex或grid实现会导致每行中的列高度一致,无法达到错落有致的感觉; 为此需要用到: CSS columns 属性 columns 属性是一个简写属性,用于设置列宽和列数。 CSS 语法 columns: column-wi…

网络攻防中json序列化漏洞案例,fastjson远程命令执行漏洞原理

网络攻防中json序列化漏洞案例,fastjson远程命令执行漏洞原理。 网络攻防中的JSON序列化漏洞是指当应用程序使用JSON(JavaScript Object Notation)格式来序列化和反序列化对象时,由于不当处理或不安全的编程实践,导致攻击者能够执行恶意操作的安全漏洞。这些操作可能包括远…

成为不可替代的人,优秀到不能被忽视

一、资料描述 本套个人成长资料,大小30.89M,共有21个文件。 二、资料目录 00发刊词 成为不可替代的人.pdf 01累死你的不是工作,是错的职场价值观.pdf 02教你选好行业,远离裁员降薪.pdf 03如何选对公司,让高薪升值…

AJAX —— 学习(一)

目录 一、原生 AJAX (一)AJAX 介绍 1.理解 2.作用 3.最大的优势 4.应用例子 (二)XML 介绍 1.理解 2.作用 (三)AJAX 的特点 1.优点 2.缺点 二、HTTP 协议 (一)HTTP 介…

【攻防世界】ics-05

php://filter 伪协议查看源码 preg_replace 函数漏洞 1.获取网页源代码。多点点界面,发现点云平台设备维护中心时,页面发生变化。 /?pageindex 输入什么显示什么,有回显。 用php://filter读取网页源代码 ?pagephp://filter/readconvert.…

docker安装、调试qsign签名服务器

go-cqhttp 在 Docker 里早就部署好了,由于没有搭建 qsign 签名服务器,所以迟迟不敢上线。今天终于搞定了在 Docker 下安装 qsign 签名服务器了。这次用的docker市场里找到的镜像,下次找时间制作一个自己的镜像。 1 拉取和运行镜像&#xff1a…

轻薄本没有独立显卡如何运行stable diffusion

众所周知,Stable Diffusion WebUI 使用 GPU 模式运行。 一:检查自己显卡 打开任务管理器或者winR 输入dxdiag 查看自己显卡状态 很明显一般轻薄本只会带有集显,不能满足stable diffusion要求所以我们可以使用cup来运行stable diffusion 在…

转让1000万不良资产处置公司包变更需要多久

随着经济的发展和市场的变化,越来越多的公司需要进行资产的处置和转让,以提言公司的效益和盈利。山东不良资产处置公司作为一家专门服务于资产处置和转让的企业,其流程与变更步骤对于资产转让的操作至关重要。可以致电咨询我或者来公司面谈。…

电荷泵如何实现升压原来

电荷泵如何实现升压原来 某芯片自举栅极驱动内部原理图迪克森电荷泵 某芯片自举栅极驱动内部原理图 迪克森电荷泵 迪克森电荷泵(Dickson Charge Pump)是一种电压倍增器电路,可以将低电压升高到较高电压,相对于其他电压升压电路&a…

网站建设 之 发布ios

首先将forceDev改为false 然后执行npm run build:ios 然后用xocode安装到手机上进行测试 ##Version(应用程序发布版本号) 对应的就是CFBundleShortVersionString。该版本的版本号是三个时期分隔的整数组成的字符串: 第一个整数代表重大修…

Pytoch安装记录

使用pycharm 1、CUDA的安装 官网:CUDA Toolkit Archive | NVIDIA Developer 选择对应的版本 选择对应的版本进行下载: 有3个多G cuda的安装需要注意,如果没有安装vs,则需要选择自定义安装,在自定义的安装中取消 安…

101. 对称二叉树及同类题

101. 对称二叉树 力扣题目链接(opens new window) 给定一个二叉树,检查它是否是镜像对称的。 递归 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNo…

SSM框架学习——Eclipse创建Spring MVC maven项目

Spring MVC项目创建 什么是Spring MVC Spring MVC是Spring内置的,实现了Web MVC设计模式的框架。 它解决了Web开发过程中很多的问题,例如参数接收、表单验证等。另外它采用松散耦合可插拔组件等结构,具有相对较高的灵活性和扩展性。 Spri…

企业案例:金蝶云星空集成钉钉,帆软BI

正文:在数字化转型的大潮中,众多企业开始探索并实践高效的数据流转与集成,以提升内部管理效率和决策质量。本文将以某企业为例,详细介绍如何通过将钉钉审批流程的数据实时同步至金蝶云星空,并进一步在帆软报表平台上实…

控制台RPG 游戏实现双缓冲无屏闪,玩家类,地图类

重整控制台RPG——双缓冲无屏闪以及第一个无中生有的地图类&#xff0c;玩家类_哔哩哔哩_bilibili 是鄙人解说鄙人的代码 #include <iostream> #include <string.h> #include <windows.h>#define KEY_DOWN(vKey) ((GetAsyncKeyState(vKey) & 0x8000) ?…

Prometheus+grafana环境搭建MongoDB(docker+二进制两种方式安装)(五)

由于所有组件写一篇幅过长&#xff0c;所以每个组件分一篇方便查看&#xff0c;前四篇mongodb的exporter坑也挺多总结一下各种安装方式&#xff0c;方便后续考古。 Prometheusgrafana环境搭建方法及流程两种方式(docker和源码包)(一)-CSDN博客 Prometheusgrafana环境搭建rabb…

先进电气技术 —— (控制理论)何为稳定性?

一、系统稳定性 在控制理论中&#xff0c;系统稳定性是一个非常关键的概念&#xff0c;它主要涉及系统对外界扰动或内部变动的响应行为。以下是与系统稳定性相关的一些核心名词及其解释&#xff1a; 基本概念 稳定性&#xff08;Stability&#xff09; 系统稳定性是指当系统受…

【Linux】make 工具和 Makefile 文件的引入

前面提到了 gcc 编译器&#xff0c;那么使用 gcc 编译器肯定就会接触到 Makefile 。当源码文件比较多的时候就不适合通过直接输入 gcc 命令来编译&#xff0c;这时候就需要一个自动化的编译工具 make 。 举例&#xff1a;通过键盘输入两个整形数字&#xff0c;然后计算他们的和…

matlab中角度-弧度转化

在 MATLAB 中进行角度和弧度之间的转换可以使用内置的函数&#xff1a; 1. 将角度转换为弧度&#xff1a; matlab rad deg * pi / 180; 这里 deg 是你想要转换的角度值&#xff0c;pi 是 MATLAB 内置的圆周率常量。 2. 将弧度转换为角度&#xff1a; matlab…

【linux】重定向|缓冲区

read函数 将文件标识符为fd的文件内容读到buf中去&#xff0c;读count个&#xff0c;read的返回值是实际读到的个数&#xff0c;有可能文件中没有count个&#xff0c;但是read返回的还是实际读到的个数 stat函数 调用这个函数可以查到对应文件的属性&#xff0c;比方说文件大小…