非線形方程式 scipy

非線形方程式

Scipyを使用して、非線形方程式を解く問題を考えてみましょう。

具体的には、以下の非線形方程式を解くことを目指します。

$ x^2 + y^2 = 25 $
$ x^2 - y = 7 $

この方程式を解くために、Scipyのfsolve()関数を使用します。

以下のコードをご参考ください。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import fsolve

def equations(vars):
x, y = vars
eq1 = x**2 + y**2 - 25
eq2 = x**2 - y - 7
return [eq1, eq2]

# 初期値を設定します
initial_guess = [0, 0]

# 方程式を解きます
solution = fsolve(equations, initial_guess)
print("Solution: x =", solution[0], ", y =", solution[1])

x_solution, y_solution = solution[0], solution[1]

# グラフの範囲を設定します
x = np.linspace(-10, 10, 400)
y = np.linspace(-10, 10, 400)

# グリッドを作成します
X, Y = np.meshgrid(x, y)

# 方程式を計算します
Z1 = X**2 + Y**2 - 25
Z2 = X**2 - Y - 7

# グラフを作成します
fig, ax = plt.subplots()
ax.contour(X, Y, Z1, levels=[0], colors='r', label='x^2 + y^2 = 25')
ax.contour(X, Y, Z2, levels=[0], colors='b', label='x^2 - y = 7')
ax.plot(x_solution, y_solution, 'go', label='Solution')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.legend()
plt.grid(True)
plt.show()

このコードでは、fsolve()関数を使用して非線形方程式の解を求め、解をx_solutiony_solutionに格納します。

次に、グラフの範囲を設定し、np.meshgrid()関数を使用してグリッドを作成します。

方程式を計算し、contour()関数を使用して等高線プロットを作成します。

また、解をplot()関数を使用してプロットし、グラフに表示します。

上記のコードを実行すると、非線形方程式の解を含むグラフが表示されます。

赤い等高線は方程式 $x^2 + y^2 = 25$ を表し、青い等高線は方程式 $x^2 - y = 7$ を表します。

緑の点は、求めた解を示しています。

このように、ScipyとMatplotlibを組み合わせることで、非線形方程式の解を視覚化することができます。

グラフを通じて、方程式の解がどのように見えるかを直感的に理解することができます。

物質の冷却 scipy

SciPyを使用して、ある物質の温度変化に関する問題を考え、その結果をグラフ化します。

物質の冷却

ある物質の冷却過程を考えます。
物質の初期温度が $100℃$ であり、周囲の温度が $25℃$ です。

物質の冷却は、ニュートンの冷却法則に従います。
物質の温度T(℃)は以下の式で与えられます。

$ \frac{dT}{dt} = -k \cdot (T - T_{\text{ambient}}) $

ここで、$ (k) $ は冷却係数であり、$(T_{\text{ambient}}) $は周囲の温度です。
物質の冷却係数は$0.07$とします。

この冷却過程をSciPyを使用して解き、物質の温度変化を0から100秒までシミュレートし、結果をグラフで表示します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint

# 冷却係数
k = 0.07
# 初期温度
T_initial = 100
# 周囲の温度
T_ambient = 25

# モデル式
def model(T, t):
dTdt = -k * (T - T_ambient)
return dTdt

# 時間範囲
t = np.linspace(0, 100, 100)

# 初期条件
T0 = [T_initial]

# 微分方程式を解く
T = odeint(model, T0, t)

# 結果をグラフで表示
plt.plot(t, T)
plt.xlabel('Time (s)')
plt.ylabel('Temperature (C)')
plt.title('Cooling of a Substance')
plt.grid(True)
plt.show()

このコードは、物質の冷却過程をシミュレートし、時間に対する温度の変化をグラフ化します。

初めは100℃で始まり、徐々に周囲の温度に近づいていく様子が分かります。

ソースコード解説

このソースコードは、Pythonプログラムで物質の冷却過程をモデル化し、結果をグラフとして表示するものです。
以下にソースコードの詳細な説明を行います。

  1. ライブラリのインポート:
1
2
3
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint
  • numpy: 数値計算をサポートするライブラリ。
  • matplotlib.pyplot: データをグラフで描画するためのライブラリ。
  • scipy.integrate.odeint: 常微分方程式を数値的に解くための関数。
  1. パラメータの設定:
1
2
3
k = 0.07  # 冷却係数
T_initial = 100 # 初期温度
T_ambient = 25 # 周囲の温度
  • k: 物質の冷却速度を示す冷却係数。
  • T_initial: 物質の初期温度。
  • T_ambient: 周囲の温度。
  1. モデル式の定義:
1
2
3
def model(T, t):
dTdt = -k * (T - T_ambient)
return dTdt
  • model(T, t): 冷却過程のモデル式を表す関数。
    ニュートンの冷却法則に基づき、温度変化率 dTdt を計算して返します。
  1. 時間範囲の設定:
1
t = np.linspace(0, 100, 100)
  • np.linspace(0, 100, 100): 0から100までの範囲を100個の等間隔な点で区切った配列を生成。
    時間の経過を表す配列 t
  1. 初期条件の設定:
1
T0 = [T_initial]
  • T0: 初期温度を要素とするリスト。
    微分方程式の初期条件として使用されます。
  1. 微分方程式の解法:
1
T = odeint(model, T0, t)
  • odeint(model, T0, t): 微分方程式 model を初期条件 T0 から解いて、時間経過に伴う温度の変化を計算します。
  1. 結果のグラフ表示:
