🦉

R; データ処理ツールの紹介

2022/09/28に公開約7,800字

こんにちは。Zennでは初めて投稿するieohsです。

現在はITとはほぼ無縁の会社・部署に務めていますが、以前、科学系の調査研究を行う部署にいたこともあり、データ解析用でプログラムを書くようになりました。
よく使う言語はR, VBA, Javascript(GAS), ShellScript, Lispといった、主に解析・結果の表示をすることがメインです。Rは使い始めて10年ほどになります。
ここでは、これまで経験してきたの知見等を共有できる場として活用したいと思います。基本的にはRについて情報発信していく予定です。
今回は初投稿なので、データ解析を経験した中で、解析を行うツールとして Excel→VBA→R というように変わってきました。なぜこのようになったのか、使い方やその比較を行ってみたいと思います。これからデータ解析を始める予定の方や、今までExcelで作業を行ってきた方への参考になればと思います。
PythonやJulliaのように統計解析や機械学習で人気のある言語もありますが、ここではRとの比較はしません。効率的にデータ管理と統計解析を行うために自分が使ってきたRの紹介をします。

開発環境

ここでは、プログラミングのための開発環境について記載します。
自分は、プログラミングは基本的にEmacsでやっています。RではRstudioという優れた開発環境がありますが、エディターとしての機能はEmacsに全然敵いません。そのため、コードの記述・実行はEmacsで行い、どうしてもダメな場合はRstudioを使うようにしています。
Rstudioは Rmarkdown というJupyterNotebookのようなツールをローカル環境で使うことができます。これが非常に便利で、Rmarkdown中のコードブロックにコードを書くだけで、解析時のログや検討のために用いる図を一枚のペーパーに表現してくれます。
Excel(VBA)は職場のPCで書いています。そもそも、VBAは職場内でしか使用しないため自前の開発環境は持っていません。
GASは基本的に自分のためのツールとして活用しています。Google Drive内の整理や、Appsheetとの連携で自動レポート作成等です。Excel(VBA)をオンラインで動作させているイメージです。
解析に使うPCは、5~6年前に中古で買ったLet's noteを、Linuxに入れ替えて使っています。プログラミングはやっぱりLinux環境がしやすいですね。
Zennのこの記事は、Emacs上でRmarkdownを使って書いています。

Excelを使ったデータ操作

