前処理大全:第1章~第2章
この記事は書籍「前処理大全」の第1章と第2章のcodeをまとめたものです。
データサイエンス初学者で、データの前処理を学びたい人にとっての参考になればと思います。ちなみに環境は「ANACONDA」から「Jupter Notebook」を使ってます。簡単に環境構築できるので勉強用にはおすすめです。
尚、本書では「SQL・R・Python」それぞれで前処理のcodeが記載されてますが、本記事ではPythonでの前処理のみ記載してるのでご注意を。
第1章:前処理とは
この章では「そもそも前処理とは?」という内容が記載されてます。その上でなぜ前処理が必要なのかや前処理をしないとどうなるのかがイメージできると思います。機械学習に触れられてるのもありがたいですね。
まずはデータセットの準備です。
# 必要ライブラリの読み込み
import numpy as np
import pandas as pd
# CSVファイルの読み込み
reserve_tb = pd.read_csv('reserve.csv', encoding = 'UTF-8')
# 読み込んだファイルの先頭5行を表示
reserve_tb.head()
csvファイルをローカルに落としてから読み込んでます。
第2章:抽出
第2章はデータ全体に対する前処理です。まずは特定の列を指定して抽出するcode。
2-1:データ列指定による抽出
# iloc関数の2次元配列の1次元目に「:」を指定することで全行を指定
# iloc関数の2次元配列の1次元目に抽出したい行番号の配列を指定して、列を抽出。
# 0:6で、1~5列目を指定してるのと同じ
reserve_tb.iloc[:, 0:6]
# 配列に文字配列を指定することで、指定した列名の列を抽出
reserve_tb[['reserve_id', 'hotel_id', 'customer_id']]
# loc関数の2次元配列の2次元目に抽出したい列名の配列を指定することで、列を抽出
reserve_tb.loc[:, ['hotel_id', 'customer_id']]
上記のcodeは全て特定の列を指定して抽出するcodeです。本書でお勧めされてるのは2つ目と3つ目のcodeですが、iloc関数を使い方は知ってても良いと思います。
# drop関数によって、不要な列を削除
# axisを1にすることで、列の削除を指定
# inplaceをTrueにすることで、reserbe_tbの書き換えを指定
reserve_tb.drop(['people_num', 'total_price'], axis=1,inplace=True)
# people_numとtotal_price列が削除されたことを確認
reserve_tb.head()
こちらは特定の列を削除するcodeです。データセットによっては分析に使わない列があると思うので、列を削除することでデータを軽くできますね。
2-2:条件指定による抽出
checkout_dateが'2016-10-13'~'2016-10-14'のデータのみ抽出します。
# 配列に条件を指定することで、条件に適合して行を抽出
# DataFrameの特定の列に対する不等式によって、判定結果のTrue/Falseの配列を取得
# 条件式を&で繋ぐことによって、判定結果が共にTrueの場合のみTrueとなる配列を取得
reserve_tb[(reserve_tb['checkout_date'] >= '2016-10-13') &
(reserve_tb['checkout_date'] <= '2016-10-14')]
# loc関数の2次元配列の1次元目に条件を指定することで、条件に適合した行を抽出
# loc関数の2次元配列の2次元目に:を指定することで全列を抽出
reserve_tb.loc[(reserve_tb['checkout_date'] >= '2016-10-13') &
(reserve_tb['checkout_date'] <= '2016-10-14'), :]
# queryk関数を使うことで1行で実現できる
reserve_tb.query('"2016-10-13" <= checkout_date <= "2016-10-14"')
おすすめなのは最後のcodeですね。query関数を使って簡潔で分かりやすく記載されてます。
2-3:データ値に基づかないサンプリング
こちらはデータ量が多すぎる時にサンプリングによってデータ量を減らせます。特定の条件でサンプリングするのではなく、ランダムでサンプリングできるcodeです。
# reserve_tbから50%サンプリング
reserve_tb.sample(frac=0.5)
2-4:集約IDに基づくサンプリング
こちらはデータの偏りが無いように、customer_idでサンプリングを行ってから対象データのサンプリングを行っています。
# reserve_tb['customer_id'].unique()は、重複を排除した'customer_id'を返す
# sample関数を利用するためにpandas.Series(pandasのリストオブジェクト)に変換
# sample関数によって顧客IDをサンプリング
target = pd.Series(reserve_tb['customer_id'].unique()).sample(frac=0.5)
# isin関数によって、customer_idがサンプリングした顧客IDのいずれかに一致した行を抽出
reserve_tb[reserve_tb['customer_id']. isin(target)]
まとめ
今回は1章と2章の内容をまとめました。3章以降もcodeを書いたら記事を作成しますので、Pythonを使った前処理書学者の参考になればと思います。
サポートして頂いたお金は開業資金に充てさせて頂きます。 目標は自転車好きが集まる場所を作る事です。 お気持ち程度でいいのでサポートお願い致します!