# データ辞書：購買パネルとIoT行動

基準日=2026-08-31当日末。観測期間=2026-07-01〜08-31。IDは文字列、空欄は欠損。日時はタイムゾーン情報を解釈してAsia/Tokyoに変換する。
各表の主キーで全列一致の重複だけを除外。主キーが同じで内容が違う場合は隔離して報告する。

| ファイル | 1行の単位・主キー | 列と扱い |
| --- | --- | --- |
| panelists.csv | 調査参加者1人 / panelist_id | age_band、region、household_sizeは登録時属性。panel_weightは研修用に与えた正の設計ウェイト。iot_consent=1の人だけIoT連結分析に利用可。全400人が7月1日から購買調査対象 |
| companies.csv | 架空企業1社 / company_id | company_name=架空チェーンA〜H |
| stores.csv | 店舗1店 / store_id | company_id=所属企業。region=店舗地域（パネルの居住地域と別）。企業対応はこちらを正とする |
| purchases-july.csv / purchases-august.csv | 買物のカテゴリ明細1行 / line_id（両月横断） | basket_id=買物1回、panelist_id、purchased_at、company_id、store_id、category、quantity、spend_jpy（その明細全体の支出、単価ではない）。同じbasket_idに複数カテゴリがある |
| iot_events.csv | 入店/退店の観測イベント1件 / event_id | visit_id=来店1回、panelist_id、store_id、event_type=enter/exit（大小文字あり）、event_at=イベント時刻（UTC/JST混在）。退店欠落・不正時刻・逆転・不明店舗を含む |
| survey.csv | パネル参加者1人の事前回答 / panelist_id | survey_date=2026-06-30。shopping_interest=買物関心1〜5（欠損あり）、price_sensitivity=価格感度1〜5、priority=重視点 |

## 購買データ
- 2か月を結合し、line_idで完全一致重複を除く。
- spend_jpyは明細金額なのでquantityをもう一度掛けない。
- basket_id内の人・店舗・時刻は同一であることを確認する。カテゴリ明細を合算して1買物1行のバスケット表を作る。
- purchases.company_idとstores.company_idが違う場合は件数を記録し、店舗マスターのcompany_idを採用する。未知店舗は補完せず別記。
- 支出額・数量の集計には明細表、買物回数・再購入・IoT連結にはバスケット表を使う。
- IoT同意がない人も購買パネル分析には含む。IoT分析にだけ同意条件を適用する。

## IoT来店を作る規則
1. event_idで重複除外、event_typeを小文字化し、event_atをJSTへ変換。不正日時は識別する。
2. visit_idごとに、enter1件＋exit1件、人・店舗が同じ、既知の店舗、両時刻が観測期間内、0<滞在分<=120という条件を満たすものを来店候補とする。
3. iot_consent=1の人だけ有効来店として分析する。退店欠落や不正時刻は滞在0分にしない。各異常は重複し得るので監査のフラグ件数と採用/除外の一意来店数を区別する。

## 来店と購買の連結
- 同じpanelist_id・store_idで、入店時刻<=購入時刻<=退店時刻+30分なら連結候補。
- 複数の有効来店が候補になるときは入店が最も遅い来店へ付ける。同時刻ならvisit_id昇順の先頭。バスケットを複数来店へ複製しない。
- 有効来店を左側に残し、連結バスケットがない来店も分母に含める。複数バスケットが付いても購買来店フラグは1。
- 主分析の30分に加え、猶予0分でも再計算し、連結規則による感度を確認する。
- IoT未観測の購買を「来店しなかった」「購買しなかった」と判断しない。観測されない人・店舗がいる。

## ウェイトと解釈
panel_weightは生活者を単位とする。支出構成比は各明細支出×その人のウェイトで計算。購入者率は購入者ウェイト合計/対象パネル全員のウェイト合計。
これは研修用の設計ウェイトで、実際の母集団に校正したものではない。「全国市場シェア」「日本人全体」とは呼ばず、観測パネル内の構成比・傾向として説明する。
