movement-trajectory について
タイムスタンプ付き位置点から、検証済みの移動、滞在、集計パターンを導く移動分析スキルです。サンプリング品質、座標と時刻の扱い、検証、プライバシー保護を重視します。
主な機能
- 01サンプリング間隔と軌跡品質の把握
- 02位置点のクリーニングと時間ギャップでの分割
- 03滞在の検出とトリップの導出
- 04道路ネットワークへのマップマッチング
- 05プライバシー制御を伴う移動データの集計
活用シーン
- 01速度分析前のGPS軌跡のクリーニング
- 02車両軌跡からの滞在とトリップの集計
- 03プライバシーに配慮した移動フローマップの作成
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ muend/ geoai-skills --skill movement-trajectoryインストール後、Claude Code で/movement-trajectoryを入力して読み込まれたか確認します。
同梱ファイルagents/openai.yamlreferences/authoritative-sources.md
詳細
移動・軌跡分析
目的: ノイズの多いタイムスタンプ付きポイントを、防御可能な移動の事実に変えること。繰り返し発生する失敗パターンは、GPS ノイズ越しに計算された速度(テレポートするポイント → 時速 400 km の歩行者)、信号ドリフトによって捏造される停車、そして個人レベルの軌跡のプライバシーを無視した配信です。
まずデータモデル
軌跡 = オブジェクトごとの順序付けられたフィックス: (object_id, timestamp, x, y, [accuracy, ...])。分析の前に、オブジェクトごとに報告します: フィックス数、時間
範囲、サンプリング間隔の中央値、間隔の分布 — サンプリングレートがすべての手法選択を
左右します(1 秒の車両軌跡と 1 時間に 1 フィックスの動物タグは、同じスキーマを
まとった別問題です)。
import movingpandas as mpd
import geopandas as gpd
gdf = gpd.GeoDataFrame(df, geometry=gpd.points_from_xy(df.lon, df.lat),
crs=4326).to_crs(gdf_utm_epsg)
tc = mpd.TrajectoryCollection(gdf, "object_id", t="timestamp")
しきい値の前に CRS と時間基準を宣言する
このスキルにおけるあらゆる距離半径、速度制限、滞在時間は、2 つのことが 数値が使われる前に、回答の中で述べられるまで無意味です:
- 投影 CRS — すべての距離と速度の計算がその中で実行されるもの。生の経度/緯度の度に適用された「50 m の停車半径」はどこでも 50 m ではなく、誤差は緯度に比例して拡大します。CRS を明記してください(ローカルな車両群には
estimate_utm_crs()、大陸規模の範囲には等距離投影)。 - タイムスタンプ基準 — タイムゾーン対応の UTC に正規化されたもの。車両群のログはローカル時刻、DST シフト、ナイーブな文字列が混在します。DST 境界をまたぐ滞在は 1 時間を獲得または失い、停車時間はひっそりと破損します。
半径や時間を提案する前に両方を述べてください。後から注意事項として付け足すのでは ありません。
宣言することは保留することではありません。 不明な CRS やタイムゾーンは、回答する代わりに立ち止まって尋ねる理由にはなりません。明示的に名前を付けた仮定として述べ、それでも手法を提供してください:
距離にはローカル UTM ゾーンを仮定し、タイムスタンプは UTC 正規化が必要なナイーブなローカル時刻であると仮定します — どちらも滞在時間を変えるため、確認してください。
そのうえで、クリーニング手順、パラメータ、感度チェックを示してください。CRS、タイムゾーン、またはファイルを手法の代わりに求める回答は、たとえその質問が妥当であっても、このスキルとしては失敗です。回答と並べて尋ねてください。決して代わりに尋ねてはいけません。ナイーブなタイムスタンプを UTC として黙って扱わないでください — ただし「黙って」が要点です。ラベルを付けて明示した仮定こそが、まさに求められているものです。
クリーニングパイプライン(順番どおりに)
- 重複排除: 同一の (object, timestamp) フィックスを削除します。
- 精度フィルター: その列が存在する場合、HDOP/精度のしきい値を超えるフィックスを削除します(しきい値と削除率 % を報告します)。
- 速度フィルター: そのモードでは不可能な速度を意味するフィックスを削除します(歩行 > 15 km/h が持続、車 > 200 km/h など)。反復してください — 1 つの不良フィックスが 2 つの不良セグメントを生みます(
mpd.OutlierCleaner)。 - ギャップ分割: 時間的なギャップ(例: 間隔の中央値の 5 倍超)で軌跡を分割します — トンネル/電源オフをまたいで補間すると、移動を捏造します。
- ジッターの多い都市キャニオンデータには、オプションの平滑化(Kalman/移動中央値) — 外れ値除去の後、そして停車検出のチューニングより前には決して行いません。
各ステップの集計行: 入力フィックス → 出力フィックス。
停車とトリップ
停車 = 空間的な滞在: 最小継続時間のあいだ距離半径内にあるフィックス(mpd.TrajectoryStopDetector(max_diameter=50, min_duration=timedelta(minutes=5)))。この 2 つのパラメータが結果そのものです —
それらを報告し、±50% の感度チェックを実行してください。都市キャニオンのドリフトは
移動を模倣するため、GPS ノイズレベル未満の直径では停車がゼロになります。
トリップ = 停車間のセグメント。トリップごとに提供します: 起点、目的地、
開始/終了時刻、継続時間、長さ、該当する場合は主要モードの推定。OD
行列: トリップ端点をゾーンに集約します(下記のプライバシーを参照)。
結果として得られるフローに関するアクセシビリティの質問 → network-accessibility-analysis。
マップマッチング
生の GPS は道路上にはありません。道路に紐づくあらゆる主張(走行距離、街路レベルの流動、速度超過)については、まずネットワークにマッチングしてください:
- ツール:Valhalla(Meili)、OSRM の
match、またはmappymatch。HMM ベースのマッチャーが標準です。 - サンプリング間隔が約 30 秒を超えるとマッチング精度が急激に低下します — マッチ信頼度と未マッチ点の割合を報告し、未マッチのジオメトリを黙って保持しないでください。
- 動物のトラックやオフロードの移動をマップマッチングしてはいけません(当然ですが)— また、生のノイズの多いフィックスから「移動距離」を計算しないでください(ノイズは経路長を約 5〜20% 膨らませます)。まず平滑化し、手法を明記してください。
集計分析
- フローマップ / デザイアライン:プロット前に OD ペアを集計します(配信には
cartography-geoviz)。ヘアボール回避 = ゾーンレベルの集計 + 最小フロー閾値。 - 密度:フィックスの KDE またはヘックスビンか、トリップのそれか — フィックスは低速移動を過大評価します(滞在 = 多数のフィックス)。トリップベースまたは時間加重密度を使用し、どちらかを明記してください。
- 時空間クラスタリング(共在、コンボイ):ST-DBSCAN 系。空間と時間の両方のクラスターパラメータを一緒に報告します。
- 系列 / 周期性:行動に関する主張を行う前に、オブジェクトクラスごとの時間帯 × 曜日の活動マトリクスを作成します。
プライバシー — 任意ではありません
個人の軌跡はほぼどこでも個人データであり(GDPR など)、再識別が容易であることで悪名高いです(自宅 / 職場のアンカーペアでほとんどの人が特定されます)。デフォルト:共有前に集計(ゾーンは k オブジェクト以上、k 未満のセルは抑制、典型的な k = 5〜10)、自宅付近のトリップ端点を切り捨て、明示的な許可なく生の個人トレースを公開しないこと。すべての成果物に適用した匿名化を明記してください。
検証プロトコル
- クリーニング後のモード別速度ヒストグラム — 裾は物理的に妥当でなければなりません。
- サンプル軌跡 3 件(生 vs クリーニング済み vs マッチング済み)をベースマップ上に表示。
- 停止検出の感度:パラメータ ±50%、停止数の変化を報告。
- OD 合計がトリップ数と整合する(アカウンティング)。
落とし穴チェックリスト
- ギャップをまたいだ、または外れ値フィックスを通した速度計算。
- 生の(平滑化・マッチングされていない)フィックスからの移動距離。
- GPS ノイズ以下の半径で検出された停止、またはトリップとしてカウントされたドリフト。
- 混在するタイムゾーン / DST の跳びによるファントムテレポート。
- フィックス密度マップを移動密度マップとして読んでしまう。
- 集計 / 抑制なしで出荷された個人トレース。
- オブジェクト別には分割されているが、時間的ギャップ別には分割されていない軌跡。
実行契約
- ワークフロー: 識別子、時刻、CRS を検証し、トラックをセグメント化し、不可能なフィックスを除去し、停止またはトリップを推定し、必要に応じてマップマッチングし、集計し、プライバシー制御を適用し、検証します。
- 判断ルール: 観測されたタイムスタンプ付き移動には軌跡手法を、可能な経路やアクセスにはネットワーク分析を、系列と識別情報が欠如している場合には点パターン手法を使用します。
- 検証プロトコル: 速度とギャップの分布を検査し、生とクリーニング済みのサンプルをマッピングし、停止パラメータを摂動させ、トリップ数と OD 数を整合させ、開示リスクを監査します。
- 失敗モード: タイムゾーンの曖昧さ、長いギャップ、非現実的な速度、不十分なネットワークマッチング、疎なサンプリング、または再識別リスクがある場合、結果を抑制または限定します。
- 成果物: クリーニング済み軌跡または承認済み集計、セグメンテーションルール、品質レポート、派生した停止 / トリップテーブル、プライバシー処理、マップ、および制限事項。
- ソースの鮮度: フォーマット、ライブラリ、またはプライバシーに関するガイダンスを使用する前に権威あるソースレジストリを参照し、確認日を記録してください。