この記事は 『CRESCO Advent Calendar 2017』22日目の記事です。

 

こんにちは。データアナリティクスチームの飯村北海です。

最近は[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!