06.2.1
ヒストグラム
sns.histplot(data=df, x="sepal_length", binwidth=0.5) で Iris のがく片の長さ 150 個が 0.5 cm 刻みの 8 本ほどの棒になり、5〜6 cm に山があって右に裾が伸びる形が読めます。同じデータでも binwidth を 0.1 にすればギザギザ、2 にすれば棒 2 本と印象が変わるので、幅を 2〜3 通り試して変わらない特徴だけを信じるのが読み方の基本です。読み終えると、平均と標準偏差が山の重心と横幅として図のどこに見えるかを説明でき、件数の違う 2 群を stat="density" で揃えて比べられるようになります。直感 #
アヤメ 150 個の「がく片の長さ」は 4.3 cm から 7.9 cm の間に散らばっています。「平均 5.84 cm」と聞いても、全員が 5.8 cm 前後なのか、5 cm と 7 cm に分かれているのかは分かりません。ヒストグラムは 4.0〜4.5、4.5〜5.0、…と 0.5 cm ごとの区間を作り、各区間に入る個数を数えて棒にします。棒が高い区間に値が集まり、棒が低い区間はまれで、棒の並びの形が「分布の形」です。横軸が切れ目のない数値なので棒どうしは隙間なく並び、カテゴリごとに離して描く棒グラフと見分けられます。
何が起きているか(ステップで見る) #
コードを読む前に、この手法が図の上で何をしているかを追ってみましょう。「再生」を押すか、スライダーを動かすと 1 手順ずつ進みます。
見るポイント:同じデータでも階級の幅で山の見え方が変わる。いくつか試して形が安定する幅を選ぶ。
Python で描く #
次のコードは Iris データの sepal_length 列を binwidth=0.5 の階級に分けて数え、度数を棒の高さにしたヒストグラムを描きます。
| |

実行結果の読み方 #
5.0〜6.5 cm の 3 本の棒が高く、ここに 150 個のうち 90 個ほどが集まっています。左の裾は 4.3 cm で短く切れる一方、右は 7.5 cm 以上まで長く伸びているので、分布は右に歪んだ形です。平均 5.84 cm は山の重心に、標準偏差 0.83 cm は山の横幅に対応します。3 品種が混ざっているため、hue="species" を足せば setosa だけが 4.3〜5.8 cm に別の山を作ることも見えてきます。
使いどころと落とし穴 #
ヒストグラムが向くのは、1 変数の形を最初に確かめるときです。山が 1 つか 2 つか、歪み、外れ値の候補がひと目で拾えます。落とし穴は 3 つあります。第一に binwidth を 1 つに決めて描くと、たまたまその幅で出た凸凹を分布の特徴と思い込むので、0.3・0.5・1.0 のように 2〜3 通りで描き比べます。第二に、150 個と 30 個のように件数が違う群を度数で重ねると大きい群が支配的に見えるため、stat="density" に正規化してから重ねます。第三は右に長く伸びる価格や所得のデータで、棒が左に押し込まれて読めなくなるので log_scale=True で対数軸にします。幅の選択に迷いが残るなら、幅を決めずに描ける 密度プロット や ECDF で裏を取ります。