🐍

標準偏差ってなんやねん

に公開

自己紹介

どもども、フリーランスエンジニアとして働いている井上弥風(いのうえみふう)です。

最近魚の飼育に凝ってまして、最初はネオンテトラを15匹だけ購入したつもりが、なぜか今55匹になってる今日この頃です。

もうハマりにハマっちゃって水槽の水でミニトマト育て始めちゃってる(クソ情報失礼しました)

はじめに

私について

私は元々バックエンド・インフラメインで仕事をしていて、AI周りの学習は2025年の2月に始めました。

とりあえずG検定・AWS AIF周りの試験勉強をして、何となく全体像を知った後、実際にXGBoostという決定木ベースのモデルで開発を始めました。

今もこのモデルで開発をしていて、あわよくば収益化を目指している(マジで可能性あると思っている領域なのでおもろい)のですが、やっぱり我流で進めているので色々と壁にぶつかってる、、、って状況です。

この記事を書いた背景

モデルを利用した開発でぶつかった内容を言語化することで知識をより定着させたいと思い、今回ぶつかったのが「標準偏差」だったので、そのまま記事にしました。

この記事で記載すること・しないこと

  • 記載する内容
    • 平方和・分散・標準偏差の基礎知識について
    • Pythonを利用した標準出力の確認方法について
  • 記載しない内容
    • AIに関する基礎的な知識
    • 統計学に関する基礎的な知識

対象読者

  • 標準偏差の基礎的な部分を理解したい方

前提知識の整理

ではさっそく標準偏差を見ていきたいところなのですが、しっかりと標準偏差を理解するために、その利用目的と、前提となる「平方和」と「分散」という概念について整理していきます。

概要:標準偏差って何者?

標準偏差は、統計学の指標のひとつで、データがどれだけ散らばっているかを数値で表すものです。

具体的言うと、各データが平均値からどれほどズレているか、またはデータが平均値の周りにどの程度集中しているかを把握するために使わます。

例えば、テストの点数が全体的に平均近くに集まっていれば標準偏差は小さく、点数のばらつきが大きければ標準偏差は大きくなります。

標準偏差が小さい場合

標準偏差が大きい場合

いきなり「標準偏差はデータの散らばり具合を数値化したもの」と言われても「???」かと思いますが、段階を踏んでいくと理解できるようになるので、何となく「散らばりを表すもの = 標準偏差」というイメージだけ持っておきましょー(散らばりとは何ぞやも詳しく説明していきます)

標準偏差の前に「平方和」と「分散」?

少し遠回りに感じるかもしれませんが、標準偏差を理解するには、まず「平方和」と「分散」の概念を押さえる必要があります。

数学的な単語がたくさん登場すると頭の中「???」になりがちですが、数学大嫌いな僕でも理解出来たので一緒に見ていきましょう^^

という訳で、以下の順番で記事を進めていきます!

  1. 平方和
  2. 分散
  3. 標準偏差

レッツゴー!

平方和とは何なのか?

標準偏差がLv.3の概念だとすると、平方和はLv.1の概念です。
まずは平方和を理解していきましょう。

こんなシーンがあるとする

例を出した方が理解が捗るので、ここでは車販売の例を出して平方和を理解していきます。

例えば、ある車販売会社は、「営業1課」と「営業2課」の2つの課があり、各課に5人ずつ、合計10人の営業担当がいます。各担当の車の販売台数は以下の通りです。

営業1課

営業さん 販売台数
Aさん 4台
Bさん 0台
Cさん 1台
Dさん 3台
Eさん 2台

営業2課

営業さん 販売台数
Fさん 2台
Gさん 3台
Hさん 2台
Iさん 2台
Jさん 1台

ではここで、営業部長に1課と2課の販売成績を報告しなければいけないことになりました。
1課の販売成績の平均は以下ですね

\frac{4 + 0 + 1 + 3 + 2}{5} = 2

2課の成績は以下になります

\frac{2 + 3 + 2 + 2 + 1}{5} = 2

平均だけを見ると、両課とも「2台」という同じ成績に見えますが、このままでは以下のような問題が発生するかもしれません

  • 個々の実績が見えにくい
    • 1課のAさんは4台売っているにもかかわらず、平均値「2台」で評価され、個々の頑張りが反映されない
      • 「俺もう会社辞める!!」状態になるかもしれない...omg
  • 改善点が不明瞭
    • 成績不振のBさん販売台数は0台だが、全体の平均に隠れてしまい、もしかすると改善できるかもしれないのにそれが見えない

これを解決するのが、平方和です。

平方和の目的

平方和の目的は「データの散らばり具合を数値化するもの」です。

平均では表現できないものを平方和では表現できるわけです。

いきなり言われても「データの散らばりを数値化??」って感じなので、とりあえず実際にやってみましょう。

