程序员文章、书籍推荐和程序员创业信息与资源分享平台

网站首页 > 技术文章 正文

手把手教你用机器学习进行数据分析-聚类分析

hfteth 2025-02-16 20:59:23 技术文章 9 ℃

数据人学习平台上线了:www.shujurenclub.com

作者介绍

@吃饭第一名的 Claire

小红书ID:604627775(Claire的7788)

美国德克萨斯大学奥斯汀分校商学院硕士;

美国某消费者数据平台数据分析师;

美剧重度爱好者,坚信美食能解决大部分问题的终极吃货;

“数据人创作者联盟”成员。


本文适合有一定Python Pandas基础,但又对机器学习/数据分析感兴趣又不熟悉的朋友们。如果你对Pandas还不熟悉,戳这里查看之前写的有关用pandas进行数据清理的文章。希望通过本文的内容,你也可以独立做一个通过机器学习进行数据分析的项目。如果本文反响比较好,可能会考虑出个系列~


这个项目的数据是美国各个社区的犯罪数据(community crime data),里面有美国各个community (城市或者城镇或者县)的人口特征的数据(包括种族、年龄、家里几口人、有几个孩子等等)、经济情况(有多少人贫困、有多少人需要公共福利、平均收入、投资收入等等)、执法相关的数据(有多少巡警、有多少人报案、有多少警车) 和犯罪率(分为暴力犯罪率和非暴力犯罪率),一共2215行,每行代表一个community的情况。


分析的目标是对这些community 进行分类,看什么类别的community犯罪率高。进一步如果你想选择居住地或者警察需要分配警力都可以根据你分类的结果来做决策。

解决方案:

  • 这需要我们用机器学习里的聚类算法(clustering algorithm)来解决这个问题,我选择的是聚类算法里最常用的K-means clustering。

  • 编程语言: Python。

数据分析难点:

1.列非常多,有147列,这非常不利于我们应用一些机器学习模型,因为

  1. 维度的诅咒(Curse of Dimensionality):

    随着特征数量的增加,数据空间的维度增加,这可能导致样本数据在这个高维空间内稀疏分布。

    这意味着为了可靠地学习数据模式,需要大量的数据点。

    而且,在高维空间中,很多机器学习算法的性能会下降,因为距离(如欧几里得距离)在高维度中的计算变得不那么有效。

  2. 过拟合(Overfitting):

    当模型拥有大量特征时,它可能会学习到数据中的噪音而非真正的模式。

    这意味着模型可能在训练数据上表现得非常好,但是在未见过的新数据上表现不佳。

  3. 计算复杂度增加:

    更多的特征意味着更高的计算复杂度。

    这不仅增加了训练模型所需的时间和计算资源,也可能增加模型推理时的延迟。

  4. 可解释性降低:

    具有大量特征的模型往往难以解释和理解。

    这在需要模型透明度和可解释性的应用中是一个重要问题,比如在金融服务或医疗保健行业。

所以我会采用特征选择(feature selection)和特征降维(feature extraction)技术,以减少特征数量,同时保留最重要的信息。这有助于提高模型的性能和泛化能力,同时降低计算成本。

2.很多缺失值,这可能导致模型无法完全学习数据中的关系和模式,从而影响模型的准确性和可靠性。需要我们用合理的方法处理。


作者注:

  1. 这个项目中数据不是重点,你可以替换成任何你想分析的数据,但是分析思路和建模方法都是类似的,完全可以套用。

    聚类分析其实在市场营销中的个性化定向广告的应用上尤其广泛,相信大家也一定对消费者行为分类不陌生,聚类分析就是消费者分类 (customer segmentation)的典型应用。


读数据是再简单不过的事,在这里不做赘述。数据大概长下图的样子


1

数据清理

1.1 首先就是处理缺失值,从上图也可以看出很多缺失值用的问号,所以我们需要先做一步替换。这里有一列很多0也是应该换成,现实中很多时候数据表中的0也不是代表数字0,而是不知道是什么而自动填充的数字,这时候也需要先把0替换成,再查缺失值,要具体情况具体分析。


计算每列缺失值的百分比


我们会发现很多与执法相关的数据缺失。我选择处理缺失值的方法是:

1. 删除超过 50% 缺失值的列,因为插值(impute) 可能不可靠;

2. 对缺失值较少的列使用中位数进行插值,因为中位数比平均值对异常值更稳健。

这步骤之后我们还有123列。


1.2 移除与研究问题无关的列

我们想研究社区人口统计学(demographics)和社会经济学(socioeconomics)与犯罪率之间的关系,所以和这些指标没关系的列就被删除了。代码如下


在这次清理后,我们剩下了 68 个数值列(除去社区名,州名还有暴力和非暴力犯罪率)。在数据转换和标准化后,我还进一步进行了降维处理,稍后会具体讲解。


1.3 处理异常值和偏斜度 skewness.

我使用了箱形图(boxplot)来可视化异常值。由于变量众多,我选了一部分对研究问题影响最大的关键变量:比如人口统计特征中各个种族人的比例、年龄百分比、薪资中位数、就业率,犯罪率种的暴力犯罪人口比(ViolentCrimesPerPop)和非暴力犯罪人口比(nonViolPerPop)。箱形图显示了所选列中异常值的存在。异常值通常表现为超出箱形图须线的点。代码如下:


然而,在决定如何处理这些异常值之前,考虑数据的上下文是重要的。例如,在犯罪数据中,异常值可能代表实际的罕见或极端事件,对某些类型的分析可能很有价值,所以我决定不移除异常值,而是考虑对这次分析进行对数变换(log transformation),我计算了这些属性的偏斜度,并对偏斜度高的列(绝对值>1)进行了对数变换。代码如下:

