探索两个变量

getwd()
list.files()
pf <- read.csv("pseudo_facebook.tsv",sep='\t')
pf <- read.delim('pseudo_facebook.tsv') 

Scatterplots

library(ggplot2)
qplot(x=age,y=friend_count,data=pf)
qplot(age,friend_count,data=pf)
ggplot(aes(x=age,y=friend_count),data=pf)+
  geom_point()

ggplot Syntax

ggplot(aes(x=age,y=friend_count),data=pf)+
  geom_point()+
  xlim(13,90)

Overplotting

对于散点图出现重叠,我们可以用alph参数来解决
gitter向图表添加噪音

ggplot(aes(x=age,y=friend_count),data=pf)+
  geom_jitter(alpha=1/20)+
  xlim(13,90)

Coord_trans()

ggplot(aes(x=age,y=friend_count),data=pf)+
  geom_point(alpha=1/20)+
  xlim(13,90)+
  coord_trans(y='sqrt')

ggplot(aes(x=age,y=friend_count),data=pf)+
  geom_point(alpha=1/20,position=position_jitter(h=0))+
  xlim(13,90)+
  coord_trans(y='sqrt')

如果要在y='sqrt'的基础上添加噪音,那么要使用新的参数position=position_jitter(h=0),因为一些人的好友数为0,添加噪音后会出现负数,那么取sqrt就会出现虚数


Alpha and Jitter

Notes:

names(pf)
summary(pf$friendships_initiated)
ggplot(aes(x=age,y=friendships_initiated),data=pf)+
  geom_point(alpha=1/10,position=position_jitter(h=0))+
  xlim(13,90)+
  coord_trans(y='sqrt')

Conditional Means

library(dplyr)
age_groups <- group_by(pf,age)
pf.fc_by_age <- summarise(age_groups,
                          friend_count_mean = mean(friend_count),
                          friend_count_median=median(as.numeric(friend_count)),
                          n=n())
pf.fc_by_age <- arrange(pf.fc_by_age,age)
head(pf.fc_by_age)

使用%>%的版本

pf.fc_by_age <- pf %>%
  group_by(age)%>%
  summarise(friend_count_mean=mean(friend_count),
            friend_count_median=median(as.numeric(friend_count)),
            n=n())%>%
  arrange(age)

head(pf.fc_by_age)

Create plot use pf.fc_by_age

ggplot(aes(x=age,y=friend_count_mean),data=pf.fc_by_age)+
  geom_point()
ggplot(aes(x=age,y=friend_count_mean),data=pf.fc_by_age)+
  geom_line()

将年龄和平均好友数的图添加到原来的年龄-好友数的散点图中

原图:

ggplot(aes(x=age,y=friend_count),data=pf)+
  xlim(13,90)+
  geom_point(alpha=1/20,
             position=position_jitter(h=0),
             color='orange')+
  coord_trans(y='sqrt')

添加后的图:

ggplot(aes(x=age,y=friend_count),data=pf)+
  xlim(13,90)+
  geom_point(alpha=1/20,
             position=position_jitter(h=0),
             color='orange')+
  coord_trans(y='sqrt')+
  geom_line(stat='summary',fun.y=mean)

继续在上图中添加数据的分位数(10%,90%,中位数)

ggplot(aes(x=age,y=friend_count),data=pf)+
  xlim(13,90)+
  geom_point(alpha=1/20,
             position=position_jitter(h=0),
             color='orange')+
  coord_trans(y='sqrt')+
  geom_line(stat='summary',fun.y=mean)+
  geom_line(stat='summary',fun.y=quantile,fun.args=list(probs=0.1),
            color='blue',linetype=2)+
  geom_line(stat='summary',fun.y=quantile,fun.args=list(probs=0.9),
            color='blue',linetype=2)+
  geom_line(stat='summary',fun.y=quantile,fun.args=list(probs=0.5),
            color='blue')

对数据进行限制,放大数据

ggplot(aes(x=age,y=friend_count),data=pf)+
  geom_point(alpha=1/20,
             position=position_jitter(h=0),
             color='orange')+
  coord_trans(y='sqrt')+
  geom_line(stat='summary',fun.y=mean)+
  geom_line(stat='summary',fun.y=quantile,fun.args=list(probs=0.1),
            color='blue',linetype=2)+
  geom_line(stat='summary',fun.y=quantile,fun.args=list(probs=0.9),
            color='blue',linetype=2)+
  geom_line(stat='summary',fun.y=quantile,fun.args=list(probs=0.5),
            color='blue')+
  coord_cartesian(xlim=c(13,70),ylim=c(0,1000))

