旅行需要の予測 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
import pandas as pd
from prophet import Prophet
import matplotlib.pyplot as plt

# 旅行需要のデータを定義
data = pd.DataFrame({
'ds': pd.to_datetime(['2020-01-01', '2020-02-01', '2020-03-01', '2020-04-01', '2020-05-01', '2020-06-01',
'2020-07-01', '2020-08-01', '2020-09-01', '2020-10-01', '2020-11-01', '2020-12-01']),
'y': [100, 120, 130, 110, 150, 170, 200, 230, 220, 180, 150, 130]
})

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

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

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

# 予測結果のグラフ化
model.plot(forecast, xlabel='Date', ylabel='Demand')
plt.title('Travel Demand Forecast')
plt.show()

上記のコードでは、Prophetライブラリを使用して旅行需要の予測を行っています。

データはdataというDataFrameに定義されており、ds列には日付、y列には旅行需要数が含まれています。

Prophetモデルを作成し、fitメソッドでデータを学習させます。

次に、make_future_dataframeメソッドを使用して予測期間を設定し、predictメソッドで予測を実行します。

最後に、plotメソッドを使用して予測結果をグラフ化します。x軸には日付、y軸には需要数が表示されます。

このコードを実行すると、旅行需要の予測結果がグラフとして表示されます。

コード解説

以下にソースコードの詳細を説明します:

1. import文:

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

2. 旅行需要のデータの定義:

pd.DataFrameを使用して、旅行需要のデータを定義します。
ds列には日付が含まれ、y列には旅行需要数が含まれています。
日付はpd.to_datetimeを使用して日付型に変換されます。

3. Prophetモデルの作成と学習:

Prophetクラスのインスタンスを作成し、fitメソッドを使用してデータをモデルに学習させます。

4. 予測期間の設定:

make_future_dataframeメソッドを使用して、予測期間を設定します。
periodsパラメータで予測期間の長さを指定し、freqパラメータで期間の頻度を指定します。
この例では、12ヶ月ごとの予測を行っています。

5. 予測の実行:

predictメソッドを使用して、予測を実行します。
予測結果はforecastに格納されます。

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

plotメソッドを使用して、予測結果をグラフ化します。
xlabelylabelパラメータを使用して、x軸とy軸のラベルを指定します。
titleメソッドを使用して、グラフのタイトルを設定します。最後に、plt.show()を使用してグラフを表示します。

このソースコードを実行すると、Prophetを使用して旅行需要の予測を行い、予測結果をグラフとして表示することができます。

結果解説

旅行需要の予測結果のグラフは、時間(日付)を横軸に、旅行需要数を縦軸に表示します。

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

1. 元のデータポイント:

元の旅行需要データポイントは、実際の旅行需要数を表しています。
これらのデータポイントは、グラフ上の散布図として表示されます。

2. 予測値:

Prophetモデルによって予測された旅行需要数は、グラフ上の線で表示されます。
この線は、元のデータポイントから予測期間まで延びています。

3. 予測区間:

予測区間は、予測値の信頼区間を表しています。通常、Prophetは予測区間を提供し、予測の不確実性を示します。
予測区間は、予測値の周りに表示される陰影つきの領域として表されます。

グラフを見ることで、元のデータポイントと予測値の間の関係や傾向を視覚的に理解することができます。

また、予測区間を見ることで、予測の信頼性や不確実性を評価することもできます。

このようなグラフを使用することで、旅行需要の予測結果を分かりやすく可視化し、将来の需要の傾向や変動を把握することができます。

売上予測 Prophet

売上予測

売上予測の例題として、ある小売店舗の過去の売上データを使用して予測を行います。

以下のデータを使用して、Prophetを使って売上予測を行い、結果をグラフ化します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import pandas as pd
from fbprophet import Prophet

# データの定義
data = {
'ds': ['2022-01-01', '2022-02-01', '2022-03-01', '2022-04-01', '2022-05-01', '2022-06-01', '2022-07-01', '2022-08-01', '2022-09-01', '2022-10-01', '2022-11-01', '2022-12-01'],
'y': [100, 120, 130, 110, 150, 140, 160, 180, 200, 210, 190, 220]
}

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

# モデルの作成と予測
model = Prophet()
model.fit(df)
future = model.make_future_dataframe(periods=12, freq='M')
forecast = model.predict(future)

# 予測結果の表示
print(forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail(12))

上記のコードでは、データをPythonの辞書形式で定義し、Prophet用のデータフレームに変換しています。

その後、Prophetモデルを作成し、将来の12ヶ月間の売上を予測しています。

予測結果をグラフ化するために、以下のPythonコードを使用します。

1
2
3
4
5
6
7
8
import matplotlib.pyplot as plt

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

上記のコードでは、Prophetによる予測結果をグラフ化しています。

x軸には日付、y軸には売上が表示されます。

以上のコードを実行することで、売上予測の例題をProphetで解き、結果を分かりやすくグラフ化することができます。

コード解説

以下にソースコードの各部分の詳細を説明します。

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

1
2
3
import pandas as pd
from prophet import Prophet
import matplotlib.pyplot as plt

必要なライブラリをインポートしています。

pandasはデータフレームの操作に使用され、Prophetは予測モデルの作成と予測を行うために使用されます。

matplotlib.pyplotはグラフの表示に使用されます。

2. データの定義:

1
2
3
4
data = {
'ds': ['2022-01-01', '2022-02-01', '2022-03-01', '2022-04-01', '2022-05-01', '2022-06-01', '2022-07-01', '2022-08-01', '2022-09-01', '2022-10-01', '2022-11-01', '2022-12-01'],
'y': [100, 120, 130, 110, 150, 140, 160, 180, 200, 210, 190, 220]
}

予測に使用する売上データを定義しています。

dsは日付を、yは対応する売上を表しています。

3. Prophet用のデータフレームに変換:

1
2
df = pd.DataFrame(data)
df['ds'] = pd.to_datetime(df['ds'])

データをProphet用のデータフレームに変換しています。

pd.DataFrame()を使用して辞書形式のデータをデータフレームに変換し、pd.to_datetime()を使用して日付の列を日付型に変換しています。