1
2
3
4
5
6
plt.plot(t, T)
plt.xlabel('Time (s)')
plt.ylabel('Temperature (C)')
plt.title('Cooling of a Substance')
plt.grid(True)
plt.show()
  • plt.plot(t, T): 時間に対する温度の変化を折れ線グラフとして描画。
  • plt.xlabel('Time (s)'): X軸のラベルを設定。
  • plt.ylabel('Temperature (C)'): Y軸のラベルを設定。
  • plt.title('Cooling of a Substance'): グラフのタイトルを設定。
  • plt.grid(True): グリッドを表示。
  • plt.show(): グラフを表示。

このソースコードは、微分方程式を解いて物質の冷却過程をシミュレートし、結果をグラフで可視化する基本的な例です。

グラフ解説

生成されるグラフは、物質の冷却過程を時間の経過に伴って示しています。

以下にその詳細な説明を行います。

グラフの横軸(X軸)は時間(秒)を示しており、縦軸(Y軸)は物質の温度(摂氏)を示しています。

初期条件として、物質の初期温度は$100℃$です。
物質は周囲の温度である$25℃$に徐々に近づく過程が描かれています。
冷却係数 $(k)$ が$0.07$と設定されており、物質の温度変化はニュートンの冷却法則に従っています。

グラフの形状は、指数的な減少を示しています。
最初の数秒間は温度の変化が大きく、急速に冷却が進行しています。
しかし、時間が経つにつれて温度の変化は緩やかになり、周囲の温度に収束していきます。
つまり、物質は周囲の環境に達するまで冷却されていくことが分かります。

グラフの右上に近づくにつれ、温度の変化はゆっくりとなり、最終的には周囲の温度に収束していることが確認できます。
これは、冷却過程が進むにつれて温度の差が小さくなるためです。

このグラフは、物質の冷却過程が時間とともにどのように進行するかを示しており、物理的な現象の理解やモデリングに役立つ情報を提供しています。

給与データ分析 scipy

給与データ分析

scipyを使用して現実的な統計問題を解決し、その結果をグラフ化する例を示します。

この例では、ある架空の企業の従業員の給与データを扱います。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import numpy as np
import scipy.stats as stats
import matplotlib.pyplot as plt

# 架空の給与データ(千円)
salaries = np.array([30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100])

# 平均と標準偏差の計算
mean_salary = np.mean(salaries)
std_deviation = np.std(salaries)

# 正規分布に基づく確率密度関数(PDF)の計算
x = np.linspace(mean_salary - 3 * std_deviation, mean_salary + 3 * std_deviation, 100)
pdf = stats.norm.pdf(x, mean_salary, std_deviation)

# ヒストグラムと正規分布の確率密度関数をグラフ化
plt.figure(figsize=(10, 6))
plt.hist(salaries, bins=10, density=True, alpha=0.6, color='blue', label='Empirical Data')
plt.plot(x, pdf, color='red', label='Normal Distribution PDF')
plt.xlabel('Salary (Thousands of Yen)')
plt.ylabel('Probability Density')
plt.title('Salary Distribution and Normal Distribution')
plt.legend()
plt.grid(True)
plt.show()

このコードは、架空の給与データを用いて、ヒストグラム正規分布の確率密度関数を同じグラフ上に表示します。
データの分布と正規分布の形状を比較することができます。

ご自身のデータを使用して同様のアプローチを取ることで、実際の統計問題を解決し、結果を分かりやすくグラフ化することができます。

データや問題の内容によって適切な統計手法やグラフの種類が異なる場合がありますので、その点を考慮してください。

グラフ解説

上記グラフは、架空の企業の従業員の給与データとそれに対する正規分布の確率密度関数(PDF)を比較しています。

以下に、このグラフから得られる情報について詳しく説明します。

1. データの分布:

青色のヒストグラムは、架空の企業の従業員の給与データを表しています。
横軸は給与額(千円)、縦軸は確率密度を示しています。
ヒストグラムの各バーは、特定の給与範囲内の従業員数を示しており、データがどのように分布しているかを可視化しています。

2. 正規分布の確率密度関数:

赤色の線は、計算された正規分布の確率密度関数(PDF)を表しています。
この曲線は、データが正規分布に従っている場合の予測される分布を示しています。
正規分布は平均と標準偏差によって特徴付けられる確率分布で、多くの自然現象や統計データがこの分布に近い形状を取ることがあります。

3. 平均と標準偏差:

ヒストグラムのデータの中心付近にあるバーの位置は、データの平均給与額を示しています。
また、データのバーの広がり具合は、データのばらつきや分散を示しています。
正規分布の確率密度関数のピークは、平均給与額に位置しています。

4. データと正規分布の比較:

このグラフを通じて、データと正規分布の形状や特性を比較することができます。
データが正規分布に近い形状をしている場合、ヒストグラムのバーが赤い正規分布曲線に近づくことが期待されます。

5. 外れ値や歪み:

もしデータが正規分布から大きく外れていたり、非対称な形状をしている場合、ヒストグラムと正規分布の差異が観察されるかもしれません。
この差異は、データ内の外れ値や特異なパターンを示す兆候となる可能性があります。

要するに、このグラフは給与データの分布を視覚化し、そのデータが正規分布に従っているかどうかを確認するのに役立ちます。
データの特性や分布について洞察を得ることができるでしょう。

糖尿病 進行予測 scikit-learn

糖尿病 進行予測

scikit-learnを使用して、糖尿病患者のデータを元に、糖尿病の進行を予測する簡単な統計問題を解いてみましょう。

データセットには、糖尿病患者の年齢や血圧などの特徴量と、1年後の疾患進行の定量的な指標が含まれています。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, confusion_matrix

# データの準備(糖尿病データセットを使用)
from sklearn.datasets import load_diabetes
diabetes = load_diabetes()
X = diabetes.data
y = (diabetes.target > 100).astype(int) # 1年後の進行が進行するかどうか

