レッスン1 / 1問目

『単回帰分析の実装』

このレッスンでは単回帰分析を実際に実装していきます。

実装にはNumPy、Pandas、Matplotlibを使用します。ここではこれらのライブラリの基本的な知識があることを前提としています。

以下の手順で実装していきます。

  1. データの読み込み
  2. データの可視化
  3. データの中心化
  4. 数式からパラメーターを求める
  5. 広告宣伝費から来店者数を予測

このレッスンでは一緒に手を動かしながら、単回帰分析を実装していきましょう。

データの読み込み

まずは学習を行うデータを読み込ます。

NumPyを使ってデータを読み込むこともできますが、ここではPandasのread_csv()を用いてデータを読み込ます。CSVファイルのパスは/sample.csvとなります。

では、まずPandasをインポートしてください。そして、read_csv()でデータを読み込みます。

  1. import pandas as pd
  2. df = pd.read_csv("/sample.csv")    # データの読み込み
  3. print(df.head())    # データを先頭の5件に絞る
広告宣伝費 来店者数    # 今回扱うデータ 0 884890 962 1 544965 513 2 677078 764 3 278991 347 4 748572 710

本レッスンでは広告宣伝費と来店者数のデータを扱います。データ数は50件です。データ数が多いため確認する際はhead()でデータ数を絞ります。

次にデータを広告宣伝費と来店者数にそれぞれ分けます。

以下のようにそれぞれをx、yとします。ちなみにこのデータにおける広告宣伝費を説明変数と呼び、来店者数を目的変数と呼びます。説明変数とは目的変数の原因となっている変数です。つまり「原因」と「結果」のような関係となっています。

  1. x = df["広告宣伝費"].values    # データをxとyに分ける
  2. y = df["来店者数"].values

上記のようにvaluesプロパティでデータの値を取得することができます。

valuesで取得できる値はSeriesオブジェクトではなくndarray(NumPyの配列)となります。

データの可視化

では次はこれらのデータをMatplotlibを使って可視化してみましょう。

まずはMatplotlibをインポートしてください。

  1. import matplotlib.pyplot as plt

plt.scatter()の引数にxとyを渡し散布図を描画します。

  1. plt.scatter(x, y)    # 散布図を描画
  2. plt.show()    # グラフを表示

広告宣伝費と来店者数の回帰分析のグラフ

このグラフを見ていただくと、なんとなく「y = ax + b」の一次関数が当てはまりそうだということがわかるかと思います。

データを分析する際はこのように可視化することでデータを把握しやすくなります。

ではここから、これらxとyのデータを用いて前回レッスンまでで学習した数式を実装していきましょう。(matplotlibのコードは必要ありませんので削除してください。)

データの中心化

本レッスンでは「y = ax + b」におけるパラメーターを求めることが目的となりますが、まずは「y = ax + b」のパラメーターを1つにするためにデータの中心化を行います。

データの中心化を行う数式は以下の通りです。

x - xの平均値 y - yの平均値

ではこれを実装していきましょう。

まずはxとyの平均値を求めます。平均値をそれぞれx_mean, y_meanとします。

  1. import numpy as np
  1. x_mean = np.mean(x)    # 平均を求める
  2. y_mean = np.mean(y)

x, yそれぞれから平均を引くことで中心化した値を求めることができます。中心化した値をそれぞれ x_cent, y_centとします。

  1. x_cent = x - x_mean    # 中心化
  2. y_cent = y - y_mean

データを中心化することができました。

パラメーターを求める

では前回のレッスンで求めた数式にxとyを当てはめていきましょう。

a = n=1 N ( yn xn ) n=1 N ( xn2 )

シグマがあると少し難しく見えますが、シグマは総和の記号ですので、np.sum()に置き換えるだけで実装ができます。

  1. a = np.sum(x_cent * y_cent) / np.sum(x_cent ** 2)

パラメーターaを求めることができました。

ではaの中身を確認してみましょう。

  1. print(a)
0.0010326213652587961    # パラメーター

パラメーターを求めることができました。しかしこのパラメーターが正しいかどうかは現時点ではわかりません。パラメーターが正しいかどうかは回帰直線実測値のデータを確認することで判断することができます。以下のように回帰直線がデータの中心を通っていれば正しくパラメーターを求めることができているといえます。

回帰直線のグラフ

ではMatplotlibを用いて確認してみましょう。このグラフでは実測値の散布図とパラメーターを用いた回帰直線をグラフ化しています。散布図は前回と同じでplt.scatter()にxとyを渡します。回帰直線はplt.plot()にxとx * a を渡します。

  1. import matplotlib.pyplot as plt
  2. plt.scatter(x, y)    # 実測値
  3. plt.plot(x, x * a)    # 回帰直線
  4. plt.show()

回帰直線のグラフ

パラメーターが正しいことを確認することができました。

パラメーターを使って値を予測しよう

ではこれまでで求めたパラメーターaを使って、「広告宣伝費」から「来店者数」を予測する関数を作ってみましょう。

以下の手順で実装します。

  1. 入力値として受け取ったx(広告宣伝費)を中心化
  2. 中心化したxにパラメーターaを乗算
  3. yの平均値を加算

ここでなぜyの平均値を加算するのかというとデータを中心化した際に「y - yの平均値」という計算をしているため、yの平均値を加算しない場合、出力される値はyの平均値を引いた値となってしまいます。そのため、減算した値を元に戻すために行います。

コードは以下の通りです。関数名はpredict(予測する)とします。

  1. def predict(x):
  2.     return (x - x_mean) * a + y_mean

これで「広告宣伝費」から「来店者数」を予測する関数が完成しました。試しに関数に「広告宣伝費」を渡して来店者数を予測してみてください。

下記のようにグラフを見ながら入力値xに対して適切な値が出力されることを確認してください。


では単回帰分析の実装は以上となります。

判定ボタンを押してください。predict関数が正しく実装できていれば正解となります。

Last updated:2019/11/22

  1. import pandas as pd
  2. import numpy as np

  3. df = pd.read_csv("/sample.csv")

  4. x = df["広告宣伝費"].values
  5. y = df["来店者数"].values

  6. x_mean = np.mean(x)
  7. y_mean = np.mean(y)

  8. x_cent = x - x_mean
  9. y_cent = y - y_mean

  10. a = np.sum(x_cent * y_cent) / np.sum(x_cent ** 2)

  11. def predict(x):
  12. return (x - x_mean) * a + y_mean

main.py
設定
g
n
i
d
a
o
L