其中负数代表列的数值分布是左偏斜(负偏斜),正数代表列的数值分布是右偏斜(正偏斜)。


1.4 标准化(Standardization)

是应用机器学习算法之前常见的预处理步骤,尤其是对数据规模敏感的算法,如 K 均值聚类 (k-means clustering)。我们对所有数值列进行了标准化,使它们的平均值为 0,标准差为 1。


02

特征降维(feature extraction)

考虑到我们仍有 68 个数值列,我考虑使用降维(dimensionality reduction)技术进一步精炼我们的列,并为 K 均值聚类做准备。这里我选择了主成分分析(PCA)进行降维。

PCA(主成分分析)通过创建“主成分”,将数据转换为新的坐标系统,这些主成分彼此正交(即不相关),并且是原始数据变量的线性组合。每个主成分都按照其解释数据方差的能力排序。第一个主成分解释了最多的方差,第二个主成分(与第一个正交)解释了其余方差中最多的部分,依此类推。以下代码表示27个主成分解释了数据95%的方差,第一个主成分单独解释了大约 28% 的方差,前两个主成分共解释了大约 45.8% 的方差。


下图是一个解释方差比率和主成分个数的可视化,用以展示数据集中每个主成分占据的方差比例。


我决定选前20个主成分为k-means clustering做准备。


也还可以进一步探索每个主成分代表的原数据列的含义:


上图x轴列出了原始列名,y轴代表了每个特征在主成分中的权重,条形的大小(正或负)表示原始列与主成分之间关系的强度。剩下三个主成分的图由于篇幅限制没做呈现。

1. **第一主成分**在如`population`(人口)、`racepctblack`(黑人比例)、`racePctHisp`(西班牙裔比例)等特征上有正的权重,在`racePctWhite`(白人比例)上有负的权重。这表明第一主成分可能代表着黑人和西班牙裔人口较多的地区与白人人口较多的地区之间的对比。


2. **第二主成分**:这个成分在`racePctAsian`(亚洲人比例)、`racePctHisp`、`PctForeignBorn`(外国出生比例)等特征上有显著的正权重,在`agePct65up`(65岁以上比例)和`PctBornSameState`(同州出生比例)上有负权重。这可能表明第二主成分对比的是年轻、多元化(特别是亚洲和西班牙裔)和更多外籍出生人口的地区与老年、较少多元化和更多本地出生人口的地区。


3. **第三主成分**:可能捕捉到年轻人口较多的地区与老年或更多西班牙裔和外籍出生人口的地区之间的对比。


4. **第四主成分**:它可能对比的是老年人口较多且可能拥有房屋和使用公共交通的地区。


每个主成分捕捉数据中不同方面的差异,它们在原始特征上的权重可以帮助我们理解每个成分代表的具体对比或模式。


03

K-均值聚类 (K-means clustering)

找到社区相似性并根据其简化的特征集(20 principal components)对社区进行划分。

3.1 使用肘部方法(elbow method)确定最佳簇数。这涉及到绘制簇内平方和(WCSS: within-cluster sum of squares)与簇数的关系图,并寻找减少速率急剧变化的“肘点”。从下面的图表中,我们确定簇数为 4。


3.2 对预处理后的数据集运用确定的簇数进行了 K-均值算法,并使用轮廓分数 (silhouette score)来评估 K-均值聚类结果的质量。

较高的轮廓分数表明簇之间分离得更好。我们的轮廓分数为 0.19,表明簇之间并不是非常明显但还是合理的。这个分数表明,尽管存在一定的分离,但簇之间并不是非常清晰地区分开。



3.3 为了解释每个簇的特征,我们在原始标准化数据框中添加了簇标签,并计算了每个簇内属性的平均值。

每个簇(cluster)可能代表的概要:

Cluster 0: 此群体有相对较高的亚洲人口,较大比例的年轻人,在这个群体中,暴力和非暴力犯罪率略高于平均水平。


Cluster 1: 以较高的黑人口为特征,老年人口比例较高且中等收入较低,教育程度低。贫困率、失业率、公共援助领取和离婚率都很高。这个群体可能代表着一个处于劣势的黑人社区。这个群体中的暴力和非暴力犯罪率都高于平均水平。


Cluster 2: 这个群体中,西班牙裔人口比例极高。人口年轻,21岁以下人口比例高。收入和教育程度低。贫困率、失业率和公共援助领取都很高,同时在制造业的就业也很高。这个群体似乎代表着一个处于劣势的西班牙裔社区。这个群体中暴力犯罪率明显较高,非暴力犯罪率也相对较高。


Cluster 3: 这个群体中,白人口比例高,中等收入、教育水平和管理/专业职业的就业率也高。然而,贫困率、失业率、公共援助领取和离婚率都非常低。Cluster 3代表一个富裕、繁荣的白人社区,它在所有群体中暴力犯罪率最低,非暴力犯罪率也低于平均水平。


3.4 如果你想进一步用可视化解释你的分类,可以任意选择你感觉比较重要的两列,然后进行下图的可视化,对角线上的图表示了不同cluster在该列的分布,比如图3行3列是外国人比重,其中绿色的cluster(即cluster2)是外国人最多的类。图3行3列是65岁以上的人比重,其中蓝色(即cluster1)是老年人更多的类。



由于篇幅限制没有对k-means进行过多的解释,但是把这些一步步做下来足够你面对相关的面试和解决一些实际问题了!


感谢阅读到这里的你。更多职场反思和美国生活分享,欢迎关注我的小红书账号



Tags:

最近发表
标签列表