# データをトレーニングセットとテストセットに分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# ロジスティック回帰モデルの作成と学習
model = LogisticRegression()
model.fit(X_train, y_train)

# テストデータで予測
y_pred = model.predict(X_test)

# モデルの評価
accuracy = accuracy_score(y_test, y_pred)
conf_matrix = confusion_matrix(y_test, y_pred)

# 結果の出力
print("Accuracy:", accuracy)
print("Confusion Matrix:\n", conf_matrix)

# 結果をグラフ化
plt.figure(figsize=(8, 6))
plt.imshow(conf_matrix, interpolation='nearest', cmap=plt.cm.Blues)
plt.title('Confusion Matrix')
plt.colorbar()
plt.xticks([0, 1], ['No Progression', 'Progression'])
plt.yticks([0, 1], ['No Progression', 'Progression'])
plt.xlabel('Predicted')
plt.ylabel('Actual')
plt.show()

このコードは、ロジスティック回帰を用いて糖尿病の進行を予測し、結果を混同行列(Confusion Matrix)としてグラフ化しています。

[実行結果]

混同行列は、実際のクラスとモデルの予測結果を交差させた表で、予測の正確さを評価するのに役立ちます。

グラフ化によって、予測がどれだけ正確か、またどのクラスがより誤って予測されているかを視覚的に確認することができます。

ソースコード解説

コードの各部分を詳しく説明します。

1. ライブラリのインポート:

1
2
3
4
5
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, confusion_matrix

必要なライブラリやモジュールをインポートしています。
numpyは数値計算のため、matplotlib.pyplotはグラフの描画のため、train_test_splitはデータの分割のため、LogisticRegressionはロジスティック回帰モデルのため、accuracy_scoreconfusion_matrixはモデル評価のために使用されます。

2. データの準備:

1
2
3
diabetes = load_diabetes()
X = diabetes.data
y = (diabetes.target > 100).astype(int)

load_diabetes()を使って糖尿病のデータセットを読み込み、特徴量(X)と目的変数(y)を取得しています。
目的変数は1年後の進行が進行するかどうかを示すバイナリ値(0または1)に変換しています。

3. データの分割:

1
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

train_test_splitを使用して、データをトレーニングセットとテストセットに分割しています。
test_sizeはテストセットの割合を示し、random_stateはランダムな分割を制御するシード値です。

4. モデルの構築と学習:

1
2
model = LogisticRegression()
model.fit(X_train, y_train)

LogisticRegressionクラスのインスタンスを作成し、トレーニングデータを用いてモデルを学習させています。

5. テストデータで予測:

1
y_pred = model.predict(X_test)

学習済みモデルを使ってテストデータの予測を行います。

6. モデルの評価:

1
2
accuracy = accuracy_score(y_test, y_pred)
conf_matrix = confusion_matrix(y_test, y_pred)

accuracy_scoreで予測の正確さを評価し、confusion_matrixで混同行列を計算しています。

7. 結果の出力:

1
2
print("Accuracy:", accuracy)
print("Confusion Matrix:\n", conf_matrix)

正確さと混同行列の結果を出力します。

8. 結果のグラフ化:

1
2
3
4
5
6
7
8
9
plt.figure(figsize=(8, 6))
plt.imshow(conf_matrix, interpolation='nearest', cmap=plt.cm.Blues)
plt.title('Confusion Matrix')
plt.colorbar()
plt.xticks([0, 1], ['No Progression', 'Progression'])
plt.yticks([0, 1], ['No Progression', 'Progression'])
plt.xlabel('Predicted')
plt.ylabel('Actual')
plt.show()

混同行列をカラーマップを使って可視化しています。

X軸が予測値、Y軸が実際の値を表し、それぞれのクラスを示すラベルが付いています。

カラーバーが数値と色の関連を示しています。

結果解説

先ほどのコードによって生成される混同行列のグラフは、モデルの予測結果と実際のクラスを対比させて、モデルの性能を可視化するためのものです。

以下で各要素の詳細を説明します。

グラフの要素:

  • カラーマップ (Color Map):
    グラフの色は、混同行列の値を示します。
    色の濃淡は値の大小を表し、色が明るいほど大きな値を持つことを示します。
    この例では、青系のカラーマップ(cmap=plt.cm.Blues)が使用されています。

  • 軸 (Axes):
    グラフの軸は、実際のクラスとモデルの予測クラスを示しています。
    X軸が「Predicted(予測値)」で、Y軸が「Actual(実際の値)」です。
    各軸には「No Progression(進行なし)」と「Progression(進行あり)」の2つのクラスがあります。

  • 軸ラベル (Axis Labels):
    軸ラベルは各軸のクラスを示しており、X軸とY軸にそれぞれのクラスのラベルが表示されます。

  • タイトル (Title):
    グラフの上部には「Confusion Matrix」というタイトルがあります。
    これは混同行列を表すグラフであることを示しています。

  • カラーバー (Colorbar):
    カラーバーは、色と値の関係を示すための尺度です。カラーバーによって、色の濃淡と実際の値の関連が可視化されます。

混同行列の各要素:

  • 真陽性 (True Positive, TP):
    実際のクラスが「Progression」であり、モデルが「Progression」と正しく予測した数です。

  • 真陰性 (True Negative, TN):
    実際のクラスが「No Progression」であり、モデルが「No Progression」と正しく予測した数です。

  • 偽陽性 (False Positive, FP):
    実際のクラスが「No Progression」であり、モデルが誤って「Progression」と予測した数です。
    誤検知を示します。

  • 偽陰性 (False Negative, FN):
    実際のクラスが「Progression」であり、モデルが誤って「No Progression」と予測した数です。
    逃してしまったケースを示します。

これらの要素をグラフから読み取ることで、モデルの予測性能がどれだけ良いか、特に誤分類の傾向を確認することができます。

