案例:通过使用R语言的聚类算法将用户进行合理的划分,找出对超市贡献度,光临度最高的优质客户,对后期的推广有更深远的影响

1.导入包

  1. library(dplyr)
  2. library(reshape2)
  3. library(cluster)
  4. library(fpc)
  5. library(mclust)

2.加载数据集

  1. options(digits = 18) #小数可以显示到第18位
  2. lss_all_cust_ls_info <- read.table('E:\\Udacity\\Data Analysis High\\R\\R_Study\\高级课程代码\\数据集\\第一天\\1顾客细分\\lss_all_cust_ls_info.txt',header=T,sep='\t')
  3. head(lss_all_cust_ls_info)
  4. lss_cust_payment <- read.table('E:\\Udacity\\Data Analysis High\\R\\R_Study\\高级课程代码\\数据集\\第一天\\1顾客细分\\lss_cust_payment.txt',header=T,sep='\t')
  5. head(lss_cust_payment)
  6. lss_cust_spend_info <- read.table('E:\\Udacity\\Data Analysis High\\R\\R_Study\\高级课程代码\\数据集\\第一天\\1顾客细分\\lss_cust_spend_info.txt',header=T,sep='\t')
  7. head(lss_cust_spend_info)

3.查看数据集

  1. #客户信息
  2. head(lss_all_cust_ls_info)
  3. str(lss_all_cust_ls_info)
  4. summary(lss_all_cust_ls_info)
  5.  
  6. #支付信息
  7. head(lss_cust_payment)
  8. str(lss_cust_payment)
  9. summary(lss_cust_payment)
  10.  
  11. #商品信息
  12. head(lss_cust_spend_info)
  13. str(lss_cust_spend_info)
  14. summary(lss_cust_spend_info)

4.数据集预处理(将三个数据集合并成一个数据集,通过cust_id进行关联)

  1. data_cat_wide = dcast(lss_cust_spend_info,cust_id~ls_category,value.var = "ls_spd_share")
  2. head(data_cat_wide)
  3. names(data_cat_wide)
  4. data_cat_wide = data_cat_wide[,-2]
  5. #dim(data_cat_wide)
  6. #summary(data_cat_wide)
  7.  
  8. data_payment_wide = dcast(lss_cust_payment,cust_id~payment_category_desc,value.var = "payment_amount_share")
  9. head(data_payment_wide)
  10. #dim(data_payment_wide)
  11.  
  12. ### 3. join data
  13. ##把三张表进行合并,通过cust_id来进行列合并
  14. cust_all = merge(lss_all_cust_ls_info,data_payment_wide, by="cust_id")
  15. cust_all_fnl = merge(cust_all,data_cat_wide, by="cust_id")
  16. ## 查看合并后的结果
  17. head(cust_all_fnl,10)
  18.  
  19. dim(cust_all_fnl)
  20. summary(cust_all_fnl)

 

 结论:将所有的纵向表转换成横向表,同时把所有数据集的所有字段汇总到一张表

5.数据清洗

  1. ## 提取出客户ID和性别
  2. cust_id = cust_all_fnl[,1]
  3. cust_sex = cust_all_fnl[,2]
  4.  
  5. ## 去除客户ID和性别,同时将除了这两个列之外的缺失值填充0
  6. cust_all_fnl2 = cust_all_fnl[,-c(1,2)]
  7. cust_all_fnl2[is.na(cust_all_fnl2)] =0
  8.  
  9. ## 把性别缺失值变成1.5
  10. cust_sex [is.na(cust_sex )] =1.5
  11.  
  12. ##把处理后的数据合并
  13. cust_all_fnl = data.frame(cust_id,cust_sex,cust_all_fnl2)
  14. head(cust_all_fnl)
  15. #summary(cust_all_fnl)
  16.  
  17. ## 对于异常值进行处理,如果百分比小于0,则变成0,如果百分比大于1 则等于1
  18. dim(cust_all_fnl)
  19. for(i in 7:dim(cust_all_fnl)[2])
  20. {
  21. cust_all_fnl[,i][cust_all_fnl[,i]<0] = 0
  22. cust_all_fnl[,i][cust_all_fnl[,i]>1] = 1
  23. }
  24.  
  25. dim(cust_all_fnl)
  26. ## 去除礼品字段,因为0值较多,会给后期的聚类操作带来影响
  27. mydata = cust_all_fnl[,-28]
  28. dim(mydata)
  29. summary(mydata)

 结论:生成一张所有属性的统计值,查看是否还有NA的值

6.选择K值

  1. # 如果数据集中的变量过多,要先使用主成分分析找到影响因子在95%以上的列即可
  1. # 选择K使得差异最小,下降幅度最小
  2. comp = scale(mydata[,-1])
  3.  
  4. wss <- (nrow(comp)-1)*sum(apply(comp,2,var))
  5.  
  6. for (i in 2:15) wss[i] <- sum(kmeans(comp,centers=i)$withinss)
  7. plot(1:15, wss, type="b", xlab="Number of Clusters",ylab="Within groups sum of squares")

7.使用K-media找到中心点的坐标

  1. # 如果数据量较大,首先应对数据进行抽样,然后在找中心点
  2. s = sample(1:dim(mydata)[1],2000,replace = F)
  3. clus = 4
  4. medk = pam(scale(mydata[s,-1]),clus,trace=T)
  5. plotcluster(scale(mydata[s,-1]),medk$clustering)
  6. table(medk$clustering)
  7. Kcenter = medk$medoids

8.使用K-mean进行聚类

  1. # 每次抽取1000个点进行聚类
  2. k = kmeans(scale(mydata[,-1]),centers = Kcenter,nstart = 25,iter.max = 1000)
  3. plotcluster(scale(mydata),k$cluster)

 结论:k-means的好处是速度快,但是中心点不稳定,k-media的好处是中心点稳定但是速度慢,此案例结合两者,先通过抽样的方式找出中心点,再将中心点带入到k-means中,即可得到聚类的样本

9.生成结果

  1. # 对每个变量求均值
  2. mydata_mean_sd = aggregate(scale(mydata),by=list(k$cluster),FUN=mean)
  3. head(mydata_mean_sd)

10.输出到本地

  1. # 写入到csv文件
  2. write.csv(mydata_mean_sd,'E:\\Udacity\\Data Analysis High\\R\\R_Study\\高级课程代码\\数据集\\第一天\\1顾客细分\\mydata_mean_sd.csv')
  3.  
  4. # 写入数据库
  5. data_sql <- data.frame(mydata, cluster=k$cluster)
  6. data_sql_out = data_sql[,c(1,dim(data_sql)[2])]

 结论:通过生成的csv文件,我们可以得出如下结论:

      通过tot_spend可以得出2,4组的顾客对超市的贡献度较大,其中2类客户是最应该保留的优质客户

      通过promo_share可以得出4类客户对折扣较为敏感

     通过wz_spend_share可以得出4类用户最喜欢参与打5折的活动

   通过对比购物时间段来看1,2类用户喜欢晚上购物,3类用户喜欢下午的时候购物,4类用户喜欢早上购物

   通过对比支付方式1,3,4组大部分是现金支付,2组客户喜欢用银行卡支付

     通过对比消费商品可得出结论:

          2类客户喜欢购买大家电,手机通讯设备,母婴食品的高价格产品

          4类客户喜欢购买生鲜,蔬菜等农产品

          1类客户喜欢购买一些零食,饮料之类的商品

          3类客户是散客,会不定期的购买一些商品

   针对1类客户,在下午的时间段可以对零食,饮料进行一些促销和活动

   针对2类客户,在晚上的时间段,一些大商品的家电,手机等高价格的产品做一些捆绑销售,同时定期去推送一些新的手机,电器,母婴食品的信息,会有不错的销售业绩

   针对4类客户,在早上对农产品,生鲜,肉类等商品可以进行一些打折,买一赠一的,兑换券等活动,提升生鲜商品的业绩

   针对3类用户,不是超市的重点客户,暂时不知道如何提升到店率

数据集:https://github.com/Mounment/R-Project

