ヒストグラムしたい(pandas.DataFrame.plot.hist

 1import pandas as pd
 2
 3# データを準備する
 4data = pd.DataFrame(...)
 5
 6# ヒストグラムを描く
 7data.plot.hist(
 8  bins=ビン数,
 9  range=(ヒストグラムの下限値, ヒストグラムの上限値),
10  title="ヒストグラム",
11  xlabel="X軸のタイトル",
12  ylabel="Y軸のタイトル"
13)

pd.DataFrame.plot.histでヒストグラムを作成できます。 オプションでビン数やヒストグラムの範囲、タイトルや軸のタイトルを変更できます。

binsオプションでビン数を変更できます。デフォルトは10になっています。 rangeオプションでヒストグラムの範囲を変更できます。 デフォルトは、データの最小値と最大値が自動的に設定されます。

重要

データ分析するときは、まずヒストグラムを作ってデータの分布を確認しましょう。 ヒストグラムは、データの分布を視覚的に理解するための基本的なツールです。 データの分布を理解することで、適切な統計手法を選択したり、データの特徴を把握したりできます。

注意

ヒストグラムは、連続的な数値データをビンに分割して、その頻度を表示するグラフです。 カラム内のデータに文字列(str)が含まれている場合、このメソッドは使えません(たぶん)。

カテゴリカルデータをヒストグラムで表現したい場合は、あらかじめデータフレームを集計して、棒グラフ(pandas.DataFrame.plot.bar)を使う必要があります。

ビニングしたい(bins / range

1# 任意のビニング
2bins = [0, 10, 30, 50, 70, 80]
3
4data.plot.hist(
5    bins=bins,
6    range=(0, 100),
7)

binsオプションでビン数を変更できます。デフォルトは10になっています。 リストを指定すれば、任意の間隔でビニングできます。

rangeオプションでヒストグラムの範囲を変更できます。 デフォルトは、データの最小値と最大値が自動的に設定されます。

注意

rangeはヒストグラムに使用するデータの範囲を制限するオプションです。 範囲外のデータは集計対象から除除されます。

アンダーフローやオーバーフローとして集計されないので注意してください。

累積したい(cumulative

 1data.plot.hist(
 2    cumulative=True,
 3    bins=ビン数,
 4    range=(xmin, xmax)
 5)
 6
 7# matplotlibで設定する場合
 8fig, ax = plt.subplots()
 9ax.hist(
10    data,
11    bins=ビン数,
12    range=(xmin, xmax),
13    cumulative=True
14)

cumulative=Trueオプションで、累積ヒストグラムを作成できます。

規格化したい(density

1data.plot.hist(
2    density=True,
3    bins=ビン数,
4    range=(xmin, xmax)
5)

density=Trueオプションで、ヒストグラムを規格化できます。 規格化すると、ヒストグラムの面積が1になるように調整されます。

ログ表示したい(log

1data.plot.hist(
2    log=True,
3    bins=ビン数,
4    range=(xmin, xmax)
5)

log=Trueオプションで、Y軸をログ表示にできます。 頻度の値が大きく異なる場合に、ログ表示にすることで全体の傾向を見やすくできます。

グループ化したい(by

 1data.plot.hist(
 2    by="グループ化したいカラム名",
 3    bins=ビン数,
 4    range=(xmin, xmax)
 5)
 6
 7# data.groupbyした場合
 8grouped = data.groupby("グループ化したいカラム名")
 9grouped.plot.hist(
10    bins=ビン数,
11    range=(xmin, xmax)
12)

byオプションで、指定したカラムの値ごとにグループ化してヒストグラムを作成できます。 グループ化されたヒストグラムは、同じグラフ内に重ねて表示されます。 グループごとに色分けされるので、グループごとの分布の違いを視覚的に比較できます。

注釈

byオプションは、内部的にはgroupbyしてからヒストグラムを作成しているだけなので、あらかじめgroupbyしてからヒストグラムを作成することもできます。

積み上げたい(stacked

1data.plot.hist(
2    by="グループ化したいカラム名",
3    bins=ビン数,
4    range=(xmin, xmax),
5    stacked=True
6)

stacked=Trueオプションで、グループ化したヒストグラムを積み上げて表示できます。

統計情報を自動計算したい

 1def hbar(
 2    data: pd.DataFrame,
 3    header: str,
 4    *,
 5    bins: int = 50,
 6    xmin: float = 0,
 7    xmax: float = 100,
 8    ax: plt.Axes | None = None,
 9    **kwargs
10) -> tuple[plt.Axes, dict]:
11    """
12    ROOTのTH1風ヒストグラム関数
13    """
14    # データを抽出
15    d = data[header]
16
17    # Axesを作成
18    if ax is None:
19        fig, ax = plt.subplots()
20
21    # underflow data: d < xmin
22    uf = (d < xmin).sum()
23
24    # overflow data: d > xmax
25    of = (d > xmax).sum()
26
27    # valid data: within the range
28    valid = d[(d >= xmin) & (d <= xmax)]
29
30    # histogram
31    h = ax.hist(
32      valid,
33      bins=bins,
34      range=(xmin, xmax),
35      **kwargs
36    )
37
38    # statistics: ROOT-like
39    total_entries = int(len(d))
40    valid_entries = int(len(valid))
41    underflow = int(uf)
42    overflow = int(of)
43    mean = float(valid.mean()) if valid_entries > 0 else np.nan
44    stddev = float(valid.std()) if valid_entries > 0 else np.nan
45
46    stats = {
47      "total_entries": total_entries,
48      "valid_entries": valid_entries,
49      "underflow": underflow,
50      "overflow": overflow,
51      "mean": mean,
52      "rms": stddev,
53      "xmin": xmin,
54      "xmax": xmax,
55      "bins": bins,
56    }
57
58    return ax, stats

ROOTのTH1クラスを真似してヒストグラムを作ってみました。 ヒストグラムの統計情報を自動的に計算して、辞書で返す関数です。 この関数を使うと、ヒストグラムの統計情報を簡単に取得できます。

 1# Usage
 2ax, stats = hbar(
 3    data,
 4    header="ヒストグラムにしたいカラム名",
 5    bins=ビン数,
 6    xmin=ヒストグラムの下限値,
 7    xmax=ヒストグラムの上限値,
 8    color="blue",
 9    alpha=0.7,
10    title="ヒストグラム",
11    xlabel="X軸のタイトル",
12    ylabel="Y軸のタイトル",
13)
14
15# 統計情報を表示
16print(stats)
17
18# 統計情報を凡例に追加
19ax.legend([
20    f"Entries: {stats['total_entries']}",
21    f"Valid Entries: {stats['valid_entries']}",
22    f"Underflow: {stats['underflow']}",
23    f"Overflow: {stats['overflow']}",
24    f"Mean: {stats['mean']:.2f}",
25    f"RMS: {stats['rms']:.2f}",
26])
27
28# グラフを表示
29plt.show()

リファレンス