サンプルデータの抽出
統計解析においてはデータの前処理が欠かせません。まず計算機で扱えるようデータを読み込むわけですが、大きめのデータを扱う計算処理においてはそのターンアラウンドがしばしば問題になります。このようなときに採るべき策はいくつかあります。
- データのサイズを減らす
- ボトルネックを特定し計算量の削減をする
- 計算機の性能を上げる
ビッグデータなどと言われて久しいですが実際には標本のサイズを大きく取る必要はありません。標本抽出法によって有意なサンプルを抜きだしましょう。
多くのデータ集中処理では I/O がボトルネックになります。このとき必要なデータだけを読み込むようにする、もとのデータを適切に分割して入力サイズそのものを減らす、といったことを検討するのが良いでしょう。
サンプルデータのスライスと集計
スライシング
pandas でデータを扱う場合、スライシングは簡単におこなえます。
# 30 歳までのデータを抽出
data_y = data[:"30"]
# 31 歳以上のデータを抽出
data_o = data["31":]
またこのようにスライシングしたデータセットをマージすることもできます。
集計
期間平均を利用して月次データを四半期のデータに集計する例です。
data.resample('Q',how="mean")
how には "sum","mean", "median", "max", "min", "last", "first" が利用可能です。
欠損値の処理
データセットは必ずしも綺麗にそろったデータとは限りません。 pandas は欠損値の処理において現場の人々が培ったさまざまなイディオムが追加されています。
穴埋め
data.fillna(0)
上の例では欠損値を 0 に置き換えています。 data.fillna(data.mean()) などとすると平均値で穴埋めします。
直後の値で埋めるには method = "ffill" を指定します。
data.fillna(method='ffill')
また欠損値の前後の値で線形補間するのも簡単です。
data.interpolate()
欠損値を含むデータを削除することも多いでしょう。次のように取り除きます。
data.dropna(axis=0) # 行 axis=0 か列 axis=1
データの追加と置換
data['New'] という新しい列を追加します。
data['New']=rand(data.shape[0])
同じく今度は行を追加します。 .append() 関数にデータフレームを指定すれば追加することができます。
data = data.append(pd.dataFrame([1,2,3,4,5],columns=["A","B","C","D","E"],index=data[-1:].index+1))
置換するデータを data.iloc に渡せば上書きできます。 data.shape はデータフレームの行列数を表しますのでこの行列個数分だけ乱数を生成して代入することで乱数による上書きができます。
# 1 行目を乱数で上書きする
data.iloc[0]=rand(data.shape[1])
# 1 列目を乱数で上書きする
data.iloc[:,0]=rand(data.shape[0])
データを並び替えるには .sort() 関数にカラム名のリストを渡します。次の例では 1 列目を優先に 2 列目までのカラムで昇順ソートします。結果はレシーバに返ります。
data.sort(columns=list(data.columns[0:2]),ascending=True)
まとめ
pandas を利用してデータセットの加工をするときに便利な処理をまとめました。