Slide 1

Slide 1 text

R, Git, Droneを使って confluenceへのKPI予測レポートを 自動化した話 Tokyo.R #84 kazutan 2020-04-04

Slide 2

Slide 2 text

はじめに 2 / 32

Slide 3

Slide 3 text

はじめに 自己紹介 名前/アカウント 前田和寛(Maeda Kazuhiro) @kazutan Twitter GitHub Qiita, r-wakalang, etc... 所属 LINE Fukuoka株式会社 開発センター - DataLabs - DataAnalysisチーム マネージャー 3 / 32

Slide 4

Slide 4 text

R 本 #宇宙本 #犬四匹本 はじめに 4 / 32

Slide 5

Slide 5 text

はじめに おしごと LINEグループにあるデータを活用して様々な課題にアプローチ サービス関連 サービスの成長につながる分析 施策の効果検証など オペレーション関連 オペレーションの可視化 オペレーションの効率化につながる分析など 福岡で一緒にEnjoyしませんか? http://linefukuoka.blog.jp/archives/81637302_people_engineer_interview.html お気軽にご連絡ください 5 / 32

Slide 6

Slide 6 text

今日のお話 6 / 32

Slide 7

Slide 7 text

今日のお話 背景 Tokyo.R #82で以下の内容を発表 週次KPIレポートをconfluenceへUpするためにやったこと 担当していた週次KPI予測レポートをconfluenceへPublishする、という内容 この発表をみた社内の方から「これ、うちでもできませんか!?」と問い合わせを受ける 要件を整理し、以前のProductから改良・改善を加える 実装・deployして現在稼働中 今日はこの内容についてお話します 免責事項 具体的なデータおよびコードは社内情報のため伏せてます 量が多いので、かいつまんで説明します 詳細の実装については個人的に質問してください 7 / 32

Slide 8

Slide 8 text

今日のお話 要件整理 大枠の処理は以下の通り daily KPIsを算出 算出したKPIスコアを用いてモデリング fitting forecast レポート作成 各KPI指標をplot、table化 関係者が閲覧できる、confluence Wiki上の適切な場所へレポート作成 各指標ごとにページを分けていく 8 / 32

Slide 9

Slide 9 text

Overview 9 / 32

Slide 10

Slide 10 text

Overview システムアーキテクチャ こんな感じで構築しました: 10 / 32

Slide 11

Slide 11 text

Overview Outlines 1. R実行環境用のDocker imageのビルド 2. 分析フローの構築 1. データ取得、指標算出 2. モデリング、forecast 3. レポート用Rmdファイルを生成 4. Rmdファイルをrender & Confluence Wikiへpublish 5. 上記処理をオーガナイズするスクリプト 3. Droneをセット 4. Jenkinsをセット 11 / 32

Slide 12

Slide 12 text

Overview ポイント1 - Droneを採用 cf. Jenkinsに代わるGo製OSS CIツールDrone 実行環境がdockerコンテナベース 実行環境の構築やカスタマイズが容易、再現性の担保 Rをフルに使える!!! gitとの連携、UIがシンプルで使いやすい トリガー設定やsecretsが簡単・便利 すでに弊社はDroneを採用していてすぐに使える状態だった <- 重要!! ポイント2 - メンバーで共同開発 データ処理・モデリングをメンバーに、全体設計・その他を私が担当 タスクを細分化していくことで、効率よく開発ができた 12 / 32

Slide 13

Slide 13 text

実装(1) R実行環境用のDocker imageのビルド 13 / 32

Slide 14

Slide 14 text

実装(1) Docker imageのビルド 構築するDocker imageの内容 詳細は書けないので、要点のみ rockerjp/verse をベースに構築 https://hub.docker.com/r/rockerjp/verse 基本的に必要なものがすべて含まれている(重いけど) 追加要素 xgboost, prophetなど conflr 社内便利パッケージ 社内分析用DBへの接続に必要な諸設定 14 / 32

Slide 15

Slide 15 text

実装(1) Docker imageのビルド Docker imageのdeploy image build/deployにDroneを利用 1. 社内のGHEにdocker用リポジトリを準備 2. Dockerfileを設置 3. Droneの設定用yamlファイルを準備 公式のDocker pluginを利用 http://plugins.drone.io/drone-plugins/drone-docker/ imageは社内のHarborへ Harborと接続する設定などはDroneのsecretsを利用 triggerはpush, mergeに設定(定期実行にはしない) こんな感じでうまくできました 15 / 32

Slide 16

Slide 16 text

実装(2) 分析フローの構築 16 / 32

Slide 17

Slide 17 text

実装(2-1) データ取得、指標算出 データ取得 発表時間の都合により省略 基本的な部分は、以前発表したこちらの内容を参照してください: 週次KPIレポートをconfluenceへUpするためにやったこと - 2.前処理とKPI算出 指標算出 発表時間の都合により省略 基本的な部分は、以前発表したこちらの内容を参照してください: 週次KPIレポートをconfluenceへUpするためにやったこと - 2.前処理とKPI算出 17 / 32

Slide 18

Slide 18 text

