ヒストグラムしたい(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()