0Pricing
Pandas & NumPy Academy · レッスン

分布プロット:histplotとkdeplot

sns.histplotで数値分布の形状を可視化し、sns.kdeplotでカーネル密度推定を重ねて表示します。

「分布プロット:histplotとkdeplot」はCoddyKit上の無料Pandas & NumPy Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPandas & NumPy Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Pandas & NumPy Academyコースには全4レッスンが含まれています。

Seabornと分布プロット

Seabornは、Matplotlib上に構築された統計データ可視化ライブラリです。高レベルAPIを提供しており、少ないコードで美しく有益なプロットを作成できます。どのデータセットでも、まず理解したいことの1つは分布の形状です。そのための主なツールが、Seabornのhistplotとkdeplotです。

import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

# Load a built-in dataset
tips = sns.load_dataset('tips')
print(tips.head())

histplotで基本的なヒストグラムを作成する

sns.histplot(data, x='column')は、数値変数のヒストグラムを作成します。SeabornはデフォルトでSturgesの公式を使い、適切なビン数を自動的に選択します。binsパラメータでビン数をカスタマイズすることも、Seabornに自動選択させることもできます。各棒の高さは、その範囲に含まれる観測値の個数を表します。

import seaborn as sns
import matplotlib.pyplot as plt

tips = sns.load_dataset('tips')

# Basic histogram of total bill amounts
sns.histplot(data=tips, x='total_bill')
plt.title('Distribution of Total Bill')
plt.xlabel('Total Bill ($)')
plt.show()

ビンとstatパラメータの調整

binsパラメータは、ヒストグラムに表示する棒の数を制御します。ビンを増やすと細かな特徴が見える一方で、ノイズが多く見えることがあります。statパラメータは、y軸が表す内容を変更します。指定できる値は、'count'(デフォルト)、'density'(確率密度)、'probability'(観測値の割合)、'percent'(パーセント)です。stat='density'を選ぶと、データセットのサイズが異なるヒストグラムも比較できるようになります。

import seaborn as sns
import matplotlib.pyplot as plt

tips = sns.load_dataset('tips')

fig, axes = plt.subplots(1, 2, figsize=(10, 4))

# Count histogram with 20 bins
sns.histplot(data=tips, x='total_bill', bins=20, ax=axes[0])
axes[0].set_title('Count (20 bins)')

# Density histogram
sns.histplot(data=tips, x='total_bill', stat='density', ax=axes[1])
axes[1].set_title('Density')

plt.tight_layout()
plt.show()

ヒストグラムへのKDEの重ね合わせ

histplotでkde=Trueを設定すると、ヒストグラムにカーネル密度推定(KDE)曲線を重ねて表示できます。KDEは、基 underlying probability distributionを滑らかに連続近似したものです。この組み合わせは非常に効果的です。ヒストグラムは元のビンごとの個数を示し、KDEは全体的な形状を明らかにして、複数のピーク(多峰性)を検出できます。

import seaborn as sns
import matplotlib.pyplot as plt

tips = sns.load_dataset('tips')

# Histogram with KDE overlay
sns.histplot(data=tips, x='total_bill', kde=True, bins=25, color='steelblue')
plt.title('Bill Distribution with KDE Overlay')
plt.xlabel('Total Bill ($)')
plt.show()

kdeplotを単独で使う

sns.kdeplot()は、ヒストグラムの棒を使わず、滑らかな密度曲線だけを描画します。複数の分布を同じ座標軸上で比較する場合に便利です。ヒストグラムを重ねると分かりにくくなりますが、KDE曲線なら重ねても読みやすさを保てます。fill=Trueパラメータを指定すると曲線の下の領域が塗りつぶされ、グループを視覚的に区別しやすくなります。

import seaborn as sns
import matplotlib.pyplot as plt

tips = sns.load_dataset('tips')

# KDE plot for lunch vs dinner bills
sns.kdeplot(data=tips, x='total_bill', hue='time', fill=True, alpha=0.5)
plt.title('Bill Distribution: Lunch vs Dinner')
plt.xlabel('Total Bill ($)')
plt.show()

グループ比較のためのhueパラメータ

histplotとkdeplotは、どちらもhueパラメータを受け取ります。これにより、カテゴリ列でデータを分割し、各グループを異なる色で描画できます。グループ間の分布を簡単に比較できます。histplotでhueを使う場合は、サイズの異なるグループを公平に比較できるよう、stat='density'を設定してください。

import seaborn as sns
import matplotlib.pyplot as plt

tips = sns.load_dataset('tips')

# Compare tip distributions by smoker status
sns.histplot(
    data=tips,
    x='tip',
    hue='smoker',
    stat='density',
    common_norm=False,
    bins=20,
    alpha=0.6
)
plt.title('Tip Distribution by Smoker Status')
plt.show()

KDEの帯域幅:bw_adjustパラメータ

KDEには帯域幅という調整用パラメータがあり、曲線の滑らかさを制御します。帯域幅が小さいと曲線がぎざぎざになり、データに過適合します。大きいと過度に滑らかになり、実際の特徴が隠れてしまいます。Seabornでは、bw_adjust(デフォルトは1.0)を、自動的に選択された帯域幅に対する倍率として使います。1未満の値では粗さが増し、1を超える値では滑らかさが増します。

import seaborn as sns
import matplotlib.pyplot as plt