例えば、偽陽性や偽陰性が多い場合、モデルが特定のクラスをうまく識別できていない可能性があります。

制約条件を持つ最適化問題 scipy

制約条件を持つ最適化問題

制約条件を持つ最適化問題を解くためには、scipy.optimizeモジュールを使用することが一般的です。

以下は、scipyを使用して制約条件のある最適化問題を解くサンプルコードです。

この例では、制約条件付きの2次元目的関数を最小化する問題を考えます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import minimize

# 目的関数の定義
def objective(x):
return x[0]**2 + x[1]**2

# 制約条件
def constraint(x):
return x[0] + x[1] - 1

# 初期値
x0 = np.array([0.5, 0.5])

# 制約条件付き最適化
constraints = {'type': 'eq', 'fun': constraint}
result = minimize(objective, x0, constraints=constraints)

# 結果の表示
print("最適な解:", result.x)
print("最小値:", result.fun)

[実行結果]

グラフ化

次に、結果をグラフ化してみましょう。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 目的関数を等高線プロット
x = np.linspace(-2, 2, 400)
y = np.linspace(-2, 2, 400)
X, Y = np.meshgrid(x, y)
Z = X**2 + Y**2

plt.contour(X, Y, Z, levels=np.logspace(-1, 2, 10), cmap='viridis')

# 制約条件をプロット
plt.plot(x, 1 - x, '-r', label='x + y = 1')

# 最適解をプロット
plt.plot(result.x[0], result.x[1], 'ro', label='最適解')

plt.xlabel('x')
plt.ylabel('y')
plt.title('Constrained Optimization')
plt.legend()
plt.show()

このコードでは、2次元の目的関数を最小化しながら、制約条件 x + y = 1 を満たす最適解を求めています。

結果は等高線プロットとして表示され、最適解は赤い点で示されます。

なお、制約条件のある最適化問題は様々な種類があり、それぞれ異なるアプローチが必要です。

上記の例は一般的なサンプルであり、実際の問題に応じて適切なアルゴリズムや制約条件の設計が必要です。

[実行結果]

異常検出 scikit-learn

異常検出

異常検出の例として、シンプルなユースケースとして1次元のデータで異常を検出することを考えてみましょう。

以下は、正規分布に従うデータに対して異常を検出する例です。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import numpy as np
import matplotlib.pyplot as plt
from sklearn.ensemble import IsolationForest

# データ生成
np.random.seed(42)
normal_data = np.random.normal(loc=0, scale=1, size=1000)
anomalies = np.array([4, 5, -3]) # 異常値の追加

# データと異常値を結合
data = np.concatenate([normal_data, anomalies])

# データのプロット
plt.figure(figsize=(10, 6))
plt.scatter(range(len(data)), data, marker='x', color='blue', label='Normal')
plt.scatter(range(len(normal_data), len(data)), anomalies, marker='o', color='red', label='Anomaly')
plt.xlabel('Sample Index')
plt.ylabel('Value')
plt.title('Anomaly Detection Example')
plt.legend()
plt.show()

# Isolation Forestモデルの構築と異常検出
model = IsolationForest(contamination=0.05, random_state=42) # contaminationは異常値の割合
model.fit(data.reshape(-1, 1))

# データの異常スコアを予測
anomaly_scores = model.decision_function(data.reshape(-1, 1))

# 異常スコアのプロット
plt.figure(figsize=(10, 6))
plt.plot(anomaly_scores, marker='o', linestyle='-', color='green')
plt.xlabel('Sample Index')
plt.ylabel('Anomaly Score')
plt.title('Anomaly Scores')
plt.show()

このコードでは、正規分布に従うデータに3つの異常値を追加しています。

Isolation Forestアルゴリズムを使用して異常検出を行い、異常スコアをプロットしています。

異常スコアが閾値を超えるデータポイントは、異常として検出されたとみなすことができます。


なお、実際のデータではより多くの特徴量や高次元データを扱うことになるため、適切なデータの前処理やモデルの調整が必要です。

また、異常の定義や異常値の割合に応じてcontaminationパラメータを調整する必要があります。

ソースコード解説

以下にコードの各部分の詳細な説明を行います。

1. モジュールのインポート:

最初の数行では、必要なライブラリとモジュールをインポートしています。

  • numpynpとしてエイリアス): 数値計算用のライブラリ。
  • matplotlib.pyplotpltとしてエイリアス): データの可視化用のライブラリ。
  • IsolationForestクラス: Scikit-learnの異常検出アルゴリズムであるIsolation Forestを提供するクラス。

2. データの生成と準備:

  • normal_data: 正規分布に従うランダムなデータを生成しています。
    平均 (loc) は0、標準偏差 (scale) は1で、サイズは1000です。
  • anomalies: 異常値の配列を手動で定義しています。

3. データと異常値のプロット:

  • plt.scatter: データと異常値をプロットしています。
    青い「x」マーカーは正常なデータポイントを示し、赤い「o」マーカーは異常値を示します。
    X軸はサンプルのインデックス、Y軸は値です。

4. Isolation Forestモデルの構築と異常検出:

  • IsolationForestのインスタンスを作成しています。
    contaminationパラメータは異常値の割合を指定します。
    random_stateは乱数のシードを固定します。
  • model.fit: モデルをデータに適合させます。

5. データの異常スコアを予測:

  • model.decision_function: データポイントの異常スコアを計算します。
    異常スコアは、モデルがデータポイントを異常とみなす確信度の尺度です。

6. 異常スコアのプロット:

  • plt.plot: データポイントの異常スコアをプロットしています。
    異常スコアが低いほど正常、高いほど異常と判断される可能性が高くなります。
    X軸はサンプルのインデックス、Y軸は異常スコアです。

