{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.14","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":81933,"databundleVersionId":9643020,"sourceType":"competition"}],"dockerImageVersionId":30775,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"![taras-shypka-iFSvn82XfGo-unsplash.jpg](attachment:5369d4c7-73d5-4a89-ad95-911e5b1498de.jpg)\n\n<center>Photo by Taras Shypka on Unsplash</center>\n  ","metadata":{},"attachments":{"5369d4c7-73d5-4a89-ad95-911e5b1498de.jpg":{"image/jpeg":"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"}}},{"cell_type":"markdown","source":"# <p style=\"padding:15px; background-color:chocolate; font-family:arial; font-weight:bold; color:white; font-size:100%; letter-spacing: 2px; text-align:left; border-radius: 10px 10px\">1/ Introduction</p>","metadata":{}},{"cell_type":"markdown","source":" <div style=\"border-radius:12px; border:chocolate solid; padding: 15px; background-color: #f6f5f5; font-size:120%; text-align:left\">\n\n- Mục tiêu chính của cuộc thi là sử dụng dữ liệu huấn luyện để dự đoán **sii** **(Severity Impairment Index)**, một thước đo tiêu chuẩn của Sử dụng Internet có vấn đề (**Problematic Internet Use - PIU**).\n- Dữ liệu huấn luyện bao gồm 3.960 bản ghi của trẻ em và thanh thiếu niên với 81 cột (không bao gồm cột ID).\n- Dữ liệu quan trọng nhất trong bộ dữ liệu là kết quả của Bài kiểm tra nghiện Internet giữa cha mẹ và con cái **(Parent-Child Internet Addiction Test - PCIAT)**.\n- Mục tiêu (target) thực tế được suy ra từ trường PCIAT-PCIAT_Total (điểm tối đa là 100).\n- Do đó, chúng ta có thể chọn dự đoán tổng điểm PCIAT **(PCIAT Total)** và chuyển đổi nó thành **sii** (biến bài toán thành bài toán hồi quy), hoặc trực tiếp dự đoán **sii** (biến thành bài toán phân loại)\n- Dữ liệu kiểm tra chỉ là dữ liệu mẫu đã được định dạng. Dữ liệu kiểm tra thực tế với khoảng 3.800 trường hợp vẫn đang bị ẩn.\n- Trong dữ liệu mẫu, không có trường nào trong 22 trường PCIAT (bao gồm cả trường mục tiêu). Vì vậy, dữ liệu mẫu có định dạng 58 cột, so với 81 cột trong dữ liệu huấn luyện.\n- Trong 1.224 bản ghi của dữ liệu huấn luyện, giá trị mục tiêu sii và tất cả các trường PCIAT bị thiếu - có lẽ do không khả dụng.\n- Tổng cộng có hơn 1.000.000 giá trị bị thiếu trong dữ liệu huấn luyện.\n- Chỉ có 2.736 bản ghi có mục tiêu (target), phần còn lại bị thiếu.\n- Ngoài ra, 996 trẻ em và thanh thiếu niên còn có dữ liệu từ thiết bị cảm biến đeo trên người, thiết bị này đo lường hoạt động vận động cơ bản.","metadata":{}},{"cell_type":"markdown","source":"# <p style=\"padding:15px; background-color:chocolate; font-family:arial; font-weight:bold; color:white; font-size:100%; letter-spacing: 2px; text-align:left; border-radius: 10px 10px\">2/ Imports</p>","metadata":{}},{"cell_type":"code","source":"import numpy as np, pandas as pd, os\nfrom sklearn.model_selection import cross_val_score, StratifiedKFold\nimport xgboost as xgb\nimport plotly.express as px, seaborn as sns, matplotlib.pyplot as plt\nsns.set_style('darkgrid')\nfrom sklearn.metrics import make_scorer, cohen_kappa_score\nimport eli5\nfrom eli5.sklearn import PermutationImportance\nimport warnings\nwarnings.simplefilter('ignore')","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2025-01-07T15:36:36.316446Z","iopub.execute_input":"2025-01-07T15:36:36.316833Z","iopub.status.idle":"2025-01-07T15:36:36.323744Z","shell.execute_reply.started":"2025-01-07T15:36:36.316801Z","shell.execute_reply":"2025-01-07T15:36:36.322587Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# <p style=\"padding:15px; background-color:chocolate; font-family:arial; font-weight:bold; color:white; font-size:100%; letter-spacing: 2px; text-align:left; border-radius: 10px 10px\">3/ Data</p>","metadata":{}},{"cell_type":"code","source":"path = '../input/child-mind-institute-problematic-internet-use/'\n\ntrain = pd.read_csv(path + 'train.csv', index_col = 'id')\nprint(\"The train data has the shape: \",train.shape)\ntest = pd.read_csv(path + 'test.csv', index_col = 'id')\nprint(\"The test data has the shape: \",test.shape)\nprint(\"\")\nprint(\"Total number of missing training values: \", train.isna().sum().sum())\ndata_dict = pd.read_csv(path + 'data_dictionary.csv')\ntrain_vis = train.copy()","metadata":{"execution":{"iopub.status.busy":"2025-01-07T15:36:36.325835Z","iopub.execute_input":"2025-01-07T15:36:36.326813Z","iopub.status.idle":"2025-01-07T15:36:36.394446Z","shell.execute_reply.started":"2025-01-07T15:36:36.326775Z","shell.execute_reply":"2025-01-07T15:36:36.393318Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# <p style=\"padding:15px; background-color:chocolate; font-family:arial; font-weight:bold; color:white; font-size:100%; letter-spacing: 2px; text-align:left; border-radius: 10px 10px\">4/ EDA</p>","metadata":{}},{"cell_type":"markdown","source":"helper function: giúp tính toán và trình bày các thống kê mô tả cho các cột trong một DataFrame","metadata":{}},{"cell_type":"code","source":"def calculate_stats(data, columns):\n    if isinstance(columns, str):\n        columns = [columns]\n\n    stats = []\n    for col in columns:\n        if data[col].dtype in ['object', 'category']:\n            counts = data[col].value_counts(dropna=False, sort=False)\n            percents = data[col].value_counts(normalize=True, dropna=False, sort=False) * 100\n            formatted = counts.astype(str) + ' (' + percents.round(2).astype(str) + '%)'\n            stats_col = pd.DataFrame({'count (%)': formatted})\n            stats.append(stats_col)\n        else:\n            stats_col = data[col].describe().to_frame().transpose()\n            stats_col['missing'] = data[col].isnull().sum()\n            stats_col.index.name = col\n            stats.append(stats_col)\n\n    return pd.concat(stats, axis=0)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-07T15:36:36.396111Z","iopub.execute_input":"2025-01-07T15:36:36.396450Z","iopub.status.idle":"2025-01-07T15:36:36.403983Z","shell.execute_reply.started":"2025-01-07T15:36:36.396415Z","shell.execute_reply":"2025-01-07T15:36:36.402955Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Target Variable","metadata":{}},{"cell_type":"code","source":"train_cols = set(train.columns)\ntest_cols = set(test.columns)\ncolumns_not_in_test = sorted(list(train_cols - test_cols))\ndata_dict[data_dict['Field'].isin(columns_not_in_test)]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-07T15:36:36.405323Z","iopub.execute_input":"2025-01-07T15:36:36.405653Z","iopub.status.idle":"2025-01-07T15:36:36.431481Z","shell.execute_reply.started":"2025-01-07T15:36:36.405622Z","shell.execute_reply":"2025-01-07T15:36:36.430440Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"**Parent-Child Internet Addiction Test (PCIAT):** Gồm 20 mục (từ `PCIAT-PCIAT_01` đến `PCIAT-PCIAT_20`), mỗi mục đánh giá một khía cạnh khác nhau trong hành vi của trẻ liên quan đến việc sử dụng Internet. Các mục được trả lời trên thang điểm từ 0 đến 5, và tổng điểm cung cấp một chỉ báo về mức độ nghiêm trọng của chứng nghiện Internet.\n\nNgoài ra cũng có thông tin về mùa tham gia kiểm tra `PCIAT-Season` và tổng điểm trong `PCIAT-PCIAT_Total`; vì vậy, tổng cộng có 22 cột liên quan đến bài kiểm tra `PCIAT`.\n\nHãy xác minh rằng `PCIAT-PCIAT_Total` có phù hợp với các danh mục sii tương ứng hay không, bằng cách tính điểm số nhỏ nhất và lớn nhất cho từng danh mục sii:","metadata":{}},{"cell_type":"code","source":"pciat_min_max = train_vis.groupby('sii')['PCIAT-PCIAT_Total'].agg(['min', 'max'])\npciat_min_max = pciat_min_max.rename(\n    columns={'min': 'Minimum PCIAT total Score', 'max': 'Maximum total PCIAT Score'}\n)\npciat_min_max","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-07T15:36:36.434042Z","iopub.execute_input":"2025-01-07T15:36:36.434929Z","iopub.status.idle":"2025-01-07T15:36:36.449655Z","shell.execute_reply.started":"2025-01-07T15:36:36.434882Z","shell.execute_reply":"2025-01-07T15:36:36.448817Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"data_dict[data_dict['Field'] == 'PCIAT-PCIAT_Total']['Value Labels'].iloc[0]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-07T15:36:36.450897Z","iopub.execute_input":"2025-01-07T15:36:36.451305Z","iopub.status.idle":"2025-01-07T15:36:36.460060Z","shell.execute_reply.started":"2025-01-07T15:36:36.451261Z","shell.execute_reply":"2025-01-07T15:36:36.459093Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Check các câu trả lời còn thiếu","metadata":{}},{"cell_type":"code","source":"train_vis_with_sii = train_vis[train_vis['sii'].notna()][columns_not_in_test]\ntrain_vis_with_sii[train_vis_with_sii.isna().any(axis=1)].head().style.applymap(\n    lambda x: 'background-color: #FFC0CB' if pd.isna(x) else ''\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-07T15:36:36.461129Z","iopub.execute_input":"2025-01-07T15:36:36.461455Z","iopub.status.idle":"2025-01-07T15:36:36.487545Z","shell.execute_reply.started":"2025-01-07T15:36:36.461425Z","shell.execute_reply":"2025-01-07T15:36:36.486434Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Ví dụ: ở hàng thứ 1 và thứ 3, bạn có thể thấy thiếu điểm cho một câu trả lời. Và vì mỗi câu hỏi được tính điểm từ 1 đến 5 nên tổng số điểm có thể cao hơn tới 5 điểm và tương ứng với danh mục `sii` tiếp theo (`sii` có thể là 0 hoặc 1 cho hàng đầu tiên và 1 hoặc 2 cho hàng thứ ba). Đối với hàng thứ hai, `PCIAT-PCIAT_Total` và `sii` dường như đã được điền nhầm vì không có câu hỏi kiểm tra nào được trả lời cả.","metadata":{}},{"cell_type":"markdown","source":"Hãy kiểm tra xem `PCIAT-PCIAT_Total` có thực sự được tính bằng tổng các giá trị không phải NA trong các cột `PCIAT-PCIAT_01` đến `PCIAT-PCIAT_20` hay không:","metadata":{}},{"cell_type":"code","source":"PCIAT_cols = [f'PCIAT-PCIAT_{i+1:02d}' for i in range(20)]\nrecalc_total_score = train_vis_with_sii[PCIAT_cols].sum(\n    axis=1, skipna=True\n)\n(recalc_total_score == train_vis_with_sii['PCIAT-PCIAT_Total']).all()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-07T15:36:36.489699Z","iopub.execute_input":"2025-01-07T15:36:36.490029Z","iopub.status.idle":"2025-01-07T15:36:36.500609Z","shell.execute_reply.started":"2025-01-07T15:36:36.489997Z","shell.execute_reply":"2025-01-07T15:36:36.499429Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Hiện tại, chúng ta có thể kết luận rằng điểm `sii` đôi khi không chính xác. Dưới đây tôi tính toán lại `sii` dựa trên `PCIAT_Total` và số điểm tối đa có thể có nếu trả lời các giá trị bị thiếu (5 điểm), đảm bảo rằng `sii` được tính lại đáp ứng các ngưỡng dự kiến ngay cả khi còn thiếu một số câu trả lời.","metadata":{}},{"cell_type":"code","source":"def recalculate_sii(row):\n    if pd.isna(row['PCIAT-PCIAT_Total']):\n        return np.nan\n    max_possible = row['PCIAT-PCIAT_Total'] + row[PCIAT_cols].isna().sum() * 5\n    if row['PCIAT-PCIAT_Total'] <= 30 and max_possible <= 30:\n        return 0\n    elif 31 <= row['PCIAT-PCIAT_Total'] <= 49 and max_possible <= 49:\n        return 1\n    elif 50 <= row['PCIAT-PCIAT_Total'] <= 79 and max_possible <= 79:\n        return 2\n    elif row['PCIAT-PCIAT_Total'] >= 80 and max_possible >= 80:\n        return 3\n    return np.nan\n\ntrain_vis['recalc_sii'] = train_vis.apply(recalculate_sii, axis=1)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-07T15:36:36.501762Z","iopub.execute_input":"2025-01-07T15:36:36.502106Z","iopub.status.idle":"2025-01-07T15:36:37.922341Z","shell.execute_reply.started":"2025-01-07T15:36:36.502075Z","shell.execute_reply":"2025-01-07T15:36:37.921545Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Từ đây, ta thấy được các hàng có `sii` gốc và `sii` được tính toán lại khác nhau:","metadata":{}},{"cell_type":"code","source":"mismatch_rows = train_vis[\n    (train_vis['recalc_sii'] != train_vis['sii']) & train_vis['sii'].notna()\n]\n\nmismatch_rows[PCIAT_cols + [\n    'PCIAT-PCIAT_Total', 'sii', 'recalc_sii'\n]].style.applymap(\n    lambda x: 'background-color: #FFC0CB' if pd.isna(x) else ''\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-07T15:36:37.924133Z","iopub.execute_input":"2025-01-07T15:36:37.924463Z","iopub.status.idle":"2025-01-07T15:36:37.951294Z","shell.execute_reply.started":"2025-01-07T15:36:37.924430Z","shell.execute_reply":"2025-01-07T15:36:37.950317Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"<div style=\"line-height:24px; font-size:16px;border-left: 5px solid silver; padding-left: 26px;\"> \n    💡 Note: Như vậy, có 17 hàng biến mục tiêu đã được tính toán không chính xác (bỏ qua các câu trả lời bị thiếu).\n</div>","metadata":{}},{"cell_type":"markdown","source":"<div style=\"border: 2px solid #c9c9c9; padding: 15px; border-radius: 5px; background-color: #f7f7f7;\">\n    <h3>Giải thích</h3>\n    Nếu các câu hỏi chưa được trả lời được tự động tính là số 0, điều này có thể gây ra lỗi!<br><br>\n    Hãy nhìn vào hàng cuối cùng của bảng trên. Người trả lời này đã trả lời 18 trong số 20 câu hỏi với tổng điểm (PCIAT-PCIAT_Total) là 42. SII ban đầu là 1 vì điểm 31-49 tương đương với SII = 1('Nhẹ'). NHƯNG chúng ta không biết người này sẽ trả lời những câu hỏi còn thiếu như thế nào - họ có thể đạt điểm 0, 5 hoặc điểm nào đó ở giữa. Để giải thích điều này, tôi thêm điểm tối đa có thể có (5) cho mỗi câu hỏi chưa được trả lời, cho điểm max_possible là 52, nằm trong phạm vi sii 'Trung bình' (sii = 2 nếu PCIAT-PCIAT_Total nằm trong khoảng từ 50 đến 79). SII ban đầu = 1, có thể sai hoặc đúng - chúng ta không biết! Vì vậy, việc tính toán lại SII bằng hàm recalcate_sii sẽ cho kết quả là SII = nan, không phải SII = 2 hay thứ gì khác.<br><br>\n    Hướng tiếp cận này đảm bảo rằng tất cả các điểm SII không rõ ràng (những điểm có thể bị ảnh hưởng bởi các câu hỏi chưa được trả lời) đều được đánh dấu là nan.<br><br>\n</div>","metadata":{}},{"cell_type":"markdown","source":"Trong các phân tích sau đây, tôi sẽ chỉ sử dụng SII đúng. Tôi sẽ chỉ sử dụng tổng điểm nếu tất cả PCIAT_cols có giá trị không phải NA (tất cả các câu hỏi của Parent-Child Internet Addiction Test đã được trả lời).","metadata":{}},{"cell_type":"code","source":"train_vis['sii'] = train_vis['recalc_sii']\ntrain_vis['complete_resp_total'] = train['PCIAT-PCIAT_Total'].where(\n    train_vis[PCIAT_cols].notna().all(axis=1), np.nan\n)\n\nsii_map = {0: '0 (None)', 1: '1 (Mild)', 2: '2 (Moderate)', 3: '3 (Severe)'}\n# sii_map = {0: 0, 1: 1, 2: 2, 3: 3}\ntrain_vis['sii'] = train_vis['sii'].map(sii_map).fillna('Missing')\n\nsii_order = ['Missing', '0 (None)', '1 (Mild)', '2 (Moderate)', '3 (Severe)']\n# sii_order = ['Missing', 0, 1, 2, 3]\ntrain_vis['sii'] = pd.Categorical(train_vis['sii'], categories=sii_order, ordered=True)\n\ntrain_vis.drop(columns='recalc_sii', inplace=True)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-07T15:36:37.952800Z","iopub.execute_input":"2025-01-07T15:36:37.953116Z","iopub.status.idle":"2025-01-07T15:36:37.972116Z","shell.execute_reply.started":"2025-01-07T15:36:37.953084Z","shell.execute_reply":"2025-01-07T15:36:37.971079Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Vẽ đồ thị phân phối của biến mục tiêu","metadata":{}},{"cell_type":"code","source":"sii_counts = train_vis['sii'].value_counts().reset_index()\ntotal = sii_counts['count'].sum()\nsii_counts['percentage'] = (sii_counts['count'] / total) * 100\n\nfig, axes = plt.subplots(1, 2, figsize=(14, 5))\n\n# SII\nsns.barplot(x='sii', y='count', data=sii_counts, palette='Blues_d', ax=axes[0])\naxes[0].set_title('Distribution of Severity Impairment Index (sii)', fontsize=14)\nfor p in axes[0].patches:\n    height = p.get_height()\n    percentage = sii_counts.loc[sii_counts['count'] == height, 'percentage'].values[0]\n    axes[0].text(\n        p.get_x() + p.get_width() / 2,\n        height + 5, f'{int(height)} ({percentage:.1f}%)',\n        ha=\"center\", fontsize=12\n    )\n\n# PCIAT_Total for complete responses\nsns.histplot(train_vis['complete_resp_total'].dropna(), bins=20, ax=axes[1])\naxes[1].set_title('Distribution of PCIAT_Total', fontsize=14)\naxes[1].set_xlabel('PCIAT_Total for Complete PCIAT Responses')\n\nplt.tight_layout()\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-07T15:36:37.973612Z","iopub.execute_input":"2025-01-07T15:36:37.973983Z","iopub.status.idle":"2025-01-07T15:36:38.675400Z","shell.execute_reply.started":"2025-01-07T15:36:37.973951Z","shell.execute_reply":"2025-01-07T15:36:38.674291Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"len(train_vis[train_vis['complete_resp_total'] == 0])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-07T15:36:38.676761Z","iopub.execute_input":"2025-01-07T15:36:38.677071Z","iopub.status.idle":"2025-01-07T15:36:38.685043Z","shell.execute_reply.started":"2025-01-07T15:36:38.677040Z","shell.execute_reply":"2025-01-07T15:36:38.683951Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"<div style=\"line-height:24px; font-size:16px;border-left: 5px solid silver; padding-left: 26px;\"> \n    💡 Note: Ta có thể thấy, 40% số người tham gia không bị ảnh hưởng bởi việc sử dụng Internet, 31% không được đánh giá và chỉ thiểu số (~10%) bị suy giảm ở mức độ từ trung bình đến nặng. Có 307 người tham gia đạt điểm 0 ở tất cả các câu hỏi PCIAT.\n</div>","metadata":{}},{"cell_type":"markdown","source":"SII theo độ tuổi và giới tính","metadata":{}},{"cell_type":"code","source":"assert train_vis['Basic_Demos-Age'].isna().sum() == 0\nassert train_vis['Basic_Demos-Sex'].isna().sum() == 0","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-07T15:36:38.686227Z","iopub.execute_input":"2025-01-07T15:36:38.686576Z","iopub.status.idle":"2025-01-07T15:36:38.697684Z","shell.execute_reply.started":"2025-01-07T15:36:38.686545Z","shell.execute_reply":"2025-01-07T15:36:38.696826Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_vis['Age Group'] = pd.cut(\n    train_vis['Basic_Demos-Age'],\n    bins=[4, 12, 18, 22],\n    labels=['Children (5-12)', 'Adolescents (13-18)', 'Adults (19-22)']\n)\ncalculate_stats(train_vis, 'Age Group')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-07T15:36:38.700473Z","iopub.execute_input":"2025-01-07T15:36:38.700774Z","iopub.status.idle":"2025-01-07T15:36:38.719709Z","shell.execute_reply.started":"2025-01-07T15:36:38.700746Z","shell.execute_reply":"2025-01-07T15:36:38.718614Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sex_map = {0: 'Male', 1: 'Female'}\ntrain_vis['Basic_Demos-Sex'] = train_vis['Basic_Demos-Sex'].map(sex_map)\ncalculate_stats(train_vis, 'Basic_Demos-Sex')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-07T15:36:38.720835Z","iopub.execute_input":"2025-01-07T15:36:38.721132Z","iopub.status.idle":"2025-01-07T15:36:38.732559Z","shell.execute_reply.started":"2025-01-07T15:36:38.721104Z","shell.execute_reply":"2025-01-07T15:36:38.731539Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"fig, axes = plt.subplots(1, 3, figsize=(18, 5))\n\n# SII by Age\nsns.boxplot(y=train_vis['Basic_Demos-Age'], x=train_vis['sii'], ax=axes[0], palette=\"Set3\")\naxes[0].set_title('SII by Age')\naxes[0].set_ylabel('Age')\naxes[0].set_xlabel('SII')\n\n# Complete PCIAT Responses by Age Group\nsns.boxplot(\n    x='Age Group', y='complete_resp_total',\n    data=train_vis, palette=\"Set3\", ax=axes[1]\n)\naxes[1].set_title('Complete PCIAT Responses by Age Group')\naxes[1].set_ylabel('PCIAT_Total for Complete Responses')\naxes[1].set_xlabel('Age Group')\n\n# PCIAT_Total by Sex\nsns.histplot(\n    data=train_vis, x='complete_resp_total',\n    hue='Basic_Demos-Sex', multiple='stack',\n    palette=\"Set3\", bins=20, ax=axes[2]\n)\naxes[2].set_title('PCIAT_Total Distribution by Sex')\naxes[2].set_xlabel('PCIAT_Total for Complete Responses')\naxes[2].set_ylabel('Frequency')\n\nplt.tight_layout()\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-07T15:36:38.733934Z","iopub.execute_input":"2025-01-07T15:36:38.734200Z","iopub.status.idle":"2025-01-07T15:36:39.738408Z","shell.execute_reply.started":"2025-01-07T15:36:38.734173Z","shell.execute_reply":"2025-01-07T15:36:39.737320Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"stats = train_vis.groupby(['Age Group', 'sii']).size().unstack(fill_value=0)\nfig, axes = plt.subplots(1, len(stats), figsize=(18, 5))\n\nfor i, age_group in enumerate(stats.index):\n    group_counts = stats.loc[age_group] / stats.loc[age_group].sum()\n    axes[i].pie(\n        group_counts, labels=group_counts.index, autopct='%1.1f%%',\n        startangle=90, colors=sns.color_palette(\"Set3\"),\n        labeldistance=1.05, pctdistance=0.80\n    )\n    axes[i].set_title(f'SII Distribution for {age_group}')\n    axes[i].axis('equal')\n\nplt.tight_layout()\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-07T15:36:39.740301Z","iopub.execute_input":"2025-01-07T15:36:39.740694Z","iopub.status.idle":"2025-01-07T15:36:40.278158Z","shell.execute_reply.started":"2025-01-07T15:36:39.740629Z","shell.execute_reply":"2025-01-07T15:36:40.277091Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Sự phân bố sii giữa các nhóm tuổi khác nhau:","metadata":{}},{"cell_type":"code","source":"stats = train_vis.groupby(['Age Group', 'sii']).size().unstack(fill_value=0)\nstats_prop = stats.div(stats.sum(axis=1), axis=0) * 100\n\nstats = stats.astype(str) +' (' + stats_prop.round(1).astype(str) + '%)'\nstats","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-07T15:36:40.279681Z","iopub.execute_input":"2025-01-07T15:36:40.280094Z","iopub.status.idle":"2025-01-07T15:36:40.304155Z","shell.execute_reply.started":"2025-01-07T15:36:40.280050Z","shell.execute_reply":"2025-01-07T15:36:40.303077Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Tính tỷ lệ phần trăm cho những người tham gia chỉ có SII không thiếu:","metadata":{}},{"cell_type":"code","source":"stats = train_vis[train_vis['sii'] != 'Missing'].groupby(\n    ['Age Group', 'sii']\n).size().unstack(fill_value=0)\nstats_prop = stats.div(stats.sum(axis=1), axis=0) * 100\n\nstats = stats.astype(str) +' (' + stats_prop.round(1).astype(str) + '%)'\nstats","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-07T15:36:40.305879Z","iopub.execute_input":"2025-01-07T15:36:40.306299Z","iopub.status.idle":"2025-01-07T15:36:40.328870Z","shell.execute_reply.started":"2025-01-07T15:36:40.306253Z","shell.execute_reply":"2025-01-07T15:36:40.327813Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"<div style=\"line-height:24px; font-size:16px;border-left: 5px solid silver; padding-left: 26px;\"> \n    💡 Note: \n    <ul style=\"list-style:circle\">\n<li>Các biểu đồ hộp (box plots) là các cách trình bày khác nhau của biến mục tiêu ở dạng được phân loại (SII) và dạng số (PCIAT_Total). Chúng cho thấy rằng điểm SII cao hơn thường liên quan đến nhóm tuổi lớn hơn, nhưng có sự chồng lấn đáng kể về khoảng tuổi trong mỗi danh mục. Đồng thời, giá trị trung vị của PCIAT_Total cao hơn ở thanh thiếu niên, gợi ý mối quan hệ hình chữ U giữa độ tuổi và mức độ ảnh hưởng của PIU (các vấn đề liên quan đến Internet có thể đạt đỉnh điểm trong giai đoạn thanh thiếu niên).\n<li>Theo đó, trong các biểu đồ tròn (pie charts), phân bố SII ở trẻ em và người lớn nghiêng về các giá trị thấp (không hoặc nhẹ), trong khi ở thanh thiếu niên, phân bố cân đối hơn giữa các danh mục không, nhẹ và trung bình.\n<li>Vậy còn số liệu thì sao (xem bảng)? Số lượng thanh thiếu niên thấp hơn nhiều so với trẻ em, và số lượng người lớn tham gia thì cực kỳ thấp (chỉ 88 người, trong đó chỉ có 36 người có SII)\n<li>Như đã thấy từ các biểu đồ trong phần trước, phân bố tổng thể của SII nghiêng về các giá trị thấp và các trường hợp nghiêm trọng rất hiếm. Do đó, có thể tồn tại những mối quan hệ mà chúng ta không nhìn thấy được do kích thước mẫu không đồng đều và sự thiếu đại diện của các trường hợp nghiêm trọng.\n<li>Sự khác biệt giữa nam và nữ tương đối tinh tế.\n    </ul>\n</div>","metadata":{}},{"cell_type":"markdown","source":"# Internet Use","metadata":{}},{"cell_type":"markdown","source":"Dữ liệu sử dụng Internet rất quan trọng đối với nhiệm vụ này vì Problematic internet use (PIU), đề cập đến việc sử dụng Internet quá mức và không lành mạnh, cản trở cuộc sống hàng ngày, trách nhiệm và các mối quan hệ xã hội của một người. Dữ liệu sử dụng Internet cung cấp thước đo trực tiếp về lượng thời gian mỗi người tham gia trực tuyến.","metadata":{}},{"cell_type":"code","source":"data = train_vis[train_vis['PreInt_EduHx-computerinternet_hoursday'].notna()]\nage_range = data['Basic_Demos-Age']\nprint(\n    f\"Age range for participants with measured PreInt_EduHx-computerinternet_hoursday data:\"\n    f\" {age_range.min()} - {age_range.max()} years\"\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-07T15:36:40.330247Z","iopub.execute_input":"2025-01-07T15:36:40.330582Z","iopub.status.idle":"2025-01-07T15:36:40.338692Z","shell.execute_reply.started":"2025-01-07T15:36:40.330551Z","shell.execute_reply":"2025-01-07T15:36:40.337614Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_vis['PreInt_EduHx-computerinternet_hoursday'].unique()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-07T15:36:40.340148Z","iopub.execute_input":"2025-01-07T15:36:40.340999Z","iopub.status.idle":"2025-01-07T15:36:40.358075Z","shell.execute_reply.started":"2025-01-07T15:36:40.340965Z","shell.execute_reply":"2025-01-07T15:36:40.357016Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"param_map = {0: '< 1h/day', 1: '~ 1h/day', 2: '~ 2hs/day', 3: '> 3hs/day'}\ntrain_vis['internet_use_encoded'] = train_vis[\n    'PreInt_EduHx-computerinternet_hoursday'\n].map(param_map).fillna('Missing')\n\nparam_ord = ['Missing', '< 1h/day', '~ 1h/day', '~ 2hs/day', '> 3hs/day']\ntrain_vis['internet_use_encoded'] = pd.Categorical(\n    train_vis['internet_use_encoded'], categories=param_ord,\n    ordered=True\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-07T15:36:40.359301Z","iopub.execute_input":"2025-01-07T15:36:40.359621Z","iopub.status.idle":"2025-01-07T15:36:40.374789Z","shell.execute_reply.started":"2025-01-07T15:36:40.359590Z","shell.execute_reply":"2025-01-07T15:36:40.373706Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"calculate_stats(train_vis, 'PreInt_EduHx-Season')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-07T15:36:40.376280Z","iopub.execute_input":"2025-01-07T15:36:40.376843Z","iopub.status.idle":"2025-01-07T15:36:40.396326Z","shell.execute_reply.started":"2025-01-07T15:36:40.376795Z","shell.execute_reply":"2025-01-07T15:36:40.395285Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"fig, axes = plt.subplots(1, 3, figsize=(18, 5))\n\n# Hours of Internet Use\nax1 = sns.countplot(x='internet_use_encoded', data=train_vis, palette=\"Set3\", ax=axes[0])\naxes[0].set_title('Distribution of Hours of Internet Use')\naxes[0].set_xlabel('Hours per Day Group')\naxes[0].set_ylabel('Count')\n\ntotal = len(train_vis['internet_use_encoded'])\nfor p in ax1.patches:\n    count = int(p.get_height())\n    percentage = '{:.1f}%'.format(100 * count / total)\n    ax1.annotate(f'{count} ({percentage})', (p.get_x() + p.get_width() / 2., p.get_height()), \n                 ha='center', va='baseline', fontsize=10, color='black', xytext=(0, 5), \n                 textcoords='offset points')\n\n# Hours of Internet Use by Age\nsns.boxplot(y=train_vis['Basic_Demos-Age'], x=train_vis['internet_use_encoded'], ax=axes[1], palette=\"Set3\")\naxes[1].set_title('Hours of Internet Use by Age')\naxes[1].set_ylabel('Age')\naxes[1].set_xlabel('Hours per Day Group')\n\n# Hours of Internet Use (numeric) by Age Group\nsns.boxplot(y='PreInt_EduHx-computerinternet_hoursday', x='Age Group', data=train_vis, ax=axes[2], palette=\"Set3\")\naxes[2].set_title('Internet Hours by Age Group')\naxes[2].set_ylabel('Hours per Day (Numeric)')\naxes[2].set_xlabel('Age Group')\n\nplt.tight_layout()\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-07T15:36:40.398074Z","iopub.execute_input":"2025-01-07T15:36:40.398460Z","iopub.status.idle":"2025-01-07T15:36:41.163484Z","shell.execute_reply.started":"2025-01-07T15:36:40.398413Z","shell.execute_reply":"2025-01-07T15:36:41.162432Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"stats = train_vis.groupby(\n    ['Age Group', 'internet_use_encoded']\n).size().unstack(fill_value=0)\nfig, axes = plt.subplots(1, len(stats), figsize=(18, 5))\n\nfor i, age_group in enumerate(stats.index):\n    group_counts = stats.loc[age_group] / stats.loc[age_group].sum()\n    axes[i].pie(group_counts, labels=group_counts.index, autopct='%1.1f%%',\n                startangle=90, colors=sns.color_palette(\"Set3\"), labeldistance=1.1)\n    axes[i].set_title(f'Distribution of Hours of Internet Use\\n{age_group}')\n    axes[i].axis('equal')\n\nplt.tight_layout()\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-07T15:36:41.164818Z","iopub.execute_input":"2025-01-07T15:36:41.165139Z","iopub.status.idle":"2025-01-07T15:36:41.562948Z","shell.execute_reply.started":"2025-01-07T15:36:41.165107Z","shell.execute_reply":"2025-01-07T15:36:41.561863Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_vis_non_na = train_vis.dropna(subset=['PreInt_EduHx-computerinternet_hoursday'])\nrows = (train_vis_non_na['PreInt_EduHx-computerinternet_hoursday'] == 3).sum()\nprint(f\"Non-NA Rows - Internet use 3h or more: {(rows / len(train_vis_non_na)) * 100:.2f}%\")\n\nrows = (train_vis_non_na['PreInt_EduHx-computerinternet_hoursday'] == 0).sum()\nprint(f\"Non-NA Rows - Internet use 1h or less: {(rows / len(train_vis_non_na)) * 100:.2f}%\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-07T15:36:41.564287Z","iopub.execute_input":"2025-01-07T15:36:41.564729Z","iopub.status.idle":"2025-01-07T15:36:41.577010Z","shell.execute_reply.started":"2025-01-07T15:36:41.564683Z","shell.execute_reply":"2025-01-07T15:36:41.576168Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"stats = train_vis.groupby(['Basic_Demos-Sex', 'internet_use_encoded']\n).size().unstack(fill_value=0)\nstats_prop = stats.div(stats.sum(axis=1), axis=0) * 100\n\nstats = stats.astype(str) +' (' + stats_prop.round(1).astype(str) + '%)'\nstats","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-07T15:36:41.578316Z","iopub.execute_input":"2025-01-07T15:36:41.579224Z","iopub.status.idle":"2025-01-07T15:36:41.603754Z","shell.execute_reply.started":"2025-01-07T15:36:41.579175Z","shell.execute_reply":"2025-01-07T15:36:41.602706Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"<div style=\"line-height:24px; font-size:16px;border-left: 5px solid silver; padding-left: 26px;\"> \n    💡 Note: \n    <ul style=\"list-style:circle\">\n<li>Dữ liệu về việc sử dụng Internet bị thiếu đối với 16,6% số người tham gia, trong khi 38,5% báo cáo rằng họ sử dụng Internet dưới 1 giờ mỗi ngày.\n<li>Tương tự như dữ liệu SII, các biểu đồ hộp cho thấy việc sử dụng Internet hàng ngày nhiều hơn thường liên quan đến nhóm tuổi lớn hơn, với sự chồng lấn đáng kể giữa các khoảng tuổi trong mỗi danh mục sử dụng Internet. Tuy nhiên, ở đây cả biểu diễn phân loại và số hóa của số giờ trực tuyến đều chỉ ra mối quan hệ tuyến tính nhất quán.\n<li>Các biểu đồ tròn theo nhóm tuổi cũng phù hợp và hiển thị cùng một kết quả.\n<li>Việc tạo một đặc trưng tương tác giữa việc sử dụng Internet và độ tuổi có thể hữu ích cho việc xây dựng mô hình.\n<li>Mức độ sử dụng Internet khá tương đồng giữa cả hai giới.\n    </ul>\n</div>","metadata":{}},{"cell_type":"markdown","source":"## Internet usage vs SII (target)","metadata":{}},{"cell_type":"markdown","source":"Mô tả cuộc thi nêu rõ rằng mục tiêu là: phát hiện sớm các dấu hiệu về việc sử dụng công nghệ và Internet có vấn đề (PIU), trong khi định nghĩa về PUI bao gồm việc sử dụng Internet quá mức.\nVì vậy, hãy xem những người tham gia có mức độ suy giảm sức khỏe (SII) khác nhau đã dành bao nhiêu thời gian trực tuyến trong tập dữ liệu này.","metadata":{}},{"cell_type":"code","source":"sii_reported = train_vis[train_vis['sii'] != \"Missing\"]\nsii_reported.loc[:, 'sii'] = sii_reported['sii'].cat.remove_unused_categories()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-07T15:36:41.604921Z","iopub.execute_input":"2025-01-07T15:36:41.605186Z","iopub.status.idle":"2025-01-07T15:36:41.620397Z","shell.execute_reply.started":"2025-01-07T15:36:41.605159Z","shell.execute_reply":"2025-01-07T15:36:41.619462Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"stats = sii_reported.groupby(\n    ['internet_use_encoded', 'sii']\n).size().unstack(fill_value=0)\nstats_prop = stats.div(stats.sum(axis=1), axis=0) * 100\n\nstats = stats.astype(str) +' (' + stats_prop.round(1).astype(str) + '%)'\nstats","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-07T15:36:41.626709Z","iopub.execute_input":"2025-01-07T15:36:41.627008Z","iopub.status.idle":"2025-01-07T15:36:41.650406Z","shell.execute_reply.started":"2025-01-07T15:36:41.626979Z","shell.execute_reply":"2025-01-07T15:36:41.649331Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"fig = plt.figure(figsize=(12, 10))\ngs = fig.add_gridspec(2, 2, height_ratios=[1, 1.5])\n\n# SII vs Hours of Internet Use\nax1 = fig.add_subplot(gs[0, 0])\nsns.boxplot(\n    x='sii', y='PreInt_EduHx-computerinternet_hoursday',\n    data=sii_reported,\n    ax=ax1, palette=\"Set3\"\n)\nax1.set_title('SII vs Hours of Internet Use')\nax1.set_ylabel('Hours per Day')\nax1.set_xlabel('SII')\n\n# PCIAT_Total for Complete PCIAT Responses by Hours of Internet Use\nax2 = fig.add_subplot(gs[0, 1])\nsns.boxplot(\n    x='internet_use_encoded', y='complete_resp_total',\n    data=sii_reported,\n    palette=\"Set3\", ax=ax2\n)\nax2.set_title('PCIAT_Total by Hours of Internet Use')\nax2.set_ylabel('PCIAT_Total for Complete PCIAT Responses')\nax2.set_xlabel('Hours per Day Group')\n\n# SII vs Hours of Internet Use by Age Group (Full width)\nax3 = fig.add_subplot(gs[1, :])\nsns.boxplot(\n    x='internet_use_encoded', y='complete_resp_total',\n    data=sii_reported,\n    hue='Age Group', ax=ax3, palette=\"Set3\"\n)\nax3.set_title('PCIAT_Total vs Hours of Internet Use by Age Group')\nax3.set_ylabel('PCIAT_Total for Complete PCIAT Responses')\nax3.set_xlabel('Hours per Day Group')\n\nplt.tight_layout()\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-07T15:36:41.651805Z","iopub.execute_input":"2025-01-07T15:36:41.652129Z","iopub.status.idle":"2025-01-07T15:36:43.287221Z","shell.execute_reply.started":"2025-01-07T15:36:41.652100Z","shell.execute_reply":"2025-01-07T15:36:43.286242Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"stats = sii_reported.groupby(\n    ['sii', 'internet_use_encoded']\n).size().unstack(fill_value=0)\nfig, axes = plt.subplots(1, len(stats), figsize=(18, 5))\n\nfor i, sii_group in enumerate(stats.index):\n    group_counts = stats.loc[sii_group] / stats.loc[sii_group].sum()\n    axes[i].pie(\n        group_counts, labels=group_counts.index, autopct='%1.1f%%',\n        startangle=90, colors=sns.color_palette(\"Set3\"), labeldistance=1.1\n    )\n    axes[i].set_title(f'Hours of using computer/internet\\n for SII = {sii_group}')\n    axes[i].axis('equal')\n\nplt.tight_layout()\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-07T15:36:43.288675Z","iopub.execute_input":"2025-01-07T15:36:43.289077Z","iopub.status.idle":"2025-01-07T15:36:43.791198Z","shell.execute_reply.started":"2025-01-07T15:36:43.289035Z","shell.execute_reply":"2025-01-07T15:36:43.790109Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_vis[\n    (train_vis['internet_use_encoded'] == '< 1h/day') & \n    (train_vis['sii'].isin(['2 (Moderate)', '3 (Severe)']))\n]['Basic_Demos-Age'].describe()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-07T15:36:43.792539Z","iopub.execute_input":"2025-01-07T15:36:43.792858Z","iopub.status.idle":"2025-01-07T15:36:43.804691Z","shell.execute_reply.started":"2025-01-07T15:36:43.792826Z","shell.execute_reply":"2025-01-07T15:36:43.803856Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"<div style=\"line-height:24px; font-size:16px;border-left: 5px solid silver; padding-left: 26px;\"> \n    💡 Note: \n    <ul style=\"list-style:circle\">\n<li>Trong các biểu đồ hộp, mặc dù có sự chồng lấn đáng kể giữa các danh mục SII và mức sử dụng Internet, chúng ta thấy một xu hướng tích cực giữa mức độ ảnh hưởng của PIU và việc sử dụng Internet, với những người có điểm SII cao hơn dành nhiều thời gian trực tuyến hơn (điều này không có gì lạ vì việc sử dụng Internet quá mức đã được giả định trong định nghĩa của PIU).\n<li>Tuy nhiên, khi mối quan hệ giữa PCIAT_Total và số giờ sử dụng Internet được phân tích chi tiết hơn theo nhóm tuổi (biểu đồ hộp phía dưới), mối quan hệ phi tuyến tính giữa độ tuổi, việc sử dụng Internet và PIU hiện rõ, với thanh thiếu niên nổi bật là nhóm tuổi bị ảnh hưởng nhiều nhất ở tất cả các danh mục sử dụng Internet.\n<li>Các biểu đồ tròn cũng cho thấy một tỷ lệ đáng kể người tham gia (tổng cộng 83 người, ở mọi độ tuổi) dành rất ít thời gian trực tuyến (dưới 1 giờ mỗi ngày) nhưng lại có điểm SII cao (20,7% bị ảnh hưởng ở mức trung bình - SII=2 và 14,7% bị ảnh hưởng nghiêm trọng - SII=3).\n    </ul>\n</div>","metadata":{}},{"cell_type":"markdown","source":"<div style=\"border: 2px solid #c9c9c9; padding: 15px; border-radius: 5px; background-color: #f7f7f7;\">\n    <h3>Kết luận</h3>\n    <ol>\n        <li>Điểm SII có xu hướng tăng theo độ tuổi nhưng thể hiện mối quan hệ hình chữ U, với thanh thiếu niên có điểm trung vị PCIAT cao nhất.</li>\n        <li>Độ tuổi càng cao, số giờ trực tuyến của người tham gia càng nhiều (xu hướng tuyến tính rõ ràng).</li>\n        <li>Những người có điểm SII cao thường dành nhiều thời gian trực tuyến hơn, nhưng thanh thiếu niên nổi bật là nhóm tuổi bị ảnh hưởng nhiều nhất ở tất cả các danh mục sử dụng Internet.</li>\n        <li>Có những người tham gia ở hầu hết các độ tuổi (từ 5 đến 21) chỉ dành dưới 1 giờ mỗi ngày trực tuyến nhưng lại có điểm SII cao.</li>\n    </ol>\n    <p><em>Lưu ý:</em> Các kết quả này cần được diễn giải thận trọng, vì có sự chồng lấn đáng kể giữa các danh mục SII và mức sử dụng Internet, và các trường hợp nghiêm trọng cũng như người lớn bị thiếu đại diện trong dữ liệu.</p>\n</div>","metadata":{}},{"cell_type":"markdown","source":"# Features EDA by Groups","metadata":{}},{"cell_type":"markdown","source":"Dưới đây là cách phân loại các loại tính năng trong tập dữ liệu này:\n- Phân loại(Categorical):  Các biến có danh mục riêng biệt nhưng không có thứ tự cố hữu (được biểu thị dưới dạng chuỗi, ví dụ: mùa tuyển sinh)\n- Các đặc trưng phân loại đã mã hóa(Encoded categorical features): (đã được mã hóa dưới dạng số nguyên, ví dụ: giới tính)\n- Liên tục(Continuous): Các biến có thể nhận bất kỳ giá trị nào trong một khoảng (ví dụ: tuổi, enmo, nhịp tim).\n- Thứ tự(Ordinal): Các biến có thứ tự xác định nhưng không nhất thiết phải có các danh mục cách đều nhau (ví dụ: phản hồi từ bảng hỏi).","metadata":{}},{"cell_type":"markdown","source":"Và đây là các nhóm feature khác nhau:","metadata":{}},{"cell_type":"code","source":"groups = data_dict.groupby('Instrument')['Field'].apply(list).to_dict()\n\nfor instrument, features in groups.items():\n    print(f\"{instrument}: {features}\\n\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-07T15:36:43.805990Z","iopub.execute_input":"2025-01-07T15:36:43.806279Z","iopub.status.idle":"2025-01-07T15:36:43.817557Z","shell.execute_reply.started":"2025-01-07T15:36:43.806248Z","shell.execute_reply":"2025-01-07T15:36:43.816571Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Remove target-related columns and continue EDA by feature groups","metadata":{}},{"cell_type":"code","source":"data_dict = data_dict[data_dict['Instrument'] != 'Parent-Child Internet Addiction Test']\ncontinuous_cols = data_dict[data_dict['Type'].str.contains(\n    'float|int', case=False\n)]['Field'].tolist()\n\n# target = train[['sii']]\n# train = train.drop(columns = columns_not_in_test)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-07T15:36:43.818856Z","iopub.execute_input":"2025-01-07T15:36:43.819166Z","iopub.status.idle":"2025-01-07T15:36:43.835164Z","shell.execute_reply.started":"2025-01-07T15:36:43.819138Z","shell.execute_reply":"2025-01-07T15:36:43.834422Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# <p style=\"background-color:#f6f5f5; color:black; font-family:Verdana; font-size:100%; text-align:left; border:chocolate solid; border-radius:15px; padding:20px 20px;\">- Demographics</p>","metadata":{}},{"cell_type":"code","source":"groups.get('Demographics', [])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-07T15:36:43.836457Z","iopub.execute_input":"2025-01-07T15:36:43.836849Z","iopub.status.idle":"2025-01-07T15:36:43.850332Z","shell.execute_reply.started":"2025-01-07T15:36:43.836804Z","shell.execute_reply":"2025-01-07T15:36:43.849508Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"fig, axes = plt.subplots(1, 2, figsize=(12, 5))\n\n# Season of Enrollment\nseason_counts = train['Basic_Demos-Enroll_Season'].value_counts(dropna=False)\n\naxes[0].pie(\n    season_counts, labels=season_counts.index,\n    autopct='%1.1f%%', startangle=90,\n    colors=sns.color_palette(\"Set3\")\n)\naxes[0].set_title('Season of Enrollment')\naxes[0].axis('equal')\n\n# Age Distribution by Sex\nsns.histplot(\n    data=train, x='Basic_Demos-Age',\n    hue='Basic_Demos-Sex', multiple='dodge',\n    palette=\"Set2\", bins=20, ax=axes[1]\n)\naxes[1].set_title('Age Distribution by Sex')\naxes[1].set_xlabel('Age')\naxes[1].set_ylabel('Count')\n\nplt.tight_layout()\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-07T15:36:43.851683Z","iopub.execute_input":"2025-01-07T15:36:43.852083Z","iopub.status.idle":"2025-01-07T15:36:44.548859Z","shell.execute_reply.started":"2025-01-07T15:36:43.852034Z","shell.execute_reply":"2025-01-07T15:36:44.547804Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"0=Male, 1=Female","metadata":{}},{"cell_type":"code","source":"calculate_stats(train, 'Basic_Demos-Age')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-07T15:36:44.550082Z","iopub.execute_input":"2025-01-07T15:36:44.550363Z","iopub.status.idle":"2025-01-07T15:36:44.568594Z","shell.execute_reply.started":"2025-01-07T15:36:44.550335Z","shell.execute_reply":"2025-01-07T15:36:44.567624Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"<div style=\"line-height:24px; font-size:16px;border-left: 5px solid silver; padding-left: 26px;\"> \n    💡 Note: \n    <ul style=\"list-style:circle\">\n<li>Phân phối việc tham gia theo mùa khá cân đối, với tỷ lệ tham gia cao nhất vào mùa Xuân (28.5%) và thấp nhất vào mùa Thu (21.9%)..\n<li>Có một số lượng nam cao hơn ở hầu hết các nhóm tuổi, trong khi số lượng nữ ít hơn, đặc biệt là ở các nhóm tuổi trẻ hơn.\n<li>Các mối quan hệ với biến mục tiêu (không có sự khác biệt về SII giữa nam và nữ, mối quan hệ theo hình chữ U giữa độ tuổi và mức độ ảnh hưởng của PIU).\n    </ul>\n</div>","metadata":{}},{"cell_type":"markdown","source":"# <p style=\"background-color:#f6f5f5; color:black; font-family:Verdana; font-size:100%; text-align:left; border:chocolate solid; border-radius:15px; padding:20px 20px;\">- Children's Global Assessment Scale</p>","metadata":{}},{"cell_type":"code","source":"groups.get(\"Children's Global Assessment Scale\", [])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-07T15:36:44.569713Z","iopub.execute_input":"2025-01-07T15:36:44.570026Z","iopub.status.idle":"2025-01-07T15:36:44.576183Z","shell.execute_reply.started":"2025-01-07T15:36:44.569995Z","shell.execute_reply":"2025-01-07T15:36:44.575238Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"data = train_vis[train_vis['CGAS-CGAS_Score'].notnull()]\nage_range = data['Basic_Demos-Age']\nprint(\n    f\"Age range for participants with CGAS-CGAS_Score data:\"\n    f\" {age_range.min()} - {age_range.max()} years\"\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-07T15:36:44.577417Z","iopub.execute_input":"2025-01-07T15:36:44.577827Z","iopub.status.idle":"2025-01-07T15:36:44.590623Z","shell.execute_reply.started":"2025-01-07T15:36:44.577783Z","shell.execute_reply":"2025-01-07T15:36:44.589653Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"calculate_stats(train_vis, 'CGAS-CGAS_Score')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-07T15:36:44.591829Z","iopub.execute_input":"2025-01-07T15:36:44.592177Z","iopub.status.idle":"2025-01-07T15:36:44.611432Z","shell.execute_reply.started":"2025-01-07T15:36:44.592133Z","shell.execute_reply":"2025-01-07T15:36:44.610446Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_vis[train_vis['CGAS-CGAS_Score'] > 100]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-07T15:36:44.612686Z","iopub.execute_input":"2025-01-07T15:36:44.613006Z","iopub.status.idle":"2025-01-07T15:36:44.635397Z","shell.execute_reply.started":"2025-01-07T15:36:44.612974Z","shell.execute_reply":"2025-01-07T15:36:44.634350Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"<div style=\"line-height:24px; font-size:16px;border-left: 5px solid silver; padding-left: 26px;\"> \n    💡 Note: \n    <ul style=\"list-style:circle\">\n<li>Có một giá trị ngoại lệ cực trị (CGAS-CGAS_Score = 999), đây rõ ràng là một lỗi.\n    </ul>\n</div>","metadata":{}},{"cell_type":"code","source":"train_vis.loc[train_vis['CGAS-CGAS_Score'] == 999, 'CGAS-CGAS_Score'] = np.nan","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-07T15:36:44.636797Z","iopub.execute_input":"2025-01-07T15:36:44.637117Z","iopub.status.idle":"2025-01-07T15:36:44.648517Z","shell.execute_reply.started":"2025-01-07T15:36:44.637087Z","shell.execute_reply":"2025-01-07T15:36:44.647404Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"plt.figure(figsize=(12, 5))\n\n# CGAS-Season\nplt.subplot(1, 2, 1)\ncgas_season_counts = train['CGAS-Season'].value_counts(normalize=True)\nplt.pie(\n    cgas_season_counts, \n    labels=cgas_season_counts.index, \n    autopct='%1.1f%%', \n    startangle=90, \n    colors=sns.color_palette(\"Set3\")\n)\nplt.title('CGAS-Season')\nplt.axis('equal')\n\n# CGAS-CGAS_Score without outliers (score == 999)\nplt.subplot(1, 2, 2)\nsns.histplot(\n    train['CGAS-CGAS_Score'].dropna(),\n    bins=20, kde=True\n)\nplt.title('CGAS-CGAS_Score (Without Outlier)')\nplt.xlabel('CGAS Score')\nplt.ylabel('Count')\n\nplt.tight_layout()\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-07T15:36:44.649862Z","iopub.execute_input":"2025-01-07T15:36:44.650152Z","iopub.status.idle":"2025-01-07T15:36:45.230670Z","shell.execute_reply.started":"2025-01-07T15:36:44.650124Z","shell.execute_reply":"2025-01-07T15:36:45.229702Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Số liệu thống kê không có ngoại lệ:","metadata":{}},{"cell_type":"code","source":"calculate_stats(train, 'CGAS-CGAS_Score')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-07T15:36:45.231832Z","iopub.execute_input":"2025-01-07T15:36:45.232131Z","iopub.status.idle":"2025-01-07T15:36:45.250340Z","shell.execute_reply.started":"2025-01-07T15:36:45.232100Z","shell.execute_reply":"2025-01-07T15:36:45.249523Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### CGAS Interpretation ([Reference](https://www.corc.uk.net/outcome-experience-measures/childrens-global-assessment-scale-cgas/))\n\nCGAS là thang đánh giá chức năng chung dành cho trẻ em và thanh thiếu niên từ 4-16 tuổi. CGAS yêu cầu bác sĩ lâm sàng đánh giá trẻ từ 1 đến 100 dựa trên mức độ hoạt động thấp nhất của chúng, bất kể phương pháp điều trị hay tiên lượng, trong một khoảng thời gian nhất định.\n\nVì CGAS là thước đo chức năng chung và SII phản ánh mức độ nghiêm trọng của tác động của việc sử dụng Internet đối với chức năng đó nên tôi cho rằng tính năng này, cùng với việc sử dụng Internet, sẽ là tính năng quan trọng nhất trong việc dự đoán SII.\n\nHãy phân loại cột `CGAS-CGAS_Score` dựa trên các loại điểm số đã được thiết lập và vẽ số lượng:","metadata":{}},{"cell_type":"code","source":"bins = np.arange(0, 101, 10)\nlabels = [\n    \"1-10: Needs constant supervision (24 hour care)\",\n    \"11-20: Needs considerable supervision\",\n    \"21-30: Unable to function in almost all areas\",\n    \"31-40: Major impairment in functioning in several areas\",\n    \"41-50: Moderate degree of interference in functioning\",\n    \"51-60: Variable functioning with sporadic difficulties\",\n    \"61-70: Some difficulty in a single area\",\n    \"71-80: No more than slight impairment in functioning\",\n    \"81-90: Good functioning in all areas\",\n    \"91-100: Superior functioning\"\n]\n\ntrain_vis['CGAS_Score_Bin'] = pd.cut(\n    train_vis['CGAS-CGAS_Score'], bins=bins, labels=labels\n)\n\ncounts = train_vis['CGAS_Score_Bin'].value_counts().reindex(labels)\nprop = (counts / counts.sum() * 100).round(1)\ncount_prop_labels = counts.astype(str) + \" (\" + prop.astype(str) + \"%)\"\n\nplt.figure(figsize=(18, 6))\nbars = plt.barh(labels, counts)\nplt.xlabel('Count')\nplt.title('CGAS Score Distribution')\n\nfor bar, label in zip(bars, count_prop_labels):\n    plt.text(\n        bar.get_width(), bar.get_y() + bar.get_height() / 2, label, va='center'\n    )\n\nplt.gca().invert_yaxis()\nplt.tight_layout()\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-07T15:36:45.251457Z","iopub.execute_input":"2025-01-07T15:36:45.251722Z","iopub.status.idle":"2025-01-07T15:36:45.800765Z","shell.execute_reply.started":"2025-01-07T15:36:45.251696Z","shell.execute_reply":"2025-01-07T15:36:45.799735Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"<div style=\"line-height:24px; font-size:16px;border-left: 5px solid silver; padding-left: 26px;\"> \n    💡 Note: \n    <ul style=\"list-style:circle\">\n<li>Phần lớn các cá nhân có điểm CGAS trong khoảng 51-80 (79,7%), tức là gặp khó khăn lẻ tẻ đến chỉ suy giảm nhẹ\n<li>Hai người tham gia gặp khó khăn trong hoạt động\n    </ul>\n</div>","metadata":{}},{"cell_type":"markdown","source":"Kiểm tra mối quan hệ với biến mục tiêu:","metadata":{}},{"cell_type":"code","source":"train_filt = train_vis.dropna(subset=['CGAS_Score_Bin', 'complete_resp_total'])\ntrain_filt.loc[:, 'CGAS_Score_Bin'] = train_filt['CGAS_Score_Bin'].cat.remove_unused_categories()\ntrain_filt.loc[:, 'sii'] = train_filt['sii'].cat.remove_unused_categories()\nlen(train_filt)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-07T15:36:45.802553Z","iopub.execute_input":"2025-01-07T15:36:45.802949Z","iopub.status.idle":"2025-01-07T15:36:45.818823Z","shell.execute_reply.started":"2025-01-07T15:36:45.802899Z","shell.execute_reply":"2025-01-07T15:36:45.817895Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"fig, axes = plt.subplots(1, 2, figsize=(16, 5))\n\n# CGAS-CGAS_Score vs sii\nsns.boxplot(\n    data=train_filt,\n    x='sii', y='CGAS-CGAS_Score',\n    palette='Set3', ax=axes[0]\n)\naxes[0].set_xlabel('SII Score')\naxes[0].set_ylabel('CGAS Score')\naxes[0].set_title('Distribution of CGAS Scores by SII')\n\n# complete_resp_total vs CGAS_Score_Bin\nsns.boxplot(\n    data=train_filt,\n    x='CGAS_Score_Bin', y='complete_resp_total',\n    ax=axes[1], palette='Set3'\n)\n\n# Get the tick positions and match the labels\nrange_labels = [label.split(\":\")[0] for label in train_filt['CGAS_Score_Bin'].cat.categories]\naxes[1].set_xticklabels(range_labels)\n\naxes[1].set_xlabel('CGAS Score category')\naxes[1].set_ylabel('PCIAT_Total for Complete PCIAT Responses')\naxes[1].set_title('Distribution of PCIAT_Total by CGAS Score categories')\n\nplt.tight_layout()\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-07T15:36:45.820152Z","iopub.execute_input":"2025-01-07T15:36:45.820588Z","iopub.status.idle":"2025-01-07T15:36:46.496481Z","shell.execute_reply.started":"2025-01-07T15:36:45.820544Z","shell.execute_reply":"2025-01-07T15:36:46.495456Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# <p style=\"background-color:#FFFFE0; color:black; font-family:Verdana; font-size:100%; text-align:left; border:chocolate solid; border-radius:15px; padding:20px 20px;\">- Physical Measures</p>","metadata":{}},{"cell_type":"code","source":"features_physical = groups.get('Physical Measures', [])\ncols = [col for col in features_physical if col in continuous_cols]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-07T15:36:46.497910Z","iopub.execute_input":"2025-01-07T15:36:46.498392Z","iopub.status.idle":"2025-01-07T15:36:46.504280Z","shell.execute_reply.started":"2025-01-07T15:36:46.498311Z","shell.execute_reply":"2025-01-07T15:36:46.503267Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"data_subset = train_vis[cols + ['complete_resp_total']]\n\ncorr_matrix = data_subset.corr()\n\nplt.figure(figsize=(10, 8))\nsns.heatmap(corr_matrix, annot=True, cmap='coolwarm', fmt='.2f', vmin=-1, vmax=1)\nplt.title('Correlation Heatmap')\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-07T15:36:46.505602Z","iopub.execute_input":"2025-01-07T15:36:46.505951Z","iopub.status.idle":"2025-01-07T15:36:47.092469Z","shell.execute_reply.started":"2025-01-07T15:36:46.505920Z","shell.execute_reply":"2025-01-07T15:36:47.091418Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# <p style=\"background-color:#f6f5f5; color:black; font-family:Verdana; font-size:100%; text-align:left; border:chocolate solid; border-radius:15px; padding:20px 20px;\">- FitnessGram</p>","metadata":{}},{"cell_type":"code","source":"data_dict[data_dict['Instrument'] == 'FitnessGram Child']","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-07T15:36:47.093707Z","iopub.execute_input":"2025-01-07T15:36:47.094033Z","iopub.status.idle":"2025-01-07T15:36:47.107177Z","shell.execute_reply.started":"2025-01-07T15:36:47.094001Z","shell.execute_reply":"2025-01-07T15:36:47.106062Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Mối quan hệ với biến mục tiêu (PCIAT_Total để có phản hồi PCIAT hoàn chỉnh)","metadata":{}},{"cell_type":"code","source":"train_vis['Fitness_Endurance-Total_Time_Sec'] = train_vis[\n    'Fitness_Endurance-Time_Mins'\n] * 60 + train_vis['Fitness_Endurance-Time_Sec']\ncols = [col for col in train_vis.columns if col.startswith('FGC-') \n        and 'Zone' not in col and 'Season' not in col]\ncols.extend(['Fitness_Endurance-Max_Stage', 'Fitness_Endurance-Total_Time_Sec'])\n\ndata_subset = train_vis[cols + ['complete_resp_total']]\n\ncorr_matrix = data_subset.corr()\n\nplt.figure(figsize=(10, 8))\nsns.heatmap(corr_matrix, annot=True, cmap='coolwarm', fmt='.2f', vmin=-1, vmax=1)\nplt.title('Correlation Heatmap')\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-07T15:36:47.108396Z","iopub.execute_input":"2025-01-07T15:36:47.108676Z","iopub.status.idle":"2025-01-07T15:36:47.797708Z","shell.execute_reply.started":"2025-01-07T15:36:47.108640Z","shell.execute_reply":"2025-01-07T15:36:47.796703Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"<div style=\"line-height:24px; font-size:16px;border-left: 5px solid silver; padding-left: 26px;\"> \n    💡 Note: \n    <ul style=\"list-style:circle\">\n<li>TCó mối tương quan qua lại đáng chú ý giữa các thước đo thể lực (FGC-FGC_GSD (sức mạnh tay nắm chiếm ưu thế) và FGC-FGC_GSND (sức mạnh tay cầm không chiếm ưu thế), FGC-FGC_SRL (ngồi và vươn sang trái) và FGC-FGC_SRR (ngồi và vươn sang phải)) và chúng được mong đợi là giống nhau.\n<li>Mối quan hệ với biến mục tiêu có vẻ phản trực giác: số lần gập bụng và chống đẩy cho thấy mối quan hệ dương ở mức độ vừa phải với mức độ nghiêm trọng của PIU.\n<li>Hiệu suất tốt hơn trong các bài kiểm tra thể lực không nhất thiết cho thấy mức độ hoạt động thể chất hàng ngày cao hơn. Ngoài ra, các thước đo thể lực có thể phản ánh quá khứ(do chúng tôi không biết thời gian của các phép đo).\n<li>Nhưng điều chính cần nhớ ở đây là hiệu suất thể chất cũng cải thiện theo độ tuổi, do đó, mối tương quan tích cực giữa hiệu suất thể chất và mức độ nghiêm trọng của PIU có thể chỉ do tuổi tác quyết định.\n<li>Và đây là một ẩn số khác: các bài kiểm tra thể lực có được thực hiện theo cách tiêu chuẩn hóa cho tất cả những người tham gia không?\n    </ul>\n</div>","metadata":{}},{"cell_type":"markdown","source":"Hãy cùng xem có những thay đổi như thế nào khi chúng ta vẽ cùng một thứ theo nhóm tuổi và thêm độ tuổi để xem liệu các thước đo có còn tương quan với độ tuổi hay không.","metadata":{}},{"cell_type":"code","source":"age_groups = train_vis['Age Group'].unique()\n\nfig, axes = plt.subplots(1, 3, figsize=(18, 6), sharey=True)\n\nfor i, age_group in enumerate(age_groups):\n    group_data = train_vis[train_vis['Age Group'] == age_group]\n    corr_matrix = group_data[cols + ['complete_resp_total', 'Basic_Demos-Age']].corr()\n    sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', fmt='.1f',\n                vmin=-1, vmax=1, ax=axes[i], cbar=i == 0)\n    axes[i].set_title(f'{age_group}')\n\nplt.tight_layout()\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-07T15:36:47.798907Z","iopub.execute_input":"2025-01-07T15:36:47.799228Z","iopub.status.idle":"2025-01-07T15:36:49.825351Z","shell.execute_reply.started":"2025-01-07T15:36:47.799198Z","shell.execute_reply":"2025-01-07T15:36:49.824345Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_vis[\n    (train_vis['Age Group'] == 'Adults (19-22)') &\n    (train_vis['complete_resp_total'].notna()) &\n    (train_vis[cols].notna().any(axis=1))\n][cols + ['complete_resp_total', 'Basic_Demos-Age']]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-07T15:36:49.826785Z","iopub.execute_input":"2025-01-07T15:36:49.827202Z","iopub.status.idle":"2025-01-07T15:36:49.848795Z","shell.execute_reply.started":"2025-01-07T15:36:49.827156Z","shell.execute_reply":"2025-01-07T15:36:49.847835Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"<div style=\"line-height:24px; font-size:16px;border-left: 5px solid silver; padding-left: 26px;\"> \n    💡 Note: \n    <ul style=\"list-style:circle\">\n<li>Ở mỗi nhóm tuổi, chúng tôi thấy rằng độ tuổi tương quan tốt với hầu hết các thước đo về hoạt động thể chất (đặc biệt là đối với trẻ em và người lớn).\n<li>Mối tương quan giữa tuổi tác và mức độ nghiêm trọng của PIU vẫn tồn tại ở trẻ em từ 5-12 tuổi, làm xáo trộn mối quan hệ giữa thể lực và PIU.\n<li>Đối với thanh thiếu niên, các mối tương quan giữa biến mục tiêu (PIU) và tất cả các chỉ số thể lực đều yếu hoặc không đáng kể. \n<li>Nhìn chung, các biện pháp thể dục không cho thấy mối tương quan đáng chú ý với mức độ nghiêm trọng của PIU và có vẻ như tuổi tác có thể thúc đẩy cả hiệu suất thể lực tăng lên và mức độ nghiêm trọng của PIU cao hơn\n    </ul>\n</div>","metadata":{}},{"cell_type":"markdown","source":"# <p style=\"background-color: #f6f5f5; color:black; font-family:Verdana; font-size:100%; text-align:left; border:chocolate solid;  border-radius:15px; padding:20px 20px;\">- Sleep Disturbance Scale</p>","metadata":{}},{"cell_type":"code","source":"groups.get('Sleep Disturbance Scale', [])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-07T15:36:49.850250Z","iopub.execute_input":"2025-01-07T15:36:49.850742Z","iopub.status.idle":"2025-01-07T15:36:49.858126Z","shell.execute_reply.started":"2025-01-07T15:36:49.850676Z","shell.execute_reply":"2025-01-07T15:36:49.857182Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"data = train_vis[train_vis['SDS-SDS_Total_Raw'].notnull()]\nage_range = data['Basic_Demos-Age']\nprint(\n    f\"Age range for participants with SDS-SDS_Total_Raw data:\"\n    f\" {age_range.min()} - {age_range.max()} years\"\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-07T15:36:49.859214Z","iopub.execute_input":"2025-01-07T15:36:49.859519Z","iopub.status.idle":"2025-01-07T15:36:49.872306Z","shell.execute_reply.started":"2025-01-07T15:36:49.859490Z","shell.execute_reply":"2025-01-07T15:36:49.871354Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"plt.figure(figsize=(18, 5))\n\n# SDS-Season (Pie Chart)\nplt.subplot(1, 3, 1)\nsds_season_counts = train_vis['SDS-Season'].value_counts(normalize=True)\nplt.pie(\n    sds_season_counts, \n    labels=sds_season_counts.index, \n    autopct='%1.1f%%', \n    startangle=90, \n    colors=sns.color_palette(\"Set3\")\n)\nplt.title('SDS-Season')\n\n# SDS-SDS_Total_Raw\nplt.subplot(1, 3, 2)\nsns.histplot(train_vis['SDS-SDS_Total_Raw'].dropna(), bins=20, kde=True)\nplt.title('SDS-SDS_Total_Raw')\nplt.xlabel('Value')\n\n# SDS-SDS_Total_T\nplt.subplot(1, 3, 3)\nsns.histplot(train_vis['SDS-SDS_Total_T'].dropna(), bins=20, kde=True)\nplt.title('SDS-SDS_Total_T')\nplt.xlabel('Value')\n\nplt.tight_layout()\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-07T15:36:49.873733Z","iopub.execute_input":"2025-01-07T15:36:49.874453Z","iopub.status.idle":"2025-01-07T15:36:50.825895Z","shell.execute_reply.started":"2025-01-07T15:36:49.874405Z","shell.execute_reply":"2025-01-07T15:36:50.824841Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"calculate_stats(train, ['SDS-SDS_Total_Raw', 'SDS-SDS_Total_T'])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-07T15:36:50.827278Z","iopub.execute_input":"2025-01-07T15:36:50.827686Z","iopub.status.idle":"2025-01-07T15:36:50.849427Z","shell.execute_reply.started":"2025-01-07T15:36:50.827632Z","shell.execute_reply":"2025-01-07T15:36:50.848552Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"<div style=\"line-height:24px; font-size:16px;border-left: 5px solid silver; padding-left: 26px;\"> \n    💡 Note: \n    <ul style=\"list-style:circle\">\n<li>Cả SDS_SDS_Total_raw và SDS_SDS_Total_T cho rối loạn giấc ngủ đều có mức độ biến thiên vừa phải, với một số giá trị cực đoan cho thấy rối loạn giấc ngủ nghiêm trọng ở một nhóm nhỏ người tham gia.\n    </ul>\n</div>","metadata":{}},{"cell_type":"markdown","source":"# <p style=\"padding:15px; background-color:chocolate; font-family:arial; font-weight:bold; color:white; font-size:100%; letter-spacing: 2px; text-align:left; border-radius: 10px 10px\">5/ Predictive Features</p>","metadata":{}},{"cell_type":"markdown","source":" <div style=\"border-radius:12px; border:chocolate solid; padding: 15px; background-color: #f6f5f5; font-size:120%; text-align:left\">\n\n* **Thông tin nhân khẩu học (Demographics)** - Bao gồm thông tin về tuổi và giới tính của người tham gia.  \n* **Sử dụng Internet (Internet Use)** - Số giờ sử dụng máy tính/internet mỗi ngày.  \n* **Thang đánh giá tổng thể trẻ em (Children's Global Assessment Scale)** - Thang điểm số dùng để các chuyên gia sức khỏe tâm thần đánh giá chức năng chung của trẻ em dưới 18 tuổi.  \n* **Các chỉ số thể chất (Physical Measures)** - Bao gồm huyết áp, nhịp tim, chiều cao, cân nặng, số đo vòng eo và hông.  \n* **Chỉ số sức khỏe FitnessGram và máy chạy bộ (FitnessGram Vitals and Treadmill)** - Đánh giá sức khỏe tim mạch dựa trên giao thức máy chạy bộ NHANES.  \n* **Đánh giá FitnessGram cho trẻ em (FitnessGram Child)** - Đánh giá sức khỏe thể chất liên quan đến 5 yếu tố: sức bền aerobic, sức mạnh cơ bắp, sức bền cơ bắp, sự linh hoạt và thành phần cơ thể.  \n* **Phân tích trở kháng sinh học (Bio-electric Impedance Analysis)** - Đo lường các thành phần cơ thể chính như chỉ số BMI, lượng mỡ, cơ bắp và nước.  \n* **Bảng câu hỏi hoạt động thể chất (Physical Activity Questionnaire)** - Thông tin về mức độ tham gia các hoạt động thể chất mạnh trong 7 ngày qua của trẻ em.  \n* **Thang đo rối loạn giấc ngủ (Sleep Disturbance Scale)** - Dùng để phân loại các rối loạn giấc ngủ ở trẻ em.  \n* **Actigraphy** - Đo lường khách quan hoạt động thể chất trong môi trường tự nhiên thông qua một thiết bị theo dõi cấp nghiên cứu. Nhiều giá trị dường như liên quan đến một khoảng thời gian *sau* khi bài kiểm tra PCIAT được thực hiện. Xem thảo luận [tại đây](https://www.kaggle.com/competitions/child-mind-institute-problematic-internet-use/discussion/538082#3017157).  \n* **Mùa (Season)** - Với mỗi bộ đo lường, có một đặc điểm \"mùa\" cho biết mùa trong năm khi các phép đo được thực hiện. Đây là những đặc điểm phân loại dự đoán duy nhất trong tập dữ liệu và có thể dễ dàng tiền xử lý.  \n","metadata":{}},{"cell_type":"code","source":"train_cat_columns = train.select_dtypes(exclude = 'number').columns\n\nfor season in train_cat_columns:\n    train[season] = train[season].fillna(0)\n    train[season] = train[season].replace({'Spring':1, 'Summer':2, 'Fall':3, 'Winter':4})","metadata":{"execution":{"iopub.status.busy":"2025-01-07T15:36:50.850540Z","iopub.execute_input":"2025-01-07T15:36:50.850839Z","iopub.status.idle":"2025-01-07T15:36:50.891953Z","shell.execute_reply.started":"2025-01-07T15:36:50.850809Z","shell.execute_reply":"2025-01-07T15:36:50.890883Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_cat_columns = test.select_dtypes(exclude = 'number').columns\n\nfor season in test_cat_columns:\n    test[season] = test[season].fillna(0)\n    test[season] = test[season].replace({'Spring':1, 'Summer':2, 'Fall':3, 'Winter':4})","metadata":{"execution":{"iopub.status.busy":"2025-01-07T15:36:50.893462Z","iopub.execute_input":"2025-01-07T15:36:50.894154Z","iopub.status.idle":"2025-01-07T15:36:50.911909Z","shell.execute_reply.started":"2025-01-07T15:36:50.894106Z","shell.execute_reply":"2025-01-07T15:36:50.910836Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# <p style=\"padding:15px; background-color:chocolate; font-family:arial; font-weight:bold; color:white; font-size:100%; letter-spacing: 2px; text-align:left; border-radius: 10px 10px\">6/ PCIAT Features</p>","metadata":{}},{"cell_type":"markdown","source":"<div style=\"border-radius:12px; border:chocolate solid; padding: 15px; background-color: #f6f5f5; font-size:120%; text-align:left\">\n\n* Như đã đề cập, có 22 đặc trưng PCIAT. Bao gồm câu trả lời cho 20 câu hỏi (mỗi câu được chấm từ 0 đến 5), tổng điểm và \"mùa\"(season) khi bài kiểm tra được thực hiện.  \n* Mục tiêu `sii` được suy ra từ tổng điểm PCIAT như sau:  \n    - 0-30 cho `sii = 0`  \n    - 31-49 cho `sii = 1`  \n    - 50-79 cho `sii = 2`  \n    - 80-100 cho `sii = 3`.  \n* Chúng tôi minh họa điều này bằng cách đơn giản đếm các giá trị. Thông tin tương tự được xác nhận [tại đây](https://digitalwellnesslab.org/wp-content/uploads/Scoring-Overview.pdf).  \n* Chúng tôi loại bỏ tất cả các đặc trưng PCIAT khỏi tập dữ liệu, ngoại trừ đặc trưng Tổng điểm PCIAT (PCIAT Total), có thể được sử dụng làm mục tiêu hồi quy.  \n* Biểu đồ hộp (box plot) trực quan hóa Tổng điểm PCIAT cho thấy nhiều điểm số cao trông giống như ngoại lệ (outliers) - tuy nhiên, đây là danh mục quan trọng nhất của chúng tôi.  ","metadata":{}},{"cell_type":"code","source":"PCIAT_cols = [val for val in train.columns[train.columns.str.contains('PCIAT')]]\nprint('Number of PCIAT features = ' , len(PCIAT_cols))","metadata":{"execution":{"iopub.status.busy":"2025-01-07T15:36:50.913216Z","iopub.execute_input":"2025-01-07T15:36:50.913546Z","iopub.status.idle":"2025-01-07T15:36:50.924484Z","shell.execute_reply.started":"2025-01-07T15:36:50.913516Z","shell.execute_reply":"2025-01-07T15:36:50.923433Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"fig = px.scatter(train, x = 'PCIAT-PCIAT_Total', color = 'sii', marginal_x=\"box\", title = 'PCIAT Total')\nfig = fig.update_layout(yaxis_title=\"\")\nfig.update_yaxes(showticklabels=False)","metadata":{"execution":{"iopub.status.busy":"2025-01-07T15:36:50.925587Z","iopub.execute_input":"2025-01-07T15:36:50.925873Z","iopub.status.idle":"2025-01-07T15:36:52.613268Z","shell.execute_reply.started":"2025-01-07T15:36:50.925844Z","shell.execute_reply":"2025-01-07T15:36:52.612160Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(train[train['PCIAT-PCIAT_Total']<=30].sii.value_counts())\nprint(train[(train['PCIAT-PCIAT_Total']>30) \n    & (train['PCIAT-PCIAT_Total']<50)].sii.value_counts())\nprint(train[(train['PCIAT-PCIAT_Total']>=50) \n    & (train['PCIAT-PCIAT_Total']<80)].sii.value_counts())\nprint(train[train['PCIAT-PCIAT_Total']>=80].sii.value_counts())","metadata":{"execution":{"iopub.status.busy":"2025-01-07T15:36:52.614594Z","iopub.execute_input":"2025-01-07T15:36:52.614909Z","iopub.status.idle":"2025-01-07T15:36:52.632095Z","shell.execute_reply.started":"2025-01-07T15:36:52.614877Z","shell.execute_reply":"2025-01-07T15:36:52.630980Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train.sii.value_counts()","metadata":{"execution":{"iopub.status.busy":"2025-01-07T15:36:52.633701Z","iopub.execute_input":"2025-01-07T15:36:52.634097Z","iopub.status.idle":"2025-01-07T15:36:52.649795Z","shell.execute_reply.started":"2025-01-07T15:36:52.634052Z","shell.execute_reply":"2025-01-07T15:36:52.648807Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"PCIAT_cols.remove('PCIAT-PCIAT_Total')\ntrain = train.drop(columns = PCIAT_cols)","metadata":{"execution":{"iopub.status.busy":"2025-01-07T15:36:52.651494Z","iopub.execute_input":"2025-01-07T15:36:52.652238Z","iopub.status.idle":"2025-01-07T15:36:52.663192Z","shell.execute_reply.started":"2025-01-07T15:36:52.652189Z","shell.execute_reply":"2025-01-07T15:36:52.662092Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# <p style=\"padding:15px; background-color:chocolate; font-family:arial; font-weight:bold; color:white; font-size:100%; letter-spacing: 2px; text-align:left; border-radius: 10px 10px\">7/ Severity Impairment Index </p>","metadata":{}},{"cell_type":"markdown","source":" <div style=\"border-radius:12px; border:chocolate solid; padding: 15px; background-color: #f6f5f5; font-size:120%; text-align:left\">\n\n* Trong cuộc thi này, người ta đã đề cập đến việc sử dụng Internet quá mức ở trẻ em và thanh thiếu niên là vấn đề chính cần được đánh giá.\n* Một trong những điều khó hiểu về dữ liệu là, ngay cả đối với 34 trường hợp PIU 'nghiêm trọng' với sii = 3, chúng ta có thể thấy rằng 5 người tham gia được đánh giá là nghiêm trọng hầu như không sử dụng Internet.\n* Làm thế nào họ có thể đạt điểm cao như vậy trong bảng câu hỏi PCIAT? Có một cuộc thảo luận hữu ích [tại đây](https://www.kaggle.com/competitions/child-mind-institute-problematic-internet-use/discussion/535525#3003303).","metadata":{}},{"cell_type":"code","source":"sns.countplot(train, x = 'sii').set_title('Count of sii')","metadata":{"execution":{"iopub.status.busy":"2025-01-07T15:36:52.664555Z","iopub.execute_input":"2025-01-07T15:36:52.664868Z","iopub.status.idle":"2025-01-07T15:36:52.979179Z","shell.execute_reply.started":"2025-01-07T15:36:52.664838Z","shell.execute_reply":"2025-01-07T15:36:52.978144Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"vals = ['PIU = 0', 'PIU = 1','PIU = 2', 'PIU = 3']\n\nfor i in range(4):\n    plt.figure()\n    plot = sns.countplot(x = train[train.sii==i]['PreInt_EduHx-computerinternet_hoursday'])\n    plot.set_title(vals[i])","metadata":{"execution":{"iopub.status.busy":"2025-01-07T15:36:52.980627Z","iopub.execute_input":"2025-01-07T15:36:52.980931Z","iopub.status.idle":"2025-01-07T15:36:53.858032Z","shell.execute_reply.started":"2025-01-07T15:36:52.980901Z","shell.execute_reply":"2025-01-07T15:36:53.856967Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train = train.dropna(subset='sii')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-07T15:36:53.859313Z","iopub.execute_input":"2025-01-07T15:36:53.859695Z","iopub.status.idle":"2025-01-07T15:36:53.868696Z","shell.execute_reply.started":"2025-01-07T15:36:53.859662Z","shell.execute_reply":"2025-01-07T15:36:53.867704Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# <p style=\"padding:15px; background-color:chocolate; font-family:arial; font-weight:bold; color:white; font-size:100%; letter-spacing: 2px; text-align:left; border-radius: 10px 10px\">8/ Correlations </p>","metadata":{"execution":{"iopub.status.busy":"2024-09-28T11:36:45.957167Z","iopub.execute_input":"2024-09-28T11:36:45.958067Z","iopub.status.idle":"2024-09-28T11:36:45.963155Z","shell.execute_reply.started":"2024-09-28T11:36:45.958022Z","shell.execute_reply":"2024-09-28T11:36:45.961779Z"}}},{"cell_type":"markdown","source":" <div style=\"border-radius:12px; border:chocolate solid; padding: 15px; background-color: #f6f5f5; font-size:120%; text-align:left\">\n\n* Với số lượng lớn các tính năng để lựa chọn, tôi quyết định thực hiện một số lựa chọn tính năng và kiểm tra xem tác động của nó đối với mô hình.\n* Ở đây tôi chọn các tính năng có mối tương quan mạnh nhất với tổng PCIAT và loại bỏ những tính năng yếu hơn.\n* Đồng thời bỏ đi hai tính năng khác có vẻ gần giống với bản sao.","metadata":{}},{"cell_type":"code","source":"corr = pd.DataFrame(train.corr()['PCIAT-PCIAT_Total'].sort_values(ascending = False))\ncorr.style.background_gradient(cmap='YlOrRd')","metadata":{"execution":{"iopub.status.busy":"2025-01-07T15:36:53.869918Z","iopub.execute_input":"2025-01-07T15:36:53.870168Z","iopub.status.idle":"2025-01-07T15:36:53.916397Z","shell.execute_reply.started":"2025-01-07T15:36:53.870142Z","shell.execute_reply":"2025-01-07T15:36:53.915276Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"selection = corr[(corr['PCIAT-PCIAT_Total']>.1) | (corr['PCIAT-PCIAT_Total']<-.1)]\nselection = [val for val in selection.index]\nselection.remove('PCIAT-PCIAT_Total')\nselection.remove('sii')\nselection.remove('Physical-BMI')\nselection.remove('SDS-SDS_Total_Raw')","metadata":{"execution":{"iopub.status.busy":"2025-01-07T15:36:53.917833Z","iopub.execute_input":"2025-01-07T15:36:53.918252Z","iopub.status.idle":"2025-01-07T15:36:53.925397Z","shell.execute_reply.started":"2025-01-07T15:36:53.918207Z","shell.execute_reply":"2025-01-07T15:36:53.924303Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"selection","metadata":{"execution":{"iopub.status.busy":"2025-01-07T15:36:53.926571Z","iopub.execute_input":"2025-01-07T15:36:53.926862Z","iopub.status.idle":"2025-01-07T15:36:53.941968Z","shell.execute_reply.started":"2025-01-07T15:36:53.926833Z","shell.execute_reply":"2025-01-07T15:36:53.940858Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# <p style=\"padding:15px; background-color:chocolate; font-family:arial; font-weight:bold; color:white; font-size:100%; letter-spacing: 2px; text-align:left; border-radius: 10px 10px\">9/ Missing Values</p>","metadata":{}},{"cell_type":"markdown","source":" <div style=\"border-radius:12px; border:chocolate solid; padding: 15px; background-color: #f6f5f5; font-size:120%; text-align:left\">\n\n* Có một số lượng lớn các giá trị bị thiếu còn lại trong tập dữ liệu, với 46 cột bị thiếu giá trị và 8 cột thiếu hơn một nửa giá trị của chúng.\n* Ví dụ: hầu hết các giá trị đặc trưng về chu vi vòng eo đều bị thiếu\n* Hãy loại bỏ các cột mà thiếu hơn một nửa giá trị","metadata":{}},{"cell_type":"code","source":"null = train.isna().sum().sort_values(ascending = False).head(46)\nnull = pd.DataFrame(null)\nnull = null.rename(columns= {0:'Missing'})\nnull.style.background_gradient(cmap='YlOrRd')","metadata":{"execution":{"iopub.status.busy":"2025-01-07T15:36:53.943306Z","iopub.execute_input":"2025-01-07T15:36:53.943694Z","iopub.status.idle":"2025-01-07T15:36:53.964427Z","shell.execute_reply.started":"2025-01-07T15:36:53.943650Z","shell.execute_reply":"2025-01-07T15:36:53.963431Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"half_missing = [val for val in train.columns[train.isnull().sum()>len(train)/2]]\nhalf_missing","metadata":{"execution":{"iopub.status.busy":"2025-01-07T15:36:53.965480Z","iopub.execute_input":"2025-01-07T15:36:53.965757Z","iopub.status.idle":"2025-01-07T15:36:53.974245Z","shell.execute_reply.started":"2025-01-07T15:36:53.965728Z","shell.execute_reply":"2025-01-07T15:36:53.973273Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"selection = [i for i in selection if i not in half_missing]","metadata":{"execution":{"iopub.status.busy":"2025-01-07T15:36:53.975435Z","iopub.execute_input":"2025-01-07T15:36:53.975715Z","iopub.status.idle":"2025-01-07T15:36:53.989335Z","shell.execute_reply.started":"2025-01-07T15:36:53.975687Z","shell.execute_reply":"2025-01-07T15:36:53.988419Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# <p style=\"padding:15px; background-color:chocolate; font-family:arial; font-weight:bold; color:white; font-size:100%; letter-spacing: 2px; text-align:left; border-radius: 10px 10px\">10/ Selected Features</p>","metadata":{"execution":{"iopub.status.busy":"2024-10-05T13:56:59.196471Z","iopub.execute_input":"2024-10-05T13:56:59.196979Z","iopub.status.idle":"2024-10-05T13:56:59.20348Z","shell.execute_reply.started":"2024-10-05T13:56:59.196936Z","shell.execute_reply":"2024-10-05T13:56:59.202078Z"}}},{"cell_type":"markdown","source":" <div style=\"border-radius:12px; border:chocolate solid; padding: 15px; background-color: #f6f5f5; font-size:120%; text-align:left\">\n\n* Hiện tại chúng tôi có 16 features được chọn dựa trên a) mối tương quan với mục tiêu và b) tương đối ít giá trị bị thiếu.\n* Ý tưởng là tạo ra một mô hình mạnh mẽ tập trung vào các tín hiệu chính trong dữ liệu và giảm một số nhiễu dư thừa từ số lượng lớn các tính năng.\n* Một số giá trị tối thiểu và tối đa dường như là không thể (chẳng hạn như trọng số tối thiểu bằng 0) hoặc rất khó xảy ra.","metadata":{"execution":{"iopub.status.busy":"2024-10-05T13:59:54.552101Z","iopub.execute_input":"2024-10-05T13:59:54.552525Z","iopub.status.idle":"2024-10-05T13:59:54.560829Z","shell.execute_reply.started":"2024-10-05T13:59:54.552484Z","shell.execute_reply":"2024-10-05T13:59:54.559313Z"}}},{"cell_type":"code","source":"describe = train[selection].describe().T\ndescribe = describe[['min','max']].sort_index()\ndescribe.style.background_gradient(cmap='YlOrRd')","metadata":{"execution":{"iopub.status.busy":"2025-01-07T15:36:53.998293Z","iopub.execute_input":"2025-01-07T15:36:53.998642Z","iopub.status.idle":"2025-01-07T15:36:54.048912Z","shell.execute_reply.started":"2025-01-07T15:36:53.998611Z","shell.execute_reply":"2025-01-07T15:36:54.047703Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train[selection].hist(figsize=(10,10), grid = True, color = 'chocolate')\nplt.tight_layout()","metadata":{"execution":{"iopub.status.busy":"2025-01-07T15:36:54.050124Z","iopub.execute_input":"2025-01-07T15:36:54.050485Z","iopub.status.idle":"2025-01-07T15:36:58.729129Z","shell.execute_reply.started":"2025-01-07T15:36:54.050452Z","shell.execute_reply":"2025-01-07T15:36:58.728020Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# <p style=\"padding:15px; background-color:chocolate; font-family:arial; font-weight:bold; color:white; font-size:100%; letter-spacing: 2px; text-align:left; border-radius: 10px 10px\">11/ Regression Model</p>","metadata":{}},{"cell_type":"markdown","source":" <div style=\"border-radius:12px; border:chocolate solid; padding: 15px; background-color: #f6f5f5; font-size:120%; text-align:left\">\n\n* Trong phần này, tôi sẽ huấn luyện một mô hình hồi quy XGBoost như một tiêu chuẩn và sử dụng PCIAT-PCIAT_Total làm mục tiêu.\n* Chúng tôi điều chỉnh hàm kappa bậc hai để chuyển đổi điểm tổng PCIAT thành các loại sii, điều này mang lại kết quả cross-validation tốt hơn.","metadata":{"execution":{"iopub.status.busy":"2024-10-01T12:35:10.605389Z","iopub.execute_input":"2024-10-01T12:35:10.605904Z","iopub.status.idle":"2024-10-01T12:35:10.613456Z","shell.execute_reply.started":"2024-10-01T12:35:10.605858Z","shell.execute_reply":"2024-10-01T12:35:10.612056Z"}}},{"cell_type":"code","source":"X = train[selection]\ntest = test[selection]\ny = train['PCIAT-PCIAT_Total']","metadata":{"execution":{"iopub.status.busy":"2025-01-07T15:36:58.730383Z","iopub.execute_input":"2025-01-07T15:36:58.730691Z","iopub.status.idle":"2025-01-07T15:36:58.737947Z","shell.execute_reply.started":"2025-01-07T15:36:58.730657Z","shell.execute_reply":"2025-01-07T15:36:58.737058Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def convert(scores):\n    scores = np.array(scores)\n    bins = np.zeros_like(scores)\n    bins[scores <= 30] = 0\n    bins[(scores > 30) & (scores < 50)] = 1\n    bins[(scores >= 50) & (scores < 80)] = 2\n    bins[scores >= 80] = 3\n    return bins","metadata":{"execution":{"iopub.status.busy":"2025-01-07T15:36:58.739197Z","iopub.execute_input":"2025-01-07T15:36:58.739639Z","iopub.status.idle":"2025-01-07T15:36:58.757457Z","shell.execute_reply.started":"2025-01-07T15:36:58.739609Z","shell.execute_reply":"2025-01-07T15:36:58.756416Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def convert2(scores):\n    scores = np.array(scores)*1.252\n    bins = np.zeros_like(scores)\n    bins[scores <= 32] = 0\n    bins[(scores > 32) & (scores < 50)] = 1\n    bins[(scores >= 50) & (scores < 70)] = 2\n    bins[scores >= 70] = 3\n    return bins","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-07T15:36:58.758767Z","iopub.execute_input":"2025-01-07T15:36:58.759095Z","iopub.status.idle":"2025-01-07T15:36:58.769930Z","shell.execute_reply.started":"2025-01-07T15:36:58.759065Z","shell.execute_reply":"2025-01-07T15:36:58.768848Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def quadratic_kappa(y_true, y_pred):\n    y_true_cat = convert(y_true)\n    y_pred_cat = convert2(y_pred)\n    return cohen_kappa_score(y_true_cat, y_pred_cat, weights='quadratic')\n\nkappa_scorer = make_scorer(quadratic_kappa, greater_is_better=True)","metadata":{"execution":{"iopub.status.busy":"2025-01-07T15:36:58.771187Z","iopub.execute_input":"2025-01-07T15:36:58.771505Z","iopub.status.idle":"2025-01-07T15:36:58.783660Z","shell.execute_reply.started":"2025-01-07T15:36:58.771475Z","shell.execute_reply":"2025-01-07T15:36:58.782650Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"params = {'max_depth': 3, 'n_estimators': 59, 'learning_rate': 0.073, 'subsample': 0.59, 'colsample_bytree': 0.9}","metadata":{"execution":{"iopub.status.busy":"2025-01-07T15:36:58.784734Z","iopub.execute_input":"2025-01-07T15:36:58.785068Z","iopub.status.idle":"2025-01-07T15:36:58.802514Z","shell.execute_reply.started":"2025-01-07T15:36:58.785039Z","shell.execute_reply":"2025-01-07T15:36:58.801543Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"skf = StratifiedKFold(n_splits=10)\nmodel = xgb.XGBRegressor(**params)","metadata":{"execution":{"iopub.status.busy":"2025-01-07T15:36:58.803738Z","iopub.execute_input":"2025-01-07T15:36:58.804073Z","iopub.status.idle":"2025-01-07T15:36:58.814294Z","shell.execute_reply.started":"2025-01-07T15:36:58.804032Z","shell.execute_reply":"2025-01-07T15:36:58.813303Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"scores = cross_val_score(model, X, y, cv=skf, scoring=kappa_scorer)\nprint(\"QWK Scores:\", scores)\nprint(\"Mean QWK Score:\", np.mean(scores))","metadata":{"execution":{"iopub.status.busy":"2025-01-07T15:36:58.815746Z","iopub.execute_input":"2025-01-07T15:36:58.816020Z","iopub.status.idle":"2025-01-07T15:36:59.471626Z","shell.execute_reply.started":"2025-01-07T15:36:58.815988Z","shell.execute_reply":"2025-01-07T15:36:59.470742Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model.fit(X,y)\nfeature_imp = pd.Series(model.feature_importances_,index=X.columns).sort_values(ascending=False)\nfeature_imp","metadata":{"execution":{"iopub.status.busy":"2025-01-07T15:36:59.472512Z","iopub.execute_input":"2025-01-07T15:36:59.472801Z","iopub.status.idle":"2025-01-07T15:36:59.541472Z","shell.execute_reply.started":"2025-01-07T15:36:59.472771Z","shell.execute_reply":"2025-01-07T15:36:59.539871Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sns.barplot(x=feature_imp, y=feature_imp.index)\nplt.xlabel('Feature Importance Score')\nplt.title(\"Feature Importances\")\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2025-01-07T15:36:59.545201Z","iopub.execute_input":"2025-01-07T15:36:59.545535Z","iopub.status.idle":"2025-01-07T15:36:59.884592Z","shell.execute_reply.started":"2025-01-07T15:36:59.545503Z","shell.execute_reply":"2025-01-07T15:36:59.883406Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"perm = PermutationImportance(model, random_state=1).fit(X,y)\neli5.show_weights(perm, feature_names = X.columns.tolist())","metadata":{"execution":{"iopub.status.busy":"2025-01-07T15:36:59.885842Z","iopub.execute_input":"2025-01-07T15:36:59.886140Z","iopub.status.idle":"2025-01-07T15:37:00.831838Z","shell.execute_reply.started":"2025-01-07T15:36:59.886110Z","shell.execute_reply":"2025-01-07T15:37:00.830945Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# <p style=\"padding:15px; background-color:chocolate; font-family:arial; font-weight:bold; color:white; font-size:100%; letter-spacing: 2px; text-align:left; border-radius: 10px 10px\">12/ Submission</p>","metadata":{}},{"cell_type":"code","source":"model.fit(X,y)\npreds = model.predict(test)\npreds = convert2(preds) # convert raw scores to sii categories if using regressor\npreds = pd.Series(preds)\npreds.index = test.index\npreds.to_csv('submission.csv')\npreds","metadata":{"execution":{"iopub.status.busy":"2025-01-07T15:37:16.266303Z","iopub.execute_input":"2025-01-07T15:37:16.266717Z","iopub.status.idle":"2025-01-07T15:37:16.344808Z","shell.execute_reply.started":"2025-01-07T15:37:16.266674Z","shell.execute_reply":"2025-01-07T15:37:16.343085Z"},"trusted":true},"outputs":[],"execution_count":null}]}