Upgrade to Pro — share decks privately, control downloads, hide ads and more …

R, Git, Droneを使ってconfluenceへのKPI予測レポートを自動化した話

R, Git, Droneを使ってconfluenceへのKPI予測レポートを自動化した話

Tokyo.R #84で発表したスライドです。

Kazuhiro Maeda

April 04, 2020
Tweet

More Decks by Kazuhiro Maeda

Other Decks in Programming

Transcript

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

  2. はじめに 2 / 32

  3. はじめに 自己紹介 名前/アカウント 前田和寛(Maeda Kazuhiro) @kazutan Twitter GitHub Qiita, r-wakalang,

    etc... 所属 LINE Fukuoka株式会社 開発センター - DataLabs - DataAnalysisチーム マネージャー 3 / 32
  4. R 本 #宇宙本 #犬四匹本 はじめに 4 / 32

  5. はじめに おしごと LINEグループにあるデータを活用して様々な課題にアプローチ サービス関連 サービスの成長につながる分析 施策の効果検証など オペレーション関連 オペレーションの可視化 オペレーションの効率化につながる分析など 福岡で一緒にEnjoyしませんか?

    http://linefukuoka.blog.jp/archives/81637302_people_engineer_interview.html お気軽にご連絡ください 5 / 32
  6. 今日のお話 6 / 32

  7. 今日のお話 背景 Tokyo.R #82で以下の内容を発表 週次KPIレポートをconfluenceへUpするためにやったこと 担当していた週次KPI予測レポートをconfluenceへPublishする、という内容 この発表をみた社内の方から「これ、うちでもできませんか!?」と問い合わせを受ける 要件を整理し、以前のProductから改良・改善を加える 実装・deployして現在稼働中 今日はこの内容についてお話します

    免責事項 具体的なデータおよびコードは社内情報のため伏せてます 量が多いので、かいつまんで説明します 詳細の実装については個人的に質問してください 7 / 32
  8. 今日のお話 要件整理 大枠の処理は以下の通り daily KPIsを算出 算出したKPIスコアを用いてモデリング fitting forecast レポート作成 各KPI指標をplot、table化

    関係者が閲覧できる、confluence Wiki上の適切な場所へレポート作成 各指標ごとにページを分けていく 8 / 32
  9. Overview 9 / 32

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

  11. 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
  12. Overview ポイント1 - Droneを採用 cf. Jenkinsに代わるGo製OSS CIツールDrone 実行環境がdockerコンテナベース 実行環境の構築やカスタマイズが容易、再現性の担保 Rをフルに使える!!!

    gitとの連携、UIがシンプルで使いやすい トリガー設定やsecretsが簡単・便利 すでに弊社はDroneを採用していてすぐに使える状態だった <- 重要!! ポイント2 - メンバーで共同開発 データ処理・モデリングをメンバーに、全体設計・その他を私が担当 タスクを細分化していくことで、効率よく開発ができた 12 / 32
  13. 実装(1) R実行環境用のDocker imageのビルド 13 / 32

  14. 実装(1) Docker imageのビルド 構築するDocker imageの内容 詳細は書けないので、要点のみ rockerjp/verse をベースに構築 https://hub.docker.com/r/rockerjp/verse 基本的に必要なものがすべて含まれている(重いけど)

    追加要素 xgboost, prophetなど conflr 社内便利パッケージ 社内分析用DBへの接続に必要な諸設定 14 / 32
  15. 実装(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
  16. 実装(2) 分析フローの構築 16 / 32

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

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

    基本的な部分は、以前発表したこちらの内容を参照してください: 週次KPIレポートをconfluenceへUpするためにやったこと - 3.モデリング 18 / 32
  19. 実装(2-3) レポート用Rmd生成 今回の要件 KPI指標それぞれでforecast それぞれの指標ごとにレポートを作成・publishする 基本的なレイアウトは同一 対象とする変数が変わる title: をそれぞれの指標に合わせて変更する必要がある これが厄介で、R

    Markdownのパラメータでは対応不可 今回のアプローチ 1. glue を想定した、Rmdファイル自体のテンプレRmdファイルを準備 2. テンプレRmdファイルをreadlines して文字列として取得 3. glue glue() を利用して、取得した文字列へ変数名などを流し込む 4. 文字列をwritelines して、Rmdファイルを生成する 19 / 32
  20. 実装(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
  21. 実装(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
  22. 実装(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
  23. 実装(3) Droneの設定 23 / 32

  24. 実装(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
  25. 実装(3-1) drone.ymlの設定 drone側の設定 1. DroneのWeb UIを開き、該当のGitリポジトリへ 2. 該当リポジトリをActivate 3. ymlファイルへのパスとSecretsを設定

    項目については一つ前のスライド参照 4. Cron Jobsについては設定しない 理由は実装4にて説明 これだけでOK 25 / 32
  26. 実装(4) Jenkinsの設定 26 / 32

  27. 実装(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
  28. まとめ 28 / 32

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

  30. まとめ: 振り返りと今後の展開 よかったこと Droneを利用することでコンテナベースの実行環境が実現できた 各処理をコンポーネント化して実装したのでメンテしやすい モデルの改善や出力の変更など ほとんどがgitベースでの開発なのでWorkflowがスムーズ 今後の展開 モデル実装に関して 複数のモデルを比較したり、パラメータチューニングなど

    今後はMLflowなど活用して、モデリング部分を切り離してスムーズにしたい 出口を切り替えれて応用 plumberを使ったAPI DBに出力し、Tableauやshinyなどへ 30 / 32
  31. 今回話さなかった内容 実際にはbeta環境とreal環境を準備してる gitのbranchで管理してる drone.yml側でも調整してる testやnotifyも組んでる 確認や検証はだいじですね Rでのいろいろな小技など この辺はまたどこかで機会があれば 31 /

    32
  32. Enjoy! 32 / 32