トップ 履歴 一覧 ソース 検索 ヘルプ RSS ログイン

Sweetvizライブラリによる探索的データ解析


キーワード

最終更新時間:2021年05月14日 15時56分34秒
アフィリエイト・広告について
プライバシーポリシー

はじめに

この記事では、Pythonにおける「新しい」[1]探索的データ解析 (EDA) のためのライブラリである、Sweetvizの使い方を紹介します。

 探索的データ解析 (EDA) とは

Sweetvizライブラリは、探索的データ解析を効率的に行うためのライブラリです。探索的データ解析は、Exploratory Data Analysisの訳語で、EDAとも呼ばれます。

https://raw.githubusercontent.com/ltl-manabi/JapanR2019_rev2021/main/image/eda_book.jpg
John W. Tukey (1977). Exploratory Data Analysis. Pearson.

探索的データ解析は、著名な統計学者である、ジョン・テューキーが提唱したアプローチです。データに対して、いきなり仮説検定など高度な手法を適用するのではなく、まずはデータを多面的に観察し、その特徴を理解したうえで適切な分析手法を検討しましょう、という考え方です。特に、データに含まれる外れ値や異常値に着目し、適切に処理することで、より精度の高い分析ができるようになります。そのために、探索的データ解析では、データをさまざまに可視化することで、データの特徴を捉えることが重視されています。

...それ以上いろいろ語るとボロが出ますので、以下の優れた記事などを参考にしてください。

ただ、いずれにしても、PythonやRといったプログラミング言語で探索的データ解析を行おうとすると、たかだか棒グラフを1つ描くにも何行もプログラムを書かないといけなくて、面倒です。[2]Sweetvizは、Python上で、基本的な探索的データ解析を、半自動的に行ってくれるライブラリです。

 Sweetvizライブラリについて

すでに触れましたが、Sweetvizは、比較的新しい探索的データ解析のためのライブラリです。競合、というか同種のものとして、pandas-profilingPandasGUIがあります。


https://github.com/fbdesignpro/sweetviz

Sweetviz is an open-source Python library that generates beautiful, high-density visualizations to kickstart EDA (Exploratory Data Analysis) with just two lines of code. Output is a fully self-contained HTML application.

という文に、特徴が集約されています。

  • 探索的データ解析を加速させる高品質な可視化
  • たった2行で実行可能
  • 単独で配布可能なHTMLアプリとして出力可能

「まずはデータを多面的に観察し、その特徴を理解したうえで適切な分析手法を検討」するためには、充分な機能があると言えるでしょう。ここから、Python (Anaconda) 環境に、Sweetvizをインストールし、使用する流れを紹介していきます。

Sweetvizライブラリのインストール

最近では、Pythonにおけるパッケージ管理はpipが主流になっているようです[3]が、ここではAnaconda (conda) を使います。condaでは、conda-forgeリポジトリで公開されている[4]ので、以下のようにインストールします。

conda install -c conda-forge sweetviz

なお、Jupyter LabなどのノートブックでSweetvizを使用する場合、プログレスバーを表示するための ipywidgets ライブラリが必要になるようです。こちらも、合わせてインストールしてください。

$ conda install -c conda-forge sweetviz jupyterlab ipywidgets

インストールが完了しました。

日本語を含むデータを分析する場合の設定

列名に日本語を含むデータをSweetvizで扱う場合、(1) Noto Sans CJKフォントのインストール、(2) 設定ファイルの作成、読み込みの2点が必要です。Notoフォントは、Googleによるオープンソースのフォントです。Sweetvizでは、「CJKの文字を扱う場合、フォントはNoto Sans CJK JPにする」という設定が決め打ちで書かれています。 [5]

そのため、OSがWindowsであれmacOSであれLinuxであれ、システムにNotoフォントをインストールする必要があります。Windowsでは、Googleのサイトからフォントファイルをダウンロードし、インストールする必要があります。

Linux (Ubuntu) では、aptにパッケージがありますので、以下のようにしてインストールできます。

$ sudo apt install fonts-noto-cjk
$ sudo fc-cache -fv

現在のmatplotlibでは、特に matplotlibrc ファイルの書き換えや、mpl-data ディレクトリ以下へのフォントの配置は必要ないと思います。

また、上述の「CJKの文字を扱う場合、フォントはNoto Sans CJK JPにする」という処理は、Sweetvizの設定ファイルで指定し、有効にする必要があります。設定項目は、use_cjk_font で、値を 1 に指定します。現在のところ、Pythonスクリプト内で設定を行う方法はないようなので、別途 sweetviz_settings.ini といった名前 (名前は何でも良いです) の設定ファイルを作成し、以下のように記述します。

このファイルを、ライブラリ読み込み時 (下記) に指定します。

EDAレポートの作成

さて、それではSweetvizを使って探索的データ解析を行ってみましょう。ひととおりの流れを記述したGoogle Colabノートブックを作成しました。


https://colab.research.google.com/drive/1vLB_PCwQwn4IT5R6tuhLA3oAm5GaEBSE?usp=sharing

閲覧するぶんには、Googleアカウントは不要です。実行、編集したい場合は、Googleアカウントでログインし、自分のドライブにコピーしてから行います。また、以下にコード部分だけを抜き出したPythonスクリプトを示します。なお、データは2種類あり、1つはscikit-learnの make_classification() 関数で作成した架空のデータ、もうひとつは、Ambient Weather WS-2902Cで気象観測で紹介している、気象観測機器で測定した、筆者宅の1か月ぶんの気象データです。

