🦄

センサーデータの回帰分析による体動検知モデル構築と特徴量の定量評価

に公開

はじめに

センサーデータを加工して保存すると様々な特徴量(列データ)が時系列で取得できますよね。このデータに対して、例えば今回のように特定の変動(体動)が起こったときの各特徴量の変化、影響度を確認したい場合に、可視化して眺めて、これかなと判断できるならいいのですが、複雑に絡み合っていてどの特徴量がどのくらい影響しているのか調べたいときに回帰分析を行います。今回は呼吸のセンサーデータから、呼吸信号を乱すような体動が起きた時に1、それ以外の状態を0としてターゲット変数を追加し、体動が起きたときにどの特徴量に影響してそうかを定量的に判断します。そのステップで、多重共線性やクラス不均衡について触れながら、回帰分析を行いたいと思います。

この記事で解説すること

  • センサーデータ(332行×34列)からの体動検知モデル構築の全体フロー
  • 多重共線性の問題と、VIF(分散拡大係数)を用いた特徴量選択の方法
  • クラス不均衡問題への対応手法
  • ロジスティック回帰による体動検知モデルの性能評価(混同行列、ROC曲線の見方)
  • 特徴量係数の解釈と、体動検知に最も寄与する特徴量
  • 回帰式による体動検知メカニズムの定量化

分析の流れ

本分析では以下の4ステップで体動検知モデルを構築します。

  1. データの理解と前処理: CSVデータの読み込み、基本統計量と欠損値の確認
  2. 探索的データ解析(EDA): 特徴量選択、相関分析、分布の可視化
  3. 特徴量エンジニアリング: VIFによる多重共線性の評価と特徴量削除、データ分割
  4. モデル構築と評価: ロジスティック回帰モデルの構築、性能評価、特徴量重要度の算出

データセット概要(332行×34列)

分析に使用したデータセットは10フレームごとのセンサーデータで、以下のカテゴリに分類される34の特徴量を含みます。

基本情報

  • frame_number: フレーム番号(時系列の順序)
  • time_s: 経過時間(秒)
  • target_position: ターゲット位置
  • target_distance_m: ターゲットまでの距離(m)

位相信号(Phase)

  • target_iq_phase: 生のIQ位相データ
  • bpf_phase: バンドパスフィルタ適用後の位相
  • kalman_filtered_phase: カルマンフィルタ適用後の位相
  • ema_smoothed_phase: EMA平滑化された位相
  • bpf_ema_phase: BPF+EMA処理後の位相
  • bpf_ema_kalman_phase: BPF+EMA+カルマン処理後の位相

周波数・呼吸指標

  • kalman_frequency_hz: カルマン推定周波数
  • peak_frequency_hz_kalman: カルマンのピーク周波数
  • peak_frequency_hz_ema: EMAのピーク周波数
  • bpm_kalman: カルマン推定BPM(呼吸数)
  • bpm_ema: EMA推定BPM

信号品質・信頼度

  • kalman_amplitude: 信号振幅
  • confidence_score_bpf: BPFの信頼スコア
  • confidence_score_raw: 生データの信頼スコア
  • confidence_score_kalman: カルマンの信頼スコア
  • stability_score_kalman: 安定性スコア

STFT(短時間フーリエ変換)関連

  • stft_success_kalman, stft_success_ema: STFT処理成功フラグ
  • stft_window_length: STFTウィンドウ長
  • stft_data_length: STFTデータ長
  • stft_peak_power_kalman, stft_peak_power_ema: STFTピークパワー

カルマンフィルタパラメータ

  • kalman_velocity: 推定速度
  • kalman_acceleration: 推定加速度
  • kalman_cov_phase: 位相の共分散
  • kalman_cov_velocity: 速度の共分散
  • kalman_cov_amplitude: 振幅の共分散
  • kalman_autocorr: 自己相関
  • ema_alpha: EMAの平滑化係数

目的変数

  • target: 体動検知フラグ(0=なし, 1=あり) ← 予測対象

クラス不均衡問題

データセット全体では、体動なし(target=0)が90.1%、体動あり(target=1)が9.9%と大きな不均衡が存在します。

データ分割後も同様の傾向が見られます:

  • 訓練データ: 265件(体動なし239件[90.2%]、体動あり26件[9.8%])
  • テストデータ: 67件(体動なし60件[89.6%]、体動あり7件[10.4%])

このようなクラス不均衡がある場合、モデルが多数派クラス(体動なし)ばかりを予測してしまい、少数派クラス(体動あり)を適切に学習できない問題が発生します。

対策方法:

  • ロジスティック回帰でclass_weight='balanced'を設定し、少数クラスに高い重みを付ける
  • 評価指標としてAccuracyだけでなく、Precision、Recall、F1-Score、AUCを重視する

