今日はseabornのboxenplot(letter-value plot)を使ってpythonのグラフを描画してみようと思います。
私はよくデータをセグメントごとに見るときに分布に違いがあるか確認するときに使います。
boxenplotは大量データ向けのboxplotの拡張版のようです。
Draw an enhanced box plot for larger datasets.
引用:https://seaborn.pydata.org/generated/seaborn.boxenplot.html
boxenplot (letter-value plot)は25パーセンタイルや75パーセンタイルのみではなく、12.5パーセンタイルや87.5パーセンタイルといった値も描画し分布の特徴を捉えることを可能にしています。
boxplotは統計の教科書や大学の授業でも習うので知っている方も多いと思います。
ボックスプロットや箱ひげ図などと呼ばれています。
ぜひboxenplotも使ってみてください。
boxenplotを使ってみる
seabornのインポートと描画の設定
import seaborn as sns
# 描画設定
sns.set_style("whitegrid")
from matplotlib import rcParams
rcParams['font.family'] = 'Hiragino Sans' # Macの場合
#rcParams['font.family'] = 'Meiryo' # Windowsの場合
#rcParams['font.family'] = 'VL PGothic' # Linuxの場合
rcParams['xtick.labelsize'] = 12 # x軸のラベルのフォントサイズ
rcParams['ytick.labelsize'] = 12 # y軸のラベルのフォントサイズ
rcParams['axes.labelsize'] = 18 # ラベルのフォrんとサイズ
rcParams['figure.figsize'] = 18,8 # 画像サイズの変更(inch)
import pandas as pd
# ボストンの住宅価格データセットの読み込み
df = pd.read_csv("http://lib.stat.cmu.edu/datasets/boston_corrected.txt", encoding='Windows-1252',skiprows=9,sep="\t")
# 上から5件を取得
df.head()
Out[0]
OBS. TOWN TOWN# TRACT LON LAT MEDV CMEDV CRIM ZN ... CHAS NOX RM AGE DIS RAD TAX PTRATIO B LSTAT 0 1 Nahant 0 2011 -70.955 42.2550 24.0 24.0 0.00632 18.0 ... 0 0.538 6.575 65.2 4.0900 1 296 15.3 396.90 4.98 1 2 Swampscott 1 2021 -70.950 42.2875 21.6 21.6 0.02731 0.0 ... 0 0.469 6.421 78.9 4.9671 2 242 17.8 396.90 9.14 2 3 Swampscott 1 2022 -70.936 42.2830 34.7 34.7 0.02729 0.0 ... 0 0.469 7.185 61.1 4.9671 2 242 17.8 392.83 4.03 3 4 Marblehead 2 2031 -70.928 42.2930 33.4 33.4 0.03237 0.0 ... 0 0.458 6.998 45.8 6.0622 3 222 18.7 394.63 2.94 4 5 Marblehead 2 2032 -70.922 42.2980 36.2 36.2 0.06905 0.0 ... 0 0.458 7.147 54.2 6.0622 3 222 18.7 396.90 5.33 5 rows × 21 columns
boxenplotの描画
# 住宅価格(中央値) x 町名 のboxenplotを確認
ax = sns.boxenplot(x="TOWN",y="CMEDV",data=df)
ax.tick_params(axis='x', labelrotation=90) # x軸のラベルを縦にする
# or ax.set_xticklabels(ax.get_xticklabels(),rotation=90)
描画できました。
町名ごとだとあんまりセグメントごとのデータ量が多くないのでboxenplotっぽくありませんでした。
これだとサンプルにならないので、新しく区分を作って表示させます。
boxenplotの描画 (新区分作成)
# numpyのインポート
import numpy as np
# 新区分を作成。平均部屋数が7.5以上は大、それ以外はその他と定義
df["新区分"] = np.where(df["RM"] >= 7.5, "大", "その他")
# boxenplotを再度描画する
ax = sns.boxenplot(x="新区分",y="CMEDV",data=df)
ax.tick_params(axis='x', labelrotation=90)
今度はboxenplotっぽいですね 笑
ボックスプロットより情報量が多くデータの理解がしやすくなったと思います。
参考
A Complete Guide to Box Plots | Atlassian
Explore the essentials of box plots with our concise guide. Learn to create, interpret, and apply these charts effective...