Correlation

cor.test(pf$age,pf$friend_count)
cor.test(pf$age,pf$friend_count,method='pearson')
with(pf,cor.test(age,friend_count,method='pearson'))

Correlation on Subsets

with(subset(pf,age<=70),cor.test(age, friend_count))
with(subset(pf,age<=70),cor.test(age, friend_count,method='pearson'))

Correlation Methods

单调关系的度量

with(subset(pf,age<=70),cor.test(age, friend_count,method='spearman'))

"likes_received"和"www_likes_received"之间的散点图

summary(pf$likes_received)
summary(pf$www_likes_received)
ggplot(aes(x=www_likes_received,y=likes_received),data=pf)+
  geom_point()

Strong Correlations

ggplot(aes(x=www_likes_received,y=likes_received),data=pf)+
  geom_point()+
  xlim(0,quantile(pf$www_likes_received,0.95))+
  ylim(0,quantile(pf$likes_received,0.95))+
  geom_smooth(method='lm',color='red')

geom_smooth(method='lm')中的lm代表linear model

Correlation between "likes_received" and "www_likes_received"

cor.test(pf$likes_received,pf$www_likes_received,method='pearson')

得到如此高的相关系数,是因为一个变量是另一个变量的超集


Moira on Correlation

通常会对变量做递归,而递归的假设是这些变量相互独立,所以要先研究变量之间的相关性,来决定哪些变量不要一同放入递归模型中


More Caution with Correlation


library(alr3)
data(Mitchell)
View(Mitchell)

plot: Temp vs Month

ggplot(aes(x=Month,y=Temp),data=Mitchell)+
  geom_point()
qplot(data=Mitchell,Month,Temp)

correlation coefficient: Temp vs Month

cor.test(Mitchell$Month,Mitchell$Temp)
with(Mitchell,cor.test(Month,Temp,method='pearson'))

Making Sense of Data

按月将月份和温度的散点图的X轴分隔开

summary(Mitchell$Month)
ggplot(aes(x=Month,y=Temp),data=Mitchell)+
  geom_point()+
  scale_x_continuous(breaks=seq(0,203,12))
  

拉伸该图片,使其x轴长于y轴,这时候我们发现:
图像出现了类似正弦/余弦一样的循环模式
数据的性质可以决定图像的模式


Understanding Noise: Age to Age Months

Notes:
如果选择更加精细的bins,那么图像会出现更多的噪音

pf$age_with_months <- pf$age + (12-pf$dob_month)/12

Age with Months Means

pf.fc_by_age_months <- pf %>%
  group_by(age_with_months)%>%
  summarise(friend_count_mean=mean(friend_count),
            friend_count_median=median(as.numeric(friend_count)),
            n=n())%>%
  ungroup()%>%
  arrange(age_with_months)
head(pf.fc_by_age_months)

不用%>%的另一种方法

age_month_groups <-group_by(pf,age_with_months)
pf.fc_by_age_months1 <- summarise(age_month_groups,
                                 fc_mean = mean(friend_count),
                                 fc_median=median(as.numeric(friend_count)),
                                 n=n())
pf.fc_by_age_months1 <-arrange(pf.fc_by_age_months1,age_with_months)
head(pf.fc_by_age_months1)

Noise in Conditional Means

ggplot(aes(x=age_with_months,y=friend_count_mean),
       data=subset(pf.fc_by_age_months,age_with_months<71))+
  geom_line()

Smoothing Conditional Means

年龄-好友数图:

p1 <- ggplot(aes(x=age,y=friend_count_mean),
       data=subset(pf.fc_by_age,age<71))+
  geom_line()

月龄-好友数图

p2 <- ggplot(aes(x=age_with_months,y=friend_count_mean),
       data=subset(pf.fc_by_age_months,age_with_months<71))+
  geom_line()
library(gridExtra)
grid.arrange(p1,p2,ncol=1)

将年龄在5的倍数内的用户混在一起计算平均好友数,并与之前的两个图放置在一起

