度数分布したい(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です。