データサイエンスのためのドキュメント作成フレームワーク
(Authoring framework for data science)
文書,Rコード,図表等が一体になった実行可能なドキュメント
テキストファイル(
.Rmd)での容易な共有,再現性の確保レポートやプレゼンテーション,インタラクティブな分析ツール等,用途は色々
2018/1/20
データサイエンスのためのドキュメント作成フレームワーク
(Authoring framework for data science)
文書,Rコード,図表等が一体になった実行可能なドキュメント
テキストファイル(.Rmd)での容易な共有,再現性の確保
レポートやプレゼンテーション,インタラクティブな分析ツール等,用途は色々
実はR以外も書ける(SQL, Python, Bash, etc.)
```{sql, connection=db}
SELECT *
FROM iris LIMIT 3
```
| Sepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species |
|---|---|---|---|---|
| 5.1 | 3.5 | 1.4 | 0.2 | setosa |
| 4.9 | 3.0 | 1.4 | 0.2 | setosa |
| 4.7 | 3.2 | 1.3 | 0.2 | setosa |
```{python}
def fib(n):
a, b = 1, 1
for i in range(n-1):
a, b = b, a + b
return a
n = 10
print("%d番目のFibonacci数:" % n)
print(fib(n))
```
## 10番目のFibonacci数:
## 55
Pythonサポートは最近まで結構貧弱だった(\(\leq\) knitr v1.17)
チャンク毎にsystem2("python")関数でシェルからPythonを呼んでいるだけなので,チャンク間でPythonセッションが持続していない
Pythonコードと文書を織り交ぜて書くのが難しい
```{python}
# 関数を定義しても……
def add(x, y):
return x + y
```
```{python}
# 別のチャンクでは使えない
print(add(1, 2))
```
running: python -c 'print(add(1, 2))' ... NameError: name 'add' is not defined ...
チャンクをまたいでPythonセッションが持続するようになった(knitr v1.18)
……それだけ?
```{python}
# さっきの例が
def add(x, y):
return x + y
```
```{python}
# 今度は動く
print(add(1, 2))
```
## 3
Pythonが自由に書けるだけでなく,PythonからRのオブジェクトにアクセス可能
```{r}
# Rのデータ構造を
r_list <- list(x = 1:5, y = letters[1:3])
r_mat <- matrix(1:6, 2)
```
```{python}
# Pythonから使う:ベクトル(R) -> リスト(Python),リスト(R) -> 辞書(Python), 行列(R) -> numpy配列(Python)
py_list = r.r_list # rオブジェクトからRのオブジェクトにアクセス
py_mat2 = r["t(r_mat) %*% r_mat"] # Rの式の評価も可能
print(py_list)
print(py_mat2)
```
## {'x': [1, 2, 3, 4, 5], 'y': ['a', 'b', 'c']}
## [[ 5. 11. 17.] ## [ 11. 25. 39.] ## [ 17. 39. 61.]]
逆に,RからPythonのクラス,メソッド等にもアクセス可能
Pythonの"."を"$"に変えるだけで,参照クラス的に使える
とても便利(気持ち悪い?)
```{python}
class Person:
def hello(self):
return "Hello, world!"
```
```{r}
py_main <- reticulate::import_main() # ?? おまじない
Person <- py_main$Person # ??
p <- Person()
print(p$hello())
```
## [1] "Hello, world!"
RからPythonのパッケージも使える
# scikit-learnを使う
sklearn <- reticulate::import("sklearn") # ?? おまじない再び
## 手書き数字認識のデータ
digits = sklearn$datasets$load_digits()
# サポートベクトルマシンの学習と予測
svm <- sklearn$svm
clf <- svm$SVC(gamma=0.001, C=100)
clf$fit(digits$data, digits$target)
## SVC(C=100.0, cache_size=200, class_weight=None, coef0=0.0, ## decision_function_shape='ovr', degree=3, gamma=0.001, kernel='rbf', ## max_iter=-1, probability=False, random_state=None, shrinking=True, ## tol=0.001, verbose=False)
clf$predict(digits$data[1,, drop=FALSE])
## [1] 0
reticulateパッケージ by RStudio
RからPythonを使うパッケージの決定版かも
RからPython C APIを通じてPythonを使うので,Pythonセッションが持続する
Pythonのオブジェクトをいい感じに変換,ラップしてくれるので,
ほぼ.を$に変えるだけでPythonの機能が何でもRから使える
R Markdown (knitr) を reticulate::eng_python()でサポート
Pythonのデータ分析系パッケージをラップしたRパッケージがすでにいくつか
深層学習: Tensorflow, Keras, etc.
tensorflow.rstudio.comreticulateはこのために開発されたっぽい統計モデリング: greta
goldingn.github.io/gretatensorflow上に統計モデリングフレームワークを構築自然言語処理: spacyr
最近R MarkdownのPythonサポートが強化された
PythonからRにアクセスできるし
RからPythonにもアクセスできる
むしろ,R Markdown以外でもRからPythonが使い放題(reticulate)
Enjoy writing R & Python !
参考:
rstudio/reticulate: R Interface to Python
Rおじさん、Pythonistaになる - まだ厨二病(@u_riboさんの紹介記事)