赤飯にかかったアレ

雑多なメモ帳

Pythonで書く、へっぽこ社会人の統計学習[度数分布]

度数分布

DoDStat@d データ指向統計データベース データセット一覧の分布の型を使用し、異なる分布に従う4つの変量から 度数分布を求める

平均値や分散度の2つの測度だけでもデータの全体的特徴を把握する事はできるが、もっと詳しくデータの分布状況を見るために用いられるものが、度数分布、または類度分布を用いる。

度数分布(frequency distribution)は、データを特定の区間で区切り、その区間に入るデータの数を明らかにしたもの。

  • 階級(class) : 区切られたデータの区間
  • 度数(frequency) : 階級に入るデータ数

度数が色々な階級にどのように別れて広がっているかを表す。

import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
%matplotlib inline
data = pd.read_csv("data/distribu.csv")
data.head()
QRAT STR AGE DENS
0 114.0 66 47.0 550.0
1 79.0 117 47.0 561.0
2 76.0 132 48.0 488.0
3 109.0 111 48.0 507.0
4 117.0 107 48.0 526.0
data = data.rename(columns={"QRAT": "250の中から選択された50の企業の市場価値と取替原価の比率", 
                            "DENS": "1798年にキャベンディッシュによる陸地の比重 (Stigler より)", 
                            "STR": "22本の紬糸から選択した1本の糸の長さ (lbs) (A.J. Duncan より)", 
                            "AGE":"オランダ空軍の大佐の年齢 (Verhoeven より)"})
data.head()
250の中から選択された50の企業の市場価値と取替原価の比率 22本の紬糸から選択した1本の糸の長さ (lbs) (A.J. Duncan より) オランダ空軍の大佐の年齢 (Verhoeven より) 1798年にキャベンディッシュによる陸地の比重 (Stigler より)
0 114.0 66 47.0 550.0
1 79.0 117 47.0 561.0
2 76.0 132 48.0 488.0
3 109.0 111 48.0 507.0
4 117.0 107 48.0 526.0
data.dtypes
250の中から選択された50の企業の市場価値と取替原価の比率                float64
22本の紬糸から選択した1本の糸の長さ (lbs) (A.J. Duncan より)      int64
オランダ空軍の大佐の年齢 (Verhoeven より)                   float64
1798年にキャベンディッシュによる陸地の比重 (Stigler より)          float64
dtype: object
data.shape
(100, 4)
# 度数分布
age = data["オランダ空軍の大佐の年齢 (Verhoeven より)"]
frequency = np.histogram(age, bins=10, range=(0, 100))
frequency
(array([ 0,  0,  0,  0, 12, 77,  0,  0,  0,  0]),
 array([  0.,  10.,  20.,  30.,  40.,  50.,  60.,  70.,  80.,  90., 100.]))
frequency, _ = np.histogram(age, bins=10, range=(0, 100))
frequency
array([ 0,  0,  0,  0, 12, 77,  0,  0,  0,  0])
# DataFrame
freq_class = [f"{i}〜{i+10}" for i in range(0, 100, 10)]

frequency_df = pd.DataFrame({"度数" : frequency},
                           index = pd.Index(freq_class,
                                           name="階級"))
frequency_df
度数
階級
0〜10 0
10〜20 0
20〜30 0
30〜40 0
40〜50 12
50〜60 77
60〜70 0
70〜80 0
80〜90 0
90〜100 0
np.min(age)
47.0

相対度数分布

度数分布は各階級に属する度数を示す。 分布の状態を各階級の度数を全度数で割った相対度数で表示するとわかりやすい、この表を相対度分布という

  • 相対度数 : 全データに対する対象の階級のデータの割合
rel = frequency / frequency.sum()
rel
array([0.        , 0.        , 0.        , 0.        , 0.13483146,
       0.86516854, 0.        , 0.        , 0.        , 0.        ])
frequency_df["相対度数"] = rel
frequency_df
度数 相対度数
階級
0〜10 0 0.000000
10〜20 0 0.000000
20〜30 0 0.000000
30〜40 0 0.000000
40〜50 12 0.134831
50〜60 77 0.865169
60〜70 0 0.000000
70〜80 0 0.000000
80〜90 0 0.000000
90〜100 0 0.000000

累積度数分布

試験の成績が50点以下の人数や、80点以上の人数というように 度数の中で、ある値以上と以下の度数に注目する場合がある

この時、ある階級以下の度数を下からの累積度数、ある階級以上の度数を上からの累積度数といい、ある階級までの相対度数の和を累積相対度数という。

cum_rel = np.cumsum(rel)
cum_rel
array([0.        , 0.        , 0.        , 0.        , 0.13483146,
       1.        , 1.        , 1.        , 1.        , 1.        ])
frequency_df["累積度数"] = cum_rel
frequency_df
度数 相対度数 累積度数
階級
0〜10 0 0.000000 0.000000
10〜20 0 0.000000 0.000000
20〜30 0 0.000000 0.000000
30〜40 0 0.000000 0.000000
40〜50 12 0.134831 0.134831
50〜60 77 0.865169 1.000000
60〜70 0 0.000000 1.000000
70〜80 0 0.000000 1.000000
80〜90 0 0.000000 1.000000
90〜100 0 0.000000 1.000000

度数分布のグラフ

ヒストグラム

度数分布を視覚的にわかりやすく示すために 横軸に変数の値、縦軸に度数をとり、グラフ化したヒストグラム(histogram)でグラフ化し、可視化する。

ヒストグラムの他にヒストグラムの柱の頂点の中心を結んでできる折れ線グラフで度数分布を図示することもでき、これを度数折れ線という

plt.grid()
plt.hist(age, bins=10, range=(0, 100))
(array([ 0.,  0.,  0.,  0., 12., 77.,  0.,  0.,  0.,  0.]),
 array([  0.,  10.,  20.,  30.,  40.,  50.,  60.,  70.,  80.,  90., 100.]),
 <a list of 10 Patch objects>)

[f:id:sekihan_0290:20200117222146p:plain]

plt.grid()
plt.hist(age, bins=20, range=(0, 100))
(array([ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0., 12., 77.,  0.,  0.,
         0.,  0.,  0.,  0.,  0.,  0.,  0.]),
 array([  0.,   5.,  10.,  15.,  20.,  25.,  30.,  35.,  40.,  45.,  50.,
         55.,  60.,  65.,  70.,  75.,  80.,  85.,  90.,  95., 100.]),
 <a list of 20 Patch objects>)

f:id:sekihan_0290:20200117222143p:plain