Slide 1

Slide 1 text

1 Dashでmyダッシュボードを作ろう ーpytrendsで見るコロナの感染拡大時期ー 奥田 華代 株式会社HACARUS

Slide 2

Slide 2 text

2 所属:株式会社HACARUS 肩書:データサイエンティスト 実務経験: ● 生物系・医療系のデータ分析 ● 実験データを管理する社内システムの開発 趣味:カフェ巡り、ホテルステイ、ボルダリング 好きな食べ物:パフェ 自己紹介

Slide 3

Slide 3 text

3 ● 何を作ることにしたか ● なぜ作ることにしたか ● どのように学習を進めたか ○ Dash ○ Pytrends ● どのように作り進めたか ● 作ってどうだったか ○ 可視化したデータの考察 ○ 苦労した点 今日話すこと

Slide 4

Slide 4 text

4 ● Dashやpytrendsのチュートリアル的な話 ○ インストール手順や起動手順 ○ コンポーネントの使い方や入出力の方法などの基本技術 ○ 理由:時間がないため ● データ分析の話 ○ 可視化したデータを使って未来を予測するというような機械学習的な話 ○ 理由:今回はデータの可視化に焦点を当てておりフォーカスから外れるため 話さないこと

Slide 5

Slide 5 text

5 ● 誰かがDashを使うきっかけになれば ○ 知っているけど使ったことのない人は多いはず ● 他の人がどのようにアプリ開発の学習を進めているのか、どこで苦労したのかを共有して、話の ネタになれば 発表のモチベーション

Slide 6

Slide 6 text

6 何を作ることにしたか

Slide 7

Slide 7 text

7 検索トレンドを可視化する ダッシュボード ・Googleトレンドのデータを使用 ・コロナの感染拡大時期との関連を表示

Slide 8

Slide 8 text

8 なぜ作ることにしたか

Slide 9

Slide 9 text

9 ● 業務で簡単な分析や図表の可視化ができる簡易ツールを作ることになり、以下の条件を満たす ツールを探していた ○ 学習コストが小さい ○ 短時間でそれなりのものができる ○ Pythonライブラリ ● StreamlitとDashの2つが候補に挙がり、業務ではより簡便な Streamlitを使うことに 業務で簡易アプリを作るツールを探していた Dashは不要になったけど・・・

Slide 10

Slide 10 text

10 ● 以前から検索キーワードのトレンドを自分で可視化してみたかった 例)プログラミング言語の人気ランキング Dashの使用感を確認しておきたい

Slide 11

Slide 11 text

11 ● https://trends.google.co.jp/trends/?geo=JP ● 検索トレンドを表示する ● 指定期間に検索キーワードがどれくらい検索さ れたかの推移を可視化する Googleトレンドとは

Slide 12

Slide 12 text

12 ● 検索キーワードのトレンド ○ 人気度の動向 ○ 地域別のインタレスト ○ 関連キーワード ■ 注目(検索頻度の増加率が大きい) ■ 人気(検索頻度が高い) ● 最近の急上昇ワード ● 年ごとの急上昇ワード Googleトレンドの機能

Slide 13

Slide 13 text

13 ● 良かった点 ○ 本家だけあって使いやすい ○ 確認したいワードや比較ワードを登録しておける ● あるといいなと思った機能 ○ キーワードを5つ以上比較できる ○ 人気度の動向で急激な変化を見せている時期に絞って関連キーワードを検索できる Googleトレンドを使ってみて 後者の機能をDashとpytrendsで実装してみよう

Slide 14

Slide 14 text

14 どのように学習を進めたか

Slide 15

Slide 15 text

15 ● PHPでWebアプリを作ったことがある ● RのshinyやVue.js、PythonのKivyでデスクトップアプリを作ったことがある ● Pythonはずっと使っている ● Dashは名前は知っていたが使ったことはない ● pytrendsも使ったことがない 作り始める前の知識・技術レベル つまり、Dashとpytrendsについては何も知らない

Slide 16

Slide 16 text

16 ● https://plotly.com/dash/ ● データを可視化するダッシュボードを作 るフレームワーク ● インタラクティブに動作するグラフを簡 単に埋め込める ● 商用版と無償版がある Dashとは

