Kaggle(14) - 箱ひげ図とバイオリン図の表示

棒グラフでは、データ間の差や数値の大小を比較しました。

箱ひげ図を使うと、最小値・最大値・中央値・第1四分位・第2四分位といった位置やどの層のボリュームが多いかといった分布を確認できます。

四分位範囲による外れ値がどのくらいあるかも視覚的に把握でき、外れ値を確認する際にも利用できます。

箱ひげ図の表示

タイタニックのデータセットを読み込みます。

1
2
3
4
import seaborn as sns
from matplotlib import pyplot as plt
sns.set(style='darkgrid')
titanic = sns.load_dataset('titanic')

箱ひげ図を表示します。

x軸に客室ランクを表示し、y軸に年齢層を表示します。

1
sns.boxplot(data=titanic, x='pclass', y='age')

次に、客室ランクを生死でスライシングしてみます。

1
sns.boxplot(data=titanic, x='pclass', y='age', hue='survived')

最後に、別グラフで男女別に表示します。

1
sns.catplot(data=titanic, kind='box', x='pclass', y='age', hue='survived', col='sex')

バイオリン図の表示

箱ひげ図ではデータがどの位置に集中しているかという分布の情報が分かりません。

バイオリン図を使うと、左右の広がりからデータの分布が把握できます。

バイオリン図を表示してみます。

1
sns.violinplot(data=titanic, x='pclass', y='age')

上記のバイオリン図から、客室ランク3の乗船客は20歳前後の乗客が多いことが分かります。


上記の図を、生死でスライシングして表示します。

1
sns.violinplot(data=titanic, x='pclass', y='age', hue='survived')

splitオプションを有効にすると、左右でそれぞれのデータ分布を確認することができます。

1
sns.violinplot(data=titanic, x='pclass', y='age', hue='survived', split=True)

さらに、別グラフで男女別に表示します。

1
sns.catplot(data=titanic, kind='violin', x='pclass', y='age', hue='survived', col='sex')

バイオリン図を使うと分布が見やすくてオススメかなと思ったのですが、上記のバイオリン図をみていてどうしてマイナスの年齢層があるのか疑問に思いました。

同じデータを表示した箱ひげ図はこんな感じです。もちろんマイナスの年齢データはありません。

少し調べてみたところバイオリン図には欠点があり「データ分布はカーネル密度推定プロットによって滑らかに描画されるため、実際にはデータが存在しない範囲にもあたかもデータが存在しているかのように見えることがある」とのことです。

今回使用したタイタニックデータだと、マイナスの年齢をここまではっきり表示させてしまうのは問題があると思うので、バイオリン図の使用は控えた方がいいとの印象を持ちました。

(実行環境としてGoogleさんのColaboratoryを使用ています。)

次回は、時系列データの分析を行います。