
- はじめに
- Sweetvizライブラリのインストール
- 日本語を含むデータを分析する場合の設定
- EDAレポートの作成
- analyze() 関数による探索的データ解析の実行
- show_notebok() 関数または show_html() 関数によるレポートの出力
- compare_intra() 関数によるデータフレーム内の比較
- compare() 関数によるデータフレーム間の比較
- 注
■はじめに
この記事では、Pythonにおける「新しい」[1]探索的データ解析 (EDA) のためのライブラリである、Sweetvizの使い方を紹介します。
■探索的データ解析 (EDA) とは
Sweetvizライブラリは、探索的データ解析を効率的に行うためのライブラリです。探索的データ解析は、Exploratory Data Analysisの訳語で、EDAとも呼ばれます。

John W. Tukey (1977). Exploratory Data Analysis. Pearson.
探索的データ解析は、著名な統計学者である、ジョン・テューキーが提唱したアプローチです。データに対して、いきなり仮説検定など高度な手法を適用するのではなく、まずはデータを多面的に観察し、その特徴を理解したうえで適切な分析手法を検討しましょう、という考え方です。特に、データに含まれる外れ値や異常値に着目し、適切に処理することで、より精度の高い分析ができるようになります。そのために、探索的データ解析では、データをさまざまに可視化することで、データの特徴を捉えることが重視されています。
...それ以上いろいろ語るとボロが出ますので、以下の優れた記事などを参考にしてください。
- 探索的データ解析(Exploratory data analysis)とは? - 株式会社NTTデータ数理システム
- 第1回 データ解析の第一歩は計算ではない|2014年2月号|統計の落とし穴と蜘蛛の糸|羊土社:実験医学online
- 探索的データ解析における正しい可視化手法の選び方と描き方 - Qiita
ただ、いずれにしても、PythonやRといったプログラミング言語で探索的データ解析を行おうとすると、たかだか棒グラフを1つ描くにも何行もプログラムを書かないといけなくて、面倒です。[2]Sweetvizは、Python上で、基本的な探索的データ解析を、半自動的に行ってくれるライブラリです。
■Sweetvizライブラリについて
すでに触れましたが、Sweetvizは、比較的新しい探索的データ解析のためのライブラリです。競合、というか同種のものとして、pandas-profilingやPandasGUIがあります。
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ノートブックを作成しました。
閲覧するぶんには、Googleアカウントは不要です。実行、編集したい場合は、Googleアカウントでログインし、自分のドライブにコピーしてから行います。また、以下にコード部分だけを抜き出したPythonスクリプトを示します。なお、データは2種類あり、1つはscikit-learnの make_classification() 関数で作成した架空のデータ、もうひとつは、気象観測機器で測定した、筆者宅の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)
w と h は、ノートブックのセルの中 (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のフォントには日本語のグリフしか入っていないので、ハングルや中国語は化けるような気もしますが。