Python

【Python】標準偏差と分散の計算

投稿日:2019年6月16日 更新日:

目的

以前の記事で四分位偏差によりデータの分散度の計算を行いましたが、四分位偏差ではデータの代表値である四分位数のみを使用しており、データ全体の特性を反映しきれていないという短所があります。

そこで今回はより一般的に分散度の評価に使用される標準偏差について実際のデータを使っての標準偏差をpythonで計算してみたいと思います。

標準偏差

早速ですが、標準偏差の定義式は以下になります。

$$s=\sqrt{\frac{1}{n} \sum_{i=0}^n (\overline{x}-x_i)^2}$$

ここで\(s\)は標準偏差、\(\overline{x}\)はデータの算術平均、\(x_i\)が\(i\)番目のデータ、\(n\)がデータ数になります。

式の解釈としては、データの算術平均とあるデータの差の二乗の値をすのてのデータについて足し合わせ、その平方根をとっています。
わざわざ二乗して平方根をとっているのは足し合わせた際にプラスの値とマイナスの値で打ち消しあってしまわないようにするためです。

式を見るとわかるように、標準偏差は\(i=0~n\)まで全てのデータの情報が式に包含されていることになります。
そのため、四分位偏差に比べ、データ全体の特性を反映できている分散度の評価指標となっています。
これが一般的な分散度として標準偏差が利用される理由の一つでもあります。

Pythonによる標準偏差の計算

これをpythonで計算してみます。

まずは実データの準備です。

今回もkaggleからアボカドのAveragePriceのデータを使わせていただきます。https://www.kaggle.com/neuromusic/avocado-prices

提供元: https://hassavocadoboard.com/

上記データのAveragePriceに対し、標準偏差を計算してみます。

データの先頭5行は以下のような形です。


データの読み込みから標準偏差計算までのコードは次のようになります。

import pandas as pd

#データ読み込み
df = pd.read_csv('C:\\avocado.csv',engine  ='python')

#標準偏差の計算
df['AveragePrice'].std() #0.40267655549555004

上記を見てわかる通り、たった3行というコードで計算することができました。
標準偏差のデメリットとしては四分位偏差に比べて演算が複雑、ということがありますが、pythonのようなライブラリが豊富な言語で実装する場合には全くデメリットを感じません。

分散

データの分散度を測る指標として標準偏差のほかに分散があります。
ただ、分散は単に標準偏差の2乗で定義されます。
標準偏差でなく、分散を求めるメリットとして計算式が単純であることが言えます。

分散の定義式は以下になります。

$$s^2= \frac{1}{n} \sum_{i=0}^n (\overline{x}-x_i)^2 $$

上記の右辺を展開すると次のようになります。

$$\frac{1}{n} \sum_{i=0}^n x_i^2-2\overline{x}\frac{1}{n} \sum_{i=0}^n x_i +\overline{x}^2$$

ここで第二項に現れる\( \frac{1}{n} \sum_{i=0}^n x_i \)は算術平均\(\overline{x}\)を計算する式ですので、第二項は\(-2\overline{x}^2\)に置き換えられます。

つまり、分散の式は以下で表すことができます。

$$s^2= \frac{1}{n} \sum_{i=0}^n x_i^2 -\overline{x}^2$$

各データの二乗平均から算術平均の二乗を引けば分散が算出できることになります。

これをpythonで書くと、以下のようなコードとなります。

#各データの二乗平均を計算
df['AveragePrice'].apply(lambda x:x*x).mean()-df['AveragePrice'].mean()*df['AveragePrice'].mean()

#0.16213952301460144

このように学術的な観点からは式がきれいになることが分散の素晴らしい点ではあります。
が、pythonで実データの計算をする場合はnumpyのvar()メソッドで簡単に計算できるので、実装上はそこまでメリットがあるわけではありません。

#varメソッドによる分散の計算
df['AveragePrice'].var() #0.16214840834576077

当たり前ですが、式をそのまま当てはめ計算しても、varメソッドで計算しても同じ値になることが確認できました。

-Python

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

【Python】BeautifulSoupでtableが最初の数行しか取得できない場合の対処

Contents1 概要2 環境3 発生事象3.0.1 実行結果4 対処法 概要 PythonでWebスクレイピングをするときの定番であるBeautifulsoupですが、tableを取得しようとした …

Pythonの文字列操作

Contents1 目的2 文字列の連結3 文字列の抽出4 文字列の抽出(スライス)5 文字列の繰り返し6 文字数取得7 文字列の分割8 文字列の結合9 文字列の置換 目的 pythonの文字列操作に …

【Python】K-NNによる分類モデル

Contents1 概要2 データ3 ソースコード4 勉強になったこと 概要 機械学習のコードのお勉強のためPythonのscikit-learnのK-NNを使用して分類問題をやってみます。 データ …

no image

CentOSへのAnacondaのインストール

Contents1 目的2 環境3 Anacondaとは?4 pyenvのインストール5 Anaconda3のインストール 目的 pythonでデータ分析できる環境を作りたい。そのため、必要なパッケー …

VSCodeから外部のJupyterへ接続する

Contents1 目的2 環境3 Step1 : Jupyterのconfig設定4 Step2 : VSCodeからの接続5 Step3 : Jupyterを使用して確認6 まとめ 目的 自端末の …

言語切り替え

カテゴリー