scikit-learnで始めるExcel版機械学習。予測分析と評価
Python in Excel実務入門:Excelデータ分析の新パラダイム 第4回
ダウンロード サンプルファイル (21.7 KB)
前回は、matplotlibとseabornを使い分け、分布や相関、ばらつきをセルの中のグラフとして示す方法を確認しました。本稿では、scikit-learnを使って予測分析に取り組みます。回帰で売上を見積もり、分類で解約リスクを判定し、クラスタリングでグループ分けを行う――ここまでをExcelブックの中で実行し、予測値をシートへ戻します。なお、分析用の基盤を用意する手順は扱いません。
回帰モデルで売上予測を作る(1)
ここでは、線形回帰(LinearRegression)を使い、「来月の広告費計画を入れると、売上見込みはいくらになるか」をセルの中で見積もる手順を確認します。
scikit-learnとは、Pythonの機械学習ライブラリです。fitで学習し、predictで見積もるという共通の手順で、回帰・分類・クラスタリングを扱えます。このうち線形回帰とは、説明変数の値から目的変数を直線の関係として見積もる手法です。
サンプルとして、中堅EC企業マーケティング部の月次実績(アパレル・コスメ・食品、1~12月の36行)を使います。配布ファイルの36行を、見出しを含む範囲がシート左上(A1:E37)に来るように置き、回帰ではこの表を使い回してください。
広告費と売上の単位は千円、セッション数(ECサイトへの訪問回数)は件です。説明変数は広告費とセッション数、目的変数は売上です。月と商品カテゴリはモデルには入れず、精度を上げる次の一手として後で触れます。
学習データ/テストデータ分割の意味
表全体で学習し、同じ表に対して「予測が当たった」と言ってしまうと、たまたまその表に合っていただけかもしれません。そこで使うのが、行を学習用とテスト用に分ける関数train_test_splitです。
学習用のデータでfitし、学習に使っていないテスト用のデータでpredictのずれを見る、という順にします。過学習とは、学習データには強い一方、見ていないデータでは弱い状態です。
空いているセルを選び、次のコードを入力します。Python in Excelはセルを上から順に実行して変数を引き継ぐため、以降のコードは前のセルのdf(pandasのDataFrame)、model(線形回帰モデルのオブジェクト)を使います。ブックを開き直した直後は、先にこのセルを実行してください。分析用のサーバやライブラリの導入作業なしにこの数行から始められる代わりに、実行はクラウド側で行われ、学習済みモデルはブックに残りません。開き直すたびに再学習されます。
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
df = xl("A1:E37", headers=True)
X = df[["広告費", "セッション数"]]
y = df["売上"]
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=0) # (1)
model = LinearRegression()
model.fit(X_train, y_train) # (2)
pred = model.predict(X_test)
cmp = df.loc[X_test.index,
["月", "商品カテゴリ", "売上"]].copy()
cmp["予測売上"] = pred.round(0).astype(int)
cmp
プレビューにはテスト8行の実測と予測が並びます。
test_size=0.2でおよそ2割をテストに回し、random_state=0(1)で分割の乱数を固定しています。Python in Excelでは、参照先のセルが変わって再計算されるとPythonコードも再実行されるため、シード(乱数の初期値)を固定しないと、同じ数式でも実行のたびに予測値が変わってしまいます。
fit(2)が学習、続くpredictが見積もりです。説明変数はdf[["広告費", "セッション数"]]のように列名を保ったDataFrameのまま渡します。
行ラベルが飛び飛びになっているのは、36行からテスト用を無作為に取り出しているためです。見たことのない行で通用するかを確かめる場面で役立ちます。
学習とテストの件数は、次のように確認します。
len(X_train), len(X_test)
36行を8:2で分けると、学習28行・テスト8行になります(2割側は切り上げ)。分割できたことを件数で押さえてから、次項でずれの大きさを数字にします。
この記事は参考になりましたか?
- Python in Excel実務入門:Excelデータ分析の新パラダイム連載記事一覧
-
- scikit-learnで始めるExcel版機械学習。予測分析と評価
- Python in Excelのmatplotlib/seabornで、意思決定に役立つデ...
- pandasでふぞろいなデータを分析資産に変える
- この記事の著者
-
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編 」他、著書多数。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この記事は参考になりましたか?
この記事をシェア
