pandas-profilingで探索的データ分析

データ分析をする際に、最初にデータ全体(多すぎる時はサンプルを)を眺めてみるのですが、
その時にpandas-profilingというのを使うと便利なので紹介します。

PyPiのページには見事に何も書かれてません。 
そのため、公式ドキュメントらしいものが欲しい時はリポジトリを見ましょう。

インストール


pip install pandas-profiling

使い方ですが、とりあえず、ボストン住宅価格のデータセットでやってみましょう。


# ライブラリインポート
from sklearn.datasets import load_boston
import pandas as pd
import pandas_profiling as pdp

# データの準備(pandasデータフレームを作る)
boston = load_boston()
df = pd.DataFrame(boston.data, columns=boston.feature_names)

# レポーティング
report = pdp.ProfileReport(df)
report # jupyter notebookuで実行すると、notebook上に表示される。
# ファイル出力
report.to_file("boston.html")

これで、下のhtmlファイルが出力されます。
なお、jupyterで表示した場合も同じ見た目です。
boston

各特徴量のデータ型や分布、欠損値や相関係数などがまとまって出力されて非常に便利です。

ただ、便利すぎて、これだけみて何かすごい分析をやったような気がしてしまうことがあるのでそこだけは注意しています。

データフレームの特定の文字列を含む行を抽出するときに None の列があってもエラーにならないようにする

自然言語処理をよくやっているので、データフレームに格納されたテキストデータから、
特定の文字列を含むものを抽出する作業は非常に頻繁に発生します。
そのときには、 pandas.Series.str.contains という非常に便利な関数を使うのですが、
Series の中に None や Nan があるとエラーになるのが地味に不便でした。


print(df)
```
出力結果:
     col
0  あいうえお
1  かきくけこ
2   None
3  たちつてと
```
df[df["col"].str.contains("く")]
```
出力結果:
(略)
ValueError: cannot index with vector containing NA / NaN values
```

まあ、空白文字列か何かで埋めてあげれば何の問題もないのですが、このエラーが出ると嫌な気持ちになります。
気をつけていてもデータフレーム同士を結合したりするとすぐ None は発生しますし。

これはしょうがないと思っていたのですが、ドキュメントを見ていると、na というパラメーターがー準備されているのを見つけました。

contains の引数に na=True を指定すると,Noneの列も抽出され、na=Falseとすると、Noneの列は含みません。


print(df[df["col"].str.contains("く",na=False)])
```
出力結果:
     col
1  かきくけこ
```
print(df[df["col"].str.contains("あ",na=True)])
```
出力結果:
     col
0  あいうえお
2   None
```

これは便利ですね。
空文字列と、Noneを区別したい場面も結構あるのでNoneをそのまま残せるのはありがたいです。

また、ついでですが、 regex というパラメーターで、正規表現の使用未使用を切り替えられることにも気づきました。
デフォルトで正規表現が使えるのでいつも便利だと思っていたのですが、
完全一致のみにすることもできたのですね。