特徴量選択

多重共線性について

多重共線性とは、説明変数(特徴量)同士が強く相関している状態を指します。

例えば、今回のデータではbpm_kalman = peak_frequency_hz_kalman × 60という関係があり、これらは完全に相関しています。

多重共線性があると何が問題か?

  • ロジスティック回帰の係数が不安定になる
  • どの特徴量が重要か判断しにくくなる(重要度が分散する)
  • 係数の解釈が困難になる(符号が逆転することも)
  • モデルの汎化性能が悪化する

VIF(分散拡大係数)とは?

VIF(Variance Inflation Factor)は、多重共線性の深刻度を数値化する指標です。

VIF = 1 / (1 - R²)
  • R²: その変数を他の全変数で回帰したときの決定係数
  • VIF = 1: 完全に独立(理想的)
  • VIF = 5-10: 注意が必要
  • VIF > 10: 深刻な多重共線性

相関行列は2変数間の関係しか見ませんが、VIFは「1つの変数が他の全変数で説明される度合い」を測定するため、3つ以上の変数間の複雑な関係も検出できます。

特徴量選択の流れ

ステップ1: 初期の相関分析

まず、31特徴量間の相関を可視化し、高度に相関する特徴量グループを特定しました。

主な相関グループ:

  • 信頼スコアグループ: kalman_autocorr ⟷ confidence_score_bpf ⟷ confidence_score_kalman (相関係数: 0.98-1.00)
  • BPM/周波数グループ: bpm_kalman ⟷ peak_frequency_hz_kalman (相関係数: 1.00)
  • 位置情報グループ: target_distance_m ⟷ target_position (相関係数: 1.00)

ステップ2: VIFによる定量評価と特徴量削除

VIFを計算し、多重共線性が深刻な以下の9特徴量を削除しました:

  1. confidence_score_bpf
  2. kalman_autocorr
  3. peak_frequency_hz_kalman
  4. peak_frequency_hz_ema
  5. target_position
  6. kalman_cov_velocity
  7. stft_success_ema
  8. stft_success_kalman
  9. stability_score_kalman

ステップ3: 削除後の相関確認

削除後も一部高い相関が残っていますが(最大0.99)、大幅に改善されておりモデル構築が可能なレベルになりました。最終的に22特徴量を選択しました。

ロジスティック回帰による体動検知モデルの性能評価

混同行列(Confusion Matrix)の説明

混同行列は、モデルの予測結果を4つのカテゴリに分類して表示します。

                予測: 0    予測: 1
実際: 0 (体動なし)   TN=50     FP=10
実際: 1 (体動あり)   FN=1      TP=6
  • TN(真陰性): 体動なしを正しく体動なしと予測 → 50件
  • FP(偽陽性): 体動なしを誤って体動ありと予測 → 10件
  • FN(偽陰性): 体動ありを誤って体動なしと予測 → 1件
  • TP(真陽性): 体動ありを正しく体動ありと予測 → 6件

評価指標:

  • 全体精度(Accuracy): (TN+TP)/(全体) = 56/67 = 83.6%
  • 適合率(Precision): TP/(TP+FP) = 6/16 = 37.5% - 体動ありと予測したうち実際に体動があった割合
  • 再現率(Recall): TP/(TP+FN) = 6/7 = 85.7% - 実際の体動のうち検出できた割合

今回のモデルでは、体動の見逃し(FN)が1件のみで再現率85.7%と高い性能を示しています。ただし、誤検知(FP)が10件あり、適合率は37.5%とやや低めです。

ROC曲線(Receiver Operating Characteristic)の説明

ROC曲線は、閾値を変化させた際の真陽性率(TPR)と偽陽性率(FPR)の関係を可視化します。

  • 横軸: 偽陽性率(FPR) = FP/(FP+TN) - 体動なしを誤って体動ありと判定する割合
  • 縦軸: 真陽性率(TPR) = TP/(TP+FN) = Recall - 実際の体動を正しく検出する割合
  • 点線: ランダム分類器(何も学習していない状態)
  • AUC: 曲線下面積。1に近いほど優れた性能

ROC曲線の見方:

  • 理想的なモデルは曲線が左上の隅に近い
  • 点線(対角線)から大きく離れているほど良い性能
  • 「誤検知を少なく抑えながら、高い検出率を達成できる」ことを意味

今回のモデルではAUC = 0.926と高い識別性能を示しており、ランダム分類器を大きく上回る性能を確認できました。

ロジスティック回帰式による体動検知メカニズムの定量化

特徴量係数の可視化

ロジスティック回帰の係数から、体動検知への影響度を定量化しました。

