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

    View full-size slide

  2. はじめに
    2 / 32

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  6. 今日のお話
    6 / 32

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  9. Overview
    9 / 32

    View full-size slide

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

    View full-size slide

  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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

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

    View full-size slide

  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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  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

    View full-size slide

  28. まとめ
    28 / 32

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  32. Enjoy!
    32 / 32

    View full-size slide