このコードは、Isolation Forestアルゴリズムを使用して異常検出を行い、異常スコアをプロットして視覚化するサンプルです。

ただし、実際のケースではデータの前処理、ハイパーパラメータの調整、適切なモデルの選択などが必要です。

結果解説

異常検出の結果として表示される2つのグラフについて、詳しく説明します。

1. データと異常値のプロット:

このグラフは、元のデータと追加した異常値を含むデータポイントを表示しています。
以下の要素に注意してください:

  • 青い「x」マーカー:
    正常なデータポイントを表しています。これらは正規分布に従うランダムなデータです。
  • 赤い「o」マーカー:
    異常値を表しています。これらはわざとデータに追加された異常な値です。

このプロットは、異常検出のタスクを視覚的に理解するのに役立ちます。
異常値が通常のデータポイントからどれだけ外れているかが分かります。

2. 異常スコアのプロット:

このグラフは、Isolation Forestアルゴリズムによって計算された異常スコアを示しています。
以下の要素に注意してください:

  • 縦軸 (Y軸): 異常スコアを表しています。
    スコアが低いほどデータポイントは正常、高いほど異常と判断された可能性が高いです。
  • 横軸 (X軸): データポイントのインデックスを表しています。

グリーンの線で表されたプロットは、各データポイントの異常スコアを示しています。
異常スコアが閾値を超えるデータポイントは、異常として検出されたとみなされます。

これらのグラフは、異常検出のプロセスを理解し、異常検出アルゴリズムのパフォーマンスを評価する際に役立ちます。

異常スコアを基にして異常を検出するため、グラフから異常値がどれだけ明確に特定されているかを確認することが重要です。

飲食業の需要予測 Prophet

飲食業の需要予測

飲食業の需要予測の例題をProphetを使用して解いてみましょう。

まず、仮想のデータセットを用意しましょう。

例えば、過去4年間のあるレストランの月間売上データを持っているとします。

以下にデータの例を示します:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
日付,売上
2022-01-01,1000
2022-02-01,1200
2022-03-01,1100
2022-04-01,1300
2022-05-01,1400
2022-06-01,1500
2022-07-01,1300
2022-08-01,1200
2022-09-01,1100
2022-10-01,1000
2022-11-01,1200
2022-12-01,1300
2023-01-01,1400
2023-02-01,1500
2023-03-01,1600
2023-04-01,1400
2023-05-01,1300
2023-06-01,1200
2023-07-01,1100
2023-08-01,1000
2023-09-01,1200
2023-10-01,1300
2023-11-01,1400
2023-12-01,1500
2024-01-01,1600
2024-02-01,1700
2024-03-01,1500
2024-04-01,1400
2024-05-01,1300
2024-06-01,1200
2024-07-01,1100
2024-08-01,1000
2024-09-01,1200
2024-10-01,1300
2024-11-01,1400
2024-12-01,1500
2025-01-01,1600
2025-02-01,1700
2025-03-01,1800
2025-04-01,1600
2025-05-01,1500
2025-06-01,1400
2025-07-01,1300
2025-08-01,1200
2025-09-01,1100
2025-10-01,1000
2025-11-01,1200
2025-12-01,1300

それでは、PythonのProphetライブラリを使用してこのデータセットで需要予測を行ってみましょう。

まず、Prophetライブラリがインストールされていない場合は、次のコマンドを使用してインストールします:

1
!pip install prophet

インストールが完了したら、以下のコードを使って進めます。

以下は、提供されたデータセットを使用してProphetを使った需要予測を行う例です:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import pandas as pd
from prophet import Prophet
import matplotlib.pyplot as plt

# データセットの定義
data = pd.read_csv('データセットのパス.csv')

# Prophet用にデータを準備する
data = data.rename(columns={'日付': 'ds', '売上': 'y'})

# Prophetモデルの作成
model = Prophet()

# データにモデルをフィットさせる
model.fit(data)

# 予測のための未来の日付を生成する
future_dates = model.make_future_dataframe(periods=12, freq='M')

# 予測を実行する
forecast = model.predict(future_dates)

# 予測結果をグラフ化する
model.plot(forecast, xlabel='Date', ylabel='Sales')
plt.title('Restaurant Demand Forecast')
plt.show()

この例では、まず必要なライブラリをインポートし、Prophetもインポートしています。

次にデータセットを読み込み、列名をProphetの予測モデルに合わせて変更しています。

その後、Prophetモデルを作成し、データにフィットさせ、予測のための未来の日付を生成します。

最後に、モデルを使用して未来の日付の売上を予測し、予測結果をグラフ化しています。

'データセットのパス.csv'の部分は、実際のデータセットファイルのパスに置き換えてください。

また、make_future_dataframeperiodsパラメータを調整して、予測する未来の期間の数を指定することもできます。

ソースコード解説

以下、コードの各部分の詳細な説明です。

1. ライブラリのインポート:

1
2
3
import pandas as pd
from prophet import Prophet
import matplotlib.pyplot as plt
  • pandas: データ操作や分析のためのPythonライブラリ。
  • Prophet: Facebookが開発した時系列予測ライブラリ。このライブラリを使用して時系列モデルを構築し、予測を行う。
  • matplotlib.pyplot: グラフを描画するためのPythonライブラリ。

2. データセットの読み込み:

1
data = pd.read_csv('データセットのパス.csv')

CSV形式のデータセットを読み込み、dataという名前のDataFrame(表形式のデータ構造)に格納しています。

3. データの準備:

1
data = data.rename(columns={'日付': 'ds', '売上': 'y'})

データのカラム名をProphetの予測モデルに合わせるために変更しています。
'日付'カラムは時系列の日付を表し、'売上'カラムは予測する対象の数値データ(売上)を表しています。

