Python in Excelであれこれ試しているのですが、前々から作ってみたかった簡易EDAツールを作ってみました。テーブルデータの項目を選ぶと、いい感じのグラフを自動的に作ってくれるというものです。以下の動画は動作させたときの例で、SNSに投稿したものです。再生速度を上げているので、実際の動作はもう少しゆったりしています。

Python in Excelの動作確認をしながら楽しく適当に作ったものだったのですが、XやLinkedInでポジティブな反応があって驚きました。ありがたいです!

せっかくなので、こちらのブログでどうやって作ったのか紹介します。

やりたかったこと

今回やりたかったことは、データテーブルの項目を選ぶと自動的にいい感じのグラフを作るというものでした。つまり、データの種類に応じてデータ可視化手法を選ぶツールをPython in Excelで作ってみたわけです。

どのような場面でどういったグラフを選択するかというのは、ある程度データ分析の経験者の方であればあたりをつけられる思います。しかし、データ分析を始めたばかりの方は、すぐに思い浮かばないことがあるかもしれません。実際、データ分析の技術アドバイスをしている場面でも、よくいただく質問のひとつです。

そこで、データの項目を選んだら、そこそこいい感じに分析できるグラフを描写してくれるツールを作ってみることにしました。大げさにいうとグラフの自動選択ツールですが、そこまで万能な実装はしていません。

基本的なアイデア

とてもシンプルなアイデアで実装しています。具体的には、選択されたデータ列の型の組み合わせてに応じて、グラフを選択するという程度のものです。今回のプロトタイプで組み込んだのは以下の通り。これに加えて、1.と2.の場合は、グループ別の可視化ができるようにしています。

  1. 量的変数と量的変数:散布図(jointplot)
  2. 量的変数とカテゴリカル変数:箱ひげ図(boxplot)+ストリッププロット(stripplot)
  3. カテゴリカル変数とカテゴリカル変数:クロス集計+ヒートマップ(heatmap)

え、これだけ?と思うほど単純ですね。

拡張のアイデアとしては、カテゴリカル変数を含む場合にカテゴリ数の大小に応じてグラフの種類やサイズを変更するとか、カテゴリに含まれるデータ量がたくさんあるときにはバイオリンプロットを出すとかでしょうか。また、日時のデータはlineplotがよさそうです。

このあたりはいくらでもアイデアは詰め込むことができそうですね。

Excelでの実装方法

それでは、Excelでの実装方法についてお伝えしていきます。前提として「Python in Excel」が利用できるMicrosoft 365のライセンスを持っている必要があります。基本的な動作仕様については以下のページをご覧くださいませ。

共通的な設定

今回はいくつかのシートを使って実装しています。すべてのシートに共通するような設定事項は一番初めのシートに書いておくと便利です。今回はグラフ描画ツールであるseabornを日本語で表示させるための設定を書きました。

import matplotlib.pyplot as plt
sns.set()
plt.rcParams['font.family'] = 'Meiryo'

セルに'=py('と入力するとPythonコードを入力するモードになり、計算バーの表示が変わります。コードの入力が終わったらCtrl+Enterで実行することができます。

このように好きなセルに好きなPythonコードを埋め込めるのが素晴らしいところですが、どこに書いたのか分かりにくくなることもありました。そこで、後でわかるようにPythonのコードがあるセルは薄水色に、その左隣のセルに"PY"と記入してセルを紺色で塗っています。これはデザイン上の話ですが、以下同じような形で実装しています。

データの準備

いつも使っている人事トイデータをExcelに取り込んでテーブル化しました。データを取り込んだシートはデータ格納専用にしておく方が便利です。

Python in Excelでデータ分析をしていくときには、基本的にはデータをpandasのデータフレームに取り込んで処理していくことになります。データフレームへの取り込みは通常のセルでもテーブルでも可能ですが、データ加工や追加を考えるとテーブル化しておくことをお勧めします。

データの取り込み

