{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":102335,"databundleVersionId":12518947,"sourceType":"competition"}],"dockerImageVersionId":31089,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"## ✅  EDA Setup\nImport libraries, load the dataset, preview the structure, view basic stats, and explore key categorical features.\n","metadata":{}},{"cell_type":"code","source":"import numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport seaborn as sns\n\nimport os","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-07-23T06:27:41.615535Z","iopub.execute_input":"2025-07-23T06:27:41.615817Z","iopub.status.idle":"2025-07-23T06:27:41.621763Z","shell.execute_reply.started":"2025-07-23T06:27:41.615798Z","shell.execute_reply":"2025-07-23T06:27:41.620644Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Load data\nRead the training CSV file.","metadata":{}},{"cell_type":"code","source":"df= pd.read_csv('/kaggle/input/cmi-detect-behavior-with-sensor-data/train.csv')\ndf.shape","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-07-23T06:27:46.094680Z","iopub.execute_input":"2025-07-23T06:27:46.095027Z","iopub.status.idle":"2025-07-23T06:28:17.261712Z","shell.execute_reply.started":"2025-07-23T06:27:46.095004Z","shell.execute_reply":"2025-07-23T06:28:17.260788Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### View sample\nShow first 3 rows and 21 columns.","metadata":{}},{"cell_type":"code","source":"df.iloc[0:3,0:21]#max_col_num: 341","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-07-23T06:28:25.910167Z","iopub.execute_input":"2025-07-23T06:28:25.910467Z","iopub.status.idle":"2025-07-23T06:28:25.976359Z","shell.execute_reply.started":"2025-07-23T06:28:25.910447Z","shell.execute_reply":"2025-07-23T06:28:25.975405Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Summary stats\nShow basic stats of numeric features.","metadata":{}},{"cell_type":"code","source":"df.describe()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-07-23T06:28:30.138387Z","iopub.execute_input":"2025-07-23T06:28:30.138715Z","iopub.status.idle":"2025-07-23T06:28:42.336155Z","shell.execute_reply.started":"2025-07-23T06:28:30.138690Z","shell.execute_reply":"2025-07-23T06:28:42.334986Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Unique values\nCheck unique entries in key columns.","metadata":{}},{"cell_type":"code","source":"print(\"phase:\",df['phase'].unique(),'\\n ', 30 * '--') \nprint(\"sequence_type:\",df['sequence_type'].unique(),'\\n ', 30 * '--')\nprint(\"orientation:\",df['orientation'].unique(),'\\n ', 30 * '--')\nprint(\"behavior:\",df['behavior'].unique(),'\\n ', 30 * '--')\nprint(\"gesture:\",df['gesture'].unique(),'\\n ', 30 * '--')\nprint(\"subject:\",df['subject'].unique(),'\\n ', 30 * '--')\n\n#print(df.nunique()[:22])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-07-23T06:28:46.724091Z","iopub.execute_input":"2025-07-23T06:28:46.724407Z","iopub.status.idle":"2025-07-23T06:28:46.931534Z","shell.execute_reply.started":"2025-07-23T06:28:46.724384Z","shell.execute_reply":"2025-07-23T06:28:46.930443Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## ✅ Sequence & Gesture Analysis  \nThis section explores the distribution of `sequence_counter`, checks for missing values, and analyzes the number of samples and unique sequences for each gesture.\n","metadata":{}},{"cell_type":"markdown","source":"### Sequence counter distribution  \nPlot histogram of `sequence_counter` values.","metadata":{}},{"cell_type":"code","source":"df['sequence_counter'].plot(kind='hist', bins=700)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-07-23T06:28:54.942039Z","iopub.execute_input":"2025-07-23T06:28:54.942412Z","iopub.status.idle":"2025-07-23T06:28:56.107449Z","shell.execute_reply.started":"2025-07-23T06:28:54.942305Z","shell.execute_reply":"2025-07-23T06:28:56.106451Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Low Sequence Counter Histogram  \nPlot histogram for `sequence_counter` values less than 50.","metadata":{}},{"cell_type":"code","source":"df['sequence_counter'][df['sequence_counter']<50].plot(kind='hist', bins=50)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-07-23T06:28:59.096556Z","iopub.execute_input":"2025-07-23T06:28:59.096892Z","iopub.status.idle":"2025-07-23T06:28:59.396784Z","shell.execute_reply.started":"2025-07-23T06:28:59.096868Z","shell.execute_reply":"2025-07-23T06:28:59.395802Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Missing Values  \nCheck for null values in the dataset.","metadata":{}},{"cell_type":"code","source":"#with pd.option_context('display.max_rows', None, 'display.max_columns', None):\nprint(df.isnull().sum())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-07-23T06:29:03.544652Z","iopub.execute_input":"2025-07-23T06:29:03.545006Z","iopub.status.idle":"2025-07-23T06:29:04.441122Z","shell.execute_reply.started":"2025-07-23T06:29:03.544982Z","shell.execute_reply":"2025-07-23T06:29:04.440012Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Gesture Count Bar Chart  \nPlot number of samples per gesture.","metadata":{}},{"cell_type":"code","source":"df_sequence_lengths = df.groupby(\"gesture\").size()\ndf_sequence_lengths.sort_index().plot(kind='bar')\nprint(df_sequence_lengths.sort_index())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-07-23T06:29:08.313741Z","iopub.execute_input":"2025-07-23T06:29:08.314086Z","iopub.status.idle":"2025-07-23T06:29:08.647735Z","shell.execute_reply.started":"2025-07-23T06:29:08.314063Z","shell.execute_reply":"2025-07-23T06:29:08.646740Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Unique Sequences per Gesture  \nCount and plot number of unique `sequence_id`s for each gesture.","metadata":{}},{"cell_type":"code","source":"# Step 1: Count number of unique sequences per gesture\ngesture_seq_counts = df.groupby('gesture')['sequence_id'].nunique()\n# Step 2: Plot histogram (bar chart)\ngesture_seq_counts.sort_values().plot(kind='barh', figsize=(10,6))\nplt.xlabel(\"Number of Unique Sequences\")\nplt.ylabel(\"Gesture\")\nplt.title(\"Number of Unique Sequences per Gesture\")\nplt.tight_layout()\nplt.show()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-07-23T06:29:18.455137Z","iopub.execute_input":"2025-07-23T06:29:18.455453Z","iopub.status.idle":"2025-07-23T06:29:18.841081Z","shell.execute_reply.started":"2025-07-23T06:29:18.455431Z","shell.execute_reply":"2025-07-23T06:29:18.839712Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## ✅ Label Consistency Checks  ","metadata":{}},{"cell_type":"markdown","source":"### Gesture Consistency Check  \nCheck sequence IDs that contain multiple gesture labels.","metadata":{}},{"cell_type":"code","source":"for seq_id, group in df.groupby('sequence_id'):\n    if(len(group['gesture'].unique() )> 1):\n        print(f\"\\n--- Sequence ID: {seq_id} ---\")\n        print(group['gesture'].unique())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-07-23T06:29:26.237432Z","iopub.execute_input":"2025-07-23T06:29:26.237800Z","iopub.status.idle":"2025-07-23T06:29:27.737333Z","shell.execute_reply.started":"2025-07-23T06:29:26.237775Z","shell.execute_reply":"2025-07-23T06:29:27.736095Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Orientation Consistency Check  \nCheck multiple orientation values.","metadata":{}},{"cell_type":"code","source":"for seq_id, group in df.groupby('sequence_id'):\n    if(len(group['orientation'].unique() )> 1):\n        print(f\"\\n--- Sequence ID: {seq_id} ---\")\n        print(group['orientation'].unique())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-07-23T06:29:29.746424Z","iopub.execute_input":"2025-07-23T06:29:29.746765Z","iopub.status.idle":"2025-07-23T06:29:32.113943Z","shell.execute_reply.started":"2025-07-23T06:29:29.746741Z","shell.execute_reply":"2025-07-23T06:29:32.112989Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Behavior Diversity Check  \nPrint sequences with fewer than 3 unique behaviors.","metadata":{}},{"cell_type":"code","source":"for seq_id, group in df.groupby('sequence_id'):\n    l=len(group['behavior'].unique() )\n    if(l< 3):\n        print(f\"\\n--- Sequence ID: {seq_id} ---\")\n        print(len(group['behavior'].unique()))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-07-23T06:29:32.893756Z","iopub.execute_input":"2025-07-23T06:29:32.894862Z","iopub.status.idle":"2025-07-23T06:29:34.308896Z","shell.execute_reply.started":"2025-07-23T06:29:32.894830Z","shell.execute_reply":"2025-07-23T06:29:34.307868Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## ✅Sensor Data Visualization per Sequence  \nVisualize how different sensor signals (acceleration, orientation, temperature, and TOF) evolve over time within each sequence. Behavior segments are highlighted to show context for each signal change.\n","metadata":{}},{"cell_type":"markdown","source":"### Acceleration Visualization per Sequence  \nPlot 'acc_x', 'acc_y', 'acc_z' over time for first 10 sequences, with behavior regions highlighted.","metadata":{}},{"cell_type":"code","source":"# انتخاب 10 sequence_id اول\nsequence_ids = df['sequence_id'].unique()[:10]\n\n# رنگ‌های پس‌زمینه برای behavior\ncolors = ['#d0f5cb', '#f8fa96', '#faafac', '#fff0b3', '#f0e6ff', '#d9e3f0', '#e6ffe6']\n\nfor sequence_id in sequence_ids:\n    df_seq = df[df['sequence_id'] == sequence_id].copy()\n\n    # اگر داده‌ای برای این sequence_id وجود نداشت، رد شو\n    if df_seq.empty:\n        continue\n\n    # گرفتن اطلاعات اولیه\n    gesture = df_seq['gesture'].iloc[0]\n    last_step = df_seq['sequence_counter'].iloc[-1]\n\n    # تعیین مرزهای رفتارها\n    beh_idx = df_seq.groupby('behavior')['sequence_counter'].first().sort_values()\n    boundaries = list(beh_idx.values) + [last_step]\n    behaviors = list(beh_idx.index)\n\n    # رسم نمودار\n    plt.figure(figsize=(12, 5))\n\n    # رنگ‌آمیزی نواحی براساس behavior\n    for i in range(len(behaviors)):\n        plt.axvspan(boundaries[i], boundaries[i + 1],\n                    facecolor=colors[i % len(colors)],\n                    alpha=0.3, label=f'{behaviors[i]}')\n\n    # رسم داده‌ها\n    plt.plot(df_seq['sequence_counter'], df_seq['acc_x'], label='acc_x', color='blue')\n    plt.plot(df_seq['sequence_counter'], df_seq['acc_y'], label='acc_y', color='green')\n    plt.plot(df_seq['sequence_counter'], df_seq['acc_z'], label='acc_z', color='red')\n\n    # اطلاعات نمودار\n    plt.xlabel('Time Step (sequence_counter)')\n    plt.ylabel('Acceleration (m/s²)')\n    plt.title(f'Acceleration Over Time - {sequence_id} - {gesture}')\n    plt.grid(True)\n    plt.legend()\n    plt.tight_layout()\n    plt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-07-23T06:29:42.220828Z","iopub.execute_input":"2025-07-23T06:29:42.221482Z","iopub.status.idle":"2025-07-23T06:29:46.181002Z","shell.execute_reply.started":"2025-07-23T06:29:42.221456Z","shell.execute_reply":"2025-07-23T06:29:46.180049Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Orientation Visualization per Sequence  \nPlot 'rot_x', 'rot_y', 'rot_z', 'rot_w' over time for first 10 sequences, with behavior regions highlighted.","metadata":{}},{"cell_type":"code","source":"\n# انتخاب 10 sequence_id اول\nsequence_ids = df['sequence_id'].unique()[:10]\n\n# رنگ‌های پس‌زمینه برای behavior\ncolors = ['#d0f5cb', '#f8fa96', '#faafac', '#fff0b3', '#f0e6ff', '#d9e3f0', '#e6ffe6']\n\nfor sequence_id in sequence_ids:\n    df_seq = df[df['sequence_id'] == sequence_id].copy()\n\n    # اگر داده‌ای برای این sequence_id وجود نداشت، رد شو\n    if df_seq.empty:\n        continue\n\n    # گرفتن اطلاعات اولیه\n    gesture = df_seq['gesture'].iloc[0]\n    last_step = df_seq['sequence_counter'].iloc[-1]\n\n    # تعیین مرزهای رفتارها\n    beh_idx = df_seq.groupby('behavior')['sequence_counter'].first().sort_values()\n    boundaries = list(beh_idx.values) + [last_step]\n    behaviors = list(beh_idx.index)\n\n    # رسم نمودار\n    plt.figure(figsize=(12, 5))\n\n    # رنگ‌آمیزی نواحی براساس behavior\n    for i in range(len(behaviors)):\n        plt.axvspan(boundaries[i], boundaries[i + 1],\n                    facecolor=colors[i % len(colors)],\n                    alpha=0.3, label=f'{behaviors[i]}')\n\n    # رسم داده‌ها\n    plt.plot(df_seq['sequence_counter'], df_seq['rot_x'], label='rot_x', color='blue')\n    plt.plot(df_seq['sequence_counter'], df_seq['rot_y'], label='rot_y', color='green')\n    plt.plot(df_seq['sequence_counter'], df_seq['rot_z'], label='rot_z', color='red')\n    plt.plot(df_seq['sequence_counter'], df_seq['rot_w'], label='rot_w', color='brown')\n\n    # اطلاعات نمودار\n    plt.xlabel('Time Step (sequence_counter)')\n    plt.ylabel('orientation')\n    plt.title(f'orientation Over Time - {sequence_id} - {gesture}')\n    plt.grid(True)\n    plt.legend()\n    plt.tight_layout()\n    plt.show()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-07-23T06:29:54.943720Z","iopub.execute_input":"2025-07-23T06:29:54.944705Z","iopub.status.idle":"2025-07-23T06:29:58.811790Z","shell.execute_reply.started":"2025-07-23T06:29:54.944670Z","shell.execute_reply":"2025-07-23T06:29:58.810966Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Temperature Sensors Visualization  \nPlot `thm_1` to `thm_5` temperature readings over time for first 10 sequences, with behavior regions highlighted.","metadata":{}},{"cell_type":"code","source":"\n# select sequence_ids\nsequence_ids = df['sequence_id'].unique()[:10]\n\n# back ground behavior\ncolors = ['#d0f5cb', '#f8fa96', '#faafac', '#fff0b3', '#f0e6ff', '#d9e3f0', '#e6ffe6']\n\nfor sequence_id in sequence_ids:\n    df_seq = df[df['sequence_id'] == sequence_id].copy()\n\n    # اگر داده‌ای برای این sequence_id وجود نداشت، رد شو\n    if df_seq.empty:\n        continue\n\n    # get primery infos\n    gesture = df_seq['gesture'].iloc[0]\n    last_step = df_seq['sequence_counter'].iloc[-1]\n\n    # تعیین مرزهای رفتارها\n    beh_idx = df_seq.groupby('behavior')['sequence_counter'].first().sort_values()\n    boundaries = list(beh_idx.values) + [last_step]\n    behaviors = list(beh_idx.index)\n\n    # رسم نمودار\n    plt.figure(figsize=(12, 5))\n\n    # رنگ‌آمیزی نواحی براساس behavior\n    for i in range(len(behaviors)):\n        plt.axvspan(boundaries[i], boundaries[i + 1],\n                    facecolor=colors[i % len(colors)],\n                    alpha=0.3, label=f'{behaviors[i]}')\n\n    # رسم داده‌ها\n    plt.plot(df_seq['sequence_counter'], df_seq['thm_1'], label='thm_1', color='blue')\n    plt.plot(df_seq['sequence_counter'], df_seq['thm_2'], label='thm_2', color='green')\n    plt.plot(df_seq['sequence_counter'], df_seq['thm_3'], label='thm_3', color='red')\n    plt.plot(df_seq['sequence_counter'], df_seq['thm_4'], label='thm_4', color='brown')\n    plt.plot(df_seq['sequence_counter'], df_seq['thm_5'], label='thm_5', color='brown')\n\n    # اطلاعات نمودار\n    plt.xlabel('Time Step (sequence_counter)')\n    plt.ylabel('temperature')\n    plt.title(f'temperature Over Time - {sequence_id} - {gesture}')\n    plt.grid(True)\n    plt.legend()\n    plt.tight_layout()\n    plt.show()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-07-23T06:30:08.034253Z","iopub.execute_input":"2025-07-23T06:30:08.034636Z","iopub.status.idle":"2025-07-23T06:30:12.346611Z","shell.execute_reply.started":"2025-07-23T06:30:08.034609Z","shell.execute_reply":"2025-07-23T06:30:12.345594Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Mean TOF Sensors Visualization  \nPlot average TOF sensor values over time for first 10 sequences, with behavior regions highlighted.","metadata":{}},{"cell_type":"code","source":"# انتخاب 10 sequence_id اول\nsequence_ids = df['sequence_id'].unique()[:10]\n\n# رنگ‌های پس‌زمینه برای رفتارها\ncolors = ['#d0f5cb', '#f8fa96', '#faafac', '#fff0b3', '#f0e6ff', '#d9e3f0', '#e6ffe6']\n\nfor sequence_id in sequence_ids:\n    df_seq = df[df['sequence_id'] == sequence_id].copy()\n    if df_seq.empty:\n        continue\n\n    # محاسبه میانگین TOF برای هر سنسور\n    for sensor in range(1, 6):\n        cols = [f\"tof_{sensor}_v{i}\" for i in range(64)]\n        df_seq[f\"tof_{sensor}_mean\"] = df_seq[cols].replace(-1, np.nan).mean(axis=1)\n\n    # گرفتن gesture و مرزهای رفتار\n    gesture = df_seq['gesture'].iloc[0]\n    last_step = df_seq['sequence_counter'].iloc[-1]\n    beh_idx = df_seq.groupby('behavior')['sequence_counter'].first().sort_values()\n    boundaries = list(beh_idx.values) + [last_step]\n    behaviors = list(beh_idx.index)\n\n    # رسم نمودار\n    plt.figure(figsize=(12, 5))\n\n    # رنگی کردن نواحی رفتار\n    for i in range(len(behaviors)):\n        plt.axvspan(boundaries[i], boundaries[i + 1],\n                    facecolor=colors[i % len(colors)],\n                    alpha=0.3, label=f'{behaviors[i]}')\n\n    # رسم منحنی میانگین TOF\n    for sensor in range(1, 6):\n        plt.plot(df_seq['sequence_counter'],\n                 df_seq[f\"tof_{sensor}_mean\"],\n                 label=f\"TOF {sensor}\")\n\n    # عنوان و تنظیمات نهایی\n    plt.xlabel('Time Step (sequence_counter)')\n    plt.ylabel('Mean TOF Value')\n    plt.title(f\"Mean TOF Sensor Values Over Time - {sequence_id} - {gesture}\")\n    plt.grid(True)\n    plt.legend()\n    plt.tight_layout()\n    plt.show()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-07-23T06:30:19.271677Z","iopub.execute_input":"2025-07-23T06:30:19.272016Z","iopub.status.idle":"2025-07-23T06:30:23.391761Z","shell.execute_reply.started":"2025-07-23T06:30:19.271993Z","shell.execute_reply":"2025-07-23T06:30:23.390684Z"}},"outputs":[],"execution_count":null}]}