実装(2-2) モデリング、forecast モデリング 発表時間の都合に省略 基本的な部分は、以前発表したこちらの内容を参照してください: 週次KPIレポートをconfluenceへUpするためにやったこと - 3.モデリング forecast 発表時間の都合により省略 基本的な部分は、以前発表したこちらの内容を参照してください: 週次KPIレポートをconfluenceへUpするためにやったこと - 3.モデリング 18 / 32

Slide 19

Slide 19 text

実装(2-3) レポート用Rmd生成 今回の要件 KPI指標それぞれでforecast それぞれの指標ごとにレポートを作成・publishする 基本的なレイアウトは同一 対象とする変数が変わる title: をそれぞれの指標に合わせて変更する必要がある これが厄介で、R Markdownのパラメータでは対応不可 今回のアプローチ 1. glue を想定した、Rmdファイル自体のテンプレRmdファイルを準備 2. テンプレRmdファイルをreadlines して文字列として取得 3. glue glue() を利用して、取得した文字列へ変数名などを流し込む 4. 文字列をwritelines して、Rmdファイルを生成する 19 / 32

Slide 20

Slide 20 text

実装(2-3) レポート用Rmd生成 テンプレの内容(例) title: KPI予測 - {var_name} (中略) ```{r} target_var = '{var_name}' (以下 target_var 利用 filter 処理) ``` glueして生成したRmdの内容(例) title: KPI予測 - uu (中略) ```{r} target_var = 'uu' (以下 target_var 利用 filter 処理) ``` 20 / 32

Slide 21

Slide 21 text

実装(2-4) render & publish line/conflrパッケージ Rmdファイルをrenderしてconfluence WikiへPublishするのに利用 conflr confl_create_post_from_Rmd で可能 しかし、できればRmdのyamlヘッダに設定を書いておきたい… PR出した https://github.com/line/conflr/pull/44 (現在はさらに改良されているけど)これで設定はRmdテンプレに書けばOKに output: conflr::confluence_document: space_key: "kosaki" parent_id: "20200404" update: TRUE use_original_size: TRUE 21 / 32

Slide 22

Slide 22 text

実装(2-5) 分析処理のオーガナイズ exec.R 「このファイルを実行すれば1-4の処理が順次実行される」ように組む droneからshellでこのファイルを実行させるため このとき、drone側からパラメータを渡す # 感 設定 最初 入 args commandArgs(trailingOnly = TRUE) confl_username as.character(args[1]) confl_password as.character(args[2]) db_user as.character(args[3]) db_password as.character(args[4]) 22 / 32

Slide 23

Slide 23 text

実装(3) Droneの設定 23 / 32

Slide 24

Slide 24 text

実装(3-1) drone.ymlの設定 主な設定内容 こんな感じです: kind: pipeline type: docker name: real_exec steps: - name: upload_report pull: default image: (実装1 準備 docker image 指定) environment: CONFL_USERNAME from_secret: confl_username CONFL_PASSWORD from_secret: confl_password DB_USER from_secret: db_user DB_PASSWORD from_secret: db_password commands: - Rscript ./exec.R $CONFL_USERNAME $CONFL_PASSWORD $DB_USER $DB_PASSWORD $DRONE_BRANCH 24 / 32

Slide 25

Slide 25 text

実装(3-1) drone.ymlの設定 drone側の設定 1. DroneのWeb UIを開き、該当のGitリポジトリへ 2. 該当リポジトリをActivate 3. ymlファイルへのパスとSecretsを設定 項目については一つ前のスライド参照 4. Cron Jobsについては設定しない 理由は実装4にて説明 これだけでOK 25 / 32

Slide 26

Slide 26 text

実装(4) Jenkinsの設定 26 / 32

Slide 27

Slide 27 text

実装(4) Jenkinsの設定 なぜJenkinsも使うの? Drone v1以降にはCron Jobsを設定可能 しかし、「何時に実行!」という設定は難しい cf. Go製OSS CI/CDプラットフォーム drone 1.0.0-rc.1 の新機能・変更点 今回はできるだけ更新時間を固定させたい DroneのAPI経由で更新するスクリプトをJenkinsのcronで回すことにした 設定内容 詳細は省略 Drone APIについては公式Doc参照: https://docs.drone.io/api/overview/ これで完成! 27 / 32

Slide 28

Slide 28 text

まとめ 28 / 32

Slide 29

Slide 29 text

まとめ: 全体像の確認 これを実装しました: 29 / 32

Slide 30

Slide 30 text

まとめ: 振り返りと今後の展開 よかったこと Droneを利用することでコンテナベースの実行環境が実現できた 各処理をコンポーネント化して実装したのでメンテしやすい モデルの改善や出力の変更など ほとんどがgitベースでの開発なのでWorkflowがスムーズ 今後の展開 モデル実装に関して 複数のモデルを比較したり、パラメータチューニングなど 今後はMLflowなど活用して、モデリング部分を切り離してスムーズにしたい 出口を切り替えれて応用 plumberを使ったAPI DBに出力し、Tableauやshinyなどへ 30 / 32

Slide 31

Slide 31 text

今回話さなかった内容 実際にはbeta環境とreal環境を準備してる gitのbranchで管理してる drone.yml側でも調整してる testやnotifyも組んでる 確認や検証はだいじですね Rでのいろいろな小技など この辺はまたどこかで機会があれば 31 / 32

Slide 32

Slide 32 text

Enjoy! 32 / 32