これなら使える!ビッグデータ分析基盤のエコシステム

第5回ビッグデータ分析基盤のためのアドホック分析環境 ~Pandas実践編

はじめに

前回紹介したJupyterではブラウザ上でPythonを実行したり、Markdownを埋め込んだり、それをPDFやHTMLで簡単にダウンロードできることを確認しました。これによるアドホック分析を簡単に行う下地を作ることができるようになりました。今回はこうしたインタラクティブに実行できるツールを使い、データ解析を容易にするためのPandasを使う方法を説明します。

もちろん初めからPandasの多種多様な統計処理を扱う必要はありません。最初はPandasの持つデータの入出力を簡単に行ったり、データの柔軟な変形およびピボットを使ったりすることから慣れていきましょう。

Pandasの基本的な使い方

サンプルデータで試す

下記のサンプルを元に試してみます。

host,method,status
153.232.253.97,GET,200
153.232.253.97,GET,401
253.23.23.1,GET,200

これをsample.csvという形で保存し、Uploadボタンからファイルをアップロードします。

# グラフをブラウザ内で表示するために呼び出します
%matplotlib inline
# Pandasの読み込み
import pandas as pd
# Jupyterでのlsコマンド
%ls
図1 Pandasの読み込み
図1 Pandasの読み込み
# CSVデータを変数aに取り込む(statusは文字列にしておきたいので、読み込む時にstringを指定する)
a = pd.read_csv("sample.csv", dtype={'status':'S'} )
# 読み込んだ変数aの内容をそのまま参照
a
# 各columnのデータ数、平均、分散などの統計量をざっと見ることができます
a.describe
図2 CSVデータの取り込み
図2 CSVデータの取り込み
# ピボットテーブルを作る
a.T
図3 ピボットテーブルを作る
図3 ピボットテーブルを作る
# 'host'カラムのデータのみ取得する
a['host']
# 1行目から2行目までを取得する
a[1:3]
図4 hostカラムのデータのみ取得する
図4 hostカラムのデータのみ取得する
# それぞれのカラムごとの件数をカウントする
a.count()
# host毎の統計情報を参照する
a.groupby('host').describe()
図5 hostごとに件数を集計
図5 hostごとに件数を集計
# status が '200'のデータのみ取得する
a[a['status']=='200']
# status毎の件数を集計して、棒グラフで描画
a['status'].value_counts().plot(kind='bar')

さて、CSVファイルからデータを読み込んで、いろいろと操作ができることがなんとなくわかったでしょうか? それでは、今回ビッグデータ分析基盤の分析エンジンとして利用しているMySQLにつないでみましょう。MySQLに接続するために必要なライブラリについては前回のインストール手順の中ですでにセットアップ済みです。

MySQLからのデータの入力

それではまずはMySQLからデータを取得してみましょう。

SQLと連携させるインターフェースを、%load_ext sqlを実行します。これにより%%sqlと先頭につけることで、SQLのインターフェースを通したコマンドを実行することが可能になります。

%load_ext sql

備考:上記コマンドを実行した場合に、下記が表示された場合、コンフィグの名前が変わったことを警告するWarningです。現状無視して問題ありません。

/usr/local/pyenv/versions/3.4.3/lib/python3.4/site-packages/IPython/config.py:13: ShimWarning: The `IPython.config` package has been deprecated. You should import from traitlets.config instead.
  "You should import from traitlets.config instead.", ShimWarning)
/usr/local/pyenv/versions/3.4.3/lib/python3.4/site-packages/IPython/utils/traitlets.py:5: UserWarning: IPython.utils.traitlets has moved to a top-level traitlets package.
  warn("IPython.utils.traitlets has moved to a top-level traitlets package.")

MySQLへの接続情報を付与して、クエリを含めて実行します。

%%sql mysql://username:password@hostname/database
show tables;

また、2回目以降は接続情報は必要ありません。

%%sql
desc tables
図6 MySQLからデータを取り込み実行
図6 MySQLからデータを取り込み実行

SQLの結果を取得するには、以下の2種類の実行方法があります。

下記のようにワンライナーで実行するか

results=%%sql SELECT host, path, status, response_time FROM accesslog

クエリを実行した後に_を利用することで直前に実行されたコマンドの結果を代入したり、履歴から結果を取得をすることが可能です。

%%sql
SELECT host, path, status, response_time FROM accesslog
results = _
results = Out[14]

上記の場合は、ResultSets型で返却されるため、このデータをPandasで扱いやすいDataFrameに変換しておきましょう。

results = results.DataFrame()
図7 SQL実行結果の取得
図7 SQL実行結果の取得

ちなみにDataFrameとは、Rなどデータ解析ではポピュラーなデータ構造となっています。特徴としては、2次元配列の各行/列にラベルを持っており、ラベルによる操作が可能である点です。Pandasでもこのデータフレームを使って前述の処理を行います。

最後にこのMySQLのデータで、ホストごとのレスポンスタイムを箱ヒゲ図で表現してみます。箱ヒゲ図には、.boxplot()を利用します。

results[['host','response_time']].groupby('host').boxplot(return_type='axes',layout=(1,3))
図8 箱ヒゲ図の表示
図8 箱ヒゲ図の表示

まとめ

アドホック分析環境として、JupyterとPandasを利用し、ブラウザ上で手軽にさまざまな集計を行うことができるようになりました。しかし、Pandasではすべての処理をメモリ上で行うため、数百万レコードまでであれば扱えますが、それ以上のデータ量を扱おうと思うとなかなか大変です。そこで分析エンジン上で数億件以上のデータを集約した後で、アドホック分析環境上で可視化していくというステップが非常に重要になってきます。

次回は、分析エンジン上に貯められたアクセスログもとに基本KPIを見つけていきましょう。

おすすめ記事

記事・ニュース一覧