度数分布したい(np.histogram

1freq, rank = np.histogram(データ, bins=ビン数)

np.histogramで、測定データの度数分布を取得できます。 ビン分割した結果として、度数(freq)と階級(rank)を一度に取得できます。

xに渡すデータは配列であれば、listでもnp.ndarrayでもpd.SeriesでもOKです。 binsオプションで任意のビン分割に変更できます。デフォルトは10(均等に10分割)です。

1# ages: アンケート回答者の年齢をエミュレート
2# ages = [random.randint(18, 60) for i in range(100)]
3bins = range(0, 80, 10)
4freq, rank = np.histogram(ages, bins=bins)
5
6# freq -> array([ 0,  3, 26, 19, 27, 24,  1,  0])
7# rank -> array([ 0, 10, 20, 30, 40, 50, 60, 70, 80])

上記では100人を対象としたアンケートを想定し、回答者の年齢を度数分布表に変換してみました。 binsオプションは配列を指定できます。 ビン分割に小数点(float)を使いたい場合はnp.arangeを使うとよいです。

度数分布したい(pandas.Series.value_counts

1# ages = [random.randint(18, 60) for i in range(100)]
2# data = pd.DataFrame({"age": ages})
3bins = range(0, 10, 10)
4data["age"].value_counts(bins=bins).reset_index().rename(
5    columns={"index": "rank", "count": "freq"})

pandas.Series.value_countsで、同じように度数分布を取得できます。 ただし、この場合、階級(rank)がIntervalオブジェクトになってしまい、そのあとで再利用しづらいです。

ビン分割したい(pd.cut

1# ages = [random.randint(18, 60) for i in range(100)]
2bins = range(0, 100, 10)
3categories, rank = pd.cut(ages, bins=bins, retbins=True)
4
5# type(categories) -> pandas.core.arrays.categorical.Categorical
6# rank -> array([ 0, 10, 20, 30, 40, 50, 60, 70, 80])

pd.cutで、測定データをビン分割できます。 retbins=Trueオプションで、ビン分割の配列も取得できます。 precisionオプションで、小数点以下の桁数を変更できます。デフォルトはprecision=3です。

リファレンス