4. モデルの作成と予測:

1
2
3
4
model = Prophet()
model.fit(df)
future = model.make_future_dataframe(periods=12, freq='M')
forecast = model.predict(future)

Prophetモデルを作成し、過去のデータを使用してモデルを学習させます。

make_future_dataframe()を使用して将来の日付を含むデータフレームを作成し、predict()を使用して予測を行います。

5. 予測結果の表示:

1
print(forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail(12))

予測結果を表示します。

[['ds', 'yhat', 'yhat_lower', 'yhat_upper']]を使用して、日付と予測された売上、下限値、上限値の列を表示します。

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

1
2
3
4
5
fig = model.plot(forecast)
plt.xlabel('Date')
plt.ylabel('Sales')
plt.title('Sales Forecast')
plt.show()

予測結果をグラフ化して表示します。

model.plot()を使用して予測結果をグラフ化し、plt.xlabel()plt.ylabel()で軸のラベルを設定し、plt.title()でグラフのタイトルを設定します。

最後にplt.show()でグラフを表示します。

以上が、売上予測を行い、結果を表示およびグラフ化するためのソースコードの詳細な説明です。

結果解説

実行結果は以下のようになります。

1
2
3
4
5
6
7
8
9
10
11
12
13
           ds        yhat  yhat_lower  yhat_upper
12 2022-12-31 228.962089 213.866024 242.519432
13 2023-01-31 239.914274 224.889105 254.237392
14 2023-02-28 249.806570 234.338750 264.336614
15 2023-03-31 260.758755 246.001839 275.548391
16 2023-04-30 271.357643 256.023975 286.257924
17 2023-05-31 282.309828 268.069062 297.171988
18 2023-06-30 292.908717 278.309079 307.197057
19 2023-07-31 303.860902 289.085905 318.430346
20 2023-08-31 314.813087 300.655728 329.808028
21 2023-09-30 325.411975 309.834843 339.653120
22 2023-10-31 336.364160 321.595208 352.081106
23 2023-11-30 346.963049 331.431253 362.452297

上記の結果は、将来の12ヶ月間の売上予測を示しています。

各行は予測された月ごとのデータを表しており、以下の列が含まれています。

  • ds: 予測された日付
  • yhat: 予測された売上の値
  • yhat_lower: 予測された売上の下限値
  • yhat_upper: 予測された売上の上限値

予測結果をグラフ化すると、以下のようなグラフが表示されます。

このグラフでは、x軸には日付が表示され、y軸には売上が表示されています。

青い線は予測された売上の値を表しており、水色の領域は予測の不確かさを示しています。

具体的には、水色の領域は予測された売上の下限値と上限値の範囲を表しています。

このように、Prophetを使用して売上予測を行うと、将来の売上の傾向や予測の不確かさを把握することができます。

感染症拡大予測 Prophet

感染症拡大予測

Prophetを使用して感染症の拡大予測を行うための例を示します。

ここでは架空のデータを使用していますが、実際のデータを用いて同様の手順が適用できます。

まず、必要なライブラリをインポートします。

1
2
3
4
import pandas as pd
import numpy as np
from prophet import Prophet
import matplotlib.pyplot as plt

次に、時系列データを作成し、Prophetで予測を行います。

以下は架空の感染症拡大データの例です。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# データの作成
data = pd.DataFrame({
'ds': pd.date_range(start='2023-01-01', periods=180, freq='D'),
'y': np.concatenate([np.random.randint(100, 1000, size=90), np.random.randint(1000, 5000, size=90)])
})

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

# モデルの学習
model.fit(data)

# 予測のためのデータフレーム作成
future = model.make_future_dataframe(periods=30)

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

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

1
2
3
4
5
6
# 予測結果のグラフ化
fig = model.plot(forecast)
plt.title('Infectious Disease Spread Forecast')
plt.xlabel('Date')
plt.ylabel('Number of Cases')
plt.show()

このコードを実行すると、感染症の拡大予測のグラフが表示されます。

[実行結果]

ここでは架空のデータを使用しましたが、実際の感染症データを同様の方法で扱うことができます。

結果のグラフから、将来の感染症の拡大傾向を視覚的に把握することができます。

コード解説

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

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

1
2
3
4
import pandas as pd
import numpy as np
from prophet import Prophet
import matplotlib.pyplot as plt

必要なライブラリをインポートしています。

pandasはデータ操作のために、numpyは数値計算のために、Prophetは時系列予測のために、matplotlibはグラフ化のために使用されます。

2. データの作成:

1
2
3
4
data = pd.DataFrame({
'ds': pd.date_range(start='2023-01-01', periods=180, freq='D'),
'y': np.concatenate([np.random.randint(100, 1000, size=90), np.random.randint(1000, 5000, size=90)])
})

ここでは、180日間の時系列データを作成しています。

‘ds’列には日付が、’y’列には架空の感染症のケース数が入力されています。

最初の90日間は100から1000の範囲の乱数で、残りの90日間は1000から5000の範囲の乱数でデータが生成されています。

3. モデルの初期化と学習:

1
2
model = Prophet(daily_seasonality=True)
model.fit(data)

Prophetモデルを初期化し、daily_seasonalityをTrueに設定して日次の季節性をモデルに含めます。

その後、作成したデータを使用してモデルを学習させます。

4. 予測のためのデータフレーム作成:

1
future = model.make_future_dataframe(periods=30)

モデルによる予測を行うための、未来の日付を含むデータフレームを作成します。

ここでは、30日分の日付が追加されたデータフレームを作成しています。

5. 予測の実行:

1
forecast = model.predict(future)

作成した未来の日付を持つデータフレームを使用して、Prophetモデルによる予測を実行します。

予測結果はforecastに格納されます。

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

1
2
3
4
5
fig = model.plot(forecast)
plt.title('Infectious Disease Spread Forecast')
plt.xlabel('Date')
plt.ylabel('Number of Cases')
plt.show()

予測結果をグラフ化して表示します。model.plot()関数は予測結果をグラフとして描画します。

