- 3. 练习: 第三个定性变量
- 4. 练习: 绘制条件小结
- 6. 宽格式和长格式
- 7. 重塑数据
- 8. 练习:比率图
- 9. 练习: 第三个定量变量
- 10. 练习: 切割一个变量
- 11. 练习: 绘制在一起
- 12. 练习: 绘制总均值
- 13. 练习: 好友率
- 14. 练习: 申请好友数
- 15. 练习: 偏差方差折衷
- 17. 酸奶数据集简介
- 18. 练习: 重访直方图
- 19. 练习: 购买数量
- 20. 练习: 随时间变化的价格
- 22. 练习: 查看家庭样本
- 23. 截面数据的限制
- 25. 练习: 散点图矩阵
- 26. 更多变量
- 27. 热图
- 28. 【总结】练习: 分析三个或更多变量
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)
发现女性的好友数,明显多于男性,有可能是因为女性用户的年龄分布,与男性用户的年龄分布不同导致, 下面观察男女用户的年龄分布:
ggplot(aes(x = gender, y = age),
data = subset(pf, !is.na(gender))) + geom_boxplot() +
stat_summary(fun.y = mean,geom = "point",shape = 4)
女性用户的年龄层,比男性用户更大。
观察各个年龄层上,男女用户的好友数量
,取的是好友数目的中位数:
ggplot(aes(x=age,y=friend_count),
data = subset(pf,!is.na(gender))) +
geom_line(aes(color=gender),stat="summary",fun.y=median)
- 根据年龄和性别同时分组:
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)
4. 练习: 绘制条件小结
要得到的图形,与上面的类似,都是通过年龄和gender分组,得到好友的分布图: 但是这个利用了上面的分组数据集,实现方式不同:
ggplot(aes(x=age,y=median_friend_count),data=pf.fc_by_age_gender) +
geom_line(aes(color=gender))
6. 宽格式和长格式
观察上面生成的数据集pf.fc_by_age_gender
,在继续后续的分析之前,还要对数据进行重组,将数据从长格式转换为宽格式:
- 使用
tidyr
包重组数据:
#install.packages("tidyr")
library(tidyr)
spread(subset(pf.fc_by_age_gender, select = c('gender', 'age', 'median_friend_count')), gender, median_friend_count)
重组后数据结构如下:
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)
可以得到与上面相同的数据集。
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))
9. 练习: 第三个定量变量
通过使用的天数,计算加入Facebook的年份
pf$year_joined <- 2014 - ceiling(pf$tenure / 365)
10. 练习: 切割一个变量
上面得到了用户的加入年份数据,数据概要如下:
summary(pf$year_joined)
输出如下:
汇总数据输出:
table(pf$year_joined)
- 练习:需要将上述数据,按照
(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)
- 注意
$
与.
的差别:
pf.test1.test12 <- "test1.test12" # 当前内存中创建一个变量`pf.test1.test2`
pf$test1 <- "test1" # pf数据框中,创建一个字段`test1`
pf$test1.test12 <- "test1.test12" # pf数据框中,创建一个字段`test1.test12`
关于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)
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)
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))
最终结构都是相同的:
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)
通过下图发现随着使用时间的增加,新增好友数目会急剧减少。
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)
或是叠加一个平滑线:
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")
- 视频中的方式,使用
geom_smooth
函数:
ggplot(aes(x = tenure, y = friendships_initiated / tenure),
data = subset(pf, tenure >= 1)) +
geom_smooth(aes(color = year_joined.bucket))
17. 酸奶数据集简介
yo <- read.csv("yogurt.csv")
str(yo)
- 将id转换为factor:
yo$id <- factor(yo$id)
str(yo)
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)
上面的图中,可以看出价格的设置是有一定规律的,差不多以10为单位,所以下面的图将binwidth设置为10,可以看到其对比。
19. 练习: 购买数量
- 继续探索数据-汇总数据
summary(yo)
上面的price的第三个四分位与最大值是相同的。
- 查看价格的种类
unique(yo$price)
length(unique(yo$price))
输出分别为:
- 将数据集按照price汇总:
table(yo$price)
- 练习:
一条数据中,客户可能购买了多种口味的酸奶,现在需要将各种口味的酸奶汇总成一个新的变量:
使用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)
20. 练习: 随时间变化的价格
- 随时间变化的价格图:
ggplot(aes(x=time,y=price),data=yo) + geom_jitter(alpha=0.25,shape=21,fill=I("#F79420"))
上图可以看出,价格在一段时间内是一定的,另外偶尔有一些不同的价格出现,可能是商家促销,或是用户用了打折券。
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)
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),])
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))
28. 【总结】练习: 分析三个或更多变量
本节中学习了:
- 使用前几课的技巧并进行了扩展,以便一次调查多个变量的模式。
- 从散点图的扩展开始,为多个组添加汇总。
- 采用一些技术来一次检查大量的变量,例如散点图和热图。
- 重塑了数据,将每种情况一行的长数据,组合为一行的宽数据(list.7)