《数据分析实战》–用R做交叉列表

本文参考的是《数据分析实战》第四章。

背景:针对某公司的产品,发现当月的用户使用量减少了很多,但是和上月相比,本月的商业宣传和月度活动并无大的变化,需查明用户数量减少的原因。

现状:同上月相比用户数减少。

预期:恢复到与上月相同的用户数。

明确问题:根据用户的不同属性来发现某个用户群出现问题。


读取数据

dau <- read.csv('section4-dau.csv',header = T,stringsAsFactors = F)
user_info <- read.csv('section4-user_info.csv',header = T,stringsAsFactors = F)

其中,dau数据如下:

> head(dau)
    log_date app_name user_id
1 2013-08-01  game-01   33754
2 2013-08-01  game-01   28598
3 2013-08-01  game-01   30306
4 2013-08-01  game-01     117
5 2013-08-01  game-01    6605
6 2013-08-01  game-01     346

user_info数据如下:

> head(user_info)install_date app_name user_id gender generation device_type
1   2013-04-15  game-01       1      M         40         iOS
2   2013-04-15  game-01       2      M         10     Android
3   2013-04-15  game-01       3      F         40         iOS
4   2013-04-15  game-01       4      M         10     Android
5   2013-04-15  game-01       5      M         40         iOS
6   2013-04-15  game-01       6      M         40         iOS

处理数据

将两张表合并在一起,用系统自带的merge函数,合并之后数据如下:

> dau_user_info <- merge(dau,user_info,by=c('user_id','app_name'),all.x = T)
> head(dau_user_info)user_id app_name   log_date install_date gender generation device_type
1       1  game-01 2013-09-06   2013-04-15      M         40         iOS
2       1  game-01 2013-09-05   2013-04-15      M         40         iOS
3       1  game-01 2013-09-28   2013-04-15      M         40         iOS
4       1  game-01 2013-09-12   2013-04-15      M         40         iOS
5       1  game-01 2013-09-11   2013-04-15      M         40         iOS
6       1  game-01 2013-09-08   2013-04-15      M         40         iOS

同时增加月份的统计列:

> dau_user_info$log_month <- substr(dau_user_info$log_date,1,7)
> head(dau_user_info)user_id app_name   log_date install_date gender generation device_type log_month
1       1  game-01 2013-09-06   2013-04-15      M         40         iOS   2013-09
2       1  game-01 2013-09-05   2013-04-15      M         40         iOS   2013-09
3       1  game-01 2013-09-28   2013-04-15      M         40         iOS   2013-09
4       1  game-01 2013-09-12   2013-04-15      M         40         iOS   2013-09
5       1  game-01 2013-09-11   2013-04-15      M         40         iOS   2013-09
6       1  game-01 2013-09-08   2013-04-15      M         40         iOS   2013-09

数据分析

对上面的dau_user_info表进行统计:

1.首先我们考虑的性别方面有没有较大的变化,用系统自带的table函数进行统计:

使用方法
输入table(AAA[,c(“XX”,”YY”)]),将AAA 数据的属性XX 和YY进行交叉列表统计并输出。
交叉列表统计就是计算各个属性下有多少样本数,是数据分析中最初级的一种分析。

> table(dau_user_info[,c("log_month","gender")])gender
log_month     F     M2013-08 47343 468422013-09 38027 38148

可以看出,通过比较2013 年8月和9 月男女用户的数量,可以看出两个用户群的数量都下降了,但各自的构成比例却大体上没有发生变化,所以性别这个属性对现在的问题影响不大。

2.考虑是不是年龄段会有较大的变化:

> table(dau_user_info[,c("log_month","generation")])generation
log_month    10    20    30    40    502013-08 18785 33671 28072  8828  48292013-09 15391 27229 22226  7494  3835

这里也是比较上下两行的数值,可以看出在8 月和9 月,无论哪个年龄段的用户,所占总用户的比例大体上都没有变化,没有发现哪个年龄段的用户数大量减少了。