平方和の求め方と利用シーン

まず、平方和の求め方が以下です(数式アレルギーの方(ワイもその一人)、意外とやってることは簡単なのでご安心を!)

(個々のデータ - 平均)^2を足し合わせたもの

ここでは、先ほど紹介した例の1課と2課の平均がどちらも「2」であったことを利用して、平方和を求めてみます。

では、1課の平方和を求めていきましょう。

(4 - 2)^2 + (0 - 2)^2 + (1 - 2)^2 + (3 - 2)^2 + (2 - 2)^2\\ =4+4+1+1+0\\ =10

次に、2課の平方和を求めていきましょう。

(2 - 2)^2 + (3 - 2)^2 + (2 - 2)^2 + (2 - 2)^2 + (1 - 2)^2\\ =0+1+0+0+1\\ =2

各課の平方和を整理すると、以下のようになります。

  • 1課の平方和
    • 10
  • 2課の平方和
    • 2

話を遡ると、もともと営業部長には「各課の平均売上台数」しか報告できていなかったため、個々の実績の違いが分かりませんでしたね。

しかし、平方和を計算することで、

  • 1課では:ばらつきが大きく(平方和が10)、個々の実績に大きな差があることが見て取れる
  • 2課では:ばらつきが小さく(平方和が2)、全員がほぼ同じ成果を上げていることが見て取れる

平均値ではなく平方和が分かることで、以下のような対策が取れるかもしれませんね

  • ばらつきが大きい場合
    • 上手くいっている人といない人の違いを把握し、個別の指導や報酬見直しにつなげられたり
  • ばらつきが小さい場合
    • 全体の成果を均一に評価するなど、チーム全体のアプローチを考えることができたりなどなど

分散とは何なのか?

続いて、分散について説明します。

分散は、簡単に言うと「平方和をデータの数で割った値」です。
これもいきなり言われても分かりにくいかと思うので、実際に見ていきましょう。

平方和の限界

平方和は、各データが平均からどれだけ離れているかを二乗して合計したものですね。
そのため、データの個数が多いほど、結果の値は大きくなってしまいます。

下記はその例で、1課の人数は同じ、2課の人数を100人にした場合です。
1課

営業さん 販売台数
Aさん 4台
Bさん 0台
Cさん 1台
Dさん 3台
Eさん 2台

2課

営業さん 販売台数
Fさん 1台
Gさん 2台
Hさん 1台
Iさん 2台
Jさん 1台
Kさん 2台
...

まず、平方和の式を思い出します

(個々のデータ - 平均)^2を足し合わせたもの

では、実際に2課の平方和を求めてみましょう。
2課は合計100人、販売台数は1台販売した人が50人・2台販売した人が50人として、平均は1.5台とします。

(1 - 1.5)^2 + (2 - 1.5)^2 + ...繰り返し... + (2 - 1.5)^2\\ =0.25+0.25+...繰り返し...+0.25\\ =25

2課の平方和は25になりました。

ここで注目すべきは、1課は個々のデータのばらつきが大きいのに平方和は10ですが、2課はデータ自体のばらつきは小さいのに(1台と2台しかなく、偏差は0.5)、データ数が多いため平方和が25となってしまっている点です。

つまり、データの個数が多くなるほど値が大きくなる平方和は、比較対象のデータの個数がずれている場合、単純比較ができないんですね。

これを解決するのが分散です。

実際に分散を求めてみる

ではでは、実際に分散を求めてみましょう。
繰り返しになりますが、分散は「平方和をデータの数で割った値」です。

1課

営業さん 販売台数
Aさん 4台
Bさん 0台
Cさん 1台
Dさん 3台
Eさん 2台

2課

営業さん 販売台数
Fさん 1台
Gさん 2台
Hさん 1台
Iさん 2台
Jさん 1台
Kさん 2台
...

上記の平方和は以下ですね

  • 1課の平方和
    • 10
    • 1課のデータの個数: 5
  • 2課の平方和
    • 25
    • 2課のデータの個数: 100

1課の分散

\frac{10}{5} = 2

2課の分散

\frac{25}{100} = 0.25

整理すると、以下になります。

  • 1課の分散
    • 2
  • 2課の分散
    • 0.25

分散の重要性

ここでのポイントは、平方和ではデータの個数が違う物どうしては比較できなかった値も、分散、つまり平方和をデータの個数で割ることで、比較が出来るようになった点ですね。

整理すると、分散を計算することで、データの個数に左右されず、各課の「平均からの個々のズレ」を公平に比較できるようになりました。

これが分散です!

標準偏差とは何なのか?

続いて、標準偏差について解説します。
ここまでで分散を求め、データのばらつきを評価する方法が分かったと思います、、、が分散には以下のような限界があるわけです。

分散の限界

