AI

Pythonで単回帰分析をscikit-learnを使わずに実装【Fitbitデータを分析】

本記事ではFitbitのデータを機会学習ライブラリであるscikit-learnを使わず単回帰分析を行った記事なります。

機械学習はライブラリを使うとても簡単に実装できます。

ただ、それに慣れてくるとなぜそういう結果になったか説明ができません。

もちろんブラックボックスな面もあり全て説明できるとは言えませんが、単回帰分析などの基本的な機械学習は説明できるようにしておきたいですよね。

なお、本記事は「【キカガク流】人工知能・機械学習 脱ブラックボックス講座 – 初級編 -」をもとにした記事になります。

プログラムについてのわかりやすい説明はぜひこの講座を受講してみてください。

「キカガク 脱ブラックボックス講座 初級編」を見てみる

キカガク初級編
【キカガク流】機械学習 脱ブラックボックス講座 初級編 【Udemy紹介】 本記事ではこんなお悩みを解決します。 本記事では「【キカガク流】人工知能・機械学習 脱ブラックボックス...

Pandasでデータフレームの作成

Fitbit Versa 2 でアクティビティを取得しているので、このデータを使用します。

今回は歩数からカロリー消費量の予測を単回帰分析で行います。

Fitbitのページから歩数とカロリー消費のデータをデータをエクスポートし、Pandasでデータフレームを作成します。

import pandas as pd

# CSVファイルの読み込み
# df:data frame
df = pd.read_excel('steps.xls')

#先頭データを表示
df.head(3)

# データの抽出
x = df['歩数']
y = df['カロリー消費']

 

df.head(3)の結果は次のようになりました。

歩数 カロリー消費
0 3481 1909
1 2896 1874
2 9469 2359

Matplotlibでグラフの描画

抽出したデータをグラフをしてどのような傾向があるかを確認します。

import matplotlib.pyplot as plt

# 横軸x、縦軸yの散布図(scatter)をプロット
plt.scatter(x,y)
plt.show()

 

右肩上がりで強い相関があることがわかります。

scatter

単回帰分析の実装

データの抽出と可視化の次は、いよいよ単回帰分析の実装を行います。

単回帰分析は次の3ステップで行います。

  1. データの中心化
  2. パラメーターaの計算
  3. 予測値の計算

まずはデータの中心化を行います。

データの中心化を行うと、y = ax + b といった1次関数を y = ax に簡略化できます。

最初にデータの概要を表示し、どのようなデータか確認します。

# 小数点以下の桁数を1桁に設定
pd.options.display.precision = 1

# データの概要を表示
df.describe()
歩数 カロリー消費
count 1095.0 1095.0
mean 8459.3 2432.0
std 4180.1 419.1
min 0.0 1569.0
25% 5645.5 2174.0
50% 8494.0 2394.0
75% 10796.0 2623.5
max 31681.0 4837.0

それではデータの中心化を行います。

データは中心化はとても簡単で、[各データ – 平均] を行うだけです。

新しい変数 df_c に中心化したデータを格納します。

# 中心化
df_c = df - df.mean()

#中心化したデータを確認
df_c.head(3)
歩数 カロリー消費
0 -4978.3 -523.0
1 -5563.3 -558.0
2 1009.7 -73.0

 

ちゃんと中心化されている歩数の1行目のデータで確認します。

df.iloc[0,0] - df['歩数'].mean()
# -4978.275799086758

 

中心化したデータの概要を確認します。

# データの概要を表示
df_c.describe()
歩数 カロリー消費
count 1095.0 1095.0
mean -0.0 0.0
std 4180.1 419.1
min -8459.3 -863.0
25% -2813.8 -258.0
50% 34.7 -38.0
75% 2336.7 191.5
max 23221.7 2405.0

 

# データの抽出
x = df_c['歩数']
y = df_c['カロリー消費']

# xとyの散布図をプロット
plt.scatter(x,y)
plt.show()

中心化したデータの散布図を確認すると、ちょうどデータの中心がxとyが0にところに来ます。

つまり、y = ax + b の切片bが0となり、 y = ax となります。

scatter_centering

パラメータaの計算

y = ax のパラメーターの a を計算します。

パラメーターaは [x * yの合計] を  [x * y の合計]で割った値になります。

このあたりの説明はキカガクの講座がわかりやすく解説してくれています。

xx = x * x
xy = x * y

# パラメーターaの計算
a = xy.sum() / xx.sum()
print(a)
# 0.07951653832063649

 

データをプロットします。

plt.scatter(x,y, label = 'y')
plt.plot(x,a*x, label = 'y_hat', color = 'red')
plt.legend() # 凡例の表示
plt.show()
scatter_simple_regression

予測値の計算

いよいよ予測値の計算をしていきます。

# 10000歩のカロリーを計算
x_new = 10000

# 平均
mean = df.mean()

# 中心化
xc = x_new - mean['歩数']

# 単回帰分析による計測
yc = a * xc

予測値を計算
y_hat = a * xc + mean['カロリー消費']
# 2554.5

 

まとめ

これで歩数から、カロリー消費量を予測することができました。

これをキカガクの講座では関数で使いやすくする方法も解説されているので、ぜひ受講してみてください。

 

「キカガク 脱ブラックボックス講座 初級編」を見てみる

キカガク初級編
【キカガク流】機械学習 脱ブラックボックス講座 初級編 【Udemy紹介】 本記事ではこんなお悩みを解決します。 本記事では「【キカガク流】人工知能・機械学習 脱ブラックボックス...