plt.title()plt.xlabel()、およびplt.ylabel()関数でグラフにタイトルと軸ラベルを設定し、plt.show()でグラフを表示します。

結果解説

実行結果として表示されるグラフの詳細な説明を示します。

1. x軸 (Date):

グラフの横軸は日付(Date)を表しています。
時系列データのため、日付ごとにデータがプロットされています。
元のデータと予測の期間が表示されています。

2. y軸 (Number of Cases):

グラフの縦軸は感染症のケース数(Number of Cases)を表しています。
この軸に沿って、感染症のケース数の推移が示されています。

3. 青い点線(Observed Data):

グラフ上に描かれた青い点線は実際の観測データを示しています。
元のデータセットに含まれる感染症のケース数が点線でプロットされています。

4. 青い曲線(Trend):

青い曲線は感染症のケース数のトレンド(Trend)を表しています。
これは元のデータから学習されたトレンドを示しており、将来の動向を予測するための基準となります。

5. 黒い点線(Forecast):

黒い点線は未来の期間における感染症のケース数の予測を示しています。
これにより、モデルが予測した将来の動向を示しています。

6. ライトブルーの領域(Uncertainty Interval):

ライトブルーの領域は予測の不確かさを示しています。
モデルが予測する未来のケース数の幅を示しており、不確かな要因が影響する可能性を示唆しています。

7. 土曜日(Saturday)のウィークリーシーズナリティ(Weekly Seasonality):

グラフ上に土曜日ごとに現れる縦の帯があります。
これは週ごとの周期性を表しており、感染症の週末と平日のパターンを示しています。

このグラフは、元のデータから学習されたトレンドと週次パターンをもとに、未来の感染症の拡大傾向を予測したものです。

不確かさの範囲も考慮されており、将来の予測の信頼性がどれだけあるかを示しています。

Prophet

Prophetとは

Prophetは、Facebookが開発した時系列データの予測ツールであり、特に季節性やトレンドを考慮した予測を行うことに特化しています。

Prophetは、ビジネスや研究などで時系列データを扱う際に非常に便利なツールです。

以下に、Prophetライブラリの主な特徴と使い方についての情報を提供します。

主な特徴

  1. 容易な使用:
    ProphetはユーザーフレンドリーなAPIを提供しており、比較的簡単にモデルを構築し、予測を行うことができます。

  2. 季節性とトレンドのモデリング:
    季節的な変動やトレンドを柔軟にモデル化することができます。
    祝日や特別なイベントも組み込むことができます。

  3. 自動的な特徴量生成:
    Prophetは季節性やトレンドのパターンを自動的に検出し、特徴量を生成します。

  4. 外れ値の取り扱い:
    Prophetは外れ値に対して頑健なモデルを提供し、外れ値が予測結果に与える影響を最小限に抑えることができます。

  5. 拡張性:
    PythonとRの両方で利用可能であり、カスタムモデルの開発も可能です。

使い方

  1. データの準備:
    時系列データをPandasのDataFrameとして準備します。
    少なくとも「ds」(日付)と「y」(ターゲット変数)の2つの列が必要です。

  2. モデルの構築:
    Prophetオブジェクトを初期化し、モデルを構築します。
    季節性やトレンドのカスタマイズ、祝日の追加などを行うことができます。

  3. 未来の予測:
    未来の日付を含むDataFrameを作成し、その日付に対する予測を行います。

  4. 結果の可視化:
    Prophetは結果をプロットするための便利なメソッドを提供します。
    これにより、予測結果を視覚的に理解しやすくなります。

こうした特徴と使い方により、Prophetはビジネスや研究分野で時系列データの予測に利用されています。

ただし、データの前処理やモデルの調整は適切に行う必要があります。

解決できる現実的な問題

Prophetを使用して解決できる現実的な問題のいくつかを挙げてみましょう。

  1. 売上予測:
    小売店の日次売上を予測して在庫管理やプロモーション計画を最適化する。

  2. ウェブトラフィック予測:
    ウェブサイトのアクセス数を予測してサーバーリソースを適切に割り当てる。

  3. エネルギー需要予測:
    電力消費の予測を行い、発電計画やエネルギー供給を調整する。

  4. 株価予測:
    株式市場のデータを使用して将来の株価変動を予測する。

  5. 天候予測:
    気象データを元に未来の気温や降水量などを予測する。

  6. トレンド予測:
    製品の需要トレンドを予測して製造計画を立てる。

  7. 人口統計予測:
    人口データを使用して将来の人口変動を予測する。

  8. 感染症拡大予測:
    感染症のデータを元に感染拡大の予測を行う(特にトレンドや季節性の影響を考慮)。

  9. 交通量予測:
    道路や公共交通機関の利用データを使って交通量を予測する。

  10. 旅行需要予測:
    航空会社やホテルが将来の需要を予測し、価格設定や予約管理を最適化する。

これらの問題は、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
import pandas as pd
from prophet import Prophet
import matplotlib.pyplot as plt

# 入力データの準備
data = pd.DataFrame({
'ds': pd.to_datetime(['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04', '2023-01-05']),
'y': [1000, 1200, 900, 1100, 1050]
})

# モデルの初期化と学習
model = Prophet()
model.fit(data)

# 未来の日付を予測
future = model.make_future_dataframe(periods=7) # 7日分の未来の日付を作成
forecast = model.predict(future)