分散は平方和をデータ数で割って求めるため、データ数の違いに関係なくばらつきを比較できるという利点がありました。

ただ、分散は「データの単位の二乗」という単位になってしまうわけです。
具体的には、分散そのものではなく分散が計算する平方和が数式の中で二乗を利用して値を求めているため、分散の単位も二乗になってしまう訳ですね。

例えば、身長のデータ(単位:cm)の分散は平方センチメートル(cm²)となるため、直感的な理解が難しくなります。

といっても値が二乗になることの何が問題なのかがいまいち分かりずらいと思うので、実際に見ていきましょう^^

170 ~ 190cmの男が10人いたとしたら?

まず、下記の身長を持つ男が10人いると想定します。

  • 170cm
    • 3人
  • 180cm
    • 5人
  • 190cm
    • 2人

平均身長は179です。

分散を計算すると、結果は49cm²になります。
でもなんか変ですよね。平方和・分散・標準偏差は「データの散らばり具合を数値化するもの」なのに、「分散 = 49cm²」となると、10人の身長は49cm²分だけ散らばっている。。。??49???そもそもなんでcm²???って感じですよね

そもそも単位がcm²(平方センチメートル)になってしまうため、身長という「縦の長さ」の散らばりを知りたいのに、面積の単位になってしまいます。
これは、平方和の計算で各データの偏差を二乗しているためです。

標準偏差は分散の何を解決する?

意外と簡単で、標準偏差は分散の平方根を取ることで求められます。
数学が苦手な人(俺もだぜ☆)にもわかりやすく言えば、「標準偏差は分散で二乗されて見にくくなった値を、元の単位に戻して見やすくする」指標って訳です。

では実際に49cm²を元の単位に戻してみます。

\sqrt{49cm^2} = 7cm

となります。

つまり、元々は「散らばり具合」が49cm²と表されていたものが、標準偏差を用いることで「平均値から約7cmの範囲で多くのデータが存在している」と直感的に理解できるようになるのです。

これが標準偏差です。

「実際に何cm位の範囲でデータが散らばっているのか」が分かるのが標準偏差って訳ですね!

実践編:Pythonで標準偏差を出力してみる

では、実際にPythonでデータセットを取得して、標準偏差をログに出してみましょー
(カラム名が大文字英語で分かりずらいため日本語に変換しています)

利用するデータセットについて

今回利用するのは「住宅価格」に関するデータセットです。
具体的には、ボストン近郊の住宅情報と価格に関するデータです。

※ちなみに、この「住宅価格データセット」はカリフォルニア大学アーバイン校が無償で提供してくれているデータセットです。

データセットの内容

データセットの内容は以下です。

変数名 詳細
CRIM 人口1人あたりの犯罪発生率
ZN 25000平方フィートを超える住居エリアの割合
INDUS 小売以外の商業用地が占める面積の割合
CHAS チャールズ川沿い地域の有無を示すダミー変数(1: 該当、0: 非該当)
NOX 大気中のNOx濃度
RM 1940年以前に建てられた建物の割合
DIS 主要な5つの雇用施設までの距離
PAD 環状高速道路へのアクセスのしやすさ
TAX 1万ドルあたりの不動産税率の総額
PTRATIO 各町における児童と教師の比率
B 町毎の黒人比率を1000(Bk-0.63)^2で算出
LSTAT 低所得層に従事する住民の割合
MEDV 所有者が占有する住宅の中央値(単位: $1000)

また、実際に下記URLでブラウザからでもアクセスできます。
https://archive.ics.uci.edu/ml/machine-learning-databases/housing/housing.data

↓こんな感じ

標準偏差の出力

ここでは、Pythonを使って「住宅価格中央値」の標準偏差を計算・出力する方法を紹介します。
前提知識として必要なので、まずは「住宅価格中央値」が何を意味するのか軽く説明していきます。

今回利用している「住宅価格データセット」は、ボストン近郊の506地区における治安や生活環境、また住宅価格の中央値(=その地区で実際に取引される住宅の平均的な価格)をまとめたものです。

その上で、実際にデータセットの上五行を出力してみると、以下のような実行結果が出力されます。

犯罪率  大規模住宅地率  非小売業率  チャールズ川ダミー  窒素酸化物濃度    部屋数   築年数      距離  幹線道路アクセス  固定資産税率  生徒教師比  黒人比率指数  低所得者率  住宅価格中央値
0  0.00632     18.0   2.31          0    0.538  6.575  65.2  4.0900         1   296.0   15.3  396.90   4.98     24.0
1  0.02731      0.0   7.07          0    0.469  6.421  78.9  4.9671         2   242.0   17.8  396.90   9.14     21.6
2  0.02729      0.0   7.07          0    0.469  7.185  61.1  4.9671         2   242.0   17.8  392.83   4.03     34.7
3  0.03237      0.0   2.18          0    0.458  6.998  45.8  6.0622         3   222.0   18.7  394.63   2.94     33.4
4  0.06905      0.0   2.18          0    0.458  7.147  54.2  6.0622         3   222.0   18.7  396.90   5.33     36.2