ノートブックとの違いは、ノートブックでは show_notebook() 関数でインライン (埋め込み) でレポートを出力している一方、スクリプトでは show_html() 関数でHTMLファイルとして出力している部分だけです。

 analyze() 関数による探索的データ解析の実行

ポイントは、上記スクリプトの17行目以降です。Pandasデータフレームに対して、探索的データ解析を実行するには、analyze() 関数を使います。関数の書式は以下のようになります。

analyze(source=データフレーム名 / (データフレーム名, 表示名),
            target_feat=目的変数の列名,
            feat_cfg=FeatureConfigオブジェクト,
            pairwise_analysis='auto' / 'on' / 'off')

source には、Pandasのデータフレーム名を与えます。タプルとして、データフレーム名とレポートにおける表示名のペアを与えることもできます。target_feat には、目的変数の列名を指定します。現在のところ、数値 (numeric) 型か、論理 (boolean) 型しか指定できないので、目的変数のラベルに文字を使用している場合は注意してください。 feat_cfg には、別途 FeatureConfig() 関数で作成する、設定用のオブジェクトを与えます。これは、処理しない (スキップする) 列や、強制的に列の型を指定して処理したい場合に指定します。以下のような書式です。

feature_config = sv.FeatureConfig(skip='スキップする列名', force_text=['文字列型として処理する列名'])

他にも、force_cat(カテゴリ変数 / ラベル) や force_num が指定できます。pairwise_analysis は、列どうしの相関分析を行うか、という指定です。デフォルトは、自動で判定してくれます。

なお、性別ごとや、学習用データと検証用データなど、条件別の比較については、別途 compare() 関数や、compare_intra() 関数を使用します。

 show_notebok() 関数または show_html() 関数によるレポートの出力

探索的データ解析の結果は、show_*() 関数で出力します。Jupyterなど、ノートブックの中で実行している場合は、show_notebook() 関数を使うと、出力セルとして表示されます。

また、 show_html() 関数では、結果を単体で実行可能なHTMLアプリとして出力します。以下に、出力されたHTMLをインラインで示します。


それぞれの関数の書式とデフォルト設定は、以下のようになります。設定項目は、ほとんど共通です。

show_notebook(w=None, 
              h=None, 
              scale=None,
              layout='widescreen',
              filepath=None)

wh は、ノートブックのセルの中 (HTMLのIFRAME) での幅と高さを指定します。デフォルトは指定なしで、セルの100%の幅で表示されます。scale は、レポート全体の拡大縮小率を指定します。Sweetvizは、標準で1080p (1920x1080) のレイアウトになっているので、そこから考えて指定します。layout については、以下で述べます。filepath は、セルへの出力と同時にファイルにも出力したい場合に指定します。

show_html(filepath='SWEETVIZ_REPORT.html', 
          open_browser=True, 
          layout='widescreen', 
          scale=None)

open_browser オプションは、デフォルトで True ですが、都度ブラウザでレポートを開きたくない場合は、False にすると良いでしょう。 layout='vertical' と指定すると、列をクリックした際のグラフィックスが縦 (下) に表示されます。タブレットやスマートフォンでの閲覧を考慮する場合は、こちらが良いかもしれません。以下に layout='vertical' とした例を示します。

 compare_intra() 関数によるデータフレーム内の比較

1つのデータフレームの中で、特徴量の値ごとに、基本統計量などを比較したい時には、compare_intra() 関数を使います。書式は、以下のようになります。

sv.compare_intra(データフレーム名, 条件, ["条件が真の場合のグループ名", "偽の場合のグループ"], "目的変数の列名", FeatureConfigオブジェクト)



条件 には、df[性別] == "男性" など、条件式を指定します。そして、その条件が真 (True) であるグループの名前と、偽 (False) である場合のグループの名前をリストで指定します。現在のところ、真、偽による2グループでの比較にしか対応していません。目的変数と FeatureConfig オブジェクトは省略可能です。


Google Colabでは警告が大量に出ますが、問題ありません

なお、compare_intra() 関数では、データフレームに文字列型やdatetime型の列があるとエラーになるようです。以下に、実行結果をインラインで示します。

 compare() 関数によるデータフレーム間の比較

次に、同じ列構造を持つ2つのデータフレームの間で比較したい場合は、compare() 関数を使います。書式は、以下のようになります。

sv.compare([データフレーム1, "データフレーム名"], [データフレーム2, "データフレーム名"], "目的変数の列名", FeatureConfigオブジェクト)


比較対象のデータフレームと、その表示名を、リストでそれぞれ与えます。目的変数と FeatureConfig オブジェクトは省略可能です。


Google Colabでは警告が大量に出ますが、問題ありません

以下に、実行結果をインラインで示します。

ということで、Sweetvizライブラリを使った探索的データ解析の方法を紹介しました。

  • [1]2020年後半ころから注目され始めた、という意味で。
  • [2]もちろん、熟練したプログラマーの方からしたら、呼吸のようにコードが出てくるので、面倒だと思ったこともないでしょうが。
  • [3]Anacondaは、リポジトリの有料化など、いろいろあるようです。
  • [4]日々のバグフィックスを含めた、常に最新のバージョンではないですが、大きな問題はないと思います。先端を追いかけたい方はpipを使ってください。
  • [5]JPのフォントには日本語のグリフしか入っていないので、ハングルや中国語は化けるような気もしますが。

カテゴリ: [Python,データサイエンス]