以前 Hadoop で母集団から全数走査して標本を抽出する話をしました。データに関する事前の情報が少なく手探りで分析していく場合、抽出した標本をまず様々な角度からアドホックに分析してデータの特徴や傾向をつかんでいくことになります。
pandas の関数を駆使する
Hadoop による標本抽出と pandas の相性は抜群です。以前にも紹介したように pandas + matplotlib の組み合わせは Series (シリーズ) と DataFrame (データフレーム) という 2 つのデータ構造を利用して分析結果を可視化することができます。
Hadoop で抽出された標本の読み込み
Hadoop の出力はタブ区切りの定型的なデータ構造を持ちますから pd.read_table() 関数を利用してそのまま読み込むことができます。
import pandas as pd
df = pd.read_table('hadoop-out.txt')
df.describe() # 複数の要約統計量を求める
#=> count 38156219 # のべ総個体数
# unique 6536847 # ユニークな個体数
# top 0024D69XXXXX,Area9 # 1 件目のインデックス
また辞書オブジェクトをデータフレームに強制的に変換するには次のような方法があります。
df = pd.DataFrame(list(self.dic.values()), index=list(self.dic.keys()))
そもそも Fluentd などを利用して Hadoop で処理するまでの時点でデータが構造化されているのが常ですから、構造化されたデータを扱う pandas と相性が良いのは納得のいくところです。
シリーズとデータフレームの便利な関数
ワードカウント等の結果をさらに集約するのに便利なのが value_counts() 関数です。シリーズをはじめ配列やシーケンスなど一次元のデータ構造からその値の観測頻度を求めます。
また pandas には欠損値を埋める関数 fillna() も用意されており、これを使うと抽出工程で穴ができた場所を何らかの値で埋めるといったことが可能になります。
引数 | 説明 |
---|---|
value | 穴埋めをおこなうスカラー値。 (辞書でも可) |
axis | 0 なら行、 1 なら列 |
limit | 連続穴埋めの最大回数 |
method | 平均値や中央値で穴埋めをするときに指定する |
データフレームの duplicated() 関数はシリーズを返します。これはそのデータフレームですでに登場した値なら True を返しますので重複のチェックに使えます。
replace() 関数は値の置換をします。たとえば 99999 は欠損値であると見なして NaN に置き換えるには次のようにします。
series.replace('99999', np.nan)
基準値以外の外れ値を除去したり丸めることも容易です。
# 絶対値が 3 を超える (-3 から 3 の間以外) 値を NaN に
data[np.abs(data) > 3] = np.nan
まとめ
pandas の関数を利用すると抽出した標本から分析対象のターゲットを絞り込むのに役立ちます。分析の PDCA サイクルを素早く回すのに Hadoop と親和性の高い pandas は欠かせません。