データが準備できたらデータをpandasのデータフレームに取り込みます。Python in Excelが初めて動くときにpandasはimportされているので、さくっと取り込めます。データが取り込んだ後、データフレームの大きさやデータ型を確認しています。

# データフレームの取り込み
df = xl("HRトイデータ_人事情報_拡張版[#すべて]", headers=True)

# データフレームの大きさを確認
df.shape

# データフレームに含まれる変数の一覧を確認
pd.DataFrame(df.dtypes)

データ分析を行うときには、この他に各変数の基本統計量や分布を確認すると思いますが、今回はそれをスキップしています。

グラフの表示

今回のメインシートとなるEDAシートでグラフを表示させています。データ項目と例を参照できる部分を左端におき、中心にデータ項目の選択メニューとグラフの表示部分があります。

変数の一覧

左端の変数の一覧部分はデータフレームから1件ランダムにサンプリングして転置させて表示させているだけです。ここに表示された変数の一覧を使って変数の選択リストを作っています。ちょっと強引ですが、B列の適当な範囲に「項目」という名前を付け、後の処理で利用できるようにしました。

変数の選択

x軸とy軸の変数を選択することでグラフが描けるにようになっています。また、グループ分けもできるように'hue'も設定できるようにしました。変数の選択はExcelの入力規則のリスト機能を使っていて、プルダウンメニューで選べるようにしました。

以上の通り、プルダウンメニューはExcelの標準的な機能で実装しました。Pythonコードの場所と区別するために、緑色系のデザインとしています。このあたりは本当に好みですね。

グラフ表示

選択された変数の型に応じてグラフの種類を変えながら描写するロジックを組みました。エラー処理もない本当に簡単なものです。

k_ = xl("I9") #変数x,yの変数型の組み合わせの略称
x_ = xl("G3") #x軸の変数(プルダウンで選択)
y_ = xl("G4") #y軸の変数(プルダウンで選択)
h_ = xl("G5") #hueの変数(プルダウンで選択)
if(k_ == 'cc'):
    sns.heatmap(pd.crosstab(df[x_], df[y_]),
    cmap='Blues', fmt='.1f', annot=True, linewidths=.5)
elif((k_ == 'nc') | (k_ == 'cn')):
    fig, ax = plt.subplots()
    sns.boxplot(df, x=x_, y=y_, color='w', ax=ax)
    sns.stripplot(df, x=x_, y=y_, hue=h_, alpha=.6, ax=ax)
    ax.legend()
elif(k_ == 'nn'):
    sns.jointplot(df, x=x_, y=y_, hue=h_, alpha=.7)

変数xとyの型の組み合わせでseabornのグラフを変更しています。具体的には、以下のようなルールになっています。この辺りはいくらでも拡張が可能ですね。

  • カテゴリカル変数とカテゴリカル変数: crosstabで集計してheatmapで表示
  • 量的変数とカテゴリカル変数: boxplotとstripplotを重ねて表示
  • 量的変数と量的変数:jointplotで表示

グラフはH9セルに表示させた上で、その画像の参照オブジェクトを作って拡大しています。一度参照を作ってしまえば、Pythonコードが実行されるたびに自動的に更新されます。便利ですね!

なお、変数の型の判別ですが、dtypeで選択された変数の型を取得し、その後量的変数かカテゴリカル変数かの判別表を用いて判断しました。ここら辺も力技ですね…。

まとめ

今回はPython in Excelを使った簡易EDAツールの作り方をお伝えしました。プロトタイプレベルのツールですが、Python in Excelの一つの応用例として見ていただければと思います。

やってみてわかったことではありますが、使い慣れたExcelの機能と豊富なPythonの機能を気軽に組み合わせることができるのは大きなメリットだと感じました。ちょっとしたアプリを作ることもできそうですね。

今回ご紹介したEDAツールの他にも、統計量の確認や相関分析、重回帰なども実装していますので、少しずつお伝えできればと思います。