標準化済みデータを使用しているため、係数の絶対値の大きさが重要度を表します。

  • 正の係数(緑): 値が大きいほど体動検知されやすい
  • 負の係数(赤): 値が大きいほど体動検知されにくい

重要な特徴量TOP10とその解釈

正の影響を与える特徴量:

  1. confidence_score_kalman (係数: +3.181)
  2. confidence_score_raw (係数: +1.314)
  3. ema_smoothed_phase (係数: +0.821)
  4. stft_peak_power_ema (係数: +0.703)
  5. target_iq_phase (係数: +0.304)

負の影響を与える特徴量:

  1. kalman_cov_phase (係数: -2.579)
  2. bpm_ema (係数: -0.862)
  3. stft_peak_power_kalman (係数: -0.790)
  4. kalman_cov_amplitude (係数: -0.711)
  5. kalman_acceleration (係数: -0.520)

回帰式による体動検知確率の算出

ロジスティック回帰モデルは以下の式で体動検知確率を計算します:

z = β₀ + 3.181×confidence_score_kalman 
    - 2.579×kalman_cov_phase
    + 1.314×confidence_score_raw 
    - 0.862×bpm_ema
    + 0.821×ema_smoothed_phase 
    - 0.790×stft_peak_power_kalman
    - 0.711×kalman_cov_amplitude 
    + 0.703×stft_peak_power_ema
    - 0.520×kalman_acceleration 
    + 0.304×target_iq_phase
    + (その他12特徴量の寄与)

体動検知確率 = 1 / (1 + e^(-z))

この式により、各特徴量の定量的な寄与度を評価でき、体動検知メカニズムを数式で記述することができました。

考察

分析結果から、以下の知見が得られました:

  • 信号品質(confidence score)が体動検知の鍵: 最も重要な特徴量は信頼スコアであり、信号品質が良好なときに体動を確実に検出できる
  • カルマンフィルタの不確実性が体動判定を妨げる: 共分散(不確実性)が高い状態では体動判定が困難
  • 位相情報と周波数パワーが重要: EMA平滑化された位相やSTFTピークパワーが体動検知に有効
  • BPMの安定性: 通常の呼吸リズムが確立している状態では体動と判定されにくい

今後の検討事項

体動時の呼吸測定安定化に向けたカルマンフィルタ改善策

分析結果を踏まえ、体動時の呼吸測定を安定化させるための3つの改善策を提案します。

1. 適応的観測ノイズ調整

アプローチ: Confidence scoreと連動した観測ノイズ共分散Rの動的調整

  • 体動時はconfidence scoreが低下するため、これを観測ノイズ共分散Rに反映
  • スコアが低い時はRを大きくし、観測値の信頼度を下げる
  • スコアが高い時は観測値を重視

検討課題:

  • Confidence scoreがどのくらい低下したらRを大きくするか
  • どのくらい復帰したら元に戻すかの閾値設定

2. 外れ値検出・棄却機能の追加

アプローチ: Mahalanobis距離による観測値の妥当性判定

  • 観測値と予測値の乖離が閾値を超えた場合、その観測値を棄却
  • 体動による急激な変化を異常値として扱い、予測値のみで状態更新

検討課題:

  • 観測値から予測値のみの状態更新に切り替える際の差分評価指標
  • 初期値が観測値で適当かどうかの判断方法
  • 予測値から観測値への復帰判定方法

3. 多変量カルマンフィルタ化

アプローチ: Distance情報も状態変数に含める

  • 呼吸周波数だけでなく、センサー検知範囲の変動も同時推定
  • 体動によるdistance変化と呼吸周波数を分離して推定
  • 他の指標と組み合わせて体動検出精度を向上

検討課題:

  • どの指標を追加すれば体動検出精度が向上するか
  • 状態変数の次元増加に伴う計算コストの評価

これらの改善策により、体動時でも安定した呼吸測定を実現できる可能性があります。

まとめ

本記事では、センサーデータ(332行×34列)からの体動検知モデル構築を通じて、以下の内容を解説しました:

  • 多重共線性を考慮した特徴量選択(VIFによる9特徴量の削除)
  • クラス不均衡問題への対応(class_weight='balanced'の使用)
  • ロジスティック回帰による高精度な体動検知(AUC=0.926、Recall=85.7%)
  • 特徴量係数の定量化による体動検知メカニズムの解明
  • カルマンフィルタ改善に向けた3つの提案

最重要知見は、信号品質(confidence score)が体動検知の鍵であり、カルマンフィルタの不確実性を適切に管理することで、体動時でも安定した呼吸測定が可能になる点です。

今後は提案した改善策を実装し、体動時の呼吸測定精度向上を目指していきます。

Discussion