# 予測結果を表示
print(forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']])

# 予測結果をプロット
fig = model.plot(forecast)
plt.xlabel("Date")
plt.ylabel("Sales")
plt.title("Sales Forecast")
plt.show()

このコードでは、手動でデータを準備しています。

実際の場面ではCSVファイルなどからデータを読み込むことが一般的です。

ここでは5日分の売上データを用いて7日後までの売上を予測しています。

予測結果はDataFrameとして表示し、またグラフとしてもプロットしています。

[実行結果]

これを参考にして、自分のデータに合わせてProphetを使って予測を行う際の基本的な手順を理解していただければと思います。

品質管理 scikit-learn

品質管理

製造工程の品質管理の例として、製造ラインで生成される製品の特徴量データを用いて、不良品を検出するモデルを構築することを考えてみましょう。

以下は、その一例です。

問題の設定: 製造工程の不良品検出

製造ラインで生成される製品の特徴量データを解析し、不良品を検出するためのモデルを構築します。

データには製品のサイズ、重量、温度などの特徴量が含まれます。

ステップ1: データの準備

以下は、ダミーの特徴量データの例です。データには正常品(0)と不良品(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
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import confusion_matrix, classification_report
import matplotlib.pyplot as plt

# ダミーの特徴量データ生成
np.random.seed(42)
num_samples = 200
num_features = 5

data = np.random.rand(num_samples, num_features)
labels = np.random.randint(2, size=num_samples)

df = pd.DataFrame(data, columns=[f'Feature_{i}' for i in range(num_features)])
df['Label'] = labels

# 特徴量とラベルの分割
X = df.drop('Label', axis=1)
y = df['Label']

# 訓練データとテストデータに分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

ステップ2: モデルの構築と評価

ランダムフォレスト分類器を使用してモデルを構築し、テストデータで評価します。

1
2
3
4
5
6
7
8
9
10
11
12
# ランダムフォレスト分類モデルの構築
model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X_train, y_train)

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

# 混同行列と分類レポートの表示
conf_matrix = confusion_matrix(y_test, y_pred)
class_report = classification_report(y_test, y_pred)
print("Confusion Matrix:\n", conf_matrix)
print("\nClassification Report:\n", class_report)

ステップ3: 結果の可視化

混同行列をヒートマップで可視化します。

1
2
3
4
5
6
7
8
import seaborn as sns

plt.figure(figsize=(6, 4))
sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues')
plt.xlabel('Predicted Labels')
plt.ylabel('True Labels')
plt.title('Confusion Matrix')
plt.show()

このヒートマップは、予測結果の混同行列を視覚化し、正常品と不良品の予測の正確さを示します。

[実行結果]

ソースコード解説

上記のソースコードは、ランダムフォレスト分類器を使用してダミーの特徴量データを分析し、混同行列と分類レポートを表示し、混同行列をヒートマップで可視化する一連の手順を実行するものです。

各部分の詳細を説明します。

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

    • np.random.seed(42): 乱数のシードを設定し、結果の再現性を確保します。
    • num_samples, num_features: ダミーデータのサンプル数と特徴量の数を定義します。
    • data: num_samples × num_features のランダムな特徴量データを生成します。
    • labels: ダミーのラベルを生成します(0または1)。
    • df: ランダムな特徴量データとラベルを結合したデータフレームを作成します。
  2. 訓練データとテストデータの分割:

    • X: ラベルを除いた特徴量データを選択します。
    • y: ラベルを選択します。
    • train_test_split: データを訓練データとテストデータに分割します。
      ここでは、テストデータの割合を0.2に設定しています。
  3. モデルの構築:

    • RandomForestClassifier: ランダムフォレスト分類器をインスタンス化します。
      ここでは100個の決定木を使ってモデルを構築します。
    • model.fit(X_train, y_train): 訓練データを使用してモデルを学習させます。
  4. テストデータの予測:

    • model.predict(X_test): テストデータを使用してモデルが予測するラベルを取得します。
  5. 混同行列と分類レポートの表示:

    • confusion_matrix(y_test, y_pred): 実際のラベル(y_test)と予測されたラベル(y_pred)から混同行列を計算します。
    • classification_report(y_test, y_pred): 適合率、再現率、F1スコアなどの分類レポートを計算します。
  6. 混同行列のヒートマップの可視化:

    • sns.heatmap: Seabornライブラリを使用して、混同行列をヒートマップとして可視化します。
    • annot=True: セル内に数値を表示します。
    • fmt='d': 数値のフォーマットを整数(デジット)に設定します。
    • cmap='Blues': ヒートマップの色のスキームを設定します。
    • plt.xlabel, plt.ylabel, plt.title: 軸ラベルとタイトルを設定します。

これにより、モデルの性能評価と混同行列の可視化が行われます。

混同行列は、実際のラベルと予測されたラベルの関係を示し、分類モデルの性能を詳細に理解するための重要な情報を提供します。

結果解説

実行結果としては、分類モデルの性能を示す混同行列(Confusion Matrix)分類レポート(Classification Report)が表示されます。

これらの結果を詳しく説明します。

Confusion Matrix:

1
2
[[15  7]
[ 8 10]]

混同行列は、正解ラベル(True Labels)と予測ラベル(Predicted Labels)を比較したものです。

行は実際のラベルを、列は予測されたラベルを表しています。

この行列の要素は以下のようになります。

  • 左上のセル (15) は、実際のラベルが0(正常品)であり、モデルが予測したラベルも0(正常品)だったデータの数を示します。
  • 右上のセル (7) は、実際のラベルが0(正常品)であり、モデルが予測したラベルが1(不良品)だったデータの数を示します。
  • 左下のセル (8) は、実際のラベルが1(不良品)であり、モデルが予測したラベルが0(正常品)だったデータの数を示します。
  • 右下のセル (10) は、実際のラベルが1(不良品)であり、モデルが予測したラベルも1(不良品)だったデータの数を示します。

Classification Report:

1
2
3
4
5
6
7
8
              precision    recall  f1-score   support

0 0.65 0.68 0.67 22
1 0.59 0.56 0.57 18

accuracy 0.62 40
macro avg 0.62 0.62 0.62 40
weighted avg 0.62 0.62 0.62 40

分類レポートは、各クラス(正常品と不良品)の適合率(precision)再現率(recall)F1スコア(f1-score)などの性能指標を示します。

以下は各指標の説明です。

  • Precision (適合率):
    予測した正例(不良品)のうち、実際に正例だった割合です。
    クラス0(正常品)とクラス1(不良品)のそれぞれに対して計算されます。
  • Recall (再現率):
    実際の正例(不良品)のうち、モデルが正例と予測した割合です。
    クラス0とクラス1のそれぞれに対して計算されます。
  • F1-score:
    適合率と再現率の調和平均であり、両指標のバランスを示します。
  • Support:
    各クラスのサンプル数を示します。
  • Accuracy:
    全てのサンプルに対する正確な予測の割合です。

マクロ平均(macro avg)は、クラスごとの指標の平均を取ります。

ウェイト付き平均(weighted avg)は、各クラスのサポート(サンプル数)に応じて加重平均を取ります。

この結果を見ると、精度(accuracy)は0.62であり、正確な予測の割合が62%であることがわかります。

適合率再現率F1スコアは各クラスごとに計算され、各クラスの性能を示しています。

地震発生パターン・クラスタリング scikit-learn

地震発生パターン・クラスタリング

地震の発生予測は非常に複雑な問題であり、現時点では確実な予測は困難です。

地震の発生は地球の地殻の複雑な動きによるものであり、さまざまな要因が影響を与えます。

従って、地震の予測はscikit-learnなどの単純な機械学習ライブラリだけでは達成できるものではありません。


ただし、地震データの解析震源推定など、地震の研究には機械学習を応用することがあります。

以下は、地震データのクラスタリングを例として示します。

これは地震の発生パターンを把握するために用いられる手法の一つです。

まず、以下のような仮想的な地震データを生成します:

1
2
3
4
5
6
7
8
9
10
import numpy as np

# 仮想的な地震データを生成
np.random.seed(0)
num_samples = 500
latitude = np.random.uniform(low=30, high=40, size=num_samples)
longitude = np.random.uniform(low=130, high=140, size=num_samples)
magnitude = np.random.uniform(low=4.0, high=7.5, size=num_samples)

data = np.column_stack((latitude, longitude, magnitude))

次に、scikit-learnのKMeansを用いて地震データをクラスタリングします:

1
2
3
4
5
6
7
from sklearn.cluster import KMeans

# KMeansによるクラスタリング
num_clusters = 5
kmeans = KMeans(n_clusters=num_clusters)
kmeans.fit(data)
cluster_labels = kmeans.predict(data)

最後に、クラスタリング結果を散布図でグラフ化します:

1
2
3
4
5
6
7
8
import matplotlib.pyplot as plt

# グラフ化
plt.scatter(data[:, 1], data[:, 0], c=cluster_labels, cmap='rainbow', alpha=0.7)
plt.xlabel('Longitude')
plt.ylabel('Latitude')
plt.title('Earthquake Clustering')
plt.show()

この例では、仮想的な地震データを生成し、そのデータをKMeansアルゴリズムでクラスタリングしています。

ただし、これは地震予測ではなく、地震データの解析・可視化に関する簡単な例です。

地震予測には、より高度な手法や複数のデータソースを組み合わせた専門的なアプローチが必要です。

[実行結果]

ソースコード解説

上記のソースコードは、仮想的な地震データを生成し、そのデータをKMeansアルゴリズムを用いてクラスタリングしています。

このソースコードを詳しく説明します。

1. データの生成:

最初に、仮想的な地震データを生成します。このデータは3つの列からなります。

  • 列1(緯度): 30から40の範囲でランダムな緯度を500個生成します。
  • 列2(経度): 130から140の範囲でランダムな経度を500個生成します。
  • 列3(マグニチュード): 4.0から7.5の範囲でランダムなマグニチュード(地震の大きさ)を500個生成します。

2. KMeansによるクラスタリング:

次に、scikit-learnのKMeansアルゴリズムを使用してデータをクラスタリングします。
KMeansアルゴリズムは非教師あり学習の一つで、データを指定されたクラスタ数に分割します。
クラスタリングは次の手順で行われます:

  • データポイントをランダムに選んでクラスタの中心を初期化します。
  • 各データポイントを最も近いクラスタの中心に割り当てます。
  • クラスタの中心を再計算します。
  • 上記の2つのステップを繰り返します。中心の変化が小さくなるか、最大反復回数に達するまで続けます。

3. グラフ化:

最後に、クラスタリング結果を散布図としてグラフ化します。
緯度がy軸、経度がx軸になります。
各データポイントはクラスタに基づいて異なる色で表示されます。
同じ色のデータポイントは同じクラスタに所属しています。

この結果を通じて、KMeansアルゴリズムが地震データをいくつかのクラスタに分割したことがわかります。

各クラスタは地震データの特徴的なパターンを表していると考えることができます。

ただし、今回の例は仮想的なデータを用いた簡単なクラスタリングであり、実際の地震の予測や解析にはより高度な手法と実際の地震データが必要です。

欠損値補完 scikit-learn

欠損値補完

ある企業の従業員に関するデータがあり、その中で給与(Salary)が一部欠損している場合を考えます。

この欠損値をscikit-learnを使用して補完する問題を以下に示します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import numpy as np
import pandas as pd
from sklearn.impute import SimpleImputer

# 仮想的なデータセットを作成
data = {
'Employee_ID': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
'Age': [30, 25, 35, 22, 28, 40, np.nan, 45, 32, 38],
'Years_of_Experience': [8, 4, 10, 2, 6, 12, 5, 15, 9, np.nan],
'Salary': [50000, 40000, 60000, 35000, 45000, 70000, np.nan, 80000, np.nan, 65000]
}

df = pd.DataFrame(data)

# 欠損値補完
imputer = SimpleImputer(strategy='mean')
df_imputed = pd.DataFrame(imputer.fit_transform(df), columns=df.columns)

# 補完前後のデータの表示
print("補完前のデータ:")
print(df)
print("\n補完後のデータ:")
print(df_imputed)

上記のコードでは、SimpleImputerを使用して欠損値を平均値で補完しています。

strategy='mean'とすることで、平均値を使って欠損値を補完します。

このコードを実行すると、補完前のデータと補完後のデータが表示されます。

補完後のデータでは、欠損値が平均値で補完されていることが確認できるでしょう。

[実行結果]

ソースコード解説

このコードは、NumPyPandasを使用して仮想的なデータセットを作成し、scikit-learnのSimpleImputerを使って欠損値を平均値で補完しています。

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

1. import numpy as np:

NumPyライブラリをnpとしてインポートします。
NumPyは数値計算を行うためのPythonライブラリです。

2. import pandas as pd:

Pandasライブラリをpdとしてインポートします。
Pandasはデータ操作や分析を行うためのPythonライブラリで、データフレームというデータ構造を提供します。

3. from sklearn.impute import SimpleImputer:

scikit-learnのimputeモジュールからSimpleImputerをインポートします。
SimpleImputerは欠損値補完を行うためのクラスです。

4. data:

仮想的なデータセットを辞書型で定義します。
このデータセットには、従業員のID(Employee_ID)、年齢(Age)、経験年数(Years_of_Experience)、給与(Salary)が含まれています。
np.nanは欠損値を示す特別な値です。

5. df:

PandasのDataFrameを使って、上記のデータセットを作成します。

6. imputer = SimpleImputer(strategy='mean'):

SimpleImputerクラスのインスタンスを作成します。
strategy='mean'とすることで、平均値を使って欠損値を補完する設定にします。

7. df_imputed = pd.DataFrame(imputer.fit_transform(df), columns=df.columns):

SimpleImputerを用いて、dfの欠損値を補完します。
fit_transformメソッドを使って、補完処理を行い、新しいデータフレームdf_imputedに補完後のデータを格納します。

8. print("補完前のデータ:")およびprint("補完後のデータ:"):

補完前と補完後のデータを表示するためのメッセージを出力します。

9. print(df)およびprint(df_imputed):

dfdf_imputedの中身を表示します。
これにより、補完前後のデータがわかります。

このコードでは、欠損値があるデータを補完する方法として、SimpleImputerを使って平均値で補完しています。

ソーシャルメディア感情分析 scikit-learn

ソーシャルメディア感情分析

ソーシャルメディア感情分析の例題として、Twitterのツイートデータを使用して、テキストデータから感情(ポジティブ、ネガティブ、またはニュートラル)を予測する方法を示します。

感情分析には、自然言語処理の手法と機械学習アルゴリズムを組み合わせます。

まず、必要なライブラリをインポートします。

1
2
3
4
5
6
7
8
9
10
11
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import re
import nltk
from nltk.corpus import stopwords
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report

次に、Twitterの感情分析用のサンプルデータを用意します。

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
data = {
'text': [
"I love this product, it's amazing!",
"This movie was terrible, never watching it again!",
"Neutral tweet about some topic.",
"The weather is beautiful today.",
"Had a great time at the beach with friends!",
"Feeling tired after a long day at work.",
"Excited for the upcoming vacation!",
"Disappointed with the customer service.",
"Trying out a new recipe for dinner tonight.",
"Can't wait to see my favorite band in concert!",
"Feeling happy and grateful for all the love and support.",
"Feeling overwhelmed with deadlines and tasks.",
"Just finished reading a fantastic book!",
"Feeling bored, looking for something fun to do.",
"Feeling anxious about the job interview tomorrow.",
"Enjoying a relaxing weekend at home.",
"Feeling proud of my accomplishments.",
"The traffic today is unbearable!",
"Feeling lonely on a rainy day.",
"Delighted to meet an old friend unexpectedly.",
"Feeling frustrated with the slow internet connection.",
"Had a bad experience at the restaurant tonight.",
"Feeling motivated to achieve my goals.",
"Feeling nostalgic looking at old photos.",
"Feeling grateful for the little things in life.",
"Feeling sad after saying goodbye to a dear friend.",
"Excited for the new season of my favorite TV show!",
"Feeling stressed about the upcoming exam.",
"The new gadget I bought is not working properly.",
],
'sentiment': [
'positive', 'negative', 'neutral', 'positive', 'positive', 'negative', 'positive',
'negative', 'positive', 'positive', 'positive', 'negative', 'positive', 'negative',
'negative', 'positive', 'positive', 'negative', 'negative', 'positive', 'negative',
'negative', 'positive', 'positive', 'positive', 'negative', 'positive', 'negative',
'positive'
]
}

df = pd.DataFrame(data)

テキストデータを前処理します。

ストップワードの削除、記号や数字の削除、すべての文字を小文字に変換などの処理を行います。

1
2
3
4
5
6
7
8
9
10
11
12
nltk.download('stopwords')
stop_words = set(stopwords.words('english'))

def preprocess_text(text):
text = re.sub('[^a-zA-Z]', ' ', text)
text = text.lower()
text = text.split()
text = [word for word in text if not word in stop_words]
text = ' '.join(text)
return text

df['text'] = df['text'].apply(preprocess_text)

次に、テキストデータを数値ベクトル化します。

1
2
3
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(df['text'])
y = df['sentiment']

データセットをトレーニングセットとテストセットに分割します。

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

Naive Bayesアルゴリズムを使用して感情分析モデルを学習します。

1
2
clf = MultinomialNB()
clf.fit(X_train, y_train)

テストセットで予測を行い、結果を評価します。

1
2
3
4
y_pred = clf.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.2f}")
print(classification_report(y_test, y_pred))