3.对用户分群(按性别× 年龄段统计)
对数据进行n重交叉列表统计,需要使用reshape2的包,使用该包里面的dcast函数:
使用方法:
输入dcast(AAA,XX~YY+ZZ,value.var=”CCC”,length),对数据AAA 中的XX(纵轴)和YY×ZZ(横轴)进行交叉列表统计。后面的value.var=”CCC”,length 表示这个交叉列表中的数值为相应的CCC的个数。(不去重

> library(reshape2)
> dcast(dau_user_info,log_month~gender+generation,value.var = 'user_id',length)log_month F_10  F_20  F_30 F_40 F_50 M_10  M_20  M_30 M_40 M_50
1   2013-08 9091 17181 14217 4597 2257 9694 16490 13855 4231 2572
2   2013-09 7316 13616 11458 3856 1781 8075 13613 10768 3638 2054

通过观察上述结果可以看到,上面的分析是以性别和年龄段的交叉属性作为分析轴的。通过“gender + generation”这样的方式来指定性别和年龄段的结合,将这两种属性通过“_”连接起来,并生成了分析轴。

通过观察统计的数据,可以看出这里每个用户群的用户数量都减少了,所占的比例也大体没有变,并没有发现哪个用户群的人数大量减少了。

4.通过移动设备来统计用户群体:

> table(dau_user_info[,c("log_month","device_type")])device_type
log_month Android   iOS2013-08   46974 472112013-09   29647 46528

结果我们发现,9 月的iOS 用户数相比8 月下降幅度很小,然而Android 用户数却极大地减少了,因此问题很可能就出自这个用户群了。


数据可视化

按照日期和设备类型计算用户数,同时变化日期类型,因为要画时间序列的图:

> dau_user_info_device_summary <- ddply(dau_user_info,
+                                       .(log_date,device_type),
+                                       summarise,
+                                       dau=length(user_id))
> dau_user_info_device_summary$log_date <- as.Date(dau_user_info_device_summary$log_date)
> head(dau_user_info_device_summary)
    log_date device_type  dau
1 2013-08-01     Android 1784
2 2013-08-01         iOS 1805
3 2013-08-02     Android 1386
4 2013-08-02         iOS 1451
5 2013-08-03     Android 1295
6 2013-08-03         iOS 1351

画出时间序列的图:

> limits <- c(0,max(dau_user_info_device_summary$dau))
> ggplot(dau_user_info_device_summary,
+        aes(x=log_date,y=dau,col=device_type,lty=device_type,shape=device_type))+
+       geom_line(lwd=1)+
+       geom_point(size=4)+
+       scale_y_continuous(labels = comma,limits = limits)

这里注意,加号“+”要写在行后面,要不然会报错!!

结果图如下:

从上图可以看出,之前iOS 和Android 的用户数大体相当,但是从9 月的第2 周开始,Android 用户数急剧减少。

至此,数据分析结束~

《数据分析实战》--用R做交叉列表相关推荐

  1. 【R语言与数据分析实战】R软件编程

    目录 1.流程控制 (1) if语句 (2) 循环语句 2.运算 (1) 数值运算 (2) 向量运算 (3) NA处理 3.定义函数 (1) 可变长函数 (2) 嵌套函数 4.作用域 5.对象的不变性 ...

  2. 数据分析实战项目3-用Excel做RFM模型用户分层模型分析

    本文数据集来源:忘记了,私聊发数据源 本次目的是将一份用户订单表做RFM模型分析,做好8个维度的用户分层,可以方便运营和销售有目的去跟进重点和非重点客户. 数据源字段如图所示,但本次是订单表,客户有重 ...

  3. 看书标记【R语言 商务数据分析实战9】

    看书标记--关于R语言 chapter 9 9.2 任务实现 [R语言 商务数据分析实战9] chapter 9 餐饮企业综合分析 统计分析>>ARIMA预测销售额>>协同过滤 ...

  4. 大数据分析实战-信用卡欺诈检测(二)-下采样方案和交叉验证

    第一部分已经写到这里了,看完第一部分再看这一部分:大数据分析实战-信用卡欺诈检测 文章目录 下采样方案 交叉验证 下采样方案 下采样方案的实现过程比较简单,只需要对正常样本进行采样,得到与异常样本一样 ...

  5. 《数据分析实战》--用R做多元回归分析

    <数据分析实战>--用R做多元回归分析 本文参考的是<数据分析实战>的第六章. 背景:针对某公司对产品的不同广告平台投放,基于过去的新增用户数据和投放数据,希望获得更好的广告投 ...

  6. 【R语言与数据分析实战】绘图

    目录 1.散点图 2.图像选项 2.1 坐标轴名称 2.2 图形标题 2.3 点的类型 2.4 点的大小 2.5 颜色 2.6 坐标轴的取值范围 2.7 图像类型 2.8 线型 2.9 图形排列 2. ...

  7. 【R语言与数据分析实战】数据操作(一):基于向量的处理与外部数据处理

    目录 1.R中的常用数据集 2.读写CSV文件 (1) 读写CSV文件 (2) 读写对象文件 3.合并数据框的行与列 4.apply系数函数 (1) apply (2) lapply (3) sapp ...

  8. R语言explore包进行探索性数据分析实战(EDA、exploratory data analysis):基于iris数据集

    R语言explore包进行探索性数据分析实战(EDA.exploratory data analysis):基于iris数据集 目录

  9. r语言数据变量分段_R数据分析:用R语言做meta分析

    这里以我的一篇meta分析为例,详细描述meta分析的一般步骤,该例子实现的是效应量β的合并 R包:metafor或meta包,第一个例子以metafor包为例. 1.准备数据集 2.异质性检验 in ...

最新文章

  1. bootstrap Table API和一些简单使用方法
  2. Java实现简单的RPC框架
  3. eureka java_spring cloud 入门系列二:使用Eureka 进行服务治理
  4. 每输入四个字符添加一个中划线
  5. Struts2框架使用(十)之struts2的上传和下载
  6. 前端学习(3123):react-hello-react之props的基本使用
  7. redis——Java整合
  8. 洛谷P2014【树形dp】
  9. 如何为你的数据选择最佳图表?
  10. python 新浪博客_Python实现新浪博客备份的方法
  11. C语言基础四(敲打键盘、寻找资料,循环语句)请一个个字读,助于您的学会机率...
  12. 驰为 hi12 linux,驰为Hi12 最适合入手的手写平板 真的可以试试
  13. python之单例模式
  14. 切换IE浏览器的版本
  15. 数字逻辑课上如何制作FPGA游戏?
  16. 怎样做一个拥有全局观的人
  17. 计算机相关专业学历重要么?
  18. 有梦想的闲鱼之团队介绍
  19. 小白学Python ——day7
  20. STM32CubeMX学习笔记(16)——电源管理(PWR)低功耗停止模式

热门文章

  1. 威联通TS-453Bmini NAS加装内存,轻松玩转虚拟机安装win10系统
  2. 轻量级的双向绑定工具 —— ukulelejs
  3. 存储-对象存储、文件存储和块存储
  4. excel 表头合并 和拆分的例子
  5. matlab 写netcdf,写入 netCDF 属性
  6. Cartopy 0.20 最新功能 —— Cartopy 装不上别慌,内附解决方案
  7. 微信小程序云函数服务器,微信小程序云函数使用的几点说明
  8. 从项目的一个 panic 说起:Go 中 Sync 包的分析应用
  9. 阿里系App抓包详细分析
  10. git报错the remote end hung up unexpectedlyMiB解决方法