Rで解析:傾向が直感で理解できる!ggplot2でバイオリンプロットの作成

Rの解析に役に立つ記事
スポンサーリンク

アクセスの傾向を示す図として、棒グラフや折れ線グラフ、そして、慣れると快適な箱ひげ図があります。でも、これらの図は解析では非常に有用ですが、傾向を示すには取っ付きにくいです。そこで、見た目にアクセスの傾向が把握しやすいバイオリンプロットをggplot2で作成する方法をご紹介します。

スポンサーリンク

解析の前準備

  • Rのインストール 参考記事はこちら
  • ライブラリ”ggplot2”のインストール。

*ggplot2をインストールされていない方はまずはinstall.packages(“ggplot2”)をRで実行してください。

コードの実行

対象とするエクセルデータの書式は下記の通りです。表示されているセッション数は適当です。左から日付、時間帯、セッション数(visits)になります。時間帯は00〜23にしています。RとGoogle Analyticsを連携させデータを取得すると楽です。その際には、dimensions = “ga:date, ga:hour”、metrics = “ga:visits”と設定することで目的のデータを取得することが出来ます。

下記がバイオリンプロットを描写するコードです。

###ライブラリーの読み込み#####
library("XLConnect")
library("tcltk")
library("ggplot2")
########

###データの読み込み#####
sheetSelect <- 1 #&#35501;&#12415;&#36796;&#12416;&#12471;&#12540;&#12488;&#30058;&#21495;&#12434;&#20837;&#21147;
selectABook <- paste(as.character(tkgetOpenFile(title = "&#35430;&#39443;&#32080;&#26524;xlsx&#12501;&#12449;&#12452;&#12523;&#12434;&#36984;&#25246;",filetypes = '{"xlsx&#12501;&#12449;&#12452;&#12523;" {".xlsx"}}',initialfile = "*.xlsx")), sep = "", collapse =" ")
MasterAnaData <- loadWorkbook(selectABook)
AnaData <- readWorksheet(MasterAnaData, sheet = sheetSelect)

UniqueDate <- unique(AnaData[, 1]) #&#26085;&#12395;&#12385;&#12398;&#21336;&#19968;&#21270;
ViolinVisitsData <- NULL #&#12503;&#12525;&#12483;&#12488;&#29992;&#12398;visits&#12487;&#12540;&#12479;&#12398;&#26684;&#32013;&#29992;
ViolinPlotData <- NULL #&#12503;&#12525;&#12483;&#12488;&#29992;&#12398;&#12487;&#12540;&#12479;&#12398;&#26684;&#32013;&#29992;

###&#12487;&#12540;&#12479;&#12398;&#21152;&#24037;#####
for (n in seq(UniqueDate)){
  
  SubAnaData <- subset(AnaData, AnaData[, 1] == UniqueDate[n]) #&#12487;&#12540;&#12479;&#12434;&#26085;&#20184;&#12369;&#12391;&#25277;&#20986;
  
  #&#12487;&#12540;&#12479;&#12398;&#26178;&#31995;&#21015;&#12364;&#65298;&#65300;&#26178;&#38291;&#12376;&#12419;&#12394;&#12356;&#26178;&#12418;&#12354;&#12427;&#12398;&#12391;&#24565;&#12398;&#12383;&#12417;for&#12391;&#20966;&#29702;
  for (i in seq(nrow(SubAnaData))){
    
    hourVisits <- SubAnaData[i, 3] #&#26178;&#38291;&#21029;&#12398;visits&#12434;&#21462;&#24471;
    
    if(identical(all.equal(hourVisits, 0), TRUE)) #visit&#12364;&#12487;&#12540;&#12479;&#12501;&#12524;&#12540;&#12512;&#12398;3&#34892;&#30446;&#12395;&#12354;&#12427;&#12392;&#24819;&#23450;&#12290;&#36949;&#12387;&#12383;&#12425;&#22793;&#26356;&#12375;&#12390;&#12367;&#12384;&#12373;&#12356;&#12290;
    {
      
      #visit&#12364;0&#12398;&#26178;&#12395;&#12399;&#20966;&#29702;&#12375;&#12394;&#12356; 
      
    }else{
      
      ViolinVisitsData <- rep(type.convert(SubAnaData[i, 2]), hourVisits) #hour&#12364;&#12487;&#12540;&#12479;&#12501;&#12524;&#12540;&#12512;&#12398;2&#34892;&#30446;&#12395;&#12354;&#12427;&#12392;&#24819;&#23450;&#12290;&#36949;&#12387;&#12383;&#12425;&#22793;&#26356;&#12375;&#12390;&#12367;&#12384;&#12373;&#12356;&#12290;
      ViolinPlotData <- rbind(ViolinPlotData, cbind(UniqueDate[n], as.numeric(ViolinVisitsData)))
    }}
  
}

ViolinPlotData <- as.data.frame(ViolinPlotData) #&#12487;&#12540;&#12479;&#12501;&#12524;&#12540;&#12512;&#21270;
ViolinPlotData[, 2] <- type.convert(as.character(ViolinPlotData[, 2])) #&#12362;&#12414;&#12376;&#12394;&#12356;

#&#12503;&#12525;&#12483;&#12488;&#12398;&#28310;&#20633;&#12289;&#22615;&#12426;&#12388;&#12406;&#12375;&#12398;&#33394;&#12399;fill&#12391;&#35373;&#23450;&#12391;&#12365;&#12414;&#12377;&#12290;
p <- ggplot(ViolinPlotData, aes(factor(ViolinPlotData[, 1]), ViolinPlotData[, 2], fill = factor(ViolinPlotData[, 1])))
#vaiolinplot&#12398;&#35373;&#23450;
p <- p + geom_violin(scale = "count")
#&#22259;&#12398;&#35519;&#25972;,Y&#36600;&#12434;&#26178;&#38291;&#12395;&#12375;&#12383;&#12356;&#22580;&#21512;&#12399;&#26368;&#24460;&#12398;+ coord_flip()&#12434;&#21066;&#38500;&#12375;&#12390;&#12367;&#12384;&#12373;&#12356;&#12290;
p <- p +
  coord_cartesian(ylim = -0.5:24.5) +
  labs( x = " ", y = " ") +
  #scale_y_continuous(0:23) +
  theme(axis.text.x = element_text(colour="black", size = 13),
        plot.background = element_rect(fill = NA, colour = NA), #&#29983;&#25104;&#12426;&#33394;"#fbfaf5"
        panel.background = element_rect(linetype = "solid", colour = "black", fill = NA), #&#32121;&#40736;"#dddcd6"
        panel.grid.major = element_line(color = NA),
        panel.grid.minor = element_line(color = NA),
        axis.title.x = element_text(size = 13),
        axis.title.y = element_text(size = 13,angle = 90),
        axis.text.y = element_text(colour="black", size = 11)) +
  coord_flip()

print(p)

実行結果の例

はてなブックマークで紹介された当日と翌日のセッション数(visits)の一部です。数は図からは読み取れませんが、傾向は一目瞭然です。後は、必要なセッション数と解釈を加えることで検討資料としては十分かと思います。

バイオリンプロット

少しでも、あなたの解析が楽になりますように!!

タイトルとURLをコピーしました