便利なPythonライブラリ②~データ前処理編~
前回の記事では、「探索的データ解析(EDA)」に関するライブラリを紹介しました。
今回は、EDAでデータの特徴を把握した後に行う、「データ前処理」機能のあるライブラリについて記事にします。
※本記事で紹介しているライブラリのインストールについては、自己責任でお願いします。
データ準備を簡単にする「dataprep」
(ライブラリ:github, 公式ドキュメント)
今回も、titanicのデータセットを利用します。
実行環境は、次の通りです。
Python 3.9.1(Google Colab:Python 3.7.12)
dataprep 0.4.1
notebook 6.4.7
概要
githubに記載のある主な機能を列挙すると、大きく下記3つがあります。
①一般的なデータソースからデータを収集する
②探索的データ分析を行う
③データのクリーニングと標準化
単にデータ前処理のみではなく、データ収集から前処理まで、一連の処理をこのライブラリでカバーしているようです。
公式ドキュメントでは、下記2つのコンポーネントを計画しているとのことです。
・Feature
・Integrate
どんな機能かは明記されていませんでしたが、特徴量エンジニアリングや様々な処理をライブラリに追加していくことが想定されます。
以降は、3つの機能を順に試していきます。
機能①:データ収集
オープンソースのAPI(TwitterやSpotifyなど)やデータベースからデータを収集することが可能です。また、各種APIのwrapperとして実装しているのでAPI別の使い方をさほど意識せずに使うことができます。
中には、Twitter APIのようにAPI Key/アクセストークンの取得が必要なAPIがあるため、使用例などを参考に使う必要があります。Google Colabとローカル環境(Python3.6.8)で下記のコードを試してみましたが、うまくいきませんでした。Pythonのバージョンなど、調査を行い、後ほど追記します。ローカル環境にて、Python 3.9.1で実行したところ正常に動きました。
await/asyncの処理は、Python3.5から導入されていますが、Pythonのバージョンによっては上手く動かない可能性があるようです。
from dataprep.connector import connect
# DBLPというコンピュータサイエンスに関連する論文等を集めたサイトからデータを収集
conn_dblp = connect("dblp", _concurrency = 5)
df = await conn_dblp.query("publication", q="CVPR 2020", _count=2000)
df.head()
機能②:探索的データ分析(EDA)
こちらについては、前回の記事で紹介したpandas-profilingにインスパイアされたそうで、出力結果も類似しています。
類似していますが、次のようなアドバンテージがあるようです。
・pandas-profilingの処理よりも、10倍高速
・インタラクティブな可視化結果
・ビッグデータのサポート
可視化したいデータをDatFrameで読み込み、daptaprepの関数に渡してあげるだけで、EDAを行うことができます。
githubでは、作成したレポートをブラウザで表示する(show_browser)ように渡しています。しかし、環境(Google Colabなど)によっては、ブラウザ連携が困難であるため、saveでファイルとして出力します。
from dataprep.datasets import load_dataset
from dataprep.eda import create_report
df = load_dataset("titanic")
# ローカル環境等でブラウザで開く場合
#create_report(df).show_browser()
# ファイルとして出力する場合
create_report(df).save()
得られるファイルの出力例は、githubにて公開されていますのでそちらを参照下さい。
個人的にpandas-profilingと比較して、使いやすいと感じた点は、ヘッダの"Variables"からそれぞれの変数名へリンクされている点でした。
機能③:データのクリーニングと標準化
今回のライブラリでは、140以上の処理が実装されており、
clean_{処理対象}(データ, 'カラム名') という使い方で統一されています。
といっても、国ごとの住所や電話番号の表記統一(決まった桁数ごとにハイフンを入れるなど)が過半数を占めていました。
その中でも、機械学習に役立ちそうな処理 clean_ml() をピックアップします。
主な処理としては、次の通りです。
・カテゴリ列に対するエンコード、欠損値の対処
・数値列に対する欠損値の対処、スケーリング
・分散の小さい数値列の削除
例として、欠損のあるカテゴリ列を除去し、欠損のある数値列を"平均"で補間、さらに正規化を行う処理を試してみました。
from dataprep.datasets import load_dataset
from dataprep.clean import clean_ml
df = load_dataset("titanic")
# データの分割
training_rate = 0.7
index = df.index
number_of_rows = len(index)
training_df = df.iloc[:int(training_rate * number_of_rows), :]
test_df = df.iloc[int(training_rate * number_of_rows):, :]
# 分割したデータに対して各処理を適用
cleaned_training_df, cleaned_test_df = clean_ml.clean_ml(training_df
, test_df
, target="Survived"
, cat_imputation="drop"
, cat_encoding="no_encoding"
, cat_null_value=[np.nan]
, num_imputation='mean'
, num_null_value=[np.nan]
, num_scaling='minmax')
cleaned_training_df
結果は以下のように処理されました。
学習データ、テストデータで分割した後にそれぞれで処理できるのはよい点です。また、裏でDaskという、DataFrameを並列処理してくれるライブラリと連携しており、メモリが必要となる大きなデータセットでも高速に処理することができるようです。
ただし、"PassengerID"といった不必要な列や"Pclass"のような数値として扱われている列は、事前に除外や型変換をしておかないと、数値列同様に正規化などが施されてしまいます。
この辺りは、データ全体を渡すのではなく必要な列のみを渡すような使い方が適切なようですね。また、本処理については、scikit-learnのpipelineのようなイメージです。
「pandasでデータ前処理(drop, fillna)を行い、scikit-learnで正規化(MinMaxScaler)を行う」という流れが1つの関数で処理できます。
オリジナルで定義した処理をpipelineとして渡すこともできるので、実装されていない処理なども1つのインターフェースで処理させることはできそうです。(Link)
引用元
まとめ
dataprepは、データ収集が可能で、収集したデータの特徴を把握、データの前処理を行うことが可能なライブラリであることがわかりました。
開発が進んでいるライブラリでもあるため、今後の機能拡張が楽しみです。
次回は、AutoML系のライブラリについていくつか試してみた内容を記事にする予定です。
今回も目を通していただき、ありがとうございました。
この記事が気に入ったらサポートをしてみませんか?