データサイエンス講義 2章「統計的推論、探索的データ分析、データサイエンスのプロセス」 その3
2章の例題のプログラミングについて。
※書籍記載のコードをほぼそのままパクリ。
※コードの後半はコーディングした箇所もあるが、まだまだしょぼい。
※記事の最後に、参考にしたページのまとめ有。
- 作者: Rachel Schutt,Cathy O'Neil,瀬戸山雅人,石井弓美子,河内崇,河内真理子,古畠敦,木下哲也,竹田正和,佐藤正士,望月啓充
- 出版社/メーカー: オライリージャパン
- 発売日: 2014/10/25
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
2.2.2 演習問題:EDA
【対象データ】
2012年5月のニューヨーク・タイムズのHPで各ユーザに対する広告表示回数、及びクリック回数について。
【利用言語】
【コードと一部結果】
# # # # # # # # # # # # # # # # # # # # #
#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)
# # # # # # # # # # # # # # # # # # # # #
結果は、以下のような図が出力。
# # # # # # # # # # # # # # # # # # # # #
#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()
# # # # # # # # # # # # # # # # # # # # #
年齢カテゴリ別にクリック率密度を表示。
# # # # # # # # # # # # # # # # # # # # #
#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))
# # # # # # # # # # # # # # # # # # # # #
クリックしたユーザを対象として、クリック率をプロット。
データ整形のコーディング、可視化の方法がまだまだしょぼい気がする。
■参考にしたページ
○cut関数の使い方。
○データ加工と抽出について。
http://cse.naro.affrc.go.jp/takezawa/r-tips/r/44.html
○factor関数(因子型への変換)について。
○ggplot関数の使い方(散布図しか見てないが、具体例もあり良さそう)。
ggplotで散布図を作る geom_point()の使い方 | Memo on the Web
○NULL,NA等の欠損値確認、及びその対処法