Pythonからよく使うRの統計関数を簡単に呼び出せるようにしてみた (多重比較・Rpy2)

2024/3/18: 同じ機能でコードを書き直しました。

https://qiita.com/MTNakata/items/657d71abaab5ad29515f

# 0. まえがき

PythonからRの統計関数を呼び出したい！という個人的な願望を満たすため、Pythonで簡単に呼び出せるプログラムを実装しました。Rpy2の練習も兼ねてます（というかそちらがメイン）。[GitHubでソースコードを公開しています](https://github.com/MTNakata/rpy2_wrapper/)。

ソースコードもREADME.mdもとりあえずで書いたので、何か間違いがあるかもしれません。バグや英語の誤記等を見つけた場合、お知らせいただけるととてもありがたいです。泣いて喜びます。

[Rpy2パッケージ](https://pypi.org/project/rpy2/)を使って実装しているため、`rpy2_wrapper`と名付けました（ラッパーの使い方あってる？？）。Rpy2の日本語での情報が分散していることと、Rのことを把握してなさすぎで[Rpy2のドキュメント](http://rpy2.readthedocs.io/en/version_2.8.x/introduction.html)を読んでもはじめは意味がよく理解できず、かなり苦労しました。なんとか動いてよかった、、、

これから数回に渡って、その中身について紹介していきます。今回はその第1回です。

- 続編書きました。(2018/7/26)
[rpy2_wrapperを使ってPythonコードで統計検定（TukeyHSD・Dunnett・Steel-Dwassなど)](https://qiita.com/MTNakata/items/9c80070158fbe90afdd3)

- 続編パート2書きました。(2018/7/29)
[Rpy2の使い方の備忘録](https://qiita.com/MTNakata/items/04a045f4beb0fa9e3a4d)

## 目次

1. 開発の動機
2. 何ができるのか
3. 環境構築の手順
4. テスト

# 1. 開発の動機

私事ですが、Pythonで統計解析をするとき、普段は[scipy.stats](https://docs.scipy.org/doc/scipy/reference/stats.html)を使っています。これ、めちゃくちゃ便利で重宝しているのですが、個人的によく使う統計関数(主に多重比較)が用意されておらず困ることがあります（DunnettとかTukey-Kramerとか使いたいが見つからない）。

ところで、統計といえば R！ というイメージがありますよね。統計関数についてググると 大抵、R のコードが上位にヒットしてきますし、R パッケージの関数（特によく使われているもの）は実績もあり、なんとなく安心感も。しかし、Rに慣れてなさすぎてデータの整形だけで疲れきってしまうという問題が勃発、、、（泣）

そこで、Pythonからよく使うRの統計関数を簡単に使えるようにすればいいじゃん！と考えて、実装してみました。基本、自分用です。環境構築がややめんどいです。

# 2. 何ができるのか

`rpy2_wrapper`で実装した統計関数を以下に列挙します。一部、`scipy.stats`で使えるのもありますが、もののついでに実装。

- One-way ANOVA (`aov`, `anova`)
- Tukey-Kramer test (`TukeyHSD`)
- Welch's ANOVA (`oneway.test`で`var.equal=False`)
- Dunnett's test (`multcomp`パッケージの`glht`)
- Fisher's Exact Test (`fisher.test`)
- Steel-Dwass test (`NSM3`パッケージの`pSDCFlig`)

カッコ内は呼び出すR の関数名を示しています。

それぞれの使い方は次回以降にご紹介するとして、まずは環境構築の手順をば。

# 3. 環境構築の手順

### a. OS・Python・Rのバージョン
- MacOS Sierra
- Xcode9.1
- Python 3.6.6
- R version 3.5.1

注1：たぶんほかのバージョンのMacOSXでも新しめなら動くと思います。
注2：WindowsやLinuxでは調べていません。ソースコード自体は動きそう。
注3:XcodeとPythonはあらかじめ導入済みとして進めます。まだの方は以下のページを参照のこと。

[Xcode をインストールする, iOSアプリ作成準備](https://i-app-tec.com/ios/xcode-install.html)
[今さら聞けない！Xcodeをインストールする方法](https://techacademy.jp/magazine/1409)
[Python3の環境をささっと整える(Mac版)](https://qiita.com/yutaro_sakaguchi/items/72b17dfea1efa05aded4)

### b. Pythonパッケージ

- rpy2==2.9.4
- pandas==0.23.3
- jupyter==1.0.0
- jupyterlab==0.32.1

他にも依存パッケージがあるかも。

### c. Rパッケージ
- multcomp
- NSM3

### d. Rのインストール

まず、Pythonから参照できるようにRを[homebrew](https://brew.sh)でインストールします。
[homebrew](https://brew.sh)はMacOS用のパッケージ管理ツールです。

スタンドアロン版の Rとは別にインストールします。

```shell
$ brew install R
```
```
#中略

Error: The `brew link` step did not complete successfully
The formula built, but is not symlinked into /usr/local
Could not symlink bin/Rscript
Target /usr/local/bin/Rscript
already exists. You may want to remove it:
  rm '/usr/local/bin/Rscript'

To force the link and overwrite all conflicting files:
  brew link --overwrite r

To list all files that would be deleted:
  brew link --overwrite --dry-run r

Possible conflicting files are:
/usr/local/bin/Rscript -> /Library/Frameworks/R.framework/Resources/bin/Rscript
==> Summary
🍺  /usr/local/Cellar/r/3.5.1: 2,116 files, 55.6MB
==> Caveats
==> readline
This formula is keg-only, which means it was not symlinked into /usr/local,
because macOS provides the BSD libedit library, which shadows libreadline.
In order to prevent conflicts when programs look for libreadline we are
defaulting this GNU Readline installation to keg-only.

For compilers to find this software you may need to set:
    LDFLAGS:  -L/usr/local/opt/readline/lib
    CPPFLAGS: -I/usr/local/opt/readline/include
```
エラーに対処するため、`brew link`します。

```shell
$ brew link --overwrite r
```

私はわりとさくっといきましたが、うまくいかないときは依存パッケージが足りてないかもです。

その場合は、こちらを参考に、、、
[MacOSX に homebrew で R をインストール](https://qiita.com/dkkoma/items/8b45ce94c2c5d89d567f)

### e. 必要なRパッケージのインストール

ターミナルからRを起動します。

```
$ r
```
Rが開いたら、`multcomp`と`NSM3`をインストールします。

```r
> install.packages("multcomp")
> install.packages("NSM3")
```
ちょっと時間がかかるかも。

### f. Rpy2とPandasのインストール

次にPythonパッケージを`pip`でインストールします。ターミナルで以下を実行。

```
$ pip install rpy2
$ pip install pandas
```
ついでにJupyterとJupyterlabも入れておきます。

```
$ pip install jupyter
$ pip install jupyterlab
```

これを入れておけば、サンプルのJupyterノートブックファイル（`examples.ipynb`）が開けます。

### g. rpy2_wrapperのインストール

インストールといっても`git clone`するだけです。適当なディレクトリに移動して、以下を実行してください。

```
$ git clone https://github.com/MTNakata/rpy2_wrapper.git
```

`rpy2_wrapper`ディレクトリがダウンロードされ、その中にソースコード(`rpy2_wrapper.py`)といくつかのサンプルが入っています。

# 4. テスト

ターミナルで`rpy2_wrapper`ディレクトリに入って、Jupyterlabを起動。

```
$ jupyter lab
```
ブラウザが自動で起動しないときは以下のページを参考にしてみてください（丸投げ）。

- [Jupyter Notebookのブラウザ起動エラーの解消方法](http://www.marorika.com/entry/jupyter-notebook-browser-startup-error)

- [Jupyter Notebookで使うブラウザを指定する。特にMac。（とVivaldi）](https://qiita.com/nannoki/items/315a12a8700c1ca92da3)

左の画面から`examples.ipynb` を選択して、ダブルクリックで開きます。

![Jupyterの画像サンプル](https://qiita-image-store.s3.amazonaws.com/0/204284/d2dc9ff8-efb9-0d6d-2fab-ec270d1038bc.png)

上のタブから`Kernel > Restart Kernel and Run All Cells`を実行します。
Steel-Dwassのところでちょっと時間がかかります。

「Jupyterが起動しない！」という場合、ターミナルからでもテストできます。

`rpy2_wrapper`ディレクトリに入って

```
$ python examples.py
```

全部がエラーなく実行されれば、環境構築はうまくいっています。

今日はここまで。