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