• (数据科学学习手札10)系统聚类实战(基于R)


    上一篇我们较为系统地介绍了Python与R在系统聚类上的方法和不同,明白人都能看出来用R进行系统聚类比Python要方便不少,但是光介绍方法是没用的,要经过实战来强化学习的过程,本文就基于R对2016年我国各主要城市第一、二、三产业GDP的量为三个不同特征,对这些城市进行系统聚类+分析;

    数据来源:http://data.stats.gov.cn/easyquery.htm?cn=E0105

    数据内容:

    36个样本,3个变量,分别在三个xls文件中

    分析目的:

    为这些城市通过产业结构进行分类

    实战开始!

    一、数据的预处理

    通过观察下载的数据,我对这三个数据集依次进行了读入-去缺省值-内联合并,具体代码如下:

    > rm(list=ls())
    > library(readxl)
    > setwd('C:\Users\windows\Desktop')
    > data1 <- na.omit(read_xls('主要城市年度数据第一产业.xls',skip=3))
    > names(data1)[2] = '第一产业'
    > data2 <- na.omit(read_xls('主要城市年度数据第二产业.xls',skip=3))
    > names(data2)[2] = '第二产业'
    > data3 <- na.omit(read_xls('主要城市年度数据第三产业.xls',skip=3))
    > names(data3)[2] = '第三产业'
    > k <- merge(data1,data2,by='地区')
    > data <- merge(k,data3,by='地区')
    > head(data)
      地区 第一产业 第二产业 第三产业
    1 北京   129.79  4944.44 20594.90
    2 成都   474.94  5232.02  6463.27
    3 大连   462.78  2793.69  3473.86
    4 福州   492.25  2590.43  3114.96
    5 广州   239.28  5751.59 13556.57
    6 贵阳   137.14  1218.79  1801.77

    二、基于欧氏距离的系统聚类

    > #根据欧式距离进行聚类
    > input <- as.matrix(data[,2:4])
    > d <- dist(input,'euclidean')
    > hc <- hclust(d,"single")
    > plot(hc,labels = data[,1],sub='主要城市GDP分类发展水平聚类(欧式距离)')

    得到树状聚类图如下:

    可以看出,如果以这三种产业GDP组成样本点的点间欧氏距离进行聚类,全国主要城市可分为:

      1.北京上海代表的超大城市

      2.广州代表的特大城市

      3.重庆天津深圳代表的二线中的领跑城市

      4.剩下城市代表的广大二三线普通城市

    三、基于马氏距离的系统聚类

    马氏距离的优点是既排除了各指标间的相关性干扰,又消除了各指标的量纲,通过对这三种变量间相关系数矩阵的求解(如下),可以看出变量间存在着相关甚至高度相关(高达0.8):

    > cor(data[,2:4])
               第一产业  第二产业   第三产业
    第一产业 1.00000000 0.3753064 0.07944717
    第二产业 0.37530643 1.0000000 0.80548349
    第三产业 0.07944717 0.8054835 1.00000000

    利用09中提到的计算马氏距离dist的自定义函数,进行聚类,过程如下:

    > #自定义马氏距离矩阵计算函数
    > MS <- function(input){
    +   l <- length(input[,1])
    +   ms <- matrix(0,nrow=l,ncol=l)
    +   cov <- cov(input)
    +   for(i in 1:l){
    +     for(j in 1:l){
    +       ms[i,j] = t(input[i,]-input[j,])%*%solve(cov)%*%(input[i,]-input[j,])
    +     }
    +   }
    +   return(as.dist(ms))
    + }
    > #根据马氏距离来进行聚类
    > input <- as.matrix(data[,2:4])
    > d <- MS(input)
    > hc <- hclust(d,"single")
    > plot(hc,labels = data[,1],sub='主要城市GDP分类发展水平聚(马氏距离)')

    得到的树状聚类图如下:

    可以看出,与基于欧氏距离的聚类过程相比发生了很大不同,也揭示了很多更深层次的关系:

      1.重庆独一类的省规模的超级城市

      2.北京独一类的特殊地位城市

      3.深圳天津代表的一线末尾或二线顶级城市

      4.上海、广州、哈尔滨三座独特的地方领头城市

      5.剩下所有的二线城市

    以上便是这次简单的系统聚类的全过程,如有欠缺或错误之处,望提出宝贵意见

  • 相关阅读:
    给我30000出租车,还你一个不堵车的北京
    使用vim代替IDE
    (转)声明,函数与函数指针
    想恶作剧的请看过来
    bash命令提示符的更改
    (转)微软面试
    140个Google面试问题
    UTF8 GBK UTF8 GB2312 之间的区别和关系(转)
    MyBooksReadingStatic
    让SlickEdit 自动编译Keil C51工程
  • 原文地址:https://www.cnblogs.com/feffery/p/8585018.html
Copyright © 2020-2023  润新知