Slide 1

Slide 1 text

チーム規模で Rを活用している話 Takuma Koshiishi @kotaku08 Tokyo.R 78th 2019/5/25

Slide 2

Slide 2 text

自己紹介 2 はじめまして こっしー 株式会社ヴァリューズ/データアナリスト @kotaku08 @kosshi • R歴3年くらい • 会社でRキャラ • ジンベエザメとシャチと クジラが好き

Slide 3

Slide 3 text

3 ある日突然、、、 タカヤナギ=サンにサガサレル

Slide 4

Slide 4 text

4 qiitaに書いた記事がキッカケ https://qiita.com/kosshi/items/a7ae2dfcc57ab5340e4f

Slide 5

Slide 5 text

5 お会いしてRの会社での利用についてお話した際に・・・ Rを会社的に?使ってる事例って 他にありますか?? あまり聞かないですね~ こんな会話をした記憶

Slide 6

Slide 6 text

6 あまり聞かない・・・ あったらもっと知りたい。 いや、もっとあったらいいのに。 まずは自分が発表してみよ・・・ (恐縮)

Slide 7

Slide 7 text

今日のモチベーション 7 そんなこんなで 0からRの社内活用を推進した事例を紹介。 R活用の可能性を布教したい!!! その過程で思ったこととか共有したい!

Slide 8

Slide 8 text

今日話すこと 8 ✓ 会社に入ったときの話(こんな環境がちょっとイヤ) ✓ 他社での解決策の話 ✓ チームR化計画 ✓ 社内Rパッケージ(メイン) ✓ Rの普及・教育(少し)

Slide 9

Slide 9 text

VALUES:なんの会社? 9 会社に入ったときの話 • インターネット行動ログ分析 • 分析チームに新卒で2人目のタイミングで入社 (+先輩3人くらいのチームだった)

Slide 10

Slide 10 text

当時の分析環境 10 会社に入ったときの話 使用ツールと、チームメンバーのスキルセット • Redshift • R、Python以外のスクリプト言語 • Tableau • Excel!!Access!! 創業期のデータ基盤構築の流れで、当時のチームのスキルセッ トはデータ分析というよりもエンジニア、SE、SIに近い。

Slide 11

Slide 11 text

ここがチョット?変えたかった 11 会社に入ったときの話 ①それ○○でやるの!!?? タスクとツールがあってない。 • 簡単なデータ加工をPHPで。 • 複雑なデータ加工をExcelで。 ②コレ何やってるの?? 可読性・再現性・再利用性がない。 • 新卒、PHP読めない/書けない。 • 謎のExcel呪文式。 • Excelでやった結果ワークシートしかない。 • 可視化だったら全部Tableauでやる。 ③データ抽出だけで一苦労。 • Redshiftへの接続が大変。簡単なデータ抽出で気が重い。

Slide 12

Slide 12 text

12 こんな感じでRユーザは少ない。。。 みんなで使えたらいいのに。。。

Slide 13

Slide 13 text

13 そんな時出会ったairbnbの記事 https://medium.com/airbnb-engineering/using-r-packages-and-education-to-scale-data-science-at-airbnb- 906faa58e12d

Slide 14

Slide 14 text

14 exploratoryの方の翻訳で知った メルマガいつもありがとうございます。 https://blog.exploratory.io/airbnb%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B5%E 3%82%A4%E3%82%A8%E3%83%B3%E3%83%86%E3%82%A3%E3%82%B9%E3%83%88%E3%81%AF% E3%81%AA%E3%81%9Cr%E3%81%8C%E5%A5%BD%E3%81%8D%E3%81%AA%E3%81%AE%E3%81%8 B-fc1168e81373

Slide 15

Slide 15 text

airbnb社が言うには・・・(要約) 15 • 分析チームでRを使っている人は多いよ! • 業務で使う用のRパッケージ「Rbnb」を作ってるよ! • Rの教育も頑張ってるよ! • データ分析が効率化されて、再現性もバッチリだよ!

Slide 16

Slide 16 text

16 ここはRユーザの天国か??

Slide 17

Slide 17 text

17 ボクもやろ(単純)

Slide 18

Slide 18 text

18 チームR化計画

Slide 19

Slide 19 text

チームR化計画 19 そんなこんなで 「社内パッケージ開発」と「Rの社内勉強会」の2本柱。 今日は社内パッケージを作った話をメインでします。 以降4つほどパッケージの内容を紹介。

Slide 20

Slide 20 text

①データの抽出を簡単に。 20 Rパッケージの話 Airbnbの記事でも一番最初にやるべきことと書いてある。

Slide 21

Slide 21 text

