論文中に 「ヒストグラム」として登場する用語。
ヒストグラム とは:1変数の分布を区間(bin)に分けて棒グラフで表す。データの「形」(対称か偏りか)を一目で把握。
ヒストグラム(histogram)は、 1変数の分布を視覚化する基本ツール。 データを区間(ビン)に分けて、 各区間に入る個数を棒の高さで示します。 分析の前に「データの形」を把握する ための必須ステップ。
読み取りポイント:
ビン幅の選び方が重要:細すぎるとノイズが見え、 粗すぎると構造が消えます。 Sturges、 Scott、 Freedman-Diaconis などの自動ルールがあり、 matplotlib のデフォルトは Auto。 不安なら複数のビン幅で確認するか、 カーネル密度推定(KDE)を並べて見るのが安全。
ヒストグラム(histogram)は、 数値データの分布の形を視覚化する最も基本的なグラフ。 データを階級(ビン)に分け、 各ビンに入る件数(頻度)を棒の高さで表します。
47都道府県の家計食料費を例に。 横軸が食料費の値、 縦軸が「その値の範囲に何県あるか」。 山型の分布が一目で分かります。
💡 ヒストグラムを描けば、 分布の中心、 ばらつき、 歪み、 外れ値、 多峰性のすべてが一目で見えます。 データ分析の最初に必ず描くべき図。
仮にデータが [78.1, 79.0, 82.0, 83.8, 84.1, 76.0] とする:
ヒストグラムで最も重要な選択がビン数(または階級幅)。 多すぎても少なすぎても分布の形を見誤ります。
| ルール | 公式 | 特徴 |
|---|---|---|
| Sturges | k = log₂(n) + 1 | n が小さい時向き。 n=47 → k=7 |
| Rice | k = 2·n^(1/3) | Sturges の代替。 n=47 → k=7 |
| Scott | 幅 = 3.5σ / n^(1/3) | 正規分布前提 |
| Freedman-Diaconis | 幅 = 2·IQR / n^(1/3) | 外れ値に強い。 推奨 |
| √n | k = √n | 簡便な経験則 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | import numpy as np import matplotlib.pyplot as plt # matplotlib: bins='auto' で Sturges + Freedman-Diaconis の組合せ plt.hist(data, bins='auto') # 個別指定 plt.hist(data, bins=20) plt.hist(data, bins='sturges') plt.hist(data, bins='fd') # Freedman-Diaconis plt.hist(data, bins='scott') # numpy.histogram_bin_edges で値の境界だけ取得 edges = np.histogram_bin_edges(data, bins='fd') |
ヒストグラムは分布の「形」を読み取るための強力なツール。 形から多くの情報が分かります。
ヒストグラムには「頻度」と「密度」の2種類の表記があります。
縦軸 = そのビンに入るデータの個数(整数)。 一番直感的。
縦軸 = 頻度 ÷ (n × ビン幅)。 全体の面積が1になるよう正規化。 異なるビン幅やサンプルサイズのヒストグラムを比較するときに使用。
ヒストグラムを「滑らかに」したもの。 ビン幅の影響を受けにくく、 連続的な分布が見える。
KDE は scipy.stats.gaussian_kde や seaborn.kdeplot で簡単に描けます。 ヒストグラムと併用するとさらに情報量が増えます。
2つ以上のグループの分布を重ねて比較できます。 「東日本と西日本では食料費の分布が違うか?」など。
東日本と西日本でほぼ同じ分布。 平均にも大きな違いはなさそうです。 仮説検定(t検定)で違いの有意性を確認するのが次のステップ。
1 2 3 4 5 6 7 8 9 10 11 12 13 | import seaborn as sns # 重ね合わせ sns.histplot(data=df, x='食料費', hue='地域', alpha=0.5, kde=True) # 並べる sns.histplot(data=df, x='食料費', hue='地域', multiple='dodge') # 積み上げ sns.histplot(data=df, x='食料費', hue='地域', multiple='stack') # 確率密度として正規化(群間サイズが違っても比較可) sns.histplot(data=df, x='食料費', hue='地域', stat='density', common_norm=False) |
2変数の関係を見るとき、 散布図ではデータが重なりすぎることがある。 そんなときは2Dヒストグラム:
「ある値以下のデータの累計」を示す:
多くのグループのKDEを縦に並べる。 月ごとの売上分布、 業界ごとの給料分布などに有効。 seaborn や joypy ライブラリ。
ヒストグラムの下に個々のデータ点を「縦棒」で表示。 サンプルサイズが少ない時に各点を可視化:
1 | sns.histplot(data, kde=True, rug=True) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | import matplotlib.pyplot as plt import pandas as pd df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932') # 基本ヒストグラム plt.figure(figsize=(10, 5)) plt.hist(df['食料費'], bins=15, color='steelblue', edgecolor='white') plt.xlabel('食料費') plt.ylabel('頻度') plt.title('食料費の分布') plt.show() # pandas の直接機能 df['食料費'].hist(bins=15, color='steelblue', edgecolor='white') # 平均と中央値を線で plt.axvline(df['食料費'].mean(), color='red', linewidth=2, label='平均') plt.axvline(df['食料費'].median(), color='orange', linestyle='--', label='中央値') plt.legend() |
1 2 3 4 5 6 7 8 9 10 11 12 13 | import seaborn as sns # 1変数 + KDE sns.histplot(df['食料費'], kde=True, color='steelblue') # 群別 sns.histplot(data=df, x='食料費', hue='地域', element='step') # 密度プロット sns.kdeplot(df['食料費'], fill=True) # 結合プロット sns.jointplot(x='食料費', y='教育費', data=df, kind='hist') |
1 2 3 4 5 6 7 | import plotly.express as px fig = px.histogram(df, x='食料費', nbins=15, marginal='box') fig.show() # 群別 fig = px.histogram(df, x='食料費', color='地域', barmode='overlay') |
機械学習プロジェクトの最初に、 各特徴量のヒストグラムを描く。 分布の形から:
LightGBM や XGBoost は、 連続値を高速処理するためにヒストグラムベースのアルゴリズム(Hist GBDT)を採用。 ビン化が高速化の鍵。
画像の RGB 各チャンネルの分布を見る。 ヒストグラム均等化(histogram equalization)は古典的なコントラスト向上手法。
生成モデルの学習時、 入力データの分布と再構成データの分布をヒストグラムで比較。 ずれていれば学習不足。
同じデータでもビン数を変えると分布の見え方が変わる。 複数のビン数で確認、 KDE を併用するのが安全。
n=10 程度ではヒストグラムの形は安定しません。 KDE や箱ひげ図のほうが情報損失が少ない。
裾の長い分布(所得、 株価)では対数軸が見やすい:plt.xscale('log')
群間比較する時、 サイズが違うグループは「密度」で描く必要があります(生の頻度だと比較不能)。
棒グラフ・ヒストグラムは縦軸を 0 から始めるのが原則。 切り取ると差が誇張されます。
「血液型」「性別」のようなカテゴリ変数には棒グラフ(bar chart)を使う。 ヒストグラムは連続値用。
ヒストグラム がデータサイエンスの体系の中でどこに位置するかを、 3つの異なる視点で可視化します。 同じ情報でも見方を変えると気付きが変わります。
🌐 統計・データサイエンス › 記述統計 › 可視化 › ヒストグラム
中心の概念から放射状に、 前提・兄弟・発展形・応用先などの関係性を矢印で結びます。 横の繋がりを見るのに最適。 ノードをドラッグ、 ホイールでズーム、 クリックで遷移。
大きな円が小さな円を包含する Circle Packing 図。 「ヒストグラム」は緑色でハイライト。
長方形を入れ子に分割した Treemap 図。 各分野の規模感を面積で比較。 「ヒストグラム」は緑色でハイライト。
| マップ | 分かること | こんな時に見る |
|---|---|---|
| 🔗 関係マップ | 手法間の横の関係(前提→発展→応用) | 「次に何を学べばよい?」 学習順序の判断 |
| ⭕ 包含マップ | 分類体系の入れ子構造(上位⊃下位) | 「この手法はどんなジャンルに属する?」 |
| 🌳 ツリーマップ | 分野の規模比較(面積=ボリューム) | 「データサイエンス全体の俯瞰像」 |
💡 ジャストインタイム学習のヒント:3つの視点を行き来することで、 概念を多角的に理解できます。 包含マップやツリーマップはズーム/ドリルダウンで大分類から細部まで探索できます。
ヒストグラムに関する用語を、 ビン幅・分布形状・関連可視化 別に索引化します。
| カテゴリ | キーワード(日本語) | キーワード(英語) |
|---|---|---|
| 基本構成 | ビン(階級)、 度数、 階級値、 階級幅、 累積度数 | bin, frequency, class width, cumulative |
| ビン幅選択則 | スタージェスの公式、 スコット、 フリードマン・ダイアコニス | Sturges, Scott, Freedman-Diaconis, Doane, Rice |
| 分布形状 | 対称、 右に裾が長い(正の歪度)、 左に裾が長い、 双峰、 一様 | symmetric, right-skewed, left-skewed, bimodal, uniform |
| 統計量 | 最頻値、 歪度、 尖度、 中央値、 四分位数 | mode, skewness, kurtosis, median, quartile |
| 関連可視化 | 密度プロット(KDE)、 箱ひげ図、 バイオリンプロット、 累積分布 | KDE, boxplot, violin plot, ECDF |
| 実装関数 | matplotlib.hist、 seaborn.histplot、 pandas.DataFrame.hist、 numpy.histogram | plt.hist, sns.histplot, df.hist, np.histogram |
SSDSE-B から「47都道府県の平均所得(万円)」を取り出し、 ヒストグラムを実際に作成します。
| 階級(万円) | 度数 | 相対度数 | 累積度数 |
|---|---|---|---|
| 240–280 | 18 | 38.3% | 18 |
| 280–320 | 19 | 40.4% | 37 |
| 320–360 | 5 | 10.6% | 42 |
| 360–400 | 3 | 6.4% | 45 |
| 400–440 | 1 | 2.1% | 46 |
| 440–540 | 1 | 2.1% | 47(東京) |
n = 47 の場合:
Sturges:⌈log₂(47)+1⌉ = 7 ビン → 幅 ≈ 42 万円
Scott:3.5σ/n^(1/3) ≈ 56 万円
Freedman-Diaconis:2·IQR/n^(1/3) ≈ 19 万円(外れ値に頑健)
Rice:2·n^(1/3) ≈ 7 ビン
所得分布は 右に裾が長い(正の歪度)。 東京都が外れ値で、 ピークは 280 万円付近。 中央値(≈295)が平均(≈304)より小さい典型的な右歪み分布。 対数変換すると対称に近づく。
1 2 3 4 5 6 7 8 9 10 11 12 13 | import matplotlib.pyplot as plt import pandas as pd df = pd.read_csv('data/raw/SSDSE-B-2024.csv', encoding='shift_jis', skiprows=1) plt.hist(df['平均所得'], bins=10, edgecolor='black', alpha=0.7) plt.xlabel('平均所得(万円)') plt.ylabel('度数') plt.title('都道府県別 平均所得分布') plt.grid(axis='y', alpha=0.3) plt.show() # ビン幅自動選択 plt.hist(df['平均所得'], bins='fd') # Freedman-Diaconis |
1 2 3 4 5 6 7 | import seaborn as sns import pandas as pd df = pd.read_csv('data/raw/SSDSE-B-2024.csv', encoding='shift_jis', skiprows=1) sns.histplot(df['平均所得'], kde=True, bins=15, color='skyblue') # rugplotで生データ位置を表示 sns.rugplot(df['平均所得'], color='red', height=0.05) |
1 2 3 4 5 6 | import pandas as pd df = pd.read_csv('data/raw/SSDSE-B-2024.csv', encoding='shift_jis', skiprows=1) df[['人口', '平均所得', '完全失業率']].hist(bins=10, figsize=(12, 4), layout=(1, 3)) # Series単独で hist df['平均所得'].plot(kind='hist', bins=15) |
1 2 3 4 5 6 7 8 9 10 | import numpy as np import pandas as pd df = pd.read_csv('data/raw/SSDSE-B-2024.csv', encoding='shift_jis', skiprows=1) counts, bin_edges = np.histogram(df['平均所得'], bins=10) print('度数:', counts) print('境界:', bin_edges) # 累積分布 cum = np.cumsum(counts) / counts.sum() print('累積相対度数:', cum) |
1 2 3 4 5 6 7 | import plotly.express as px import pandas as pd df = pd.read_csv('data/raw/SSDSE-B-2024.csv', encoding='shift_jis', skiprows=1) fig = px.histogram(df, x='平均所得', nbins=15, marginal='box', title='都道府県別 平均所得分布') fig.show() |
1 2 3 4 | import seaborn as sns sns.histplot(data=df, x='平均所得', hue='地域', element='step', stat='density', common_norm=False) # stat='density'で確率密度に正規化、 common_norm=Falseで群ごとに正規化 |