これで、ソーシャルメディア感情分析モデルのトレーニングと評価が完了しました。

最後に、結果をグラフ化します。

感情ごとの分類数を棒グラフで表示します。

1
2
3
4
5
sns.countplot(x='sentiment', data=df)
plt.xlabel('Sentiment')
plt.ylabel('Count')
plt.title('Sentiment Analysis Result')
plt.show()

これにより、ソーシャルメディア感情分析のモデルの予測結果を視覚化できます。

棒グラフで表示される感情のカウントを確認することができます。

[実行結果]

ソースコード解説

このコードは、感情分析(Sentiment Analysis)を行うためのプログラムです。

感情分析は、テキストデータから感情や意見を抽出するための自然言語処理の一種です。


まず、必要なライブラリをインポートしています。

numpyは数値計算を行うためのライブラリ、pandasはデータ解析を行うためのライブラリ、matplotlibseabornはデータの可視化を行うためのライブラリです。

また、テキストの前処理に使用するためにrenltkもインポートしています。


次に、感情分析のためのデータを定義しています。

dataという辞書型の変数に、テキストと感情のペアを格納しています。

このデータは、感情分析のためのトレーニングデータとして使用されます。

その後、pandasDataFrameオブジェクトを使用して、データを表形式で扱えるようにしています。

