🎉

確率分布のうち、正規分布についてまとめ(基礎)

2023/06/06に公開

正規分布について学習する

こんにちは!わいわわです!
前回は統計の確率と確率分布のうちの二項分布・一様分布を学習しました。
https://zenn.dev/waiwawaiwai/articles/a0d2df2f2734ee
今回は確率分布の正規分布を学習します!

正規分布

統計学においては分析の結果となるデータをヒストグラムにした場合、
一峰性(山が1つ)になることが大前提となっています。

もし山が1つよりも多い多峰性の場合、「何か他の要素が混在」している状況であり、
おかしな結果を生み出してしまいます。
データをヒストグラムにした時のこの左右対称の山の形になる分布のことを
正規分布と呼びます。

実際に正規分布するデータをヒストグラムに

正規分布するデータをnumpyのrandom.normal()関数で作成してみます。

locでは出力するデータの平均値、
scaleでは出力するデータ全体の標準偏差、
sizeでは出力サイズ(出力するデータの数)
をそれぞれ指定します。

今回は平均値が60、標準偏差が25の正規分布するデータから1000個の値を
ランダムに抽出し、ヒストグラムにしてみます。

import numpy as np
import matplotlib.pyplot as plt

# 平均値
mean = 60
# 標準偏差
sd = 25
# 生成するデータの個数
num_data = 1000
# ヒストグラムのビンの数
num_bins = 50
# 乱数生成の種(シード値)を設定して常に同じ乱数が生成されるようにする
np.random.seed(1)

# 正規分布するデータをNumPyの関数で生成
X = np.random.normal(mean, sd, num_data)

# データの出現回数(度数)を見るためにヒストグラムを描画
plt.hist(X, bins=num_bins)
plt.grid(True)
plt.show()

!出力結果!

・正規分布の特徴
・平均を中心とした一峰性の山形であり、左右対称の分布である
・平均の付近の値が最も現れやすく、平均から離れるほど現れにくい
・身長や体重など現実世界のデータの多くが正規分布で近似できる

・正規分布の性質
・「平均ー標準偏差」から「平均+標準偏差」までの範囲の値が起こる確率が約68%
・「平均ー2標準偏差」から「平均+2標準偏差」までの範囲の値が起こる確率が約95%
・「平均ー3標準偏差」から「平均+3標準偏差」までの範囲の値が起こる確率が約99.7%

以上のような特徴、性質があります。

標準正規分布

全てのデータにおいて、「データの偏差を標準偏差でわる」と
データ全体が平均値0、標準偏差1の標準正規分布になります。
このことをデータの標準化と呼びます。

標準化を行って求めた値は標準化データまたは標準化係数と呼ばれるほか、
「z値」と表記することもあります。このz値は
「平均から標準分布で何個分離れているか」を表していることになります。
z値を参照すれば「データ全体の分布のどこに位置するのか」を知ることができます。

確率密度関数

正規分布におけるデータの出現率は確率密度関数で求めます。
y = ((1 / (np.sqrt(2*np.pi)*sd)) * np.exp(-0.5*((bins - mean)/sd)**2))
確率密度関数はこのソースコードで落とし込むことができます。

正規分布と標準正規分布に関して、
確率密度を求めてそれぞれグラフにしてみます。

・正規分布

# スケールを合わせるためy軸を確率密度にしてヒストグラムを描画
# 3つの戻り値のうち、binsに各ビンの区切り値が配列要素として格納されている
n, bins, patches = plt.hist(X, bins=num_bins, density=True)
# 正規分布の確率密度関数
y = ((1 / (np.sqrt(2*np.pi)*sd)) *
     np.exp(-0.5*((bins - mean)/sd)**2))
# x軸の値を各ビンの区切り値にして確率密度の曲線を描画する
plt.plot(bins, y)
# グリッドを表示
plt.grid(True)
plt.show()

!出力結果!

グラフの曲線はデータが出現する確率を表しているので、曲線x軸のoのラインに挟まれた面積はぴったり「1」になります。
そのため平均から標準偏差1つ分離れた範囲の面積を求めれば、
その範囲に全体の何割のデータが存在するか、つまり確率が分かります。

・標準正規分布
標準正規分布は
y = np.exp(-bins**2 / 2) / np.sqrt(2 * np.pi)
でソースコードに落とし込むことができます。

import numpy as np
import matplotlib.pyplot as plt

# 平均値
mean = 0
# 標準偏差
sd = 1
# データの個数
num_data = 10000
# ヒストグラムのビンの数
num_bins = 50
# 乱数生成の種(シード値)を設定して常に同じ乱数が生成されるようにする
np.random.seed(0)

# 平均値0、標準偏差1の標準正規分布するデータ群からランダムに10000個の値を抽出
X = np.random.normal(mean, sd, num_data)

# スケールを合わせるためy軸を確率密度にしてヒストグラムを描画
# 3つの戻り値のうち、binsに各ビンの区切り値が配列要素として格納されている
n, bins, patches = plt.hist(X, bins=num_bins, density=True)
# 標準正規分布の確率密度関数
y = np.exp(-bins**2 / 2) / np.sqrt(2 * np.pi)

# x軸の値を各ビンの区切り値にして確率密度の曲線を描画する
plt.plot(bins, y)
# グリッドを表示
plt.grid(True)
plt.show()

!出力結果!

データのスケーリング

データ分析や機械学習ではデータの前処理としてスケーリングを行うことがあります。
「特定の手法を用いて、データの分布が一定の範囲に収まるように変換すること」です。
今回の標準化や、正規化という
データの値をデータの範囲で割って0~1のデータに変換する手法を用います。

所感

今回と前回で確率と確率分布を学習しました。
実際の業務でデータの分析を行い、人の役に立ちたいと思う気持ちが強くなりました!
就活とあわせて学習をさらに進めていきます!

Discussion