$30 off During Our Annual Pro Sale. View Details »

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 Slide

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

    View 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 Slide

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

    View Slide

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

    View Slide

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

    View 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 Slide

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

    View Slide

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

    View Slide

  10. ① 記事閲覧数の集計

    View Slide

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

    View Slide

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

    View 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 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 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 Slide

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

    View Slide

  17. ② 記事推薦

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View 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 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 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 Slide

  25. ③ さまざまな応用例

    View 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 Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View 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 Slide

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

    View Slide

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

    View Slide