p3 <- ggplot(aes(x=round(age/5)*5,y=friend_count),
             data=subset(pf,age<71))+
  geom_line(stat='summary',fun.y=mean)
grid.arrange(p1,p2,p3,ncol=1)

用平滑函数进行拟合

p1 <- ggplot(aes(x=age,y=friend_count_mean),
       data=subset(pf.fc_by_age,age<71))+
  geom_line()+
  geom_smooth()

p2 <- ggplot(aes(x=age_with_months,y=friend_count_mean),
       data=subset(pf.fc_by_age_months,age_with_months<71))+
  geom_line()+
  geom_smooth()

p3 <- ggplot(aes(x=round(age/5)*5,y=friend_count),
             data=subset(pf,age<71))+
  geom_line(stat='summary',fun.y=mean)
grid.arrange(p1,p2,p3,ncol=1)

习题集
1.价格与x

data(diamonds)
View(diamonds)
ggplot(aes(x=x,y=price),data=diamonds)+
  geom_point(alpha=1/10)

2.相关系数

cor.test(diamonds$price,diamonds$x)
cor.test(diamonds$price,diamonds$y)
cor.test(diamonds$price,diamonds$z)

3.价格与深度

ggplot(aes(x=depth,y=price),data=diamonds)+
  geom_jitter(alpha=1/50)

ggplot(data = diamonds, aes(x = depth, y = price)) + 
  geom_point(alpha=1/100)+
  scale_x_continuous(breaks=seq(0,80,2))

cor.test(diamonds$depth,diamonds$price)

4.价格与克拉

ggplot(data = diamonds, aes(x = carat, y = price)) + 
  geom_point(alpha=1/50)+
  xlim(0,quantile(diamonds$carat,0.9))+
  ylim(0,quantile(diamonds$price,0.9))

5.价格与体积

diamonds$v = diamonds$x*diamonds$y*diamonds$z

ggplot(data = diamonds, aes(x = v, y = price)) + 
  geom_point()

Some volumes are 0
we can find out how many diamonds have 0 volume by using

count(diamonds$v == 0)

The count() function comes with the plyr package.

library(plyr)

The plyr package will conflict with the dplyr package,so we must unload the plyr package when we use dplyr package.

detach("package:plyr", unload=TRUE)
library(dplyr)

6.子集相关性

with(subset(diamonds,v>0&v<800),cor.test(v,price))

7.调整 - 价格与体积

ggplot(data = subset(diamonds,v>0&v<800), aes(x = v, y = price)) + 
  geom_point(alpha=1/100)+
  geom_smooth()

8.平均价格--净度
Use the function dplyr package to create a new data frame containing info on diamonds by clarity.

Name the data frame diamondsByClarity
The data frame should contain the following variables in this order.
(1) mean_price
(2) median_price
(3) min_price
(4) max_price
(5) n
where n is the number of diamonds in each level of clarity.
法一

library(dplyr)
clarity_groups <- group_by(diamonds,clarity)
diamondsByClarity <- summarise(clarity_groups,
                              mean_price=mean(price),
                              median_price=median(as.numeric(price)),
                              min_price=min(price),
                              max_price=max(price),
                              n=n())
diamondsByClarity <- arrange(diamondsByClarity,clarity)

法二:

diamondsByClarity <- diamonds %>%
  group_by(clarity)%>%
  summarise(mean_price=mean(price),
            median_price=median(as.numeric(price)),
            min_price=min(price),
            max_price=max(price),
            n=n())%>%
  arrange(clarity)

9.平均价格柱状图(stat = "identity")

diamonds_by_clarity <- group_by(diamonds, clarity)
diamonds_mp_by_clarity <- summarise(diamonds_by_clarity, mean_price = mean(price))

diamonds_by_color <- group_by(diamonds, color)
diamonds_mp_by_color <- summarise(diamonds_by_color, mean_price = mean(price))

p1 <- ggplot(aes(x=color,y=mean_price),data=diamonds_mp_by_color)+
  geom_bar(stat = "identity")
p2 <- ggplot(aes(x=clarity,y=mean_price),data=diamonds_mp_by_clarity)+
  geom_bar(stat = "identity")
library(gridExtra)
grid.arrange(p1,p2,ncol=1)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,179评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,229评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,032评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,533评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,531评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,539评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,916评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,813评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,568评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,654评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,354评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,937评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,918评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,152评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,852评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,378评论 2 342