探索单一变量

What to Do First?

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

Histogram of Users' Birthdays

names(pf)
library(ggplot2)
summary(pf$dob_day)

qplot(x=dob_day,data=pf,bins=31)+
  scale_x_continuous(breaks=1:31)

ggplot(aes(x=dob_day),data=pf)+
  geom_histogram(bins=31)+
  scale_x_continuous(breaks=1:31)

Faceting

qplot(x=dob_day,data=pf,bins=31)+
  scale_x_continuous(breaks=1:31)+
  facet_wrap(~dob_month,ncol=3)

ggplot(aes(x=dob_day),data=pf)+
  geom_histogram(bins=31)+
  scale_x_continuous(breaks=1:31)+
  facet_wrap(~dob_month,ncol=3)

facet_grid(vertical~horizontal)

传递两个或多个变量时使用facet_grid

Friend Count

qplot(x=friend_count,data=pf)

ggplot(aes(x=friend_count),data=pf)+
  geom_histogram()

Limiting the Axes

限制轴,避免长尾数据

qplot(x=friend_count,data=pf,xlim=c(0,1000))

qplot(x=friend_count,data=pf)+
  scale_x_continuous(limits = c(0,1000))

ggplot(aes(x=friend_count),data=pf)+
  geom_histogram()+
  scale_x_continuous(limits=c(0,1000))

Adjusting the Bin Width

qplot(x=friend_count,data=pf,binwidth=25)+
  scale_x_continuous(limits = c(0,1000),breaks=seq(0,1000,50))

ggplot(aes(x=friend_count),data=pf)+
  geom_histogram(binwidth=25)+
  scale_x_continuous(limits=c(0,1000),breaks=seq(0,1000,50))

Faceting Friend Count

qplot(x=friend_count,data=pf,binwidth=25)+
  scale_x_continuous(limits = c(0,1000),breaks=seq(0,1000,50))+
  facet_wrap(~gender)

ggplot(aes(x=friend_count),data=pf)+
  geom_histogram(binwidth=25)+
  scale_x_continuous(limits=c(0,1000),breaks=seq(0,1000,50))+
  facet_wrap(~gender)

Omitting NA Values

R 将缺失值表现为NA

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

ggplot(aes(x=friend_count),data=subset(pf,!is.na(gender)))+
  geom_histogram(binwidth=25)+
  scale_x_continuous(limits=c(0,1000),breaks=seq(0,1000,50))+
  facet_wrap(~gender)

na.omit(pf)将去掉数据集中所有包含NA的条目

qplot(x=friend_count,data=na.omit(pf),binwidth=25)+
  scale_x_continuous(limits = c(0,1000),breaks=seq(0,1000,50))+
  facet_wrap(~gender)

ggplot(aes(x=friend_count),data=na.omit(pf))+
  geom_histogram(binwidth=25)+
  scale_x_continuous(limits=c(0,1000),breaks=seq(0,1000,50))+
  facet_wrap(~gender)

通过上述生成的直方图,很难判断哪个性别的平均好友数更多


Statistics 'by' Gender

table(pf$gender)
by(pf$friend_count,pf$gender,summary)

Tenure

Notes:

color为16进制颜色代码,参见https://en.wikipedia.org/wiki/Web_colors

qplot(x=tenure,data=pf,binwidth=30,
      color=I('Black'),fill=I('#099DD9'))

ggplot(aes(x=tenure),data=pf)+
  geom_histogram(binwidth=30,color='Black',fill='#099DD9')
  

create a histogram of tenure by year?

qplot(x=tenure/365,data=pf,binwidth=1,
      color=I('Black'),fill=I('#099DD9'))

ggplot(aes(x=tenure/365),data=pf)+
  geom_histogram(binwidth=1,color='Black',fill='#099DD9')

Labeling Plots

qplot(x=tenure/365,data=pf,
      xlab='Number of years using Facebook',
      ylab='Number of users in sample',
      color=I('Black'),fill=I('#099DD9'))+
  scale_x_continuous(breaks=seq(1,7,1),limits=c(0,7))

ggplot(aes(x=tenure/365),data=pf,
       xlab='Number of years using Facebook',
       ylab='Number of users in sample')+
  geom_histogram(color='Black',fill='#099DD9')+
  scale_x_continuous(breaks=seq(1,7,1),limits=c(0,7))
  

User Ages

summary(pf$age)