R语言-用户细分的更多相关文章

  1. 【转】R语言知识体系概览

    摘要:R语言的知识体系并非语法这么简单,如果都不了R的全貌,何谈学好R语言呢.本文将展示介绍R语言的知识体系结构,并告诉读者如何才能高效地学习R语言. 最近遇到很多的程序员都想转行到数据分析,于是就开 ...

  2. R语言——包的添加和使用

    R是开源的软件工具,很多R语言用户和爱好者都会扩展R的功能模块,我们把这些模块称为包.我们可以通过下载安装这些已经写好的包来完成我们需要的任务工作. 包下载地址:https://cran.r-proj ...

  3. R语言实战实现基于用户的简单的推荐系统(数量较少)

    R语言实战实现基于用户的简单的推荐系统(数量较少) a<-c(1,1,1,1,2,2,2,2,3,3,3,4,4,4,5,5,5,5,6,6,7,7) b<-c(1,2,3,4,2,3,4 ...

  4. 微软的R语言发行版本MRO及开发工具RTVS

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:微软在收购R语言的开发商后,也独立发行或在自己的产品中集成了R语言,这里就介绍下它们包 ...

  5. R 语言编码风格指南

    R 语言是一门主要用于统计计算和绘图的高级编程语言.这份 R 语言编码风格指南旨在让我们的 R代码更容易阅读.分享和检查.以下规则系与 Google 的 R 用户群体协同设计而成. 概要: R编码风格 ...

  6. Ubuntu下安装R语言和开发环境

    [简介]R是用于统计分析.绘图的语言和操作环境.R是属于GNU系统的一个自由.免费.源代码开放的软件,它是一个用于统计计算和统计制图的优秀工具. [R语言的安装]官网:https://www.r-pr ...

  7. 大数据平台R语言web UI应用架构 设计与开发

    1. 系统拓扑图 在日常业务分析中,R是非常常用的分析工具,而当数据量较大时,用R语言需要需用更多的时间来完成训练模型,spark作为大规模数据处理框架,采用内存计算,可以短时间内完成大量的数据的处理 ...

  8. R语言介绍

    R语言简介 R语言是一种为统计计算和图形显示而设计的语言环境,是贝尔实验室(Bell Laboratories)的Rick Becker.John Chambers和Allan Wilks开发的S语言 ...

  9. 来自 Google 的 R 语言编码风格指南

    来自 Google 的 R 语言编码风格指南R 语言是一门主要用于统计计算和绘图的高级编程语言. 这份 R 语言编码风格指南旨在让我们的 R 代码更容易阅读.分享和检查. 以下规则系与 Google ...

随机推荐

  1. CentOS下iptables持久化

    iptables规则持久化 设定防火墙规则 iptables -A INPUT -s 1.1.1.1/32 -p tcp -m tcp --dport 22 -j DROP iptables -A I ...

  2. 304和浏览器http缓存

    浏览器虽然发现了本地有该资源的缓存,但是不确定是否是最新的,于是想服务器询问,若服务器认为浏览器的缓存版本还可用,那么便会返回304. 浏览器缓存分为强缓存和协商缓存. 1.浏览器请求某资源,通过he ...

  3. 针对特定XML的解析器XMLParser

    一.建立网页库和偏移文件 为文本搜索引擎建立网页库,首先要把所有的网页(这里是文章)格式化,并保存到指定的格式中.如以下格式:   |                                  ...

  4. Linux PCI/PCI-E设备配置空间读取与修改

    Linux PCI/PCI-E设备配置空间读取与修改 1 前言 PCI和PCI Express,是计算机常使用的一种高速总线.操作系统中的PCI/PCI-E设备驱动以及操作系统内核,都需要访问PCI及 ...

  5. mysql字符串连接

    用SQL Server 连接字符串是用“+” 现在数据库用mysql, 写个累加两个字段值SQL语句居然不支持"+",郁闷了半天在网上查下,才知道mysql里的+是数字相加的操作, ...

  6. 用DriverStudio开发USB驱动程序

    很多写Windows Device Driver的开发人员基本上都是使用Windows DDK进行开发的.但是,现在也有不少人都开始借助一些辅助工具.笔者去年开始接触到DriverStudio,发现它 ...

  7. js拖拽分析

    js拖拽分析 思路 1.三个鼠标事件,mousedown,mousemove,mouseup 2.可移动性absolute 3.边界限制 得到鼠标点击处和div边界的距离,然后得出top 和 left ...

  8. python访问mysql和redis

    1. 修改mysql配置文件 修改bind-address=0.0.0.0(允许通过远程网络连接) 2. 修改redis配置文件 修改bind-address=0.0.0.0(允许通过远程网络连接), ...

  9. js判定是否为chrome,区分搜狗+360

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. 多米诺骨牌放置问题(状压DP)

    例题: 最近小A遇到了一个很有趣的问题: 现在有一个\(n\times m\)规格的桌面,我们希望用\(1 \times 2\)规格的多米诺骨牌将其覆盖. 例如,对于一个\(10 \times 11\ ...