センサーデータ ── IoT機器(温度センサー・加速度センサー・GPS・カメラなど)が一定間隔で出力する 時系列 計測値の総称。
(timestamp, sensor_id, value) のロングフォーマットが基本。サンプリング周波数(Hz)・タイムゾーン・単位を必ず記録df.resample('1min').mean())から始めるあなたは データエンジニアリング カテゴリの「データソース」位置にいます。 ここから データ収集 → クレンジング → データレイク → DataFrame へと進むパイプラインの最上流です。
SSDSE-B-2026 のような 公的統計データ(年次・都道府県別) とは対照的に、 センサーデータは 高頻度・微細粒度・大量 という性質を持ちます。 公的統計が「結果」を扱うとすれば、 センサーは「現象そのもの」を直接記録しているとも言えます。
センサーデータを一言で言えば「世界の状態を、機械が等間隔で覗き続けた記録」です。 人間がメモを取るのと違って、 1 秒に 100 回でも 1000 回でも、 何ヶ月でも休まず計測し続けます。
具体例で見ましょう:
いずれも形式は同じ:(時刻, センサーID, 値) の3つ組。 これを 横長 に並べ替える(ピボット)と、「時刻×センサー」の表になります。
類比すれば天気予報の観測網。 全国 1300 箇所の AMeDAS が黙々と数字を吐き、それを後から集めて気象庁が解析する ── あの仕組みが、 工場・店舗・人体に小型化して埋め込まれたのが現代の IoT センサーです。
センサーデータは、 物理量 $x(t)$ をサンプリング周期 $\Delta t$ で離散化した時系列:
$$ x_n = x(n \cdot \Delta t) + \varepsilon_n, \quad n = 0, 1, 2, \ldots, N-1 $$
ここで $\varepsilon_n$ はセンサー固有のノイズ(白色ガウス+ドリフト+量子化)。 サンプリング定理(ナイキスト)より、 信号の最高周波数 $f_{\max}$ に対し $1/\Delta t > 2 f_{\max}$ でなければエイリアシングが発生します。
英語名 Sensor Data。 別称:IoT Data、Telemetry Data、機器ログ。 構造化データ(構造化データ)の一種ですが、 時間軸の特殊性ゆえに別カテゴリで論じられることが多い。
| 分類 | 代表例 | 典型 $f_s$ | 単位 | 主な用途 |
|---|---|---|---|---|
| 温湿度 | DHT22, SHT31 | 0.1–1 Hz | °C, %RH | 空調制御、農業 |
| 加速度 | MPU-6050, ADXL345 | 100–1000 Hz | m/s², g | 振動診断、歩行解析 |
| 位置(GPS) | u-blox NEO-6M | 1–10 Hz | 緯度・経度・高度 | 物流追跡、ドライブレコーダ |
| 電力 | スマートメーター | 1/1800 Hz (30分) | kWh | 需要予測、料金計算 |
| 画像/LiDAR | RealSense, Velodyne | 10–60 Hz | 画素値、点群 | 自動運転、検査 |
| 生体 | PPG, ECG, EDA | 25–500 Hz | bpm, mV, µS | 健康モニタ、ストレス推定 |
| 気象 | AMeDAS, 雨量計 | 1/600 Hz (10分) | °C, mm, hPa | 災害予測、農業 |
スマートウォッチが心拍数を 1 分毎に 1 日記録した場合の規模を見積もります。
| 項目 | 値 | 計算 |
|---|---|---|
| 1日あたり行数 | 1,440 | 24 × 60 |
| 1年あたり行数 | 525,600 | 1,440 × 365 |
| 1行のサイズ目安 | 40 byte | timestamp 19 + 値 8 + 区切り + EOL |
| 1年あたりサイズ | 21 MB | 525,600 × 40 |
| 100万ユーザー全員 | 21 TB / 年 | CSV 平文 |
| Parquet 圧縮後 | 約 2 TB / 年 | 10倍圧縮想定 |
これが「ビッグデータ」と呼ばれる所以です。 CSV のままでは扱いきれず、圧縮・分散処理・データレイク が必要になります。
この用語を理解・使用するときは、 次のような前提を意識してください:
公的統計データ(SSDSE 等)の年次データを「センサーデータ風」に時系列化する例から始めます。 実際の IoT ストリームでも処理は同じです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | import pandas as pd import numpy as np # 1. SSDSE-B の年次データを読込 df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='utf-8', skiprows=1) print(df.shape, df.dtypes.head()) # 2. 「年」をタイムスタンプに変換(時系列処理の第一歩) df['ts'] = pd.to_datetime(df['年度'].astype(str) + '-01-01') df = df.set_index('ts').sort_index() print(df.index) # 3. 日次にリサンプリング(年→日への線形補間) daily = df[['人口総数']].resample('D').interpolate(method='linear') print(daily.head(10)) |
本物のセンサーデータでは、 次のような処理が中心になります:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | # 仮想センサーデータの典型処理 import pandas as pd import numpy as np # CSV ロード(タイムスタンプを index に) df = pd.read_csv('data/raw/sensor.csv', parse_dates=['timestamp']) df = df.set_index('timestamp').sort_index() # (A) 欠測検出:サンプリング間隔が空いている箇所 gaps = df.index.to_series().diff() print('最大ギャップ:', gaps.max()) print('期待間隔の倍数で欠測:', (gaps > pd.Timedelta('2s')).sum()) # (B) リサンプリング:1秒粒度に統一 resampled = df['temperature'].resample('1S').mean() # (C) 移動平均(ノイズ除去) smoothed = resampled.rolling(window=10, center=True).mean() # (D) 外れ値検出:3σ ルール mu, sigma = resampled.mean(), resampled.std() outliers = (resampled - mu).abs() > 3 * sigma print('外れ値件数:', outliers.sum()) |
高頻度(kHz オーダー)のセンサーは周波数解析(FFT)も基本ツール:
1 2 3 4 5 6 7 8 9 10 11 12 13 | from scipy.fft import rfft, rfftfreq fs = 1000 # 1 kHz サンプリング x = resampled.values N = len(x) # 高速フーリエ変換でスペクトルを得る X = np.abs(rfft(x - x.mean())) freqs = rfftfreq(N, d=1/fs) # 最大ピーク周波数(振動の主成分) peak_freq = freqs[X.argmax()] print(f'主成分周波数: {peak_freq:.2f} Hz') |
大規模なセンサーログは polars や duckdb、 さらには Spark/Dask 系の分散処理が有効:
1 2 3 4 5 6 7 8 9 10 11 12 | import polars as pl # 1億行でもメモリにロードできる Parquet 形式 df = pl.read_parquet('data/raw/sensor.parquet') # 1分粒度に集約 agg = (df.lazy() .group_by_dynamic('timestamp', every='1m') .agg([pl.col('value').mean().alias('avg'), pl.col('value').std().alias('sd')]) .collect()) print(agg.head()) |
tz_convert('Asia/Tokyo') を必ず明示し、 ログ表頭にも記載。temp_celsius のように単位を埋め込むのが安全。センサーデータの特徴を、 他の典型的なデータ種別と並べてみます:
| 特徴 | センサーデータ | 行動ログ | SNSデータ | 公的統計(SSDSE) |
|---|---|---|---|---|
| 頻度 | Hz〜kHz | 数秒〜分 | 不規則 | 年次・月次 |
| 値の型 | 数値(連続) | イベント+属性 | テキスト・画像 | 集計値 |
| ノイズ | 高(物理ノイズ) | 低 | 中(スパム) | 極低 |
| 代表処理 | フィルタ・FFT | セッション化 | NLP・OCR | 記述統計 |
| 最適格納 | Parquet+時系列DB | RDB+NoSQL | オブジェクトストア | CSV / Excel |
分析結果を報告するときに含めるべき情報:
生の波形のまま機械学習にかけることは稀で、 通常は 窓(window) 単位で統計量を集約します。 代表的な特徴量を整理します:
| 領域 | 特徴量 | 意味 | 用途 |
|---|---|---|---|
| 時間領域 | 平均・分散 | 中心と広がり | 基準値ずれ検出 |
| RMS | $\sqrt{\frac{1}{N}\sum x_n^2}$ | エネルギー | |
| 尖度・歪度 | 分布形状 | 衝撃検出 | |
| ゼロクロス率 | 符号変化回数 | 周波数指標 | |
| ピーク間隔 | 極大値の周期 | 周期成分推定 | |
| 周波数領域 | 主周波数 | FFT のピーク位置 | 回転数推定 |
| スペクトル重心 | エネルギー重心 | 音色識別 | |
| エネルギー比 | 帯域別エネルギー | 機器固有周波数監視 | |
| スペクトルエントロピー | $-\sum p_i \log p_i$ | スペクトル形複雑さ | |
| 時間-周波数 | STFT | 短時間 FFT | 非定常信号 |
| ウェーブレット | 多重解像度分解 | 衝撃イベント検出 |
tsfresh ライブラリを使えば、 これら数百種類の特徴量を1コマンドで計算できます。 ただし全部を機械学習に投入するとリークや過学習の原因なので、 SHAP 等で重要度を絞ること。
回転機械(ポンプ・モーター)の軸受に加速度センサーを取り付け、 1 kHz サンプリングで振動波形を取得。 故障前に必ず現れる周波数成分(軸受固有周波数)を FFT で監視し、 「ピーク高さが平常時の 2 倍を超えたらアラート」とする運用が一般的です。
難所は ① 学習用の故障データが少ない(教師なし異常検知になりがち)、 ② 工場の停止時間も「異常値」として記録される、 ③ ベルト交換等のメンテ後に基準が変わる、の3点。 これらは 外れ値処理 と クレンジング の章で扱います。
センサーデータを受け取ったら、 モデル学習に入る前に 必ず 以下のメトリクスを記録します。 これが「あとからモデルが期待通り動かない」原因の大半を未然に排除します。
| 指標 | 定義 | 合格目安 |
|---|---|---|
| サンプル率 | 受信件数 / 期待件数 | ≥ 99% |
| 最大ギャップ | 連続欠測の最長時間 | ≤ 5×$\Delta t$ |
| タイムスタンプ単調性 | 逆行・重複ゼロか | 100% |
| 値域逸脱率 | 物理的に不可能な値の割合 | 0% |
| クロックスキュー | NTP 基準との差 | ≤ 100 ms |
| SNR | 信号対雑音比 | ≥ 20 dB が目安 |
これらは データクレンジング の前に算出し、 「データ受領レポート」として共有するのが鉄則です。 問題があれば取得側に戻すことで、 下流で個別対応するより遥かに安価で頑健になります。
Q1. CSV と Parquet、どちらで保存すべき?
短期検証は CSV、 本番運用は Parquet(または ORC)が定石です。 Parquet は列指向+圧縮+スキーマ保持で、 「ある列だけ集計したい」というセンサー解析の典型クエリで CSV の 10〜100 倍速。 SQLite/DuckDB と組み合わせると JOIN もそのまま走ります。
Q2. リアルタイム性とコストのトレードオフは?
「秒単位の遅延が必要か」を最初に問うこと。 多くの監視は分単位で十分。 そうであれば Kafka 必須ではなく、 5 分毎にバッチで集めて DWH に投入する設計で十分。 リアルタイム=コストが10倍、と考えてよい。
Q3. 異常検知は教師あり/教師なし、どちらで始める?
最初は教師なし(Isolation Forest, One-Class SVM, オートエンコーダ)。 故障ラベルは現場では極めて貴重で集めにくく、 まず「正常」を学習した後で乖離を見るのが現実的。 ラベルが蓄積したら教師ありモデル(XGBoost 等)に移行。
Q4. プライバシーへの配慮は?
位置情報・生体データは個人情報保護法の規制対象。 集約後に保存する、 個人 ID を仮名化する、 利用目的を明示するなど。 データガバナンス の章で詳述。
Q5. SSDSE のような公的統計データもセンサーデータ?
広義には No(人が集計したデータ)。 ただし AMeDAS の気象観測値や、 道路交通センサー集計値などは公的に提供されるセンサー由来データの代表例。 e-Stat の「気象観測」「交通量調査」カテゴリを参照。
センサー=物理量を電気信号に変換する素子、 という概念は熱電対(1821 年、 ゼーベック効果)まで遡れます。 計算機との結合は次の段階で進みました:
分析手法も並行して進化し、 古典的なフィルタ理論(カルマン、 1960)から、 ARIMA(Box-Jenkins、 1970)、 隠れマルコフモデル(90 年代)、 LSTM(1997 提案、 2010 年代復権)、 そして近年は Transformer ベースの時系列モデルへと展開。