SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Python in Excel実務入門:Excelデータ分析の新パラダイム

scikit-learnで始めるExcel版機械学習。予測分析と評価

Python in Excel実務入門:Excelデータ分析の新パラダイム 第4回

WINGSプロジェクト 西 潤史郎[著] / 山田 祥寛[監修]

回帰モデルで売上予測を作る(2)

評価指標の読み方

 ここで、学習したモデルを評価してみましょう。回帰の代表指標として、RMSEとR²を見ます。RMSE(Root Mean Squared Error)とは、実測と予測のずれを二乗して平均し、平方根を取った値です。売上と同じ千円単位で読めます。

 一方、R²(決定係数)とは、売上のばらつきのうち、説明変数でどれだけ説明できているかを示す値です。1に近いほどよく説明できており、当てはまりが悪いと0を下回ることもあります。このように、RMSEは「ずれの大きさ」、R²は「説明力」という別の見方なので、両方を並べて確認します。

python
from sklearn.metrics import mean_squared_error, r2_score

rmse = float(mean_squared_error(y_test, pred) ** 0.5)
r2 = r2_score(y_test, pred)
pd.Series({
    "RMSE": round(rmse, 1),
    "テストR2": round(r2, 3),
    "学習R2": round(
        model.score(X_train, y_train), 3)
})
RMSEと決定係数(テスト・学習)を確認した結果
RMSEと決定係数(テスト・学習)を確認した結果

 今回のテストのRMSEは287.8千円です。売上平均1797千円に対し、およそ16%にあたる大きさで、予測が実測から平均してこの程度ずれることを示しています。テストのR²は0.777で、売上のばらつきのおよそ77%を、広告費とセッション数の2つで説明できていることを意味します。学習側のR²は0.814とテストよりわずかに高いものの、大きな差ではないため、学習データだけに強い状態にはなっていません。

 精度をさらに上げたいときの次の一手は、説明変数を足すことです。今回の表では、商品カテゴリをダミー変数(文字を0と1の列に置き換えたもの)として加えると、テストR²は0.777から0.855へ上がります(コードは省略)。

 ただし、足せば足すほど上がるわけではありません。ここに月もダミー変数にして加えると、学習R²は0.958まで上がる一方、テストR²は0.855から0.818へ下がります。学習データに合わせ込んだ分だけ、見ていないデータでは弱くなる。これが冒頭の過学習で、学習R²とテストR²を並べるのは、この兆候を見つけるためです。

予測値をExcel上のシートで取り扱う

 ここでは、予測値などPythonで出力した値を、Excel上のシートで取り扱う方法を確認します。予測をシートでの作業に載せるには、予測値を列として表に足し、それをPythonセルの出力にします。

 なお、評価はテスト8行で行いましたが、シートへ戻す列は全36行に付けることになります。うち28行は学習に使った行なので、その分の予測は実測に近い値になります。

python
out = df.copy()
out["予測売上"] = model.predict(X).round(0).astype(int)
out

 Pythonセルの最後の式であるoutが、セルの出力になります。

予測売上列を追加した月次表をシートへ展開した結果
予測売上列を追加した月次表をシートへ展開した結果

 実行直後はセル内にオブジェクトとして収まるため、シート上の表として展開するには、Pythonエディター右上の[出力]から「Excelの値」を選びます(またはセルの挿入データアイコンをクリック)。展開先のセルが空いていれば#SPILL!にならず、通常の表としてセルに展開されます。予測列がシートに乗れば、Excelのフィルタや関数参照にそのまま活用できます。

 続いて、広告費の計画値から売上の見込額を出してみます。学習時と同じ列名のDataFrameをpredictに渡します。広告費400・450・500千円、セッション数25000・27000・29000の3通りです。

python
plan = pd.DataFrame(
    [[400, 25000],
     [450, 27000],
     [500, 29000]],
    columns=["広告費", "セッション数"])
plan["予測売上"] = model.predict(plan).round(0).astype(int)
plan

 3通りの計画に対する予測売上が返ります。

広告費とセッション数の計画3通りから売上見込みを出した結果
広告費とセッション数の計画3通りから売上見込みを出した結果

 予測売上は2347・2510・2672千円です。今回はコード内に数値を直接書きましたが、計画値をシートのセルに置きxl()で参照すれば、セルの値を書き換えるだけで再計算が走り、予測売上も自動で更新されます。

 このように、分割してからfit/predictし、RMSEとR²で確かめたうえで予測列をシートへ戻せます。

次のページ
分類とクラスタリングで顧客データの理解を深める

この記事は参考になりましたか?

Python in Excel実務入門:Excelデータ分析の新パラダイム連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 西 潤史郎(ニシ ジュンシロウ)

< WINGSプロジェクト について>有限会社 WINGSプロジェクト が運営する、テクニカル執筆コミュニティ(代表 山田...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー