Pythonで学ぶ!正規分布の理解と活用法7選

Pythonと正規分布を用いたグラフの例Python
この記事は約8分で読めます。

 

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

Pythonと正規分布の組み合わせは、データ分析や機械学習の世界で頻繁に使われます。

これらを理解し、適切に活用することで、大量のデータを読み解き、有用な情報を引き出す力が身につきます。

本記事では、Pythonを使って正規分布の理解を深め、活用法を7つのトピックで学んでいきましょう。

●正規分布とは

正規分布は統計学でよく用いられる確率分布の一つで、自然現象や社会現象のデータ分析に広く使われます。

○正規分布の概念

正規分布は、その形状が鐘形で左右対称であることからガウス分布とも呼ばれます。

その特徴は平均値を中心にして、その両側にデータが集まる形状を示すことです。

○正規分布の特性

正規分布は、平均値、中央値、最頻値がすべて一致し、平均値を中心に左右対称の分布を持つという特性があります。

これらの特性は、データ分析における予測や推測に利用されます。

●Pythonと正規分布

Pythonは、科学計算やデータ分析に便利なライブラリを多数備えています。

その中でも「NumPy」や「matplotlib」は、正規分布の理解にとても役立つツールです。

○Pythonにおける正規分布の扱い方

Pythonで正規分布を扱う基本は、NumPyのrandom.normal関数を使用することです。

また、正規分布の描画にはmatplotlibのpyplotを使用します。

●正規分布の描画

正規分布の描画はデータ分析の基礎です。

Pythonではいくつかの方法でこれを行うことができます。

○サンプルコード1:正規分布の基本的な描画

まずは、Pythonで正規分布を基本的に描画する方法から見ていきましょう。

このコードでは、NumPyとmatplotlibを使って、標準正規分布(平均0、標準偏差1)のグラフを描きます。

import numpy as np
import matplotlib.pyplot as plt

# 正規分布のデータを生成
data = np.random.normal(0, 1, 1000)

# ヒストグラムを描画
plt.hist(data, bins=30)
plt.show()

このコードでは、最初にnumpyとmatplotlib.pyplotをインポートしています。

その後、numpyのrandom.normal関数を用いて、平均0、標準偏差1の正規分布に従うランダムな1000個の数値を生成しています。

最後に、matplotlibのhist関数でヒストグラムを描画し、show関数で画面に表示しています。

このコードを実行すると、標準正規分布に基づくヒストグラムが描画されます。

それは平均値を中心にした鐘型のグラフとなり、正規分布の特性を直感的に理解するのに役立ちます。

○サンプルコード2:正規分布のパラメータ調整

次に、正規分布の平均と標準偏差を調整してみましょう。

これにより、正規分布の形状がパラメータによってどのように変化するかを視覚的に理解することができます。

# 平均50、標準偏差10の正規分布のデータを生成
data = np.random.normal(50, 10, 1000)

# ヒストグラムを描画
plt.hist(data, bins=30)
plt.show()

このコードでは、平均が50、標準偏差が10の正規分布データを生成し、そのヒストグラムを描画しています。

このコードを実行すると、平均値を中心にした正規分布のヒストグラムが表示され、平均値や標準偏差が分布形状にどのように影響するかを視覚的に把握することができます。

○サンプルコード3:複数の正規分布の描画

また、複数の正規分布を一つのグラフに描画することも可能です。

これは、異なるデータセットの比較に利用できます。

# 平均50、標準偏差10の正規分布のデータを生成
data1 = np.random.normal(50, 10, 1000)

# 平均100、標準偏差15の正規分布のデータを生成
data2 = np.random.normal(100, 15, 1000)

# ヒストグラムを描画
plt.hist(data1, bins=30, alpha=0.5, label='N(50,100)')
plt.hist(data2, bins=30, alpha=0.5, label='N(100,225)')
plt.legend()
plt.show()

このコードでは、異なるパラメータの正規分布データを2つ生成し、そのヒストグラムを重ねて描画しています。

alphaパラメータで透明度を設定し、labelパラメータで各データのラベルを指定しています。最後にlegend関数で凡例を表示します。

このコードを実行すると、2つの正規分布が一つのグラフに描画され、それぞれの分布の違いを直接比較することができます。

●正規分布の応用例

