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


0. まえがき

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

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

Rpy2パッケージを使って実装しているため、rpy2_wrapperと名付けました(ラッパーの使い方あってる??)。Rpy2の日本語での情報が分散していることと、Rのことを把握してなさすぎでRpy2のドキュメントを読んでもはじめは意味がよく理解できず、かなり苦労しました。なんとか動いてよかった、、、

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

目次

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

1. 開発の動機

私事ですが、Pythonで統計解析をするとき、普段はscipy.statsを使っています。これ、めちゃくちゃ便利で重宝しているのですが、個人的によく使う統計関数(主に多重比較)が用意されておらず困ることがあります(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.testvar.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アプリ作成準備
今さら聞けない!Xcodeをインストールする方法
Python3の環境をささっと整える(Mac版)

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でインストールします。
homebrewはMacOS用のパッケージ管理ツールです。

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

$ 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します。

$ brew link --overwrite r

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

その場合は、こちらを参考に、、、
MacOSX に homebrew で R をインストール

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

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

$ r

Rが開いたら、multcompNSM3をインストールします。

> 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

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

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

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

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

rpy2_wrapperディレクトリに入って

$ python examples.py

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

今日はここまで。