
如何對(duì)混合型數(shù)據(jù)做聚類分析
利用聚類分析,我們可以很容易地看清數(shù)據(jù)集中樣本的分布情況。以往介紹聚類分析的文章中通常只介紹如何處理連續(xù)型變量,這些文字并沒(méi)有過(guò)多地介紹如何處理混合型數(shù)據(jù)(如同時(shí)包含連續(xù)型變量、名義型變量和順序型變量的數(shù)據(jù))。本文將利用 Gower 距離、PAM(partitioning around medoids)算法和輪廓系數(shù)來(lái)介紹如何對(duì)混合型數(shù)據(jù)做聚類分析。
R語(yǔ)言
本文主要分為三個(gè)部分:
距離計(jì)算
聚類算法的選擇
聚類個(gè)數(shù)的選擇
為了介紹方便,本文直接使用 ISLR 包中的 College 數(shù)據(jù)集。該數(shù)據(jù)集包含了自 1995 年以來(lái)美國(guó)大學(xué)的 777 條數(shù)據(jù),其中主要有以下幾個(gè)變量:
連續(xù)型變量
錄取率
學(xué)費(fèi)
新生數(shù)量
分類型變量
公立或私立院校
是否為高水平院校,即所有新生中畢業(yè)于排名前 10% 高中的新生數(shù)量占比是否大于 50%
本文中涉及到的R包有:
In [3]:
set.seed(1680) # 設(shè)置隨機(jī)種子,使得本文結(jié)果具有可重現(xiàn)性
library(dplyr)
library(ISLR)
library(cluster)
library(Rtsne)
library(ggplot2)
Attaching package: ‘dplyr’
The following objects are masked from ‘package:stats’:
filter, lag
The following objects are masked from ‘package:base’:
intersect, setdiff, setequal, union
構(gòu)建聚類模型之前,我們需要做一些數(shù)據(jù)清洗工作:
錄取率等于錄取人數(shù)除以總申請(qǐng)人數(shù)
判斷某個(gè)學(xué)校是否為高水平院校,需要根據(jù)該學(xué)校的所有新生中畢業(yè)于排名前 10% 高中的新生數(shù)量占比是否大于 50% 來(lái)決定
In [5]:
college_clean <- College %>%
mutate(name = row.names(.),
accept_rate = Accept/Apps,
isElite = cut(Top10perc,
breaks = c(0, 50, 100),
labels = c("Not Elite", "Elite"),
include.lowest = TRUE)) %>%
mutate(isElite = factor(isElite)) %>%
select(name, accept_rate, Outstate, Enroll,
Grad.Rate, Private, isElite)
glimpse(college_clean)
Observations: 777
Variables: 7
$ name (chr) "Abilene Christian University", "Adelphi University", "...
$ accept_rate (dbl) 0.7421687, 0.8801464, 0.7682073, 0.8369305, 0.7564767, ...
$ Outstate (dbl) 7440, 12280, 11250, 12960, 7560, 13500, 13290, 13868, 1...
$ Enroll (dbl) 721, 512, 336, 137, 55, 158, 103, 489, 227, 172, 472, 4...
$ Grad.Rate (dbl) 60, 56, 54, 59, 15, 55, 63, 73, 80, 52, 73, 76, 74, 68,...
$ Private (fctr) Yes, Yes, Yes, Yes, Yes, Yes, Yes, Yes, Yes, Yes, Yes,...
$ isElite (fctr) Not Elite, Not Elite, Not Elite, Elite, Not Elite, Not...
距離計(jì)算
聚類分析的第一步是定義樣本之間距離的度量方法,最常用的距離度量方法是歐式距離。然而歐氏距離只適用于連續(xù)型變量,所以本文將采用另外一種距離度量方法—— Gower 距離。
Gower 距離
Gower 距離的定義非常簡(jiǎn)單。首先每個(gè)類型的變量都有特殊的距離度量方法,而且該方法會(huì)將變量標(biāo)準(zhǔn)化到[0,1]之間。接下來(lái),利用加權(quán)線性組合的方法來(lái)計(jì)算最終的距離矩陣。不同類型變量的計(jì)算方法如下所示:
連續(xù)型變量:利用歸一化的曼哈頓距離
順序型變量:首先將變量按順序排列,然后利用經(jīng)過(guò)特殊調(diào)整的曼哈頓距離
名義型變量:首先將包含 k 個(gè)類別的變量轉(zhuǎn)換成 k 個(gè) 0-1 變量,然后利用 Dice 系數(shù)做進(jìn)一步的計(jì)算
優(yōu)點(diǎn):通俗易懂且計(jì)算方便
缺點(diǎn):非常容易受無(wú)標(biāo)準(zhǔn)化的連續(xù)型變量異常值影響,所以數(shù)據(jù)轉(zhuǎn)換過(guò)程必不可少;該方法需要耗費(fèi)較大的內(nèi)存
利用 daisy 函數(shù),我們只需要一行代碼就可以計(jì)算出 Gower 距離。需要注意的是,由于新生入學(xué)人數(shù)是右偏變量,我們需要對(duì)其做對(duì)數(shù)轉(zhuǎn)換。daisy 函數(shù)內(nèi)置了對(duì)數(shù)轉(zhuǎn)換的功能,你可以調(diào)用幫助文檔來(lái)獲取更多的參數(shù)說(shuō)明。
In [6]:
# Remove college name before clustering
gower_dist <- daisy(college_clean[, -1],
metric = "gower",
type = list(logratio = 3))
# Check attributes to ensure the correct methods are being used
# (I = interval, N = nominal)
# Note that despite logratio being called,
# the type remains coded as "I"
summary(gower_dist)
Out[6]:
301476 dissimilarities, summarized :
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.0018601 0.1034400 0.2358700 0.2314500 0.3271400 0.7773500
Metric : mixed ; Types = I, I, I, I, N, N
Number of objects : 777
此外,我們可以通過(guò)觀察最相似和最不相似的樣本來(lái)判斷該度量方法的合理性。本案例中,圣托馬斯大學(xué)和約翰卡羅爾大學(xué)最相似,而俄克拉荷馬科技和藝術(shù)大學(xué)和哈佛大學(xué)差異最大。
In [7]:
gower_mat <- as.matrix(gower_dist)
# Output most similar pair
college_clean[
which(gower_mat == min(gower_mat[gower_mat != min(gower_mat)]),
arr.ind = TRUE)[1, ], ]
Out[7]:
In [8]:
# Output most dissimilar pair
college_clean[
which(gower_mat == max(gower_mat[gower_mat != max(gower_mat)]),
arr.ind = TRUE)[1, ], ]
Out[8]:
聚類算法的選擇
現(xiàn)在我們已經(jīng)計(jì)算好樣本間的距離矩陣,接下來(lái)需要選擇一個(gè)合適的聚類算法,本文采用 PAM(partioniong around medoids)算法來(lái)構(gòu)建模型:
PAM 算法的主要步驟:
隨機(jī)選擇 k 個(gè)數(shù)據(jù)點(diǎn),并將其設(shè)為簇中心點(diǎn)
遍歷所有樣本點(diǎn),并將樣本點(diǎn)歸入最近的簇中
對(duì)每個(gè)簇而言,找出與簇內(nèi)其他點(diǎn)距離之和最小的點(diǎn),并將其設(shè)為新的簇中心點(diǎn)
重復(fù)第2步,直到收斂
該算法和 K-means 算法非常相似。事實(shí)上,除了中心點(diǎn)的計(jì)算方法不同外,其他步驟都完全一致 。
優(yōu)點(diǎn):簡(jiǎn)單易懂且不易受異常值所影響
缺點(diǎn):算法時(shí)間復(fù)雜度為 O(n2)O(n2)
聚類個(gè)數(shù)的選擇
我們將利用輪廓系數(shù)來(lái)確定最佳的聚類個(gè)數(shù),輪廓系數(shù)是一個(gè)用于衡量聚類離散度的內(nèi)部指標(biāo),該指標(biāo)的取值范圍是[-1,1],其數(shù)值越大越好。通過(guò)比較不同聚類個(gè)數(shù)下輪廓系數(shù)的大小,我們可以看出當(dāng)聚類個(gè)數(shù)為 3 時(shí),聚類效果最好。
In [9]:
# Calculate silhouette width for many k using PAM
sil_width <- c(NA)
for(i in 2:10){
pam_fit <- pam(gower_dist,
diss = TRUE,
k = i)
sil_width[i] <- pam_fit$silinfo$avg.width
}
# Plot sihouette width (higher is better)
plot(1:10, sil_width,
xlab = "Number of clusters",
ylab = "Silhouette Width")
lines(1:10, sil_width)
聚類結(jié)果解釋
描述統(tǒng)計(jì)量
聚類完畢后,我們可以調(diào)用 summary 函數(shù)來(lái)查看每個(gè)簇的匯總信息。從這些匯總信息中我們可以看出:簇1主要是中等學(xué)費(fèi)且學(xué)生規(guī)模較小的私立非頂尖院校,簇2主要是高收費(fèi)、低錄取率且高畢業(yè)率的私立頂尖院校,而簇3則是低學(xué)費(fèi)、低畢業(yè)率且學(xué)生規(guī)模較大的公立非頂尖院校。
In [18]:
pam_fit <- pam(gower_dist, diss = TRUE, k = 3)
pam_results <- college_clean %>%
dplyr::select(-name) %>%
mutate(cluster = pam_fit$clustering) %>%
group_by(cluster) %>%
do(the_summary = summary(.))
print(pam_results$the_summary)
[[1]]
accept_rate Outstate Enroll Grad.Rate Private
Min. :0.3283 Min. : 2340 Min. : 35.0 Min. : 15.00 No : 0
1st Qu.:0.7225 1st Qu.: 8842 1st Qu.: 194.8 1st Qu.: 56.00 Yes:500
Median :0.8004 Median :10905 Median : 308.0 Median : 67.50
Mean :0.7820 Mean :11200 Mean : 418.6 Mean : 66.97
3rd Qu.:0.8581 3rd Qu.:13240 3rd Qu.: 484.8 3rd Qu.: 78.25
Max. :1.0000 Max. :21700 Max. :4615.0 Max. :118.00
isElite cluster
Not Elite:500 Min. :1
Elite : 0 1st Qu.:1
Median :1
Mean :1
3rd Qu.:1
Max. :1
[[2]]
accept_rate Outstate Enroll Grad.Rate Private
Min. :0.1545 Min. : 5224 Min. : 137.0 Min. : 54.00 No : 4
1st Qu.:0.4135 1st Qu.:13850 1st Qu.: 391.0 1st Qu.: 77.00 Yes:65
Median :0.5329 Median :17238 Median : 601.0 Median : 89.00
Mean :0.5392 Mean :16225 Mean : 882.5 Mean : 84.78
3rd Qu.:0.6988 3rd Qu.:18590 3rd Qu.:1191.0 3rd Qu.: 94.00
Max. :0.9605 Max. :20100 Max. :4893.0 Max. :100.00
isElite cluster
Not Elite: 0 Min. :2
Elite :69 1st Qu.:2
Median :2
Mean :2
3rd Qu.:2
Max. :2
[[3]]
accept_rate Outstate Enroll Grad.Rate Private
Min. :0.3746 Min. : 2580 Min. : 153 Min. : 10.00 No :208
1st Qu.:0.6423 1st Qu.: 5295 1st Qu.: 694 1st Qu.: 46.00 Yes: 0
Median :0.7458 Median : 6598 Median :1302 Median : 54.50
Mean :0.7315 Mean : 6698 Mean :1615 Mean : 55.42
3rd Qu.:0.8368 3rd Qu.: 7748 3rd Qu.:2184 3rd Qu.: 65.00
Max. :1.0000 Max. :15516 Max. :6392 Max. :100.00
isElite cluster
Not Elite:199 Min. :3
Elite : 9 1st Qu.:3
Median :3
Mean :3
3rd Qu.:3
Max. :3
PAM 算法的另一個(gè)優(yōu)點(diǎn)是各個(gè)簇的中心點(diǎn)是實(shí)際的樣本點(diǎn)。從聚類結(jié)果中我們可以看出,圣弗朗西斯大學(xué)是簇1 的中心點(diǎn),巴朗德學(xué)院是簇2 的中心點(diǎn),而密歇根州州立大學(xué)河谷大學(xué)是簇3 的中心點(diǎn)。
In [19]:
college_clean[pam_fit$medoids, ]
Out[19]:
可視化方法
t-SNE 是一種降維方法,它可以在保留聚類結(jié)構(gòu)的前提下,將多維信息壓縮到二維或三維空間中。借助t-SNE我們可以將 PAM 算法的聚類結(jié)果繪制出來(lái),有趣的是私立頂尖院校和公立非頂尖院校這兩個(gè)簇中間存在一個(gè)小聚類簇。
In [22]:
tsne_obj <- Rtsne(gower_dist, is_distance = TRUE)
tsne_data <- tsne_obj$Y %>%
data.frame() %>%
setNames(c("X", "Y")) %>%
mutate(cluster = factor(pam_fit$clustering),
name = college_clean$name)
ggplot(aes(x = X, y = Y), data = tsne_data) +
geom_point(aes(color = cluster))
進(jìn)一步探究可以發(fā)現(xiàn),這一小簇主要包含一些競(jìng)爭(zhēng)力較強(qiáng)的公立院校,比如弗吉尼亞大學(xué)和加州大學(xué)伯克利分校。雖然無(wú)法通過(guò)輪廓系數(shù)指標(biāo)來(lái)證明多分一類是合理的,但是這 13 所院校的確顯著不同于其他三個(gè)簇的院校。
In [25]:
tsne_data %>%
filter(X > 15 & X < 25,
Y > -15 & Y < -10) %>%
left_join(college_clean, by = "name") %>%
collect %>%
.[["name"]]
Out[25]:
‘Kansas State University’
‘North Carolina State University at Raleigh’
‘Pennsylvania State Univ. Main Campus’
‘SUNY at Buffalo’
‘Texas A&M Univ. at College Station’
‘University of Georgia’
‘University of Kansas’
‘University of Maryland at College Park’
‘University of Minnesota Twin Cities’
‘University of Missouri at Columbia’
‘University of Tennessee at Knoxville’
‘University of Texas at Austin’
數(shù)據(jù)分析咨詢請(qǐng)掃描二維碼
若不方便掃碼,搜微信號(hào):CDAshujufenxi
DSGE 模型中的 Et:理性預(yù)期算子的內(nèi)涵、作用與應(yīng)用解析 動(dòng)態(tài)隨機(jī)一般均衡(Dynamic Stochastic General Equilibrium, DSGE)模 ...
2025-09-17Python 提取 TIF 中地名的完整指南 一、先明確:TIF 中的地名有哪兩種存在形式? 在開(kāi)始提取前,需先判斷 TIF 文件的類型 —— ...
2025-09-17CDA 數(shù)據(jù)分析師:解鎖表結(jié)構(gòu)數(shù)據(jù)特征價(jià)值的專業(yè)核心 表結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 規(guī)范存儲(chǔ)的結(jié)構(gòu)化數(shù)據(jù),如數(shù)據(jù)庫(kù)表、Excel 表、 ...
2025-09-17Excel 導(dǎo)入數(shù)據(jù)含缺失值?詳解 dropna 函數(shù)的功能與實(shí)戰(zhàn)應(yīng)用 在用 Python(如 pandas 庫(kù))處理 Excel 數(shù)據(jù)時(shí),“缺失值” 是高頻 ...
2025-09-16深入解析卡方檢驗(yàn)與 t 檢驗(yàn):差異、適用場(chǎng)景與實(shí)踐應(yīng)用 在數(shù)據(jù)分析與統(tǒng)計(jì)學(xué)領(lǐng)域,假設(shè)檢驗(yàn)是驗(yàn)證研究假設(shè)、判斷數(shù)據(jù)差異是否 “ ...
2025-09-16CDA 數(shù)據(jù)分析師:掌控表格結(jié)構(gòu)數(shù)據(jù)全功能周期的專業(yè)操盤(pán)手 表格結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 存儲(chǔ)的結(jié)構(gòu)化數(shù)據(jù),如 Excel 表、數(shù)據(jù) ...
2025-09-16MySQL 執(zhí)行計(jì)劃中 rows 數(shù)量的準(zhǔn)確性解析:原理、影響因素與優(yōu)化 在 MySQL SQL 調(diào)優(yōu)中,EXPLAIN執(zhí)行計(jì)劃是核心工具,而其中的row ...
2025-09-15解析 Python 中 Response 對(duì)象的 text 與 content:區(qū)別、場(chǎng)景與實(shí)踐指南 在 Python 進(jìn)行 HTTP 網(wǎng)絡(luò)請(qǐng)求開(kāi)發(fā)時(shí)(如使用requests ...
2025-09-15CDA 數(shù)據(jù)分析師:激活表格結(jié)構(gòu)數(shù)據(jù)價(jià)值的核心操盤(pán)手 表格結(jié)構(gòu)數(shù)據(jù)(如 Excel 表格、數(shù)據(jù)庫(kù)表)是企業(yè)最基礎(chǔ)、最核心的數(shù)據(jù)形態(tài) ...
2025-09-15Python HTTP 請(qǐng)求工具對(duì)比:urllib.request 與 requests 的核心差異與選擇指南 在 Python 處理 HTTP 請(qǐng)求(如接口調(diào)用、數(shù)據(jù)爬取 ...
2025-09-12解決 pd.read_csv 讀取長(zhǎng)浮點(diǎn)數(shù)據(jù)的科學(xué)計(jì)數(shù)法問(wèn)題 為幫助 Python 數(shù)據(jù)從業(yè)者解決pd.read_csv讀取長(zhǎng)浮點(diǎn)數(shù)據(jù)時(shí)的科學(xué)計(jì)數(shù)法問(wèn)題 ...
2025-09-12CDA 數(shù)據(jù)分析師:業(yè)務(wù)數(shù)據(jù)分析步驟的落地者與價(jià)值優(yōu)化者 業(yè)務(wù)數(shù)據(jù)分析是企業(yè)解決日常運(yùn)營(yíng)問(wèn)題、提升執(zhí)行效率的核心手段,其價(jià)值 ...
2025-09-12用 SQL 驗(yàn)證業(yè)務(wù)邏輯:從規(guī)則拆解到數(shù)據(jù)把關(guān)的實(shí)戰(zhàn)指南 在業(yè)務(wù)系統(tǒng)落地過(guò)程中,“業(yè)務(wù)邏輯” 是連接 “需求設(shè)計(jì)” 與 “用戶體驗(yàn) ...
2025-09-11塔吉特百貨孕婦營(yíng)銷案例:數(shù)據(jù)驅(qū)動(dòng)下的精準(zhǔn)零售革命與啟示 在零售行業(yè) “流量紅利見(jiàn)頂” 的當(dāng)下,精準(zhǔn)營(yíng)銷成為企業(yè)突圍的核心方 ...
2025-09-11CDA 數(shù)據(jù)分析師與戰(zhàn)略 / 業(yè)務(wù)數(shù)據(jù)分析:概念辨析與協(xié)同價(jià)值 在數(shù)據(jù)驅(qū)動(dòng)決策的體系中,“戰(zhàn)略數(shù)據(jù)分析”“業(yè)務(wù)數(shù)據(jù)分析” 是企業(yè) ...
2025-09-11Excel 數(shù)據(jù)聚類分析:從操作實(shí)踐到業(yè)務(wù)價(jià)值挖掘 在數(shù)據(jù)分析場(chǎng)景中,聚類分析作為 “無(wú)監(jiān)督分組” 的核心工具,能從雜亂數(shù)據(jù)中挖 ...
2025-09-10統(tǒng)計(jì)模型的核心目的:從數(shù)據(jù)解讀到?jīng)Q策支撐的價(jià)值導(dǎo)向 統(tǒng)計(jì)模型作為數(shù)據(jù)分析的核心工具,并非簡(jiǎn)單的 “公式堆砌”,而是圍繞特定 ...
2025-09-10CDA 數(shù)據(jù)分析師:商業(yè)數(shù)據(jù)分析實(shí)踐的落地者與價(jià)值創(chuàng)造者 商業(yè)數(shù)據(jù)分析的價(jià)值,最終要在 “實(shí)踐” 中體現(xiàn) —— 脫離業(yè)務(wù)場(chǎng)景的分 ...
2025-09-10機(jī)器學(xué)習(xí)解決實(shí)際問(wèn)題的核心關(guān)鍵:從業(yè)務(wù)到落地的全流程解析 在人工智能技術(shù)落地的浪潮中,機(jī)器學(xué)習(xí)作為核心工具,已廣泛應(yīng)用于 ...
2025-09-09SPSS 編碼狀態(tài)區(qū)域中 Unicode 的功能與價(jià)值解析 在 SPSS(Statistical Product and Service Solutions,統(tǒng)計(jì)產(chǎn)品與服務(wù)解決方案 ...
2025-09-09