DataFrameは、行と列からなるデータ構造で、この場合はテキストと感情の2つの列があります。


次に、テキストの前処理を行うための関数preprocess_textを定義しています。

この関数では、テキストから不要な文字を削除し、小文字に変換し、ストップワード(一般的な単語や語句)を除外しています。

これにより、テキストデータをより扱いやすい形式に変換します。

その後、preprocess_text関数をapplyメソッドを使ってデータフレームのtext列に適用し、テキストの前処理を行っています。


次に、CountVectorizerクラスを使用してテキストデータをベクトル化しています。

CountVectorizerは、テキストデータを単語の出現回数を表すベクトルに変換するためのクラスです。

fit_transformメソッドを使用することで、テキストデータをベクトル化しています。

その後、データをトレーニングデータとテストデータに分割しています。

train_test_split関数を使用することで、データを指定した割合で分割することができます。


次に、MultinomialNBクラスを使用してナイーブベイズ分類器を作成し、トレーニングデータを用いてモデルを学習させています。

学習が完了したら、テストデータを用いて予測を行い、予測結果の正確さを評価しています。

accuracy_score関数を使用することで、予測結果の正確さを計算しています。

また、classification_report関数を使用することで、クラスごとの適合率、再現率、F1スコアなどの評価指標を表示しています。