それでは次に、正規分布をどのように応用するか見ていきましょう。

○サンプルコード4:データの正規化

データ分析を行う際、データのスケールが異なると分析結果が偏ることがあります。

そのため、データの正規化(スケーリング)は重要な前処理となります。

正規化の一例として標準化(Zスコア正規化)を行うコードを表します。

# 平均100、標準偏差15の正規分布のデータを生成
data = np.random.normal(100, 15, 1000)

# データの正規化
normalized_data = (data - np.mean(data)) / np.std(data)

# ヒストグラムを描画
plt.hist(normalized_data, bins=30)
plt.show()

このコードでは、正規分布データを生成した後、データから平均値を引き、標準偏差で割ることでデータを正規化しています。

この結果、得られたデータは平均が0、標準偏差が1の分布となります。

○サンプルコード5:乱数生成

正規分布は、乱数生成にも使われます。

正規分布に従う乱数を生成する例を紹介します。

# 平均50、標準偏差10の正規分布の乱数を生成
random_data = np.random.normal(50, 10, 1000)

# 生成した乱数を表示
print(random_data)

このコードは、平均50、標準偏差10の正規分布に従う乱数を1000個生成して表示します。

このような乱数生成は、シミュレーションやデータのモックアップ作成に活用できます。

○サンプルコード6:確率密度関数と累積分布関数

正規分布における確率密度関数と累積分布関数も、Pythonで簡単に描画することができます。

from scipy.stats import norm

# 平均50、標準偏差10の正規分布を定義
rv = norm(loc=50, scale=10)

# 確率密度関数を描画
x = np.linspace(20, 80, 100)
plt.plot(x, rv.pdf(x), label='pdf')

# 累積分布関数を描画
plt.plot(x, rv.cdf(x), label='cdf')

plt.legend()
plt.show()

このコードでは、scipy.statsのnormクラスを使って、平均50、標準偏差10の正規分布を定義しています。

その上で、linspace関数で生成した一連の値xに対して、確率密度関数(pdfメソッド)と累積分布関数(cdfメソッド)を計算し、それぞれをグラフに描画しています。

このコードを実行すると、確率密度関数と累積分布関数のグラフが描画されます。

それにより、確率密度関数がデータの分布を、累積分布関数がそのデータまでの累積確率を表すことを理解することができます。

○サンプルコード7:zスコアの計算

正規分布の知識を利用して、特定のデータが全体のどの位置にあるのかを評価するzスコアを計算することもできます。

# データの定義
data = np.random.normal(50, 10, 1000)

# 特定のデータ
value = 70

# zスコアの計算
z_score = (value - np.mean(data)) / np.std(data)

# zスコアを表示
print(z_score)

このコードでは、70という値のzスコアを計算して表示しています。

zスコアは、データが平均から何標準偏差離れているかを表す値で、正規分布下でのデータの位置を定量的に評価するのに使用されます。

●注意点と対処法

正規分布は便利なツールですが、適用するにあたって注意すべき点もあります。

○正規分布の仮定

多くの統計的手法は、データが正規分布に従うという仮定の下で行われます。

しかし、実際のデータがこの仮定を満たさない場合も多く、そのまま手法を適用すると誤った結果を導く可能性があります。

そのため、手法を適用する前にデータの分布を確認し、必要に応じて正規分布への変換や、正規分布を仮定しない手法の使用を考慮する必要があります。

○データの確認と前処理

データが正規分布に従っているかどうかを確認する一つの方法は、ヒストグラムを描くことです。また、QQプロットという方法もあります。

これは、データの分位数と正規分布の分位数を比較することで、データが正規分布に従っているかを視覚的に判断する方法です。

また、データが正規分布に従わない場合、対数変換やBox-Cox変換などの方法を用いて正規分布に近づけることが可能です。

ただし、これらの変換はデータの性質によっては適用できない場合もあるため、適切な前処理手法を選択する必要があります。

まとめ

以上、Pythonを使った正規分布の理解と活用法について7つのトピックでご紹介しました。

正規分布は、自然界や社会現象を表す多くのデータに適用可能なため、これを理解し活用することでデータ分析の幅が広がります。

Pythonの豊富なライブラリを利用すれば、正規分布を用いた様々な処理を簡単に実装できます。

これらの知識とスキルが、あなたのデータ分析に役立つことを願っています。