PCA Shiny App

PCA Shiny App 介面

兩段式趨勢分析

1 PCA分析

1.1 何謂PCA

  • 一顆西瓜有很多種切法/切面,找出從哪個切面可以看到最多西瓜籽
  • 先從資訊保留量最大的方向壓縮(保留資料變數之間的變異性)
    • 通常在壓第一次的時候就解釋了60-80%的變異
    • 再往能保留最多資訊的方向繼續壓縮(邊際效果遞減)
    • 壓縮過程
    • Input/Output
  • 做PCA可以看到:
    • 變數 v.s 變數的關係
      • 獨立(直角)
      • 正相關(在同一側)
      • 負相關(在反方向)
    • 資料點 v.s 變數
      • 資料點在變數間表現突出(outlier)
    • 資料點 v.s 資料點
      • Cluster:點與點靠得很近為一群(組內差異小,組間差異大)
  • 用於競爭/策略分析
    • 不用再一張一張圖去畫、放在一起看(太慢又太多維度組合要畫)
    • 將資料所有的變數投射在一個平面上觀察整體趨勢
    • 加上時間因素可以看出移動方向/趨勢
    • 看得到對手和自己的定位變化
    • 決定自己未來要往哪裡去

1.2 【範例1】分析每隻隊伍對不同武器的關係

  • col(var):武器
  • row(ind):隊伍

1.2.1 資料介紹

  • 遊戲比賽的資料,有13隻隊伍對於5個武器的使用量及獲勝的比率
    • tot_rate:各隊伍整體獲勝的比率
    • xxx_rate:各隊伍使用各類武器的獲勝的比率
    • xxx_num:武器的使用量

1.2.2 讀取資料

## also installing the dependencies 'zip', 'SparseM', 'MatrixModels', 'sp', 'openxlsx', 'minqa', 'nloptr', 'RcppEigen', 'carData', 'abind', 'pbkrtest', 'quantreg', 'maptools', 'rio', 'lme4', 'car', 'ellipse', 'flashClust', 'leaps', 'scatterplot3d', 'ggrepel'
## 
## The downloaded binary packages are in
##  /var/folders/dt/brfqfqpx2nx6x96txdg151hh0000gn/T//RtmpR7cuoE/downloaded_packages
## 
## FactoMineR installed
## also installing the dependencies 'ggsci', 'cowplot', 'ggsignif', 'polynom', 'ggpubr'
## 
## The downloaded binary packages are in
##  /var/folders/dt/brfqfqpx2nx6x96txdg151hh0000gn/T//RtmpR7cuoE/downloaded_packages
## 
## factoextra installed
## 
## The downloaded binary packages are in
##  /var/folders/dt/brfqfqpx2nx6x96txdg151hh0000gn/T//RtmpR7cuoE/downloaded_packages
## 
## corrplot installed
## 'data.frame':    13 obs. of  11 variables:
##  $ tot_rate      : num  0.546 0.453 0.585 0.498 0.353 ...
##  $ USP_wr        : num  0.408 0.646 0.333 0.6 0.481 ...
##  $ HE_wr         : num  0.702 0.506 0.333 0.333 0.36 ...
##  $ Incendiary_wr : num  0.474 0.324 0.503 0.271 0.456 ...
##  $ M4A4_wr       : num  0.542 0.535 0.498 0.462 0.513 ...
##  $ AK47_wr       : num  0.596 0.405 0.812 0.597 0.144 ...
##  $ USP_num       : int  76 65 84 30 81 78 81 38 129 20 ...
##  $ HE_num        : int  47 79 42 9 50 51 46 9 129 28 ...
##  $ Incendiary_num: int  253 207 191 70 171 299 169 72 486 62 ...
##  $ M4A4_num      : int  216 286 219 143 195 216 193 143 383 127 ...
##  $ AK47_num      : int  441 291 293 196 284 437 272 196 942 128 ...

1.2.3 標出資料點與變數(維度)方向

