You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

销售数据离群值处理:Tukey(IQR)检测后聚类分析可行性问询

可行性分析

当然可以用聚类算法对已识别的离群值做单独分析,这种“先标记离群值,再对异常样本聚类”的两步思路,在交易数据预处理中完全可行——尤其是当你想保留离群值并挖掘其潜在业务模式时(比如大额异常交易、跨区域高频交易等),聚类能帮你把离群值分成不同的异常集群,和正常数据集群清晰区分开。

从学术角度,这种方法站得住脚,只要你明确说明两个核心依据:1)用Tukey IQR识别离群值的合理性(比如符合交易数据的分布特性);2)选择聚类算法的逻辑(比如针对离群值稀疏分布的特点选DBSCAN而非K-Means)。

参考文献建议
  • Chandola, V., Banerjee, A., & Kumar, V. (2009). Anomaly detection: A survey. ACM computing surveys (CSUR), 41(3), 1-58. (领域权威综述,明确提到对异常样本聚类以挖掘潜在模式的方法)
  • Han, J., Pei, J., & Kamber, M. (2011). Data mining: concepts and techniques. Morgan kaufmann. (书中离群值分析章节,讨论了聚类与离群值结合的应用场景)
  • 聚焦交易数据的话,可参考IEEE TKDE或ACM SIGKDD上的相关研究,比如《Clustering-Based Anomaly Detection for Financial Transactions》这类主题的论文,很多都采用了类似的预处理思路。
Python代码实现示例

以下是基于pandas、numpy和scikit-learn的完整流程代码:

1. 加载数据并通过Tukey IQR标记离群值

import pandas as pd
import numpy as np
from sklearn.cluster import DBSCAN
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt

# 加载交易数据(假设包含交易ID、金额、频率等特征)
df = pd.read_csv('transaction_data.csv')

# 选择用于检测离群值的核心数值特征(以交易金额为例)
target_feature = 'amount'
feature_data = df[[target_feature]]

# 计算Tukey IQR的上下限
q1 = feature_data.quantile(0.25)
q3 = feature_data.quantile(0.75)
iqr = q3 - q1
lower_bound = q1 - 1.5 * iqr
upper_bound = q3 + 1.5 * iqr

# 标记离群值:1为离群,0为正常
df['is_outlier'] = np.where((feature_data < lower_bound) | (feature_data > upper_bound), 1, 0)

2. 分离数据并对离群值做聚类

# 拆分离群值与正常数据集
outliers = df[df['is_outlier'] == 1].reset_index(drop=True)
normal_data = df[df['is_outlier'] == 0].reset_index(drop=True)

# 对离群值的多特征做标准化(聚类前建议统一特征尺度)
scaler = StandardScaler()
# 假设选取交易金额、交易频率两个特征做聚类
outliers_scaled = scaler.fit_transform(outliers[['amount', 'transaction_frequency']])

# 使用DBSCAN聚类(适合稀疏分布的离群值,无需预设聚类数)
dbscan = DBSCAN(eps=0.5, min_samples=2)
outliers['cluster_label'] = dbscan.fit_predict(outliers_scaled)

# 将聚类标签整合回原数据集(正常数据的聚类标签设为-2,与异常集群区分)
df = pd.merge(df, outliers[['transaction_id', 'cluster_label']], on='transaction_id', how='left')
df['cluster_label'] = df['cluster_label'].fillna(-2)

3. 可视化聚类结果(可选)

plt.figure(figsize=(10,6))
# 绘制正常数据
plt.scatter(normal_data['transaction_frequency'], normal_data['amount'], c='gray', label='Normal Data', alpha=0.5)
# 绘制不同集群的离群值
unique_clusters = outliers['cluster_label'].unique()
colors = plt.cm.get_cmap('tab10', len(unique_clusters))
for idx, cluster in enumerate(unique_clusters):
    cluster_samples = outliers[outliers['cluster_label'] == cluster]
    plt.scatter(cluster_samples['transaction_frequency'], cluster_samples['amount'], c=colors(idx), label=f'Outlier Cluster {cluster}', alpha=0.8)
plt.xlabel('Transaction Frequency')
plt.ylabel('Transaction Amount')
plt.legend()
plt.title('Clustering Result of Transactions')
plt.show()
关键注意事项
  • 聚类算法选择:如果离群值是密集小群体,可尝试K-Means(需用肘部法则确定聚类数);如果离群值分布稀疏,优先选DBSCAN或HDBSCAN,无需预设聚类数,能自动识别噪声中的有效集群。
  • 特征选择:聚类时建议结合多维度业务特征(如交易时间间隔、交易地点编码等),单一特征的聚类价值有限,多特征组合能挖掘更有意义的异常模式。
  • 学术严谨性:论文中需明确说明聚类算法的选择依据,以及聚类结果的业务解释,强化预处理环节的合理性。

内容的提问来源于stack exchange,提问作者Niusha Amri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 22:50:28