4. Prophetモデルの作成:

1
model = Prophet()

Prophetのモデルをインスタンス化します。
このモデルは、時系列データからトレンド、季節性、ホリデーエフェクトなどを学習し、予測を行うために使用されます。

5. モデルのデータへのフィッティング(適合):

1
model.fit(data)

dataに格納されたデータを使用して、Prophetモデルに適合させます。
モデルはここでデータのトレンドや季節性を学習します。

6. 未来の日付の生成:

1
future_dates = model.make_future_dataframe(periods=12, freq='M')

予測を行うための未来の日付を生成します。
periodsで指定した期間(ここでは12ヶ月)分の日付を生成し、freqで頻度を’M’(月ごと)として指定しています。

7. 予測の実行:

1
forecast = model.predict(future_dates)

未来の日付に対して予測を実行し、forecastというDataFrameに予測結果を格納します。

8. 予測結果のグラフ化:

1
2
3
model.plot(forecast, xlabel='Date', ylabel='Sales')
plt.title('Restaurant Demand Forecast')
plt.show()

予測結果をグラフ化して表示します。
x軸には日付を、y軸には売上を表示します。
また、グラフのタイトルも設定されています。

このコードは、Prophetを使用して時系列データの売上予測を行い、その結果を可視化する一連の手順を示しています。

結果解説

グラフの内容を詳しく説明します。

1. データポイント(黒い点):

グラフ上に表示される黒い点は、実際の売上データポイントを表しています。

これらの点は、元のデータセットから取得され、予測モデルの作成に使用されました。

2. 予測値(青い線):

グラフ上に表示される青い線は、Prophetモデルによって予測された売上の値を表しています。
この線は、過去のデータからのトレンドや季節性を考慮して、将来の売上を予測したものです。

3. 不確実性範囲(青い領域):

グラフ上に表示される青い領域は、予測値の不確実性範囲を表しています。
Prophetは、予測の信頼性を示すために、予測値の上下に不確実性範囲を示します。
この範囲は、予測の信頼性が高いほど狭くなります。

このグラフを通じて、過去のデータからのトレンドや季節性を考慮した予測値が表示されます。

また、不確実性範囲も示されるため、予測の信頼性を評価することができます。

経済予測 Prophet

経済予測

Prophetを使用して経済予測を行う一般的な手順とコードの例を提供します。

以下はPythonコードの例です。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import pandas as pd
from prophet import Prophet
import matplotlib.pyplot as plt

# 入力データの準備 (仮想的な経済データ)
data = pd.DataFrame({
'ds': pd.date_range(start='2023-01-01', periods=24, freq='M'),
'y': [100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200, 210,
220, 230, 240, 250, 260, 270, 280, 290, 300, 310, 320, 330]
})

# Prophetモデルの初期化
model = Prophet()

# モデルへのデータの適用
model.fit(data)

# 予測期間の準備
future = model.make_future_dataframe(periods=12, freq='M')

# 予測の実行
forecast = model.predict(future)

# 予測結果のグラフ化
fig = model.plot(forecast)
plt.title('Economic Forecast with Prophet')
plt.xlabel('Date')
plt.ylabel('Economic Indicator')
plt.show()

この例では、仮想的な経済データを使ってProphetモデルを構築し、将来の12ヶ月間の経済予測を行います。

データと予測結果はグラフで表示されます。

実際の経済データを使用する場合、適切なデータの前処理やハイパーパラメータの調整が必要です。

また、実際の経済データを使用する場合は、データを適切な形式で読み込んで上記の例に組み込む必要があります。

ソースコード解説

以下にコードの詳細な説明を提供します。

1. モジュールのインポート:

必要なライブラリやモジュールをインポートします。
pandasはデータ操作のために、ProphetはProphetモデルの構築と予測のために、matplotlib.pyplotはグラフの描画のために使用されます。

2. 入力データの準備:

仮想的な経済データを作成してpandasのDataFrameに格納します。
'ds'列には日付が、'y'列には対応する経済指標の値が入ります
ここでは24ヶ月分のデータを作成しています。

3. Prophetモデルの初期化:

Prophetクラスのインスタンスを作成して、Prophetモデルを初期化します。
このモデルは時系列データのトレンドや季節性をモデリングするために使用されます。

4. モデルへのデータの適用:

model.fit(data)を呼び出すことで、準備した経済データをモデルに適用して学習させます。
これにより、トレンドや季節性がモデルに学習されます。

5. 予測期間の準備:

model.make_future_dataframe()を使って、未来の予測期間の日付を含むDataFrameを作成します。
ここでは12ヶ月分の予測期間を設定しています。

6. 予測の実行:

model.predict(future)を呼び出すことで、予測期間における経済指標の予測値を計算します。
結果はforecastというDataFrameとして格納されます。

7. 予測結果のグラフ化:

model.plot(forecast)を呼び出すことで、予測結果をグラフとして表示します。
グラフには元データ、予測区間、トレンド、季節性などが含まれます。
matplotlibを使用してタイトルや軸ラベルを設定し、最終的にplt.show()でグラフを表示します。

このコードは、Prophetを使用して簡単に経済予測を行い、その結果を視覚化するための手順を示しています。

実際のデータを使用する場合は、データの前処理やハイパーパラメータの調整が必要です。

結果解説

経済予測のグラフの主要な要素の説明します。

1. 元データ (Observed Data):

グラフの黒い点線は、元のデータポイントを示しています。
これらのデータポイントは、予測モデルの構築に使用された実際の経済データです。
点線は元のデータポイントがある日付と対応する経済指標の値を示します。

2. 予測区間 (Prediction Interval):

