用StackOverflow訪問數據實現主成分分析(PCA)

2021-01-14 人民日報

大數據文摘出品

編譯:汪小七、張馨月、雲舟

主成分分析(PCA:Principal Component Analysis)非常有助於我們理解高維數據,我利用Stack Overflow的每日訪問數據對主成分分析進行了實踐和探索,你可以在rstudio :: conf 2018上找到其中一篇演講的錄音。演講的重點主要是我對於PCA的理解,而這篇文章中,我將主要介紹我是如何實現PCA的,以及我是如何製作演講中使用到的圖表的。

rstudio :: conf 2018

https://www.rstudio.com/resources/videos/understanding-pca-using-shiny-and-stack-overflow-data/

高維數據

此次分析使用的是去年Stack Overflow上註冊用戶訪問量前500的標籤數據。為了簡化處理,本文只使用了10%的註冊流量數據進行分析,但實際上我已經對所有流量數據進行了類似的分析,並獲得了幾乎相同的結果。

標籤數據

https://stackoverflow.com/tags

現在,把每個註冊用戶都想像成高維空間中的一個點,空間的坐標軸是R、JavaScript、C++等技術。那麼,在這個高維空間中,做相似工作的人對應的點就會彼此接近。接下來PCA會把這個高維空間轉變成一個新的具有特殊特徵的「特殊」高維空間。

在資料庫中適當地抽取數據後,最開始的數據看起來就像下面這樣:

library(tidyverse)library(scales)tag_percents## # A tibble: 28,791,663 x 3## User Tag Value## ## 1 1 exception-handling 0.000948## 2 1 jsp 0.000948## 3 1 merge 0.00284## 4 1 casting 0.00569## 5 1 io 0.000948## 6 1 twitter-bootstrap-3 0.00569## 7 1 sorting 0.00474## 8 1 mysql 0.000948## 9 1 svg 0.000948## 10 1 model-view-controller 0.000948## # ... with 28,791,653 more rows

可以看出,數據很乾淨,每行只有用戶編號和技術標籤。這裡的User列是隨機ID,而非Stack Overflow的標識符。在Stack Overflow中,我們公開了大量數據,但流量數據(即哪些用戶訪問過哪些問題)是沒有公開的。

對高維數據進行真正的匿名化其實是非常困難的,而這裡為了進行脫敏處理,我的做法是隨機化數據順序,並用數字替換Stack Overflow的標識符。Value列表示過去一年該用戶對該標籤的瀏覽量佔該標籤總瀏覽量的比例。

部分數據連結:

https://stackoverflow.blog/2010/06/13/introducing-stack-exchange-data-explorer/

https://cloud.google.com/bigquery/public-data/stackoverflow,

https://meta.stackexchange.com/questions/19579/where-are-the-stack-exchange-data-dumps

先不考慮脫敏的問題,我們首先看看用戶主要瀏覽的技術標籤有哪些,這張圖表給了我們一個直觀的概念。.

tag_percents %>%group_by(Tag) %>% summarise(Value = mean(Value)) %>% arrange(desc(Value)) %>% top_n(15) %>% mutate(Tag = reorder(Tag, Value)) %>% ggplot(aes(Tag, Value, label = Tag, fill = Tag)) + geom_col(alpha = 0.9, show.legend = FALSE) + geom_text(aes(Tag, 0.001), hjust = 0, color = "white", size = 4, family = "IBMPlexSans-Bold") + coord_flip() + labs(x = NULL, y = "Average % of a user's traffic") + scale_y_continuous(labels = percent_format(), expand = c(0.015,0)) +theme(axis.text.y=element_blank())

實施PCA

我們喜歡乾淨的數據,一是因為它就是我們查詢資料庫的結果,二是因為它可用於實現PCA等機器學習算法的探索性數據分析。為了實現PCA,我們需要一個矩陣,在這個例子裡稀疏矩陣(sparse matrix)就是最佳選擇——因為大多數開發人員只訪問一小部分技術標籤,因此我們的矩陣中會有很多零。tidytext軟體包中有一個函數cast_sparse(),它可以把上面的數據轉換為稀疏矩陣。

sparse_tag_matrix %tidytext::cast_sparse(User, Tag, Value)

R中有幾個實現PCA的算法是體會不到稀疏矩陣的美感的,比如prcomp()——此算法的第一步就是將剛剛製作好的稀疏矩陣強制轉換成一個常規矩陣,然後你要在那裡幹坐一輩子等它運行完,因為在它運行的時候電腦根本沒有內存讓你去做其他事了(別問我是怎麼知道的)。當然,R中也有一個程序包利用了稀疏矩陣的優勢——irlba。