最後に、感情のカウントを可視化するために、seaborncountplot関数を使用して棒グラフを作成し、matplotlibを使用してグラフを表示しています。

これにより、各感情の出現回数を視覚的に確認することができます。


このコードは、テキストデータから感情を分析し、予測するための基本的な手法を示しています。

感情分析は、レビューやソーシャルメディアの投稿など、さまざまな応用分野で活用されています。

結果解説

以下にそれぞれの指標を説明します。

1. Accuracy (正解率): 0.50

正解率は、全体の予測のうち、正しく分類されたサンプルの割合を示します。
この場合、正解率は50%です。
つまり、テストセットの6つのツイートのうち、3つが正しく分類され、3つが間違って分類されました。

2. Precision (適合率):

適合率は、モデルがポジティブ(positive)と予測したサンプルのうち、実際にポジティブだったサンプルの割合を示します。
negative(ネガティブ)に関しては25%の適合率で、positive(ポジティブ)に関しては100%の適合率です。
つまり、negativeの予測は1つだけ正確であり、positiveの予測は全て正確でした。

3. Recall (再現率):

再現率は、実際にポジティブなサンプルのうち、モデルがポジティブと予測したサンプルの割合を示します。
negativeに関しては100%の再現率で、positiveに関しては40%の再現率です。
つまり、negativeの全てのサンプルを正確に予測し、positiveのうち40%のサンプルを正確に予測しました。

4. F1-score (F1スコア):

F1スコアは、適合率と再現率の調和平均です。
F1スコアが高いほど、適合率と再現率の両方がバランスよく高いことを示します。
この場合、negativeに関しては0.40のF1スコアで、positiveに関しては0.57のF1スコアです。

5. Support (サポート):

Supportは各クラスのサンプル数を示します。
negativeのサポートは1で、positiveのサポートは5です。
つまり、negativeのテストデータは1つだけで、positiveのテストデータは5つあります。


総合的に見ると、この感情分析モデルは、negativeクラスの予測においては一部のサンプルを正確に予測しましたが、positiveクラスの予測には改善の余地があります。

モデルの性能を向上させるためには、データの増加や特徴抽出方法の改善、より高度な機械学習アルゴリズムの使用などが考えられます。

また、評価結果を可視化することで、モデルの性能を把握し、改善点を見つけるのに役立ちます。

サッカーの試合結果 scikit-learn

サッカーの試合結果

サッカーの試合結果を予測する問題を考えてみましょう。

ここでは、チームの過去の試合データを用いて、2つのチームの対戦結果を予測する回帰問題としてアプローチします。

Scikit-learnのLinearRegressionを使用して線形回帰モデルを作成し、試合の得点差を予測します。

サンプルデータとして、2つのチームの過去の対戦データを用意し、それを使ってモデルを構築します。

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
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression

# ダミーデータ: 過去の対戦データ
# (チーム1の得点, チーム2の得点, チーム1が勝利したかどうか(1:勝利, 0:引き分け・敗北))
data = np.array([
[1, 3, 0],
[2, 2, 0],
[3, 1, 1],
[4, 0, 1],
[0, 0, 0],
[1, 1, 0],
[2, 0, 1],
[0, 3, 0],
[1, 2, 0],
[2, 2, 0],
])

# 訓練データとテストデータに分割
X = data[:, :2] # チーム1とチーム2の得点
y = data[:, 2] # 勝利フラグ

# 線形回帰モデルの作成と学習
model = LinearRegression()
model.fit(X, y)

# テストデータの予測
X_test = np.array([[3, 2], [1, 0]])
y_pred = model.predict(X_test)

print("予測結果:", y_pred)

# 予測結果のグラフ化
plt.figure(figsize=(8, 4))
plt.scatter(X[:, 0], X[:, 1], c=y, cmap='coolwarm', edgecolors='k', marker='o', s=100)
plt.scatter(X_test[:, 0], X_test[:, 1], c=y_pred, cmap='coolwarm', edgecolors='k', marker='x', s=100)
plt.xlabel('Team 1 Score')
plt.ylabel('Team 2 Score')
plt.title('Soccer Match Prediction')
plt.colorbar(label='Prediction')
plt.grid(True)
plt.show()

この例では、過去の対戦データからチーム1とチーム2の得点を使って、勝利したかどうかを予測しています。

テストデータとして、[3, 2]と[1, 0]の2試合の得点が与えられており、それぞれの試合の結果を予測しています。

結果をプロットすると、チームの得点が高いほど勝利しやすい傾向が見られることがわかります。

[実行結果]

注意: このサンプルデータはダミーデータであり、実際のデータには多くの要素が影響します。

実際の予測には多くの特徴量(例えば、選手の実力、試合場所、天候など)を考慮に入れる必要があります。

ソースコード解説

このコードは、線形回帰モデルを使用してサッカーの試合結果を予測する簡単な例を示しています。

