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. 石原祥太郎 (株式会社日本経済新聞社) 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
  2. いつPythonを使う? 9 • データを取得した後に、試行錯誤が必要な場合 ◦ SQLにも集約関数はあるが、生データをさまざまな観点で可視化・集計しながら 探索したい ◦ 必要な処理が固まり、定期実行が必要になったらSQLに移行することも •

    データを取得した後に、高度な処理が必要な場合 ◦ 統計の検定、機械学習、自然言語処理など ◦ BigQuery などが便利になりつつあるが、細かな調整は現状難しい
  3. データセットの読み込み 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
  4. # 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 """
  5. # データを学習用( 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
  6. [12]: https://github.com/upura/booking-challenge-2021 [13]: https://github.com/upura/sigir-ecom-2021 テキスト・画像 機械学習モデルによる予測 23 記事ID 記事ID Prediction

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

    => IDの変遷のパターンを学習し、 次に来るIDを予測できるように (この記事を読んだ人は、こんな 記事も読みそうだ) https://github.com/upura/booking-challenge-2021/blob/master/src/models.py#L51-L58
  8. 機械学習コンペティションへの出題 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/
  9. 実装の変更による処理速度改善 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