読者です 読者をやめる 読者になる 読者になる

歩いたら休め

If the implementation is easy to explain, it may be a good idea.

【R】社内勉強会でRの紹介をするときの原案

私のいる会社はWEBサービスで成長してきた会社なので、 社内ではエンジニア≒WEBアプリケーションエンジニアという認識の人が多いです。

前任者の先輩が強力なRプログラマーで、すごい統計解析やツールを作っていたにも関わらず、 その結果が正しく理解され運用されているとは言いがたいです。 しかも、残念ながら他に理解できる人が少ないのでオレオレ実装も多く、引き継ぎや運用が大変でした。

そのため、社内の勉強会でRの初歩…というかR言語の文化について紹介して、「解析でもエンジニアリングは必要なんだ」「データの分析ってこういうものなんだ」と知ってもらおうと画策しています。

thinkit.co.jp

その原稿というか、こういう感じで発表しようという大枠を作って残しておきます。

RはExcelの代わりになるプログラミング言語

一言で言うと、R言語Excelの代わりになるプログラミング言語(+統計ツール)です。 「じゃあExcelに比べてなにが良いの?」と思われるでしょうが、大きく次の2点にまとめられると思います。

  1. Excelよりも管理しやすい
  2. Excelよりも強力な統計処理を行うことができる

2については、同期の統計屋さんが発表してくれるので、ここでは1について触れておきます。

Excelは確かに気軽に使えるツールです。しかし、(特にプログラマーなら感じるところですが)バージョン管理したい、結果に間違いがあったときに処理を追いたいなどの要望が出てきます。

Rであれば、Rの開発環境であるRStudioにgitによるバージョン管理の機能がありますし、プログラミングのコードが残っていれば結果が誤っているときにバグを見つけることができます。

qiita.com

また、ExcelでもマクロやVBAなどのプログラミング環境が付いてきますが、正直使いづらく、簡単な処理を簡単に書くことは難しいです。

「BigQuery叩いてcsvダウンロードしてこの欄にコピペして…って作業何度もやってるな…」と感じるようなことがあれば、 R言語を使えば簡単に済ませられるかもしれません。

//TODO:: オープンソースについての説明

データフレーム+パイプ演算子で処理の流れを直感的に記述できる

「簡単な処理を簡単に書ける」ってどういうことという話です。

Rにはdplyrという強力なパッケージがあり、簡便に書くことができます。

// TODO:: データフレームの説明

kiito.hatenablog.com

# Rにはirisというテストデータがあります。
# データの先頭行を取ってくる
iris %>% head()
#   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

あやめ(iris)の品種(Species)ごとに、花びらの長さ(Petal.Length)の平均値を出したいとき、 SQLなら次のように簡単に集計できると思います。

-- 変数名にドットがあるのは違和感あると思うので、キャメルケースにしました
SELECT species, mean(patal_width) AS mean FROM iris GROUP BY species

これをR(+dplyr)を使って書くとこのように書けます。

library(dplyr)

iris %>% dplyr::group_by(Species) %>% dplyr::summarise(mean = mean(Petal.Length))
# Source: local data frame [3 x 2]
# 
#      Species  mean
#       (fctr) (dbl)
# 1     setosa 1.462
# 2 versicolor 4.260
# 3  virginica 5.552

# Rではライブラリ名を省略することもできる
iris %>% group_by(Species) %>% summarise(mean = mean(Petal.Length))

データフレームに対して、「Speciesごとにまとめて、Petal.Lengthの平均値を取って!」という意味がわかりやすいコードが書けます。

// TODO:: パイプ演算子についての説明 // TODO:: 自分の作った関数にパイプで渡す

なんだかパンチが足りない気がする…もう少しアピールポイントを見つけておきたいです。