df=csdf[7:11] # 7:11是武器的數量
pca=PCA(df)

fviz_pca_var(pca) # 美化一點的PCA函數(加上網格)

1.2.4 PCA維度解釋程度

get_eigenvalue(pca) # 特徵值/資訊保留量/累積資訊保留量
##       eigenvalue variance.percent cumulative.variance.percent
## Dim.1 4.42066955       88.4133910                    88.41339
## Dim.2 0.33382021        6.6764041                    95.08980
## Dim.3 0.15645429        3.1290858                    98.21888
## Dim.4 0.06564889        1.3129778                    99.53186
## Dim.5 0.02340706        0.4681412                   100.00000
  • Dim.1 解釋了88%的變異
  • 有邊際效果遞減,累加到解釋完所有的變異(100%)

1.2.5 將兩張圖疊在一起,畫出PCA圖

fviz_pca_biplot(pca, repel=T, # repel讓label不要重疊 
                pointsize="cos2", col.ind="#E7B800", alpha.ind=0.3) # pointsize放變數就會自動生成legend # col.ind放分群變數

  • 可以看出變數(武器)的維度經壓縮後都投射在同一方向
  • 正相關

1.2.6 集群分析

kmg = kmeans(df,3)$cluster %>% factor
table(kmg)
## kmg
## 1 2 3 
## 2 3 8

1.2.7 結合集群分析的PCA分析圖

  • 圖1(將同一群的用橢圓匡起來)
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幫忙計算群中心點並標出來(但會太混雜所以拿掉)
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse

  • 圖2(點與點之間連線)
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是將點連線

1.2.8 正規化

  • 為了修正變數都往同個方向投射,我們應該看比例而非看數量
  • 因為比較「事件」會受到「數量大小」影響,導致PCA壓縮後都擠在「同方向」(正相關)。
    • 例如:
    • 做文字分析時,寫長文的人/感性的人,情緒普遍偏高;相反的人情緒較平淡。
    • 比較結婚、離婚、出生、死亡(事件)受到縣市的大小/人口密度影響。
  • 這樣是不能直接比較的,比較要放在同一個基準;遇到這種情況,做正規化比較好。
    • 正規化:數量轉比率0~1(皆是正數)。
    • 標準化=常態化:平均值是0,標準差是1。
      • 有正有負,中間是0。
      • 當0對你有意義/重要的、有兩極在擺動的情況就很適合做標準化。
# regulization
mx = csdf[7:11] %>% as.matrix()
mx2 = mx/rowSums(mx) # 正規化的方向是row(因為是每個隊伍)
# 如果是直的方向的正規化,要先做轉置
# t(t(x)/rowSums(t(x)))

pca2=PCA(mx2)

get_eigenvalue(pca2)
##         eigenvalue variance.percent cumulative.variance.percent
## Dim.1 1.956598e+00     3.913197e+01                    39.13197
## Dim.2 1.734525e+00     3.469051e+01                    73.82247
## Dim.3 1.114668e+00     2.229336e+01                    96.11583
## Dim.4 1.942085e-01     3.884169e+00                   100.00000
## Dim.5 1.929106e-30     3.858212e-29                   100.00000
fviz_pca_var(pca2)

fviz_pca_biplot(pca2, repel=T, pointsize="cos2", col.ind="#E7B800", alpha.ind=0.3)

# kmeans
kmg2 = kmeans(df,3)$cluster %>% factor
table(kmg2)
## kmg2
## 1 2 3 
## 2 8 3
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.level = 0.6, mean.point = FALSE)
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse

#labelsize:字大小 pointsize:點大小

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)

1.3 【範例2】獲勝比率

已經是比率,不需做正規化

mx3 = csdf[,1:6] %>% as.matrix() 
pca3=PCA(mx3)

kmg3 = kmeans(mx3,4)$cluster %>% factor
table(kmg3)
## kmg3
## 1 2 3 4 
## 4 5 2 2
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.level = 0.6,  mean.point = FALSE)
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse

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)