詳細を以下に説明します:

1. import文:

必要なライブラリをインポートしています。
numpyは数値計算ライブラリ、matplotlib.pyplotはグラフ描画ライブラリ、sklearn.linear_model.LinearRegressionはScikit-learnの線形回帰モデルを意味します。

2. data:

ダミーデータを定義しています。
dataは10行3列の行列で、各行がサッカーの試合の情報を示しています。
1列目と2列目は、それぞれチーム1とチーム2の得点を表し、3列目はチーム1が勝利したかどうかを示すフラグ(1: 勝利、0: 引き分け・敗北)です。

3. Xy:

Xは訓練データで、チーム1とチーム2の得点を格納しています。
yは目的変数で、チーム1の勝利フラグを格納しています。

4. model:

線形回帰モデルを作成します。
LinearRegression()で線形回帰オブジェクトを作成し、modelに代入します。

5. model.fit(X, y):

Xyを使って線形回帰モデルを学習させます。
これにより、訓練データを元にモデルのパラメータ(重みと切片)が最適化されます。

6. X_testy_pred:

テストデータであるX_testに対して、学習済みのモデルで予測を行います。
model.predict(X_test)で予測値を取得し、y_predに代入します。

7. plt.scatter:

Xyの散布図と、テストデータX_testと予測値y_predの散布図を描画します。
各チームの得点をx軸とy軸にプロットし、c引数でyy_predの値に応じて色を変え、勝利フラグによって点の形状を変えています。

8. plt.xlabel, plt.ylabel, plt.title:

x軸、y軸、タイトルのラベルを設定します。

9. plt.colorbar:

予測値の色に対応するカラーバーを表示します。

10. plt.grid:

グリッドを表示します。

11. plt.show():

グラフを表示します。

このコードでは、ダミーデータを使って線形回帰モデルを学習させ、チーム1とチーム2の得点から勝利フラグを予測する例を示しています。

実際のデータに応じて、特徴量や目的変数を適切に設定して、より高度な予測モデルを構築することができます。

金融不正取引検出 scikit-learn

金融不正取引検出

金融取引の不正行為を検出する問題は、クラス不均衡なデータセットを扱うことが一般的です。

ここでは、scikit-learnを使用してランダムフォレストを適用して不正行為を検出する例を示します。

まず、ダミーのデータを用意します。

不正行為は通常レアケースなので、不正行為の例が多く含まれるデータを生成します。

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 pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, confusion_matrix, plot_confusion_matrix

# ダミーのデータを生成(0: 正常取引, 1: 不正取引)
np.random.seed(42)
num_samples = 1000
data = {
'取引金額': np.random.normal(loc=100, scale=20, size=num_samples),
'不正行為': np.random.randint(0, 2, num_samples)
}
df = pd.DataFrame(data)

# データを特徴量(X)とターゲット(y)に分割
X = df.drop(columns=['不正行為'])
y = df['不正行為']

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

次に、ランダムフォレストモデルをトレーニングし、テストデータを用いて予測を行います。

1
2
3
4
5
6
7
8
9
10
# ランダムフォレストモデルの作成とトレーニング
rf_model = RandomForestClassifier(random_state=42)
rf_model.fit(X_train, y_train)

# テストデータを使った予測
y_pred = rf_model.predict(X_test)

# 正解率の評価
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.2f}")

最後に、混同行列をグラフ化して結果を分かりやすく表示します。

1
2
3
4
5
6
7
8
# 混同行列の作成
conf_matrix = confusion_matrix(y_test, y_pred)

# 混同行列のグラフ化
plt.figure(figsize=(6, 4))
plot_confusion_matrix(rf_model, X_test, y_test, cmap=plt.cm.Blues, display_labels=['normal', 'abnormal'])
plt.title('Confusion Matrix')
plt.show()

これにより、ランダムフォレストを用いて不正行為の検出が行われます。

混同行列は、実際のクラスと予測されたクラスの対応を視覚化するのに役立ちます。

不正行為の検出はクラス不均衡な問題なので、適切な評価指標(Precision、Recall、F1-scoreなど)の使用が重要です。

[実行結果]

ソースコード解説

処理の詳細は以下の通りです。

1. ダミーデータの生成:

  • np.random.normal(loc=100, scale=20, size=num_samples)により、平均が100、標準偏差が20の正規分布に従う取引金額データが生成されます。
  • np.random.randint(0, 2, num_samples)により、0と1からなる不正行為のデータ(0が正常取引、1が不正取引)が生成されます。
  • dfには、取引金額と不正行為のデータが含まれたDataFrameが格納されます。

2. データの分割:

  • train_test_splitを使用して、データセットをトレーニングセットとテストセットに分割します。
    ここでは、トレーニングセットが80%、テストセットが20%になるように分割しています。

3. モデルのトレーニングと予測:

  • RandomForestClassifierを使用して、ランダムフォレストモデルを作成します。
    ランダムフォレストは、複数の決定木を組み合わせるアンサンブル学習の一種です。
  • rf_model.fit(X_train, y_train)により、トレーニングデータを使用してモデルをトレーニングします。
  • rf_model.predict(X_test)により、テストデータを使って不正行為を予測します。

4. 正解率の評価:

  • accuracy_score(y_test, y_pred)により、テストデータの予測結果(y_pred)と真のラベル(y_test)を比較し、正解率を計算します。
  • 正解率は、予測が全体のテストデータのうちどれだけ正確に分類されたかを示す指標です。

5. 混同行列のグラフ化:

  • confusion_matrix(y_test, y_pred)により、テストデータを使って作成した予測結果と真のラベルを用いて混同行列が作成されます。
  • plot_confusion_matrixを使用して混同行列をグラフ化し、実際のクラスと予測されたクラスの対応を視覚化します。

このようにして、ランダムフォレストモデルを使用して不正行為を検出し、評価指標を用いてモデルの性能を評価しています。

データの性質や使用するアルゴリズムによっては、他の評価指標(Precision、Recall、F1-scoreなど)を使うことが適切な場合もあります。

また、実際の運用ではさまざまな前処理やモデルチューニングが必要になることを考慮してください。