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

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

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) もあります。

Shotaro Ishihara

October 16, 2021
Tweet

More Decks by Shotaro Ishihara

Other Decks in Technology

Transcript

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

    View full-size slide

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

    View full-size slide

  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

    View full-size slide

  4. アクセスログ解析の重要性について解説した後、多くの活用事例を取り
    上げる。著名なPythonライブラリPandasの基礎的な使い方も紹介す
    る。
    1. 新聞社でのアクセスログ解析
    2. 活用事例①:記事閲覧数の集計
    3. 活用事例②:記事推薦
    4. 活用事例③:さまざまな応用例
    目次
    4

    View full-size slide

  5. 新聞社でのアクセスログ解析

    View full-size slide

  6. 新聞社でのデータ活用
    6
    ● 技術革新によるインターネット・スマホの普及
    ○ 誰もが情報発信できる時代に
    ○ 個人最適化の需要も高まり、主戦場はインターネットへ
    ● 新聞社の在り方が変わった
    ○ 紙の新聞を作る人
    ○ 🆕 電子版を作る人
    ○ 🆕 ユーザの反応を見る人
    ○ 🆕 ユーザの反応を見て改善する人

    View full-size slide

  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/

    View full-size slide

  8. 適切なツールの利活用
    8
    [8]: https://www.domo.com/assets/downloads/jp-city-tours/B-3_Breakout_The%20Nikkei.pdf

    View full-size slide

  9. いつPythonを使う?
    9
    ● データを取得した後に、試行錯誤が必要な場合
    ○ SQLにも集約関数はあるが、生データをさまざまな観点で可視化・集計しながら
    探索したい
    ○ 必要な処理が固まり、定期実行が必要になったらSQLに移行することも
    ● データを取得した後に、高度な処理が必要な場合
    ○ 統計の検定、機械学習、自然言語処理など
    ○ BigQuery などが便利になりつつあるが、細かな調整は現状難しい

    View full-size slide

  10. ① 記事閲覧数の集計

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  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
    """

    View full-size slide

  16. ユーザ単位での集計
    16
    # Pandasの関数を用いて、タイムスタンプから日付を抽出
    df['date'] = df['timestamp'].dt.date
    # ユーザの日付ごとの閲覧記事数と総閲覧回数を集計
    df.groupby(['user_id', 'date']).agg(
    {'article_id': ['nunique', 'count']}
    )

    View full-size slide

  17. ② 記事推薦

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  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

    View full-size slide

  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]がよく
    用いられる。

    View full-size slide

  24. ニューラルネットワークの例
    24
    ● アイテムのIDを Long Short Term Memory (LSTM) 層に投入
    => IDの変遷のパターンを学習し、
    次に来るIDを予測できるように
    (この記事を読んだ人は、こんな
    記事も読みそうだ)
    https://github.com/upura/booking-challenge-2021/blob/master/src/models.py#L51-L58

    View full-size slide

  25. ③ さまざまな応用例

    View full-size slide

  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/

    View full-size slide

  27. ニュース読者の年齢推定
    27
    ● ユーザの記事閲覧ログや記事データから、年齢を予測
    => 属性情報を登録していないユーザにも、より適した情報を届け
    たい
    ● 記事閲覧ログから、いかに予測に役立つ情報を抽出できたかが決
    め手になった(主催)[13]
    ○ Pandasなどを用いて、さまざまな軸でユーザの特徴を計算
    ○ 「どんな記事を多く読むか」「どれくらいの速度・間隔で読むか」など

    View full-size slide

  28. Booking.comでの旅程推薦
    28
    ● 実際の宿泊予約に基づくデータセットから、ユーザの次の目的地を
    予測
    => ユーザの予約時に、追加日程を促す推薦を実現
    ● ニューラルネットワークを用いた予測が効果的だった(6位)[12][14]

    View full-size slide

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

    View full-size slide

  30. ● 日々の業務に加えて、コンペティションの開催・上位入賞の経験
    から感じるのは「ドメイン知識」の大切さ
    ○ どのように取得されたデータなのか
    ○ 何のために、何を軸に集計するのか
    ○ どういう情報があれば予測性能が上がるのか
    ● ドメイン知識をコードに落とし込む実装力も同様に大切
    ○ むやみにfor文を回さずに、可能な限りまとめて処理
    より良いアクセスログ解析のために
    30

    View full-size slide

  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

    View full-size slide

  32. 本発表で詳細に扱えなかった大事な観点
    32
    ● 最終的な事業目標を見据えた集計の考え方[8]
    ○ KPIやエンゲージメント指標の設計
    ● 機械学習などの高度なモデル構築の詳細[13][14][15]
    ○ 特徴量の設計やモデルの学習
    ● 蓄積されるアクセスログに潜むバイアス[16]
    ○ ここでもドメイン知識が求められる
    [16]: https://gihyo.jp/book/2021/978-4-297-12224-9

    View full-size slide

  33. まとめ
    33
    ● 新聞社を例に、アクセスログ解析の重要性について述べた
    ● 記事閲覧数の集計や記事推薦を題材に、Pandasの基礎的な使
    い方を解説した
    ● 機械学習コンペティションの事例を取り上げ、国内外のさまざまな
    応用例の一端を紹介した
    => アクセスログ解析の面白さや可能性を感じていただく機会になれ
    ば嬉しいです。皆さまのプロジェクトへの応用も期待しています。

    View full-size slide