【統計学・データ分析】Pythonで実装しながら覚える正規分布

こんにちは。今日は、統計学に関する内容です!

最近、統計検定の勉強をしているのですが、その中でいろいろな統計分布の種類があることを知ったは良いものの、違いが直感的によく分からず、実務に活かせる気がしなかったので、実際に絵や式を書いてみながら自分の頭を整理しておきたいと思います。

今回はその中でも正規分布について整理してみたいと思います。

なお、各内容の詳細については、他のWebサイトに分かりやすい説明があれば、そちらを引用させていただき、紹介させていただいております。

それでは早速参ります!

Contents

正規分布の理論

概要

正規分布は連続型確率分布の最も代表的な確率分布になります。

正規分布の概要については、こちらが非常に分かり易かったのでご紹介しておきます。

正規分布とは統計・統計学を理解する上で一番大切な確率分布です。その名前(正規分布 normal distribution)からもわかる通り、”normal”な、「ありふれた」「通常の」確率分布です。名前の所以は、自然界や人間の行動・性質など様々な現象に対して、よく当てはまるところから来ています。

正規分布はガウス分布と呼ばれることもしばしばあります。これは18世紀から19世紀に渡って活躍した数学者C.F.ガウスに由来します。

正規分布の最も基本的な性質としては、以下に挙げるものがあります。
平均値と最頻値と中央値が一致する。
・平均値を中心にして左右対称である。(直線?=μに関して対称)
・?軸が漸近線である。
・分散(標準偏差)が大きくなると、曲線の山は低くなり、左右に広がって平らになる。分散(標準偏差)が小さくなると、山は高くなり、よりとんがった形になる。

上記Webサイトより引用

確率関数(確率密度関数)

$$ f(x) = \frac{1}{\sqrt{2\pi \sigma^2}} \exp \left(-\frac{(x – \mu)^2}{2\sigma^2} \right) \hspace{20px} (-\infty < x < \infty) $$ 上の式より、正規分布の確率関数はパラメータμとσの二乗によって決まることが分かります。 ここで、μは期待値、σの二乗は分散になります。 また、正規分布の中でも特に平均が0、分散が1の正規分布N(0,1)の場合、標準正規分布と呼ばれますが、この場合の確率密度関数は以下のように表現されます。 $$ f(x) = \frac{1}{\sqrt{2\pi}} \exp (-z^2/2) (-1 < x < 1) $$ ここで、$$ z=(x-\mu)/\sigma $$

Pythonによる実装サンプル

Scipyを使って簡単に実装する

幾何分布は、Scipyが提供するメソッドで簡単に再現できてしまいます!

文法については以下から確認できます。

https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.norm.html

以下は、平均0、標準偏差3の正規分布を描いたものです。

from scipy.stats import norm
import numpy as np

## Parameters
l=0     # Mean
s = 3 # Standard Deviation

mean, var, skew, kurt = norm.stats(loc=l,scale=s,moments='mvsk')

#Mean
print("Mean:", mean)

#Var
print("Var:", var)

#Skew
print("Skew:", skew)

#Kurt
print("Kurt:", kurt)

#PDF (Probablity Density Function)
x = np.arange(-s**2-1,s**2+1)

plt.bar(x, norm.pdf(x,loc=l, scale=s), label="PDF")
plt.title("PDF")
plt.xlabel("Data Points")
plt.ylabel("Probablity")
plt.legend()
plt.show()

#CDF (Cumulative Density Function)
plt.bar(x, norm.cdf(x,loc=l, scale=s), label="CDF")
plt.title("CDF")
plt.xlabel("Data Points")
plt.ylabel("Cumulative Probablity")
plt.legend()
plt.show()

一から実装する

上では、Scipyを利用した方法をご紹介しましたが、もちろん最初に解説した理論に基づいて、一から実装することも可能です。

以下にサンプルコードを示します。

こちらでも、上と同じ結果を確認することができました。

import math

def norm(l,s,x):
    result = 1/math.sqrt(2*math.pi*s**2)*math.exp(-(x-l)**2/(2*s**2))
    return result

x =  np.arange(-s**2-1,s**2+1)
y= [norm(0,3,i) for i in x]

plt.bar(x, y, align="center", width=0.8,label="Mean:0, SD: 3")

plt.legend()
plt.show()

確率分布についてもっと勉強するなら・・・

統計検定公式テキストで体系的に理解を深める

確率分布は、統計検定2級の出題範囲となっています。理論的な部分をもっと勉強されたい方は、以下のテキストを読まれると、体系的に学ぶことができます。

私もこちらで勉強しています。統計検定の公式テキストではありますが、比較的に分かりやすく解説されており、何より知識が体系的に整理されているので全体像を掴んで、理論の概要を理解するには良いと思います。

このテキストで分かりづらいと思った部分は、部分毎にネットで詳しく解説された記事を探したり、Udemyなどのオンラインコンテンツを利用していけば十分に理解が深まると思います。

オンライン講座を受講する

オンラインの講座を活用することも有効です。これらの講座は科目毎に単体で販売されているので、購入してすぐに受講を開始することができます。

Udemyは私も資格試験対策などでよく利用するのですが、30日以内の返金保証もあり、また、受講者数が多く口コミ評価が良いコースは内容もとても充実していて満足度が高いため、安心して利用できています。書籍と違ってスマホでみれるため、移動時間などの隙間時間などにも進めることができてオススメです。

頻繁に割引セールを行っているので、割引されているタイミングで購入を検討しても良いと思います。

ちなみに、日本語の統計学のコースは、こちらが最も受講者数が多く、口コミ評価も良いものになります。

【ゼロからおさらい】統計学の基礎

画像に alt 属性が指定されていません。ファイル名: image-9-1024x491.jpg

以上、確率分布について勉強したり実験してみたことをまとめた記事でした。

最後までご覧いただきありがとうございました!

この記事を気に入っていただけたらシェアをお願いします!
ABOUT US
Yuu113
初めまして。ゆうたろうと申します。 兵庫県出身、東京でシステムエンジニアをしております。現在は主にデータ分析、機械学習を活用してビジネスモデリングに取り組んでいます。 日々学んだことや経験したことを整理していきたいと思い、ブログを始めました。旅行、カメラ、IT技術、江戸文化が大好きですので、これらについても記事にしていきたいと思っています。