グラフの青い領域は予測区間を示しています。
これは、予測モデルによって予測された値の範囲です。
通常、Prophetは不確実性を考慮して、予測値の上下に予測区間を描画します。
一般的に、将来のデータポイントがこの範囲内に入る確率は高いです。

3. トレンド (Trend):

グラフの青い線はトレンドを示しています。
Prophetは、時間の経過に伴う長期的な変動やトレンドをモデル化し、この青い線で表現しています。
トレンドは、データが上昇するか下降するかを示すものです。

Prophetの予測結果のグラフは、元のデータと予測されたトレンド、季節性、不確実性の情報を視覚的に表現するものです。

データの性質や用途に応じて、これらの要素がどのように現れるかが異なる場合があります。

製品売上予測 Prophet

製品売上予測

Prophetを使った製品売上予測の例を示します。

入力データ(日付と売上)と祝日情報をソースコード内に定義し、予測結果をグラフ化します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import pandas as pd
from prophet import Prophet
import matplotlib.pyplot as plt

# 入力データの定義(日付と売上)
data = pd.DataFrame({
'ds': ['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04', '2023-01-05', '2023-01-06', '2023-01-07'],
'y': [100, 150, 120, 130, 140, 160, 155]
})
data['ds'] = pd.to_datetime(data['ds'])

# 祝日情報の定義
holidays = pd.DataFrame({
'holiday': 'holiday',
'ds': pd.to_datetime(['2023-01-01', '2023-01-07']),
'lower_window': 0,
'upper_window': 0,
})

# モデルの作成
model = Prophet(holidays=holidays)
model.fit(data)

# 未来の日付を生成(30日分の予測)
future = model.make_future_dataframe(periods=30)

# 予測の実行
forecast = model.predict(future)

# 予測結果のグラフ化
fig = model.plot(forecast)
plt.title('Product Lifetime Prediction')
plt.xlabel('Date')
plt.ylabel('Sales')
plt.show()

このコードでは、入力データとして日付と売上を持つDataFrameを定義し、祝日情報も定義しています。

Prophetモデルを作成し、未来の日付を生成して予測を実行し、結果をグラフ化しています。

この例では7日間のデータを元に、さらに30日分の予測を行っています。

ご自身のデータに合わせて、日付と売上の値を適切に入力してください。

また、祝日情報もデータに合わせて調整してください。

ソースコード解説

それぞれのステップを詳しく説明します。

1. ライブラリのインポート:

  • pandas: データの操作と解析のためのライブラリ。
  • Prophet: Facebookが提供する時系列予測ライブラリ。
  • matplotlib.pyplot: データ可視化のためのライブラリ。

2. 入力データの定義:

  • data: 製品の売上データを持つDataFrame。
    ‘ds’列は日付を、’y’列は売上を表しています。
    日付は文字列型からpd.to_datetimeを使用して日付型に変換しています。

3. 祝日情報の定義:

  • holidays: 祝日の情報を持つDataFrame。
    ‘ds’列には祝日の日付を、’lower_window’と’upper_window’は祝日の前後の日数範囲を指定しています。
    ここでは祝日日付に影響を与えるために0を指定しています。

4. モデルの作成:

  • Prophetクラスのインスタンスを作成し、holidays情報を渡してモデルを初期化します。
  • fitメソッドでモデルをデータに適合させます。

5. 未来の日付の生成:

  • 予測結果を得るために、未来の日付を生成するためのDataFrame future を作成します。
    ここでは30日分の予測を行うため、periods引数に30を指定しています。

6. 予測の実行:

  • predictメソッドでモデルを用いて未来の売上を予測します。
    予測結果はforecastに格納されます。

7. 予測結果のグラフ化:

  • model.plot(forecast)で予測結果をグラフ化します。
  • plt.titleplt.xlabelplt.ylabelでグラフのタイトルと軸ラベルを設定します。
  • plt.show()でグラフを表示します。

このコードは、元データの売上トレンド、未来の予測、および祝日の影響を一つのグラフで視覚的に表現するために使用されます。

データや祝日情報を適切に調整することで、自身のデータに対して予測を行うことができます。

結果解説

表示されるグラフは、Prophetによる製品寿命の売上予測の結果を表しています。

グラフには以下の要素が含まれています。

1. 黒い点(元データ):

入力データにおける実際の売上を表す黒い点がプロットされています。
これらの点を通じて、元データの売上パターンが視覚的に確認できます。

2. 青いと線(予測データ):

未来の予測日付に対する売上を表す青い点がプロットされています。
青い線は、Prophetによる予測のトレンドを示しています。

3. 青い領域(不確実性範囲):

予測データの線の周りには、青い領域が描かれています。
これは予測の不確実性を示しており、売上がこれらの領域内に収まる確率が高いと言えます。

4. 祝日の影響:

グラフ上に縦線が描かれている部分は、祝日情報に基づいて設定された日付です。
これらの日付の周りには、祝日が予測にどのような影響を与えるかを示すエリアが表示されています。


このグラフを通じて、元データの売上トレンドや季節性、Prophetによる予測のトレンドと不確実性、祝日の影響などを視覚的に確認することができます。

予測結果がどの程度元データと一致するか、また祝日が売上にどのような影響を持つかを把握するのに役立ちます。

トラック運送の予測 Prophet

トラック運送の予測

トラック運送の予測を行うためのProphetのサンプルコードを提供します。

以下の例では、過去のトラック運送データと祝日の情報を使用して、未来のトラック運送量を予測します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import pandas as pd
from fbprophet import Prophet
import matplotlib.pyplot as plt

# 過去のトラック運送データ
data = {
'ds': ['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04', '2023-01-05', '2023-01-06', '2023-01-07', '2023-01-08', '2023-01-09', '2023-01-10'],
'y': [10, 20, 15, 25, 30, 35, 40, 45, 50, 55]
}

