{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.11","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":102335,"databundleVersionId":12518947,"sourceType":"competition"}],"dockerImageVersionId":31040,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# In this Topic :-\n* Visualize Complete Dataset given\n* Understand Data Given\n* Summary of DATA Analysis\n* Get Information of what Data is saying","metadata":{}},{"cell_type":"markdown","source":"![pic](https://i.ibb.co/bg8QkHt1/1.png)","metadata":{}},{"cell_type":"markdown","source":"# A. Real Life Application","metadata":{}},{"cell_type":"markdown","source":"This dataset comes from a competition focused on **detecting Body-Focused Repetitive Behaviors (BFRBs)** using wrist-worn sensor data\n\n1. **Clinical Behavior Monitoring**\nUse Case: Automatic detection of hair-pulling (trichotillomania) or skin-picking (excoriation) in therapeutic settings\n\nBenefit: Provides objective data to supplement patient self-reports\n\n2. **Therapeutic Wearables**\nUse Case: Smart wristbands that vibrate when detecting BFRB onset\n\nExample: \"HabitAware\" glove tracks hand positions associated with hair-pulling\n\n3. **Behavioral Research**\nUse Case: Quantifying behavioral patterns in developmental disorders\n\nExample: Studying repetitive behaviors in autism spectrum disorder\n\n4. **Digital Phenotyping**\nUse Case: Creating behavioral fingerprints for mental health assessment\n\nBenefit: Could detect worsening symptoms in OCD patients","metadata":{}},{"cell_type":"markdown","source":"# B. About Training Folder","metadata":{}},{"cell_type":"markdown","source":"It have 6 columns out of 133 main columns\n\n**row_id**: Unique identifier for each data row\n\n**sequence_type**: Likely indicates \"Target\" (labeled data) vs \"Test\" (unlabeled)\n\n**sequence_id**: Unique identifier for each behavioral sequence\n\n**sequence_counter**: Temporal ordering within each sequence (like a timestamp)\n\n**subject**: Participant identifier (SUBJ_XXXXXX)\n\n**orientation**: Body position (e.g., \"Seated Lean Non Dom - FACE DOWN\")\n\nIndicates posture and hand dominance during behavior\n\n**behavior**: Specific BFRB being performed\n\nExample: \"Relaxes and moves hand to target location\"\n\n**phase**: Stage of behavior (e.g., \"Transition\")\n\nCould include: Initiation, Execution, Termination phases\n\n**gesture**: Specific movement pattern (e.g., \"Cheek - pinch skin\")\n\nDescribes the actual physical action being performed\n\n**acc_x**: X-axis accelerometer reading (measures movement acceleration)\n\nOther axes (y,z) likely exist in full dataset\n\n**tof_5_vXX**: Time-of-Flight (ToF) sensor readings (v54-v63)\n\nMeasures distance to objects using infrared light","metadata":{}},{"cell_type":"markdown","source":"# C. Visualization","metadata":{}},{"cell_type":"markdown","source":"## 0. Imports & Load data","metadata":{}},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nfrom matplotlib.gridspec import GridSpec\nfrom sklearn.preprocessing import LabelEncoder\n\n# Set style\nplt.style.use('seaborn')\nsns.set_palette(\"husl\")\n\n# Load data (replace with your actual file path)\ndf = pd.read_csv('/kaggle/input/cmi-detect-behavior-with-sensor-data/train.csv')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-26T15:23:13.947755Z","iopub.execute_input":"2025-06-26T15:23:13.948051Z","iopub.status.idle":"2025-06-26T15:23:30.683431Z","shell.execute_reply.started":"2025-06-26T15:23:13.948030Z","shell.execute_reply":"2025-06-26T15:23:30.682857Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 1. Basic Data Overview","metadata":{}},{"cell_type":"code","source":"print(\"Dataset shape:\", df.shape)\nprint(\"\\nMissing values per column:\")\nprint(df.isnull().sum())\nprint(\"\\nData types:\")\nprint(df.dtypes)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-26T15:23:30.684537Z","iopub.execute_input":"2025-06-26T15:23:30.684801Z","iopub.status.idle":"2025-06-26T15:23:31.438743Z","shell.execute_reply.started":"2025-06-26T15:23:30.684778Z","shell.execute_reply":"2025-06-26T15:23:31.437974Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 2. Categorical Data Visualization","metadata":{}},{"cell_type":"code","source":"\ncategorical_cols = ['sequence_type', 'subject', 'orientation', 'behavior', 'phase', 'gesture']\n\nplt.figure(figsize=(18, 12))\ngs = GridSpec(3, 2, figure=plt.gcf())\n\nfor i, col in enumerate(categorical_cols):\n    ax = plt.subplot(gs[i//2, i%2])\n    sns.countplot(y=col, data=df, ax=ax, order=df[col].value_counts().index)\n    ax.set_title(f'Distribution of {col}')\n    plt.tight_layout()\n\nplt.suptitle('Categorical Variables Distribution', y=1.02)\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-26T15:23:31.439566Z","iopub.execute_input":"2025-06-26T15:23:31.439882Z","iopub.status.idle":"2025-06-26T15:23:34.276050Z","shell.execute_reply.started":"2025-06-26T15:23:31.439865Z","shell.execute_reply":"2025-06-26T15:23:34.275280Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 3. Time-Series Analysis (for sequence_counter)","metadata":{}},{"cell_type":"code","source":"\nplt.figure(figsize=(14, 6))\nsns.lineplot(x='sequence_counter', y='acc_x', hue='gesture', data=df)\nplt.title('Acceleration X over Time by Gesture')\nplt.xlabel('Sequence Counter')\nplt.ylabel('Acceleration X')\nplt.legend(bbox_to_anchor=(1.05, 1), loc='upper left')\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-26T15:23:34.277419Z","iopub.execute_input":"2025-06-26T15:23:34.277630Z","iopub.status.idle":"2025-06-26T15:24:43.771217Z","shell.execute_reply.started":"2025-06-26T15:23:34.277614Z","shell.execute_reply":"2025-06-26T15:24:43.770458Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 4. Correlation Analysis (for numerical columns)","metadata":{}},{"cell_type":"markdown","source":"## 5. TOF Sensor Data Visualization","metadata":{}},{"cell_type":"markdown","source":"## 6. Gesture Analysis","metadata":{}},{"cell_type":"code","source":"\nplt.figure(figsize=(14, 6))\nsns.boxplot(x='gesture', y='acc_x', data=df)\nplt.title('Acceleration X by Gesture Type')\nplt.xticks(rotation=45)\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-26T15:24:43.772077Z","iopub.execute_input":"2025-06-26T15:24:43.772292Z","iopub.status.idle":"2025-06-26T15:24:44.327140Z","shell.execute_reply.started":"2025-06-26T15:24:43.772277Z","shell.execute_reply":"2025-06-26T15:24:44.326382Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 7. Behavior Analysis","metadata":{}},{"cell_type":"code","source":"\nbehavior_acc = df.groupby('behavior')['acc_x'].agg(['mean', 'std', 'count'])\nbehavior_acc = behavior_acc.sort_values('mean', ascending=False)\n\nplt.figure(figsize=(12, 6))\nsns.barplot(x=behavior_acc.index, y='mean', data=behavior_acc, yerr=behavior_acc['std'])\nplt.title('Average Acceleration by Behavior with Standard Deviation')\nplt.xticks(rotation=45)\nplt.ylabel('Mean Acceleration X')\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-26T15:24:44.328088Z","iopub.execute_input":"2025-06-26T15:24:44.328404Z","iopub.status.idle":"2025-06-26T15:24:44.542852Z","shell.execute_reply.started":"2025-06-26T15:24:44.328386Z","shell.execute_reply":"2025-06-26T15:24:44.542168Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 8. Parallel Coordinates Plot for Gesture Classification","metadata":{}},{"cell_type":"code","source":"from pandas.plotting import parallel_coordinates\nimport matplotlib.pyplot as plt\n\n# First define tof_cols - all columns starting with 'tof_'\ntof_cols = [col for col in df.columns if col.startswith('tof_')]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-26T15:24:44.543526Z","iopub.execute_input":"2025-06-26T15:24:44.543837Z","iopub.status.idle":"2025-06-26T15:24:44.547519Z","shell.execute_reply.started":"2025-06-26T15:24:44.543813Z","shell.execute_reply":"2025-06-26T15:24:44.547026Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\nfrom pandas.plotting import parallel_coordinates\n\n# Select relevant features for gesture classification\ngesture_features = ['acc_x'] + tof_cols[:5]  # Using first 5 TOF sensors for visualization\n\n# Sample data for visualization (to avoid overcrowding)\nsample_df = df.sample(min(500, len(df)), random_state=42)\nsample_df = sample_df[gesture_features + ['gesture']].dropna()\n\nplt.figure(figsize=(16, 8))\nparallel_coordinates(sample_df, 'gesture', alpha=0.5)\nplt.title('Parallel Coordinates Plot for Gesture Classification')\nplt.xticks(rotation=45)\nplt.legend(bbox_to_anchor=(1.05, 1), loc='upper left')\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-26T15:24:44.548287Z","iopub.execute_input":"2025-06-26T15:24:44.548509Z","iopub.status.idle":"2025-06-26T15:24:45.467051Z","shell.execute_reply.started":"2025-06-26T15:24:44.548485Z","shell.execute_reply":"2025-06-26T15:24:45.466083Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 9. 3D Visualization of TOF sensors (first 3)","metadata":{}},{"cell_type":"code","source":"\nfrom mpl_toolkits.mplot3d import Axes3D\n\ntof_3d_cols = tof_cols[:3]  # Take first 3 TOF sensors for 3D plot\nplot_df = df[tof_3d_cols + ['gesture']].replace(-1, np.nan).dropna()\n\nfig = plt.figure(figsize=(12, 8))\nax = fig.add_subplot(111, projection='3d')\n\n# Encode gestures to numbers for coloring\nle = LabelEncoder()\ngesture_encoded = le.fit_transform(plot_df['gesture'])\n\nscatter = ax.scatter(\n    plot_df[tof_3d_cols[0]], \n    plot_df[tof_3d_cols[1]], \n    plot_df[tof_3d_cols[2]], \n    c=gesture_encoded, \n    cmap='viridis',\n    alpha=0.6\n)\n\nax.set_xlabel(tof_3d_cols[0])\nax.set_ylabel(tof_3d_cols[1])\nax.set_zlabel(tof_3d_cols[2])\nplt.title('3D Visualization of TOF Sensor Readings by Gesture')\n\n# Create a legend\nlegend_labels = le.classes_\nhandles = [plt.Line2D([0], [0], marker='o', color='w', \n                      markerfacecolor=plt.cm.viridis(i/len(legend_labels)), \n                      markersize=10) for i in range(len(legend_labels))]\nax.legend(handles, legend_labels, title='Gestures', bbox_to_anchor=(1.2, 1))\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-26T15:24:45.468174Z","iopub.execute_input":"2025-06-26T15:24:45.468700Z","iopub.status.idle":"2025-06-26T15:24:50.693623Z","shell.execute_reply.started":"2025-06-26T15:24:45.468677Z","shell.execute_reply":"2025-06-26T15:24:50.692862Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 10. Animation of TOF sensor data over time (conceptual example)","metadata":{}},{"cell_type":"code","source":"from matplotlib.animation import FuncAnimation\n\n# Select a sequence to animate\nsequence_id = 'SEQ_000007'\nseq_df = df[df['sequence_id'] == sequence_id]\n\nfig, ax = plt.subplots(figsize=(12, 6))\nline, = ax.plot([], [], lw=2)\nax.set_xlim(seq_df['sequence_counter'].min(), seq_df['sequence_counter'].max())\nax.set_ylim(0, seq_df[tof_cols].max().max() + 10)\nax.set_xlabel('Sequence Counter')\nax.set_ylabel('TOF Value')\nax.set_title(f'TOF Sensor Data Animation for {sequence_id}')\n\ndef init():\n    line.set_data([], [])\n    return line,\n\ndef animate(i):\n    x = seq_df['sequence_counter'].iloc[:i+1]\n    y = seq_df['tof_5_v56'].iloc[:i+1]  # Using one TOF sensor for animation\n    line.set_data(x, y)\n    return line,\n\n# For actual use, you would save this animation. Just TRY IT !!!!!\n\n# ani = FuncAnimation(fig, animate, frames=len(seq_df), init_func=init, blit=True)\n# ani.save('tof_animation.mp4', writer='ffmpeg', fps=10)\n\n# Instead, we'll just show the final frame\nanimate(len(seq_df)-1)\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-26T15:24:50.695744Z","iopub.execute_input":"2025-06-26T15:24:50.696085Z","iopub.status.idle":"2025-06-26T15:24:50.886409Z","shell.execute_reply.started":"2025-06-26T15:24:50.696062Z","shell.execute_reply":"2025-06-26T15:24:50.885706Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# D. Advance Visualization","metadata":{}},{"cell_type":"markdown","source":"## 0. Imports ","metadata":{}},{"cell_type":"code","source":"\nimport pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport plotly.express as px\nimport plotly.graph_objects as go\nfrom plotly.subplots import make_subplots\n\n!pip install -q squarify\nimport squarify\n\n!pip install -q joypy\nimport joypy\n\n\n!pip install -q missingno\nimport missingno as msno\n\n\n!pip install -q ipywidgets\nimport ipywidgets as widgets\nfrom IPython.display import display\n\n\n!pip install -q networkx\nimport networkx as nx\n\nfrom matplotlib.collections import LineCollection\nfrom matplotlib.colors import ListedColormap","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-26T15:24:50.887070Z","iopub.execute_input":"2025-06-26T15:24:50.887236Z","iopub.status.idle":"2025-06-26T15:25:07.963668Z","shell.execute_reply.started":"2025-06-26T15:24:50.887223Z","shell.execute_reply":"2025-06-26T15:25:07.962855Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport plotly.express as px\nimport plotly.graph_objects as go\nfrom plotly.subplots import make_subplots\nimport squarify\nimport joypy\nfrom matplotlib.collections import LineCollection\nfrom matplotlib.colors import ListedColormap\nimport missingno as msno\nimport ipywidgets as widgets\nfrom IPython.display import display\nimport networkx as nx","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-26T15:25:07.964625Z","iopub.execute_input":"2025-06-26T15:25:07.965106Z","iopub.status.idle":"2025-06-26T15:25:07.969530Z","shell.execute_reply.started":"2025-06-26T15:25:07.965083Z","shell.execute_reply":"2025-06-26T15:25:07.968737Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 1. Interactive Sunburst Chart (Hierarchical Data)","metadata":{}},{"cell_type":"code","source":"fig = px.sunburst(\n    df, \n    path=['orientation', 'behavior', 'gesture'], \n    values='acc_x',\n    color='acc_x',\n    color_continuous_scale='RdYlBu_r',\n    title='Behavioral Hierarchy Sunburst'\n)\nfig.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-26T15:25:07.970571Z","iopub.execute_input":"2025-06-26T15:25:07.970843Z","iopub.status.idle":"2025-06-26T15:25:14.144727Z","shell.execute_reply.started":"2025-06-26T15:25:07.970821Z","shell.execute_reply":"2025-06-26T15:25:14.144040Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 2. Animated Scatter Plot (Temporal Patterns)","metadata":{}},{"cell_type":"code","source":"fig = px.scatter(\n    df, \n    x='sequence_counter', \n    y='acc_x', \n    animation_frame='sequence_counter',\n    color='gesture',\n    size=np.abs(df['acc_x']),  # Take absolute values\n    hover_name='behavior',\n    range_x=[df['sequence_counter'].min(), df['sequence_counter'].max()],\n    range_y=[df['acc_x'].min(), df['acc_x'].max()],\n    title='Animated Gesture Progression'\n)\nfig.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-26T15:25:14.145467Z","iopub.execute_input":"2025-06-26T15:25:14.145650Z","iopub.status.idle":"2025-06-26T15:25:27.623237Z","shell.execute_reply.started":"2025-06-26T15:25:14.145636Z","shell.execute_reply":"2025-06-26T15:25:27.621998Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 3. Radar Chart for Multi-Sensor Comparison","metadata":{}},{"cell_type":"code","source":"tof_cols = [col for col in df.columns if col.startswith('tof_')][:6]\ngesture_avg = df.groupby('gesture')[tof_cols].mean().reset_index()\n\nfig = go.Figure()\nfor gesture in gesture_avg['gesture'].unique():\n    fig.add_trace(go.Scatterpolar(\n        r=gesture_avg[gesture_avg['gesture']==gesture][tof_cols].values[0],\n        theta=tof_cols,\n        fill='toself',\n        name=gesture\n    ))\nfig.update_layout(polar=dict(radialaxis=dict(visible=True)), title='TOF Sensor Radar by Gesture')\nfig.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-26T15:25:27.625843Z","iopub.execute_input":"2025-06-26T15:25:27.626195Z","iopub.status.idle":"2025-06-26T15:25:27.717876Z","shell.execute_reply.started":"2025-06-26T15:25:27.626148Z","shell.execute_reply":"2025-06-26T15:25:27.717141Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 4. Streamgraph for Temporal Behavior Patterns","metadata":{}},{"cell_type":"code","source":"behavior_counts = df.groupby(['sequence_counter', 'behavior']).size().unstack().fillna(0)\n\nplt.figure(figsize=(16, 8))\nplt.stackplot(\n    behavior_counts.index,\n    behavior_counts.values.T,\n    labels=behavior_counts.columns,\n    alpha=0.7\n)\nplt.legend(loc='upper left')\nplt.title('Behavior Streamgraph Over Time')\nplt.xlabel('Sequence Counter')\nplt.ylabel('Frequency')\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-26T15:25:27.718976Z","iopub.execute_input":"2025-06-26T15:25:27.719312Z","iopub.status.idle":"2025-06-26T15:25:28.006374Z","shell.execute_reply.started":"2025-06-26T15:25:27.719293Z","shell.execute_reply":"2025-06-26T15:25:28.005662Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 5. Interactive Network Graph (Behavior Transitions)","metadata":{}},{"cell_type":"code","source":"# Create transition matrix\ntransitions = df.groupby(['sequence_id', 'behavior'])['behavior'].shift(-1).dropna()\nedges = pd.crosstab(df['behavior'], transitions)\n\n# Create network graph\nG = nx.DiGraph()\nfor src in edges.index:\n    for tgt in edges.columns:\n        if edges.loc[src, tgt] > 0:\n            G.add_edge(src, tgt, weight=edges.loc[src, tgt])\n\npos = nx.spring_layout(G)\nedge_x = []\nedge_y = []\nfor edge in G.edges():\n    x0, y0 = pos[edge[0]]\n    x1, y1 = pos[edge[1]]\n    edge_x.extend([x0, x1, None])\n    edge_y.extend([y0, y1, None])\n\nedge_trace = go.Scatter(\n    x=edge_x, y=edge_y,\n    line=dict(width=1, color='#888'),\n    hoverinfo='none',\n    mode='lines')\n\nnode_x = []\nnode_y = []\nfor node in G.nodes():\n    x, y = pos[node]\n    node_x.append(x)\n    node_y.append(y)\n\nnode_trace = go.Scatter(\n    x=node_x, y=node_y,\n    mode='markers+text',\n    hoverinfo='text',\n    marker=dict(\n        showscale=True,\n        colorscale='YlGnBu',\n        size=15,\n        color=[],\n        line_width=2))\n\nfig = go.Figure(data=[edge_trace, node_trace],\n             layout=go.Layout(\n                title='Behavior Transition Network',\n                showlegend=False,\n                hovermode='closest',\n                margin=dict(b=20,l=5,r=5,t=40)))\nfig.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-26T15:25:28.007181Z","iopub.execute_input":"2025-06-26T15:25:28.007380Z","iopub.status.idle":"2025-06-26T15:25:28.301892Z","shell.execute_reply.started":"2025-06-26T15:25:28.007365Z","shell.execute_reply":"2025-06-26T15:25:28.301186Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 6. Interactive Ternary Plot (3D Behavior)","metadata":{}},{"cell_type":"code","source":"fig = px.scatter_ternary(\n    df,\n    a=df['tof_5_v56'].rank(pct=True),\n    b=df['tof_5_v57'].rank(pct=True),\n    c=df['tof_5_v58'].rank(pct=True),\n    color='gesture',\n    size=np.abs(df['acc_x']),  # Take absolute values\n    hover_name='behavior',\n    title=\"TOF Sensor Ternary Space\"\n)\nfig.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-26T15:25:28.302706Z","iopub.execute_input":"2025-06-26T15:25:28.302984Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"<div style=\"border: 2px solid #4CAF50; padding: 15px; border-radius: 10px; background-color: #ffffff; box-shadow: 2px 2px 8px rgba(0, 0, 0, 0.1);\">\n\n<h2 style=\"color: #4CAF50; text-align: center;\">Thank You! 🎉</h2>\n\n<p style=\"font-size: 16px; text-align: justify;\">\nThank you for exploring my notebook! I hope you found it insightful and helpful.  \nIf you have any feedback, I’d love to hear from you!  \nYour support and comments mean a lot to me. 😊\n</p>\n\n<div style=\"text-align: left; margin: 10px 0;\">\n    <img src=\"https://i.pinimg.com/236x/90/e8/ff/90e8ff78f7bef8490e0ab9cb5b83ee0f.jpg\" alt=\"Thank You Image\" style=\"border-radius: 0%; border: 2px solid #ffffff;\">\n</div>\n\n<h3 style=\"color: #4CAF50;\">🌐 Useful Links:</h3>\n<ul style=\"font-size: 16px;\">\n    <li><a href=\"https://www.kaggle.com/dataset-link\" target=\"_blank\" style=\"color: #2196F3;\">Visualization Notebook for this Notebook</a></li>\n  <li><a href=\"https://www.kaggle.com/samasiayushman\" target=\"_blank\" style=\"color: #2196F3;\">My Kaggle Profile</a></li>\n  <li><a href=\"https://github.com/Hariswar8018\" target=\"_blank\" style=\"color: #2196F3;\">Notebook Code Repository</a></li>\n</ul>\n\n<p style=\"font-size: 16px; text-align: center; font-weight: bold;\">\n✨ Don’t forget to upvote if you found this notebook helpful! ✨\n</p>\n\n</div>\n","metadata":{}}]}