①データの抽出を簡単に。 21 Rパッケージの話 データの抽出時にこんなことないですか・・・? • ID、パスワード、ホストを毎回入力している。 たまに思い出せないデータベースとかある。 • そもそもセキュリティやシステムの関係でODBCで直接ア クセスできない。 • 多段階認証とかある。何回認証するの?? • いくつもソフトを立ち上げる必要がある。(ターミナル→ エディタ→S3クライアント→Rstudio)

Slide 22

Slide 22 text

①データの抽出を簡単に。 22 Rパッケージの話 弊社の事情はこんな感じでした。 • Redshiftが高セキュリティ領域にあって直接アクセス不可。 • ターミナル開く→認証→踏み台サーバーにアクセス →Redshiftの近くのサーバーに移動→クエリをunloadで投 げる→S3クライアント開く→ローカルに移動→Rstudio開 く→読み込む! • 気が重い。

Slide 23

Slide 23 text

①データの抽出を簡単に。 23 Rパッケージの話 簡単なシステムを作りました。 ①S3にクエリを置く ②EC2がS3を監視し、 クエリが来たら投げる。 ③クエリが完了したら S3に結果を戻す。 ④S3を監視し、結果 が戻ったら読み込む。 セキュリティ高 先輩に頼んでプログラムを書いても らった。

Slide 24

Slide 24 text

①データの抽出を簡単に。 24 Rパッケージの話 データの抽出から読み込みまでをRstudioで完結できるように。 > test_query <- "select aaa from bbb where ccc = 'ddd'" > data <- vls_unloadauto(query = test_query, s3path = "adhocquery/test", filename = "test_file", schema = "xxxx") 1.passing unload query 2.check query progress count:= 3.unload query completion INFO: UNLOAD completed, 12232 record(s) unloaded successfully.

Slide 25

Slide 25 text

①データの抽出を簡単に。 25 Rパッケージの話 Rで書いてパッケージ化したのはここだけ クラウドサービスとのやり取りはaws.s3パッケージで簡単。 ①S3にクエリを置く ④S3を監視し、結果 が戻ったら読み込む。

Slide 26

Slide 26 text

①データの抽出を簡単に。 26 Rパッケージの話 やってみて思ったこと • データの抽出が簡単なる→別世界。ストレス大幅減。 • Rはミドルウェアを操作するパッケージが充実。 • ミドルウェアを操作するパッケージと裏で動くシステムの 組み合わせ次第でなんでもできそう。 • 「Rはシステムに向かない」はこの意味でウソ。

Slide 27

Slide 27 text

①データの抽出を簡単に。 27 Rパッケージの話 cloudyrのパッケージ群は要チェック。 Rとクラウドの連携性を高めるパッケージを作っている。 aws.s3もcloudyr製。

Slide 28

Slide 28 text

②クエリを簡単に書きたい。 28 Rパッケージの話

Slide 29

Slide 29 text

②クエリを簡単に書きたい。 29 Rパッケージの話 クエリの作成/管理に関する話題は多い。 ※メルカリさんのクエリ管理系の記事 https://tech.mercari.com/entry/2018/05/16/142433

Slide 30

Slide 30 text

②クエリを簡単に書きたい。 30 Rパッケージの話 glueパッケージを使う想定でクエリを管理。 "select aaa from bbb where ccc = '{condition}'" > glimpse(vls_sql_list) List of 4 $ app :List of 10 ..$ install:List of 1 .. ..$ default: chr "select t.packagename ……… ..$ use :List of 1 .. ..$ default: chr "select t.id,t.age_id ……… クエリをリストオブジェクトに入れておいて参照

Slide 31

Slide 31 text

31 glueでクエリを書く記事 https://qiita.com/kosshi/items/fb8b745975ca6fd2515c

Slide 32

Slide 32 text

②クエリを簡単に書きたい。 32 Rパッケージの話 クエリ作成時によく書く少し面倒な処理群も細かく関数化 vls_inclause_make() # c("aa", "bb", "cc") -> "'aa', 'bb', 'cc'" vls_yyyymm_range() # c("201812", "201902") -> c("201812", "201901", "2 vls_calc_month() # 3/30の1か月前を計算できる感じ。

Slide 33

Slide 33 text

②クエリを簡単に書きたい。 33 Rパッケージの話 クエリテンプレートと、細かい関数と、 glueを組み合わせる。 tidyverse的な思考でクエリが書ける!! # glue用に作っておいたクエリテンプレート # 毎回変えたい部分だけglueで保管できるように記述。 query_tmp <- "select count(1) from table where yyyymm in ({yyyymm}) and category in ({category})" # よくやる処理系 yyyymm <- vls_yyyymm_range("201812", "201903") %>% vls_inclause_make() category <- vls_inclause_make(c("cat1", "cat2", "cat3")) # glueでクエリを作ってそのまま投げる。 glue::glue(query_tmp, yyyymm = yyyymm, category = category) %>% vls_unloadauto(s3path = "adhocquery/test", filename = "test", schema = "xxx")

Slide 34

