データ分析実践:PythonとScikit-learnで始める予測モデル入門
はじめに:データ分析における「予測」の魅力
データ分析を進める上で、過去や現在のデータを理解するだけでなく、将来の出来事や未知の値を予測することに興味を持つ方も多いのではないでしょうか。例えば、商品の需要予測、株価の変動予測、顧客の行動予測など、予測はビジネスや研究において非常に価値のある分析手法です。
予測モデルの構築と聞くと難しく感じるかもしれませんが、基本的な考え方とツールを理解すれば、初心者の方でも実践的に取り組むことができます。この記事では、データ分析で広く使われているプログラミング言語Pythonと、機械学習ライブラリの代表格であるScikit-learn(サイキット・ラーン)を使用して、簡単な予測モデルを作成する最初の一歩を踏み出します。
予測モデルとは何か
予測モデルとは、過去に収集したデータから、将来や未知のデータの値を推測するための数学的なモデルです。データの「パターン」や「関係性」を学習し、それに基づいて予測を行います。
予測には大きく分けて二つの種類があります。
- 回帰(Regression): 数値の予測を行います。例えば、住宅の面積から価格を予測したり、広告費から売上を予測したりする場合に使われます。
- 分類(Classification): カテゴリの予測を行います。例えば、メールの内容からスパムか通常かを判断したり、顧客の属性から購入するかしないかを判断したりする場合に使われます。
今回は、より直感的に理解しやすい回帰、その中でも最も基本的なモデルである線形回帰を例に、予測モデルの構築を実践します。
予測モデル構築の基本的なステップ
予測モデルを作成するプロセスは、一般的に以下のステップで進められます。
- データの準備: 分析に必要なデータを収集し、整理します。欠損値の処理や外れ値の特定など、データの「掃除」(前処理)が重要です。
- モデルの選択: どのような予測を行いたいかに応じて、適切なモデル(線形回帰、決定木、ニューラルネットワークなど)を選びます。
- モデルの学習: 準備したデータの一部(これを「訓練データ」と呼びます)を使って、モデルにデータのパターンや関係性を学習させます。
- 予測: 学習済みのモデルを使って、まだ結果が分かっていない新しいデータに対して予測を行います。
- 評価: 予測の精度がどの程度かを評価します。このとき、学習に使わなかった別のデータ(これを「テストデータ」と呼びます)を使って評価することで、未知のデータに対するモデルの性能を測ることができます。
これらのステップを順に進めることで、精度の高い予測モデルを構築することを目指します。
PythonとScikit-learnを使った簡単な予測モデルの実践
それでは、PythonとScikit-learnを使って、簡単な線形回帰モデルを構築してみましょう。ここでは、「勉強時間」から「試験の点数」を予測するという、非常にシンプルな例を考えます。
まずは、必要なライブラリをインポートします。まだインストールしていない場合は、pip install numpy scikit-learn matplotlib
コマンドでインストールしてください。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
それぞれのライブラリの役割は以下の通りです。
numpy
: 数値計算を効率的に行うためのライブラリです。データの扱いに便利です。matplotlib.pyplot
: グラフを描画するためのライブラリです。データの傾向やモデルの結果を視覚的に確認するのに役立ちます。sklearn.model_selection.train_test_split
: データを訓練用とテスト用に分割するための関数です。sklearn.linear_model.LinearRegression
: 線形回帰モデルを扱うためのクラスです。sklearn.metrics.mean_squared_error
: モデルの性能を評価するための指標の一つ、平均二乗誤差(MSE)を計算する関数です。
次に、予測に使用するサンプルデータを生成します。今回は、現実のデータではなく、線形的な関係に少しノイズを加えた模擬データを作成します。
# サンプルデータの生成
# 例: 勉強時間と試験の点数の関係を模擬
np.random.seed(0) # 乱数のシードを設定し、毎回同じデータが生成されるようにします
X = 2 * np.random.rand(100, 1) # 特徴量 (勉強時間): 0から2時間のランダム値 100個
y = 4 + 3 * X + np.random.randn(100, 1) # 目的変数 (点数): 4 + 3 * X + ノイズ
ここで生成した X
が予測に使う「勉強時間」(特徴量)、y
が予測したい「試験の点数」(目的変数)です。データは100個あります。
次に、モデルの汎化性能(未知のデータに対する予測精度)を正しく評価するために、データを「訓練データ」と「テストデータ」に分割します。
# データを訓練用とテスト用に分割します
# test_size=0.2 は全体の20%をテストデータにするという意味です
# random_stateは分割方法を固定するためのシードです
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
これで、X_train
, y_train
がモデルの学習に使うデータ、X_test
, y_test
が学習後のモデルの評価に使うデータとなりました。
いよいよモデルの構築と学習です。Scikit-learnを使って線形回帰モデルを簡単に定義し、訓練データで学習させます。
# 線形回帰モデルのインスタンス(実体)を作成します
model = LinearRegression()
# 訓練データ (X_train, y_train) を使ってモデルを学習させます
# fit() メソッドを実行することで、モデルがデータからパターンを学びます
model.fit(X_train, y_train)
model.fit()
を実行すると、モデルは X_train
と y_train
の関係性(今回の場合は最適な直線)を学習します。学習が完了したモデルは、これで予測を行う準備ができました。
学習済みモデルを使って、テストデータに対する予測を行ってみましょう。
# テストデータ (X_test) を使って予測を行います
y_pred = model.predict(X_test)
# 例えば、新しい勉強時間に対する予測点数を知りたい場合
# predict() には特徴量を入れる必要があります。ここでは1.5時間の場合を想定します。
new_study_time = np.array([[1.5]]) # 特徴量は二次元配列として渡す必要があります
predicted_score = model.predict(new_study_time)
print(f"勉強時間 1.5時間の場合の予測点数: {predicted_score[0][0]:.2f}点")
これで、モデルが予測した値 y_pred
が得られました。また、実際に未知の入力データ new_study_time
に対する予測も行うことができます。
最後に、モデルの予測性能を評価します。テストデータの実際の値 (y_test
) と、モデルが予測した値 (y_pred
) を比較して、どの程度予測が正確だったかを測ります。評価指標として、今回は平均二乗誤差(Mean Squared Error; MSE)を使います。MSEは、予測値と実際の値の差の二乗の平均であり、値が小さいほど予測精度が高いことを示します。
# テストデータにおける予測性能を評価します
# 平均二乗誤差 (MSE) を計算します
mse = mean_squared_error(y_test, y_pred)
print(f"テストデータにおける平均二乗誤差 (MSE): {mse:.2f}")
MSEの値を確認することで、モデルがおおよそどの程度の誤差で予測を行っているかを把握できます。
最後に、モデルが学習した直線と実際のデータの分布をグラフで確認してみましょう。
# 学習データとテストデータを散布図で表示
plt.scatter(X_train, y_train, color='blue', label='Training data')
plt.scatter(X_test, y_test, color='green', label='Test data')
# モデルが学習した回帰直線を描画
# 全てのXデータ範囲で直線を引くためにX_trainとX_testを結合しソートします
X_combined = np.vstack((X_train, X_test))
X_plot = np.linspace(X_combined.min(), X_combined.max(), 100).reshape(-1, 1)
y_plot = model.predict(X_plot)
plt.plot(X_plot, y_plot, color='red', linewidth=2, label='Regression Line')
plt.xlabel("勉強時間 (時間)")
plt.ylabel("試験の点数")
plt.title("勉強時間と試験の点数の関係と線形回帰モデル")
plt.legend()
plt.grid(True)
#plt.show() # ウェブ記事では通常グラフ画像として表示するため、この行は実行しません
このグラフから、モデルがデータの特徴を捉え、概ね線形的な関係を学習できていることが視覚的に確認できます。
次のステップへ
この記事では、データ分析における予測の基本的な考え方と、PythonおよびScikit-learnを使った最も簡単な線形回帰モデルの構築方法をご紹介しました。
ここからさらに予測分析のスキルを高めるためには、以下のステップに進むことが考えられます。
- 他の予測モデルを学ぶ: 線形回帰以外の様々なモデル(ロジスティック回帰、決定木、ランダムフォレスト、サポートベクターマシン、ニューラルネットワークなど)の仕組みや使い分けを学びます。
- モデルの評価指標を深める: MSE以外にも、MAE(平均絶対誤差)、R^2乗値、分類モデルにおける精度、適合率、再現率などの評価指標があります。分析の目的に応じて適切な指標を選び、モデルの性能を多角的に評価する方法を習得します。
- 特徴量エンジニアリング: 予測モデルの精度は、使用するデータ(特徴量)の質に大きく左右されます。既存のデータから新しい特徴量を作成したり、不要な特徴量を選択したりする技術(特徴量エンジニアリング)は、モデルの性能向上に非常に重要です。
- 前処理のスキル向上: 欠損値のより高度な処理方法、カテゴリ変数の扱い方、データの標準化や正規化など、前処理の技術を磨きます。
これらのステップは、いずれも実践を通して身についていくものです。まずは、今回扱った線形回帰モデルを他の簡単なデータセットで試してみたり、Scikit-learnの公式ドキュメントや他の学習リソースで様々なモデルの例に触れてみたりすることから始めてみましょう。
まとめ
予測分析はデータ分析の強力な応用分野であり、適切に活用することでデータから未来の洞察を得ることが可能になります。PythonとScikit-learnは、予測モデルを構築するための非常に強力で使いやすいツールを提供しています。
この記事でご紹介した線形回帰モデルはあくまで入門ですが、ここから様々なデータとモデルに触れることで、予測分析のスキルを着実に向上させることができます。ぜひ、実際にコードを動かしながら、予測モデル構築の世界を探求してみてください。