關於使用R語言實現降維-PCA&Kmeans
來自專欄 數據分析經驗談
1、數據導入R
# readr包比較好用,但是偶爾碰到百萬級別的大數據時候也會報錯。報錯主要由於數據中有中文或者特殊字元比如『/n』等,所以需要在從hive調取數據的時候就要進行處理了。特別是mac本,中文的兼容什麼的問題蠻多,有時候折騰半天數據還沒導進去,或者各種報錯、警告。
> library(readr)
#這個文件放在了R的工作台,所以不用把路徑寫的很全
> data=read_csv(play0515.csv)> names(data)
查看數據的列名
> names(data)
#看下行、列數
> dim(data)[1] 693 18
其他常用的數據查看命令
> summary(data)> str(data)> head(data)> data[sample(693,100),] #隨機抽取一百行數據> table(data$player_version)#查看頻次> sum(is.na(data))# 查看缺失值總數,如果有缺失值還需要處理一下,要麼去掉這些行或者需要替換---數據清洗是比較複雜的,基本功。> plot(table(data$player_version)) #可視化看頻次
----主成分降維
> data.pr <- princomp(data, scores=T, cor = TRUE)Error in cov.wt(z) : x只能包含有限值
#出現報錯是因為數據中有渠道編號,不是數值。這個模型只能針對全數據。
----渠道無用列
> data$pcode=NULL> dim(data)
-----直接甩 主成分命令,然後summary一下。
可以看到,原來數據有17維,經過主成分演算法映射到新空間,到第六維的時候,累計貢獻率已經達到98%。
> plot(data.pr,type="line")
這個圖是可以看到從第8維開始,下降就沒這麼多了。進一步分析的時候選擇幾個維度來分析,就可以自己看著辦了。
------新的坐標系已經算出來,下一步是把data所有數據映射到新坐標系
> pca_data <- predict(data.pr) #pca_data表裡的所有數據就是data在新的坐標系下的分布。> newdata=pca_data[,1:5] #newdata 提取前五個列,組成新的矩陣。> newdata[1,] #看一下列名和第一行 Comp.1 Comp.2 Comp.3 Comp.4 Comp.5 -0.3449262 -1.9932185 0.2829370 1.0514319 -0.6274861 #保存一下結果,> write.table(newdata,file=~/desktop/newdata.csv,sep=,,eol=
)
-------Kmeans聚類
> (jvlei=kmeans(newdata,4))# k值得確定需要別的演算法,我一般是 多測測。根據距離在調參。K-means clustering with 4 clusters of sizes 5, 16, 334, 338Cluster means: Comp.1 Comp.2 Comp.3 Comp.41 -35.03056541 3.0706013 0.03592686 -1.49693532 -7.13512007 -4.3774490 -0.01652635 -1.37652903 0.08157919 -0.7624817 -0.01518998 0.40710444 0.77534704 0.9152516 0.01526106 -0.3149814 Comp.51 1.08846442 -1.71932893 0.47011424 -0.3992639Within cluster sum of squares by cluster:[1] 1318.9354 291.5830 567.7946 778.6140 (between_SS / total_SS = 73.7 %) ##距離只覆蓋了73.7%Available components:[1] "cluster" "centers" "totss" [4] "withinss" "tot.withinss" "betweenss" [7] "size" "iter" "ifault" #把k(中心點)的值調到6個,覆蓋到83.4%,調到9個,覆蓋只有85%。應該接近最大了。Within cluster sum of squares by cluster:[1] 216.5763 213.5599 1068.2862 0.0000 233.0128[6] 138.8431 (between_SS / total_SS = 83.4 %)> table(jvlei$cluster) > plot(table(jvlei$cluster))
> table(data$pcode,jvlei$cluster)#可以看到每個渠道編碼和對應的聚類序列。
最後就可以導出來放到Excel裡面繼續分析啦。
困了,碎覺去了~
推薦閱讀:
※圖形初階1
※在《one.一個》改版前,你一直念念不忘的文章是哪篇?
※數據處理及分析-讀寫Excel
※R語言爬蟲可視化——用數據來聊聊2017年首周各大城市空氣質量
※R語言實戰之圖形初階(三)