Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

石原祥太郎 (株式会社日本経済新聞社) 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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

日本経済新聞社とデータ ● 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/

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

① 記事閲覧数の集計

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

サンプルコード・データセットの紹介 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

Slide 14

Slide 14 text

データセットの読み込み 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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

② 記事推薦

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

# データを学習用( 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

Slide 23

Slide 23 text

[12]: https://github.com/upura/booking-challenge-2021 [13]: https://github.com/upura/sigir-ecom-2021 テキスト・画像 機械学習モデルによる予測 23 記事ID 記事ID Prediction decoder … … テキスト・画像 予測 過去に読んだ記事ID(+テキスト・画像などの特徴量)を用いて、次に読 む記事を予測するモデルを作成できる。性能の高いアルゴリズムとし て、ニューラルネットワーク[12]や、勾配ブースティング決定木[13]がよく 用いられる。

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

③ さまざまな応用例

Slide 26

Slide 26 text

機械学習コンペティションへの出題 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/

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

実装の変更による処理速度改善 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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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