{
"cells": [
{
"attachments": {},
"cell_type": "markdown",
"id": "3fb7b88f-08d6-47b5-9c0a-a5a881c70a06",
"metadata": {},
"source": [
"# 多項ロジットモデル"
]
},
{
"attachments": {},
"cell_type": "markdown",
"id": "f1f520d5-7de8-4f5c-9467-83c42cfab30b",
"metadata": {},
"source": [
"**多項ロジットモデル(multinomial logt model)**\n",
"多項ロジットモデルは、被説明変数が取りうる値が3つ以上で、それらに順序がない場合に適用します。\n",
"\n",
"例えば、移動手段(バス・自動車・電車・徒歩・自転車・その他)を選択肢から選ぶ場合や、消費者が購入する商品を、ブランドA、ブランドB、ブランドCから選択する場合などに適用することができます。\n",
"\n",
"\n",
"`statsmodels`を用いて推定します。\n",
" \n"
]
},
{
"attachments": {},
"cell_type": "markdown",
"id": "97dfb2ec-0a0c-4f07-bb9a-9a71d8f245f1",
"metadata": {},
"source": [
"ここではスマートフォンを用いて収集されたセンサーデータから、スマートフォンユーザーの移動手段を推定する例を考えます。\n",
"\n",
"このデータは、13人のボランティア(男性10名、女性3名)のスマートフォンから収集したデータで、徒歩、車、静止状態、電車、バスの5クラスで構成されています。\n",
"\n",
"データ出典: http://cs.unibo.it/projects/us-tm2017/index.html\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "59fda80a-e557-4340-8ac0-e3d04ea3e211",
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import statsmodels.api as sm\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"%matplotlib inline"
]
},
{
"attachments": {},
"cell_type": "markdown",
"id": "a7d69837-c602-4a12-8b61-9b70e00df5ad",
"metadata": {},
"source": [
"まずはデータをダウンロードします。"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "b708a515-40a5-44a2-a68f-3388d77e4614",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" dataset_5secondWindow.csv | \n",
" id | \n",
" time | \n",
" activityrecognition#0 | \n",
" activityrecognition#1 | \n",
" android.sensor.accelerometer#mean | \n",
" android.sensor.accelerometer#min | \n",
" android.sensor.accelerometer#max | \n",
" android.sensor.accelerometer#std | \n",
" android.sensor.game_rotation_vector#mean | \n",
" android.sensor.game_rotation_vector#min | \n",
" android.sensor.game_rotation_vector#max | \n",
" android.sensor.game_rotation_vector#std | \n",
" android.sensor.gravity#mean | \n",
" android.sensor.gravity#min | \n",
" android.sensor.gravity#max | \n",
" android.sensor.gravity#std | \n",
" android.sensor.gyroscope#mean | \n",
" android.sensor.gyroscope#min | \n",
" android.sensor.gyroscope#max | \n",
" android.sensor.gyroscope#std | \n",
" android.sensor.gyroscope_uncalibrated#mean | \n",
" android.sensor.gyroscope_uncalibrated#min | \n",
" android.sensor.gyroscope_uncalibrated#max | \n",
" android.sensor.gyroscope_uncalibrated#std | \n",
" android.sensor.light#mean | \n",
" android.sensor.light#min | \n",
" android.sensor.light#max | \n",
" android.sensor.light#std | \n",
" android.sensor.linear_acceleration#mean | \n",
" android.sensor.linear_acceleration#min | \n",
" android.sensor.linear_acceleration#max | \n",
" android.sensor.linear_acceleration#std | \n",
" android.sensor.magnetic_field#mean | \n",
" android.sensor.magnetic_field#min | \n",
" android.sensor.magnetic_field#max | \n",
" android.sensor.magnetic_field#std | \n",
" android.sensor.magnetic_field_uncalibrated#mean | \n",
" android.sensor.magnetic_field_uncalibrated#min | \n",
" android.sensor.magnetic_field_uncalibrated#max | \n",
" android.sensor.magnetic_field_uncalibrated#std | \n",
" android.sensor.orientation#mean | \n",
" android.sensor.orientation#min | \n",
" android.sensor.orientation#max | \n",
" android.sensor.orientation#std | \n",
" android.sensor.pressure#mean | \n",
" android.sensor.pressure#min | \n",
" android.sensor.pressure#max | \n",
" android.sensor.pressure#std | \n",
" android.sensor.proximity#mean | \n",
" android.sensor.proximity#min | \n",
" android.sensor.proximity#max | \n",
" android.sensor.proximity#std | \n",
" android.sensor.rotation_vector#mean | \n",
" android.sensor.rotation_vector#min | \n",
" android.sensor.rotation_vector#max | \n",
" android.sensor.rotation_vector#std | \n",
" android.sensor.step_counter#mean | \n",
" android.sensor.step_counter#min | \n",
" android.sensor.step_counter#max | \n",
" android.sensor.step_counter#std | \n",
" sound#mean | \n",
" sound#min | \n",
" sound#max | \n",
" sound#std | \n",
" speed#mean | \n",
" speed#min | \n",
" speed#max | \n",
" speed#std | \n",
" target | \n",
" user | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 0.0 | \n",
" 16170.0 | \n",
" 78.0 | \n",
" NaN | \n",
" 100.0 | \n",
" 9.811476 | \n",
" 9.758895 | \n",
" 9.849411 | \n",
" 0.014626 | \n",
" 0.029340 | \n",
" 0.029014 | \n",
" 0.029526 | \n",
" 0.000119 | \n",
" 9.806650 | \n",
" 9.806649 | \n",
" 9.806651 | \n",
" 4.780692e-07 | \n",
" 0.001651 | \n",
" 0.000000 | \n",
" 0.003533 | \n",
" 0.000737 | \n",
" 0.016221 | \n",
" 0.014172 | \n",
" 0.018695 | \n",
" 0.000982 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.020978 | \n",
" 0.002495 | \n",
" 0.05241 | \n",
" 0.011045 | \n",
" 57.099638 | \n",
" 56.690387 | \n",
" 57.575950 | \n",
" 0.177549 | \n",
" 51.363566 | \n",
" 51.199707 | \n",
" 51.539208 | \n",
" 0.080899 | \n",
" 354.286933 | \n",
" 353.598335 | \n",
" 354.942707 | \n",
" 0.245676 | \n",
" 1004.090261 | \n",
" 1004.05540 | \n",
" 1004.12790 | \n",
" 0.017416 | \n",
" 8.0 | \n",
" 8.0 | \n",
" 8.0 | \n",
" NaN | \n",
" 0.050413 | \n",
" 0.044777 | \n",
" 0.056351 | \n",
" 0.002109 | \n",
" 28966.0 | \n",
" 28966.0 | \n",
" 28966.0 | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" 0.000000 | \n",
" 0.000000 | \n",
" 0.000000 | \n",
" 0.000000 | \n",
" Still | \n",
" U12 | \n",
"
\n",
" \n",
" 1 | \n",
" 1.0 | \n",
" 15871.0 | \n",
" 145.0 | \n",
" NaN | \n",
" 100.0 | \n",
" 9.939207 | \n",
" 7.707437 | \n",
" 17.146631 | \n",
" 1.775944 | \n",
" 0.999925 | \n",
" 0.999903 | \n",
" 0.999946 | \n",
" 0.000030 | \n",
" 9.806624 | \n",
" 9.806624 | \n",
" 9.806624 | \n",
" 6.474977e-07 | \n",
" 0.036326 | \n",
" 0.011669 | \n",
" 0.059388 | \n",
" 0.020290 | \n",
" 0.039023 | \n",
" 0.014132 | \n",
" 0.085494 | \n",
" 0.018629 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" NaN | \n",
" 0.879220 | \n",
" 0.641117 | \n",
" 1.18581 | \n",
" 0.278730 | \n",
" 29.351288 | \n",
" 28.172505 | \n",
" 30.386017 | \n",
" 0.921547 | \n",
" 82.767760 | \n",
" 82.409890 | \n",
" 83.125630 | \n",
" 0.506105 | \n",
" 332.695577 | \n",
" 330.461054 | \n",
" 339.108607 | \n",
" 1.705816 | \n",
" 1008.274660 | \n",
" 1008.27466 | \n",
" 1008.27466 | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" 0.999981 | \n",
" 0.999963 | \n",
" 0.999999 | \n",
" 0.000026 | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" 89.20021 | \n",
" 89.065143 | \n",
" 89.335277 | \n",
" 0.191013 | \n",
" 16.539349 | \n",
" 16.539349 | \n",
" 16.539349 | \n",
" 0.628595 | \n",
" Car | \n",
" U12 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" dataset_5secondWindow.csv id time activityrecognition#0 \\\n",
"0 0.0 16170.0 78.0 NaN \n",
"1 1.0 15871.0 145.0 NaN \n",
"\n",
" activityrecognition#1 android.sensor.accelerometer#mean \\\n",
"0 100.0 9.811476 \n",
"1 100.0 9.939207 \n",
"\n",
" android.sensor.accelerometer#min android.sensor.accelerometer#max \\\n",
"0 9.758895 9.849411 \n",
"1 7.707437 17.146631 \n",
"\n",
" android.sensor.accelerometer#std android.sensor.game_rotation_vector#mean \\\n",
"0 0.014626 0.029340 \n",
"1 1.775944 0.999925 \n",
"\n",
" android.sensor.game_rotation_vector#min \\\n",
"0 0.029014 \n",
"1 0.999903 \n",
"\n",
" android.sensor.game_rotation_vector#max \\\n",
"0 0.029526 \n",
"1 0.999946 \n",
"\n",
" android.sensor.game_rotation_vector#std android.sensor.gravity#mean \\\n",
"0 0.000119 9.806650 \n",
"1 0.000030 9.806624 \n",
"\n",
" android.sensor.gravity#min android.sensor.gravity#max \\\n",
"0 9.806649 9.806651 \n",
"1 9.806624 9.806624 \n",
"\n",
" android.sensor.gravity#std android.sensor.gyroscope#mean \\\n",
"0 4.780692e-07 0.001651 \n",
"1 6.474977e-07 0.036326 \n",
"\n",
" android.sensor.gyroscope#min android.sensor.gyroscope#max \\\n",
"0 0.000000 0.003533 \n",
"1 0.011669 0.059388 \n",
"\n",
" android.sensor.gyroscope#std android.sensor.gyroscope_uncalibrated#mean \\\n",
"0 0.000737 0.016221 \n",
"1 0.020290 0.039023 \n",
"\n",
" android.sensor.gyroscope_uncalibrated#min \\\n",
"0 0.014172 \n",
"1 0.014132 \n",
"\n",
" android.sensor.gyroscope_uncalibrated#max \\\n",
"0 0.018695 \n",
"1 0.085494 \n",
"\n",
" android.sensor.gyroscope_uncalibrated#std android.sensor.light#mean \\\n",
"0 0.000982 0.0 \n",
"1 0.018629 0.0 \n",
"\n",
" android.sensor.light#min android.sensor.light#max \\\n",
"0 0.0 0.0 \n",
"1 0.0 0.0 \n",
"\n",
" android.sensor.light#std android.sensor.linear_acceleration#mean \\\n",
"0 0.0 0.020978 \n",
"1 NaN 0.879220 \n",
"\n",
" android.sensor.linear_acceleration#min \\\n",
"0 0.002495 \n",
"1 0.641117 \n",
"\n",
" android.sensor.linear_acceleration#max \\\n",
"0 0.05241 \n",
"1 1.18581 \n",
"\n",
" android.sensor.linear_acceleration#std android.sensor.magnetic_field#mean \\\n",
"0 0.011045 57.099638 \n",
"1 0.278730 29.351288 \n",
"\n",
" android.sensor.magnetic_field#min android.sensor.magnetic_field#max \\\n",
"0 56.690387 57.575950 \n",
"1 28.172505 30.386017 \n",
"\n",
" android.sensor.magnetic_field#std \\\n",
"0 0.177549 \n",
"1 0.921547 \n",
"\n",
" android.sensor.magnetic_field_uncalibrated#mean \\\n",
"0 51.363566 \n",
"1 82.767760 \n",
"\n",
" android.sensor.magnetic_field_uncalibrated#min \\\n",
"0 51.199707 \n",
"1 82.409890 \n",
"\n",
" android.sensor.magnetic_field_uncalibrated#max \\\n",
"0 51.539208 \n",
"1 83.125630 \n",
"\n",
" android.sensor.magnetic_field_uncalibrated#std \\\n",
"0 0.080899 \n",
"1 0.506105 \n",
"\n",
" android.sensor.orientation#mean android.sensor.orientation#min \\\n",
"0 354.286933 353.598335 \n",
"1 332.695577 330.461054 \n",
"\n",
" android.sensor.orientation#max android.sensor.orientation#std \\\n",
"0 354.942707 0.245676 \n",
"1 339.108607 1.705816 \n",
"\n",
" android.sensor.pressure#mean android.sensor.pressure#min \\\n",
"0 1004.090261 1004.05540 \n",
"1 1008.274660 1008.27466 \n",
"\n",
" android.sensor.pressure#max android.sensor.pressure#std \\\n",
"0 1004.12790 0.017416 \n",
"1 1008.27466 NaN \n",
"\n",
" android.sensor.proximity#mean android.sensor.proximity#min \\\n",
"0 8.0 8.0 \n",
"1 NaN NaN \n",
"\n",
" android.sensor.proximity#max android.sensor.proximity#std \\\n",
"0 8.0 NaN \n",
"1 NaN NaN \n",
"\n",
" android.sensor.rotation_vector#mean android.sensor.rotation_vector#min \\\n",
"0 0.050413 0.044777 \n",
"1 0.999981 0.999963 \n",
"\n",
" android.sensor.rotation_vector#max android.sensor.rotation_vector#std \\\n",
"0 0.056351 0.002109 \n",
"1 0.999999 0.000026 \n",
"\n",
" android.sensor.step_counter#mean android.sensor.step_counter#min \\\n",
"0 28966.0 28966.0 \n",
"1 NaN NaN \n",
"\n",
" android.sensor.step_counter#max android.sensor.step_counter#std \\\n",
"0 28966.0 NaN \n",
"1 NaN NaN \n",
"\n",
" sound#mean sound#min sound#max sound#std speed#mean speed#min \\\n",
"0 NaN NaN NaN NaN 0.000000 0.000000 \n",
"1 89.20021 89.065143 89.335277 0.191013 16.539349 16.539349 \n",
"\n",
" speed#max speed#std target user \n",
"0 0.000000 0.000000 Still U12 \n",
"1 16.539349 0.628595 Car U12 "
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"url = \"http://cs.unibo.it/projects/us-tm2017/static/dataset/extension/5second/csv/dataset_5secondWindow.tar.gz\"\n",
"df = pd.read_csv(url, compression='gzip', header=0, sep=',', quotechar='\"', on_bad_lines='warn')\n",
"#最初の数行を表示させます\n",
"pd.set_option('display.max_columns', 100) # すべての列がNotebook上で表示されるように、オプション設定を変更します。\n",
"df.head(2)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "11bf306d-555e-4f55-aef2-25d62b82f30f",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/var/folders/x2/7ss5kcb12n1gtlpc8p2mtjtw0000gn/T/ipykernel_65166/2509734072.py:2: FutureWarning: The default value of regex will change from True to False in a future version.\n",
" df.columns = df.columns.str.replace('android.sensor.','').str.replace('#','_')\n"
]
}
],
"source": [
"# カラム名をわかりやすさのため変更します\n",
"df.columns = df.columns.str.replace('android.sensor.','').str.replace('#','_')"
]
},
{
"attachments": {},
"cell_type": "markdown",
"id": "bbeb12c2-a2f1-487d-a18c-d8bbeca0558d",
"metadata": {},
"source": [
"ここでは、移動手段(Car, Still, Train, Bus, Walking)を次の変数を用いて推定するモデルを考えます。\n",
"\n",
"* `accelerometer_mean`\n",
"* `game_rotation_vector_mean`\n",
"* `gyroscope_mean`\n",
"* `linear_acceleration_mean`\n",
"* `orientation_mean` \n",
"* `pressure_mean`\n",
"* `rotation_vector_mean`\n",
"* `sound_mean`\n",
"\n",
"上の変数の欠損している行を分析から除外します。"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "745f5be0-27f3-43df-9a91-47e0c8bec2aa",
"metadata": {},
"outputs": [],
"source": [
"df = df[[\n",
" 'target','accelerometer_mean','game_rotation_vector_mean',\n",
" 'gyroscope_mean','linear_acceleration_mean','orientation_mean', \n",
" 'pressure_mean','rotation_vector_mean','sound_mean'\n",
"]]\n",
"df = df.dropna()"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "15726ede-4eac-4f13-95a7-303d678b2b24",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" accelerometer_mean | \n",
" game_rotation_vector_mean | \n",
" gyroscope_mean | \n",
" linear_acceleration_mean | \n",
" orientation_mean | \n",
" pressure_mean | \n",
" rotation_vector_mean | \n",
" sound_mean | \n",
"
\n",
" \n",
" \n",
" \n",
" count | \n",
" 1255.000000 | \n",
" 1255.000000 | \n",
" 1255.000000 | \n",
" 1255.000000 | \n",
" 1255.000000 | \n",
" 1255.000000 | \n",
" 1255.000000 | \n",
" 1255.000000 | \n",
"
\n",
" \n",
" mean | \n",
" 9.996223 | \n",
" 0.732083 | \n",
" 0.325744 | \n",
" 1.507555 | \n",
" 208.533199 | \n",
" 1020.577142 | \n",
" 0.768484 | \n",
" 75.202876 | \n",
"
\n",
" \n",
" std | \n",
" 0.720097 | \n",
" 0.246679 | \n",
" 0.496171 | \n",
" 1.890074 | \n",
" 92.273671 | \n",
" 15.173493 | \n",
" 0.224416 | \n",
" 12.239499 | \n",
"
\n",
" \n",
" min | \n",
" 7.369055 | \n",
" 0.042684 | \n",
" 0.001164 | \n",
" 0.009447 | \n",
" 17.135360 | \n",
" 946.339840 | \n",
" 0.120813 | \n",
" 0.000000 | \n",
"
\n",
" \n",
" 25% | \n",
" 9.738144 | \n",
" 0.570153 | \n",
" 0.027239 | \n",
" 0.272564 | \n",
" 135.326907 | \n",
" 1011.055625 | \n",
" 0.668633 | \n",
" 71.869349 | \n",
"
\n",
" \n",
" 50% | \n",
" 9.830731 | \n",
" 0.763646 | \n",
" 0.083699 | \n",
" 0.707634 | \n",
" 206.208459 | \n",
" 1020.669000 | \n",
" 0.813465 | \n",
" 77.707224 | \n",
"
\n",
" \n",
" 75% | \n",
" 10.049428 | \n",
" 0.969717 | \n",
" 0.512946 | \n",
" 2.083757 | \n",
" 291.281798 | \n",
" 1029.123300 | \n",
" 0.959668 | \n",
" 82.794433 | \n",
"
\n",
" \n",
" max | \n",
" 14.661139 | \n",
" 0.999999 | \n",
" 3.268860 | \n",
" 18.141770 | \n",
" 396.133498 | \n",
" 1058.609900 | \n",
" 1.000000 | \n",
" 90.308734 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" accelerometer_mean game_rotation_vector_mean gyroscope_mean \\\n",
"count 1255.000000 1255.000000 1255.000000 \n",
"mean 9.996223 0.732083 0.325744 \n",
"std 0.720097 0.246679 0.496171 \n",
"min 7.369055 0.042684 0.001164 \n",
"25% 9.738144 0.570153 0.027239 \n",
"50% 9.830731 0.763646 0.083699 \n",
"75% 10.049428 0.969717 0.512946 \n",
"max 14.661139 0.999999 3.268860 \n",
"\n",
" linear_acceleration_mean orientation_mean pressure_mean \\\n",
"count 1255.000000 1255.000000 1255.000000 \n",
"mean 1.507555 208.533199 1020.577142 \n",
"std 1.890074 92.273671 15.173493 \n",
"min 0.009447 17.135360 946.339840 \n",
"25% 0.272564 135.326907 1011.055625 \n",
"50% 0.707634 206.208459 1020.669000 \n",
"75% 2.083757 291.281798 1029.123300 \n",
"max 18.141770 396.133498 1058.609900 \n",
"\n",
" rotation_vector_mean sound_mean \n",
"count 1255.000000 1255.000000 \n",
"mean 0.768484 75.202876 \n",
"std 0.224416 12.239499 \n",
"min 0.120813 0.000000 \n",
"25% 0.668633 71.869349 \n",
"50% 0.813465 77.707224 \n",
"75% 0.959668 82.794433 \n",
"max 1.000000 90.308734 "
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.describe()"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "f965f6cc-5f51-46a6-8839-ab6cae3e6c25",
"metadata": {},
"outputs": [],
"source": [
"x = df.drop('target', axis=1)\n",
"y = df['target']"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "e4680aed-a229-40b5-860c-f3ea05910bf9",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" accelerometer_mean | \n",
" game_rotation_vector_mean | \n",
" gyroscope_mean | \n",
" linear_acceleration_mean | \n",
" orientation_mean | \n",
" pressure_mean | \n",
" rotation_vector_mean | \n",
" sound_mean | \n",
"
\n",
" \n",
" \n",
" \n",
" accelerometer_mean | \n",
" 1.000000 | \n",
" 0.129695 | \n",
" 0.500263 | \n",
" 0.441453 | \n",
" 0.043532 | \n",
" -0.045848 | \n",
" 0.081403 | \n",
" 0.138451 | \n",
"
\n",
" \n",
" game_rotation_vector_mean | \n",
" 0.129695 | \n",
" 1.000000 | \n",
" 0.297029 | \n",
" 0.395925 | \n",
" 0.215494 | \n",
" -0.144826 | \n",
" 0.488242 | \n",
" 0.179971 | \n",
"
\n",
" \n",
" gyroscope_mean | \n",
" 0.500263 | \n",
" 0.297029 | \n",
" 1.000000 | \n",
" 0.732075 | \n",
" 0.050534 | \n",
" -0.032837 | \n",
" 0.169035 | \n",
" 0.017961 | \n",
"
\n",
" \n",
" linear_acceleration_mean | \n",
" 0.441453 | \n",
" 0.395925 | \n",
" 0.732075 | \n",
" 1.000000 | \n",
" 0.096761 | \n",
" -0.099997 | \n",
" 0.226298 | \n",
" 0.072577 | \n",
"
\n",
" \n",
" orientation_mean | \n",
" 0.043532 | \n",
" 0.215494 | \n",
" 0.050534 | \n",
" 0.096761 | \n",
" 1.000000 | \n",
" 0.007241 | \n",
" -0.007124 | \n",
" 0.016743 | \n",
"
\n",
" \n",
" pressure_mean | \n",
" -0.045848 | \n",
" -0.144826 | \n",
" -0.032837 | \n",
" -0.099997 | \n",
" 0.007241 | \n",
" 1.000000 | \n",
" -0.288926 | \n",
" 0.054731 | \n",
"
\n",
" \n",
" rotation_vector_mean | \n",
" 0.081403 | \n",
" 0.488242 | \n",
" 0.169035 | \n",
" 0.226298 | \n",
" -0.007124 | \n",
" -0.288926 | \n",
" 1.000000 | \n",
" -0.010011 | \n",
"
\n",
" \n",
" sound_mean | \n",
" 0.138451 | \n",
" 0.179971 | \n",
" 0.017961 | \n",
" 0.072577 | \n",
" 0.016743 | \n",
" 0.054731 | \n",
" -0.010011 | \n",
" 1.000000 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" accelerometer_mean game_rotation_vector_mean \\\n",
"accelerometer_mean 1.000000 0.129695 \n",
"game_rotation_vector_mean 0.129695 1.000000 \n",
"gyroscope_mean 0.500263 0.297029 \n",
"linear_acceleration_mean 0.441453 0.395925 \n",
"orientation_mean 0.043532 0.215494 \n",
"pressure_mean -0.045848 -0.144826 \n",
"rotation_vector_mean 0.081403 0.488242 \n",
"sound_mean 0.138451 0.179971 \n",
"\n",
" gyroscope_mean linear_acceleration_mean \\\n",
"accelerometer_mean 0.500263 0.441453 \n",
"game_rotation_vector_mean 0.297029 0.395925 \n",
"gyroscope_mean 1.000000 0.732075 \n",
"linear_acceleration_mean 0.732075 1.000000 \n",
"orientation_mean 0.050534 0.096761 \n",
"pressure_mean -0.032837 -0.099997 \n",
"rotation_vector_mean 0.169035 0.226298 \n",
"sound_mean 0.017961 0.072577 \n",
"\n",
" orientation_mean pressure_mean \\\n",
"accelerometer_mean 0.043532 -0.045848 \n",
"game_rotation_vector_mean 0.215494 -0.144826 \n",
"gyroscope_mean 0.050534 -0.032837 \n",
"linear_acceleration_mean 0.096761 -0.099997 \n",
"orientation_mean 1.000000 0.007241 \n",
"pressure_mean 0.007241 1.000000 \n",
"rotation_vector_mean -0.007124 -0.288926 \n",
"sound_mean 0.016743 0.054731 \n",
"\n",
" rotation_vector_mean sound_mean \n",
"accelerometer_mean 0.081403 0.138451 \n",
"game_rotation_vector_mean 0.488242 0.179971 \n",
"gyroscope_mean 0.169035 0.017961 \n",
"linear_acceleration_mean 0.226298 0.072577 \n",
"orientation_mean -0.007124 0.016743 \n",
"pressure_mean -0.288926 0.054731 \n",
"rotation_vector_mean 1.000000 -0.010011 \n",
"sound_mean -0.010011 1.000000 "
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"x.corr()"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "3119e062-fcbc-41d0-b4cc-47480da6aaa9",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" target | \n",
"
\n",
" \n",
" \n",
" \n",
" Walking | \n",
" 346 | \n",
"
\n",
" \n",
" Train | \n",
" 311 | \n",
"
\n",
" \n",
" Car | \n",
" 310 | \n",
"
\n",
" \n",
" Bus | \n",
" 220 | \n",
"
\n",
" \n",
" Still | \n",
" 68 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" target\n",
"Walking 346\n",
"Train 311\n",
"Car 310\n",
"Bus 220\n",
"Still 68"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"y.value_counts().to_frame()"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "fd3977f6-1f98-4ffe-af57-0f5d1f576bbf",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Optimization terminated successfully.\n",
" Current function value: 0.488472\n",
" Iterations 11\n",
" MNLogit Regression Results \n",
"==============================================================================\n",
"Dep. Variable: target No. Observations: 1255\n",
"Model: MNLogit Df Residuals: 1219\n",
"Method: MLE Df Model: 32\n",
"Date: Wed, 17 May 2023 Pseudo R-squ.: 0.6764\n",
"Time: 11:16:00 Log-Likelihood: -613.03\n",
"converged: True LL-Null: -1894.5\n",
"Covariance Type: nonrobust LLR p-value: 0.000\n",
"=============================================================================================\n",
" target=Car coef std err z P>|z| [0.025 0.975]\n",
"---------------------------------------------------------------------------------------------\n",
"accelerometer_mean -1.3405 0.326 -4.117 0.000 -1.979 -0.702\n",
"game_rotation_vector_mean -2.8793 0.932 -3.088 0.002 -4.707 -1.052\n",
"gyroscope_mean -1.2694 0.827 -1.535 0.125 -2.890 0.351\n",
"linear_acceleration_mean -0.3871 0.224 -1.730 0.084 -0.826 0.052\n",
"orientation_mean -0.0100 0.002 -4.722 0.000 -0.014 -0.006\n",
"pressure_mean -0.2423 0.022 -11.012 0.000 -0.285 -0.199\n",
"rotation_vector_mean -6.5886 1.024 -6.433 0.000 -8.596 -4.581\n",
"sound_mean 0.1831 0.023 8.124 0.000 0.139 0.227\n",
"const 255.7548 23.220 11.014 0.000 210.244 301.266\n",
"---------------------------------------------------------------------------------------------\n",
" target=Still coef std err z P>|z| [0.025 0.975]\n",
"---------------------------------------------------------------------------------------------\n",
"accelerometer_mean -2.3018 1.406 -1.638 0.101 -5.057 0.453\n",
"game_rotation_vector_mean -1.4923 1.166 -1.280 0.201 -3.778 0.793\n",
"gyroscope_mean 2.0263 1.769 1.145 0.252 -1.441 5.494\n",
"linear_acceleration_mean -6.1539 1.390 -4.427 0.000 -8.879 -3.429\n",
"orientation_mean -0.0112 0.003 -3.412 0.001 -0.018 -0.005\n",
"pressure_mean -0.1061 0.031 -3.456 0.001 -0.166 -0.046\n",
"rotation_vector_mean -3.7290 1.312 -2.843 0.004 -6.300 -1.158\n",
"sound_mean -0.1043 0.025 -4.151 0.000 -0.154 -0.055\n",
"const 144.7582 35.347 4.095 0.000 75.479 214.037\n",
"---------------------------------------------------------------------------------------------\n",
" target=Train coef std err z P>|z| [0.025 0.975]\n",
"---------------------------------------------------------------------------------------------\n",
"accelerometer_mean -0.4580 0.518 -0.883 0.377 -1.474 0.558\n",
"game_rotation_vector_mean 0.9464 0.830 1.140 0.254 -0.681 2.574\n",
"gyroscope_mean 0.0587 0.632 0.093 0.926 -1.180 1.298\n",
"linear_acceleration_mean -1.7283 0.255 -6.766 0.000 -2.229 -1.228\n",
"orientation_mean -0.0237 0.002 -11.086 0.000 -0.028 -0.019\n",
"pressure_mean 0.0276 0.011 2.432 0.015 0.005 0.050\n",
"rotation_vector_mean -8.2604 0.901 -9.171 0.000 -10.026 -6.495\n",
"sound_mean 0.1133 0.020 5.724 0.000 0.075 0.152\n",
"const -20.3954 13.175 -1.548 0.122 -46.217 5.426\n",
"---------------------------------------------------------------------------------------------\n",
" target=Walking coef std err z P>|z| [0.025 0.975]\n",
"---------------------------------------------------------------------------------------------\n",
"accelerometer_mean 0.1972 0.211 0.934 0.350 -0.216 0.611\n",
"game_rotation_vector_mean 8.2232 1.216 6.762 0.000 5.840 10.607\n",
"gyroscope_mean 3.3952 0.576 5.897 0.000 2.267 4.524\n",
"linear_acceleration_mean 0.8137 0.132 6.149 0.000 0.554 1.073\n",
"orientation_mean -0.0108 0.002 -4.662 0.000 -0.015 -0.006\n",
"pressure_mean 0.0122 0.015 0.817 0.414 -0.017 0.042\n",
"rotation_vector_mean -6.9962 1.184 -5.908 0.000 -9.317 -4.675\n",
"sound_mean -0.0786 0.016 -4.811 0.000 -0.111 -0.047\n",
"const -9.8708 15.770 -0.626 0.531 -40.779 21.037\n",
"=============================================================================================\n"
]
}
],
"source": [
"x = sm.add_constant(x, prepend = False)\n",
"mnlogit_mod = sm.MNLogit(y, x,\n",
" # method=\"bfgs\", \n",
" # maxiter=250\n",
" )\n",
"mnlogit_fit = mnlogit_mod.fit()\n",
"print (mnlogit_fit.summary())"
]
},
{
"attachments": {},
"cell_type": "markdown",
"id": "07724620-5ad7-4e8c-a625-57fae1a67f67",
"metadata": {},
"source": [
"多項ロジットモデルでは、選択肢の数をkとするとk-1個のモデルを推定します。\n",
"上の出力を見ると、5つの選択肢のうちBusがベース(参照グループ)として設定されているため、出力された結果を見る際には、パラメーターの推定値は、参照グループであるバスに対する相対的なものとなります。\n",
"\n",
"多項ロジットモデルでの一般的な解釈は、説明変数の単位変化に対して、参照グループに対して、モデル内の他の変数が一定である場合、パラメーター推定値の分だけ変化すると期待されることになります。\n",
"\n",
"上の結果で`target=Car`の出力結果では、バスと車の相対比較を示しています。\n",
"\n",
"`accelerometer_mean`の推定された係数は`-1.340`で、モデル内の他の変数が一定である場合、バスに対する車の`accelerometer_mean`の値が1単位増えると、バスより車である可能性は1.340減少すると解釈できます。\n",
"\n",
"同様に、`game_rotation_vector_mean`が1単位増えると、モデル内の他の変数が一定である場合、ユーザーの移動手段はバスであるよりも車である可能性が2.8793減少する可能性があると解釈できます。"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.16"
}
},
"nbformat": 4,
"nbformat_minor": 5
}