PCA 主成分分析(Principal Component Analysis) - HackMD
文章推薦指數: 80 %
【範例1】分析每隻隊伍對不同武器的關係. col(var):武器; row(ind):隊伍. 資料介紹.
Published
LinkedwithGitHub
Like1
Bookmark
Subscribe
---
GA:UA-159972578-2
---
######tags:`R``PCA``PrincipalComponentAnalysis``Visualization``尺度縮減``主成分分析``資料前處理`
#PCA主成分分析(PrincipalComponentAnalysis)
看code完整執行結果:[RpubsVer.](https://rpubs.com/RitaTang/pca)
[PlaywithPCAShinyApp](http://ba.cm.nsysu.edu.tw:4949/tonychuo/PCA.Rmd)
![](https://i.imgur.com/gleUY4k.png)
+O&M和environmentalsurvey方向完全相反,代表兩個變數負相關
+cabel和environmentalsurvey呈現直角,代表互相獨立
![](https://i.imgur.com/DMInQIp.png)
+兩段式趨勢分析
+期數可以自訂,這裡只做了兩段,可以看出兩期間移動的軌跡
##何謂PCA
+一種尺度縮減的方法
+將高維度資料降至低維度資料
+降維的過程中,保持資料裡每個變數的變異性
+一顆西瓜有很多種切法/切面,找出從哪個切面可以看到最多西瓜籽
+先從資訊保留量最大的方向壓縮(保留資料變數之間的變異性)
+通常在壓第一次的時候就解釋了60-80%的變異
+再往能保留最多資訊的方向繼續壓縮(邊際效果遞減)
+![](https://i.imgur.com/uSN84An.png)
+![](https://i.imgur.com/0pdFBOn.png)
+做PCA可以看到:
+變數v.s變數的關係
+獨立(直角)
+正相關(在同一側)
+負相關(在反方向)
+資料點v.s變數
+資料點在變數間表現突出(outlier)
+資料點v.s資料點
+Cluster:點與點靠得很近為一群(組內差異小,組間差異大)
+用於競爭/策略分析
+不用再一張一張圖去畫、放在一起看(太慢又太多維度組合要畫)
+將資料所有的變數投射在一個平面上觀察整體趨勢
+加上時間因素可以看出移動方向/趨勢
+看得到對手和自己的定位變化
+決定自己未來要往哪裡去
##【範例1】分析每隻隊伍對不同武器的關係
+col(var):武器
+row(ind):隊伍
###資料介紹
+遊戲比賽的資料,有13隻隊伍對於5個武器的使用量及獲勝的比率
+tot_rate:各隊伍整體獲勝的比率
+xxx_rate:各隊伍使用各類武器的獲勝的比率
+xxx_num:武器的使用量
###讀取資料
```{recho=FALSE}
pacman::p_load(FactoMineR,factoextra,dplyr,corrplot)
load("data/csdf2.rdata")
str(csdf)
```
```
##'data.frame':13obs.of11variables:
##$tot_rate:num0.5460.4530.5850.4980.353...
##$USP_wr:num0.4080.6460.3330.60.481...
##$HE_wr:num0.7020.5060.3330.3330.36...
##$Incendiary_wr:num0.4740.3240.5030.2710.456...
##$M4A4_wr:num0.5420.5350.4980.4620.513...
##$AK47_wr:num0.5960.4050.8120.5970.144...
##$USP_num:int766584308178813812920...
##$HE_num:int4779429505146912928...
##$Incendiary_num:int253207191701712991697248662...
##$M4A4_num:int216286219143195216193143383127...
##$AK47_num:int441291293196284437272196942128...
```
###標出資料點與變數(維度)方向
```{r}
df=csdf[7:11]#7:11是使用武器的獲勝次數
pca=PCA(df)
```
![](https://i.imgur.com/Z5uZUP8.png)
![](https://i.imgur.com/7Rdf4zY.png)
```{r}
fviz_pca_var(pca)#美化一點的PCA函數(加上網格)
```
![](https://i.imgur.com/clSJyUr.png)
###PCA維度解釋程度
```{r}
get_eigenvalue(pca)#特徵值/資訊保留量/累積資訊保留量
```
```
##eigenvaluevariance.percentcumulative.variance.percent
##Dim.14.4206695588.413391088.41339
##Dim.20.333820216.676404195.08980
##Dim.30.156454293.129085898.21888
##Dim.40.065648891.312977899.53186
##Dim.50.023407060.4681412100.00000
```
+Dim.1解釋了88%的變異
+有邊際效果遞減,累加到解釋完所有的變異(100%)
###將兩張圖疊在一起,畫出PCA圖
```{r}
fviz_pca_biplot(pca,repel=T,#repel讓label不要重疊
pointsize="cos2",col.ind="#E7B800",alpha.ind=0.3)#pointsize放變數就會自動生成legend#col.ind放分群變數
```
![](https://i.imgur.com/NW2bamI.png)
+可以看出變數(武器)的維度經壓縮後都投射在同一方向
+正相關
+點對軸線(無限延伸的方向)畫垂直線,該落點即為該維度上的值
+Dim1+2保留了94%資訊量(解釋了94%的變異),因此可以相信這張圖
+軸線的長度代表一個標準差
+有些PCA圖會畫出長短不一的射線,有些怕混淆會畫等長
+愈短代表變異量愈小
###集群分析
```{r}
kmg=kmeans(df,3)$cluster%>%factor
table(kmg)
```
###結合集群分析的PCA分析圖
+圖1(將同一群的用橢圓匡起來)
```{r}
fviz_pca_biplot(
pca,repel=T,col.var="black",col.ind=kmg,alpha.ind=0.6,
pointshape=16,pointsize=10*csdf$tot_rate,labelsize=3,
addEllipses=TRUE,ellipse.level=0.6,mean.point=F)#addEllipses畫分群的橢圓#1,2群太小太遠畫不出來#level是橢圓的範圍大小#mean.point幫忙計算群中心點並標出來(但會太混雜所以拿掉)
```
![](https://i.imgur.com/VFTVvT3.png)
+圖2(點與點之間連線)
```{r}
fviz_pca_biplot(
pca,repel=T,col.var="black",col.ind=kmg,alpha.ind=0.6,
pointshape=16,pointsize=10*csdf$tot_rate,labelsize=3,
addEllipses=TRUE,ellipse.type="convex",mean.point=F)#convex是將點連線
```
![](https://i.imgur.com/qkHanAU.png)
###正規化
+為了修正變數都往同個方向投射,我們應該看比例而非看數量。
+因為比較「事件」會受到「數量大小」影響,導致PCA壓縮後都擠在「同方向」(正相關)。
+例如:
+做文字分析時,寫長文的人/感性的人,情緒普遍偏高;相反的人情緒較平淡。
+比較結婚、離婚、出生、死亡(事件)受到縣市的大小/人口密度影響。
+這樣是不能直接比較的,比較要放在同一個基準;遇到這種情況,做正規化比較好。
+正規化:數量轉比率0~1(皆是正數)。
+標準化=常態化:平均值是0,標準差是1。
+有正有負,中間是0。
+當0對你有意義/重要的、有兩極在擺動的情況就很適合做標準化。
```{r}
#regulization
mx=csdf[7:11]%>%as.matrix()
mx2=mx/rowSums(mx)#正規化的方向是row(因為是每個隊伍)
#如果是直的方向的正規化,要先做轉置:t(t(x)/rowSums(t(x)))
pca2=PCA(mx2)
#kmeans
kmg2=kmeans(df,3)$cluster%>%factor
table(kmg2)
#plot
fviz_pca_var(pca2)#維度投射圖
fviz_pca_biplot(
pca2,repel=T,col.var="black",col.ind=kmg2,alpha.ind=0.6,
pointshape=16,pointsize=10*csdf$tot_rate,labelsize=3,
addEllipses=TRUE,ellipse.type="convex",mean.point=F)
```
![](https://i.imgur.com/oraroT3.png)
![](https://i.imgur.com/0n1nm8L.png)
##【範例2】獲勝比率
已經是比率,不需做正規化
```{r}
mx3=csdf[,1:6]%>%as.matrix()#1:6是使用武器的獲勝比率
pca3=PCA(mx3)
#kmeans
kmg3=kmeans(mx3,4)$cluster%>%factor
table(kmg3)
#plot
fviz_pca_biplot(
pca3,repel=T,col.var="black",col.ind=kmg3,alpha.ind=0.6,
pointshape=16,pointsize=10*csdf$tot_rate,labelsize=3,
addEllipses=TRUE,ellipse.type="convex",mean.point=FALSE)
```
![](https://i.imgur.com/hjrgCHR.png)
1
×
Signin
Email
Password
Forgotpassword
or
Byclickingbelow,youagreetoourtermsofservice.
SigninviaFacebook
SigninviaTwitter
SigninviaGitHub
SigninviaDropbox
SigninviaGoogle
NewtoHackMD?Signup
延伸文章資訊
- 1機器/統計學習:主成分分析(Principal Component Analysis, PCA)
「主成分分析在機器學習內被歸類成為降維(Dimension reduction)內特徵擷 ... 剛剛例子(身高和體重),下左圖,經由PCA可以萃取出兩個特徵成分(投影軸,下圖右的兩條垂直 ...
- 2第81 章主成分分析Principal Component Analysis | 醫學統計學
在我們的橙汁數據實例中,顯然保留前兩個主成分就已經能夠解釋86.81% 的總體方差,我們認爲這是理想的主成分個數。 Orange data: eigenvalues among all vari...
- 3機器學習(6)--主成分分析(Principal component analysis,PCA)
在這個範例裡,我們將使用葡萄酒數據集來做示範,把原本有的13個特徵,利用PCA分析後只找出兩個主要的特徵值作為分類器模型分類的特徵依據。 PCA著眼在高 ...
- 4PCA主成分分析(入門計算+深入解析)(一) - IT閱讀
主成分分析(Principal components analysis,以下簡稱PCA)是一種通過降維技術把多個變數化為少數幾個主成分的統計方法,是最重要的降維方法之一。它可以 ...
- 5PCA 主成分分析(Principal Component Analysis) - HackMD
【範例1】分析每隻隊伍對不同武器的關係. col(var):武器; row(ind):隊伍. 資料介紹.