アルゴリズム

[Python] ワイブル分布を計算してプロットを作成する方法

ワイブル分布は、信頼性工学や生存分析でよく使われる確率分布です。

Pythonでは、scipy.statsモジュールを使ってワイブル分布を計算できます。

weibull_minクラスを使用し、形状パラメータkやスケールパラメータλを指定して分布を生成します。

プロットにはmatplotlibを使用します。

まず、weibull_min.rvsで乱数を生成し、weibull_min.pdfで確率密度関数を計算します。

次に、matplotlib.pyplot.plotでプロットを作成します。

ワイブル分布とは

ワイブル分布は、信頼性工学や生存分析などの分野で広く使用される確率分布の一つです。

この分布は、特に故障時間や寿命データのモデリングに適しており、データの特性に応じて形状を変えることができます。

ワイブル分布は、形状パラメータと尺度パラメータの2つのパラメータによって定義され、これによりデータの分布の形を調整できます。

具体的には、形状パラメータが1より大きい場合、故障率が時間とともに増加し、1より小さい場合は減少します。

この特性により、ワイブル分布は多様な実データに適合する柔軟性を持っています。

Pythonでワイブル分布を扱うための準備

必要なライブラリのインストール

ワイブル分布を扱うためには、主に以下の2つのライブラリが必要です。

これらは、Pythonのパッケージ管理システムであるpipを使用してインストールできます。

ライブラリ名用途
scipy確率分布や統計的計算を行うためのライブラリ
matplotlibデータの可視化を行うためのライブラリ

以下のコマンドを実行して、必要なライブラリをインストールします。

pip install scipy matplotlib

scipy.statsモジュールの概要

scipy.statsは、SciPyライブラリの一部であり、さまざまな確率分布や統計的関数を提供しています。

このモジュールを使用することで、ワイブル分布を含む多くの分布の確率密度関数(PDF)、累積分布関数(CDF)、乱数生成などを簡単に行うことができます。

特に、weibull_minクラスを使用することで、ワイブル分布の計算が容易になります。

matplotlibの概要

matplotlibは、Pythonでデータを可視化するための強力なライブラリです。

特に、2Dグラフの作成に優れており、さまざまな種類のプロットを簡単に作成できます。

ワイブル分布の確率密度関数や累積分布関数を視覚的に表現するために、matplotlibを使用してグラフを描画することが一般的です。

これにより、データの特性を直感的に理解することができます。

ワイブル分布の計算方法

weibull_minクラスの使い方

scipy.statsモジュールのweibull_minクラスを使用することで、ワイブル分布の計算が可能です。

このクラスは、ワイブル分布の確率密度関数(PDF)や累積分布関数(CDF)を計算するためのメソッドを提供しています。

パラメータの設定方法

ワイブル分布は、以下の2つのパラメータで定義されます。

  • 形状パラメータ(c): 分布の形を決定します。

1より大きい場合は故障率が増加し、1より小さい場合は減少します。

  • 尺度パラメータ(scale): 分布のスケールを決定します。

以下のように、weibull_minクラスをインスタンス化することで、パラメータを設定できます。

from scipy.stats import weibull_min
# 形状パラメータと尺度パラメータを設定
shape_param = 1.5  # 形状パラメータ
scale_param = 2.0  # 尺度パラメータ
weibull_dist = weibull_min(shape_param, scale=scale_param)

確率密度関数(PDF)の計算

確率密度関数(PDF)は、特定の値における確率の密度を示します。

pdfメソッドを使用して計算できます。

# 特定の値でのPDFを計算
x = 1.0
pdf_value = weibull_dist.pdf(x)
print(f"PDF at x={x}: {pdf_value}")
PDF at x=1.0: 0.37239168821942203

累積分布関数(CDF)の計算

累積分布関数(CDF)は、特定の値以下の確率を示します。

cdfメソッドを使用して計算できます。

# 特定の値でのCDFを計算
cdf_value = weibull_dist.cdf(x)
print(f"CDF at x={x}: {cdf_value}")
CDF at x=1.0: 0.29781149867344037

ワイブル分布の乱数生成

ワイブル分布に従う乱数を生成することも可能です。

これにより、シミュレーションやモデリングに利用できます。

rvsメソッドの使い方

rvsメソッドを使用して、指定した数の乱数を生成します。

# 乱数を生成
num_samples = 1000
random_samples = weibull_dist.rvs(size=num_samples)
print(random_samples[:10])  # 最初の10個の乱数を表示
[2.51114015 0.58601143 2.74615894 1.33237992 0.50589884 1.91222974
 2.93552046 2.92240476 3.63753932 2.23898995]