※フォーマットは若干崩れていますが、注目して欲しいのが「住宅価格中央値」の値です(一番右)

実際に標準偏差を計算するためには、以下のようにDataFrameのdescribe()メソッドを使います。
たとえば、df["住宅価格中央値"].describe()を実行すると、平均値、標準偏差、最小値、最大値などの統計量が出力されます。

# ライブラリのインポート
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

plt.rcParams["font.family"] = "Meiryo"

# データセットの読み込み
df = pd.read_csv(
    "https://archive.ics.uci.edu/ml/machine-learning-databases/housing/housing.data",
    header=None,
    sep="\\s+",
)

df.columns = [
    "犯罪率",  # CRIM: 町ごとの犯罪発生率
    "大規模住宅地率",  # ZN: 25,000平方フィート以上の住宅地の割合
    "非小売業率",  # INDUS: 非小売業が占める土地の割合
    "チャールズ川ダミー",  # CHAS: チャールズ川沿いなら1、そうでなければ0
    "窒素酸化物濃度",  # NOX: 窒素酸化物濃度(10ppmあたり)
    "部屋数",  # RM: 住宅あたりの平均部屋数
    "築年数",  # AGE: 1940年以前に建てられた持ち家の割合
    "距離",  # DIS: ボストンの雇用センターまでの加重距離
    "幹線道路アクセス",  # RAD: 幹線道路へのアクセスのしやすさ
    "固定資産税率",  # TAX: 1万ドルあたりの固定資産税率
    "生徒教師比",  # PTRATIO: 町ごとの生徒と教師の比率
    "黒人比率指数",  # B: 1000(Bk - 0.63)^2, Bkは町の黒人比率
    "低所得者率",  # LSTAT: 低地位の人口の割合(%)
    "住宅価格中央値",  # MEDV: 持ち家の中央値(1000ドル単位)
]

# データの確認
print(df["住宅価格中央値"].describe())

実行結果が以下です。

count    506.000000
mean      22.532806
std        9.197104
min        5.000000
25%       17.025000
50%       21.200000
75%       25.000000
max       50.000000
Name: 住宅価格中央値, dtype: float64

この結果からわかるのが以下の通りです(詳細は割愛)

  • レコード数(count):データは506件ある
  • 平均値(mean):住宅価格中央値の平均は約22.53(=22,530ドル)
  • 標準偏差(std):標準偏差は約9.20(=9,200ドル)
    • これは、各地区の住宅価格中央値が平均値22.53を中心に、±約9.20の範囲で散らばっているという意味
  • 最小値(min)と最大値(max):住宅価格中央値は最小で5、最大で50
  • などなど...

そんな具合に、df["住宅価格中央値"].describe()を利用すると特定のカラムの詳細が分かるわけですが、標準偏差はstdの9.20ですね。
つまり、このデータセットは22を平均値として、±約9の範囲でデータが散っているという事が分かるわけですね。

最後に:モデル開発において標準偏差はどういったシーンで利用される?

標準偏差は、単にデータの散らばりを表すだけでなく、実際の業務やモデル開発の場面でさまざまな目的に活用されます。

いくつか例を挙げてみます(ここからはChatGPT様に記載してもらい、私がクソコメしてるので良ければ見てください)

投資のリスク評価

例えば、株式市場での投資では、株価の変動(ボラティリティ)を標準偏差で測定します。

  • 標準偏差が大きい場合:株価の変動が激しく、リスクが高いと判断される。
  • 標準偏差が小さい場合:株価は安定しており、リスクが低いと見なされる。

このように、標準偏差を用いることで、投資先のリスクを数値的に評価し、ポートフォリオのリスク管理に役立てることができます。

データの標準化(スケーリング)

機械学習のモデル開発では、各特徴量(変数)のスケールを揃えるためにデータの標準化がよく行われます。

  • 標準化:各データから平均を引き、標準偏差で割ることで、平均0・分散1の正規化されたデータに変換する。
    • これにより、異なる単位やスケールのデータを同じ基準で扱い、学習アルゴリズムの性能を向上させます。

品質管理

製造業やサービス業では、プロセスの安定性や品質管理においても標準偏差が利用されます。

例:製品の寸法や性能が平均値からどの程度ばらついているかを評価し、品質基準を維持するための指標とする。

まとめ

ここまで読んでいただきありがとうございました!
最近モデルを使った個人開発をしているので、気になったらお声掛けください!ご飯でも飯でも飲みでも!!

良かったらTwitterフォローしてねっ!
https://twitter.com/mi_01_24fu

Discussion