Slide 17

Slide 17 text

17 1. 公式チュートリアル a. インストール、起動方法、コンセプト等、基本事項を確認 b. チュートリアルに沿って実際に作って動かしてみる 2. 公式ギャラリー a. どんなものが実装できるのかを知る 3. Qiitaのキーワード検索結果 a. 見出しに目を通しす b. LGTM数や投稿時期も確認しつつ参考になりそうな記事をピックアップしておく 4. 作り進めながら必要なタイミングで各種コンポーネントの APIドキュメント Dashの学習の流れ

Slide 18

Slide 18 text

18 1. 公式チュートリアル a. インストール、起動方法、コンセプト等、基本事項を確認 b. チュートリアルに沿って実際に作って動かしてみる 2. 公式ギャラリー a. どんなものが実装できるのかを知る 3. Qiitaのキーワード検索結果 a. 見出しに目を通しす b. LGTM数や投稿時期も確認しつつ参考になりそうな記事をピックアップしておく 4. 作り進めながら必要なタイミングで各種コンポーネントの APIドキュメント Dashの学習の流れ 難易度が不明+自分の興味がどれくらい続く か分からないため、本は買わずにWebのリ ソースだけで進める APIドキュメントに目を通さなくても何ができそう か概ね把握できる。自分では考えつかなかった 見せ方を知れる 便利機能やつまづきポイントをまとめた記事を 先にみておくと、開発効率が格段にアップする

Slide 19

Slide 19 text

19 ● Github ● Googleトレンドからデータを取得する非公式 API ● Googleトレンドのすべての機能が実装されている ● 制約 ○ 公式APIではないため、頻繁にアクセスできない ■ スリープを少し長めに取る(10秒程度) ○ 最大5つのキーワードのデータしか同時取得できない(公式と同じ) ● 学習の流れ ○ 1、2本まとめ記事を読む→Google Colabで使用感の確認→Githubのドキュメント pytrendsとは

Slide 20

Slide 20 text

20 どのように作り進めたか

Slide 21

Slide 21 text

21 チュートリアルを試しながら起動 ● レイアウト ● Callbackの使い方 ● インタラクティブなグラフの挿入方法 ● なども合わせて確認 from dash import Dash, html, dcc import plotly.express as px import pandas as pd app = Dash(__name__) df = pd.DataFrame(...) fig = px.bar(df, ...) app.layout = html.Div([ html.H1(‘Hello Dash’), ... dcc.Graph( id=’example-graph’ figure=fig ) ]) If __name__ == ‘__main__’: app.run_server(debug=True)

Slide 22

Slide 22 text

22 ● https://dash-bootstrap-components.opensource.faculty.ai/ ● Bootstrapスタイルのコンポーネントライブラリ ● まだスタイルは本格的に整えないが、見た目のきれいな方が創作意欲が沸くので ● 色んなテーマがあるので気分に合わせて dash_bootstrap_componentsを導入 import dash_bootstrap_components as dbc app = Dash(__name__, external_stylesheets=[dbc.themes.VAPOR]) … dbc.コンポーネント名([]) これだけで使える!

Slide 23

Slide 23 text

23 dbc.Container( dbc.Row([ dbc.Card([md=4]), dbc.Card([md=8]) ]), html.Br(), dbc.Row([ dbc.Card([]), dbc.Card([]), dbc.Card([]), dbc.Card([]), ]), html.Br(), dbc.Row([ dbc.Card([]), dbc.Card([]), dbc.Card([]), dbc.Card([]), ]), ) dbc.Cardを使って配置決め

Slide 24

Slide 24 text

24 dbc. 設定ボタンやグラフなど見た目の要素を追加 dbc.Input dcc.DatePicker Range dbc.Checklist dbc.Button dbc.Switch dcc.Graph(空のグラフを配置)

Slide 25

Slide 25 text