自分の職場では、配布されたPCに勝手にソフトウェアを入れることは禁止されています。解析に使えそうで、かつ、もともと配布されたPCにインストールされているのはMicrosoft Office(Access抜き)です。また、自分だけで使うのではなく、後継の人が使用することもある程度想定しなければなりません。
そのため、基本的に職場で使用するのはExcel(VBA)と決めており、VBAは職場内でも需要もあります。Excelは誰でも一定レベル以上で使うことができるので、使い方を新たに覚えなくてもいいという点は、開発側もエラー時の動作をイメージしやすく、非常に優れています。
本題ですが、データ解析においてExcelというツールはいろいろと使い勝手が悪い部分もありますが、非常に優れたデータ管理ツールであることには間違いありません。
データ解析の流れを簡単にまとめると、以下のようになります。

  1. データを目視で眺める(全体の傾向を確認する**
  2. 適度にフィルターをかけながらデータを整理する
  3. 異常値等は削除または修正する
  4. 整理したデータでグラフなどを作成する
  5. データ内容に即した解析をおこない、レポートにまとめる

Excelはデータの整理が目視でできますので、データ前処理法に明るくない方でも簡単に使うことができます。
問題はそれをほとんど全て目視でやらなければならないということです。
Excel関数を使っても、目視でのデータチェックは流石に辛いので、自分はこの段階でVBAを触り始めました。そうすることで、これまでマウスやキーボード操作で行っていたデータの前処理が劇的に早くなりました。
VBAに慣れていないところでは、以下の例のように、逐次的にセルの値を参照して判断するのが一般的だと思います。

Dim i, j as Long
i = 0
j = 0

For i = 1 to 100
	For j = 1 to 100
		If Cells(i, j).value > 1000 then
			Cells(i, j).value = "NA"
		End if
	Next
Next

慣れてくると、上のコードを変えながら、異常値検出や作図もできるようになります。
簡易的なデーターベスの作成、統計値などを計算して一定値を超える値を検出・修正、特定のアプリケーションのためのフォーマットデータの作成など、この段階でも様々なことをVBAで書くことができます。
特にサイズが大きいデータを扱うようになると、処理を高速化するため、配列を使うようになります。
配列とは、1以上の複数のデータを保管するための容器のようなもので、格子状に区切られた弁当箱(配列)の中に料理(データ)を個別に入れていくイメージが近いと思います。
しかし、自分はこの段階で非常に困った状況になりました。
それは、Excelワークシートの見た目とVBAでの配列処理時のイメージが若干異なっていることです。  
ご存知の通り、VBAでは配列処理は以下のように記述します。

Dim data As Variant

'' シート内のデータを一括で配列に入れる
Set data = Range(Cells(1, 5), cells(3, 5))

For i = 1 to Ubound(data, 1)
	For j = 1 to Ubound(data, 2)
		'' データの読み出し
		Debug.print data(i, j)
	Next
Next

Excelシート上での操作とどう違うかと言うと、まず、列名等の情報が出てきません。誤解がないように言うと、配列に列名の情報は含まれません。あくまでデータだけの取扱です。そのため、手軽にフィルターをかけてデータを操作することができません。この点はデータ解析を行う上でマイナスの要因でした。
これらについては、以下のようにVBAの連想配列であるDictionary型のオブジェクトを使うことで解決できますが、やはり直感的ではありませんでした。そこで他のデータ解析用言語を探し、Rを使うこととしました。

Dim Dic as Object

'' Dictyonary型の設定
Set myDic = CreateObject("Scripting.Dictionary")

'' 連想配列を設定
For i = 1 To Ubound(data, 2)
	'' 第一行をキーとして登録
	If Dic.Exists(data(1, i)) = False then
		Dic.Add data(1, i), i
	End if
Next

'' キー一覧の取得
Keys = Dic.Keys

Rを使ったデータ操作

Rは他の(オブジェクト指向)言語に比べて癖が強いことで有名みたいですが、自分の場合は他のオブジェクト指向言語を触る前にRに触れていたので、特に違和感なく使うことができています。
なぜExcel(VBA)の代わりになる言語でRを選んだかと言うと、作図がしやすい言語を選びたかったためです。また、 データ解析→作図 がRだけでできるため、 データ処理はVBA, 作図はgnuplot のように言語を切り替える必要もありません。めんどくさがりな自分にとって丁度いい言語でした。
また、Rで特筆するところでは、VBAで扱いづらかった配列操作が非常に簡単である点です。

以下に簡単な例を示しますが、Rでは配列をデータフレームという形式で扱います。データフレームでは列名と行名を指定することができるため、列名をキーとして検索することができます。このため直感的に扱いやすく、Excelシート上でフィルターをかけて絞り込みをする操作と同じ要領でデータ処理ができます。

## サンプルデータとしてirisを設定
data <- iris

## データの先頭を表示
head(data)

##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         3.5          1.4         0.2  setosa
## 2          4.9         3.0          1.4         0.2  setosa
## 3          4.7         3.2          1.3         0.2  setosa
## 4          4.6         3.1          1.5         0.2  setosa
## 5          5.0         3.6          1.4         0.2  setosa
## 6          5.4         3.9          1.7         0.4  setosa

## データの要約を表示
summary(data)

##   Sepal.Length    Sepal.Width     Petal.Length    Petal.Width   
##  Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100  
##  1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300  
##  Median :5.800   Median :3.000   Median :4.350   Median :1.300  
##  Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199  
##  3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800  
##  Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500  
##        Species  
##  setosa    :50  
##  versicolor:50  
##  virginica :50  
##                 
##                 
## 

## データの検索
head(data[data$Species == "setosa", ]) # 列の値で絞り込み

Rでは配列用の処理関数があり、For~Next構文を使うよりかなり拘束で処理できます。
以下の例では、データフレームの列に対してそれぞれ、平均値を計算しています。

## applyで行または列毎に関数を適用
apply(X = data[1:4],  # 使用するデータ[列番号]
      MARGIN = 2,     # 1;行単位で計算 2;列単位で計算
      FUN = mean)     # 適用する関数
      
      
## Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
##     5.843333     3.057333     3.758000     1.199333

また、ライブラリを追加することでパイプ演算子を使うことができます。Rは関数型言語なので、基本的には()の中に処理を書いていき、処理を繋げる場合はまた外側を()を使って処理を書いていきます。書き方は、Excelシート上で設定する関数をイメージしてもらえればわかりやすいと思います。
Lispのようにもともとカッコが複数あることを前提とした言語であれば違和感はないと思いますが、初学者にとって () が何重にも続くと間違いやすくなるため、ここは非常に重要な問題だと思います。
VBA, Python, Cなど のオブジェクト指向言語は、日本語と同じように 主語.述語.装飾語 のようにそれぞれ ドット(.) で繋いだ書き方ができることを考えると、関数型言語であるRが癖が強いと言われるのも分かる気がします。

話を戻しますが、パイプはこの()多重問題を解決してくれる重要な演算子(関数)で、処理したい順番に関数を並べて、それをパイプでつなぐだけというお手軽な方法ですが、どのような順番で処理を行っているか、見た目でわかりやすくなります。

# 例; 1~10までの数字の合計を計算し、100の位で丸める計算

## パイプを使わない場合
round(sum(c(1:10)), -2)

## パイプを使う場合
library(dplyr)
c(1:10) %>%
    sum() %>%
    round(-2)

整形されたデータが既にあるのであれば、そのまま作図に使うこともできます。

library(dplyr)
library(ggplot2)
library(tidyr)

## irisデータの読み込み→作図
p <- iris %>% 
    pivot_longer(cols = !c("Species"),    ## データを並び替え処理
                 names_to = "name",
                 values_to = "val") %>%
    ggplot(aes(x = name, y = val, col = Species)) + ##ggplot2で作図
    geom_boxplot() ## 箱ひげ図の作成
p

Rのすすめ

Rは(統計解析用の言語なので、そもそも用途が限られているようにも思いますが)データ処理に関してはExcelと比べてかなり高機能ですので、使わないともったいないです。たった数行で、データ処理から作図まで一括で簡単にプログラムできる言語を、自分は他に知りません。
また、前節の作図のように一度書いたプログラムはそのまま使いまわしできるため、再現性があり、効率的でもあります。
その他、Rは Shiny パッケージを使ってWebアプリ化すれば、高価なデータ解析専用ソフトと同等以上のGUIツールを作ることができ、それは皆さん自身やチームの手助けになることは間違いありません。Rを使ったことがない人とも解析手法を共有することができるため、この意味は大きいと思います。
今回紹介した内容はRのほんの一部の機能ですが、データ解析を行う人にとってはまさに神ツールと言ってもいいでしょう。
(当然ながら、Rは 統計解析環境 ですので、統計解析用のツールとしても大きな力を発揮します。世界中にあるRのコミュニティで、今も多くのパッケージが開発されています。)

それでも、Excelを使い慣れている人は、いきなりコードを書くようなツールに移行することは難しいと思います。そこで、最初はデータ処理をExcel(VBA)で行い、解析はRでやってみてください。これまでより簡単に解析ができ、Excelより綺麗な図ができますので、触っていて楽しいと思います。慣れてきたらデータ処理も含めてRでやってみるといいと思います。

まとめ

今回は初回ということもあり、過去の経験を踏まえてExcelでデータ解析をするよりはRを使ったほうが便利だよ、ということをなんとなく伝えてみました。
皆さんの参考に慣れば幸いです。
今後、より専門的(需要があるか分からない)な内容を紹介していきたいと思いますので、よろしくおねがいします。
ひとまず考えているのは以下のような内容です。

  • Rを使った作図方法(ggplot2)
  • ShinyでWebアプリ作成
  • Rmarkdownを使ったレポート作成
  • GISデータの解析、地図表示方法
  • 空間統計解析
  • 気象データの取扱い
  • 時系列データの解析
  • 機械学習を使った解析

参考図書

  • Rが生産性を高める; igjit,atusy,hanaori 著, 技術評論社, 2022.
    最近、技術評論社から発売されたRの入門書です。最近の需要にマッチした内容が多数紹介されており、初学者におすすめの和書です。

  • 再現可能性のすゝめ; 高橋 康介 著・ 石田 基広 監修・ 市川 太祐 編・ 高橋 康介 編・ 高柳 慎一 編・ 福島 真太朗 編・ 松浦 健太郎 編, 共立出版, 2018.
    こちらは共立出版から発売されている Wonderful R シリーズの一冊です。くだけた言い回しで書かれている部分が多いですが、内容はピカイチです。主にRmarkdown(MarkdownでRの実行結果も出力することができる)に関する紹介本で、他人に見せるためのデータ解析方法が詳しく紹介されています。この本自体がRmarkdownで書かれていることには驚きました。

Discussion

ログインするとコメントできます