最近は[PR]データ分析と言いながらも、どちらかというとBI寄りのTableauを使用したダッシュボード開発のプロジェクトに参画し、要件定義フェーズでレポートの設計をしているので、分析自体ををすることが少なくなってしまいました。RStudioを起動することも少なくなりましたが、今回はRの話でブログを書きたいと思います。
以前、社内のプロジェクトでデータ分析をした際に報告形式はRMarkdown + knitrによるHTML出力を採用したのですが、社内イントラのWebで公開するようなものでもなかったので本当はPowerPointでの報告をしたいなと思っていました。
しかし、データ分析における報告にはグラフが出てきます。何十枚と次元を変えて出力されたグラフをPower PointのスライドやWordに貼り付けていくのはかなり苦行です。Webシステム開発の画面テストも自動化が可能な時代です。「神エクセルに貼り付ける」なんてもってのほかです。「手作業でやるのはできる限り避けたい!」ということもあり以前はHTMLで自動生成をせざるをえませんでした。
ということでRでPowerPointが出力できたらとても嬉しいので頑張る、というところが今回のブログの内容です。
Rを使っているけど報告はMS PowerPointで出力したいというスーツとギークの間にいる方。dplyrやtidyrなどのパッケージでデータラングリングしている話は今回は割愛します。
Rのインストールから、という方はこちらからRとRStudioをどうぞ。
r-project
https://www.r-project.org/
RStudio
https://www.rstudio.com/
これまでにOffice製品に出力する方法は下記のようなパッケージ(リンク先は英語)が選択肢としてあるのですが、今回はOfficerを使用して作成していきたいと思います。
データを数行表示させ、作成したグラフを貼り付けるサンプルです。
今回は娘が産まれましたので過去1ヶ月くらいの授乳時間の推移を見てみたいと思います。
こういうデータです。
> head(data) |
# A tibble: 6 x 7 |
赤ちゃん 時間 開始する側 `左側 授乳時間` `右側 授乳時間` 授乳時間の合計 メモ |
<chr> <chr> <chr> <int> <int> <int> <chr> |
1 娘 2017/10/19 22:34 <NA> 10 10 0 <NA> |
2 娘 2017/10/20 3:30 Right 0 1 0 <NA> |
3 娘 2017/10/22 7:31 Right 4 18 0 <NA> |
4 娘 2017/10/22 12:42 Right 247 4 0 <NA> |
5 娘 2017/10/22 21:41 Right 0 11 0 <NA> |
6 娘 2017/10/22 22:34 Right 0 5 0 <NA> |
こちらのデータは左右の授乳時間をそれぞれ記録していて、1日単位でまとめて表示させます。
> head(data2) |
# A tibble: 6 x 3 |
date type val |
<date> <chr> <dbl> |
1 2017-10-26 授乳時間 4.116667 |
2 2017-10-27 授乳時間 4.216667 |
3 2017-10-28 授乳時間 7.083333 |
4 2017-10-29 授乳時間 4.733333 |
5 2017-10-30 授乳時間 5.933333 |
6 2017-10-31 授乳時間 6.150000 |
出力されたスライド(PDFに変えてあります)はこちらです。
AdventCalendar20171222_baby_nursing
いかがでしょうか。何もデザインを指定しないで作成しているので簡素な印象を受けるかと思います。
こちらのOfficerのパッケージはテンプレートを作成して呼び出して使うこともできるので試してみましたが、PowerPoint上で作成したファイルをテンプレートとして読み込ませるとちょっとうまくいきませんでした。
こちらのパッケージでテンプレートが作成できるくらいにならないとうまくいかないのかもしれません。その件についてはまた別の機会があればご紹介したいと思います。
Rのスクリプトはこちらです。
# パッケージのインストール(初回のみ必要) |
install.packages("officer") # Office(PoserPointやWord)で出力するためのパッケージ |
install.packages("dplyr") # 有名なデータラングリングパッケージ |
install.packages("tidyr") # tidy dataを生成するためのデータラングリングパッケージ |
install.packages("RcppRoll") # Window関数を使うためのパッケージ |
install.packages("readr") # CSVファイルを読み込むパッケジ |
install.packages("ggplot2") # グラフ作成パッケージ |
install.packages("devEMF") # グラフのファイル出力パッケージ |
# パッケージの呼び出し |
library(officer) |
library(dplyr) |
library(tidyr) |
library(RcppRoll) |
library(readr) |
library(ggplot2) |
library(devEMF) |
# R実行時のカレントディレクトリ配下にあるCSVファイルを読み込む |
csv_dir <- paste(getwd(), "data/baby", sep = "/") |
csv_file <- "baby_nursing.csv" |
csv_file_path <- paste(csv_dir, csv_file, sep = "/") |
data <- readr::read_csv(csv_file_path) |
# 読み込んだデータの中身を確認 |
head(data) |
# 左右の授乳時間を合計し、1日単位で集計し、7日間の移動平均も作成する |
data2 <- data %>% |
dplyr::mutate(nurse_time = `左側 授乳時間` + `右側 授乳時間`) %>% |
dplyr::mutate(date = as.Date(format(as.POSIXlt(data$時間), "%Y-%m-%d"))) %>% |
dplyr::group_by(date) %>% |
dplyr::summarise(授乳時間 = sum(nurse_time)/60) %>% |
dplyr::select(date, 授乳時間) %>% |
dplyr::mutate(7日間の移動平均 = RcppRoll::roll_mean(授乳時間, n = 7L, fill = 0)) %>% |
dplyr::filter(date >= as.Date("2017-10-26") & date < as.Date("2017-12-03")) %>% |
tidyr::gather(type, val, -date) # 横持ちのデータを縦持ちに変換する |
# 変換したデータの中身を確認 |
head(data2) |
# グラフ作成 |
g <- NULL |
g <- ggplot(data2, aes(x = date, y = val)) + |
geom_line(aes(color = type)) + |
scale_color_hue(name = "凡例") + |
xlab("日付") + |
ylab("授乳時間") + |
ggtitle("授乳記録") + |
theme_grey(base_family = "Meiryo") |
# グラフをファイル出力 |
filename <- tempfile(fileext = ".emf") |
emf(file = filename, width = 10, height = 6) |
print(g) |
dev.off() |
# R実行時のカレントディレクトリ配下に出力するPowerPointのファイルパスを指定する |
pptx_file <- "baby_nursing.pptx" |
pptx_file_path <- paste(csv_dir, pptx_file, sep = "/") |
# PowerPointオブジェクトを作成 |
my_pres <- read_pptx() %>% |
# 1枚目:タイトルスライドを追加 |
add_slide(layout = "Title Slide", master = "Office Theme") %>% |
ph_with_text(type = "ctrTitle", str = "Advent Calendar 2017\r\nR言語の分析レポートを4枚のPowerPointに出力する") %>% |
ph_with_text(type = "subTitle", str = "12/22担当\r\n飯村北海") %>% |
# 2枚目:タイトルとコンテンツのスライドを追加 |
add_slide(layout = "Title and Content", master = "Office Theme") %>% |
ph_with_text(type = "title", str = "授乳の記録") %>% |
ph_with_text(type = "body", str = "某アプリで取得した授乳の記録をグラフで表示してみました。", index = 1) %>% |
# 3枚目:表の挿入 |
add_slide(layout = "Title and Content", master = "Office Theme") %>% |
ph_with_text(type = "title", str = "生データ") %>% |
ph_with_table(type = "body", value = head(data)) %>% |
# 4枚目:ggplot2で作成したグラフを貼り付ける |
add_slide(layout = "Title Only", master = "Office Theme") %>% |
ph_with_text(type = "title", str = "グラフ出力") %>% |
ph_with_img_at(src = filename, left = 0, top = 1.5, width = 10, height = 6) %>% |
# ファイルの出力 |
print(my_pres, target = pptx_file_path) %>% |
invisible() |
Enjoy!