qplot(x=age,data=pf,binwidth=1,
      color=I('Black'),fill=I('#099DD9'))+
  scale_x_continuous(breaks=seq(0,113,5),limits=c(0,113))

ggplot(aes(x=age),data=pf)+
  geom_histogram(color='Black',fill='#099DD9',binwidth = 1)+
  scale_x_continuous(breaks=seq(0,113,5),limits=c(0,113))
  

Transforming Data

Notes:

p1 <- qplot(x=friend_count,data=pf)
summary(pf$friend_count)
summary(log10(pf$friend_count+1))
summary(sqrt(pf$friend_count))

p2 <- qplot(x=log10(pf$friend_count+1),data=pf)
p3 <- qplot(x=sqrt(pf$friend_count),data=pf)
library(gridExtra)
grid.arrange(p1,p2,p3,ncol=1)

使用ggplot的版本

p1 <- ggplot(aes(x=friend_count),data=pf)+
  geom_histogram()
p2 <- p1+scale_x_log10()
p3 <- p1+scale_x_sqrt()
grid.arrange(p1,p2,p3,ncol=1)

Add a Scaling Layer

logScale <- qplot(x=log10(pf$friend_count),data=pf)
countScale <- ggplot(aes(x=friend_count),data=pf)+
  geom_histogram()+
  scale_x_log10()
grid.arrange(logScale,countScale,ncol=2)

qplot(x=pf$friend_count,data=pf)+
  scale_x_log10()

上面两幅图的区别在于X轴上的标记不同


频数多边形

qplot(x=friend_count,y=..count../sum(..count..),
      data=subset(pf,!is.na(gender)),
      xlab='Friend count',
      ylab='Proportion of users with that friend count',
      binwidth=10,geom='freqpoly',color=gender)+
  scale_x_continuous(limits = c(0,1000),breaks=seq(0,1000,50))

ggplot(aes(x = friend_count, y = ..count../sum(..count..)), 
       data = subset(pf, !is.na(gender)),
       xlab='好友数量',
       ylab='Percentage of users with that friend count') + 
  geom_freqpoly(aes(color = gender), binwidth=10) + 
  scale_x_continuous(limits = c(0, 1000), breaks = seq(0, 1000, 50))

qplot(x=www_likes,data=subset(pf,!is.na(gender)),
      geom='freqpoly',color=gender)+
  scale_x_continuous()+
  scale_x_log10()

ggplot(aes(x=www_likes),data=subset(pf,!is.na(gender)))+
  geom_freqpoly(aes(color=gender))+
  scale_x_continuous()+
  scale_x_log10()
  

Likes on the Web

by(pf$www_likes,pf$gender,sum)

Box Plots

qplot(x=gender,y=friend_count,
      data=subset(pf,!is.na(gender)),
      geom='boxplot')

ggplot(aes(x=gender,y=friend_count),
       data=subset(pf,!is.na(gender)))+
  geom_boxplot()


Adjust the code to focus on users who have friend counts between 0 and 1000.

qplot(x=gender,y=friend_count,
      data=subset(pf,!is.na(gender)),
      geom='boxplot',ylim=c(0,1000))

qplot(x=gender,y=friend_count,
      data=subset(pf,!is.na(gender)),
      geom='boxplot')+
  scale_y_continuous(lim=c(0,1000))

ggplot(aes(x=gender,y=friend_count),
       data=subset(pf,!is.na(gender)))+
  geom_boxplot()+
  scale_y_continuous(lim=c(0,1000))

使用coord_cartesian

qplot(x=gender,y=friend_count,
      data=subset(pf,!is.na(gender)),
      geom='boxplot')+
  coord_cartesian(ylim=c(0,1000))

ggplot(aes(x=gender,y=friend_count),
       data=subset(pf,!is.na(gender)))+
  geom_boxplot()+
  coord_cartesian(ylim=c(0,1000))

Box Plots, Quartiles, and Friendships

qplot(x=gender,y=friend_count,
      data=subset(pf,!is.na(gender)),
      geom='boxplot')+
  coord_cartesian(ylim=c(0,250))

ggplot(aes(x=gender,y=friend_count),
       data=subset(pf,!is.na(gender)))+
  geom_boxplot()+
  coord_cartesian(ylim=c(0,250))

by(pf$friend_count,pf$gender,summary)