サンプルデータの生成

生成した乱数を用いて、サンプルデータを作成することができます。

これにより、実データの分析や可視化に役立てることができます。

import matplotlib.pyplot as plt
# ヒストグラムをプロット
plt.hist(random_samples, bins=30, density=True, alpha=0.6, color='g')
# PDFを重ねて表示
x = np.linspace(0, 5, 100)
plt.plot(x, weibull_dist.pdf(x), 'r-', lw=2)
plt.title('Weibull Distribution')
plt.xlabel('Value')
plt.ylabel('Density')
plt.show()

このコードを実行すると、生成した乱数のヒストグラムとワイブル分布のPDFが重ねて表示されます。

これにより、データの分布を視覚的に確認できます。

ワイブル分布のプロット方法

matplotlibを使った基本的なプロット

matplotlibを使用することで、ワイブル分布の確率密度関数(PDF)や累積分布関数(CDF)を簡単にプロットできます。

以下に、基本的なプロット方法を示します。

確率密度関数のプロット

まず、ワイブル分布のPDFをプロットします。

以下のコードでは、weibull_minクラスを使用してPDFを計算し、matplotlibでプロットします。

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import weibull_min
# パラメータの設定
shape_param = 1.5
scale_param = 2.0
weibull_dist = weibull_min(shape_param, scale=scale_param)
# PDFの計算
x = np.linspace(0, 5, 100)
pdf_values = weibull_dist.pdf(x)
# PDFのプロット
plt.plot(x, pdf_values, 'b-', label='PDF')
plt.title('Weibull Distribution - Probability Density Function')
plt.xlabel('Value')
plt.ylabel('Density')
plt.legend()
plt.grid()
plt.show()

このコードを実行すると、ワイブル分布の確率密度関数がプロットされます。

累積分布関数のプロット

次に、ワイブル分布のCDFをプロットします。

以下のコードでは、CDFを計算し、プロットします。

# CDFの計算
cdf_values = weibull_dist.cdf(x)
# CDFのプロット
plt.plot(x, cdf_values, 'r-', label='CDF')
plt.title('Weibull Distribution - Cumulative Distribution Function')
plt.xlabel('Value')
plt.ylabel('Cumulative Probability')
plt.legend()
plt.grid()
plt.show()

このコードを実行すると、ワイブル分布の累積分布関数がプロットされます。

ヒストグラムとワイブル分布の重ね合わせ

生成した乱数のヒストグラムとワイブル分布のPDFを重ねて表示することで、データの分布を視覚的に確認できます。

# 乱数の生成
num_samples = 1000
random_samples = weibull_dist.rvs(size=num_samples)
# ヒストグラムのプロット
plt.hist(random_samples, bins=30, density=True, alpha=0.6, color='g', label='Histogram')
# PDFの重ね合わせ
plt.plot(x, pdf_values, 'b-', lw=2, label='PDF')
plt.title('Histogram and Weibull Distribution')
plt.xlabel('Value')
plt.ylabel('Density')
plt.legend()
plt.grid()
plt.show()

このコードを実行すると、生成した乱数のヒストグラムとワイブル分布のPDFが重ねて表示されます。

グラフのカスタマイズ

グラフをより見やすくするために、さまざまなカスタマイズが可能です。

軸ラベルとタイトルの設定

plt.title()plt.xlabel(), plt.ylabel()を使用して、グラフのタイトルや軸ラベルを設定できます。

plt.title('カスタマイズされたグラフ')
plt.xlabel('値')
plt.ylabel('密度')

凡例の追加

plt.legend()を使用して、プロットに凡例を追加できます。

これにより、異なるプロットを区別しやすくなります。

plt.legend(['PDF', 'CDF'])

カラースキームの変更

プロットの色やスタイルを変更することで、視覚的な印象を変えることができます。

例えば、colorlinestyleを指定することで、異なるスタイルのプロットを作成できます。

plt.plot(x, pdf_values, color='blue', linestyle='--', label='PDF')
plt.plot(x, cdf_values, color='red', linestyle='-', label='CDF')

これらのカスタマイズを組み合わせることで、より魅力的でわかりやすいグラフを作成することができます。

応用例:ワイブル分布のフィッティング

ワイブル分布は、実データの分析において非常に有用です。

ここでは、実データに対してワイブル分布をフィッティングする方法を紹介します。

実データへのワイブル分布のフィッティング