tips = sns.load_dataset('tips')

fig, axes = plt.subplots(1, 3, figsize=(12, 4))
bw_values = [0.3, 1.0, 3.0]

for ax, bw in zip(axes, bw_values):
    sns.kdeplot(data=tips, x='total_bill', bw_adjust=bw, ax=ax)
    ax.set_title(f'bw_adjust={bw}')

plt.tight_layout()
plt.show()

histplotとkdeplotによる2次元分布

xとyの両方のパラメータを渡すと、histplotとkdeplotのどちらでも2次元プロットを作成できます。2Dヒストグラムは色分けされた頻度グリッドを表示し、2D KDEは同じ密度の場所を結ぶ等高線を表示します。これらのプロットから、2つの数値変数の同時分布と、変数間に相関があるかどうかを読み取れます。

import seaborn as sns
import matplotlib.pyplot as plt

tips = sns.load_dataset('tips')

fig, axes = plt.subplots(1, 2, figsize=(12, 5))

# 2D histogram
sns.histplot(data=tips, x='total_bill', y='tip', ax=axes[0])
axes[0].set_title('2D Histogram')

# 2D KDE contour plot
sns.kdeplot(data=tips, x='total_bill', y='tip', fill=True, ax=axes[1])
axes[1].set_title('2D KDE Contours')

plt.tight_layout()
plt.show()

Seabornテーマによる見た目のカスタマイズ

Seabornでは、sns.set_theme(style=)を使って組み込みのテーマを設定できます。利用可能なスタイルは、'darkgrid'、'whitegrid'、'dark'、'white'、'ticks'です。palette=またはsns.set_palette()でパレットを設定することもできます。これらの設定はセッション内の以降のすべてのプロットにグローバルに適用されるため、統一感のある見た目を簡単に実現できます。

import seaborn as sns
import matplotlib.pyplot as plt

# Apply a clean whitegrid theme
sns.set_theme(style='whitegrid', palette='muted')

tips = sns.load_dataset('tips')
sns.histplot(data=tips, x='total_bill', kde=True, bins=20)
plt.title('Styled Distribution Plot')
plt.show()

# Reset to defaults when done
sns.reset_defaults()

分布の形状を解釈する

分布プロットを読むときは、4つの重要な特徴に注目します。中心:データがどこに集中しているか(平均値/中央値)。広がり:分布の幅はどの程度か(標準偏差)。歪度:右側の裾が長いか(正の歪度)、それとも左側が長いか(負の歪度)。単峰性・多峰性:分布にピークが1つあるか(単峰性)、それとも複数あるか(二峰性/多峰性)。二峰性の分布は、分けて分析する価値のある2つの潜在的な部分母集団を示していることがよくあります。

import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np

# Simulate a bimodal distribution
np.random.seed(42)
data = np.concatenate([
    np.random.normal(loc=20, scale=3, size=300),
    np.random.normal(loc=45, scale=5, size=200)
])

sns.histplot(data, kde=True, bins=40)
plt.title('Bimodal Distribution — Two Hidden Groups')
plt.xlabel('Value')
plt.show()

displot:Figure-Levelの分布関数

sns.displot()は、独自のFigureを作成するFigure-Levelのラッパーで、col=およびrow=パラメータを使って、行や列方向にファセット分割できます。kind='hist'、kind='kde'、またはkind='ecdf'を渡すと、プロットの種類を切り替えられます。ECDF(経験累積分布関数)は、ビンを選択しなくても各値以下にデータのどの程度の割合が存在するかを示すため、特に便利です。

import seaborn as sns
import matplotlib.pyplot as plt

tips = sns.load_dataset('tips')

# Faceted KDE by day of week
sns.displot(
    data=tips,
    x='total_bill',
    col='day',
    col_wrap=2,
    kind='kde',
    fill=True
)
plt.suptitle('Bill Distributions by Day', y=1.02)
plt.show()

クイックチェック

このレッスンで学んだSeabornの分布プロットについて、理解度を確認しましょう。

レッスンのまとめ

このレッスンでは、sns.histplotでビンや統計量パラメータをカスタマイズしたヒストグラムを作成できること、sns.kdeplotでグループ比較に適した滑らかな密度曲線を描けること、そしてhueパラメータでカテゴリ変数ごとにどちらのプロットも分割し、並べて比較できることを学びました。次は、箱ひげ図、棒グラフ、バイオリンプロットなどのカテゴリ比較プロットを見ていきます。

よくある質問

「分布プロット:histplotとkdeplot」レッスンは無料ですか?

はい。「分布プロット:histplotとkdeplot」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Pandas & NumPy Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Pandas & NumPy Academyコースには全4レッスンが含まれています。

「分布プロット:histplotとkdeplot」で何を学びますか?

sns.histplotで数値分布の形状を可視化し、sns.kdeplotでカーネル密度推定を重ねて表示します。 ブラウザで直接実行するハンズオンコードでPandas & NumPy Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Pandas & NumPy Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのPandas & NumPy Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「分布プロット:histplotとkdeplot」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このPandas & NumPy Academyレッスンでコードを書いて実行できますか?

はい。すべてのPandas & NumPy Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 分布プロット:histplotとkdeplot
  2. カテゴリプロット:boxplot、barplot、violinplot
  3. 散布図とペアプロット
  4. 相関行列のヒートマップ
← Pandas & NumPy Academyに戻る