在建立模型前,也別忘記先用scale()函數將你的矩陣規範化,這對於PCA的實現非常重要。

tags_scaled tags_pca

其中prcomp_irlba()函數的參數n代表我們想要得到的主成分個數。

那麼這一步究竟發生了什麼?我們會在接下來的章節中慢慢介紹。

class(tags_pca)## [1] "irlba_prcomp" "prcomp"names(tags_pca)## [1] "scale" "totalvar" "sdev" "rotation" "center" "x"

相關焦點

  • 主成分分析PCA預測未知分類信息
    本文是用主成分分析的方法去預測未知樣本的信息。
  • R語言實現主成分分析
    通過正交變換將一組存在相關性的變量轉換為一組線性不相關的變量,變換之後的變量叫做主成分。在進行多變量的研究時,變量數量太多就會增加研究的複雜性。如果將一個變量比作一個維度,那麼多元數據可以看作由多個變量組成的多維空間內點的合集。在很多情形中,變量間存在一定的相關關係,因此研究者可以將多維度的數據降維,用新的排序軸去儘可能地反映原數據的信息。
  • 用 PCA 方法進行數據降維
    在進行數據分析時,我們往往會遇到多維數據,多維數據在處理時由於維度較大計算起來非常麻煩,這時我們需要對數據進行降維。而在所有降維方法中,PCA是我們最常用的方法之一,其在使用時可以消除指標間的相互影響,同時也不用考慮數據的分布,而且降維效果非常明顯,所以PCA可以在絕大多數情況下使用。而本文就是用python來解釋一下如何用PCA方法進行降維。
  • 使用PCA可視化數據
    它通過從多個特徵構造所謂的主成分(PC)來實現這一點。PC的構造方式使得PC1方向在最大變化上儘可能地解釋了你的特徵。然後PC2在最大變化上儘可能地解釋剩餘特徵,等等……PC1和PC2通常可以解釋總體特徵變化中的很大一部分。另一種思考方法是,前兩個PC可以很好地概括大部分特徵。這很重要,因為正如我們將看到的,它允許我們在二維平面上可視化數據的分類能力。
  • 原理+代碼|Python基於主成分分析的客戶信貸評級實戰
    如果我們分別對每個指標進行分析,往往得到的結論是孤立的,並不能完全利用數據蘊含的信息。但是盲目的減少我們分析的指標,又會損失很多有用的信息。所以我們需要找到一種合適的方法,一方面可以減少分析指標,另一方面儘量減少原指標信息的損失。
  • 通俗易懂的講解奇異值分解(SVD)和主成分分析(PCA)
    對稱矩陣的特徵分解奇異值分解(The Singular Value Decomposition,SVD)主成分分析主成分分析法(PCA)——特徵提取PCA在機器學習中是一種常用的無監督學習算法,它通過構建一種被稱為主成分的變量,並將所用到的所有向量映射到由主成分變量構建的空間上去,從而能夠減少數據的維度。
  • R語言做主成分分析實例
    在做多樣本的RNA-Seq數據中經常會用到主成分分析(PCA)來分析,那麼什麼是PCA呢,這個可以百度一下,大概意思如下:主成分分析法是數據挖掘中常用的一種降維算法
  • 聚類樹和PCA等排序圖的組合繪製
    聚類分析和排序分析(降維分析)都是用於探索多元數據結構的常用方法,二者的結果也可以結合在一起通過一張圖呈現,本篇展示一些常見的示例。https://pan.baidu.com/s/1dQxyRcBuGDoec9ZKm77Y6w示例數據包含15個樣本(對象),20個變量,下文對它執行聚類和降維,並作圖展示。
  • 數據分析之主成分分析,spss主成分分析實例
    一、主成分分析概要主成分分析,在進行有多個指標的綜合評定時,客觀全面的綜合評價結果非常重要,然而往往多個指標之間通常存在信息不統一或者重複等眾多因素,各指標的權重往往很難確認。主成分分析方法能夠解決以上問題,主成分分析法是一種降維的統計方法,是考察多個變量間相關性一種多元統計方法。二、spss主成分分析操作流程導入數據。
  • 使用python+sklearn實現概率PCA和因子分析進行模型選擇
    概率PCA和因子分析都是概率模型,新數據的似然性(likelihood)可用於模型選擇和協方差估計
  • 看看 Stack Overflow 的最新調查
    最新的計算器除了增加新的國家和地區之外,還更新了數字數據。更新後的薪資計算器新增了 8 個國家和地區的數據,以及更能反映開發者收入的最新數據。所以,想知道自己的技術能力值多少錢?不妨試用一下 Stack Overflow 2018 年最新的薪資計算器(https://stackoverflow.com/jobs/salary)。
  • 單細胞數據分析神器——Seurat
    今天小編向大家簡單一個實用並且易上手的單細胞數據分析軟體——Seurat,大家躺在床上為國家做貢獻的同時也能get新技能。介紹一下今天的主角,Seurat是由New York Genome Center, Satija Lab開發的單細胞數據分析集成軟體包。
  • 機器學習數據降維方法:PCA主成分分析
    PCA在機器學習中很常用,是一種無參數的數據降維方法。PCA的推導PCA通過線性變換將原始數據變換為一組各維度線性無關的表示,可用於提取數據的主要特徵分量,常用於高維數據的降維。我們知道PCA是一種數據降維的方法,在降低維度的過程中,我們當然想要保留更多的特徵,PCA就是經過數學推導,保留最多特徵同時降維的方法。
  • 教程| 從特徵分解到協方差矩陣:詳細剖析和實現PCA算法
    機器之心編譯參與:蔣思源本文先簡要明了地介紹了特徵向量和其與矩陣的關係,然後再以其為基礎解釋協方差矩陣和主成分分析法的基本概念,最後我們結合協方差矩陣和主成分分析法實現數據降維。本文不僅僅是從理論上闡述各種重要概念,同時最後還一步步使用 Python 實現數據降維。首先本文的特徵向量是數學概念上的特徵向量,並不是指由輸入特徵值所組成的向量。
  • 這篇Nature子刊文章的蛋白組學數據PCA分析竟花費了我兩天時間來重現|附全過程代碼
    PCA plots were derived using 18 naive and 17 memory T cells samples 」我們需要復現該圖之前,先需要下載數據,可以點擊https://www.opentargets.org/projects/effectorness對proteomics的abundances數據和metadata數據進行下載,然後進行以下步驟:
  • 給定一系列訓練集數據並且對其進行訓練
    這個數據集裡包含了23000條數據(48個主題),每一條數據包含1行和1列的標籤。訓練集中以平均值為自變量,最大值為因變量,n是特徵數量。首先,我們對獲取的特徵進行主成分分析(pca)。以上圖為例子,該特徵包含一個坐標,一條線,一個列,一個方向。每一列的值為1/13。為什麼需要pca?原因在於最小二乘法的假設函數是一個線性方程組,如果直接用最小二乘法的擬合方法求解,會有誤差存在。
  • spss主成分怎麼進行分析?spss主成分分析法步驟
    spss 這款軟體功能非常多哦,還可以分析主成分哦,但是很多朋友不知道spss主成分怎麼進行分析?小編下面準備了spss主成分分析法詳細步驟,大家安裝 詳細步驟一步步操作就知道spss主成分怎麼進行分析?
  • 運用sklearn進行線性判別分析(LDA)代碼實現
    基於sklearn的線性判別分析(LDA)代碼實現一、前言及回顧本文記錄使用sklearn庫實現有監督的數據降維技術——線性判別分析(LDA)。在上一篇LDA線性判別分析原理及python應用(葡萄酒案例分析),我們通過詳細的步驟理解LDA內部邏輯實現原理,能夠更好地掌握線性判別分析的內部機制。
  • SPSS超詳細教程:主成分分析
    針對這種情況,我們可以進行主成分提取,但需要先滿足2項假設:  假設1:觀測變量是連續變量或有序分類變量,如本研究中的測量變量都是有序分類變量。  假設2:變量之間存在線性相關關係。  經分析,本研究數據符合假設1,那麼應該如何檢驗假設2,並進行主成分提取呢?
  • 一文理清主成分分析思路
    主成分分析是一種濃縮數據信息的方法,可將很多個指標濃縮成綜合指標(主成分),並保證這些綜合指標彼此之間互不相關。可用於簡化數據信息濃縮、計算權重、競爭力評價等。一、研究背景某研究想要了解各地區高等教育發展水平的綜合排名。從中選取30個地區10個評價指標,使用主成分分析進行降維,並計算綜合得分。