25 ブラウザからの入力を受け取る dbc.Input( id="keyword", # コンポーネントのID type='text', # テキストフォーム value='virus', # 初期値 ) ……… @app.callback( Input(‘keyword’, ‘value’), ) def get_keyword_trend(kw): # トレンド取得のコードを書く dbc.Input ①入力を受け取るコン ポーネントのIDを指定 ②コンポーネントのどの値を受け取 るかパラメータ名で指定 ③どういう引数名で受 け取るか指定

Slide 26

Slide 26 text

26 入力を受けて処理した結果をブラウザに表示する dcc.Graph(id='keyword-trend-graph') ……… @app.callback( Output(‘keyword-trend-graph’, ‘figure’), Input(‘keyword’, ‘value’), ) def get_keyword_trend(kw): # トレンド取得のコードを書く # グラフを作成するコードを書く fig = px.line(...) return fig dcc.Graph ①結果を渡したいコン ポーネントのIDを指定 ②コンポーネントのどのパラ メータに渡すか指定 ③渡したい結果を returnする

Slide 27

Slide 27 text

27 検索トレンド from pytrends.request import TrendReq pytrends = TrendReq( hl=’jp-JP’, # host language tz=-540, # timezone ) keywords = [‘virus’] timeframe = ‘2022-01-01 2022-08-01’ geo = ‘JP’ pytrends.build_payload( keywords, timeframe=timeframe, geo=geo) trend_df = pytrends.interest_over_time() 関連キーワード Googleトレンドのデータを取得する処理を追加 # build_payload()まで検索トレンドと同じ # ただし指定できるキーワードは 1つまで df_dict = pytrends.related_queries() # df_dict[‘top’] -> 人気ワード # df_dict[‘rising’] -> 注目ワード

Slide 28

Slide 28 text

28 スタイルを 調整して完成

Slide 29

Slide 29 text

29 可視化したデータを読む

Slide 30

Slide 30 text

30 ● 対象地域:日本、アメリカ、イギリス、南アフリカ ● 検索キーワード:virus ● 対象期間 ○ コロナが最初に流行し始めた時期から現在まで: 2019-08-05 - 2022-08-05(3年) ○ 最近の動向:2021-08-05 - 2022-08-05(1年) ● 何をみるか ○ 対象期間の違いによるトレンドの違い ○ 地域の違いによるトレンドの違い 対象地域、検索キーワード

Slide 31

Slide 31 text

31 ● http://www.iph.pref.osaka.jp/infection/disease/corona.html ● 大阪府の情報になるが、第1波〜第7波の時期を確認 ○ 第1波:2020-01-29〜2020-06-13 ○ 第2波:2020-06-14〜2020-10-09 ○ 第3波:2020-10-10〜2021-02-28 ○ 第4波:2021-03-01〜2021-06-20 ○ 第5波:2021-06-21〜2021-12-16 ○ 第6波:2021-12-17〜2022-06-24 ○ 第7波:2021-06-25以降 ○ →検索トレンドのグラフに最初の 1ヶ月に相当する時期をハイライトで可視化 これまでのコロナ感染拡大時期

Slide 32

Slide 32 text

32 ● 第1波の期間の検索頻度は他の時期の比ではない ● 短い期間で見ると他国で先に検索頻度が高くなっていることが多い ● 検索トレンドをみておけば次に流行りそうなウイルスを早めに知れるかもしれない 読みとったこと

Slide 33

Slide 33 text

33 作ってみて

Slide 34

Slide 34 text

34 ● Loading中であることを示すSpinnerを最前面に配置する ○ dash_loading_spinnersを使用(見た目も#でかわいい) ● 間隔の調整 ○ 追加のCSSを作りたくないので ○ カード内の調整:html.Div([], style={'marginBottom': '1em'}) ○ Row間の調整:html.Br() 苦労した点

Slide 35

Slide 35 text

35 ● Dashは簡単 ○ プログラミング経験のある人なら Dash初心者でも1日〜数日でできそう ○ Jupyter上でも使えるので通常のデータ分析の中に組み込める ● 公式の日本語ドキュメントはないが、アプリ開発をしたことのない人がコンポーネントや callback の概念をさらっと知るのに良さそう ぜひ使ってみてください! 感想

Slide 36

Slide 36 text

36 ご静聴ありがとうございました!