# Prophet用のデータフレームに変換
df = pd.DataFrame(data)
df['ds'] = pd.to_datetime(df['ds'])

# 祝日の情報を追加
holidays = pd.DataFrame({
'holiday': 'holiday',
'ds': pd.to_datetime(['2023-01-01', '2023-01-05']),
'lower_window': 0,
'upper_window': 1,
})

# モデルの作成と学習
model = Prophet(holidays=holidays)
model.fit(df)

# 予測期間の設定
future = model.make_future_dataframe(periods=365)

# 予測の実行
forecast = model.predict(future)

# 予測結果のグラフ化
fig, ax = plt.subplots(figsize=(10, 6))
model.plot(forecast, ax=ax)
model.plot_components(forecast, ax=ax)
plt.title('Truck Delivery Forecast')
plt.xlabel('Date')
plt.ylabel('Delivery Volume')
plt.show()

上記のコードでは、過去のトラック運送データをdataとして定義し、Prophet用のデータフレームに変換しています。

また、holidaysというデータフレームを作成し、祝日の情報を追加しています。

モデルの作成時にholidaysを指定し、make_future_dataframeで予測期間を設定しています。

予測の実行後、plotメソッドを使用して予測結果をグラフ化しています。


さらに、plot_componentsメソッドを使用してトレンドや季節性の成分をグラフ化しています。

このサンプルコードを実行すると、トラック運送の予測結果がグラフとして表示されます。





グラフを通じて、予測値と実測値の関係やトレンドの変化、祝日の影響などを視覚的に確認することができます。

ご自身のデータに合わせて適切にカスタマイズし、トラック運送の予測結果をグラフ化してみてください。

ソースコード解説

コードの各部分について説明します。

1. ライブラリのインポート:

  • import pandas as pd: Pandasライブラリをインポートして、データ処理に使用します。
  • from prophet import Prophet: Prophetクラスをインポートして、予測モデルを構築・訓練するために使用します。
  • import matplotlib.pyplot as plt: Matplotlibライブラリをインポートして、グラフの描画に使用します。

2. 日次のデータ生成:

  • pd.date_range: 2020年1月1日から2023年1月1日までの日次の日付データを生成します。
  • pd.DataFrame: 生成した日付データとそのインデックスに対応する連番を含むDataFrameを作成します。
    列名は ‘ds’ と ‘y’ です。’ds’ は日付を、’y’ はその日の連番を表します。

3. モデルのインスタンス化:

  • model = Prophet(): Prophetモデルのインスタンスを作成します。

4. 季節性の追加:

  • model.add_seasonality: モデルに週次と年次の季節性を追加します。
    週次季節性の周期は7日で、フーリエオーダーが3です。
    年次季節性の周期は365.25日(うるう年を考慮)で、フーリエオーダーが10です。

5. 祝日の指定:

  • pd.DataFrame: ‘special_day’ という名前の祝日を指定します。
    祝日の日付は、2020年から2022年までの12月25日です。
    lower_windowupper_window は祝日の前後に適用するウィンドウの日数を指定します。
  • model.add_country_holidays: モデルに国に基づく祝日(この場合はアメリカ)を追加します。

6. データへの適合:

  • model.fit(data): モデルを提供されたデータに適合させます。

7. 予測期間の作成:

  • model.make_future_dataframe: 予測期間のDataFrameを生成します。
    ここでは365日(1年間)の期間を指定しています。

8. 予測の実行:

  • model.predict(future): 予測期間内の予測を実行し、予測結果を得ます。

9. 予測結果の可視化:

  • 予測結果を含むグラフを描画し、plt.titleplt.xlabel でタイトルと横軸ラベルを設定します。

10. 季節性の可視化:

  • model.plot_components: 季節性を構成要素ごとに可視化するグラフを作成します。

以上の手順によって、Prophetモデルを使用して時系列データの予測と可視化が行われます。

結果解説

表示される5つのグラフについて説明します。

1. 予測結果の折れ線グラフ(Forecast Plot):

このグラフは、実測値と予測値を折れ線で表示します。
実測値は黒い点で表され、予測値は青い折れ線で表されます。
このグラフを通じて、予測値が実測値にどれくらい近いかを確認することができます。

2. トレンドのグラフ(Trend Plot):

このグラフは、時間の経過に伴うデータのトレンドを示します。
予測値のトレンドは青い折れ線で表され、過去のデータから未来の予測までの傾向を示します。
このグラフを通じて、データの増減や変化の傾向を把握することができます。

3. 季節性のグラフ(Seasonality Plot):

このグラフは、データの季節性パターンを示します。
季節性は、周期的な変動やパターンを持つデータの特徴です。
Prophetは、季節性を捉えるためにフーリエ変換を使用しています。
このグラフを通じて、データの季節性の変化や周期性を確認することができます。

4. 週次季節性のグラフ(Weekly Seasonality Plot):

このグラフは、週ごとの季節性パターンを示します。
週次季節性は、週単位でのデータの変動やパターンを表します。
Prophetは、週次季節性を捉えるためにフーリエ変換を使用しています。
このグラフを通じて、週ごとのデータの変動や季節性のパターンを確認することができます。

5. 月次季節性のグラフ(Monthly Seasonality Plot):

このグラフは、月ごとの季節性パターンを示します。
月次季節性は、月単位でのデータの変動やパターンを表します。
Prophetは、月次季節性を捉えるためにフーリエ変換を使用しています。
このグラフを通じて、月ごとのデータの変動や季節性のパターンを確認することができます。

これらのグラフを組み合わせることで、データのトレンドや季節性、予測値の信頼性などを詳しく分析することができます。

また、グラフの表示によって、データの特徴や傾向を視覚的に把握することができます。