{"metadata":{"kernelspec":{"display_name":"Python 3","name":"python3"},"language_info":{"name":"python"},"colab":{"provenance":[]},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":81933,"databundleVersionId":9643020,"sourceType":"competition"},{"sourceId":188535,"sourceType":"modelInstanceVersion","modelInstanceId":160731,"modelId":183125}],"dockerImageVersionId":30804,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import pandas as pd\n\ndata = pd.read_csv('/kaggle/input/child-mind-institute-problematic-internet-use/train.csv')\ndata.head()\n\n# Obtener información general del dataset\nprint(data.info())\n\n","metadata":{"id":"F77BFbQI4YQA","outputId":"ed3193e6-8870-4653-d4a4-7f2b9fb48b55","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:31:44.794764Z","iopub.execute_input":"2024-12-05T03:31:44.795171Z","iopub.status.idle":"2024-12-05T03:31:45.327166Z","shell.execute_reply.started":"2024-12-05T03:31:44.795134Z","shell.execute_reply":"2024-12-05T03:31:45.325834Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!pip install catboost\n","metadata":{"id":"Ilz7xrgnr7Zg","outputId":"70bc51b8-0c2e-4b45-e2f3-e1fd5bd69ee6","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:31:45.328981Z","iopub.execute_input":"2024-12-05T03:31:45.329322Z","iopub.status.idle":"2024-12-05T03:32:29.155834Z","shell.execute_reply.started":"2024-12-05T03:31:45.329289Z","shell.execute_reply":"2024-12-05T03:32:29.154315Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\nimport plotly.express as px\nimport plotly.subplots as sp\nimport seaborn as sns\nimport matplotlib.pyplot as plt\nfrom matplotlib.lines import Line2D\nimport plotly.graph_objects as go\nimport seaborn as sns\n\nfrom plotly.subplots import make_subplots\nimport math\n\nimport warnings\nwarnings.filterwarnings(\"ignore\")\n\nimport numpy as np\nfrom sklearn.model_selection import StratifiedKFold\nfrom sklearn.metrics import cohen_kappa_score, classification_report\nfrom sklearn.metrics import make_scorer, cohen_kappa_score\nfrom xgboost import XGBClassifier\nfrom sklearn.preprocessing import LabelEncoder\n\nfrom catboost import CatBoostClassifier\nfrom lightgbm import LGBMClassifier\nfrom sklearn.ensemble import VotingClassifier","metadata":{"id":"rUPRg8hpryF-","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:32:29.157479Z","iopub.execute_input":"2024-12-05T03:32:29.157979Z","iopub.status.idle":"2024-12-05T03:32:32.643746Z","shell.execute_reply.started":"2024-12-05T03:32:29.157931Z","shell.execute_reply":"2024-12-05T03:32:32.642187Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df = pd.read_csv('/kaggle/input/child-mind-institute-problematic-internet-use/train.csv')\ntest_df = pd.read_csv(\"/kaggle/input/child-mind-institute-problematic-internet-use/test.csv\")\ndata_dictionary = pd.read_csv('/kaggle/input/child-mind-institute-problematic-internet-use/data_dictionary.csv')","metadata":{"id":"lSSA76XsrybJ","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:32:32.646500Z","iopub.execute_input":"2024-12-05T03:32:32.647128Z","iopub.status.idle":"2024-12-05T03:32:32.721682Z","shell.execute_reply.started":"2024-12-05T03:32:32.647090Z","shell.execute_reply":"2024-12-05T03:32:32.720670Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#Ver la forma de la matriz\ntrain_df.shape","metadata":{"id":"D8Vx4vvesF-p","outputId":"5f5abc2b-3661-4f77-d305-3c3b874ff20f","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:32:32.722847Z","iopub.execute_input":"2024-12-05T03:32:32.723258Z","iopub.status.idle":"2024-12-05T03:32:32.731437Z","shell.execute_reply.started":"2024-12-05T03:32:32.723225Z","shell.execute_reply":"2024-12-05T03:32:32.730182Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#Ver información de las columnas\ntrain_df.columns","metadata":{"id":"4cLoRvYJsLpY","outputId":"e67f3202-6f53-49c9-e7eb-13e0b29f0874","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:32:32.732897Z","iopub.execute_input":"2024-12-05T03:32:32.733331Z","iopub.status.idle":"2024-12-05T03:32:32.745128Z","shell.execute_reply.started":"2024-12-05T03:32:32.733282Z","shell.execute_reply":"2024-12-05T03:32:32.743988Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#Ver los primeros valores y estructura de los archivos\ndata_dictionary.head()","metadata":{"id":"Gud69N80sN4R","outputId":"9f310fa2-3c96-49dd-cbec-b81aadffe6c6","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:32:32.746502Z","iopub.execute_input":"2024-12-05T03:32:32.746975Z","iopub.status.idle":"2024-12-05T03:32:32.769880Z","shell.execute_reply.started":"2024-12-05T03:32:32.746929Z","shell.execute_reply":"2024-12-05T03:32:32.768602Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"list(data_dictionary['Type'].unique())","metadata":{"id":"5VHylQbZsaLi","outputId":"b4373f5a-9288-4f14-f88c-08e0405639f5","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:32:32.771284Z","iopub.execute_input":"2024-12-05T03:32:32.771630Z","iopub.status.idle":"2024-12-05T03:32:32.779269Z","shell.execute_reply.started":"2024-12-05T03:32:32.771598Z","shell.execute_reply":"2024-12-05T03:32:32.778061Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"data_dictionary[\ndata_dictionary['Type'].str.contains('categorical')\n]","metadata":{"id":"wCz1OfcGKa3F","outputId":"e0ce0cc5-bfb3-4f94-898e-a1b53076fa23","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:32:32.780669Z","iopub.execute_input":"2024-12-05T03:32:32.781129Z","iopub.status.idle":"2024-12-05T03:32:32.806735Z","shell.execute_reply.started":"2024-12-05T03:32:32.781083Z","shell.execute_reply":"2024-12-05T03:32:32.805389Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"data_dictionary[\ndata_dictionary['Type'].str.contains('categorical')\n].shape[0]   #cantidad de características categóricas","metadata":{"id":"JK8FPEBosp1K","outputId":"ea8fbcc7-e620-4a42-ce10-7ad00feafe21","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:32:32.810091Z","iopub.execute_input":"2024-12-05T03:32:32.810531Z","iopub.status.idle":"2024-12-05T03:32:32.824089Z","shell.execute_reply.started":"2024-12-05T03:32:32.810481Z","shell.execute_reply":"2024-12-05T03:32:32.823036Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"data_dictionary[\ndata_dictionary['Type'].str.contains('str')\n]","metadata":{"id":"pq1eASBgKgcG","outputId":"2fcff717-a4de-4605-e47f-53ea8b24d92f","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:32:32.825541Z","iopub.execute_input":"2024-12-05T03:32:32.825998Z","iopub.status.idle":"2024-12-05T03:32:32.847429Z","shell.execute_reply.started":"2024-12-05T03:32:32.825942Z","shell.execute_reply":"2024-12-05T03:32:32.846319Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"data_dictionary[\ndata_dictionary['Type'].str.contains('str')\n].shape[0] #cantidad de características de strings\n\n","metadata":{"id":"WN1Uvet8ssEA","outputId":"cd3ad98d-eff0-4566-8288-e2b12f5f6908","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:32:32.848894Z","iopub.execute_input":"2024-12-05T03:32:32.849282Z","iopub.status.idle":"2024-12-05T03:32:32.861044Z","shell.execute_reply.started":"2024-12-05T03:32:32.849249Z","shell.execute_reply":"2024-12-05T03:32:32.859893Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"data_dictionary[\ndata_dictionary['Type'].str.contains('float')\n].shape[0]   # Cantidad de características de flotantes","metadata":{"id":"xpSxUEpCtKCQ","outputId":"188f3678-5f64-4638-eb8b-75ddb99974af","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:32:32.862340Z","iopub.execute_input":"2024-12-05T03:32:32.862848Z","iopub.status.idle":"2024-12-05T03:32:32.878779Z","shell.execute_reply.started":"2024-12-05T03:32:32.862813Z","shell.execute_reply":"2024-12-05T03:32:32.877624Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"data_dictionary[\ndata_dictionary['Type'].str.contains('int') & ~data_dictionary['Type'].str.contains('categorical')\n] #Ver filas del tipo entero , donde no son categoricas","metadata":{"id":"GwbLLtOAtQ3Y","outputId":"cdc04c74-c56f-468e-ad35-a0bebcca2015","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:32:32.880618Z","iopub.execute_input":"2024-12-05T03:32:32.881081Z","iopub.status.idle":"2024-12-05T03:32:32.902443Z","shell.execute_reply.started":"2024-12-05T03:32:32.881033Z","shell.execute_reply":"2024-12-05T03:32:32.901254Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(data_dictionary[\ndata_dictionary['Field'].str.contains('PreInt_EduHx-computerinternet_hoursday')\n][\"Value Labels\"].iloc[0])   #Ordenar y ver los valores de uso diaro del internet","metadata":{"id":"SxBwTtdftUZY","outputId":"43bea087-2c51-4079-ae32-49b6690a8904","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:32:32.904024Z","iopub.execute_input":"2024-12-05T03:32:32.904462Z","iopub.status.idle":"2024-12-05T03:32:32.927328Z","shell.execute_reply.started":"2024-12-05T03:32:32.904409Z","shell.execute_reply":"2024-12-05T03:32:32.926099Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Definir el mapeo para los niveles de `sii`, incluyendo \"Missing\" para valores NaN\nsii_map = {\n    0: \"None\",                # Ningún problema\n    1: \"Mild\",                # Problema leve\n    2: \"Moderate\",            # Problema moderado\n    3: \"Severe\",              # Problema severo\n    \"missing\": \"Missing Data\" # Datos faltantes\n}\n\n# Reemplazar valores NaN por \"missing\" para contarlos como una categoría separada\ntrain_df['sii_filled'] = train_df['sii'].fillna(\"missing\")\ntrain_df['sii_label'] = train_df['sii_filled'].map(sii_map)\n\n# Contar las ocurrencias de cada nivel de `sii`, incluyendo datos faltantes\nsii_counts = train_df['sii_label'].value_counts()\nsii_percentages = (sii_counts / sii_counts.sum()) * 100\n\n# Crear un DataFrame para graficar, con los conteos y porcentajes; asegurando que \"Missing Data\" esté al final\nsii_data = pd.DataFrame({\n    'SII Level': sii_counts.index,    # Niveles de severidad del uso problemático\n    'Count': sii_counts.values,      # Conteo de participantes por nivel\n    'Percentage': sii_percentages.values # Porcentaje de participantes por nivel\n})\n\n# Reordenar para asegurar que \"Missing Data\" esté al final\nsii_data['SII Level'] = pd.Categorical(\n    sii_data['SII Level'],\n    categories=[\"None\", \"Mild\", \"Moderate\", \"Severe\", \"Missing Data\"], # Orden personalizado\n    ordered=True\n)\nsii_data = sii_data.sort_values('SII Level')\n\n# Definir colores personalizados según los niveles de severidad\ncolors = {\n    \"None\": \"#74C2E1\",        # Azul suave\n    \"Mild\": \"#1F77B4\",        # Azul estándar\n    \"Moderate\": \"#FF7F0E\",    # Naranja\n    \"Severe\": \"#D62728\",      # Rojo oscuro\n    \"Missing Data\": \"#7F7F7F\" # Gris\n}\n\n# Crear el gráfico en Plotly y aplicar los colores basados en los niveles de SII\nfig = px.bar(\n    sii_data,\n    x='SII Level',            # Eje X: Niveles de severidad\n    y='Count',                # Eje Y: Conteo de participantes\n    text='Count',             # Mostrar los conteos en las barras\n    title=\"Distribución de la variable objetivo SII\", # Título del gráfico\n    labels={'Count': 'Participantes', 'SII Level': 'Nivel de Severidad'}, # Etiquetas de los ejes\n    hover_data={'Percentage': ':.2f'} # Mostrar porcentaje en el hover\n)\n\n# Aplicar colores personalizados a cada barra según el nivel de SII\nfig.update_traces(\n    marker=dict(color=[colors[level] for level in sii_data['SII Level']]),\n    texttemplate='%{text:,}', # Formato de texto con separadores de miles\n    textposition='outside'    # Mostrar los valores fuera de las barras\n)\n\n# Personalizar el diseño para una mejor visualización\nfig.update_layout(\n    title_font=dict(size=22, color=\"#333333\"), # Fuente del título\n    title_x=0.5,                               # Centrar el título\n    plot_bgcolor='rgba(0,0,0,0)',              # Fondo transparente\n    xaxis=dict(\n        showgrid=False,                        # No mostrar la cuadrícula en el eje X\n        showline=True,                         # Mostrar la línea del eje X\n        linecolor='lightgray',                 # Color de la línea\n        tickfont=dict(size=14),                # Fuente de las etiquetas del eje X\n        title_font=dict(size=16)               # Fuente del título del eje X\n    ),\n    yaxis=dict(\n        showgrid=True,                         # Mostrar cuadrícula en el eje Y\n        gridcolor='lightgray',                 # Color de la cuadrícula\n        zeroline=False,                        # No mostrar la línea de cero\n        tickfont=dict(size=14),                # Fuente de las etiquetas del eje Y\n        title_font=dict(size=16)               # Fuente del título del eje Y\n    ),\n    margin=dict(t=80, l=50, r=50, b=60)        # Márgenes del gráfico\n)\n\n# Agregar anotaciones de porcentaje a cada barra\nfor i, row in sii_data.iterrows():\n    fig.add_annotation(\n        x=row['SII Level'],                   # Posición en el eje X\n        y=row['Count'],                       # Posición en el eje Y\n        text=f\"{row['Percentage']:.1f}%\",     # Texto del porcentaje\n        showarrow=False,                      # Sin flechas\n        font=dict(size=12, color=\"black\"),    # Fuente de las anotaciones\n        yshift=10                             # Ajustar posición sobre las barras\n    )\n\n# Mostrar el gráfico\nfig.show()   #Matplot boooooy\n\n","metadata":{"id":"fBpqalQFtwtw","outputId":"4e63ec4a-e555-4b5a-eb18-f18f1de24b9b","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:32:32.929387Z","iopub.execute_input":"2024-12-05T03:32:32.929791Z","iopub.status.idle":"2024-12-05T03:32:35.036338Z","shell.execute_reply.started":"2024-12-05T03:32:32.929757Z","shell.execute_reply":"2024-12-05T03:32:35.035275Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Crear la figura y los ejes\nfig, ax = plt.subplots(figsize=(10, 6))\n\n# Graficar el histograma normalizado como densidad\nsns.histplot(\n    train_df[\"PCIAT-PCIAT_Total\"].dropna(),\n    bins=50,\n    kde=False,\n    stat=\"density\",  # Normalizar a densidad\n    alpha=0.7,\n    color=\"blue\",\n    ax=ax,\n    label=\"Histogram\"\n)\n\n# Añadir línea de densidad (KDE)\nsns.kdeplot(\n    train_df[\"PCIAT-PCIAT_Total\"].dropna(),\n    color=\"red\",\n    linewidth=2,\n    ax=ax,\n    label=\"KDE\"\n)\n\n# Ajustar el diseño del gráfico\nax.set_title(\"Density Plot of PCIAT-PCIAT_Total\", fontsize=16, color=\"#004080\")\nax.set_xlabel(\"PCIAT-PCIAT_Total Score\", fontsize=12)\nax.set_ylabel(\"Density\", fontsize=12)\nax.grid(False)  # Quitar cuadrícula\nax.legend()\n\n# Mostrar el gráfico\nplt.tight_layout()\nplt.show()\n\n# Crear el gráfico marginal de violín\nplt.figure(figsize=(10, 2))\nsns.violinplot(\n    x=train_df[\"PCIAT-PCIAT_Total\"].dropna(),\n    inner=None,  # Sin detalles internos para violín\n    color=\"lightblue\"\n)\nplt.title(\"Violin Plot of PCIAT-PCIAT_Total\", fontsize=16, color=\"#004080\")\nplt.xlabel(\"PCIAT-PCIAT_Total Score\", fontsize=12)\nplt.tight_layout()\nplt.show()","metadata":{"id":"YLRMazT6uZ9o","outputId":"70f0b83a-3671-48db-d8fc-8fc9dc058ee3","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:32:35.037872Z","iopub.execute_input":"2024-12-05T03:32:35.038252Z","iopub.status.idle":"2024-12-05T03:32:35.844670Z","shell.execute_reply.started":"2024-12-05T03:32:35.038218Z","shell.execute_reply":"2024-12-05T03:32:35.843719Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"plt.figure(figsize=(10, 6))\n\n# Línea KDE\nsns.kdeplot(\n    data=train_df,\n    x=\"PCIAT-PCIAT_Total\",\n    fill=True,\n    color=\"#4B9CD3\",\n    linewidth=2\n)\n\n# Líneas de referencia\nmean_value = train_df[\"PCIAT-PCIAT_Total\"].mean()\nplt.axvline(mean_value, color=\"red\", linestyle=\"--\", label=f\"Mean: {mean_value:.2f}\")\n\n# Personalización\nplt.title(\"Density Plot of PCIAT-PCIAT_Total with Mean\", fontsize=20, color=\"#004080\")\nplt.xlabel(\"PCIAT-PCIAT_Total Score\", fontsize=14)\nplt.ylabel(\"Density\", fontsize=14)\nplt.legend()\nplt.tight_layout()\n\nplt.show()\n","metadata":{"id":"LoL-Qnw-wmOH","outputId":"193f0889-5823-4328-a672-e9091b3316be","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:32:35.845930Z","iopub.execute_input":"2024-12-05T03:32:35.846383Z","iopub.status.idle":"2024-12-05T03:32:36.369500Z","shell.execute_reply.started":"2024-12-05T03:32:35.846336Z","shell.execute_reply":"2024-12-05T03:32:36.368019Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Distribución por Genero\n","metadata":{"id":"XexJGAGaxV3J"}},{"cell_type":"code","source":"train_df['Basic_Demos-Sex'].value_counts(dropna=False, normalize=True)\n#0 : Masculino y 1: Femenino","metadata":{"id":"O2YuKj8yw2aH","outputId":"daf66178-ff1a-49f0-b9fc-4737cfab650f","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:32:36.371589Z","iopub.execute_input":"2024-12-05T03:32:36.372668Z","iopub.status.idle":"2024-12-05T03:32:36.383980Z","shell.execute_reply.started":"2024-12-05T03:32:36.372613Z","shell.execute_reply":"2024-12-05T03:32:36.382791Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#Mapeo de los generos , sexoooooooooooooooooooooooooooooo\nsex_map = {\n    0: \"Male\",\n    1: \"Female\"}\n#Generas una nueva columa para la visualizacion\ntrain_df['Sex'] = train_df['Basic_Demos-Sex'].map(sex_map)\n\nsex_counts = train_df['Sex'].value_counts().sort_index()\nsex_percentages = (sex_counts / sex_counts.sum()) * 100\n#Un dataframe para visualizarlo\nsex_data = pd.DataFrame({\n    'Sex': sex_counts.index,\n    'Count': sex_counts.values,\n    'Percentage': sex_percentages.values\n})\n\n# Crear el gráfico de barras\nplt.figure(figsize=(8, 5))\nplt.bar(\n    sex_data['Sex'],\n    sex_data['Count'],\n    color=['#4B9CD3', '#FF7F0E'],  # Colores para cada barra (Male, Female)\n    alpha=0.8\n)\n\n# Añadir etiquetas y título\nfor i, count in enumerate(sex_data['Count']):\n    plt.text(i, count + 2, f\"{count} ({sex_data['Percentage'].iloc[i]:.1f}%)\", ha='center', fontsize=12)\n\nplt.title(\"Distribution of Participants by Sex\", fontsize=16, color=\"#004080\")\nplt.xlabel(\"Sex\", fontsize=14)\nplt.ylabel(\"Count\", fontsize=14)\nplt.xticks(fontsize=12)\nplt.yticks(fontsize=12)\nplt.tight_layout()\n\n# Mostrar el gráfico\nplt.show()","metadata":{"id":"BpawSfVrxlQ-","outputId":"2721b631-281c-4c5c-f86b-0cca188736a3","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:32:36.385413Z","iopub.execute_input":"2024-12-05T03:32:36.385818Z","iopub.status.idle":"2024-12-05T03:32:36.574617Z","shell.execute_reply.started":"2024-12-05T03:32:36.385778Z","shell.execute_reply":"2024-12-05T03:32:36.573477Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# **Habitos de los hijos comentados por sus padres**","metadata":{"id":"Koz3Kuyj0BeJ"}},{"cell_type":"code","source":"# Extraer columnas que coincidan con \"PCIAT-PCIAT_\" seguido de un número (excluyendo \"PCIAT-PCIAT_Total\")\npciat_columns = [col for col in train_df.columns if col.startswith('PCIAT-PCIAT_') and col != 'PCIAT-PCIAT_Total']\n\n# Verificar valores NaN en cada una de estas columnas\nnan_counts = train_df[pciat_columns].isna().sum()\n\n# Filtrar para mostrar solo columnas con valores faltantes\nmissing_values = nan_counts[nan_counts > 0]\n\n# Mostrar los resultados\nprint(\"Columnas con valores NaN en los campos PCIAT-PCIAT_:\")\nprint(missing_values) # Un vergo\n","metadata":{"id":"6JHN9UHjyi9W","outputId":"321dc71a-5ba8-450d-fd4b-4a82d6141a54","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:32:36.575861Z","iopub.execute_input":"2024-12-05T03:32:36.576290Z","iopub.status.idle":"2024-12-05T03:32:36.586497Z","shell.execute_reply.started":"2024-12-05T03:32:36.576242Z","shell.execute_reply":"2024-12-05T03:32:36.585574Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Verificar valores únicos en cada columna PCIAT\nfor col in pciat_columns:\n    print(f\"{col}: {train_df[col].unique()}\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:36:56.410898Z","iopub.execute_input":"2024-12-05T03:36:56.411368Z","iopub.status.idle":"2024-12-05T03:36:56.429425Z","shell.execute_reply.started":"2024-12-05T03:36:56.411331Z","shell.execute_reply":"2024-12-05T03:36:56.427890Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Filter for PCIAT-related fields in the data dictionary\npciat_dict_df = data_dictionary[data_dictionary['Field'].str.startswith('PCIAT-PCIAT_')]\n\n# Create the map from field names to short descriptions\npciat_question_map = dict(zip(pciat_dict_df['Field'], pciat_dict_df['Description']))\n\n\n# Define the explanation for each response category, including \"Missing\" at the beginning\nscale_explanation = {\n    \"missing\": \"Missing\",\n    0: \"Does Not Apply\",\n    1: \"Rarely\",\n    2: \"Occasionally\",\n    3: \"Frequently\",\n    4: \"Often\",\n    5: \"Always\"\n}\n\n# Define a function to insert line breaks based on character limit\ndef wrap_text(text, char_limit=25, padding_lines=0):\n    words = text.split()\n    wrapped_text = \"\"\n    line = \"\"\n    for word in words:\n        if len(line) + len(word) + 1 > char_limit:\n            wrapped_text += line + \"<br>\"\n            line = word\n        else:\n            line += (\" \" if line else \"\") + word\n    wrapped_text += line\n    # Add extra line breaks for padding\n    wrapped_text += \"<br>\" * padding_lines\n    return wrapped_text\n\n# Wrap long titles to fit within specified width and add padding\nsubplot_titles = [wrap_text(pciat_question_map[col], char_limit=25, padding_lines=0) for col in pciat_columns]\n\n# Set the number of columns to 2 for better readability\nnum_cols = 2\nnum_rows = (len(pciat_columns) + num_cols - 1) // num_cols  # Calculate rows needed\n\n# Colors based on the Child Mind Institute logo\nbar_color = \"#0082c8\"  # Blue color for bars\nmissing_color = \"#A9A9A9\"  # Gray color for \"Missing\" category\ntitle_color = \"#004080\"  # Darker blue shade for titles\n\n# Create subplot grid with wrapped titles and minimal spacing\nfig = sp.make_subplots(rows=num_rows, cols=num_cols, subplot_titles=subplot_titles)\n\n# Add a bar plot for each PCIAT question\nfor i, col in enumerate(pciat_columns):\n    row = i // num_cols + 1\n    col_pos = i % num_cols + 1\n\n    # Count the responses, including NaN as \"Missing\"\n    response_counts = train_df[col].value_counts().sort_index()\n    missing_count = train_df[col].isna().sum()\n\n    # Create a DataFrame for plotting with the missing count added at the start\n    response_data = pd.DataFrame({\n        'Response': ['Missing'] + response_counts.index.map(scale_explanation).tolist(),\n        'Count': [missing_count] + response_counts.values.tolist()\n    })\n    response_data['Percentage'] = (response_data['Count'] / response_data['Count'].sum()) * 100\n\n    # Create a bar plot for the current question with percentages in the hover\n    bar_fig = px.bar(response_data, x='Response', y='Count',\n                     labels={'Count': 'Frequency', 'Response': 'Response'},\n                     hover_data={'Percentage': ':.2f'},\n                     title=pciat_question_map[col])\n\n    # Customize each bar plot's appearance, setting a different color for \"Missing\"\n    colors = [missing_color if x == \"Missing\" else bar_color for x in response_data['Response']]\n    bar_fig.update_traces(marker_color=colors)  # Apply custom colors\n    bar_fig.update_layout(\n        showlegend=False,  # Hide legend\n        xaxis=dict(showgrid=False, showline=False, zeroline=False, tickfont=dict(size=10, color=title_color)),  # Smaller x-axis labels with blue color\n        yaxis=dict(showgrid=False, showline=False, zeroline=False, tickfont=dict(size=10))  # Remove y-axis grid and lines\n    )\n\n    # Add the bar plot to the grid\n    for trace in bar_fig.data:\n        fig.add_trace(trace, row=row, col=col_pos)\n\n# Update layout for readability, spacing, and background color\nfig.update_layout(\n    height=300 * num_rows,  # Set a fixed height per row\n    width=1000,  # Increase width slightly to give more space\n    title_text=\"Distribution of Responses for Parent-Child Internet Addiction Test Questions\",\n    title_font=dict(size=20, color=title_color),  # Set main title font size\n    margin=dict(t=140, l=50, r=50, b=100),  # Increase top margin\n    plot_bgcolor='white',\n    paper_bgcolor='white'\n)\n\n# Rotate x-axis labels slightly\nfig.update_xaxes(tickangle=15)\nfig.update_yaxes(tickfont=dict(size=10))\n\n# Set font size for subplot titles\nfig.update_annotations(font=dict(size=12, color=title_color))  # Adjust subplot title font size and color\n\nfig.show()\n","metadata":{"id":"Z2aubaDm0lFW","outputId":"dadad5cf-b4b3-4692-946b-39c8ef20f484","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:38:48.837760Z","iopub.execute_input":"2024-12-05T03:38:48.838331Z","iopub.status.idle":"2024-12-05T03:38:50.133164Z","shell.execute_reply.started":"2024-12-05T03:38:48.838280Z","shell.execute_reply":"2024-12-05T03:38:50.131890Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Uso diaro de Internet\n","metadata":{"id":"IkzdiOJk1ivP"}},{"cell_type":"code","source":"train_df[\"PreInt_EduHx-computerinternet_hoursday\"].value_counts(dropna=False, normalize=True)","metadata":{"id":"oo7WHe2g1m-X","outputId":"42898cc1-e6ec-48ad-8466-7f1f884058d9","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:39:09.034512Z","iopub.execute_input":"2024-12-05T03:39:09.034959Z","iopub.status.idle":"2024-12-05T03:39:09.045251Z","shell.execute_reply.started":"2024-12-05T03:39:09.034922Z","shell.execute_reply":"2024-12-05T03:39:09.043975Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\n\n# Mapeo de categorías para las horas de uso de internet por día\ninternet_hours_map = {\n    0: \"Less than 1h/day\",\n    1: \"Around 1h/day\",\n    2: \"Around 2hs/day\",\n    3: \"More than 3hs/day\",\n    \"missing\": \"Missing Data\"\n}\n\n# Reemplazar valores NaN por \"Missing Data\" para contarlos como una categoría separada\ntrain_df['Internet_Use_Hours'] = train_df['PreInt_EduHx-computerinternet_hoursday'].map(\n    lambda x: internet_hours_map.get(x, \"Missing Data\")\n)\n\n# Convertir 'Internet_Use_Hours' a tipo categórico con un orden específico\ncategory_order = list(internet_hours_map.values())\ntrain_df['Internet_Use_Hours'] = pd.Categorical(train_df['Internet_Use_Hours'], categories=category_order, ordered=True)\n\n# Contar ocurrencias de cada categoría (incluyendo \"Missing Data\") y calcular porcentajes\ninternet_use_counts = train_df['Internet_Use_Hours'].value_counts(sort=False)\ninternet_use_percentages = (internet_use_counts / internet_use_counts.sum()) * 100\n\n# Crear un DataFrame para graficar\ninternet_use_data = pd.DataFrame({\n    'Hours per Day': internet_use_counts.index,\n    'Count': internet_use_counts.values,\n    'Percentage': internet_use_percentages.values\n})\n\n# Definir colores personalizados (gris para \"Missing Data\", azul para las demás categorías)\ncolors = [\"#A9A9A9\" if category == \"Missing Data\" else \"#4B9CD3\" for category in internet_use_data['Hours per Day']]\n\n# Crear la figura y la gráfica de barras\nplt.figure(figsize=(10, 6))\nbars = plt.bar(internet_use_data['Hours per Day'], internet_use_data['Count'], color=colors, edgecolor='black')\n\n# Añadir etiquetas de porcentaje sobre cada barra\nfor bar, percentage in zip(bars, internet_use_data['Percentage']):\n    plt.text(\n        bar.get_x() + bar.get_width() / 2,\n        bar.get_height(),\n        f'{percentage:.2f}%',\n        ha='center',\n        va='bottom',\n        fontsize=10\n    )\n\n# Configurar el diseño y las etiquetas\nplt.title(\"Daily Internet Usage Distribution Among Youth\", fontsize=16, color=\"#004080\", pad=20)\nplt.xlabel(\"Daily Internet Usage\", fontsize=12)\nplt.ylabel(\"Number of Respondents\", fontsize=12)\nplt.xticks(rotation=15, fontsize=10)\nplt.yticks(fontsize=10)\nplt.grid(axis='y', linestyle='--', alpha=0.7)\nplt.gca().set_facecolor('white')\n\n# Ajustar el diseño general\nplt.tight_layout()\nplt.show()\n","metadata":{"id":"XzFY6ikt1pgN","outputId":"82496c23-061b-4b77-be60-576ce3a2225d","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:39:09.216616Z","iopub.execute_input":"2024-12-05T03:39:09.217040Z","iopub.status.idle":"2024-12-05T03:39:09.617994Z","shell.execute_reply.started":"2024-12-05T03:39:09.217000Z","shell.execute_reply":"2024-12-05T03:39:09.616632Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"#Análisis de métricas de fitness y composición corporal","metadata":{"id":"o9OLSlze1slw"}},{"cell_type":"code","source":"\n\n# Mapeo de categorías para cada campo\nfitness_bio_categories = {\n    'FGC-FGC_CU_Zone': {0: \"Needs Improvement\", 1: \"Healthy Fitness Zone\"},\n    'FGC-FGC_GSND_Zone': {1: \"Weak\", 2: \"Normal\", 3: \"Strong\"},\n    'FGC-FGC_GSD_Zone': {1: \"Weak\", 2: \"Normal\", 3: \"Strong\"},\n    'FGC-FGC_PU_Zone': {0: \"Needs Improvement\", 1: \"Healthy Fitness Zone\"},\n    'FGC-FGC_SRL_Zone': {0: \"Needs Improvement\", 1: \"Healthy Fitness Zone\"},\n    'FGC-FGC_SRR_Zone': {0: \"Needs Improvement\", 1: \"Healthy Fitness Zone\"},\n    'FGC-FGC_TL_Zone': {0: \"Needs Improvement\", 1: \"Healthy Fitness Zone\"},\n    'BIA-BIA_Activity_Level_num': {1: \"Very Light\", 2: \"Light\", 3: \"Moderate\", 4: \"Heavy\", 5: \"Very Heavy\"},\n    'BIA-BIA_Frame_num': {1: \"Small\", 2: \"Medium\", 3: \"Large\"}\n}\n\n# Títulos para cada campo\nfitness_bio_titles = {\n    'FGC-FGC_CU_Zone': \"Curl up fitness zone\",\n    'FGC-FGC_GSND_Zone': \"Grip Strength fitness zone (non-dominant)\",\n    'FGC-FGC_GSD_Zone': \"Grip Strength fitness zone (dominant)\",\n    'FGC-FGC_PU_Zone': \"Push-up fitness zone\",\n    'FGC-FGC_SRL_Zone': \"Sit & Reach fitness zone (left side)\",\n    'FGC-FGC_SRR_Zone': \"Sit & Reach fitness zone (right side)\",\n    'FGC-FGC_TL_Zone': \"Trunk lift fitness zone\",\n    'BIA-BIA_Activity_Level_num': \"Activity Level\",\n    'BIA-BIA_Frame_num': \"Body Frame\"\n}\n\n# Configuración de la cuadrícula de subplots\nnum_cols = 2\nnum_rows = (len(fitness_bio_categories) + num_cols - 1) // num_cols  # Calcular número de filas\nfig, axes = plt.subplots(num_rows, num_cols, figsize=(12, 4 * num_rows))\naxes = axes.flatten()  # Aplanar los ejes para iterar fácilmente\n\n# Colores\nbar_color = \"#4B9CD3\"  # Azul para las categorías\nmissing_color = \"#A9A9A9\"  # Gris para valores faltantes\n\n# Generar gráficos de barras\nfor i, (col, categories) in enumerate(fitness_bio_categories.items()):\n    ax = axes[i]\n\n    # Contar las respuestas, incluyendo NaN como \"Missing\"\n    response_counts = train_df[col].value_counts(dropna=False).sort_index()\n\n    # Crear DataFrame con las categorías mapeadas y porcentajes\n    response_data = pd.DataFrame({\n        'Response': response_counts.index.map(lambda x: \"Missing\" if pd.isna(x) else categories.get(x, str(x))),\n        'Count': response_counts.values\n    })\n    response_data['Percentage'] = (response_data['Count'] / response_data['Count'].sum()) * 100\n\n    # Ordenar categorías con \"Missing\" primero\n    category_order = [\"Missing\"] + list(categories.values())\n    response_data['Response'] = pd.Categorical(response_data['Response'], categories=category_order, ordered=True)\n    response_data = response_data.sort_values('Response')\n\n    # Crear la barra\n    colors = [missing_color if resp == \"Missing\" else bar_color for resp in response_data['Response']]\n    bars = ax.bar(response_data['Response'], response_data['Count'], color=colors, edgecolor='black')\n\n    # Añadir etiquetas de porcentaje sobre las barras\n    for bar, percentage in zip(bars, response_data['Percentage']):\n        ax.text(\n            bar.get_x() + bar.get_width() / 2,\n            bar.get_height(),\n            f'{percentage:.1f}%',\n            ha='center',\n            va='bottom',\n            fontsize=8\n        )\n\n    # Configurar título y ejes\n    ax.set_title(fitness_bio_titles[col], fontsize=12, color=\"#004080\")\n    ax.set_xlabel(\"Response\", fontsize=10)\n    ax.set_ylabel(\"Frequency\", fontsize=10)\n    ax.tick_params(axis='x', rotation=15, labelsize=8)\n    ax.tick_params(axis='y', labelsize=8)\n\n# Ocultar subplots vacíos\nfor j in range(len(fitness_bio_categories), len(axes)):\n    axes[j].axis('off')\n\n# Título general y ajustes\nfig.suptitle(\"Distribution of FitnessGram and Bio-electric Impedance Analysis Zones\", fontsize=16, color=\"#004080\", y=1.02)\nplt.tight_layout(rect=[0, 0, 1, 0.98])\nplt.show()\n","metadata":{"id":"FfoyZyIi1vS_","outputId":"b8f3a0da-77e5-4366-eadc-2e8b75b571d9","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:39:09.762584Z","iopub.execute_input":"2024-12-05T03:39:09.763015Z","iopub.status.idle":"2024-12-05T03:39:11.985036Z","shell.execute_reply.started":"2024-12-05T03:39:09.762976Z","shell.execute_reply":"2024-12-05T03:39:11.983771Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Análisis de Variables Continuas por Distribución Objetivo SII\n","metadata":{"id":"dtVUzT7F1xZY"}},{"cell_type":"code","source":"# Lista de columnas continuas basadas en los datos\ncontinuous_columns = [\n    'Basic_Demos-Age', 'Physical-BMI', 'Physical-Height', 'Physical-Weight',\n    'FGC-FGC_GSND', 'FGC-FGC_GSD', 'FGC-FGC_SRL', 'FGC-FGC_SRR',\n    'BIA-BIA_BMC', 'BIA-BIA_BMI', 'BIA-BIA_BMR', 'BIA-BIA_DEE',\n    'BIA-BIA_ECW', 'BIA-BIA_FFM', 'BIA-BIA_FFMI', 'BIA-BIA_FMI',\n    'BIA-BIA_Fat', 'BIA-BIA_ICW', 'BIA-BIA_LDM', 'BIA-BIA_LST',\n    'BIA-BIA_SMM', 'BIA-BIA_TBW', 'PAQ_A-PAQ_A_Total', 'PAQ_C-PAQ_C_Total'\n]\n\n# Seleccionar solo las columnas continuas y el objetivo 'sii'\ndata_continuous = train_df[continuous_columns + ['sii']]\n\n# Eliminar filas donde 'sii' sea NaN, pero mantener los NaNs en las variables continuas\ndata_continuous = data_continuous.dropna(subset=['sii'])\n\n# Transformar los datos a formato largo para usar con Seaborn\ndata_long = pd.melt(data_continuous, id_vars='sii', var_name=\"variable\", value_name=\"value\")\n\n# Configurar el FacetGrid para los gráficos KDE con un tamaño de figura mayor\ng = sns.FacetGrid(data_long, col=\"variable\", col_wrap=4, height=3.5, aspect=1.2, sharex=False, sharey=False)\n\n# Mapear los gráficos KDE al grid, usando 'sii' como hue\ng.map_dataframe(sns.kdeplot, x=\"value\", hue=\"sii\", fill=True, common_norm=False, palette=\"Set2\", alpha=0.4, linewidth=1.5)\n\n# Añadir título y ajustar el diseño\ng.fig.suptitle(\"Distribución de métricas continuas de fitness y salud por objetivo SII\", y=1.05, fontsize=18, color=\"#004080\")\ng.set_titles(\"{col_name}\")\ng.set_axis_labels(\"Valor\", \"Densidad\")\n\n# Crear una leyenda personalizada\n# Definir las etiquetas y colores (coinciden con `palette=\"Set2\"` utilizado arriba)\nsii_labels = sorted(data_continuous['sii'].dropna().unique())\ncolors = sns.color_palette(\"Set2\", len(sii_labels))\nlegend_elements = [Line2D([0], [0], color=color, lw=4, label=f'SII {label}') for color, label in zip(colors, sii_labels)]\n\n# Posicionar la leyenda personalizada fuera del grid\ng.fig.legend(handles=legend_elements, loc=\"upper center\", ncol=4, bbox_to_anchor=(0.5, 1.15), frameon=False)\n\nplt.tight_layout()\nplt.show()\n","metadata":{"id":"A9OqpdWC1yPt","outputId":"a81ee450-e560-4a50-91fc-87900381687e","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:39:11.987075Z","iopub.execute_input":"2024-12-05T03:39:11.987435Z","iopub.status.idle":"2024-12-05T03:39:20.327130Z","shell.execute_reply.started":"2024-12-05T03:39:11.987401Z","shell.execute_reply":"2024-12-05T03:39:20.325837Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"#Mapa de calor de correlación entre variables continuas y sii\n","metadata":{"id":"vV5nJGJN11Wh"}},{"cell_type":"code","source":"# Calcular la matriz de correlación\ncontinuous_columns = [\n    'Basic_Demos-Age', 'Physical-BMI', 'Physical-Height', 'Physical-Weight',\n    'FGC-FGC_GSND', 'FGC-FGC_GSD', 'FGC-FGC_SRL', 'FGC-FGC_SRR',\n    'BIA-BIA_BMC', 'BIA-BIA_BMI', 'BIA-BIA_BMR', 'BIA-BIA_DEE',\n    'BIA-BIA_ECW', 'BIA-BIA_FFM', 'BIA-BIA_FFMI', 'BIA-BIA_FMI',\n    'BIA-BIA_Fat', 'BIA-BIA_ICW', 'BIA-BIA_LDM', 'BIA-BIA_LST',\n    'BIA-BIA_SMM', 'BIA-BIA_TBW', 'PAQ_A-PAQ_A_Total', 'PAQ_C-PAQ_C_Total', 'sii'\n]\n\ncorrelation_matrix = train_df[continuous_columns].corr()\n\n# Graficar el heatmap con mejor legibilidad\nplt.figure(figsize=(18, 15))  # Aumentar el tamaño de la figura\nsns.heatmap(\n    correlation_matrix,\n    annot=True,  # Mostrar los valores de correlación\n    fmt=\".2f\",  # Reducir el número de decimales\n    cmap=\"coolwarm\",  # Usar un esquema de colores claro\n    center=0,  # Centrar los colores en 0\n    annot_kws={\"size\": 8},  # Ajustar el tamaño de la fuente de las anotaciones\n    cbar_kws={\"shrink\": 0.8}  # Reducir ligeramente el tamaño de la barra de color\n)\n\n# Ajustar las etiquetas para mejorar la legibilidad\nplt.xticks(rotation=90, fontsize=10)  # Rotar etiquetas del eje x para mejor ajuste\nplt.yticks(rotation=0, fontsize=10)   # Mantener etiquetas del eje y horizontales\nplt.title(\"Mapa de calor de correlaciones entre variables continuas y SII\", fontsize=18, color=\"#004080\")\nplt.tight_layout()  # Asegurar que todo encaje dentro del área de la figura\n\nplt.show()\n","metadata":{"id":"qXBQlla-12MF","outputId":"bbd74bb1-8957-42c8-ed0e-8d66989b8dee","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:39:20.328761Z","iopub.execute_input":"2024-12-05T03:39:20.329231Z","iopub.status.idle":"2024-12-05T03:39:22.332542Z","shell.execute_reply.started":"2024-12-05T03:39:20.329182Z","shell.execute_reply":"2024-12-05T03:39:22.331303Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Estadística Descriptiva de Variables Discreta","metadata":{"id":"Q9cDcgTE15oa"}},{"cell_type":"code","source":"# Lista de variables enteras para analizar\ninteger_columns = list(data_dictionary[\n    data_dictionary['Type'].str.contains('int') & ~data_dictionary['Type'].str.contains('categorical')\n][\"Field\"].unique())\n\n# Calcular estadísticas para cada columna\ncolumn_stats = {\n    col: {\n        'Null Percentage': train_df[col].isna().mean() * 100,  # Porcentaje de valores nulos\n        'Unique Values': train_df[col].nunique(),  # Cantidad de valores únicos\n        'Mean': train_df[col].mean(),  # Media\n        'Std': train_df[col].std(),  # Desviación estándar\n        'Min': train_df[col].min(),  # Valor mínimo\n        '25%': train_df[col].quantile(0.25),  # Percentil 25\n        '50%': train_df[col].median(),  # Percentil 50 (mediana)\n        '75%': train_df[col].quantile(0.75),  # Percentil 75\n        'Max': train_df[col].max()  # Valor máximo\n    }\n    for col in integer_columns\n}\n\n# Crear un DataFrame para mostrar los resultados\nstats_df = pd.DataFrame.from_dict(column_stats, orient='index').reset_index()\nstats_df.columns = [\n    'Column', 'Null Percentage', 'Unique Values',\n    'Mean', 'Std', 'Min', '25%', '50%', '75%', 'Max'\n]\n\n# Ordenar el DataFrame por porcentaje de valores nulos de forma descendente\nstats_df = stats_df.sort_values(by='Null Percentage', ascending=False).reset_index(drop=True)\n\n# Mostrar el DataFrame\nstats_df\n","metadata":{"id":"4B0CovEr16Tq","outputId":"ead231bb-8824-4d55-f3c8-3c468b583db2","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:39:22.335628Z","iopub.execute_input":"2024-12-05T03:39:22.336204Z","iopub.status.idle":"2024-12-05T03:39:22.406158Z","shell.execute_reply.started":"2024-12-05T03:39:22.336151Z","shell.execute_reply":"2024-12-05T03:39:22.404958Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\n# Calcular el número de filas y columnas para la cuadrícula\nnum_cols = 3  # Ajusta el número de columnas según sea necesario\nnum_rows = math.ceil(len(integer_columns) / num_cols)\n\n# Crear la figura y subplots\nfig, axes = plt.subplots(num_rows, num_cols, figsize=(15, 5 * num_rows), constrained_layout=True)\n\n# Aplanar los ejes para facilitar la iteración\naxes = axes.flatten()\n\n# Añadir un gráfico de caja (box plot) para cada columna entera\nfor i, col in enumerate(integer_columns):\n    ax = axes[i]  # Seleccionar el subplot correspondiente\n    ax.boxplot(train_df[col].dropna(), patch_artist=True, boxprops=dict(facecolor=\"#0082c8\", color=\"#004080\"))\n    ax.set_title(col, fontsize=12)  # Título de cada gráfico\n    ax.set_ylabel(\"Valor\")  # Etiqueta del eje y\n    ax.tick_params(axis='x', bottom=False, labelbottom=False)  # Ocultar etiquetas del eje x\n\n# Ocultar subplots vacíos si hay más subplots que columnas\nfor j in range(len(integer_columns), len(axes)):\n    axes[j].axis('off')\n\n# Configuración del título principal\nfig.suptitle(\"Distribución de variables discretas (Box Plot)\", fontsize=18, color=\"#004080\", y=1.02)\n\nplt.show()\n","metadata":{"id":"us2FFzzI19F-","outputId":"e7eea3de-369a-4124-d95e-33c9a1a3a049","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:39:22.407542Z","iopub.execute_input":"2024-12-05T03:39:22.407912Z","iopub.status.idle":"2024-12-05T03:39:25.199031Z","shell.execute_reply.started":"2024-12-05T03:39:22.407879Z","shell.execute_reply":"2024-12-05T03:39:25.197774Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\n# Definir mapeo de colores para cada categoría de SII\nsii_colors = {\n    0: \"#4B9CD3\",   # Color para 'None'\n    1: \"#F7A072\",   # Color para 'Mild'\n    2: \"#A3C4BC\",   # Color para 'Moderate'\n    3: \"#FF6F61\",   # Color para 'Severe'\n}\n\n# Calcular el número de filas y columnas para la cuadrícula\nnum_cols = 3  # Ajustar el número de columnas según sea necesario\nnum_rows = math.ceil(len(integer_columns) / num_cols)  # Calcular filas necesarias\n\n# Crear la figura y subplots\nfig, axes = plt.subplots(num_rows, num_cols, figsize=(15, 5 * num_rows), constrained_layout=True)\naxes = axes.flatten()  # Aplanar los ejes para iterar fácilmente\n\n# Crear un box plot para cada columna entera, separado por categorías de SII\nfor i, col in enumerate(integer_columns):\n    ax = axes[i]  # Seleccionar el subplot correspondiente\n\n    # Añadir box plots para cada categoría de SII\n    for sii_value, color in sii_colors.items():\n        sns.boxplot(\n            y=train_df[train_df['sii'] == sii_value][col],  # Filtrar datos por categoría de SII\n            ax=ax,\n            color=color,\n            width=0.4,\n            flierprops={'marker': 'o', 'color': color, 'markersize': 5}  # Configurar estilo de outliers\n        )\n\n    # Configurar título y etiquetas\n    ax.set_title(col, fontsize=12)  # Título de cada gráfico\n    ax.set_ylabel(\"Valor\", fontsize=10)  # Etiqueta del eje Y\n    ax.tick_params(axis='x', bottom=False, labelbottom=False)  # Ocultar etiquetas del eje X\n\n# Ocultar subplots vacíos si hay más subplots que columnas\nfor j in range(len(integer_columns), len(axes)):\n    axes[j].axis('off')  # Desactivar ejes vacíos\n\n# Configuración del título principal\nfig.suptitle(\"Distribución de variables discretas (Box Plot) por SII\", fontsize=18, color=\"#004080\", y=1.02)\n\n# Crear una leyenda personalizada\nlegend_handles = [plt.Line2D([0], [0], color=color, lw=4, label=f\"SII {key}\") for key, color in sii_colors.items()]\nfig.legend(\n    handles=legend_handles,\n    loc='upper center',\n    title=\"Niveles de SII\",\n    ncol=len(sii_colors),\n    bbox_to_anchor=(0.5, 1.05),\n    frameon=False\n)\n\nplt.show()\n","metadata":{"id":"4EgbVV8g1_nj","outputId":"c129023a-6c6c-463e-8b8e-1ad5e582f07f","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:39:25.200647Z","iopub.execute_input":"2024-12-05T03:39:25.201026Z","iopub.status.idle":"2024-12-05T03:39:28.762793Z","shell.execute_reply.started":"2024-12-05T03:39:25.200991Z","shell.execute_reply":"2024-12-05T03:39:28.761512Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# # Pre procesamiento de datos, busqueda de parametros y entrenamiento","metadata":{"id":"n0YU5b6Fvesz"}},{"cell_type":"markdown","source":"# Preprocesamiento","metadata":{"id":"5Mas78wryu85"}},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nfrom sklearn.model_selection import StratifiedKFold\nfrom sklearn.base import clone\nfrom sklearn.metrics import cohen_kappa_score\nfrom sklearn.impute import KNNImputer\nfrom sklearn.ensemble import VotingRegressor\nfrom lightgbm import LGBMRegressor\nfrom xgboost import XGBRegressor\nfrom catboost import CatBoostRegressor\nfrom scipy.optimize import minimize\nfrom tqdm import tqdm","metadata":{"id":"PYQjcBbsL1ze","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:39:28.764152Z","iopub.execute_input":"2024-12-05T03:39:28.764470Z","iopub.status.idle":"2024-12-05T03:39:28.780909Z","shell.execute_reply.started":"2024-12-05T03:39:28.764439Z","shell.execute_reply":"2024-12-05T03:39:28.779627Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Cargamos los time series","metadata":{"id":"8_ZVvSLCNJby"}},{"cell_type":"code","source":"def process_file(filename, dirname):\n    df = pd.read_parquet(os.path.join(dirname, filename, 'part-0.parquet'))\n    df.drop('step', axis=1, inplace=True)\n    return df.describe().values.reshape(-1), filename.split('=')[1]","metadata":{"id":"vv-1Lfg9NMYb","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:39:28.782210Z","iopub.execute_input":"2024-12-05T03:39:28.782637Z","iopub.status.idle":"2024-12-05T03:39:28.791542Z","shell.execute_reply.started":"2024-12-05T03:39:28.782601Z","shell.execute_reply":"2024-12-05T03:39:28.790194Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def load_time_series(dirname):\n    stats = []\n    indexes = []\n\n    # Process files one by one\n    for fname in tqdm(os.listdir(dirname), desc=\"Processing files\"):\n        file_stats, file_id = process_file(fname, dirname)\n        stats.append(file_stats)\n        indexes.append(file_id)\n\n    # Create a DataFrame\n    df = pd.DataFrame(stats, columns=[f\"stat_{i}\" for i in range(len(stats[0]))])\n    df['id'] = indexes\n\n    return df","metadata":{"id":"-cjTHP79NM6I","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:39:28.792835Z","iopub.execute_input":"2024-12-05T03:39:28.793164Z","iopub.status.idle":"2024-12-05T03:39:28.811572Z","shell.execute_reply.started":"2024-12-05T03:39:28.793133Z","shell.execute_reply":"2024-12-05T03:39:28.810356Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\ntrain_ts = load_time_series(\"/kaggle/input/child-mind-institute-problematic-internet-use/series_train.parquet\")\ntest_ts = load_time_series(\"/kaggle/input/child-mind-institute-problematic-internet-use/series_test.parquet\")","metadata":{"id":"YdDgnl1GNPhl","outputId":"8eb75dc1-e3e3-44e3-ab10-63a85579c5ff","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:40:01.135496Z","iopub.execute_input":"2024-12-05T03:40:01.135959Z","iopub.status.idle":"2024-12-05T03:43:55.870836Z","shell.execute_reply.started":"2024-12-05T03:40:01.135920Z","shell.execute_reply":"2024-12-05T03:43:55.869560Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Encodeamos los time series","metadata":{"id":"R78YP0llOQ6T"}},{"cell_type":"code","source":"import torch\nimport torch.nn as nn\nimport torch.optim as optim\n\nclass AutoEncoder(nn.Module):\n    def __init__(self, input_dim, encoding_dim):\n        super(AutoEncoder, self).__init__()\n        self.encoder = nn.Sequential(\n            nn.Linear(input_dim, encoding_dim), nn.ReLU()\n        )\n        self.decoder = nn.Sequential(\n            nn.Linear(encoding_dim, input_dim), nn.Sigmoid()\n        )\n\n    def forward(self, x):\n        x = self.encoder(x)\n        x = self.decoder(x)\n        return x","metadata":{"id":"PGIx5S8jOSnx","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:43:55.872820Z","iopub.execute_input":"2024-12-05T03:43:55.873192Z","iopub.status.idle":"2024-12-05T03:43:59.560610Z","shell.execute_reply.started":"2024-12-05T03:43:55.873157Z","shell.execute_reply":"2024-12-05T03:43:59.559319Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.preprocessing import StandardScaler\ndef perform_autoencoder(df, encoding_dim=50, epochs=50, batch_size=32):\n    # Scale the data\n    scaler = StandardScaler()\n    df_scaled = scaler.fit_transform(df)\n    data_tensor = torch.FloatTensor(df_scaled)\n\n    input_dim = data_tensor.shape[1]\n    autoencoder = AutoEncoder(input_dim, encoding_dim)\n\n    criterion = nn.MSELoss()\n    optimizer = optim.Adam(autoencoder.parameters())\n\n    for epoch in range(epochs):\n        for i in range(0, len(data_tensor), batch_size):\n            batch = data_tensor[i : i + batch_size]\n            optimizer.zero_grad()\n            loss = criterion(autoencoder(batch), batch)\n            loss.backward()\n            optimizer.step()\n\n        if (epoch + 1) % 10 == 0:\n            print(f'Epoch [{epoch + 1}/{epochs}], Loss: {loss.item():.4f}')\n\n    with torch.no_grad():\n        encoded_data = autoencoder.encoder(data_tensor).numpy()\n\n    df_encoded = pd.DataFrame(encoded_data, columns=[f'Enc_{i + 1}' for i in range(encoded_data.shape[1])])\n    return df_encoded","metadata":{"id":"QW8hAjk4OZxZ","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:43:59.562028Z","iopub.execute_input":"2024-12-05T03:43:59.562906Z","iopub.status.idle":"2024-12-05T03:43:59.573504Z","shell.execute_reply.started":"2024-12-05T03:43:59.562861Z","shell.execute_reply":"2024-12-05T03:43:59.572275Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_ts_encoded = perform_autoencoder(train_ts.drop('id', axis=1), encoding_dim=60, epochs=100, batch_size=32)\ntest_ts_encoded = perform_autoencoder(test_ts.drop('id', axis=1), encoding_dim=60, epochs=100, batch_size=32)","metadata":{"id":"fGsNCqyIOahP","outputId":"83c6ce70-9cad-446d-f9ab-30e7ef861e2c","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:43:59.576060Z","iopub.execute_input":"2024-12-05T03:43:59.576466Z","iopub.status.idle":"2024-12-05T03:44:06.515251Z","shell.execute_reply.started":"2024-12-05T03:43:59.576432Z","shell.execute_reply":"2024-12-05T03:44:06.513272Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"time_series_cols = train_ts_encoded.columns.tolist()\ntrain_ts_encoded[\"id\"]=train_ts[\"id\"]\ntest_ts_encoded['id']=test_ts[\"id\"]","metadata":{"id":"iblS5ftMQAaX","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:44:06.518457Z","iopub.execute_input":"2024-12-05T03:44:06.520945Z","iopub.status.idle":"2024-12-05T03:44:06.531573Z","shell.execute_reply.started":"2024-12-05T03:44:06.520899Z","shell.execute_reply":"2024-12-05T03:44:06.530142Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train = pd.merge(train_df, train_ts_encoded, how=\"left\", on='id')\ntest = pd.merge(test_df, test_ts_encoded, how=\"left\", on='id')","metadata":{"id":"7qLqBqc3QPB3","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:44:06.533159Z","iopub.execute_input":"2024-12-05T03:44:06.533542Z","iopub.status.idle":"2024-12-05T03:44:06.591391Z","shell.execute_reply.started":"2024-12-05T03:44:06.533487Z","shell.execute_reply":"2024-12-05T03:44:06.589810Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Planteamiento de feature engineering","metadata":{"id":"FSdfyf1OcWl1"}},{"cell_type":"code","source":"def feature_engineering(df):\n    season_cols = [col for col in df.columns if 'Season' in col]\n    df = df.drop(season_cols, axis=1)\n    df['BMI_Age'] = df['Physical-BMI'] * df['Basic_Demos-Age']\n    df['Internet_Hours_Age'] = df['PreInt_EduHx-computerinternet_hoursday'] * df['Basic_Demos-Age']\n    df['BMI_Internet_Hours'] = df['Physical-BMI'] * df['PreInt_EduHx-computerinternet_hoursday']\n    df['BFP_BMI'] = df['BIA-BIA_Fat'] / df['BIA-BIA_BMI']\n    df['FFMI_BFP'] = df['BIA-BIA_FFMI'] / df['BIA-BIA_Fat']\n    df['FMI_BFP'] = df['BIA-BIA_FMI'] / df['BIA-BIA_Fat']\n    df['LST_TBW'] = df['BIA-BIA_LST'] / df['BIA-BIA_TBW']\n    df['BFP_BMR'] = df['BIA-BIA_Fat'] * df['BIA-BIA_BMR']\n    df['BFP_DEE'] = df['BIA-BIA_Fat'] * df['BIA-BIA_DEE']\n    df['BMR_Weight'] = df['BIA-BIA_BMR'] / df['Physical-Weight']\n    df['DEE_Weight'] = df['BIA-BIA_DEE'] / df['Physical-Weight']\n    df['SMM_Height'] = df['BIA-BIA_SMM'] / df['Physical-Height']\n    df['Muscle_to_Fat'] = df['BIA-BIA_SMM'] / df['BIA-BIA_FMI']\n    df['Hydration_Status'] = df['BIA-BIA_TBW'] / df['Physical-Weight']\n    df['ICW_TBW'] = df['BIA-BIA_ICW'] / df['BIA-BIA_TBW']\n\n    return df","metadata":{"id":"3VOBMcMqcYOe","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:44:06.592725Z","iopub.execute_input":"2024-12-05T03:44:06.593086Z","iopub.status.idle":"2024-12-05T03:44:06.603412Z","shell.execute_reply.started":"2024-12-05T03:44:06.593051Z","shell.execute_reply":"2024-12-05T03:44:06.602106Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Inputamos con KNN\n","metadata":{"id":"VyV-RHmGKnxh"}},{"cell_type":"code","source":"imputer = KNNImputer(n_neighbors=5)\nnumeric_cols = train.select_dtypes(include=['float64', 'int64']).columns\nimputed_data = imputer.fit_transform(train[numeric_cols])\ntrain_imputed = pd.DataFrame(imputed_data, columns=numeric_cols)\ntrain_imputed['sii'] = train_imputed['sii'].round().astype(int)","metadata":{"id":"rCTBRi-XKqUZ","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:44:06.605095Z","iopub.execute_input":"2024-12-05T03:44:06.605556Z","iopub.status.idle":"2024-12-05T03:44:17.688112Z","shell.execute_reply.started":"2024-12-05T03:44:06.605488Z","shell.execute_reply":"2024-12-05T03:44:17.687044Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for col in train.columns:\n    if col not in numeric_cols:\n        train_imputed[col] = train[col]","metadata":{"id":"Vhnp8euJcRSk","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:44:17.689320Z","iopub.execute_input":"2024-12-05T03:44:17.689920Z","iopub.status.idle":"2024-12-05T03:44:17.744747Z","shell.execute_reply.started":"2024-12-05T03:44:17.689870Z","shell.execute_reply":"2024-12-05T03:44:17.743643Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train = train_imputed\n\ntrain = feature_engineering(train)\ntrain = train.dropna(thresh=10, axis=0)\ntest = feature_engineering(test)\n\ntrain = train.drop('id', axis=1)\ntest  = test .drop('id', axis=1)","metadata":{"id":"YjarBjucL3Zl","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:44:17.748925Z","iopub.execute_input":"2024-12-05T03:44:17.749312Z","iopub.status.idle":"2024-12-05T03:44:17.797791Z","shell.execute_reply.started":"2024-12-05T03:44:17.749278Z","shell.execute_reply":"2024-12-05T03:44:17.796587Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"featuresCols = ['Basic_Demos-Age', 'Basic_Demos-Sex',\n                'CGAS-CGAS_Score', 'Physical-BMI',\n                'Physical-Height', 'Physical-Weight', 'Physical-Waist_Circumference',\n                'Physical-Diastolic_BP', 'Physical-HeartRate', 'Physical-Systolic_BP',\n                'Fitness_Endurance-Max_Stage',\n                'Fitness_Endurance-Time_Mins', 'Fitness_Endurance-Time_Sec',\n                'FGC-FGC_CU', 'FGC-FGC_CU_Zone', 'FGC-FGC_GSND',\n                'FGC-FGC_GSND_Zone', 'FGC-FGC_GSD', 'FGC-FGC_GSD_Zone', 'FGC-FGC_PU',\n                'FGC-FGC_PU_Zone', 'FGC-FGC_SRL', 'FGC-FGC_SRL_Zone', 'FGC-FGC_SRR',\n                'FGC-FGC_SRR_Zone', 'FGC-FGC_TL', 'FGC-FGC_TL_Zone',\n                'BIA-BIA_Activity_Level_num', 'BIA-BIA_BMC', 'BIA-BIA_BMI',\n                'BIA-BIA_BMR', 'BIA-BIA_DEE', 'BIA-BIA_ECW', 'BIA-BIA_FFM',\n                'BIA-BIA_FFMI', 'BIA-BIA_FMI', 'BIA-BIA_Fat', 'BIA-BIA_Frame_num',\n                'BIA-BIA_ICW', 'BIA-BIA_LDM', 'BIA-BIA_LST', 'BIA-BIA_SMM',\n                'BIA-BIA_TBW', 'PAQ_A-PAQ_A_Total',\n                'PAQ_C-PAQ_C_Total', 'SDS-SDS_Total_Raw',\n                'SDS-SDS_Total_T',\n                'PreInt_EduHx-computerinternet_hoursday', 'sii', 'BMI_Age','Internet_Hours_Age','BMI_Internet_Hours',\n                'BFP_BMI', 'FFMI_BFP', 'FMI_BFP', 'LST_TBW', 'BFP_BMR', 'BFP_DEE', 'BMR_Weight', 'DEE_Weight',\n                'SMM_Height', 'Muscle_to_Fat', 'Hydration_Status', 'ICW_TBW']","metadata":{"id":"8qVAFAiTdT-w","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:44:17.799069Z","iopub.execute_input":"2024-12-05T03:44:17.799435Z","iopub.status.idle":"2024-12-05T03:44:17.807103Z","shell.execute_reply.started":"2024-12-05T03:44:17.799399Z","shell.execute_reply":"2024-12-05T03:44:17.805579Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"featuresCols += time_series_cols\n\ntrain = train[featuresCols]\ntrain = train.dropna(subset='sii')","metadata":{"id":"XUhVAPZmdX93","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:44:17.808955Z","iopub.execute_input":"2024-12-05T03:44:17.809350Z","iopub.status.idle":"2024-12-05T03:44:17.832262Z","shell.execute_reply.started":"2024-12-05T03:44:17.809314Z","shell.execute_reply":"2024-12-05T03:44:17.830904Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"featuresCols = ['Basic_Demos-Age', 'Basic_Demos-Sex',\n                'CGAS-CGAS_Score', 'Physical-BMI',\n                'Physical-Height', 'Physical-Weight', 'Physical-Waist_Circumference',\n                'Physical-Diastolic_BP', 'Physical-HeartRate', 'Physical-Systolic_BP',\n                'Fitness_Endurance-Max_Stage',\n                'Fitness_Endurance-Time_Mins', 'Fitness_Endurance-Time_Sec',\n                'FGC-FGC_CU', 'FGC-FGC_CU_Zone', 'FGC-FGC_GSND',\n                'FGC-FGC_GSND_Zone', 'FGC-FGC_GSD', 'FGC-FGC_GSD_Zone', 'FGC-FGC_PU',\n                'FGC-FGC_PU_Zone', 'FGC-FGC_SRL', 'FGC-FGC_SRL_Zone', 'FGC-FGC_SRR',\n                'FGC-FGC_SRR_Zone', 'FGC-FGC_TL', 'FGC-FGC_TL_Zone',\n                'BIA-BIA_Activity_Level_num', 'BIA-BIA_BMC', 'BIA-BIA_BMI',\n                'BIA-BIA_BMR', 'BIA-BIA_DEE', 'BIA-BIA_ECW', 'BIA-BIA_FFM',\n                'BIA-BIA_FFMI', 'BIA-BIA_FMI', 'BIA-BIA_Fat', 'BIA-BIA_Frame_num',\n                'BIA-BIA_ICW', 'BIA-BIA_LDM', 'BIA-BIA_LST', 'BIA-BIA_SMM',\n                'BIA-BIA_TBW', 'PAQ_A-PAQ_A_Total',\n                'PAQ_C-PAQ_C_Total', 'SDS-SDS_Total_Raw',\n                'SDS-SDS_Total_T',\n                'PreInt_EduHx-computerinternet_hoursday', 'BMI_Age','Internet_Hours_Age','BMI_Internet_Hours',\n                'BFP_BMI', 'FFMI_BFP', 'FMI_BFP', 'LST_TBW', 'BFP_BMR', 'BFP_DEE', 'BMR_Weight', 'DEE_Weight',\n                'SMM_Height', 'Muscle_to_Fat', 'Hydration_Status', 'ICW_TBW']","metadata":{"id":"YzyITMHHdZgn","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:44:17.834025Z","iopub.execute_input":"2024-12-05T03:44:17.834559Z","iopub.status.idle":"2024-12-05T03:44:17.843176Z","shell.execute_reply.started":"2024-12-05T03:44:17.834482Z","shell.execute_reply":"2024-12-05T03:44:17.841893Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"featuresCols += time_series_cols\ntest = test[featuresCols]","metadata":{"id":"qrIFt1VhdbTc","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:44:17.844913Z","iopub.execute_input":"2024-12-05T03:44:17.845398Z","iopub.status.idle":"2024-12-05T03:44:17.870969Z","shell.execute_reply.started":"2024-12-05T03:44:17.845346Z","shell.execute_reply":"2024-12-05T03:44:17.869735Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"if np.any(np.isinf(train)):\n    train = train.replace([np.inf, -np.inf], np.nan)","metadata":{"id":"U-6spEN9d11y","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:44:17.872246Z","iopub.execute_input":"2024-12-05T03:44:17.872674Z","iopub.status.idle":"2024-12-05T03:44:17.890592Z","shell.execute_reply.started":"2024-12-05T03:44:17.872639Z","shell.execute_reply":"2024-12-05T03:44:17.889320Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Definimos funciones de perdida y evaluación","metadata":{"id":"04H1fPuReTr7"}},{"cell_type":"code","source":"def quadratic_weighted_kappa(y_true, y_pred):\n    return cohen_kappa_score(y_true, y_pred, weights='quadratic')","metadata":{"id":"ked-x3oueXaP","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:44:17.892174Z","iopub.execute_input":"2024-12-05T03:44:17.892609Z","iopub.status.idle":"2024-12-05T03:44:17.904618Z","shell.execute_reply.started":"2024-12-05T03:44:17.892563Z","shell.execute_reply":"2024-12-05T03:44:17.903164Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def threshold_Rounder(oof_non_rounded, thresholds):\n    return np.where(oof_non_rounded < thresholds[0], 0,\n                    np.where(oof_non_rounded < thresholds[1], 1,\n                             np.where(oof_non_rounded < thresholds[2], 2, 3)))","metadata":{"id":"ZGA2uwiYeZfd","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:44:17.906362Z","iopub.execute_input":"2024-12-05T03:44:17.907197Z","iopub.status.idle":"2024-12-05T03:44:17.922648Z","shell.execute_reply.started":"2024-12-05T03:44:17.907142Z","shell.execute_reply":"2024-12-05T03:44:17.921157Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def evaluate_predictions(thresholds, y_true, oof_non_rounded):\n    rounded_p = threshold_Rounder(oof_non_rounded, thresholds)\n    return -quadratic_weighted_kappa(y_true, rounded_p)\n","metadata":{"id":"3jeZW5OUebKa","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:44:17.924485Z","iopub.execute_input":"2024-12-05T03:44:17.925006Z","iopub.status.idle":"2024-12-05T03:44:17.937066Z","shell.execute_reply.started":"2024-12-05T03:44:17.924940Z","shell.execute_reply":"2024-12-05T03:44:17.935599Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def optimize_thresholds(y_true, predictions):\n    def loss(thresholds):\n        rounded_preds = threshold_Rounder(predictions, thresholds)\n        return -quadratic_weighted_kappa(y_true, rounded_preds)\n\n    initial_thresholds = [0.5, 1.5, 2.5]\n    result = minimize(loss, initial_thresholds, method='Nelder-Mead')\n    return result.x","metadata":{"id":"KoZ5-PRGfa9z","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:44:17.938671Z","iopub.execute_input":"2024-12-05T03:44:17.939071Z","iopub.status.idle":"2024-12-05T03:44:17.957396Z","shell.execute_reply.started":"2024-12-05T03:44:17.939032Z","shell.execute_reply":"2024-12-05T03:44:17.956096Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Entrenamiento","metadata":{"id":"qvVfQOJmfbgJ"}},{"cell_type":"code","source":"def train_model_with_cv(model, X, y, X_test, n_splits=5):\n    skf = StratifiedKFold(n_splits=n_splits, shuffle=True, random_state=42)\n    oof_predictions = np.zeros(len(y))\n    test_predictions = np.zeros((len(X_test), n_splits))\n\n    for fold, (train_idx, val_idx) in enumerate(tqdm(skf.split(X, y), total=n_splits, desc=\"Training folds\")):\n        X_train, X_val = X.iloc[train_idx], X.iloc[val_idx]\n        y_train, y_val = y.iloc[train_idx], y.iloc[val_idx]\n\n        model_clone = clone(model)\n        model_clone.fit(X_train, y_train)\n\n        val_preds = model_clone.predict(X_val)\n        oof_predictions[val_idx] = val_preds\n        test_predictions[:, fold] = model_clone.predict(X_test)\n\n    return oof_predictions, test_predictions.mean(axis=1)\n","metadata":{"id":"2UqLesaTfckN","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:44:17.959363Z","iopub.execute_input":"2024-12-05T03:44:17.959929Z","iopub.status.idle":"2024-12-05T03:44:17.975381Z","shell.execute_reply.started":"2024-12-05T03:44:17.959882Z","shell.execute_reply":"2024-12-05T03:44:17.974215Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"lightgbm = LGBMRegressor(random_state=42)\nxgboost = XGBRegressor(random_state=42)\ncatboost = CatBoostRegressor(random_state=42, verbose=0)","metadata":{"id":"-GL7H0EufhNu","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:44:17.976701Z","iopub.execute_input":"2024-12-05T03:44:17.977047Z","iopub.status.idle":"2024-12-05T03:44:17.995486Z","shell.execute_reply.started":"2024-12-05T03:44:17.977015Z","shell.execute_reply":"2024-12-05T03:44:17.994226Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"voting_model = VotingRegressor(estimators=[\n    ('lightgbm', lightgbm),\n    ('xgboost', xgboost),\n    ('catboost', catboost)\n])\n","metadata":{"id":"YRpe4EADfjZm","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:44:17.997312Z","iopub.execute_input":"2024-12-05T03:44:17.998414Z","iopub.status.idle":"2024-12-05T03:44:18.014251Z","shell.execute_reply.started":"2024-12-05T03:44:17.998357Z","shell.execute_reply":"2024-12-05T03:44:18.013134Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Busqueda de hiperparametros","metadata":{"id":"13t7OcEwiedR"}},{"cell_type":"code","source":"lgbm_param_grid = {\n    'learning_rate': [0.01, 0.05, 0.1],\n    'n_estimators': [100, 200, 300],\n    'max_depth': [5, 10, 15],\n    'num_leaves': [20, 31, 50]\n}\n\n# XGBoost parameters\nxgb_param_grid = {\n    'learning_rate': [0.01, 0.05, 0.1],\n    'n_estimators': [100, 200, 300],\n    'max_depth': [3, 5, 7],\n    'subsample': [0.6, 0.8, 1.0],\n    'colsample_bytree': [0.6, 0.8, 1.0]\n}\n\n# CatBoost parameters\ncatboost_param_grid = {\n    'learning_rate': [0.01, 0.05, 0.1],\n    'iterations': [100, 200, 300],\n    'depth': [6, 8, 10],\n    'l2_leaf_reg': [1, 3, 5]\n}","metadata":{"id":"i6EFGg9eigJD","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:44:18.015753Z","iopub.execute_input":"2024-12-05T03:44:18.016108Z","iopub.status.idle":"2024-12-05T03:44:18.031353Z","shell.execute_reply.started":"2024-12-05T03:44:18.016062Z","shell.execute_reply":"2024-12-05T03:44:18.029738Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"X_train = train.drop(['sii'], axis=1)\ny_train = train['sii']","metadata":{"id":"i128GVrgvjXm","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:44:18.033038Z","iopub.execute_input":"2024-12-05T03:44:18.033552Z","iopub.status.idle":"2024-12-05T03:44:18.054271Z","shell.execute_reply.started":"2024-12-05T03:44:18.033473Z","shell.execute_reply":"2024-12-05T03:44:18.052610Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Imputar con KNN\n","metadata":{"id":"yT-VBv05w6Av"}},{"cell_type":"code","source":"train","metadata":{"id":"o9mGPBZSxKR5","outputId":"04df318d-7b70-4467-d3f0-826c9e3d1a72","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:44:18.055986Z","iopub.execute_input":"2024-12-05T03:44:18.056377Z","iopub.status.idle":"2024-12-05T03:44:18.096755Z","shell.execute_reply.started":"2024-12-05T03:44:18.056339Z","shell.execute_reply":"2024-12-05T03:44:18.095394Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test","metadata":{"id":"_41MxYt5xm-E","outputId":"86c26617-58d3-4265-f8c3-ce1f4685e857","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:44:18.098383Z","iopub.execute_input":"2024-12-05T03:44:18.098891Z","iopub.status.idle":"2024-12-05T03:44:18.136484Z","shell.execute_reply.started":"2024-12-05T03:44:18.098840Z","shell.execute_reply":"2024-12-05T03:44:18.135213Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Inicializar el KNNImputer\nknn_imputer = KNNImputer(n_neighbors=5)\n","metadata":{"id":"0W7ikYYixqF8","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:44:18.138106Z","iopub.execute_input":"2024-12-05T03:44:18.138480Z","iopub.status.idle":"2024-12-05T03:44:18.148977Z","shell.execute_reply.started":"2024-12-05T03:44:18.138444Z","shell.execute_reply":"2024-12-05T03:44:18.147512Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Aplicar KNNImputer al dataset\nimputed_data = knn_imputer.fit_transform(train)\n\n# Convertir los datos imputados nuevamente a un DataFrame\ntrain = pd.DataFrame(imputed_data, columns=train.columns)\n","metadata":{"id":"WGxnyKOYzWXM","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:44:18.154620Z","iopub.execute_input":"2024-12-05T03:44:18.155061Z","iopub.status.idle":"2024-12-05T03:44:26.560862Z","shell.execute_reply.started":"2024-12-05T03:44:18.155022Z","shell.execute_reply":"2024-12-05T03:44:26.559642Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"imputed_data = knn_imputer.fit_transform(test)\n\n# Convertir los datos imputados nuevamente a un DataFrame\ntest = pd.DataFrame(imputed_data, columns=test.columns)","metadata":{"id":"h9IWZURkzrr_","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:44:26.562551Z","iopub.execute_input":"2024-12-05T03:44:26.563066Z","iopub.status.idle":"2024-12-05T03:44:26.618253Z","shell.execute_reply.started":"2024-12-05T03:44:26.563016Z","shell.execute_reply":"2024-12-05T03:44:26.616938Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train","metadata":{"id":"xduOEskiz0rD","outputId":"cb62c82c-f13d-4c1d-ae63-c479aa705ddd","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:44:26.619542Z","iopub.execute_input":"2024-12-05T03:44:26.619944Z","iopub.status.idle":"2024-12-05T03:44:26.652242Z","shell.execute_reply.started":"2024-12-05T03:44:26.619910Z","shell.execute_reply":"2024-12-05T03:44:26.650838Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test","metadata":{"id":"2-Y_HwIkz2C-","outputId":"0ba7ca49-2b8d-435a-e825-24144262e90c","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:44:26.653965Z","iopub.execute_input":"2024-12-05T03:44:26.654342Z","iopub.status.idle":"2024-12-05T03:44:26.695548Z","shell.execute_reply.started":"2024-12-05T03:44:26.654308Z","shell.execute_reply":"2024-12-05T03:44:26.694423Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.model_selection import RandomizedSearchCV\nfrom lightgbm import LGBMRegressor\n\nlgbm = LGBMRegressor(random_state=42)\nlgbm_search = RandomizedSearchCV(\n    estimator=lgbm,\n    param_distributions=lgbm_param_grid,\n    n_iter=50,\n    scoring='neg_mean_squared_error',\n    cv=3,\n    verbose=2,\n    random_state=42,\n    n_jobs=-1\n)\n\nlgbm_search.fit(X_train, y_train)\nbest_lgbm = lgbm_search.best_estimator_\nprint(\"Best LightGBM Parameters:\", lgbm_search.best_params_)\n","metadata":{"id":"N1gEa95tjJ-8","outputId":"8e5711f5-1b10-4fbe-ff6b-a7e8e179f00c","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:44:26.697215Z","iopub.execute_input":"2024-12-05T03:44:26.697713Z","iopub.status.idle":"2024-12-05T03:48:49.334312Z","shell.execute_reply.started":"2024-12-05T03:44:26.697662Z","shell.execute_reply":"2024-12-05T03:48:49.332927Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from xgboost import XGBRegressor\n\nxgb = XGBRegressor(random_state=42)\nxgb_search = RandomizedSearchCV(\n    estimator=xgb,\n    param_distributions=xgb_param_grid,\n    n_iter=50,\n    scoring='neg_mean_squared_error',\n    cv=3,\n    verbose=2,\n    random_state=42,\n    n_jobs=-1\n)\n\nxgb_search.fit(X_train, y_train)\nbest_xgb = xgb_search.best_estimator_\nprint(\"Best XGBoost Parameters:\", xgb_search.best_params_)\n","metadata":{"id":"lLmdScB0jPGj","outputId":"160f8cfa-3c1f-4fa3-8ec7-7d4f69b9b1ee","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T03:48:49.336352Z","iopub.execute_input":"2024-12-05T03:48:49.336943Z","iopub.status.idle":"2024-12-05T04:03:44.944443Z","shell.execute_reply.started":"2024-12-05T03:48:49.336887Z","shell.execute_reply":"2024-12-05T04:03:44.942971Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from catboost import CatBoostRegressor\n\ncatboost = CatBoostRegressor(random_state=42, verbose=0)\ncatboost_search = RandomizedSearchCV(\n    estimator=catboost,\n    param_distributions=catboost_param_grid,\n    n_iter=50,\n    scoring='neg_mean_squared_error',\n    cv=3,\n    verbose=2,\n    random_state=42,\n    n_jobs=-1\n)\n\ncatboost_search.fit(X_train, y_train)\nbest_catboost = catboost_search.best_estimator_\nprint(\"Best CatBoost Parameters:\", catboost_search.best_params_)\n","metadata":{"id":"zEdl5sVBjPky","outputId":"458ce9bd-140f-4316-bd58-c70faeedd66a","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T04:03:44.946302Z","iopub.execute_input":"2024-12-05T04:03:44.946733Z","iopub.status.idle":"2024-12-05T04:35:40.380129Z","shell.execute_reply.started":"2024-12-05T04:03:44.946681Z","shell.execute_reply":"2024-12-05T04:35:40.378607Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\nX = train.drop(['sii'], axis=1)\ny = train['sii']\nX_test = test","metadata":{"id":"A0eWM6Vkfs_V","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T04:35:40.381986Z","iopub.execute_input":"2024-12-05T04:35:40.382388Z","iopub.status.idle":"2024-12-05T04:35:40.393212Z","shell.execute_reply.started":"2024-12-05T04:35:40.382347Z","shell.execute_reply":"2024-12-05T04:35:40.392187Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"oof_predictions, test_predictions = train_model_with_cv(voting_model, X_train, y_train, X_test)","metadata":{"id":"uWL7Ov7bfn-P","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T04:55:12.805944Z","iopub.execute_input":"2024-12-05T04:55:12.806495Z","iopub.status.idle":"2024-12-05T04:56:55.609244Z","shell.execute_reply.started":"2024-12-05T04:55:12.806454Z","shell.execute_reply":"2024-12-05T04:56:55.608162Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.preprocessing import MinMaxScaler\n# Escalar al rango [0, 4]\nscaler = MinMaxScaler(feature_range=(0, 4))\nscaled_predictions = scaler.fit_transform(np.array(test_predictions).reshape(-1, 1)).flatten()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T04:58:53.032901Z","iopub.execute_input":"2024-12-05T04:58:53.033382Z","iopub.status.idle":"2024-12-05T04:58:53.040170Z","shell.execute_reply.started":"2024-12-05T04:58:53.033344Z","shell.execute_reply":"2024-12-05T04:58:53.038880Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#Convertir valores escalados a categorías enteras (0-4)\ndiscrete_predictions = np.round(scaled_predictions).astype(int)\n\nprint(\"Predicciones categorizadas:\", discrete_predictions)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T04:58:53.614632Z","iopub.execute_input":"2024-12-05T04:58:53.615078Z","iopub.status.idle":"2024-12-05T04:58:53.623733Z","shell.execute_reply.started":"2024-12-05T04:58:53.615041Z","shell.execute_reply":"2024-12-05T04:58:53.622653Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sample_submission = pd.read_csv('/kaggle/input/child-mind-institute-problematic-internet-use/sample_submission.csv')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T04:58:54.309781Z","iopub.execute_input":"2024-12-05T04:58:54.310197Z","iopub.status.idle":"2024-12-05T04:58:54.319364Z","shell.execute_reply.started":"2024-12-05T04:58:54.310164Z","shell.execute_reply":"2024-12-05T04:58:54.318278Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Crear el DataFrame de Submission\nsubmission = pd.DataFrame({\n    'id': sample_submission['id'],  # IDs del conjunto de prueba\n    'sii': discrete_predictions    # Predicciones para sii\n})\n\n# Guardar el archivo CSV\nsubmission.to_csv('submission.csv', index=False)\nprint(\"Archivo 'submission.csv' generado con éxito.\")\n","metadata":{"id":"VNOH4RFL2qMq","trusted":true,"execution":{"iopub.status.busy":"2024-12-05T04:58:54.916795Z","iopub.execute_input":"2024-12-05T04:58:54.917259Z","iopub.status.idle":"2024-12-05T04:58:54.931057Z","shell.execute_reply.started":"2024-12-05T04:58:54.917222Z","shell.execute_reply":"2024-12-05T04:58:54.929532Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.metrics import cohen_kappa_score\n\n# Función para ajustar umbrales y maximizar QWK\ndef optimize_qwk(y_true, y_pred):\n    best_score = -np.inf\n    best_thresholds = None\n    for thresholds in some_search_space:\n        y_pred_adjusted = apply_thresholds(y_pred, thresholds)\n        score = cohen_kappa_score(y_true, y_pred_adjusted, weights='quadratic')\n        if score > best_score:\n            best_score = score\n            best_thresholds = thresholds\n    return best_thresholds\nfrom sklearn.metrics import cohen_kappa_score\n\n# Función para ajustar umbrales y maximizar QWK\ndef optimize_qwk(y_true, y_pred):\n    best_score = -np.inf\n    best_thresholds = None\n    for thresholds in some_search_space:\n        y_pred_adjusted = apply_thresholds(y_pred, thresholds)\n        score = cohen_kappa_score(y_true, y_pred_adjusted, weights='quadratic')\n        if score > best_score:\n            best_score = score\n            best_thresholds = thresholds\n    return best_thresholds\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T04:58:55.429717Z","iopub.execute_input":"2024-12-05T04:58:55.430195Z","iopub.status.idle":"2024-12-05T04:58:55.441222Z","shell.execute_reply.started":"2024-12-05T04:58:55.430156Z","shell.execute_reply":"2024-12-05T04:58:55.439875Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"submission","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T04:59:00.487151Z","iopub.execute_input":"2024-12-05T04:59:00.487611Z","iopub.status.idle":"2024-12-05T04:59:00.498756Z","shell.execute_reply.started":"2024-12-05T04:59:00.487573Z","shell.execute_reply":"2024-12-05T04:59:00.497459Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}