EPG's BLOG

某金融会社の社内SE。気になったことをちょいちょい書いていきます

データサイエンス講義 2章「統計的推論、探索的データ分析、データサイエンスのプロセス」 その3

2章の例題のプログラミングについて。

※書籍記載のコードをほぼそのままパクリ。

※コードの後半はコーディングした箇所もあるが、まだまだしょぼい。

※記事の最後に、参考にしたページのまとめ有。

 

データサイエンス講義

データサイエンス講義

 

 

2.2.2 演習問題:EDA

【対象データ】

2012年5月のニューヨーク・タイムズのHPで各ユーザに対する広告表示回数、及びクリック回数について。

 

【利用言語】

R言語

 

【コードと一部結果】

# # # # # # # # # # # # # # # # # # # # # 

#Program1

#ユーザの広告表示回数とクリック回数

#Age,Gender(0:女性,1:男性),Impressions(広告表示回数),Clicks,Signed_In
data1<-read.csv("http://stat.columbia.edu/~rachel/datasets/nyt1.csv")

#最初の数行だけ表示
head(data1)
#変数data1にカラムagecatを追加
#Ageをカテゴリに分類
data1$agecat<-cut(data1$Age,c(-Inf,0,18,24,34,44,54,64,Inf))
summary(data1)

install.packages("doBy")
library("doBy")
siterange<-function(x){c(length(x),min(x),mean(x),max(x))}
#agecatを軸にImpressionsの特徴量を分析
summaryBy(Impressions~agecat, data = data1, FUN = siterange)

# # # # # # # # # # # # # # # # # # # # # 

 

最後のコードを実行すると、以下のような結果が。

agecat Gender.mean Signed_In.mean Impressions.mean Clicks.mean

1 (-Inf,0] 0.0000000 0 4.999657 0.14207985
2 (0,18] 0.6421151 1 4.998961 0.13105132
3 (18,24] 0.5338531 1 5.006635 0.04845478
4 (24,34] 0.5321621 1 4.993829 0.05048647
5 (34,44] 0.5316963 1 5.021507 0.05167937
6 (44,54] 0.5289790 1 5.010406 0.05027377
7 (54,64] 0.5361885 1 5.022308 0.10183736
8 (64, Inf] 0.3632664 1 5.012347 0.15128856

 

agecat(-Inf,0]にデータがある理由は、非ログインユーザの年齢が取れないことで、0を置いているためかと。

子供や高齢者はクリック率が高いが、大学生や社会人は、クリック率が低い。

 

# # # # # # # # # # # # # # # # # # # # # 

#Program2(Program1の続きに挿入)

install.packages("ggplot2")
library("ggplot2")
#x軸がImpression数、y軸はレコード数、agecat毎に表示
ggplot(data1, aes(x = Impressions, fill = agecat))+ geom_histogram(binwidth=1)

# # # # # # # # # # # # # # # # # # # # # 

 

結果は、以下のような図が出力。

f:id:EPG:20141102171733p:plain

 

 

# # # # # # # # # # # # # # # # # # # # # 

#Program3(Program2の続きに挿入)

#Impression数で判別
data1$hasimps<-cut(data1$Impressions,c(-Inf,0,Inf))
summaryBy(Clicks~hasimps,data=data1,FUN=siterange)

#クリック率の算出
data1$rate<-ifelse(is.na(data1$Clicks/data1$Impressions),0,data1$Clicks/data1$Impressions)
summaryBy(rate~agecat, data = data1, FUN = siterange)

#Impressionsが0より大きいレコード(広告を表示したユーザ)に対し、クリック率をグラフ化
ggplot(subset(data1, Impressions>0), aes(x=rate, colour=agecat)) + geom_density()
#クリックがあったレコードに対し、クリック率をグラフ化
ggplot(subset(data1, Clicks>0), aes(x=rate, colour=agecat)) + geom_density()

# # # # # # # # # # # # # # # # # # # # # 

 

年齢カテゴリ別にクリック率密度を表示。

f:id:EPG:20141102171913p:plain

 

 

# # # # # # # # # # # # # # # # # # # # # 

#Program4(Program3の後に挿入)

#広告非表示、広告表示(未クリック)、広告表示(クリック)の3カテゴリに分類
data1$scode[data1$Impressions == 0] <- "NoImps"
data1$scode[data1$Impressions > 0] <- "Imps"
data1$scode[data1$Clicks > 0] <- "Clicks"

#因子型データに変換
data1$scode<-factor(data1$scode)

clen<-function(x){c(length(x),mean(x))}
(etable<-summaryBy(Impressions+rate~scode+agecat+Gender,data=data1,FUN=clen))

#クリックしたユーザを抽出
baretable<-subset(etable,scode=="Clicks")
(baretable<-data.frame(baretable$agecat,baretable$rate.FUN2,baretable$Gender))
baretable$baretable.Gender<-factor(baretable$baretable.Gender)
#年齢別クリック率
ggplot(baretable,aes(x=baretable.agecat,y=baretable.rate.FUN2)) +
geom_point(aes(colour=baretable.Gender))

# # # # # # # # # # # # # # # # # # # # # 

 

クリックしたユーザを対象として、クリック率をプロット。

f:id:EPG:20141102172229p:plain

 

データ整形のコーディング、可視化の方法がまだまだしょぼい気がする。

 

■参考にしたページ

○cut関数の使い方。

9. 2変量データの要約 - 統計ソフトRの使い方

 

○データ加工と抽出について。

http://cse.naro.affrc.go.jp/takezawa/r-tips/r/44.html

 

○factor関数(因子型への変換)について。

7. ベクトルデータの操作 - 統計ソフトRの使い方

 

○ggplot関数の使い方(散布図しか見てないが、具体例もあり良さそう)。

ggplotで散布図を作る geom_point()の使い方 | Memo on the Web

 

○NULL,NA等の欠損値確認、及びその対処法

http://itbc-world.com/home/rfm/r%E3%81%AE%E6%A9%9F%E8%83%BD/null%E3%83%BBna%E7%AD%89%E3%81%AE%E7%A2%BA%E8%AA%8D/