Slide 34 text

34 地味だけど、すごく便利。

Slide 35

Slide 35 text

③社内ツールをRから操作 35 Rパッケージの話

Slide 36

Slide 36 text

③社内ツールをRから操作 36 Rパッケージの話 こんなことないですか・・・? • 特定の管理画面からしか取り出せないデータがある。 • 特定のツールを通さないと集計できないデータがある。

Slide 37

Slide 37 text

③社内ツールをRから操作 37 Rパッケージの話 社内ツールの影響。 • 途中でRstudioを離れてブラウザポチポチ。 • 定義変えてやり直し?? → ポチポチ。 • 去年のあれやって?? → この部分何?? (ポチポチ部分がRmdになくてわからない) 少し面倒!!再現性低い!!

Slide 38

Slide 38 text

③社内ツールをRから操作 38 Rパッケージの話 いずれか2つの方法で自動化できないか検討しよう。 httrパッケージ • WEBのリクエストが送れる。 • ツール作成者にリクエストの仕様がないか聞いてみよう。 Rseleniumパッケージ • Rからブラウザを操作できる。 • リクエストの仕様がわからなければこっちで対処。

Slide 39

Slide 39 text

③社内ツールをRから操作 39 Rパッケージの話 目指すべき姿。

Slide 40

Slide 40 text

③社内ツールをRから操作 40 Rパッケージの話 目指すべき姿。 • 全部がRmdに記述できる。 • 定義変えてやり直し?? → 変数書き換えて「run all」ポチ! • 去年のあれやって?? → 変数書き換えて「run all」ポチ! Rmdの再現性に日々感謝できる!

Slide 41

Slide 41 text

④その他やったこと(一部) 41 Rパッケージの話

Slide 42

Slide 42 text

④その他やったこと(一部) 42 Rパッケージの話 研修向けに、RからslackにSQLの確認依頼をする関数を作成。 vls_req_sql_check(sql, message = "テストです。", mention = "koshiishi")

Slide 43

Slide 43 text

④その他やったこと(一部) 43 Rパッケージの話 研修向けに、RからslackにSQLの確認依頼をする関数を作成。 vls_req_sql_check(sql, message = "テストです。", mention = "koshiishi") slack上で確認しやすいように、 SQLのインデントなどを整形したかった。 Rのパッケージ探しても無い、自分で作 るのは大変そう。。。

Slide 44

Slide 44 text

44 業務効率化 →Rの不得意分野をRでやる必要性

Slide 45

Slide 45 text

④その他やったこと(一部) 45 Rパッケージの話 Rで実現できなそうなことは他の言語に任せよう。 V8パッケージ • Rからjavascriptのコードを評価できる。 • 今回はこっちを使用 raticulateパッケージ • RからPythonが使える。 他にもrjavaとか。

Slide 46

Slide 46 text

④その他やったこと(一部) 46 Rパッケージの話 Rで実現できなそうなことは他の言語に任せよう。 • Rからは色んな言語が使える(glue言語というらしい) • データ分析系でないエンジニアに 「こんなことできるjavascript/Pythonのコード無い?」 とか聞いてみよう。 少し探してくれたら大体みつかる。

Slide 47

Slide 47 text

47 パッケージは作った。 だがユーザ数=1では意味なし。

Slide 48

Slide 48 text

48 Rの普及の話 既存メンバー • パッケージを作ったことにより、Rからなら簡単にデータ抽出 できるというウワサ → スクリプト言語書ける系の人たちがRに歩み寄る!! データ抽出を簡単にする仕組みだけで 数人のRユーザを獲得。 新卒メンバー(主にプログラミング未経験) • 配属直後にR研修:スタンダード感を演出 • 「データ抽出」という避けては通れないデータ分析の入り口 がRになったことでRに接する機会が増加。 • 1対1でRを使った分析フォロー • 大抵は3か月程度でtidyverseが問題なく使える。

Slide 49

Slide 49 text

49 Rユーザ率は8割くらいに。 パッケージ開発/メンテも 新卒ちゃん2人と一緒にやるように Rの普及の話

Slide 50

Slide 50 text

50 チームR化計画

Slide 51

Slide 51 text

51 • 社内用のRパッケージを軸に業務効率化しRを普及。 • データ抽出の簡略化は大事。業務効率大幅アップ。 • Rだけでなく、ミドルウェア含め実現できないか検討しよう。 • クエリはglueに渡す想定の形式でリスト管理がオススメ。 • 少し面倒なよくやる系コードをパッケージにしておくと便利。 • 社内ツール、WEBツールもRから操作できるようにすると再 現性が劇的に高まる。(Rmdで管理できるようにしよう。) • Rの不得意分野は他の言語に任せて解決。 まとめ

Slide 52

Slide 52 text

52 Python版も作りたい

Slide 53

Slide 53 text

Enjoy! 53