Haste makes waste

Uda-DataAnalysis-27--探索多个变量

Posted on By lijun

3. 练习: 第三个定性变量

观察男女的好友数:

qplot(x = friend_count,data = subset(pf,!is.na(gender)),
 binwidth = 10) +
 scale_x_continuous(lim = c(0,1000),breaks = seq(0,1000,50)) +
 facet_wrap(~gender)

image

发现女性的好友数,明显多于男性,有可能是因为女性用户的年龄分布,与男性用户的年龄分布不同导致, 下面观察男女用户的年龄分布:

ggplot(aes(x = gender, y = age),
       data = subset(pf, !is.na(gender))) + geom_boxplot() +
  stat_summary(fun.y = mean,geom = "point",shape = 4)

image

女性用户的年龄层,比男性用户更大。

  • 观察各个年龄层上,男女用户的好友数量,取的是好友数目的中位数:
ggplot(aes(x=age,y=friend_count),
       data = subset(pf,!is.na(gender))) + 
    geom_line(aes(color=gender),stat="summary",fun.y=median)

image

  • 根据年龄和性别同时分组:
library("dplyr")
age_gender_groups <- group_by(subset(pf,!is.na(gender)), age, gender) 
pf.fc_by_age_gender <- summarise(age_gender_groups,
                          mean_friend_count = mean(friend_count),
                          median_friend_count = median(friend_count),
                          n = n())

head(pf.fc_by_age_gender,100)

image

4. 练习: 绘制条件小结

要得到的图形,与上面的类似,都是通过年龄和gender分组,得到好友的分布图: 但是这个利用了上面的分组数据集,实现方式不同:

ggplot(aes(x=age,y=median_friend_count),data=pf.fc_by_age_gender) + 
  geom_line(aes(color=gender))

image

6. 宽格式和长格式

观察上面生成的数据集pf.fc_by_age_gender,在继续后续的分析之前,还要对数据进行重组,将数据从长格式转换为宽格式:

image

  • 使用tidyr包重组数据:
#install.packages("tidyr")
library(tidyr)
spread(subset(pf.fc_by_age_gender, select = c('gender', 'age', 'median_friend_count')), gender, median_friend_count)

重组后数据结构如下:

image

7. 重塑数据

视频的示例使用的是另一个包reshape2进行数据重组:


#install.packages("reshape2")
library(reshape2)

pf.fc_by_age_gender.wide <- dcast(pf.fc_by_age_gender,
                                  age ~ gender,
                                  value.var = "median_friend_count")

head(pf.fc_by_age_gender.wide,100)

image

可以得到与上面相同的数据集。

8. 练习:比率图

Plot the ratio of the female to male median friend counts using the data frame pf.fc_by_age_gender.wide.

Think about what geom you should use. Add a horizontal line to the plot with a y intercept of 1, which will be the base line. Look up the documentation for geom_hline to do that. Use the parameter linetype in geom_hline to make the line dashed.

ggplot(aes(x=age,y=female/male),data=pf.fc_by_age_gender.wide) + geom_hline(yintercept = 1,linetype=2,alpha = 0.3) +
  geom_line(aes(color=age))

image

9. 练习: 第三个定量变量

通过使用的天数,计算加入Facebook的年份

pf$year_joined <- 2014 - ceiling(pf$tenure / 365)

10. 练习: 切割一个变量

上面得到了用户的加入年份数据,数据概要如下:

summary(pf$year_joined)

输出如下:

image

汇总数据输出:

table(pf$year_joined)

image

  • 练习:需要将上述数据,按照 (2004, 2009] / (2009, 2011] / (2011, 2012] / (2012, 2014]进行分割汇总:
pf$year_joined.bucket <- cut(pf$year_joined,breaks = c(2004,2009,2011,2012,2014))
table(pf$year_joined.bucket)

image

  • 注意$.的差别:
pf.test1.test12 <- "test1.test12"  # 当前内存中创建一个变量`pf.test1.test2`
pf$test1 <- "test1" # pf数据框中,创建一个字段`test1`
pf$test1.test12 <- "test1.test12" # pf数据框中,创建一个字段`test1.test12`

image

关于cut函数的使用,可以?cut查看帮助。

11. 练习: 绘制在一起

类似于上面的4. 练习,这里根据加入facebook的时间段,分段描述age与好友数的更关系:

ggplot(aes(x = age, y = friend_count), 
              data = subset(pf, !is.na(year_joined.bucket))) + 
#  geom_line(aes(color = gender), stat = 'summary', fun.y = median) +
  geom_line(aes(color = year_joined.bucket), stat = 'summary', fun.y = median)

image

12. 练习: 绘制总均值

根据加入年份,绘制age与平均好友数的分组图,另外叠加一个总体的平均好友数线。

ggplot(aes(x = age, y = friend_count), 
              data = subset(pf, !is.na(year_joined.bucket))) + 
  geom_line(aes(color = year_joined.bucket), stat = 'summary', fun.y = mean) + 
  geom_line(stat="summary",fun.y=mean,linetype=2)

image

13. 练习: 好友率

求好友数与加入facebook天数的比率:

  • 我自己的方式,很繁琐,还创建了一个新的数据集,浪费内存:
tenureover0 <- subset(pf,pf$tenure>0)
tenureover0$tenure_count <- tenureover0$friend_count / tenureover0$tenure
summary(tenureover0$tenure_count)
  • 视频中的方式:
with(subset(pf,tenure >=1),summary(friend_count / tenure))

最终结构都是相同的:

image

14. 练习: 申请好友数

  • x轴是加入facebook的天数,y是平均每天加入的好友数目