実データにワイブル分布をフィッティングするためには、データの特性を考慮しながら適切なパラメータを推定する必要があります。

以下に、2つの方法を示します。

curve_fitを使ったフィッティング

scipy.optimizeモジュールのcurve_fit関数を使用して、実データにワイブル分布をフィッティングすることができます。

以下のコードでは、サンプルデータに対してフィッティングを行います。

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import weibull_min
from scipy.optimize import curve_fit
# サンプルデータの生成
data = weibull_min.rvs(1.5, scale=2.0, size=1000)
# ワイブル分布のPDF関数
def weibull_pdf(x, c, scale):
    return (c / scale) * (x / scale) ** (c - 1) * np.exp(- (x / scale) ** c)
# フィッティング
params, _ = curve_fit(weibull_pdf, data, np.ones_like(data) / len(data), p0=[1.5, 2.0])
# フィッティング結果の表示
print(f"フィッティングされた形状パラメータ: {params[0]}")
print(f"フィッティングされた尺度パラメータ: {params[1]}")

このコードを実行すると、フィッティングされた形状パラメータと尺度パラメータが表示されます。

weibull_min.fitメソッドの使い方

weibull_minクラスfitメソッドを使用して、データに対してワイブル分布をフィッティングすることもできます。

以下のコードでは、同様のサンプルデータに対してフィッティングを行います。

# フィッティング
shape_param, loc_param, scale_param = weibull_min.fit(data)
# フィッティング結果の表示
print(f"フィッティングされた形状パラメータ: {shape_param}")
print(f"フィッティングされた位置パラメータ: {loc_param}")
print(f"フィッティングされた尺度パラメータ: {scale_param}")

この方法でも、フィッティングされたパラメータを簡単に取得できます。

フィッティング結果の評価

フィッティング結果を評価するためには、パラメータの解釈とグラフでの確認が重要です。

パラメータの解釈

フィッティングされたパラメータは、データの特性を示します。

形状パラメータ(c)は、故障率の変化を示し、尺度パラメータ(scale)はデータのスケールを示します。

これらのパラメータを理解することで、データの挙動をより深く分析できます。

  • 形状パラメータ(c): 1より大きい場合、故障率が時間とともに増加します。

1より小さい場合は減少します。

  • 尺度パラメータ(scale): データのスケールを示し、データの中心的な傾向を表します。

グラフでの確認

フィッティング結果を視覚的に確認するために、フィッティングしたワイブル分布のPDFをプロットします。

# フィッティング結果のPDFを計算
x = np.linspace(0, 5, 100)
fitted_pdf = weibull_min.pdf(x, shape_param, loc=loc_param, scale=scale_param)
# ヒストグラムとフィッティング結果のプロット
plt.hist(data, bins=30, density=True, alpha=0.6, color='g', label='データのヒストグラム')
plt.plot(x, fitted_pdf, 'r-', lw=2, label='フィッティングしたPDF')
plt.title('ワイブル分布のフィッティング結果')
plt.xlabel('値')
plt.ylabel('密度')
plt.legend()
plt.grid()
plt.show()

このコードを実行すると、実データのヒストグラムとフィッティングしたワイブル分布のPDFが重ねて表示され、フィッティングの精度を視覚的に確認できます。

応用例:信頼性工学におけるワイブル分布の利用

ワイブル分布は、信頼性工学において非常に重要な役割を果たします。

特に、製品の寿命や故障率の分析、信頼性評価において広く利用されています。

以下に、具体的な応用例を示します。

製品寿命のモデリング

ワイブル分布は、製品の寿命をモデル化するために使用されます。

製品の寿命データを収集し、ワイブル分布にフィッティングすることで、製品がどの程度の期間使用できるかを予測できます。

形状パラメータ(c)と尺度パラメータ(scale)を用いて、製品の寿命の特性を把握することが可能です。

例えば、ある電子機器の寿命データがある場合、ワイブル分布を用いて以下のようにモデル化できます。

from scipy.stats import weibull_min
# 寿命データの例
lifetimes = [100, 150, 200, 250, 300, 350, 400, 450, 500]
# ワイブル分布のフィッティング
shape_param, loc_param, scale_param = weibull_min.fit(lifetimes)
print(f"形状パラメータ: {shape_param}, 尺度パラメータ: {scale_param}")

このようにして、製品の寿命を定量的に評価することができます。

故障率の計算

ワイブル分布を用いることで、製品の故障率を計算することができます。

故障率は、特定の時間における故障の確率を示し、以下の式で表されます。

