データを分析していると、「平均値」や「中央値」だけでは見えてこない違和感に気づくことがあります。
同じ平均を持つデータでも、その中身をよく見ると、値が集中している場合もあれば、大きくばらついている場合もあります。こうした数値の散らばり方を理解することは、データの特徴を正しく捉えるための重要な第一歩です。
ヒストグラムは、数値データの分布を直感的に把握するための、もっとも基本的な可視化手法のひとつです。どのあたりに値が多いのか、極端に大きい(あるいは小さい)値が存在するのか、といった情報を、ひと目で確認することができます。
本記事では、Pythonの可視化ライブラリ Seaborn を使い、ヒストグラムを描く方法を解説します。histplot 関数の基本的な使い方から、見た目を調整するための代表的なオプションまで、実例を交えながら順を追って見ていきます。
「数値のばらつきを感覚的に理解したい」「まずは分布を見るところから分析を始めたい」
そんな方に向けて、ヒストグラムの基本を丁寧に整理していきましょう。
Seabornの基本については、下の記事を参考に。
Seaborn入門:Pythonで始めるデータ可視化 – Lean Data Office
ヒストグラムの基本
tipsのデータセットを使います。
data=でtipsデータセットを使用し、x軸にtotal_billをプロットします。
tips = sns.load_dataset("tips")
sns.histplot(data=tips, x="total_bill")

y軸を指定すると、縦にプロットできます。
sns.histplot(data=tips, y="total_bill")

kde=で、KDEも同時にプロットできます。KDEの詳細は以下を参照ください。
データの分布をなめらかに見る:Seaborn KDEプロット – Lean Data Office
sns.histplot(data=tips, x="total_bill", kde=True)

bins=に引数を渡すと、ビンの数も明示的に調整が可能です。
sns.histplot(data=tips, x="total_bill", bins=30)

また、bins に境界値(ビンの区切り)をリストで指定することができます。
sns.histplot(data=tips, x="total_bill", bins=[10,20,40,50])

また、ビンの幅をX軸の値をベースに指定ができます。
sns.histplot(data=tips, x="total_bill", binwidth=10)

ビンを表示する範囲指定をbinrange=の引数で指定ができます。
sns.histplot(data=tips, x="total_bill", binrange=(20,40))

統計量とヒストグラム
stat=はY軸の計算方法を示します。
sns.histplot(data=tips, x="total_bill", stat='count')
‘count’はデフォルト表示ですので、見え方は変わりません。

Densityはヒストグラム全体の面積が 1 になるように正規化する方法です。
sns.histplot(data=tips, x="total_bill", stat='density')

カウントとヒストグラムの見え方は変わりませんが、Y軸の表示が変更になっているかと思います。
probabilityもヒストグラムの形状は変わりませんが、全体に対する割合を示します。
sns.histplot(data=tips, x="total_bill", stat='probability')

最後に累計(=cumulative)を説明します。わかりやすいように一部スタイルを設定していますが、ここではいったん気にせず表示方法の違いが把握できればOKです。
sns.histplot(data=tips, x="total_bill", stat='probability', fill=False, element='step', cumulative=True)

類型表示によってどこまでで何パーセントかを一目で伝えることができます。

カテゴリ変数の扱い
hue=でカテゴリを表示させます。
sns.histplot(data=tips, x="total_bill", hue='time')

sns.histplot(data=tips, x="total_bill", hue='time', element='step')

sns.histplot(data=tips, x="total_bill", hue='time', element='poly')

sns.histplot(data=tips, x="total_bill", hue='time', multiple='stack')