ggplot(aes(x = tenure, y = friendships_initiated / tenure), 
              data = subset(pf, tenure >= 1)) + 
  geom_line(aes(color = year_joined.bucket), stat = 'summary', fun.y = mean) 

通过下图发现随着使用时间的增加,新增好友数目会急剧减少。

image

15. 练习: 偏差方差折衷

上面的图形中有很多噪音,通过下面的方式可以手动去除噪音:

p0 <- ggplot(aes(x = tenure, y = friendships_initiated / tenure), 
              data = subset(pf, tenure >= 1)) + 
  geom_line(aes(color = year_joined.bucket), stat = 'summary', fun.y = mean) 

p1 <- ggplot(aes(x = 7*round(tenure/7), y = friendships_initiated / tenure), 
              data = subset(pf, tenure >= 1)) + 
  geom_line(aes(color = year_joined.bucket), stat = 'summary', fun.y = mean) 

p2 <- ggplot(aes(x = 30*round(tenure/30), y = friendships_initiated / tenure), 
              data = subset(pf, tenure >= 1)) + 
  geom_line(aes(color = year_joined.bucket), stat = 'summary', fun.y = mean) 

p3 <- ggplot(aes(x = 90*round(tenure/90), y = friendships_initiated / tenure), 
              data = subset(pf, tenure >= 1)) + 
  geom_line(aes(color = year_joined.bucket), stat = 'summary', fun.y = mean) 

library(gridExtra)

grid.arrange(p0,p1,p2,p3,ncol=1)

image

或是叠加一个平滑线:

ggplot(aes(x = tenure, y = friendships_initiated / tenure), 
              data = subset(pf, tenure >= 1)) + 
  geom_line(aes(color = year_joined.bucket), stat = 'summary', fun.y = mean) +
  geom_smooth(method="auto",color="red")

image

  • 视频中的方式,使用geom_smooth函数:
ggplot(aes(x = tenure, y = friendships_initiated / tenure), 
              data = subset(pf, tenure >= 1)) + 
  geom_smooth(aes(color = year_joined.bucket))

image

17. 酸奶数据集简介

yo <- read.csv("yogurt.csv")
str(yo)

image

  • 将id转换为factor:
yo$id <- factor(yo$id)
str(yo)

image

18. 练习: 重访直方图

  • 构建一个价格的直方图:
p1 <- ggplot(aes(x = price), data = yo) + geom_histogram(binwidth = 1)
p2 <- ggplot(aes(x = price), data = yo) + geom_histogram(binwidth = 10)

library(gridExtra)
grid.arrange(p1,p2,ncol=1)

image

上面的图中,可以看出价格的设置是有一定规律的,差不多以10为单位,所以下面的图将binwidth设置为10,可以看到其对比。

19. 练习: 购买数量

  • 继续探索数据-汇总数据
summary(yo)

image

上面的price的第三个四分位与最大值是相同的。

  • 查看价格的种类
unique(yo$price)
length(unique(yo$price))

输出分别为:

image

  • 将数据集按照price汇总:
table(yo$price)

image

  • 练习:

一条数据中,客户可能购买了多种口味的酸奶,现在需要将各种口味的酸奶汇总成一个新的变量:

使用transform()变形函数:

yo <- transform(yo,all.purchases=(strawberry + blueberry + pina.colada + plain + mixed.berry))
head(yo,20)

两种方式都可以:

yo$all.purchases + yo$strawberry + yo$blueberry + yo$pina.colada + yo$plain + yo$mixed.berry

head(yo,20)

image

20. 练习: 随时间变化的价格

  • 随时间变化的价格图:
ggplot(aes(x=time,y=price),data=yo) + geom_jitter(alpha=0.25,shape=21,fill=I("#F79420"))

image

上图可以看出,价格在一段时间内是一定的,另外偶尔有一些不同的价格出现,可能是商家促销,或是用户用了打折券。

22. 练习: 查看家庭样本

  • 首先创建随机数种子,随机选取16个家庭,注意语法 %in%
set.seed(4230)
sample.ids <- sample(levels(yo$id),16)

ggplot(aes(x=time,y=price),
       data=subset(yo,id %in% sample.ids)) + 
       facet_wrap(~id) +
       geom_line() + 
       geom_point(aes(size=all.purchases),pch=1)

image

23. 截面数据的限制

比较一下facebook数据集,facebook数据集只是某个时间点时,其好友数等信息。而酸奶数据集,有某个家庭在一段时间内的购买记录,更适合进行纵向分析。

25. 练习: 散点图矩阵

  • 创建变量与变量之间的散点图,最终形成一个散点图矩阵
#install.packages("GGally")
library(GGally)
theme_set(theme_minimal(20))

set.seed(1836)
pf_subset <- pf[,c(2:5)]
names(pf_subset)
ggpairs(pf_subset[sample.int(nrow(pf_subset),1000),])

image

26. 更多变量

导入另一个数据集,基因数据集:

nci <- read.table("nci.tsv")
colnames(nci) <- c(1:64)
head(nci)

27. 热图

library(reshape2)

nci.long.samp <- melt(as.matrix(nci[1:200,]))

names(nci.long.samp) <- c("gene","case","value")
#head(nci.long.samp)

ggplot(aes(y=gene,x=case,fill=value),
       data=nci.long.samp) +
  geom_tile() +
  scale_fill_gradientn(colors=colorRampPalette(c("blue","red"))(100))

image

28. 【总结】练习: 分析三个或更多变量

本节中学习了:

  1. 使用前几课的技巧并进行了扩展,以便一次调查多个变量的模式。
  2. 从散点图的扩展开始,为多个组添加汇总。
  3. 采用一些技术来一次检查大量的变量,例如散点图和热图。
  4. 重塑了数据,将每种情况一行的长数据,组合为一行的宽数据(list.7)