如何在聚类分析中处理空值?

Posted

技术标签:

【中文标题】如何在聚类分析中处理空值?【英文标题】:How do I handle null values in cluster analysis? 【发布时间】:2021-12-19 06:35:41 【问题描述】:

我从事金融科技业务,我拥有如下客户级别的数据:

Customer ID day1 day2 day3 day4
1 50 0 NaN 5
2 NaN 10 NaN NaN
3 -100 -100 5 0
4 10 -60 0 100
5 20 NaN -20 NaN

在上述数据中,行代表客户唯一 ID,列代表一年中的特定日期,值代表该特定日期的贷记和借记净额。

例如,对于 day1 上的客户 ID = 1credit = 100debit = 50 因此净值为 50。零表示当天 credit = debit

NaN 在我的数据中简单地显示,在那一天,客户没有通过应用程序进行任何贷记或借记交易,这对我来说很重要。让NaN 成为NO INTERACTION的实例。

现在我的问题是如何告诉 scikit-learn python 中的 K-Means 将 NaN 值视为无交互?我不想消除 NaN 值。我也不想用平均值或中值替换 NaN 值。 NaN 值是我的附加信息,我如何保留这些信息?

【问题讨论】:

也许您可以为每一天添加一个列,指示当天是否有交互,如果有交互,则将其设置为 1,如果没有交互,则设置为 0。对于没有互动的日子,您将净信用列中的 nan 值替换为 0,因为当天的净信用为零。 这是related question。 【参考方案1】:
import numpy as np
df_no = df.replace(np.nan, 'no', regex=True)

【讨论】:

【参考方案2】:

k-means等聚类方法使用距离(Euclidean distance)进行计算。

要计算距离,你需要数字,所有的东西都必须是量化的。

确切地说,您必须删除那些或用最佳代表(中位数或平均值或 0)替换那些 NaN 值。

我该如何决定?

您认为哪个客户更接近 1 号客户?

客户 2、3 还是 4?

Customer ID day1 day2 day3 day4
1 50 0 NaN 5
2 50 0 0 5
3 50 0 median 5
4 50 0 mean 5

【讨论】:

以上是关于如何在聚类分析中处理空值?的主要内容,如果未能解决你的问题,请参考以下文章

GRG分析组 | 聚类简介第四部分:聚类算法

理论知识+Python实践 | 在聚类算法中,如何确定类簇的个数?

聚类分析之谱聚类

聚类方法的区别解读:各种聚类分析

NIPT聚类项目说明

为啥在聚类之前跨行而不是列来标准化(预处理)数据