[R] 実録・手作業で行なっていた集計・グラフ化作業をRで自動化した話(概要編)
はじめに
csvに書き出された顧客調査のデータからレポートを作成する際には、手っ取り早さの観点から、当初はエクセルを用いて手動で集計作業を行なっていました。
得られた結果を社内のConfluenceにテーブルとして転記し、Confluenceの機能を用いてテーブルからグラフを生成していました。
これらの集計テーブルの編集や、グラフ出力はConfluenceの機能を使えば実現できるものですが、Confluenceに独特なテーブルの編集方法やグラフの作成方法を覚える必要があり、作業内容を人に伝える際には余分に時間を取られやすいというデメリットがあります。
対象のレポート作成は定期的に発生するため、この手のオーバーヘッドをなくすことには下記のようなメリットがありました。
- レポート集計のための作業時間が削減される
- 他の人に作業を引き継ぎやすくできる
- 作業自体のコード化によって作業手順の履歴をGit等で版管理できる
この目的の実現のため、手作業で行なっていた集計・グラフ描画作業をRのスクリプトを書くことでワンライナーにしました。
本記事ではその概要を述べます。
集計対象となるCSVファイル
まず、集計対象となるCSVファイルのフォーマットについてです。CSVのファイルは顧客調査の結果を表したものです。
"レコード番号","質問項目1","質問項目2","質問項目3",...,"全体の満足度" "34","不満","不満","やや不満",...,"やや不満" "33","やや不満","普通","やや満足",...,"普通" ...
これらのCSVをエクセルでインポートして質問項目ごとに「満足」「やや満足」「やや不満」…etcがどのくらいあるかをCOUNTIF関数を用いて定期的に結果が上がる度に集計し、グラフをConfluenceの機能を用いて作成していました。
Rによる集計作業の自動化
Rを使えば定期的に発生する集計作業をコマンドラインを叩いてワンライナー化できます。集計作業自体の大まかなビフォーアフターは以下の通りです。
以前は手動で結果のCSVファイルをエクセルとして読み込み、エクセル上でCOUNTIFなどの関数を駆使して手で集計作業を実施、そこで展開された結果をConfluenceのテーブルに転記していました。Confluenceにはエクセルファイルをインポートして表として表示するためのマクロが備わっているため、もともと非効率な作業をしていたことは否めません。
一方、改善後は結果のCSVファイルを指定してRのコマンドとしてまず集計後のエクセルファイルを出力するところまでをワンライナーで実現できます。そこからConfluenceのマクロで成果物のエクセルファイルを読み込み、表として出力します。
エクセルのファイルをConfluenceのマクロで読み込む作業があるものの、作業全体としては大幅に時間を節約できます。
Rによるグラフ描画の自動化
Confluenceにはテーブルを入力としてグラフ描画を行える機能があるのですがパラメータ等の調節方法を情報共有するのにそこそこの時間がかかりそうであったため、こちらもRでpng画像としてグラフを生成することにしました。
Rによるグラフの操作方法についてはWeb上の情報を少々漁る必要がありますが、一度コードが出来てしまえばグラフの生成に作業時間をとられなくなります。
自動化の結果…
集計とグラフの生成に関してはワンライナーの以下のようなコマンドを叩く作業と
$ Rscript --slave --vanilla XXXXX.R
次のような集計表に対応するエクセルファイルとグラフ画像を手動でConfluenceに貼り付けるぐらいの作業量で済むようになりました。
その他
今回整備したRのスクリプトでは他にも以下のようなことを行なっています。
- 全体の満足度に個々の質問項目の満足度がどのくらい寄与しているかを可視化する対散布画像の生成
- 前回の顧客調査からの差分比較集計結果をエクセルファイルとして出力
- 前回の顧客調査からの差分比較のためのグラフ画像を生成
これらの中で1の作成にあたっては下記エントリが非常に参考になりました。
2, 3についての集計作業については一回の調査毎の質問項目に対する集計を行い、それらを時系列でテーブルやグラフ等で比較するために作成しています。調査毎に吐き出されるCSVのフォーマットが微妙に異なるために、CSVから今まで行ってきた調査全体を表す大きなデータフレームに展開する部分を一箇所に集約し、メンテナンスしやすいようにしています。
まとめ
定期的に行われる作業の省力化の観点から、今までエクセルによって行なっていた手作業をRによるワンライナーに切り替えた概要を述べました。
本記事に関連するRのTipsなども後々紹介できればと考えています。