Save 37% off PRO during our Black Friday Sale! »

Pythonによるアクセスログ解析入門 / Tutorial on Access Log Analysis by Python

B1cc148711c6a37a5c922b6e72a4ad52?s=47 u++
October 16, 2021

Pythonによるアクセスログ解析入門 / Tutorial on Access Log Analysis by Python

PyConJP 2021での発表(https://2021.pycon.jp/time-table?id=269506) で利用した資料です。サンプルコード (https://colab.research.google.com/drive/1r4GcXWvM-j-dlfT0XF-O-Y5DiyAM-gGq?usp=sharing) もあります。

B1cc148711c6a37a5c922b6e72a4ad52?s=128

u++

October 16, 2021
Tweet

Transcript

  1. Pythonによるアクセスログ解析入門 石原祥太郎(株式会社日本経済新聞社) PyCon JP 2021 2021 年 10 月 16

  2. 発表の概要 2 • IoTやDXなどの流行語と共に、データの蓄積・利活用が進んでい る。日々利用するさまざまなアプリケーションで利用履歴がアクセ スログとして記録され、個人の嗜好に合わせたコンテンツ表示な ど、ユーザ体験の向上に繋がっている。 • 本講演では、このようなアクセスログを題材に、Pythonを用いた 解析・推薦の技術を紹介する。アクセスログ解析の技法や考え方

    について、頻繁に利用するライブラリ「Pandas」による具体的な実 装と合わせて解説する。
  3. 石原祥太郎 (株式会社日本経済新聞社) 3 • ニュース関連サービスのデータ分析・機能開発に機械学習や自 然言語処理の技術を活用 • 国内外の機械学習コンペティションで入賞経験があり[1]、 関連書籍も出版[2][3] •

    大学新聞での記者経験など、2013年から報道機関に関わり、20 年に国際ニュースメディア協会「30U30」を受賞[4] [1]: https://upura.github.io/ [2]: https://www.kspub.co.jp/book/detail/5190067.html [3]: https://book.mynavi.jp/ec/products/detail/id=123641 [4]: https://www.nikkei.co.jp/nikkeiinfo/news/information/699.htm
  4. アクセスログ解析の重要性について解説した後、多くの活用事例を取り 上げる。著名なPythonライブラリPandasの基礎的な使い方も紹介す る。 1. 新聞社でのアクセスログ解析 2. 活用事例①:記事閲覧数の集計 3. 活用事例②:記事推薦 4.

    活用事例③:さまざまな応用例 目次 4
  5. 新聞社でのアクセスログ解析

  6. 新聞社でのデータ活用 6 • 技術革新によるインターネット・スマホの普及 ◦ 誰もが情報発信できる時代に ◦ 個人最適化の需要も高まり、主戦場はインターネットへ • 新聞社の在り方が変わった

    ◦ 紙の新聞を作る人 ◦ 🆕 電子版を作る人 ◦ 🆕 ユーザの反応を見る人 ◦ 🆕 ユーザの反応を見て改善する人
  7. 日本経済新聞社とデータ • 1984年に日経テレコン、2010年に電子版を提供開始 ◦ 電子版有料会員数は81万、無料会員も含むと539万(2021年7月)[5] • 独自のリアルタイムデータ処理基盤「Atlas」を構築[6] ◦ 反応を即座に記録(閲覧だけではなく、表示やスクロールなども) •

    「データの民主化」にも力を入れている[7] 7 [5]: https://www.nikkei.com/topic/20210715.html [6]: https://hack.nikkei.com/blog/atlas_opensource_project/ [7]: https://hack.nikkei.com/blog/advent20201203/
  8. 適切なツールの利活用 8 [8]: https://www.domo.com/assets/downloads/jp-city-tours/B-3_Breakout_The%20Nikkei.pdf

  9. いつPythonを使う? 9 • データを取得した後に、試行錯誤が必要な場合 ◦ SQLにも集約関数はあるが、生データをさまざまな観点で可視化・集計しながら 探索したい ◦ 必要な処理が固まり、定期実行が必要になったらSQLに移行することも •

    データを取得した後に、高度な処理が必要な場合 ◦ 統計の検定、機械学習、自然言語処理など ◦ BigQuery などが便利になりつつあるが、細かな調整は現状難しい
  10. ① 記事閲覧数の集計

  11. 電子版で公開した記事の反応を確認 11 [9]: https://www.nikkei.co.jp/nikkeiinfo/corporate/Nikkei_profile2020_jp.pdf

  12. 解約と相関のあるエンゲージメント指標 12 [8]: https://www.domo.com/assets/downloads/jp-city-tours/B-3_Breakout_The%20Nikkei.pdf

  13. サンプルコード・データセットの紹介 13 • 株式会社Gunosyが公開しているデータセット[10]を利用 ◦ 事業関連の指標の漏洩を防ぎつつデータセットを公開する方法論を提案 ◦ ユーザIDと記事IDは匿名化、タイムスタンプも処理済み ◦ 今回は、仮にタイムスタンプを設定して分析

    • ブラウザの実行環境Google Colabで共有[11] ◦ Python 3.7系を利用 [10]: https://github.com/gunosy/publishing-dataset-recsys20 [11]: https://colab.research.google.com/drive/1r4GcXWvM-j-dlfT0XF-O-Y5DiyAM-gGq?usp=sharing
  14. データセットの読み込み 14 import pandas as pd df = pd.read_csv( 'clicks.csv')

    # タイムスタンプなどの処理(省略) df.shape # (4255355, 3) df.head() # データフレームを時系列順に並び替え df = df.sort_values( 'timestamp').reset_index(drop= True) df.head() ❯ pip install pandas
  15. # Pandasの関数を用いて、タイムスタンプから時刻を抽出 df['timestamp'] = pd.to_datetime(df[ 'timestamp']) df['hour'] = df['timestamp'].dt.hour #

    時刻が12のアクセスログのみを集計 df.query('hour==12')['article_id'].value_counts() # 記事IDと時刻の両軸でまとめて集計することも可能 df.groupby(['article_id', 'hour']).agg( {'user_id': ['nunique', 'count']} ) # 0.25.0以降はpd.NamedAggも便利 記事単位での集計 15 df['article_id'].value_counts() """ 11080 11635 11244 10724 2340 10085 36647 9484 4133 8681 ... 1516 1 31421 1 23944 1 4642 1 1096 1 Name: article_id, Length: 29740, dtype: int64 """
  16. ユーザ単位での集計 16 # Pandasの関数を用いて、タイムスタンプから日付を抽出 df['date'] = df['timestamp'].dt.date # ユーザの日付ごとの閲覧記事数と総閲覧回数を集計 df.groupby(['user_id',

    'date']).agg( {'article_id': ['nunique', 'count']} )
  17. ② 記事推薦

  18. 記事推薦の方法の一例 18 過去に読んだ記事 新しい記事 傾向を学習 推薦

  19. 過去に読んだ記事の一覧を取得 19 過去に読んだ記事 傾向を学習

  20. ユーザの「好み」に近い記事を推薦 20 過去に読んだ記事 傾向を学習 ✗

  21. 推薦するか否かを判定 21 過去に読んだ記事 傾向を学習 ✗

  22. # データを学習用( 10月1〜6日)と評価用(10月7日)に分割 train_df = df.query( 'timestamp<"2021-10-07"' ).copy() test_df =

    df.query( 'timestamp>="2021-10-07"' ).copy() # 過去に読んだ記事の一覧を取得 train_df.groupby( 'user_id')['article_id'].apply(list) """ user_id 7 [13014, 32015, 32729, 11244, 19295, 7788, 3539... 44 [36725, 29705, 13765, 28933, 12981, 10959, 102... ... 1272015 [13014, 30452, 2454, 19381, 12100] 1272043 [11244, 24171] Name: article_id, Length: 56958, dtype: object """ 記事推薦の準備 22
  23. [12]: https://github.com/upura/booking-challenge-2021 [13]: https://github.com/upura/sigir-ecom-2021 テキスト・画像 機械学習モデルによる予測 23 記事ID 記事ID Prediction

    decoder … … テキスト・画像 予測 過去に読んだ記事ID(+テキスト・画像などの特徴量)を用いて、次に読 む記事を予測するモデルを作成できる。性能の高いアルゴリズムとし て、ニューラルネットワーク[12]や、勾配ブースティング決定木[13]がよく 用いられる。
  24. ニューラルネットワークの例 24 • アイテムのIDを Long Short Term Memory (LSTM) 層に投入

    => IDの変遷のパターンを学習し、 次に来るIDを予測できるように (この記事を読んだ人は、こんな 記事も読みそうだ) https://github.com/upura/booking-challenge-2021/blob/master/src/models.py#L51-L58
  25. ③ さまざまな応用例

  26. 機械学習コンペティションへの出題 26 近年、機械学習モデルの性能を競うコンペティションへの注目が集まっ ている。世界最大のサイト「Kaggle」は2017年にGoogleに買収され、 累計登録ユーザ数は700万人を突破した。 • 日本経済新聞社:Kaggle Days Tokyo(2019)[13] •

    Booking.com:国際学会「WSDM 2021」[14] • Coveo:国際学会「SIGIR 2021」[15] [13]: https://hack.nikkei.com/blog/report_kaggle_days_tokyo/ [14]: https://hack.nikkei.com/blog/wsdm2021/ [15]: https://hack.nikkei.com/blog/sigir2021/
  27. ニュース読者の年齢推定 27 • ユーザの記事閲覧ログや記事データから、年齢を予測 => 属性情報を登録していないユーザにも、より適した情報を届け たい • 記事閲覧ログから、いかに予測に役立つ情報を抽出できたかが決 め手になった(主催)[13]

    ◦ Pandasなどを用いて、さまざまな軸でユーザの特徴を計算 ◦ 「どんな記事を多く読むか」「どれくらいの速度・間隔で読むか」など
  28. Booking.comでの旅程推薦 28 • 実際の宿泊予約に基づくデータセットから、ユーザの次の目的地を 予測 => ユーザの予約時に、追加日程を促す推薦を実現 • ニューラルネットワークを用いた予測が効果的だった(6位)[12][14]

  29. ECサイトでの購入意図予測 29 • ECサイトのアクセスログから、カートに追加された商品が最終的 に購入されるか否かを予測 => 離脱しそうなユーザに対しては施策を追加 • ニューラルネットワークや勾配ブースティング決定木を用いた予 測が効果的だった(3位)[13][15]

    • アクセスログからは「カート追加後に別の商品を何度見たか」 「カート追加後に何度検索したか」などの情報を抽出
  30. • 日々の業務に加えて、コンペティションの開催・上位入賞の経験 から感じるのは「ドメイン知識」の大切さ ◦ どのように取得されたデータなのか ◦ 何のために、何を軸に集計するのか ◦ どういう情報があれば予測性能が上がるのか •

    ドメイン知識をコードに落とし込む実装力も同様に大切 ◦ むやみにfor文を回さずに、可能な限りまとめて処理 より良いアクセスログ解析のために 30
  31. 実装の変更による処理速度改善 31 • アクセスログからセッションごとに「商品をECサイトのカートに追 加した後、別の商品を何度閲覧したか」を計算 • セッションごとに逐一データ を抽出して処理(30時間) • df.groupbyで事前にセッション

    単位で集計しておき、for文で 取り出し処理(30分) • df.groupby(‘session’)で独自関数 を適用し処理(3分) session datetime action item_id XXXX 2021-07-15 22:05 search XXXX 2021-07-15 22:05 view detail A XXXX 2021-07-15 22:06 add to cart A XXXX 2021-07-15 22:07 search XXXX 2021-07-15 22:07 view detail B YYYY 2021-07-14 08:07 search YYYY 2021-07-14 08:11 view detail B
  32. 本発表で詳細に扱えなかった大事な観点 32 • 最終的な事業目標を見据えた集計の考え方[8] ◦ KPIやエンゲージメント指標の設計 • 機械学習などの高度なモデル構築の詳細[13][14][15] ◦ 特徴量の設計やモデルの学習

    • 蓄積されるアクセスログに潜むバイアス[16] ◦ ここでもドメイン知識が求められる [16]: https://gihyo.jp/book/2021/978-4-297-12224-9
  33. まとめ 33 • 新聞社を例に、アクセスログ解析の重要性について述べた • 記事閲覧数の集計や記事推薦を題材に、Pandasの基礎的な使 い方を解説した • 機械学習コンペティションの事例を取り上げ、国内外のさまざまな 応用例の一端を紹介した

    => アクセスログ解析の面白さや可能性を感じていただく機会になれ ば嬉しいです。皆さまのプロジェクトへの応用も期待しています。