故障率=dF(t)dt=cscale(tscale)c1e(tscale)c

ここで、F(t)は累積分布関数(CDF)です。

故障率を計算することで、製品の信頼性を評価し、メンテナンスや交換のタイミングを決定するのに役立ちます。

# 故障率の計算
time = 300  # 時間
failure_rate = (shape_param / scale_param) * (time / scale_param) ** (shape_param - 1) * np.exp(- (time / scale_param) ** shape_param)
print(f"時間 {time} における故障率: {failure_rate}")

ワイブル分布を用いた信頼性評価

ワイブル分布を用いることで、製品の信頼性を評価することができます。

信頼性は、特定の時間内に故障しない確率として定義され、以下の式で表されます。

R(t)=1F(t)=e(tscale)c

ここで、R(t)は信頼性関数です。

この関数を用いることで、製品が特定の時間内に故障しない確率を計算できます。

# 信頼性の計算
reliability = np.exp(- (time / scale_param) ** shape_param)
print(f"時間 {time} における信頼性: {reliability}")

このように、ワイブル分布を用いた信頼性評価は、製品の設計やメンテナンス戦略の策定において非常に重要です。

信頼性工学におけるワイブル分布の利用は、製品の寿命を延ばし、顧客満足度を向上させるための強力な手段となります。

応用例:生存分析におけるワイブル分布の利用

ワイブル分布は、生存分析においても広く利用されます。

生存分析は、特定のイベント(例えば、故障や死亡)が発生するまでの時間を分析する手法です。

以下に、ワイブル分布を用いた生存分析の具体的な応用例を示します。

生存時間データの解析

生存時間データは、特定のイベントが発生するまでの時間を記録したデータです。

ワイブル分布を用いることで、これらのデータをモデル化し、イベントの発生確率を評価することができます。

以下のコードでは、サンプルの生存時間データに対してワイブル分布をフィッティングします。

import numpy as np
from scipy.stats import weibull_min
# サンプルの生存時間データ
survival_times = [5, 10, 15, 20, 25, 30, 35, 40, 45, 50]
# ワイブル分布のフィッティング
shape_param, loc_param, scale_param = weibull_min.fit(survival_times)
print(f"フィッティングされた形状パラメータ: {shape_param}")
print(f"フィッティングされた尺度パラメータ: {scale_param}")

このようにして、生存時間データをワイブル分布にフィッティングすることで、データの特性を把握できます。

ハザード関数の計算

ハザード関数は、特定の時間におけるイベントの発生率を示します。

ワイブル分布を用いたハザード関数は、以下の式で表されます。

h(t)=cscale(tscale)c1

ここで、h(t)はハザード関数、cは形状パラメータ、scaleは尺度パラメータです。

以下のコードでは、特定の時間におけるハザード関数を計算します。

# 特定の時間におけるハザード関数の計算
time = 20  # 時間
hazard_function = (shape_param / scale_param) * (time / scale_param) ** (shape_param - 1)
print(f"時間 {time} におけるハザード関数: {hazard_function}")

生存曲線のプロット

生存曲線は、特定の時間内にイベントが発生しない確率を示します。

ワイブル分布を用いた生存曲線は、以下の式で表されます。

S(t)=e(tscale)c

以下のコードでは、生存曲線をプロットします。

import matplotlib.pyplot as plt
# 時間の範囲を設定
t = np.linspace(0, 50, 100)
survival_curve = np.exp(- (t / scale_param) ** shape_param)
# 生存曲線のプロット
plt.plot(t, survival_curve, label='生存曲線', color='blue')
plt.title('ワイブル分布に基づく生存曲線')
plt.xlabel('時間')
plt.ylabel('生存確率')
plt.grid()
plt.legend()
plt.show()

このコードを実行すると、ワイブル分布に基づく生存曲線がプロットされ、特定の時間における生存確率を視覚的に確認できます。

生存分析におけるワイブル分布の利用は、医療研究や製品の信頼性評価など、さまざまな分野で重要な役割を果たしています。

まとめ

この記事では、ワイブル分布の基本的な概念から、Pythonを用いた計算方法、プロット方法、さらには信頼性工学や生存分析における応用例まで幅広く取り上げました。

ワイブル分布は、特に製品の寿命や故障率の分析において非常に有用であり、実データに対するフィッティングや信頼性評価を行う際に重要な役割を果たします。

これらの知識を活用して、実際のデータ分析やモデリングに挑戦してみてください。

関連記事

Back to top button
目次へ