coord_cartesian的结果和表输出的结果一致(包括中位数等

names(pf)
by(pf$friendships_initiated,pf$gender,mean)
summary(pf$friendships_initiated)

qplot(x=gender,y=friendships_initiated,
      data=subset(pf,!is.na(gender)),
      geom='boxplot')+
  coord_cartesian(ylim=c(0,200))

ggplot(aes(x=gender,y=friendships_initiated),
       data=subset(pf,!is.na(gender)))+
  geom_boxplot()+
  coord_cartesian(ylim=c(0,200))

箱线图帮助我们理解数据的分布,感知异常值


Getting Logical 符合逻辑

summary(pf$mobile_likes)
summary(pf$mobile_likes>0)
pf$mobile_check_in <- NA
pf$mobile_check_in <- ifelse(pf$mobile_likes>0,1,0)
pf$mobile_check_in <- factor(pf$mobile_check_in)
summary(pf$mobile_check_in)

what percent of check in using mobile?

sum(pf$mobile_check_in==1)/length(pf$mobile_check_in)

习题集
1.对数据的基本了解

data(diamonds)
View(diamonds)
str(diamonds)
?diamonds

2.价格直方图

qplot(data=diamonds,x=price,binwidth=300)+
  scale_x_continuous(limits=c(0,20000),breaks=seq(0,20000,2000))

ggplot(aes(x=price),data=diamonds)+
  geom_histogram(binwidth = 300)+
  scale_x_continuous(limits=c(0,20000),breaks=seq(0,20000,2000))

3.钻石数量

lessthan500 <-subset(diamonds,price<500)
dim(lessthan500)

lessthan250 <-subset(diamonds,price<250)
dim(lessthan250)

morethan15000 <-subset(diamonds,price>=15000)
dim(morethan15000)

4.廉价钻石

qplot(data=diamonds,x=price,binwidth=100)+
  scale_x_continuous(limits=c(0,2000),breaks=seq(0,2000,100))

ggplot(aes(x=price),data=diamonds)+
  geom_histogram(binwidth = 100)+
  scale_x_continuous(limits=c(0,2000),breaks=seq(0,2000,100))

ggsave('priceHistogram.png')

5.the histogram of diamond prices by cut.

qplot(data=diamonds,x=price,binwidth=1000)+
  scale_x_continuous(limits=c(0,20000),breaks=seq(0,20000,4000))+
  facet_wrap(~cut,ncol=5)

ggplot(aes(x=price),data=diamonds)+
  geom_histogram(binwidth = 1000)+
  scale_x_continuous(limits=c(0,20000),breaks=seq(0,20000,4000))+
  facet_wrap(~cut,ncol=5)

6.切工-价格

by(diamonds$price,diamonds$cut,max)
by(diamonds$price,diamonds$cut,min)
by(diamonds$price,diamonds$cut,median)

7.由切工决定的每克拉价格,使用scales,可使分隔后每个图的y轴标度不一样

ggplot(data=diamonds,aes(x=(price/carat)))+geom_histogram()+
  facet_wrap(~cut,scales='free_y')+
  scale_x_log10()

qplot(data=diamonds,x=(price/carat))+
  facet_wrap(~cut,scales='free_y')+
  scale_x_log10()

8.价格箱线图

qplot(data=diamonds,
      x=color,y=price,geom='boxplot')+
  coord_cartesian(ylim=c(0,10000))

ggplot(aes(x=color,y=price),data=diamonds)+
  geom_boxplot()+
  coord_cartesian(ylim=c(0,10000))

9.四分位数以及IQR

quantile(subset(diamonds, color=='D')$price) 
quantile(subset(diamonds,color== 'J')$price)

IQR(subset(diamonds,color=='D')$price)
IQR(subset(diamonds,color=='J')$price)

10.由颜色表示的每克拉价格箱线图

ggplot(aes(x=color,y=price/carat),data=diamonds)+
  geom_boxplot()+
  coord_cartesian(ylim=c(0,8000))

qplot(x=color,y=price/carat,data=diamonds,geom='boxplot')+
  coord_cartesian(ylim=c(0,8000))

11.克拉频率多边形


qplot(x=carat,data=diamonds,
      xlab='carat',
      ylab='frequency',
      binwidth=0.01,geom='freqpoly')+
  scale_x_continuous(breaks=seq(0,5,0.2))+
  scale_y_continuous(breaks=seq(0,12000,2000))

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

推荐阅读更多精彩内容