【Pythonと統計学】1変量データの統計量

Pythonを使った機械学習に興味があり、基礎となる統計学を勉強しています。このページはその内容をまとめたものです。

書籍「Pythonで学ぶ新しい統計学の教科書」をメインに勉強を勧めています。もしよろしければぜひ手にとってみてください。

1変量データと多変量データ

まず、統計量は大きく2つに分けられます。1つが1変量データ、もう1つが多変量データです。

1変量データとは1つの変数からなるデータのことです。例えば、魚の体長だけをまとめたデータは1変量データです。

多変量データは2つ以上の変数からなるデータのことです。先程の魚の体長に加えて、魚の種類も記録した場合、これは多変量データになります。

つまり、1変量データの集まりが多変量データになることがわかります。(逆も然りで、多変量データを分解すると1変量データになります。)

今回は1変量データの統計量についてまとめます。

今回扱うデータ

ここでは「fish_length」というarrayをもとに統計量を取得します。

中身は「array([2 ,3 ,3 ,4 ,4 ,4 ,4 ,5 ,5 ,6 」)となっています。

サンプルサイズ

含まれているデータの個数です。

len関数を使うと簡単に求めることができます。

n = len(fish_length)
#10

合計値

データをすべて足し合わせた値です。

numpyのsum関数を使います。

pandasの関数も用意されていますが、調べたところarrayに変換してからnumpyの関数で計算したほうが早そうなので、できる限りnumpyの関数を優先して使います。

sum_value = np.sum(fish_length)
#40

標本平均

まず、標本と母集合という用語の紹介をします。母集合はすべてのデータのことを指します。その中から取り出した1部のデータのことを標本データやサンプルデータと呼びます。

この標本データの平均値のことを標本平均と呼びます。

標本平均は次の方法で求まります。

  1. サンプルサイズの取得
  2. サンプルデータの合計値の取得
  3. 合計値をサンプルサイズで割る

関数で求める場合は、numpyのmean関数を使います。

#計算方法
n = len(fish_length)
sum_value = np.sum(fish_length)
x_bar = sum_value/n

#関数で求める
np.mean(fish_length)

標本分散

データのばらつきを表すのが分散。その中でもサンプルデータに対する分散を標準分散という。

$ u^2 = \frac{1}{n}\sum_{i=1}^{n}(x_i-\bar{x})^2 $

次の方法で求まります。

  1. サンプルデータから標本平均を引く
  2. サンプルデータから標本平均を引いた値を2乗うする
  3. 2乗した値をサンプルサイズで割る

関数で求める場合はnumpyのvar関数を使います。

var関数は引数ddofで標本分散と不偏分散に分けることができる。
ddof=0で標本分散、ddof=1で不偏分散を出力する。

計算方法
s2 = np.sum((fish_length-x_bar)**2)/n

#関数で求める
np.var(fish_length,ddof=1)

不偏分散

サンプルデータから母集合の分散を求める

標準分散はサンプルデータで割るのに対して不偏分散は(サンプルデータ - 1)で割る。

$ u^2 = \frac{1}{n-1}\sum_{i=1}^{n}(x_i-\bar{x})^2 $

関数ではnumpyのvar関数で、ddof=1とすることで求められる。

#計算
u2 = np.sum((fish_length-x_bar)**2)/(n-1)

#関数
np.var(fish_length, ddof=1)

標準偏差

分散の平方根をとったもの。分散は単位も2乗されてしまうため、扱いにくいので平方根をとった分散を用いる。

標本分散をつかう標本標準偏差と、不偏分散を使う不偏標準偏差がある。

計算は上記の分散の平方根を取るだけなので割愛します。

関数は2通りの出し方があり、1つが分散を求めてnumpyのsqrt関数に入れる方法です。

もう1つがarrayをnumpyのstd関数に入れる方法です。ddof=0で標本標準偏差、ddof=1で不偏標準偏差を得られます。

#計算
s = np.sqrt(s2) #標本分散の平方根
u = np.sqrt(u2) #不偏分散の平方根

#関数
s = np.std(fish_length, ddof=0) #標本分散の平方根
u = np.std(fish_length, ddof=1) #不偏分散の平方根

変動係数

変動係数は標準偏差を平均値で割った値のことで、異なる2つのデータ同士を比較する際などに役立ちます。

詳しくは統計学の時間がわかりやすかったのでぜひ御覧ください。

注意点としては分母が0の場合は使えないことと、対象のデータが比例尺であることが前提であることです。

関数で求める場合はscipy(サイパイ)というライブラリのstatsのvariation関数を使うことで計算できます。こちらもddof=0で標本標準偏差、ddof=1で不偏標準偏差を得られます。

最小値・最大値・中央値・四分位点・最頻値

有名な統計量なのでご存じの方が多いと思いますので、詳細は割愛します。

関数を使ったそれぞれの求め方が下のとおりです。

  • 最小値:numpyのamin関数
  • 最大値:numpyのamax関数
  • 中央値:numpyのmedian関数
  • 四分位点:numpyのquantile関数、引数qに区切る場所を追加する。(第1四分位点ならq=0.25)
  • 最頻値:statsのmode関数、modeの配列が最頻値、countの配列が最頻値のサンプルサイズ
#最小値
np.amin(fish_length)
#最大値
np.amax(fish_length)
#中央値
np.median(fish_length)
#四分位点
np.quantile(fish_length, q=0.25) #第1四分位点
np.quantile(fish_length, q=0.75) #第3四分位点
#最頻値
stats.mode(fish_length)

標準化

標準化はデータの変換方法の一つです。

標準化することで異なる項目のデータを比較することができるようになります。

標準化したあとのデータは、平均値が0、分散が1になります。

こちらも統計学の時間がわかりやすかったのでぜひご覧ください。

求め方はデータから平均値を引き、標準偏差で割ります。

数式にすると$Z_i = \frac{x_i-\bar{x}}{S}$となります。

関数で求める場合は、statsのzscore関数を使います。こちらも引数にddofを設定することで標準偏差に標本標準偏差を使うか不偏標準偏差を使うかを決めることができます。

#計算
n = len(fish_length)
x_bar = np.mean(fish_length) / n
s = np.std(fish_length, ddof=0)
zi = (fish_length - x_bar) / s

#関数
zi = stats.zscore(fish_length, ddof=0)

関数まとめ

  • サンプルサイズ:len()
  • 合計値:np.sum()
  • 標本平均:np.mean()
  • 標本分散:np.var( ,ddof=0)
  • 不偏分散:np.var( ,ddof=1)
  • 標準偏差:np.std( ,ddof=0or1)
  • 変動係数:stats.variation( ,ddof=0or1)
  • 最小値:np.amin()
  • 最大値:np.amax()
  • 中央値:np.median()
  • 四分位点:np.quantile( ,q=任意)
  • 最頻値:stats.mode()
  • 標準化:stats.zscore(,ddof=0or1)

Twitterでフォローしよう

おすすめの記事