見出し画像

【練習問題:cvxpy】線形回帰(重回帰分析)でハンドボール投げの飛距離を見積もる【python】

【はじめに】

前回はcvxpyの使い方をざっとまとめた。

今回はもう少し具体的な例を使って、『最小二乗法を使った線形回帰(重回帰分析)』を行ってみる。

【例題】:ハンドボール投げの飛距離

握力(power)・身長(height)・体重(weight)」と「ハンドボール投げの飛距離(distance)」の関係式を次にように仮定する。
(※実際はこんな単純な関係式にはならない)

15人分のハンドボール投げのデータ(サンプルデータ)から、
「仮定した関係式の重み:w」と「オフセット:offset」
をいい感じに決めて、
これから投げる人のおおまかな飛距離を見積もるための当たらずと雖も遠からず(あたらずといえどもとおからず)な近似式」を作りたい。

■サンプルデータ(15人分)

【解答例】

実行環境は「Google Colab」。

【1】cvxpyのインストール

!pip install cvxpy
!pip install --upgrade cvxpy

■バージョンや対応ソルバ情報を確認してみる

import cvxpy as cp

# バージョン確認
print(cp.__version__) 

# 定義されているソルバーを出力してみる(settings.pyより)
print(cp.settings.SOLVERS)

【ここまでの実行結果例】
1.2.0
['ECOS', 'CVXOPT', 'GLOP', 'GLPK', 'GLPK_MI', 'SCS', 'GUROBI', 'OSQP', 'CPLEX', 'MOSEK', 'CBC', 'XPRESS', 'NAG', 'PDLP', 'SCIP', 'SCIPY']

▲「cvxpyのバージョン」と「対応しているソルバ情報」を出力

■インストール済みのソルバーを確認する
cvxpyと一緒にインストールされるソルバーを確認してみる

print( cp.installed_solvers() )

【ここまでの実行結果例】
['CVXOPT', 'ECOS', 'ECOS_BB', 'GLPK', 'GLPK_MI', 'OSQP', 'SCIPY', 'SCS']

▲cvxpyと一緒にインストールされているソルバを出力

【2】サンプルデータの用意

今回のサンプルデータは「pandas」の「DataFrame.from_dict()」を使って「DataFrame」として作成して取り扱う。

■サンプルデータの作成

import pandas as pd

# サンプルデータ
dict_sample_data = dict(
    distance = [22, 36, 24, 22, 27, 29, 26, 23, 31, 24, 23, 27, 31, 25, 23],
    power = [28, 46, 39, 25, 34, 29, 38, 23, 42, 27, 35, 39, 38, 32, 25],
    height =[146, 169, 160, 156, 161, 168, 154, 153, 160, 152, 155, 154, 157, 162, 142],
    weight =[34, 57, 48, 38, 47, 50, 54, 40, 62, 39, 46, 54, 57, 53, 32]
)
df_sample_data = pd.DataFrame.from_dict(dict_sample_data)
df_sample_data

【ここまでの実行結果例】

【3】計算用にoffset(切片)相当のデータを仕込む

前回と同様に連立方程式に相当する行列式をつくる。記述された数式に近い形で表現すると、例えば次のようにoffset分を加算する形にできる。

※数式の表現のままの場合

▲cvxpyならこのままでも対応可能


cvxpyならばこの数式表現を渡しても解析してくれるので、このまま進めても別にかまわない。
しかし、今回はもう少し扱いやすくするため「offset分も含めた行列を作ることにする。

ここから先は

7,837字 / 7画像

¥ 100

もっと応援したいなと思っていただけた場合、よろしければサポートをおねがいします。いただいたサポートは活動費に使わせていただきます。