Media × Tech

「Media × Tech」ブログはスマートニュースのメディア担当チームが運営するブログです。テクノロジーを活用した次世代のメディアとはどういうものか? そうしたメディアをどうやって創り出していくのか、を考えていきます。

脱 Excel ! Jupyter で始めるデータ分析

こんにちは、スマートニュースの有野です。 普段、私たちのニュースアプリ「SmartNews」を通じて各メディアが配信する記事が、ユーザーにどのように読まれているのかを分析する業務に携わっています。

みなさんは、サイトやアプリの分析を行う際、どのツールを使っていますか? 日々のルーティンで確認するデータが決まっているのであれば、Google データポータルやLookerなどのダッシュボードツールで確認するかと思いますが、スポットで、より深く思料を深めたい場合、生データ(ログデータ)を取得し、別途ExcelやGoogle SpreadSheetなどを用い、集計や可視化を行うであろうと思います。

その際に起きる問題として、

  • データ量が多く、Excelの動作が遅くなる。
  • セルに関数を埋め込む等、再利用が難しい。

などがあるかと思います。

こうした悩みを抱えているかたにすすめたいのが「Jupyter Notebook」です。本稿ではJupyter 導入への後押しに、以下のヒントをお伝えします。

  • Jupyter とはなにか
  • Jupyterで行う分析作業の例
  • 参考になる書籍・サイト・チャンネル

Jupyter Notebookとはなにか

Jupyter Notebookとは、PythonやR等のプログラミング言語に対応したインタラクティブなウェブアプリケーションのこと。 オープンソースのソフトウェアで提供されており、サーバでインストールして使うJupterHubや、ローカルに(自身のPCに)インストールをして使うものがあります。

Project Jupyter と Jupyter notebook のデモ画面

また、同様の機能として、Googleが提供している Google Colaboratory があります。 すぐに使いたいのであれば、Google Colaboratoryをお使いのGoogle Accountに紐付けて使うことができます。

Jupyterで行う分析作業の例

ここではJupyterの活用例として、アクセスログから時間帯アクセスの集計を行う過程をご紹介します。

まず、ログデータを加工し以下のようなCSV形式のアクセスログを用意します。

ログ

timestamp , user_id , アクセスしたファイルパス・・・が続きます。

このログから時間帯アクセスを取得したい場合は、1行1アクセスですから、timestampより時間を取得し、時間ごとに集約(グループ)し、行数をカウントすればよいです。

これをJupyterで実行する場合、

  1. アクセスログファイルを読み込む
  2. timestampを時間の型に変更する
  3. 時間(hour)を取り出し、行をカウントする

の手順を踏むことで時間帯アクセスを集計することができます。

では、実際にJupyterで書くコードを紹介します。コードはプログラミング言語のPythonで書かれています。プログラミング言語と聞くとすごく難しい印象をうけるかもしれませんが、すごくシンプルです。

1.アクセスログファイルを読み込む
df = pd.read_csv(‘access.log’)

df = pdの部分を除けば、read_csv と読め、その後にファイル名が続いていることがわかります。

2. timestampを時間の型に変更する
df["timestamp"] = pd.to_datetime(df["timestamp"])

次のコードも読めるところを探すと、to_datetime がありますね。目的として時間の型に変更しているようなコードに読めます。 補足として、「時間の型に変更」とは、日付や時間で計算できるように定義することです。例えば、12月の次の月は13月ではなく1月であり、11時59分に1分足すと11時60分ではなく、12時00分になることです。

3.時間(hour)を取り出し、行をカウントする
df.groupby(df["timestamp"].dt.hour).count()[“path”]

こちらも読める部分を探すと、groupby でグループ化(集約)、かっこの中には、hourもあり、時間で集約しているように読めます。 また、その後ろに count があり、URL を数えているように読めます。 この結果は以下のように表示されます。

時間帯別にグループ化されたログ

また、先程の、df.groupby(df["timestamp"].dt.hour).count()[“URL”]の最後に .plot() を追加すると、

df.groupby(df["timestamp"].dt.hour).count()[“URL”].plot()

このようなグラフで表示されます。

以上がJupyter Notebookでの分析作業の一例です。 このコードをこのまま保存しておけば、アクセスログの行数が増えても、また別のアクセスログを読み込むのであれば、ファイル名や場所の指定をするだけで、コードを再利用することができます。

補足

本稿では、導入としてプログラミング部分の説明の詳細を省略しましたが、前提部分がありますので、補足します。

ここまで簡単に集計・分析が行えるのは、Pythonプログラミングで、pandasのライブラリを利用しているからです。 ライブラリとは、特定のプログラミング処理を定型化し、かんたんに呼び出せるようにしたものです。先に紹介したCSVファイルを読み込む、時間の型に変更するなどがそれにあたります。read_csvや、to_datetimeの前に記載しているpd. がそれにあたります。 このライブラリを利用するにあたり、プログラミングの一番最初の行に、以下を記載します。

import pandas as pd

pandas をインポートし、pdと別名をつけていることが読めると思います。先に書いた、pd.とは、pandasの別名のことだとわかります。

参考になる書籍・サイト・チャンネル

以上がJupyterで行っている分析作業例となります。同様の手法で、 記事URL(path)からカテゴリを抜き出しグループして集計する、や、 形態素解析のライブラリを利用し、記事タイトルから一番多く使われているキーワードごとの集計など、できることは多くあります。 今回紹介した例は一例に過ぎず、また、環境を構築する設定などの説明を省きました。 より詳細に知りたいかたは、書籍の一読をおすすめします。

また、YouTubeでもJupyter notebookの使い方を説明した動画が多くあります。

Pandas入門|02.jupyter Labの使い方


Pythonの環境を作ろう!〜Jupyter notebookのインストールと使い方〜


おわりに

本稿を書こうと思ったきっかけを書きます。 もともと冒頭にも書いた、ExcelやGoogle SpreadSheetでの分析作業ではデータ量や再利用といった点で限界を感じていたことがあり、必要に迫られてJupyterを使い始めました。 当初は思いどおりにできないことも多々ありましたが、書籍やネット検索で多くのヒントもあり、非常に助かりました。 また、プログラミングという敷居の高さを感じることもあるかと思いますが、「分析をする」という目的があれば、必要なプログラミングにフォーカスできますし、先に紹介したライブラリが豊富で、複雑なプログラムを書かなくとも実行できます。 このように学びやすい環境が揃っていることやライブラリの豊富さから、学習コストが低い印象があります。 プログラミングはいつ始めても遅くないので、この機会にぜひチャレンジしてみてはいかがでしょうか。

著者紹介

有野 寛一(ありの・ひろかず)

有野 寛一

スマートニュース株式会社 メディア事業開発

前職ではSmartNewsAwardsを受賞した週刊アスキーのWebプロデューサー。その知見を活かした媒体社様とのコミュニケーションを担当する。大手ポータル、SNSでの経験から情報発信と受信に課題を持ち現職へ。インターネットで流通するニュースが好き。

この記事も書きました。

www.mediatechnology.jp

www.mediatechnology.jp

www.mediatechnology.jp

www.mediatechnology.jp