├── README.md ├── case ├── README.md └── iFood Data Analyst Case.pdf ├── data ├── README.md ├── customers_clustered.csv ├── customers_new_features_and_drop.csv ├── customers_new_features_and_drop_dummies.csv └── ml_project1_data.csv ├── images ├── comparing_models.png ├── pairplot_clusters.png └── pca_clusters.png ├── notebooks ├── 00_package_versions.ipynb ├── 01_eda.ipynb ├── 02_clustering.ipynb ├── 03_clustering_pca.ipynb ├── 04_classification.ipynb ├── 05_classification_logreg.ipynb └── auxiliary_functions.py └── reports └── eda.html /README.md: -------------------------------------------------------------------------------- 1 | [![author](https://img.shields.io/badge/Author-Francisco Bustamante-red.svg)](https://www.linkedin.com/in/flsbustamante/) 2 | [![](https://img.shields.io/badge/Python-3.11+-blue.svg)](https://www.python.org/) 3 | 4 | # Case iFood - Analista de dados 5 | 6 | Considere uma empresa bem estabelecida que atua no setor de varejo de alimentos. Atualmente, eles têm cerca de vários milhares de clientes registrados e atendem quase um milhão de consumidores por ano. Eles vendem produtos de 5 grandes categorias: vinhos, carnes, frutas exóticas, peixes especialmente preparados e produtos doces. Estes podem ser divididos ainda mais em produtos de *gold* e regulares. Os clientes podem encomendar e adquirir produtos por meio de 3 canais de vendas: lojas físicas, catálogos e site da empresa. Globalmente, a empresa teve receitas sólidas e uma linha de fundo saudável nos últimos 3 anos, mas as perspectivas de crescimento dos lucros para os próximos 3 anos não são promissoras... Por esse motivo, várias iniciativas estratégicas estão sendo consideradas para inverter essa situação. Um deles é melhorar o desempenho das atividades de marketing, com foco especial em campanhas de marketing. 7 | 8 | ![pairplot](images/pairplot_clusters.png) 9 | 10 | Projeto de ensino utilizado em curso de Ciência de Dados ministrado por mim para a [Hashtag Treinamentos](https://www.hashtagtreinamentos.com/). Baseado no processo seletivo para Analista de Dados do iFood disponível [neste repositório](https://github.com/ifood/ifood-data-business-analyst-test). 11 | 12 | Descrição completa do case [aqui](case/README.md). 13 | 14 |

15 | 16 |

17 | 18 | ## Objetivos 19 | 20 | O objetivo deste projeto é mostrar aos alunos como estruturar um projeto para um processo seletivo que foi aplicado na vida real. 21 | 22 | Durante o curso, mostrei a importância de realizar o pré-processamento dos dados, bem como a importância de se realizar a análise exploratória dos dados. Muito foi discutido sobre o que deve ser apresentado para em um documento técnico e o que deve ser apresentado em uma apresentação para um público não técnico. 23 | 24 | Objetivos detalhados: 25 | 26 | - Construir uma análise exploratória robusta. 27 | - Segmentar os clientes da base de dados fornecida. 28 | - Construir um modelo de classificação para prever se um cliente irá comprar o produto oferecido na campanha. 29 | - Apresentar uma estrutura de projeto de Ciência de Dados, com a utilização de notebooks, scripts, relatórios e repositório no GitHub. 30 | - Apresentar boas práticas de programação em Python, como a utilização de funções e arquivos de script para facilitar o reaproveitamento de código. 31 | - Mostrar boas práticas de uso do SciKit-Learn, como a utilização de pipelines e otimização de hiperparâmetros. 32 | 33 | ## Estrutura do repositório 34 | 35 | ``` 36 | ├── case 37 | ├── data 38 | ├── images 39 | ├── notebooks 40 | ├── reports 41 | ``` 42 | 43 | - Na pasta `data` estão os dados utilizados no projeto. O arquivo `ml_project1_data.csv` é o dataset utilizado originalmente. Os demais arquivos são os datasets gerados durante o projeto. 44 | - Na pasta `images` estão as imagens utilizadas neste README. 45 | - Na pasta `notebooks` estão os notebooks com o desenvolvimento do projeto. 46 | - Na pasta `reports` estão os relatórios gerados durante o projeto utilizando a biblioteca [ydata-profiling](https://github.com/ydataai/ydata-profiling). 47 | 48 | ## Detalhes do dataset utilizado e resumo dos resultados 49 | 50 | Uma descrição detalhada do dataset utilizado está disponível [aqui](data/README.md). 51 | 52 | Com um pipeline com pré-processamento, PCA e K-Means, a base foi segmentada em 3 clusters: 53 | 54 | ![clusters](images/pca_clusters.png) 55 | 56 | Análise por cluster: 57 | 58 | - Cluster 0: 59 | - Renda alta 60 | - gasto alto 61 | - muito provalmente não tem filhos 62 | - mais propenso a aceitar campanhas 63 | - cluster sem pessoas com escolaridade básica 64 | - sem um perfil de idade que se destaque 65 | 66 | - Cluster 1: 67 | - Renda baixa 68 | - gasto baixo 69 | - provalmente tem filhos 70 | - baixa propensão a aceitar campanhas 71 | - único cluster com porcentagem significativa de pessoas com escolaridade básica 72 | - pessoas mais jovens 73 | 74 | - Cluster 2: 75 | - Renda intermediária 76 | - gasto intermediário 77 | - provalmente tem filhos 78 | - pode aceitar campanhas 79 | - pessoas com idade mais elevada 80 | 81 | Posteriormente, três modelos de classificação foram treinados para prever se um cliente irá comprar o produto oferecido na campanha. Os modelos utilizados foram: 82 | 83 | - Regressão Logística 84 | - Decision Tree 85 | - KNN 86 | 87 | Um DummyClassifier foi utilizado como baseline. Os modelos foram comparados com base em 6 métricas: 88 | 89 | ![comparing_models](images/comparing_models.png) 90 | 91 | Com base nessa comparação, o modelo de Regressão Logística foi escolhido para passar por uma otimização de hiperparâmetros. 92 | 93 | ## Como reproduzir o projeto 94 | 95 | O projeto foi desenvolvido utilizando o Python 3.11.5. Para reproduzir o projeto, crie um ambiente virtual com o Conda, ou ferramenta similar, com o Python 3.11.5 e instale as bibliotecas abaixo: 96 | 97 | | Biblioteca | Versão | 98 | | ---------------- | ------ | 99 | | Imbalanced-Learn | 0.11.0 | 100 | | Matplotlib | 3.7.2 | 101 | | NumPy | 1.24.3 | 102 | | Pandas | 1.5.3 | 103 | | Scikit-Learn | 1.3.0 | 104 | | Seaborn | 0.12.2 | 105 | 106 | Essas são as bibliotecas principais utilizadas no projeto. O relatório foi gerado com a biblioteca [ydata-profiling](https://github.com/ydataai/ydata-profiling), instale-a se quiser reproduzir o relatório. 107 | -------------------------------------------------------------------------------- /case/README.md: -------------------------------------------------------------------------------- 1 | # Caso para Analista de Dados CRM - iFood 2 | 3 | Tradução do case original em inglês para português. O texto original está [neste arquivo PDF](./iFood%20Data%20Analyst%20Case.pdf) baixado do [repositório do GitHub da iFood](https://github.com/ifood/ifood-data-business-analyst-test) para este case. 4 | 5 | ## Texto de apresentação 6 | 7 | O iFood é o aplicativo líder de entrega de alimentos no Brasil, presente em mais de mil cidades. 8 | 9 | Manter um alto engajamento do cliente é fundamental para o crescimento e consolidação da empresa na posição como líder de mercado. 10 | 11 | Os analistas de dados que trabalham na equipe de dados são constantemente desafiados a fornecer insights e valor para a empresa por meio de projetos de escopo aberto. Este caso pretende simular isso. 12 | 13 | Neste case, você recebe um conjunto de dados de amostra, que simula metainformações sobre o cliente e as interações da campanha iFood com esse cliente. 14 | 15 | É seu desafio entender os dados, encontrar oportunidades e insights de negócios e propor qualquer ação orientada por dados para otimizar os resultados das campanhas e gerar valor para a empresa. 16 | 17 | Este case visa avaliar suas habilidades e conhecimentos em dados para duas funções possíveis: 18 | 19 | - Analista de dados de negócios: 20 | 21 | > Realizar uma análise exploratória robusta, rica em insights de negócios e propostas orientadas por dados para agregar valor à empresa. Ter fortes habilidades de comunicação para influenciar o tomada de decisão. 22 | 23 | - Analista de dados avançado: 24 | 25 | > Realizar uma análise exploratória robusta, usando ferramentas de análise avançada e métodos estatísticos, para gerar produtos de dados para otimizar os resultados dos negócios (modelos preditivos e de agrupamento, por exemplo). 26 | 27 | Tenha foco claro em qual função você deseja executar na iFood e concentre sua energia para se destacar em tópicos mais relevantes para isso. 28 | 29 | Abaixo você encontrará a descrição do caso e mais detalhes do que esperamos como sua solução. 30 | 31 | **Por favor, leia atentamente até a última página.** 32 | 33 | ## A empresa do case 34 | 35 | Considere uma empresa bem estabelecida que atua no setor de varejo de alimentos. Atualmente, eles têm milhares de clientes registrados e atendem quase um milhão de consumidores por ano. Eles vendem produtos de 5 grandes categorias: vinhos, carnes, frutas exóticas, peixes especialmente preparados e produtos doces. Estes podem ser divididos ainda mais em produtos *gold* e regulares. Os clientes podem encomendar e adquirir produtos por meio de 3 canais de vendas: lojas físicas, catálogos e site da empresa. Globalmente, a empresa teve receitas sólidas e uma linha de fundo saudável nos últimos 3 anos, mas as perspectivas de crescimento dos lucros para os próximos 3 anos não são promissoras... Por esse motivo, várias iniciativas estratégicas estão sendo consideradas para inverter essa situação. Um deles é melhorar o desempenho das atividades de marketing, com foco especial em campanhas de marketing. 36 | 37 | ## O departamento de marketing 38 | 39 | O departamento de marketing foi pressionado a gastar seu orçamento anual com mais sabedoria. O CMO percebe a importância de ter uma abordagem mais quantitativa ao tomar decisões, razão pela qual uma pequena equipe de cientistas de dados foi contratada com um objetivo claro em mente: construir um modelo preditivo que apoiará iniciativas de marketing direto. Desejavelmente, o sucesso dessas atividades provará o valor da abordagem e convencer os mais céticos dentro da empresa. 40 | 41 | ## O objetivo 42 | 43 | O objetivo da equipe é construir um modelo preditivo que produza o maior lucro para o próxima campanha de marketing direto, programada para o próximo mês. 44 | 45 | A nova campanha, sexta, visa vender um novo gadget para o Banco de Dados de Clientes. Para construir o modelo, uma campanha piloto envolvendo 2.240 clientes foi realizada. Os clientes foram selecionados aleatoriamente e contatados por telefone com relação à aquisição do gadget. Durante os meses seguintes, os clientes que compraram a oferta foram devidamente rotulados. 46 | 47 | O custo total da campanha de amostra foi de 6.720MU e a receita gerado pelos clientes que aceitaram a oferta foi de 3.674MU. Globalmente a campanha teve um lucro de -3.046MU. A taxa de sucesso da campanha foi de 15%. O objetivo da equipe é desenvolver um modelo que preveja o comportamento do cliente e aplicá-lo ao restante da base de clientes. Esperançosamente, o modelo permitirá que a empresa escolha os clientes que são mais propensos a comprar a oferta, deixando de fora os não respondentes, tornando a próxima campanha altamente lucrativa. 48 | 49 | Além disso, além de maximizar o lucro da campanha, o CMO está interessado em entender as características dos clientes que estão dispostos a comprar o gadget. 50 | 51 | ## Os dados 52 | 53 | O conjunto de dados contém recursos sociodemográficos e firmográficos sobre 2.240 clientes que foram contatados. Além disso, contém um rótulo para aqueles clientes que responderam à campanha, comprando o produto. 54 | 55 | Dicionário de dados disponível [na pasta `data`](../data/README.md). 56 | 57 | ## Entregáveis 58 | 59 | Os seguintes são os entregáveis mínimos necessários: 60 | 61 | 1. Explore os dados - seja criativo e preste atenção aos detalhes. Você precisa fornecer para a equipe de marketing uma melhor compreensão das características dos respondentes; 62 | 2. Crie e descreva uma segmentação de clientes com base no comportamento dos clientes; 63 | 3. Crie e descreva um modelo preditivo (classificação) que permita à empresa maximizar o lucro da próxima campanha de marketing. 64 | 65 | Como esperamos que sua solução seja enviada: 66 | 67 | 1. Um notebook detalhado e bem organizado (ou arquivo de código equivalente) a ser apresentado a partes técnicas interessadas. 68 | 2. Uma apresentação do PowerPoint (ou ferramenta similar) a ser apresentada às partes interessadas (stakeholders) do negócio. 69 | 70 | Você pode usar qualquer linguagem de programação para esta tarefa (usamos Python). 71 | 72 | Simplicidade e consciência do que está acontecendo é preferível a implementações de algoritmos complexos que você não domina. 73 | 74 | Se sua solução atender aos nossos critérios mínimos, você deve ser convidado para uma apresentação técnica / negócios. Soluções que não atendem aos nossos critérios, mas que mostram potencial, serão convidadas para uma reunião de feedback curta (30 min). 75 | 76 | Você deve receber uma resposta dentro de 1-2 semanas após o envio do caso. 77 | 78 | Se houver alguma dúvida, não hesite em nos contatar. 79 | -------------------------------------------------------------------------------- /case/iFood Data Analyst Case.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chicolucio/ifood-case-data-analyst/b3dfc7f0e5f3d3a6343c605d304ac4be4d1510af/case/iFood Data Analyst Case.pdf -------------------------------------------------------------------------------- /data/README.md: -------------------------------------------------------------------------------- 1 | ## Dicionário de dados 2 | 3 | Dados pessoais 4 | 5 | - `ID`: Identificador único do cliente 6 | - `Year_Birth`: Ano de nascimento do cliente 7 | - `Education`: Nível de educação do cliente 8 | - `Marital_Status`: Estado civil do cliente 9 | - `Income`: Renda anual da família do cliente 10 | - `Kidhome`: Número de crianças na casa do cliente 11 | - `Teenhome`: Número de adolescentes na casa do cliente 12 | - `Dt_Customer`: Data de inscrição do cliente na empresa 13 | - `Recency`: Número de dias desde a última compra do cliente 14 | - `Complain`: 1 se o cliente reclamou nos últimos 2 anos, 0 caso contrário 15 | 16 | Dados de produtos 17 | 18 | - `MntWines`: Valor gasto em vinho nos últimos 2 anos 19 | - `MntFruits`: Valor gasto em frutas nos últimos 2 anos 20 | - `MntMeatProducts`: Valor gasto em carne nos últimos 2 anos 21 | - `MntFishProducts`: Valor gasto em peixe nos últimos 2 anos 22 | - `MntSweetProducts`: Valor gasto em doces nos últimos 2 anos 23 | - `MntGoldProds`: Valor gasto em produtos *gold* nos últimos 2 anos 24 | 25 | Dados de campanha 26 | 27 | - `NumDealsPurchases`: Número de compras feitas com desconto 28 | - `AcceptedCmp1`: 1 se o cliente aceitou a oferta na 1ª campanha, 0 caso contrário 29 | - `AcceptedCmp2`: 1 se o cliente aceitou a oferta na 2ª campanha, 0 caso contrário 30 | - `AcceptedCmp3`: 1 se o cliente aceitou a oferta na 3ª campanha, 0 caso contrário 31 | - `AcceptedCmp4`: 1 se o cliente aceitou a oferta na 4ª campanha, 0 caso contrário 32 | - `AcceptedCmp5`: 1 se o cliente aceitou a oferta na 5ª campanha, 0 caso contrário 33 | - `Response`: 1 se o cliente aceitou a oferta na última campanha (piloto), 0 caso contrário (*target*) 34 | 35 | Dados de local de compra 36 | 37 | - `NumWebPurchases`: Número de compras feitas através do site da empresa 38 | - `NumCatalogPurchases`: Número de compras feitas usando um catálogo 39 | - `NumStorePurchases`: Número de compras feitas diretamente nas lojas 40 | - `NumWebVisitsMonth`: Número de visitas ao site da empresa no último mês 41 | -------------------------------------------------------------------------------- /images/comparing_models.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chicolucio/ifood-case-data-analyst/b3dfc7f0e5f3d3a6343c605d304ac4be4d1510af/images/comparing_models.png -------------------------------------------------------------------------------- /images/pairplot_clusters.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chicolucio/ifood-case-data-analyst/b3dfc7f0e5f3d3a6343c605d304ac4be4d1510af/images/pairplot_clusters.png -------------------------------------------------------------------------------- /images/pca_clusters.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chicolucio/ifood-case-data-analyst/b3dfc7f0e5f3d3a6343c605d304ac4be4d1510af/images/pca_clusters.png -------------------------------------------------------------------------------- /notebooks/00_package_versions.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Versions of the main packages used in this project" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 1, 13 | "metadata": {}, 14 | "outputs": [ 15 | { 16 | "name": "stdout", 17 | "output_type": "stream", 18 | "text": [ 19 | "Versions of the packages:\n", 20 | "\n", 21 | "-------------------- | ----------\n", 22 | " Package | Version \n", 23 | "-------------------- | ----------\n", 24 | "Imbalanced-Learn | 0.11.0\n", 25 | "Matplotlib | 3.7.2\n", 26 | "NumPy | 1.24.3\n", 27 | "Pandas | 1.5.3\n", 28 | "Scikit-Learn | 1.3.0\n", 29 | "Seaborn | 0.12.2\n", 30 | "\n", 31 | "Python version: 3.11.5\n" 32 | ] 33 | } 34 | ], 35 | "source": [ 36 | "import pandas as pd\n", 37 | "import matplotlib\n", 38 | "import seaborn as sns\n", 39 | "import numpy as np\n", 40 | "import sklearn\n", 41 | "import imblearn\n", 42 | "from platform import python_version\n", 43 | "\n", 44 | "packages = {\n", 45 | " \"Pandas\": pd,\n", 46 | " \"Matplotlib\": matplotlib,\n", 47 | " \"Seaborn\": sns,\n", 48 | " \"NumPy\": np,\n", 49 | " \"Scikit-Learn\": sklearn,\n", 50 | " \"Imbalanced-Learn\": imblearn,\n", 51 | "}\n", 52 | "\n", 53 | "print(\"Versions of the packages:\\n\")\n", 54 | "print(f\"{'':-^20} | {'':-^10}\")\n", 55 | "print(f\"{'Package':^20} | {'Version':^10}\")\n", 56 | "print(f\"{'':-^20} | {'':-^10}\")\n", 57 | "\n", 58 | "for name, package in sorted(packages.items()):\n", 59 | " print(f\"{name:<20} | {package.__version__:>10}\")\n", 60 | "\n", 61 | "print()\n", 62 | "print(f\"Python version: {python_version()}\")" 63 | ] 64 | } 65 | ], 66 | "metadata": { 67 | "kernelspec": { 68 | "display_name": "Python 3 (ipykernel)", 69 | "language": "python", 70 | "name": "python3" 71 | }, 72 | "language_info": { 73 | "codemirror_mode": { 74 | "name": "ipython", 75 | "version": 3 76 | }, 77 | "file_extension": ".py", 78 | "mimetype": "text/x-python", 79 | "name": "python", 80 | "nbconvert_exporter": "python", 81 | "pygments_lexer": "ipython3", 82 | "version": "3.11.5" 83 | } 84 | }, 85 | "nbformat": 4, 86 | "nbformat_minor": 4 87 | } 88 | -------------------------------------------------------------------------------- /notebooks/04_classification.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "id": "44364423", 6 | "metadata": {}, 7 | "source": [ 8 | "# Predictive model for classification" 9 | ] 10 | }, 11 | { 12 | "cell_type": "code", 13 | "execution_count": 1, 14 | "id": "db792e4c-e769-499d-b4f2-f4935d90f6c9", 15 | "metadata": {}, 16 | "outputs": [ 17 | { 18 | "data": { 19 | "text/html": [ 20 | "
\n", 21 | "\n", 34 | "\n", 35 | " \n", 36 | " \n", 37 | " \n", 38 | " \n", 39 | " \n", 40 | " \n", 41 | " \n", 42 | " \n", 43 | " \n", 44 | " \n", 45 | " \n", 46 | " \n", 47 | " \n", 48 | " \n", 49 | " \n", 50 | " \n", 51 | " \n", 52 | " \n", 53 | " \n", 54 | " \n", 55 | " \n", 56 | " \n", 57 | " \n", 58 | " \n", 59 | " \n", 60 | " \n", 61 | " \n", 62 | " \n", 63 | " \n", 64 | " \n", 65 | " \n", 66 | " \n", 67 | " \n", 68 | " \n", 69 | " \n", 70 | " \n", 71 | " \n", 72 | " \n", 73 | " \n", 74 | " \n", 75 | " \n", 76 | " \n", 77 | " \n", 78 | " \n", 79 | " \n", 80 | " \n", 81 | " \n", 82 | " \n", 83 | " \n", 84 | " \n", 85 | " \n", 86 | " \n", 87 | " \n", 88 | " \n", 89 | " \n", 90 | " \n", 91 | " \n", 92 | " \n", 93 | " \n", 94 | " \n", 95 | " \n", 96 | " \n", 97 | " \n", 98 | " \n", 99 | " \n", 100 | " \n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | " \n", 105 | " \n", 106 | " \n", 107 | " \n", 108 | " \n", 109 | " \n", 110 | " \n", 111 | " \n", 112 | " \n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " \n", 117 | " \n", 118 | " \n", 119 | " \n", 120 | " \n", 121 | " \n", 122 | " \n", 123 | " \n", 124 | " \n", 125 | " \n", 126 | " \n", 127 | " \n", 128 | " \n", 129 | " \n", 130 | " \n", 131 | " \n", 132 | " \n", 133 | " \n", 134 | " \n", 135 | " \n", 136 | " \n", 137 | " \n", 138 | " \n", 139 | " \n", 140 | " \n", 141 | " \n", 142 | " \n", 143 | " \n", 144 | " \n", 145 | " \n", 146 | " \n", 147 | " \n", 148 | " \n", 149 | " \n", 150 | " \n", 151 | " \n", 152 | " \n", 153 | " \n", 154 | " \n", 155 | " \n", 156 | " \n", 157 | " \n", 158 | " \n", 159 | " \n", 160 | " \n", 161 | " \n", 162 | " \n", 163 | " \n", 164 | " \n", 165 | " \n", 166 | " \n", 167 | " \n", 168 | " \n", 169 | " \n", 170 | " \n", 171 | " \n", 172 | " \n", 173 | " \n", 174 | " \n", 175 | " \n", 176 | " \n", 177 | " \n", 178 | " \n", 179 | " \n", 180 | " \n", 181 | " \n", 182 | " \n", 183 | "
EducationMarital_StatusIncomeKidhomeTeenhomeRecencyMntWinesMntFruitsMntMeatProductsMntFishProducts...AgeAgeGroupMntTotalMntRegularProdsChildrenHasChildrenAcceptedCmpTotalHasAcceptedCmpNumTotalPurchasescluster
0GraduationSingle58138.0005863588546172...5746-60161715290000220
1GraduationSingle46344.0113811162...6046-602721210041
2GraduationPartner71613.0002642649127111...4946-607767340000200
3GraduationPartner26646.010261142010...3018-305348110061
4PhDPartner58293.010941734311846...3331-454224071100142
\n", 184 | "

5 rows × 36 columns

\n", 185 | "
" 186 | ], 187 | "text/plain": [ 188 | " Education Marital_Status Income Kidhome Teenhome Recency MntWines \\\n", 189 | "0 Graduation Single 58138.0 0 0 58 635 \n", 190 | "1 Graduation Single 46344.0 1 1 38 11 \n", 191 | "2 Graduation Partner 71613.0 0 0 26 426 \n", 192 | "3 Graduation Partner 26646.0 1 0 26 11 \n", 193 | "4 PhD Partner 58293.0 1 0 94 173 \n", 194 | "\n", 195 | " MntFruits MntMeatProducts MntFishProducts ... Age AgeGroup MntTotal \\\n", 196 | "0 88 546 172 ... 57 46-60 1617 \n", 197 | "1 1 6 2 ... 60 46-60 27 \n", 198 | "2 49 127 111 ... 49 46-60 776 \n", 199 | "3 4 20 10 ... 30 18-30 53 \n", 200 | "4 43 118 46 ... 33 31-45 422 \n", 201 | "\n", 202 | " MntRegularProds Children HasChildren AcceptedCmpTotal HasAcceptedCmp \\\n", 203 | "0 1529 0 0 0 0 \n", 204 | "1 21 2 1 0 0 \n", 205 | "2 734 0 0 0 0 \n", 206 | "3 48 1 1 0 0 \n", 207 | "4 407 1 1 0 0 \n", 208 | "\n", 209 | " NumTotalPurchases cluster \n", 210 | "0 22 0 \n", 211 | "1 4 1 \n", 212 | "2 20 0 \n", 213 | "3 6 1 \n", 214 | "4 14 2 \n", 215 | "\n", 216 | "[5 rows x 36 columns]" 217 | ] 218 | }, 219 | "execution_count": 1, 220 | "metadata": {}, 221 | "output_type": "execute_result" 222 | } 223 | ], 224 | "source": [ 225 | "import pandas as pd\n", 226 | "\n", 227 | "DATA = \"../data/customers_clustered.csv\"\n", 228 | "\n", 229 | "df_clustered = pd.read_csv(DATA)\n", 230 | "df_clustered.head()" 231 | ] 232 | }, 233 | { 234 | "cell_type": "code", 235 | "execution_count": 2, 236 | "id": "c7563037-cca2-4d44-ab90-9cc08c4c3bad", 237 | "metadata": {}, 238 | "outputs": [ 239 | { 240 | "name": "stdout", 241 | "output_type": "stream", 242 | "text": [ 243 | "\n", 244 | "RangeIndex: 2205 entries, 0 to 2204\n", 245 | "Data columns (total 36 columns):\n", 246 | " # Column Non-Null Count Dtype \n", 247 | "--- ------ -------------- ----- \n", 248 | " 0 Education 2205 non-null object \n", 249 | " 1 Marital_Status 2205 non-null object \n", 250 | " 2 Income 2205 non-null float64\n", 251 | " 3 Kidhome 2205 non-null int64 \n", 252 | " 4 Teenhome 2205 non-null int64 \n", 253 | " 5 Recency 2205 non-null int64 \n", 254 | " 6 MntWines 2205 non-null int64 \n", 255 | " 7 MntFruits 2205 non-null int64 \n", 256 | " 8 MntMeatProducts 2205 non-null int64 \n", 257 | " 9 MntFishProducts 2205 non-null int64 \n", 258 | " 10 MntSweetProducts 2205 non-null int64 \n", 259 | " 11 MntGoldProds 2205 non-null int64 \n", 260 | " 12 NumDealsPurchases 2205 non-null int64 \n", 261 | " 13 NumWebPurchases 2205 non-null int64 \n", 262 | " 14 NumCatalogPurchases 2205 non-null int64 \n", 263 | " 15 NumStorePurchases 2205 non-null int64 \n", 264 | " 16 NumWebVisitsMonth 2205 non-null int64 \n", 265 | " 17 AcceptedCmp3 2205 non-null int64 \n", 266 | " 18 AcceptedCmp4 2205 non-null int64 \n", 267 | " 19 AcceptedCmp5 2205 non-null int64 \n", 268 | " 20 AcceptedCmp1 2205 non-null int64 \n", 269 | " 21 AcceptedCmp2 2205 non-null int64 \n", 270 | " 22 Complain 2205 non-null int64 \n", 271 | " 23 Response 2205 non-null int64 \n", 272 | " 24 DaysSinceEnrolled 2205 non-null int64 \n", 273 | " 25 YearsSinceEnrolled 2205 non-null int64 \n", 274 | " 26 Age 2205 non-null int64 \n", 275 | " 27 AgeGroup 2205 non-null object \n", 276 | " 28 MntTotal 2205 non-null int64 \n", 277 | " 29 MntRegularProds 2205 non-null int64 \n", 278 | " 30 Children 2205 non-null int64 \n", 279 | " 31 HasChildren 2205 non-null int64 \n", 280 | " 32 AcceptedCmpTotal 2205 non-null int64 \n", 281 | " 33 HasAcceptedCmp 2205 non-null int64 \n", 282 | " 34 NumTotalPurchases 2205 non-null int64 \n", 283 | " 35 cluster 2205 non-null int64 \n", 284 | "dtypes: float64(1), int64(32), object(3)\n", 285 | "memory usage: 620.3+ KB\n" 286 | ] 287 | } 288 | ], 289 | "source": [ 290 | "df_clustered.info()" 291 | ] 292 | }, 293 | { 294 | "cell_type": "code", 295 | "execution_count": 3, 296 | "id": "f9558b20-ad8c-4589-8de5-05a2add03aa4", 297 | "metadata": {}, 298 | "outputs": [], 299 | "source": [ 300 | "X = df_clustered.drop(\"Response\", axis=1)\n", 301 | "y = df_clustered[\"Response\"]" 302 | ] 303 | }, 304 | { 305 | "cell_type": "code", 306 | "execution_count": 4, 307 | "id": "a440e7b9-07d6-4a0d-8742-91b472abf3ac", 308 | "metadata": {}, 309 | "outputs": [ 310 | { 311 | "data": { 312 | "text/html": [ 313 | "
\n", 314 | "\n", 327 | "\n", 328 | " \n", 329 | " \n", 330 | " \n", 331 | " \n", 332 | " \n", 333 | " \n", 334 | " \n", 335 | " \n", 336 | " \n", 337 | " \n", 338 | " \n", 339 | " \n", 340 | " \n", 341 | " \n", 342 | " \n", 343 | " \n", 344 | " \n", 345 | " \n", 346 | " \n", 347 | " \n", 348 | " \n", 349 | " \n", 350 | " \n", 351 | " \n", 352 | " \n", 353 | " \n", 354 | " \n", 355 | " \n", 356 | " \n", 357 | " \n", 358 | " \n", 359 | " \n", 360 | " \n", 361 | " \n", 362 | " \n", 363 | " \n", 364 | " \n", 365 | " \n", 366 | " \n", 367 | " \n", 368 | " \n", 369 | " \n", 370 | " \n", 371 | " \n", 372 | " \n", 373 | " \n", 374 | " \n", 375 | " \n", 376 | " \n", 377 | " \n", 378 | " \n", 379 | " \n", 380 | " \n", 381 | " \n", 382 | " \n", 383 | " \n", 384 | " \n", 385 | " \n", 386 | " \n", 387 | " \n", 388 | " \n", 389 | " \n", 390 | " \n", 391 | " \n", 392 | " \n", 393 | " \n", 394 | " \n", 395 | " \n", 396 | " \n", 397 | " \n", 398 | " \n", 399 | " \n", 400 | " \n", 401 | " \n", 402 | " \n", 403 | " \n", 404 | " \n", 405 | " \n", 406 | " \n", 407 | " \n", 408 | " \n", 409 | " \n", 410 | " \n", 411 | " \n", 412 | " \n", 413 | " \n", 414 | " \n", 415 | " \n", 416 | " \n", 417 | " \n", 418 | " \n", 419 | " \n", 420 | " \n", 421 | " \n", 422 | " \n", 423 | " \n", 424 | " \n", 425 | " \n", 426 | " \n", 427 | " \n", 428 | " \n", 429 | " \n", 430 | " \n", 431 | " \n", 432 | " \n", 433 | " \n", 434 | " \n", 435 | " \n", 436 | " \n", 437 | " \n", 438 | " \n", 439 | " \n", 440 | " \n", 441 | " \n", 442 | " \n", 443 | " \n", 444 | " \n", 445 | " \n", 446 | " \n", 447 | " \n", 448 | " \n", 449 | " \n", 450 | " \n", 451 | " \n", 452 | " \n", 453 | " \n", 454 | " \n", 455 | " \n", 456 | " \n", 457 | " \n", 458 | " \n", 459 | " \n", 460 | " \n", 461 | " \n", 462 | " \n", 463 | " \n", 464 | " \n", 465 | " \n", 466 | " \n", 467 | " \n", 468 | " \n", 469 | " \n", 470 | " \n", 471 | " \n", 472 | " \n", 473 | " \n", 474 | " \n", 475 | " \n", 476 | "
EducationMarital_StatusIncomeKidhomeTeenhomeRecencyMntWinesMntFruitsMntMeatProductsMntFishProducts...AgeAgeGroupMntTotalMntRegularProdsChildrenHasChildrenAcceptedCmpTotalHasAcceptedCmpNumTotalPurchasescluster
0GraduationSingle58138.0005863588546172...5746-60161715290000220
1GraduationSingle46344.0113811162...6046-602721210041
2GraduationPartner71613.0002642649127111...4946-607767340000200
3GraduationPartner26646.010261142010...3018-305348110061
4PhDPartner58293.010941734311846...3331-454224071100142
\n", 477 | "

5 rows × 35 columns

\n", 478 | "
" 479 | ], 480 | "text/plain": [ 481 | " Education Marital_Status Income Kidhome Teenhome Recency MntWines \\\n", 482 | "0 Graduation Single 58138.0 0 0 58 635 \n", 483 | "1 Graduation Single 46344.0 1 1 38 11 \n", 484 | "2 Graduation Partner 71613.0 0 0 26 426 \n", 485 | "3 Graduation Partner 26646.0 1 0 26 11 \n", 486 | "4 PhD Partner 58293.0 1 0 94 173 \n", 487 | "\n", 488 | " MntFruits MntMeatProducts MntFishProducts ... Age AgeGroup MntTotal \\\n", 489 | "0 88 546 172 ... 57 46-60 1617 \n", 490 | "1 1 6 2 ... 60 46-60 27 \n", 491 | "2 49 127 111 ... 49 46-60 776 \n", 492 | "3 4 20 10 ... 30 18-30 53 \n", 493 | "4 43 118 46 ... 33 31-45 422 \n", 494 | "\n", 495 | " MntRegularProds Children HasChildren AcceptedCmpTotal HasAcceptedCmp \\\n", 496 | "0 1529 0 0 0 0 \n", 497 | "1 21 2 1 0 0 \n", 498 | "2 734 0 0 0 0 \n", 499 | "3 48 1 1 0 0 \n", 500 | "4 407 1 1 0 0 \n", 501 | "\n", 502 | " NumTotalPurchases cluster \n", 503 | "0 22 0 \n", 504 | "1 4 1 \n", 505 | "2 20 0 \n", 506 | "3 6 1 \n", 507 | "4 14 2 \n", 508 | "\n", 509 | "[5 rows x 35 columns]" 510 | ] 511 | }, 512 | "execution_count": 4, 513 | "metadata": {}, 514 | "output_type": "execute_result" 515 | } 516 | ], 517 | "source": [ 518 | "X.head()" 519 | ] 520 | }, 521 | { 522 | "cell_type": "code", 523 | "execution_count": 5, 524 | "id": "296e16e5-c41c-4954-a535-d60e3f34fe4c", 525 | "metadata": {}, 526 | "outputs": [ 527 | { 528 | "data": { 529 | "text/plain": [ 530 | "0 1\n", 531 | "1 0\n", 532 | "2 0\n", 533 | "3 0\n", 534 | "4 0\n", 535 | "Name: Response, dtype: int64" 536 | ] 537 | }, 538 | "execution_count": 5, 539 | "metadata": {}, 540 | "output_type": "execute_result" 541 | } 542 | ], 543 | "source": [ 544 | "y.head()" 545 | ] 546 | }, 547 | { 548 | "cell_type": "code", 549 | "execution_count": 6, 550 | "id": "fb0af0de-f0d5-4d97-a60a-504f8bc7469c", 551 | "metadata": {}, 552 | "outputs": [], 553 | "source": [ 554 | "one_hot_cols = [\n", 555 | " \"Education\",\n", 556 | " \"Marital_Status\",\n", 557 | " \"AgeGroup\",\n", 558 | " \"HasChildren\",\n", 559 | " \"HasAcceptedCmp\",\n", 560 | " \"AcceptedCmp1\",\n", 561 | " \"AcceptedCmp2\",\n", 562 | " \"AcceptedCmp3\",\n", 563 | " \"AcceptedCmp4\",\n", 564 | " \"AcceptedCmp5\",\n", 565 | " \"Complain\",\n", 566 | " \"Kidhome\",\n", 567 | " \"Teenhome\",\n", 568 | " \"YearsSinceEnrolled\",\n", 569 | " \"Children\",\n", 570 | " \"AcceptedCmpTotal\",\n", 571 | " \"cluster\"\n", 572 | "]\n", 573 | "\n", 574 | "standard_cols = [\n", 575 | " \"Income\",\n", 576 | " \"Age\",\n", 577 | "]\n", 578 | "\n", 579 | "power_cols = X.columns[\n", 580 | " X.columns.str.startswith(\"Mnt\") | X.columns.str.startswith(\"Num\")\n", 581 | "].tolist()\n", 582 | "\n", 583 | "minmax_cols = [\n", 584 | " col for col in X.columns if col not in one_hot_cols + standard_cols + power_cols\n", 585 | "]" 586 | ] 587 | }, 588 | { 589 | "cell_type": "markdown", 590 | "id": "fe184d19-7480-40c1-8252-b5cc0639eb73", 591 | "metadata": {}, 592 | "source": [ 593 | "https://scikit-learn.org/stable/modules/generated/sklearn.dummy.DummyClassifier.html" 594 | ] 595 | }, 596 | { 597 | "cell_type": "markdown", 598 | "id": "ee169eaf-0184-480d-bfb1-09922d87e8b2", 599 | "metadata": {}, 600 | "source": [ 601 | "**ALUNOS**: Expliquem brevemente cada modelo e o papel do DummyClassifier. Expliquem o papel da função e de cada etapa do pipeline." 602 | ] 603 | }, 604 | { 605 | "cell_type": "code", 606 | "execution_count": 7, 607 | "id": "135cadb4-9776-4217-bf20-933147f355ed", 608 | "metadata": {}, 609 | "outputs": [], 610 | "source": [ 611 | "from sklearn.preprocessing import (\n", 612 | " OneHotEncoder,\n", 613 | " StandardScaler,\n", 614 | " MinMaxScaler,\n", 615 | " PowerTransformer,\n", 616 | ")\n", 617 | "from sklearn.compose import ColumnTransformer\n", 618 | "from sklearn.dummy import DummyClassifier\n", 619 | "from sklearn.linear_model import LogisticRegression\n", 620 | "from sklearn.neighbors import KNeighborsClassifier\n", 621 | "from sklearn.tree import DecisionTreeClassifier\n", 622 | "from sklearn.model_selection import StratifiedKFold\n", 623 | "from imblearn.pipeline import Pipeline # atenção para o Pipeline do ImbLearn\n", 624 | "from sklearn.feature_selection import SelectKBest, f_classif\n", 625 | "from imblearn.under_sampling import RandomUnderSampler\n", 626 | "from sklearn.model_selection import cross_validate\n", 627 | "\n", 628 | "RANDOM_STATE = 42\n", 629 | "\n", 630 | "models = {\n", 631 | " \"DummyClassifier\": DummyClassifier(\n", 632 | " strategy=\"stratified\", random_state=RANDOM_STATE\n", 633 | " ),\n", 634 | " \"DecisionTreeClassifier\": DecisionTreeClassifier(random_state=RANDOM_STATE),\n", 635 | " \"LogisticRegression\": LogisticRegression(random_state=RANDOM_STATE),\n", 636 | " \"KNNClassifier\": KNeighborsClassifier(n_neighbors=5),\n", 637 | "}\n", 638 | "\n", 639 | "skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=RANDOM_STATE)\n", 640 | "\n", 641 | "\n", 642 | "def pipeline_model(X, y, model, kf):\n", 643 | " preprocessing = ColumnTransformer(\n", 644 | " [\n", 645 | " (\"one-hot\", OneHotEncoder(), one_hot_cols),\n", 646 | " (\"standard\", StandardScaler(), standard_cols),\n", 647 | " (\"minmax\", MinMaxScaler(), minmax_cols),\n", 648 | " (\"power\", PowerTransformer(), power_cols),\n", 649 | " ]\n", 650 | " )\n", 651 | "\n", 652 | " pipeline = Pipeline(\n", 653 | " [\n", 654 | " (\"preprocessing\", preprocessing),\n", 655 | " (\"feature_selection\", SelectKBest(score_func=f_classif, k=10)),\n", 656 | " (\"rus\", RandomUnderSampler(random_state=RANDOM_STATE)),\n", 657 | " (\"model\", model),\n", 658 | " ]\n", 659 | " )\n", 660 | "\n", 661 | " scores = cross_validate(\n", 662 | " pipeline,\n", 663 | " X,\n", 664 | " y,\n", 665 | " cv=kf,\n", 666 | " scoring=[\"accuracy\", \"precision\", \"recall\", \"roc_auc\", \"average_precision\"],\n", 667 | " n_jobs=-1,\n", 668 | " )\n", 669 | "\n", 670 | " return scores" 671 | ] 672 | }, 673 | { 674 | "cell_type": "code", 675 | "execution_count": 8, 676 | "id": "acbfb266-0558-4211-95e7-5529086fef85", 677 | "metadata": {}, 678 | "outputs": [], 679 | "source": [ 680 | "results = {\n", 681 | " \"DummyClassifier\": pipeline_model(X, y, models[\"DummyClassifier\"], skf),\n", 682 | " \"DecisionTreeClassifier\": pipeline_model(X, y, models[\"DecisionTreeClassifier\"], skf),\n", 683 | " \"LogisticRegression\": pipeline_model(X, y, models[\"LogisticRegression\"], skf),\n", 684 | " \"KNNClassifier\": pipeline_model(X, y, models[\"KNNClassifier\"], skf),\n", 685 | "}" 686 | ] 687 | }, 688 | { 689 | "cell_type": "markdown", 690 | "id": "633f87e0-73f0-407d-bf41-85753b89a2da", 691 | "metadata": {}, 692 | "source": [ 693 | "**ALUNOS**: Expliquem a estrutura dos resultados" 694 | ] 695 | }, 696 | { 697 | "cell_type": "code", 698 | "execution_count": 9, 699 | "id": "0a7e55aa-9317-417a-bfde-2f58595fe012", 700 | "metadata": {}, 701 | "outputs": [ 702 | { 703 | "name": "stdout", 704 | "output_type": "stream", 705 | "text": [ 706 | "{'DecisionTreeClassifier': {'fit_time': array([0.05351782, 0.05652118, 0.0586369 , 0.05717325, 0.0555172 ]),\n", 707 | " 'score_time': array([0.02500582, 0.02500558, 0.0230062 , 0.0230062 , 0.02300525]),\n", 708 | " 'test_accuracy': array([0.82539683, 0.82993197, 0.82993197, 0.81179138, 0.6893424 ]),\n", 709 | " 'test_average_precision': array([0.3683831 , 0.38016844, 0.3602606 , 0.43117226, 0.22619856]),\n", 710 | " 'test_precision': array([0.43243243, 0.44444444, 0.44871795, 0.40229885, 0.26797386]),\n", 711 | " 'test_recall': array([0.47761194, 0.47761194, 0.52238806, 0.53030303, 0.62121212]),\n", 712 | " 'test_roc_auc': array([0.68534999, 0.70773805, 0.73826722, 0.71830303, 0.66331313])},\n", 713 | " 'DummyClassifier': {'fit_time': array([0.06235242, 0.06004643, 0.05734229, 0.05603647, 0.06604815]),\n", 714 | " 'score_time': array([0.02356434, 0.02305984, 0.02206874, 0.02507019, 0.02548385]),\n", 715 | " 'test_accuracy': array([0.51247166, 0.50340136, 0.50340136, 0.48752834, 0.51020408]),\n", 716 | " 'test_average_precision': array([0.15304952, 0.14865734, 0.14865734, 0.14004965, 0.14959821]),\n", 717 | " 'test_precision': array([0.15420561, 0.14485981, 0.14485981, 0.12616822, 0.14953271]),\n", 718 | " 'test_recall': array([0.49253731, 0.46268657, 0.46268657, 0.40909091, 0.48484848]),\n", 719 | " 'test_roc_auc': array([0.50429005, 0.48669088, 0.48669088, 0.45521212, 0.49975758])},\n", 720 | " 'KNNClassifier': {'fit_time': array([0.04813838, 0.05732417, 0.06881571, 0.06680608, 0.0679822 ]),\n", 721 | " 'score_time': array([0.04064083, 0.04641795, 0.04256392, 0.04356384, 0.041924 ]),\n", 722 | " 'test_accuracy': array([0.85034014, 0.85260771, 0.85487528, 0.87528345, 0.73696145]),\n", 723 | " 'test_average_precision': array([0.28352581, 0.3012184 , 0.25258946, 0.36341931, 0.37904536]),\n", 724 | " 'test_precision': array([0.51724138, 0.53333333, 0.56521739, 0.82352941, 0.33108108]),\n", 725 | " 'test_recall': array([0.2238806 , 0.23880597, 0.19402985, 0.21212121, 0.74242424]),\n", 726 | " 'test_roc_auc': array([0.60130497, 0.60300104, 0.60617368, 0.64371717, 0.77177778])},\n", 727 | " 'LogisticRegression': {'fit_time': array([0.0633111 , 0.0629077 , 0.05869746, 0.05842352, 0.05888581]),\n", 728 | " 'score_time': array([0.02791905, 0.02389789, 0.02591419, 0.02481747, 0.0238843 ]),\n", 729 | " 'test_accuracy': array([0.7845805 , 0.82993197, 0.82993197, 0.81405896, 0.83673469]),\n", 730 | " 'test_average_precision': array([0.38198141, 0.41502673, 0.36325137, 0.40981808, 0.50652827]),\n", 731 | " 'test_precision': array([0.35106383, 0.44444444, 0.45 , 0.40909091, 0.46666667]),\n", 732 | " 'test_recall': array([0.49253731, 0.47761194, 0.53731343, 0.54545455, 0.63636364]),\n", 733 | " 'test_roc_auc': array([0.68570915, 0.70831671, 0.73858648, 0.71888889, 0.79476768])}}\n" 734 | ] 735 | } 736 | ], 737 | "source": [ 738 | "from pprint import pprint\n", 739 | "\n", 740 | "pprint(results)" 741 | ] 742 | }, 743 | { 744 | "cell_type": "code", 745 | "execution_count": 10, 746 | "id": "bca123b3-1654-49f1-abde-1ce2a4ebb2fb", 747 | "metadata": {}, 748 | "outputs": [ 749 | { 750 | "name": "stdout", 751 | "output_type": "stream", 752 | "text": [ 753 | "{'DecisionTreeClassifier': {'fit_time': array([0.05351782, 0.05652118, 0.0586369 , 0.05717325, 0.0555172 ]),\n", 754 | " 'score_time': array([0.02500582, 0.02500558, 0.0230062 , 0.0230062 , 0.02300525]),\n", 755 | " 'test_accuracy': array([0.82539683, 0.82993197, 0.82993197, 0.81179138, 0.6893424 ]),\n", 756 | " 'test_average_precision': array([0.3683831 , 0.38016844, 0.3602606 , 0.43117226, 0.22619856]),\n", 757 | " 'test_precision': array([0.43243243, 0.44444444, 0.44871795, 0.40229885, 0.26797386]),\n", 758 | " 'test_recall': array([0.47761194, 0.47761194, 0.52238806, 0.53030303, 0.62121212]),\n", 759 | " 'test_roc_auc': array([0.68534999, 0.70773805, 0.73826722, 0.71830303, 0.66331313]),\n", 760 | " 'time': array([0.07852364, 0.08152676, 0.0816431 , 0.08017945, 0.07852244])},\n", 761 | " 'DummyClassifier': {'fit_time': array([0.06235242, 0.06004643, 0.05734229, 0.05603647, 0.06604815]),\n", 762 | " 'score_time': array([0.02356434, 0.02305984, 0.02206874, 0.02507019, 0.02548385]),\n", 763 | " 'test_accuracy': array([0.51247166, 0.50340136, 0.50340136, 0.48752834, 0.51020408]),\n", 764 | " 'test_average_precision': array([0.15304952, 0.14865734, 0.14865734, 0.14004965, 0.14959821]),\n", 765 | " 'test_precision': array([0.15420561, 0.14485981, 0.14485981, 0.12616822, 0.14953271]),\n", 766 | " 'test_recall': array([0.49253731, 0.46268657, 0.46268657, 0.40909091, 0.48484848]),\n", 767 | " 'test_roc_auc': array([0.50429005, 0.48669088, 0.48669088, 0.45521212, 0.49975758]),\n", 768 | " 'time': array([0.08591676, 0.08310628, 0.07941103, 0.08110666, 0.09153199])},\n", 769 | " 'KNNClassifier': {'fit_time': array([0.04813838, 0.05732417, 0.06881571, 0.06680608, 0.0679822 ]),\n", 770 | " 'score_time': array([0.04064083, 0.04641795, 0.04256392, 0.04356384, 0.041924 ]),\n", 771 | " 'test_accuracy': array([0.85034014, 0.85260771, 0.85487528, 0.87528345, 0.73696145]),\n", 772 | " 'test_average_precision': array([0.28352581, 0.3012184 , 0.25258946, 0.36341931, 0.37904536]),\n", 773 | " 'test_precision': array([0.51724138, 0.53333333, 0.56521739, 0.82352941, 0.33108108]),\n", 774 | " 'test_recall': array([0.2238806 , 0.23880597, 0.19402985, 0.21212121, 0.74242424]),\n", 775 | " 'test_roc_auc': array([0.60130497, 0.60300104, 0.60617368, 0.64371717, 0.77177778]),\n", 776 | " 'time': array([0.08877921, 0.10374212, 0.11137962, 0.11036992, 0.1099062 ])},\n", 777 | " 'LogisticRegression': {'fit_time': array([0.0633111 , 0.0629077 , 0.05869746, 0.05842352, 0.05888581]),\n", 778 | " 'score_time': array([0.02791905, 0.02389789, 0.02591419, 0.02481747, 0.0238843 ]),\n", 779 | " 'test_accuracy': array([0.7845805 , 0.82993197, 0.82993197, 0.81405896, 0.83673469]),\n", 780 | " 'test_average_precision': array([0.38198141, 0.41502673, 0.36325137, 0.40981808, 0.50652827]),\n", 781 | " 'test_precision': array([0.35106383, 0.44444444, 0.45 , 0.40909091, 0.46666667]),\n", 782 | " 'test_recall': array([0.49253731, 0.47761194, 0.53731343, 0.54545455, 0.63636364]),\n", 783 | " 'test_roc_auc': array([0.68570915, 0.70831671, 0.73858648, 0.71888889, 0.79476768]),\n", 784 | " 'time': array([0.09123015, 0.08680558, 0.08461165, 0.08324099, 0.08277011])}}\n" 785 | ] 786 | } 787 | ], 788 | "source": [ 789 | "for k, v in results.items():\n", 790 | " results[k][\"time\"] = results[k][\"fit_time\"] + results[k][\"score_time\"]\n", 791 | "\n", 792 | "pprint(results)" 793 | ] 794 | }, 795 | { 796 | "cell_type": "markdown", 797 | "id": "6191f864-385d-4d74-be69-37a0fc0ac8e3", 798 | "metadata": {}, 799 | "source": [ 800 | "**ALUNOS**: Expliquem os procedimentos para gerar o DataFrame com os resultados." 801 | ] 802 | }, 803 | { 804 | "cell_type": "code", 805 | "execution_count": 11, 806 | "id": "5ae4a5ab-0a68-4011-9e4e-c646c8afe3b1", 807 | "metadata": {}, 808 | "outputs": [ 809 | { 810 | "data": { 811 | "text/html": [ 812 | "
\n", 813 | "\n", 826 | "\n", 827 | " \n", 828 | " \n", 829 | " \n", 830 | " \n", 831 | " \n", 832 | " \n", 833 | " \n", 834 | " \n", 835 | " \n", 836 | " \n", 837 | " \n", 838 | " \n", 839 | " \n", 840 | " \n", 841 | " \n", 842 | " \n", 843 | " \n", 844 | " \n", 845 | " \n", 846 | " \n", 847 | " \n", 848 | " \n", 849 | " \n", 850 | " \n", 851 | " \n", 852 | " \n", 853 | " \n", 854 | " \n", 855 | " \n", 856 | " \n", 857 | " \n", 858 | " \n", 859 | " \n", 860 | " \n", 861 | " \n", 862 | " \n", 863 | " \n", 864 | " \n", 865 | " \n", 866 | " \n", 867 | " \n", 868 | " \n", 869 | " \n", 870 | " \n", 871 | " \n", 872 | " \n", 873 | " \n", 874 | " \n", 875 | " \n", 876 | " \n", 877 | " \n", 878 | " \n", 879 | " \n", 880 | " \n", 881 | " \n", 882 | " \n", 883 | " \n", 884 | " \n", 885 | " \n", 886 | " \n", 887 | " \n", 888 | " \n", 889 | " \n", 890 | " \n", 891 | "
modelfit_timescore_timetest_accuracytest_precisiontest_recalltest_roc_auctest_average_precisiontime
0DummyClassifier[0.06235241889953613, 0.06004643440246582, 0.0...[0.02356433868408203, 0.023059844970703125, 0....[0.5124716553287982, 0.5034013605442177, 0.503...[0.1542056074766355, 0.14485981308411214, 0.14...[0.4925373134328358, 0.4626865671641791, 0.462...[0.5042900470907494, 0.4866908771649773, 0.486...[0.15304952129175473, 0.14865734269715697, 0.1...[0.08591675758361816, 0.08310627937316895, 0.0...
1DecisionTreeClassifier[0.053517818450927734, 0.05652117729187012, 0....[0.025005817413330078, 0.025005578994750977, 0...[0.8253968253968254, 0.8299319727891157, 0.829...[0.43243243243243246, 0.4444444444444444, 0.44...[0.47761194029850745, 0.47761194029850745, 0.5...[0.6853499880277755, 0.7077380477292681, 0.738...[0.3683830979533475, 0.38016844076749257, 0.36...[0.07852363586425781, 0.0815267562866211, 0.08...
2LogisticRegression[0.06331110000610352, 0.06290769577026367, 0.0...[0.02791905403137207, 0.023897886276245117, 0....[0.7845804988662132, 0.8299319727891157, 0.829...[0.35106382978723405, 0.4444444444444444, 0.45...[0.4925373134328358, 0.47761194029850745, 0.53...[0.6857091547609545, 0.7083167052438343, 0.738...[0.3819814120613085, 0.41502673077110863, 0.36...[0.09123015403747559, 0.08680558204650879, 0.0...
3KNNClassifier[0.04813838005065918, 0.05732417106628418, 0.0...[0.040640830993652344, 0.046417951583862305, 0...[0.8503401360544217, 0.8526077097505669, 0.854...[0.5172413793103449, 0.5333333333333333, 0.565...[0.22388059701492538, 0.23880597014925373, 0.1...[0.6013049724638838, 0.6030010375927847, 0.606...[0.2835258077353654, 0.3012183978068839, 0.252...[0.08877921104431152, 0.10374212265014648, 0.1...
\n", 892 | "
" 893 | ], 894 | "text/plain": [ 895 | " model fit_time \\\n", 896 | "0 DummyClassifier [0.06235241889953613, 0.06004643440246582, 0.0... \n", 897 | "1 DecisionTreeClassifier [0.053517818450927734, 0.05652117729187012, 0.... \n", 898 | "2 LogisticRegression [0.06331110000610352, 0.06290769577026367, 0.0... \n", 899 | "3 KNNClassifier [0.04813838005065918, 0.05732417106628418, 0.0... \n", 900 | "\n", 901 | " score_time \\\n", 902 | "0 [0.02356433868408203, 0.023059844970703125, 0.... \n", 903 | "1 [0.025005817413330078, 0.025005578994750977, 0... \n", 904 | "2 [0.02791905403137207, 0.023897886276245117, 0.... \n", 905 | "3 [0.040640830993652344, 0.046417951583862305, 0... \n", 906 | "\n", 907 | " test_accuracy \\\n", 908 | "0 [0.5124716553287982, 0.5034013605442177, 0.503... \n", 909 | "1 [0.8253968253968254, 0.8299319727891157, 0.829... \n", 910 | "2 [0.7845804988662132, 0.8299319727891157, 0.829... \n", 911 | "3 [0.8503401360544217, 0.8526077097505669, 0.854... \n", 912 | "\n", 913 | " test_precision \\\n", 914 | "0 [0.1542056074766355, 0.14485981308411214, 0.14... \n", 915 | "1 [0.43243243243243246, 0.4444444444444444, 0.44... \n", 916 | "2 [0.35106382978723405, 0.4444444444444444, 0.45... \n", 917 | "3 [0.5172413793103449, 0.5333333333333333, 0.565... \n", 918 | "\n", 919 | " test_recall \\\n", 920 | "0 [0.4925373134328358, 0.4626865671641791, 0.462... \n", 921 | "1 [0.47761194029850745, 0.47761194029850745, 0.5... \n", 922 | "2 [0.4925373134328358, 0.47761194029850745, 0.53... \n", 923 | "3 [0.22388059701492538, 0.23880597014925373, 0.1... \n", 924 | "\n", 925 | " test_roc_auc \\\n", 926 | "0 [0.5042900470907494, 0.4866908771649773, 0.486... \n", 927 | "1 [0.6853499880277755, 0.7077380477292681, 0.738... \n", 928 | "2 [0.6857091547609545, 0.7083167052438343, 0.738... \n", 929 | "3 [0.6013049724638838, 0.6030010375927847, 0.606... \n", 930 | "\n", 931 | " test_average_precision \\\n", 932 | "0 [0.15304952129175473, 0.14865734269715697, 0.1... \n", 933 | "1 [0.3683830979533475, 0.38016844076749257, 0.36... \n", 934 | "2 [0.3819814120613085, 0.41502673077110863, 0.36... \n", 935 | "3 [0.2835258077353654, 0.3012183978068839, 0.252... \n", 936 | "\n", 937 | " time \n", 938 | "0 [0.08591675758361816, 0.08310627937316895, 0.0... \n", 939 | "1 [0.07852363586425781, 0.0815267562866211, 0.08... \n", 940 | "2 [0.09123015403747559, 0.08680558204650879, 0.0... \n", 941 | "3 [0.08877921104431152, 0.10374212265014648, 0.1... " 942 | ] 943 | }, 944 | "execution_count": 11, 945 | "metadata": {}, 946 | "output_type": "execute_result" 947 | } 948 | ], 949 | "source": [ 950 | "df_results = pd.DataFrame(results).T.reset_index().rename(columns={\"index\": \"model\"})\n", 951 | "df_results" 952 | ] 953 | }, 954 | { 955 | "cell_type": "code", 956 | "execution_count": 12, 957 | "id": "7a1a283e-3f5c-4835-8902-a4d7a8ea6b29", 958 | "metadata": {}, 959 | "outputs": [ 960 | { 961 | "data": { 962 | "text/plain": [ 963 | "['fit_time',\n", 964 | " 'score_time',\n", 965 | " 'test_accuracy',\n", 966 | " 'test_precision',\n", 967 | " 'test_recall',\n", 968 | " 'test_roc_auc',\n", 969 | " 'test_average_precision',\n", 970 | " 'time']" 971 | ] 972 | }, 973 | "execution_count": 12, 974 | "metadata": {}, 975 | "output_type": "execute_result" 976 | } 977 | ], 978 | "source": [ 979 | "df_results.columns[1:].to_list()" 980 | ] 981 | }, 982 | { 983 | "cell_type": "code", 984 | "execution_count": 13, 985 | "id": "2bf34397-e1ce-4e4b-a2bb-13674881ab7b", 986 | "metadata": {}, 987 | "outputs": [ 988 | { 989 | "data": { 990 | "text/plain": [ 991 | "['test_accuracy',\n", 992 | " 'test_precision',\n", 993 | " 'test_recall',\n", 994 | " 'test_roc_auc',\n", 995 | " 'test_average_precision',\n", 996 | " 'time']" 997 | ] 998 | }, 999 | "execution_count": 13, 1000 | "metadata": {}, 1001 | "output_type": "execute_result" 1002 | } 1003 | ], 1004 | "source": [ 1005 | "df_results.columns[3:].to_list()" 1006 | ] 1007 | }, 1008 | { 1009 | "cell_type": "code", 1010 | "execution_count": 14, 1011 | "id": "90f8d1e0-09e5-48b5-8921-0c408253a1fb", 1012 | "metadata": {}, 1013 | "outputs": [ 1014 | { 1015 | "data": { 1016 | "text/html": [ 1017 | "
\n", 1018 | "\n", 1031 | "\n", 1032 | " \n", 1033 | " \n", 1034 | " \n", 1035 | " \n", 1036 | " \n", 1037 | " \n", 1038 | " \n", 1039 | " \n", 1040 | " \n", 1041 | " \n", 1042 | " \n", 1043 | " \n", 1044 | " \n", 1045 | " \n", 1046 | " \n", 1047 | " \n", 1048 | " \n", 1049 | " \n", 1050 | " \n", 1051 | " \n", 1052 | " \n", 1053 | " \n", 1054 | " \n", 1055 | " \n", 1056 | " \n", 1057 | " \n", 1058 | " \n", 1059 | " \n", 1060 | " \n", 1061 | " \n", 1062 | " \n", 1063 | " \n", 1064 | " \n", 1065 | " \n", 1066 | " \n", 1067 | " \n", 1068 | " \n", 1069 | " \n", 1070 | " \n", 1071 | " \n", 1072 | " \n", 1073 | " \n", 1074 | " \n", 1075 | " \n", 1076 | " \n", 1077 | " \n", 1078 | " \n", 1079 | " \n", 1080 | " \n", 1081 | " \n", 1082 | " \n", 1083 | " \n", 1084 | " \n", 1085 | " \n", 1086 | " \n", 1087 | " \n", 1088 | " \n", 1089 | " \n", 1090 | " \n", 1091 | " \n", 1092 | " \n", 1093 | " \n", 1094 | " \n", 1095 | " \n", 1096 | " \n", 1097 | " \n", 1098 | " \n", 1099 | " \n", 1100 | " \n", 1101 | " \n", 1102 | " \n", 1103 | " \n", 1104 | " \n", 1105 | " \n", 1106 | " \n", 1107 | " \n", 1108 | " \n", 1109 | " \n", 1110 | " \n", 1111 | " \n", 1112 | " \n", 1113 | " \n", 1114 | " \n", 1115 | " \n", 1116 | " \n", 1117 | " \n", 1118 | " \n", 1119 | " \n", 1120 | " \n", 1121 | " \n", 1122 | " \n", 1123 | " \n", 1124 | " \n", 1125 | " \n", 1126 | " \n", 1127 | " \n", 1128 | " \n", 1129 | " \n", 1130 | " \n", 1131 | " \n", 1132 | " \n", 1133 | " \n", 1134 | " \n", 1135 | " \n", 1136 | " \n", 1137 | " \n", 1138 | " \n", 1139 | " \n", 1140 | " \n", 1141 | " \n", 1142 | " \n", 1143 | " \n", 1144 | " \n", 1145 | " \n", 1146 | " \n", 1147 | " \n", 1148 | " \n", 1149 | " \n", 1150 | " \n", 1151 | " \n", 1152 | " \n", 1153 | " \n", 1154 | " \n", 1155 | " \n", 1156 | " \n", 1157 | " \n", 1158 | " \n", 1159 | " \n", 1160 | " \n", 1161 | " \n", 1162 | " \n", 1163 | " \n", 1164 | " \n", 1165 | " \n", 1166 | " \n", 1167 | " \n", 1168 | " \n", 1169 | " \n", 1170 | " \n", 1171 | " \n", 1172 | " \n", 1173 | " \n", 1174 | " \n", 1175 | " \n", 1176 | " \n", 1177 | " \n", 1178 | " \n", 1179 | " \n", 1180 | " \n", 1181 | " \n", 1182 | " \n", 1183 | " \n", 1184 | " \n", 1185 | " \n", 1186 | " \n", 1187 | " \n", 1188 | " \n", 1189 | " \n", 1190 | " \n", 1191 | " \n", 1192 | " \n", 1193 | " \n", 1194 | " \n", 1195 | " \n", 1196 | " \n", 1197 | " \n", 1198 | " \n", 1199 | " \n", 1200 | " \n", 1201 | " \n", 1202 | " \n", 1203 | " \n", 1204 | " \n", 1205 | " \n", 1206 | " \n", 1207 | " \n", 1208 | " \n", 1209 | " \n", 1210 | " \n", 1211 | " \n", 1212 | " \n", 1213 | " \n", 1214 | " \n", 1215 | " \n", 1216 | " \n", 1217 | " \n", 1218 | " \n", 1219 | " \n", 1220 | " \n", 1221 | " \n", 1222 | " \n", 1223 | " \n", 1224 | " \n", 1225 | " \n", 1226 | " \n", 1227 | " \n", 1228 | " \n", 1229 | " \n", 1230 | " \n", 1231 | " \n", 1232 | " \n", 1233 | " \n", 1234 | " \n", 1235 | " \n", 1236 | " \n", 1237 | " \n", 1238 | " \n", 1239 | " \n", 1240 | " \n", 1241 | " \n", 1242 | " \n", 1243 | " \n", 1244 | " \n", 1245 | " \n", 1246 | " \n", 1247 | " \n", 1248 | " \n", 1249 | " \n", 1250 | " \n", 1251 | " \n", 1252 | " \n", 1253 | " \n", 1254 | " \n", 1255 | " \n", 1256 | " \n", 1257 | " \n", 1258 | " \n", 1259 | " \n", 1260 | " \n", 1261 | " \n", 1262 | " \n", 1263 | " \n", 1264 | " \n", 1265 | " \n", 1266 | " \n", 1267 | " \n", 1268 | " \n", 1269 | " \n", 1270 | " \n", 1271 | " \n", 1272 | " \n", 1273 | " \n", 1274 | " \n", 1275 | " \n", 1276 | " \n", 1277 | " \n", 1278 | " \n", 1279 | " \n", 1280 | " \n", 1281 | " \n", 1282 | " \n", 1283 | " \n", 1284 | " \n", 1285 | " \n", 1286 | " \n", 1287 | " \n", 1288 | "
modelfit_timescore_timetest_accuracytest_precisiontest_recalltest_roc_auctest_average_precisiontime
0DummyClassifier0.0623520.0235640.5124720.1542060.4925370.504290.153050.085917
1DummyClassifier0.0600460.023060.5034010.144860.4626870.4866910.1486570.083106
2DummyClassifier0.0573420.0220690.5034010.144860.4626870.4866910.1486570.079411
3DummyClassifier0.0560360.025070.4875280.1261680.4090910.4552120.140050.081107
4DummyClassifier0.0660480.0254840.5102040.1495330.4848480.4997580.1495980.091532
5DecisionTreeClassifier0.0535180.0250060.8253970.4324320.4776120.685350.3683830.078524
6DecisionTreeClassifier0.0565210.0250060.8299320.4444440.4776120.7077380.3801680.081527
7DecisionTreeClassifier0.0586370.0230060.8299320.4487180.5223880.7382670.3602610.081643
8DecisionTreeClassifier0.0571730.0230060.8117910.4022990.5303030.7183030.4311720.080179
9DecisionTreeClassifier0.0555170.0230050.6893420.2679740.6212120.6633130.2261990.078522
10LogisticRegression0.0633110.0279190.784580.3510640.4925370.6857090.3819810.09123
11LogisticRegression0.0629080.0238980.8299320.4444440.4776120.7083170.4150270.086806
12LogisticRegression0.0586970.0259140.8299320.450.5373130.7385860.3632510.084612
13LogisticRegression0.0584240.0248170.8140590.4090910.5454550.7188890.4098180.083241
14LogisticRegression0.0588860.0238840.8367350.4666670.6363640.7947680.5065280.08277
15KNNClassifier0.0481380.0406410.850340.5172410.2238810.6013050.2835260.088779
16KNNClassifier0.0573240.0464180.8526080.5333330.2388060.6030010.3012180.103742
17KNNClassifier0.0688160.0425640.8548750.5652170.194030.6061740.2525890.11138
18KNNClassifier0.0668060.0435640.8752830.8235290.2121210.6437170.3634190.11037
19KNNClassifier0.0679820.0419240.7369610.3310810.7424240.7717780.3790450.109906
\n", 1289 | "
" 1290 | ], 1291 | "text/plain": [ 1292 | " model fit_time score_time test_accuracy test_precision \\\n", 1293 | "0 DummyClassifier 0.062352 0.023564 0.512472 0.154206 \n", 1294 | "1 DummyClassifier 0.060046 0.02306 0.503401 0.14486 \n", 1295 | "2 DummyClassifier 0.057342 0.022069 0.503401 0.14486 \n", 1296 | "3 DummyClassifier 0.056036 0.02507 0.487528 0.126168 \n", 1297 | "4 DummyClassifier 0.066048 0.025484 0.510204 0.149533 \n", 1298 | "5 DecisionTreeClassifier 0.053518 0.025006 0.825397 0.432432 \n", 1299 | "6 DecisionTreeClassifier 0.056521 0.025006 0.829932 0.444444 \n", 1300 | "7 DecisionTreeClassifier 0.058637 0.023006 0.829932 0.448718 \n", 1301 | "8 DecisionTreeClassifier 0.057173 0.023006 0.811791 0.402299 \n", 1302 | "9 DecisionTreeClassifier 0.055517 0.023005 0.689342 0.267974 \n", 1303 | "10 LogisticRegression 0.063311 0.027919 0.78458 0.351064 \n", 1304 | "11 LogisticRegression 0.062908 0.023898 0.829932 0.444444 \n", 1305 | "12 LogisticRegression 0.058697 0.025914 0.829932 0.45 \n", 1306 | "13 LogisticRegression 0.058424 0.024817 0.814059 0.409091 \n", 1307 | "14 LogisticRegression 0.058886 0.023884 0.836735 0.466667 \n", 1308 | "15 KNNClassifier 0.048138 0.040641 0.85034 0.517241 \n", 1309 | "16 KNNClassifier 0.057324 0.046418 0.852608 0.533333 \n", 1310 | "17 KNNClassifier 0.068816 0.042564 0.854875 0.565217 \n", 1311 | "18 KNNClassifier 0.066806 0.043564 0.875283 0.823529 \n", 1312 | "19 KNNClassifier 0.067982 0.041924 0.736961 0.331081 \n", 1313 | "\n", 1314 | " test_recall test_roc_auc test_average_precision time \n", 1315 | "0 0.492537 0.50429 0.15305 0.085917 \n", 1316 | "1 0.462687 0.486691 0.148657 0.083106 \n", 1317 | "2 0.462687 0.486691 0.148657 0.079411 \n", 1318 | "3 0.409091 0.455212 0.14005 0.081107 \n", 1319 | "4 0.484848 0.499758 0.149598 0.091532 \n", 1320 | "5 0.477612 0.68535 0.368383 0.078524 \n", 1321 | "6 0.477612 0.707738 0.380168 0.081527 \n", 1322 | "7 0.522388 0.738267 0.360261 0.081643 \n", 1323 | "8 0.530303 0.718303 0.431172 0.080179 \n", 1324 | "9 0.621212 0.663313 0.226199 0.078522 \n", 1325 | "10 0.492537 0.685709 0.381981 0.09123 \n", 1326 | "11 0.477612 0.708317 0.415027 0.086806 \n", 1327 | "12 0.537313 0.738586 0.363251 0.084612 \n", 1328 | "13 0.545455 0.718889 0.409818 0.083241 \n", 1329 | "14 0.636364 0.794768 0.506528 0.08277 \n", 1330 | "15 0.223881 0.601305 0.283526 0.088779 \n", 1331 | "16 0.238806 0.603001 0.301218 0.103742 \n", 1332 | "17 0.19403 0.606174 0.252589 0.11138 \n", 1333 | "18 0.212121 0.643717 0.363419 0.11037 \n", 1334 | "19 0.742424 0.771778 0.379045 0.109906 " 1335 | ] 1336 | }, 1337 | "execution_count": 14, 1338 | "metadata": {}, 1339 | "output_type": "execute_result" 1340 | } 1341 | ], 1342 | "source": [ 1343 | "df_results_explode = df_results.explode(\n", 1344 | " df_results.columns[1:].to_list()\n", 1345 | ").reset_index(drop=True)\n", 1346 | "\n", 1347 | "df_results_explode" 1348 | ] 1349 | }, 1350 | { 1351 | "cell_type": "markdown", 1352 | "id": "99d3d62e-f5e3-4796-9f4b-05d1e5069394", 1353 | "metadata": {}, 1354 | "source": [ 1355 | "**ALUNOS**: Expliquem os gráficos e como eles levaram à seleção do LogisticRegression." 1356 | ] 1357 | }, 1358 | { 1359 | "cell_type": "code", 1360 | "execution_count": 15, 1361 | "id": "c746dd6d-f556-4c79-be10-40fec80b5aad", 1362 | "metadata": {}, 1363 | "outputs": [ 1364 | { 1365 | "data": { 1366 | "image/png": "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v+8OAgAAAADQ5FmWRD+TL9bljDFavny5xowZo8DAwNPWDQgIUL9+/U47Ep0v3wAA+F5gYKAiIiKUkZHhVZ6RkaGoqKgq94mOjtahQ4d0/PhxT9kXX3yhgIAAdezYscp9HA6HgoODvTYAAAAAAHzFsiT6mXyxLvf+++/rq6++0oQJE372dYwx2rVrl9q3b19tHb58AwBQNxITE7V06VItX75ce/bsUUJCgrKzszVp0iRJZReyx44d66l/1113qU2bNho/frx2796tjRs36sEHH9Q999yjoKAgqw4DAAAAANCEWbawqFT2xXrMmDGKjIzUoEGDtGTJkkpfrA8ePKhVq1Z57bds2TINGDBA4eHhldp84oknNHDgQF122WUqLCzUc889p127dun555+vl2MCAAA/io2NVX5+vmbPnq2cnByFh4dr/fr1nkXBc3JylJ2d7al/zjnnKCMjQ/fff78iIyPVpk0b3X777XryySetOgQAAAAAQBNnaRK9tl+sJamgoEBr167VggULqmzz6NGjuvfee5Wbm6uQkBD16dNHGzduVP/+/ev8eAAAQGWTJ0/W5MmTq3xu5cqVlcq6detW6U41AAAAAACsYjPGGKuD8DeFhYUKCQlRQUEBU7sAgB/asmWLkpOTFR8fr+joaKvDOWv0O77F+QQA1Cf6Hd/ifAIA6lNN+x3L5kQHAOBMFBUVae7cuTp8+LDmzp2roqIiq0MCAAAAAACNGEl0AECDsnr1auXn50uS8vPzlZqaanFEAAAAAACgMat1Er1z586aPXt2pbnKAQCoawcOHFBqaqrKZyIzxig1NVUHDhywOLLGqbi4WAcOHFB2drbXBgAAAABAU1LrhUWnTZumlStXavbs2brmmms0YcIEjRo1Sg6Hoy7iAwBAUlnCfP78+dWWz5kzRzabzYLIGp8vv/xS99xzj7Zu3epVboyRzWaT2+22KDIAAAAAZ8oY4/PpMI0xcrlcPm2zrjkcDp9+d3Q6nXwXbQJqnUS///77df/99+vjjz/W8uXLNXXqVE2ePFl33XWX7rnnHvXt27cu4gQANHFZWVnatm1bpXK3261t27YpKytLnTt3rv/AGqFx48apWbNm+sc//qH27dvzByEAAADQCBQVFWnYsGFWh9HopKenKygoyOowUMdqnUQvd+WVV2rBggWaM2eOUlJS9Pvf/16LFi1S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qu8Nc6IDAAAAAAAAAFANRqIDAAAAAAAAAFANkugAAAAAAAAAAFSDJDoAAAAAAAAAANUgie4DzZo1U58+fdSjRw9FRETor3/9q9Uheaxbt05XXnmlevbsqfDwcKWkpEiSfvGLX+izzz7zyWtMnDhRX3/9tSRp/vz56t69u6ZMmaLHHntMmzZt8slrVOSr8719+3Y9+OCD1T7/5ptvav78+bVud926derdu7d69+6twMBA9erVS71799azzz57RnGW++yzzzR06FBddtll6t69uyZPnqxTp07p8ccf11/+8pezarvcCy+8oLS0NEnS+++/r549e2rAgAFnfC6q0rZt27Nu44YbbtDJkyerff6ZZ57x/Hzo0CHFxcWdtr1mzZqpd+/e6tmzp2666SYdPXr0rGP0hYrvhz+q+F6uWrVKERERKigo0Lhx49SlSxeVlJRIKvvs/uIXv5Akvffee7LZbHrnnXc8+0ZGRurbb7+VJB09elS//vWvdfHFF3vej6ysLL333nu69dZbfRJ3xf/7R44cUb9+/dSnTx+9//77P/tZQeNEP04/XhH9+OnRj9cc/Tj9OOoH/Tj9eEX046dHP15z9OP045UYnLU2bdp4fv72229Nnz59zOLFiy2MqMzOnTvNZZddZvbt22eMMebEiRNmxYoVxhhjrr76avPpp5/6/DW7du1qcnJyzmjfkpKSGtXz1/NdlbCwMHPs2DGvstLSUuN2u2vVzg8//GAuvvhis2HDBk8bq1evNseOHTN/+MMfzMKFC30Wc7n77rvPrFmz5oz2Pd17WfH9qyu1fY2K9e+++27z5JNPnnUMNf08N2Tl523t2rUmPDzcHDlyxBhjzK9//WvTsWNHs2rVKmOMMZ9++qm5+uqrjTHGvPvuu6Zjx47m2muv9bQTERFhvvnmG2OMMbfccot54oknPM9t27bNbNu2zbz77rvmV7/6lc+PYc2aNea+++47o32bwnvcVPhrv0I/bj368croxxsP+vHG/x43Ff7ar9CPW49+vDL68caDfrz+32NGovtYWFiY5s6d67nC/NOrkuVXit577z1dd911+tWvfqVLL71Uf/7zn/XCCy+ob9++6t+/v/Ly8iSVXaGePn26rrrqKvXq1Us7d+7UiBEjdOmll3ravfvuu7VhwwbPawwePFj//e9/NXfuXM2aNUtdunSRJAUFBWncuHGVYr733nsVERGhnj176vnnn5ckud1u3X333erRo4euuOIKrVixQpL04IMPqmvXrurVq5eefPJJT4yfffaZpk6dqn379ikmJkZLly7VuHHj9I9//EOS9J///EeDBw9W37599atf/UrHjx+XJHXu3FmzZ89WVFSU3nvvvbM+38ePH9fYsWPVr18/RUZGasuWLZKkwsJCxcXFea5Cb9261etK2rvvvqsrrrhCV155pSIjIyVJK1eu1PTp0yVJ+/bt0y9+8Qv16tVLN998s7777jvPsf/+979Xv379FB4ers8//7zaWNu2bauHHnpI/fv311dffaU//elP6tevn3r16qUXXnjBU6+q8pdeeklDhgzR9ddfL0my2WyKi4vTOeec4/UaL7zwgvr3768rrrhC48ePV2lpqSQpOTnZ87799re/lSS9/PLL6t69u6688kqNHDlS0o+f11WrVulvf/ubHn74YU2aNMnrXBw+fFi33HKLIiMjddVVV+m///2vJGncuHGaNm2afvGLX3hdea6JDRs2qHfv3goPD1diYqKMMZKkRYsW6fLLL9fQoUN1xx13eD7znTt31vHjx3X8+HH98pe/1BVXXKErrrhC6enpmjVrlo4eParevXtrypQp+vbbbz3v6alTp3T//fd73uu1a9dWiiU6OloHDhw47bF+8cUXioyM1MCBAzVt2jRP+48//rgmTZqk6667TgkJCfryyy91/fXXKyIiQjExMcrJyTmj90OSdu7cqf79+6tXr14aO3asioqKPOfi8ccfV58+fdSvXz/Pa9SX9PR0Pfzww3r77bd1/vnne8oTEhL07LPPet7LigYMGCCXy6WPPvrIq/zLL7/UJ598okceecRTFhkZ6Tm/5T788ENFRUWpT58+uvbaaz3HXNX/408//VR9+/b1jEY5cuSI5//+7t27NWPGDL322mueq+/l+5WUlOiBBx5Q//791bt3b73++uuSyn4v3HnnnRoxYoTuvPPOsz+B8Dv04/Tj1aEfrx79OP24RD8O/0A/Tj9eHfrx6tGP049L9OM1Uu9p+0bop1fZjh49apxOpzHGVLoqWV733XffNW3atDFHjhwxx48fN+eff76ZP3++McaY3//+92bevHnGmLIr1I899pgxxpgnn3zSXHrppeb77783+fn5pl27dsYYYzIyMkxcXJwxxpivvvrKDBgwwBhjTJ8+fcyuXbuqjLnile/8/HxjjDEul8v06dPH/N///Z/Zvn27iYqK8jqmvLw806lTJ89V26NHj1Zqq+KV3l//+tfm73//u3G5XGbw4MHmu+++M8YY88wzz5ikpCRP/b/85S81Os8/PYcVYys/37///e/Na6+9ZowxZv/+/aZXr17GGGOmTZtmHn74YWNM2dWqgoICrytpN954o+eqcvlxrVixwkybNs0YY8yIESNMWlqaMcaYp556ytx///2eY3/00UeNMcYsW7bM3HPPPV6xVTwfksw//vEPY4wxb731lpk6daoxpuy89+vXz+zfv7/a8oSEBJOcnFzl+aj4GSt/L40x5je/+Y15/fXXjTHGnHfeeeb48eNexxceHm6++OILr7KKbZW/fz89F3fccYfZvn27McaY//znP2bYsGGe+rfddpspLS2tMs5yP33/Tpw4YS666CLzzTffGLfbbUaMGGHWrl1rDhw4YC655BJz9OhRc/z4cXP55Zd7Yis/r6+++qq56667jDFlowEKCgoqvcY333xjIiIijDHGLFy40IwZM8bzGS7/TJbXLykpMaNHj/a8T9Ud6/Dhw826deuMMcY8/PDDnvb/8Ic/mKioKONyuYwxxlx33XXm22+/NcYY87e//c1zhfVM3o/w8HDz4YcfGmOMmTRpkpk7d67nXCxbtswYY8yjjz5qZs+efdrz70uBgYGmbdu25quvvvIqL//s3HrrrWbdunWVrnz/6le/Mv/4xz/MyJEjjTE/Xvl+4403zC233FLla1X8/1pQUOC56pyammri4+ONMVX/P/7d735nlixZYowp+6y5XC6vtip+tit+VhYtWuT5PVxQUGC6detmioqKzIoVK8zFF1/s+ayhcaAfpx83hn6cfpx+vBz9OBoa+nH6cWPox+nH6cfL0Y/XHUai1wFTxZWeqgwaNEjnn3++WrZsqY4dO2r48OGSpF69ennmI5Kkm2++WZJ0xRVXKDIyUq1atVLr1q117rnn6vvvv9e1116rnTt36vjx41q1apXGjh3ricNms/1sHC+99JL69OmjyMhI7du3T19++aUuvvhiHTp0SFOmTNGGDRsUEhLi2e655x69/vrratmyZY2Oc+/evfrkk090zTXXqHfv3lqxYoWys7M9z9922201aqc6Fc93RkaG/vCHP6h379668cYblZ+fr+LiYv373//2XGG02+0KDg72aiM6OloPPfSQnnvuOZ04caLSa2zbts0T55gxY7zmliu/ShkREeH1vv1UUFCQRowY4Ynz73//u3r37q3+/fvr//7v//T1119XW17T9/Ljjz9WdHS0rrjiCq1fv167d++WJPXv31933323XnrpJTVv3txzzPfdd5+WLl1a48+sJP373//WhAkT1Lt3b/3mN79Rbm6u57lbb721RnFWtHfvXnXt2lWdO3dWQECA7rrrLm3atEnbtm3T0KFDFRISopYtW+rGG2+stO8VV1yhTZs2acaMGfrwww8rva9VxX7vvfcqIKDsV995550nSZ4r5aGhocrLy9OwYcNOe6w7duzwvO933HGH12uMHDlSgYGBOnbsmLZs2aKRI0eqd+/emj17tg4ePCip9u9HQUGBXC6XBgwYIOnMP4O+1qJFC/Xq1UsvvfRSlc8//PDDSkpKqvK5ESNGKCsry2u0SE0/599//71GjRql8PBwzZ49+/+zd+9xUVf5H8ffAwqjKGhp4JXITMW74AVIyzVltS2yTDYVN9PKsBLQTFLLS625hWJumG4Wa5pSmVkbhbS/ymumCNWmta6aKA25UEFeAIXv7w/XyWlAGR0YLq/n4/F9OHO+53vm8x1wDvP5nu851t/z8v4fh4SEKCEhQc8++6wsFos8PDwqdW7p6elasWKFevXqpUGDBunkyZPWn194ePglf9dQu9GP26IfP4d+vHz04/Tj59GPo6agH7dFP34O/Xj56Mfpx8+jH780kuhVICsrS507d5Z0boGE87fwSFJxcbH1saenp/Wxm5ub9bmbm5tKS0vt6l1Y58J6bm5uuuuuu/Tmm2/qjTfesH6IBAYGKjMz86KxHjp0SElJSfrkk0/05ZdfasCAASouLlbz5s311Vdf6eabb1ZCQoKmT5+uBg0aaM+ePRo1apTWr19v92FVEcMw1KdPH2VlZSkrK0v79u2z3u4lnfuPfyUufL8Nw9A//vEP62sdO3asUv9JZ86cqVdeeUUnTpxQ3759rf85z7vwg+S3Hyznfybu7u42P7ffuvA8DcPQ3LlzrXEePnxYN910U4XllflZStLEiRP1t7/9TV999ZUefvhh6+/b+++/r4cffljbt2/XoEGDJJ27NeuZZ57RoUOH1Lt374suDPJbGRkZ1hizsrLKPcfLdf79/W3HVd4fFjfccIMyMzPVrVs3TZ069bIXdGnWrJmysrKUnZ2ts2fP2vx+VnSuFcV1/j0wDEN+fn7W47766iu99957khz/eZT3XlzO76Czubu7a+PGjXrrrbest5heqHfv3mrevLn++c9/lnv8448/rmeffdb6PDAwUF9++eUl/4h88skndeutt+pf//qXkpOTrb/n5f0/HjNmjP7xj3/IbDZbv+BUhmEYWrlypfXnl52dreuuu06Sc37PUbPRj9uiHz+Hfrxy6Mfpx+nH4Wr047box8+hH68c+nH6cfrxipFEd7KjR49q+vTpevjhhyWdmyPs/H/09PR069xjznbvvfdq1qxZ6tq1q6666ipJ0rRp0/TnP//ZeiWsqKjIZq4vSfrll1/UpEkTeXt767vvvtO2bdskSXl5eSorK9Pdd9+tJ598UllZWTpx4oQKCgr0hz/8QQkJCeV+gJWnc+fOOnLkiLX+yZMn9Z///Mcp5/3b9/uWW26xziMnnbsSfL58+fLlks7NL1dYWGjTzsGDB9WzZ0898cQT6tKliw4fPmyzPzg42Dpf1+uvv66BAwdeUdy33HKLVq1aZf1g/vbbb1VUVFRh+dixY/Xpp59aP/wMw9CqVavsfp9OnjwpPz8/FRUV6a233pIklZWV6ejRoxoyZIgWL16s7777TqWlpTp06JBCQkL0zDPPyMPDQ/n5+ZWK/aabbtKKFSusbX/11VdX9F506tRJ//73v3XkyBGVlZVp/fr1GjhwoPr27av/+7//U2FhoU6dOqXU1FS7Y7///nt5eXlp/Pjxmjp1qvV3rKLO65ZbbtHKlSutf0j/9NNPNvsbN26spUuXKiEhQWfPnq3wXPv06WPtgN98881yz8vb21stW7a0xn3mzBnt37//sn4ezZo1k6enp3bv3i3JOb+DzuLt7a3U1FQtWLBAH374od3+J554Qs8//3y5x959993as2eP9Y/kjh07qlu3bvrzn/9srbNz5059/vnnNscVFhaqbdu2kqQ1a9ZYy8v7f3zo0CF16NBBMTExGjp0qPUq+aXccssteumll6y/R5X9vEPtRz9uj37cHv34r+jH6cfpx1GT0I/box+3Rz/+K/px+nH68cojie4E5289CQwM1B133KHJkydr4sSJkqQ777xTR44cUVBQkD788ENdffXVVRJDhw4d1KZNG+utY9K5D5Y///nPuv322xUYGKh+/frZHdezZ0916tRJ3bp1U2xsrEJCQiRJOTk5uummm9SzZ089+uijeuqpp/TLL7/oD3/4g3r27KkRI0Zo0aJFlYrNw8ND69evV3R0tHr06KGQkJAr6rQv9n4/+eSTOn78uLp3767AwEC9/PLLkqQ5c+bou+++U/fu3RUUFGS34MiSJUvUtWtX9ejRQ+3bt7e+D+e98MILWrZsmXr06KEtW7boqaeeuuz4JWnEiBG69dZb1a9fP3Xr1k0PPfSQSktLKyxv3Lix3nnnHT399NO64YYb1LVrV2VmZtqMhDh/nsHBwRoxYoR69eol6dwfKecXcQkODta8efPk7u6u6dOnWxcAGTVqlPVD8FKWLVum9PR09ejRQ926ddP777/v0Ln/9NNPatu2rXX7xz/+oZUrVyoiIkI9evRQx44ddccdd6ht27aKiYlRcHCwbr/9dvXu3dvulp2vvvpKffv2Va9evfTXv/5VcXFxkqQ//elP6t69u6ZMmWJT/4EHHlCzZs2si118/PHHdvEFBwere/fu2rBhQ4XnumTJEs2bN886UqSiW4nWrl2rxYsXq2fPnurVq5d27dp12T+P5ORkTZkyRT169NAvv/xivR2yJmjTpo3effdd3X///XZXlgcNGiR/f/9yj3N3d1dcXJzNLYivvvqqvvnmG1133XXq1q2bnn32Wfn5+dkcN336dMXExOjGG2+0uQpd3v/jlJQUdevWzbqIyciRIyt1Tg8++KBat25tXWBn/vz5lX07UAvRj18c/bg9+nH6cfpx+nHUHPTjF0c/bo9+nH6cfpx+/HKYDEcmX0KNVVBQoL59++rrr7+2zukE1HYnT56Ul5eXTp8+rUGDBumVV15R9+7dXR2WTp06pUaNGslkMum5557TDz/8UOHVXQCoDPpx1EX04wDqC/px1EX044AtRqLXAampqerevbvi4+PpsFGnzJ49W7169VLv3r01cuTIGtFhS9Lnn3+u3r17q3v37vq///s/Pf74464OCUAtRj+Ouop+HEB9QD+Ouop+HLDFSHQAAAAAAAAAACrASHQAAAAAAAAAACpAEh0AAAAAAAAAgAqQRAcAAAAAAAAAoAIk0QEAAAAAAAAAqABJdADV4uabb1ZMTEyl6ycnJ6tZs2ZVFg8AAKg8+nEAAGov+nHgypFEBwAAAAAAAACgAiTRAQAAAAAAAACoAEl0oJ67+eab9cgjjygmJkbNmzeXr6+vVq5cqZMnT2rChAlq2rSpOnTooA8++MB6zKeffqp+/frJ09NTrVq10syZM3X27Fnr/pMnT2r8+PFq0qSJWrVqpYSEBLvXLSkp0YwZM9SmTRt5eXmpf//++uSTT6rjlAEAqDPoxwEAqL3ox4HagyQ6AP39739XixYt9Pnnn+uRRx7RQw89pLvvvluhoaHau3evwsPDFRUVpVOnTiknJ0cjRoxQ37599cUXX2j58uVatWqVnn76aWt7jz32mD7++GNt3LhRmzdv1ieffKKMjAyb15wwYYK2b9+u9evX68svv9Tdd9+t3//+9zpw4EB1nz4AALUa/TgAALUX/ThQSxgA6rWbbrrJuPHGG63Pz549a3h5eRlRUVHWMovFYkgydu7caTzxxBNGp06djLKyMuv+F1980WjSpIlRWlpq/PLLL4aHh4exfv166/78/HyjUaNGxtSpUw3DMIz//Oc/hslkMnJycmxiGTJkiBEfH28YhmG8+uqrho+PTxWcMQAAdQf9OAAAtRf9OFB7NHBxDh9ADdCjRw/rY3d3d1199dXq3r27tczX11eSdPz4ce3fv18hISEymUzW/WFhYTpx4oSOHTumn376SSUlJQoJCbHuv+qqq9SpUyfr871798owDN1www02cRQXF+vqq692+vkBAFCX0Y8DAFB70Y8DtQNJdABq2LChzXOTyWRTdr6DLisrk2EYNh22JBmGYa13/vHFlJWVyd3dXRkZGXJ3d7fZ16RJk8s6BwAA6iv6cQAAai/6caB2IIkOwCGBgYHasGGDTee9Y8cONW3aVG3atFHz5s3VsGFDffbZZ2rfvr0k6aefftK///1v3XTTTZKk3r17q7S0VMePH9fAgQNddi4AANQ39OMAANRe9OOA67CwKACHREdH6+jRo3rkkUf0zTffaNOmTXrqqacUFxcnNzc3NWnSRBMnTtRjjz2mf/7zn/rXv/6le++9V25uv37c3HDDDRo7dqzGjx+vt99+W4cPH9bu3bu1aNEipaamuvDsAACo2+jHAQCovejHAddhJDoAh7Rp00apqal67LHH1LNnT1111VWaOHGiZs+eba3z3HPP6cSJE7r99tvVtGlTTZs2TQUFBTbtvPrqq3r66ac1bdo05eTk6Oqrr1ZISIhGjBhR3acEAEC9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zRp98803eu211+Tu7u7q8AAAqNccznoPHTpU8fHx2rRpk3x8fCRJP//8s5544gkNHTrU6QECAADnWb16tVauXKkhQ4Zo8uTJ1vIePXrom2++cWFkAABAkjp06KAOHTq4OgwAAHABh0eiJyQk6OjRo/L399fgwYM1ePBgBQQEKDc3VwkJCVURIwAAcJKcnBxdf/31duVlZWU6c+aMCyICAACSZBiG3nzzTUVHR2vUqFG68847bTZHJSUlKSAgQGazWUFBQdq6detF63/66acKCgqS2WzWddddp5deeslm/5kzZzR//nx16NBBZrNZPXv21IcffmhTZ+7cuTKZTDabn5+fw7EDAFDTOJxEb9Omjb788kv95S9/UWBgoIKCgrR06VJ99dVXateuXVXECAAAnKRr167lfol+88031bt3bxdEBAAAJGnq1KmKiorS4cOH1aRJE/n4+NhsjkhJSVFMTIxmzZqlzMxMDRw4UMOHD1d2dna59Q8fPqwRI0Zo4MCByszM1BNPPKFHH31UGzZssNaZPXu2VqxYoWXLlmnfvn2aPHmyRo4cqczMTJu2unbtKovFYt2++uorx98MAABqmMuaxNzLy0sPPPCAs2MBAABV7KmnnlJUVJRycnJUVlamt99+W99++61Wr16tf/zjH64ODwCAemvNmjV6++23NWLEiCtua/HixZo4caImTZokSUpMTFRaWpqWL1+uhQsX2tV/6aWX1L59eyUmJkqSunTpoj179uj555/XXXfdJUl67bXXNGvWLGt8Dz30kNLS0pSQkKA1a9ZY22rQoAGjzwEAdY7DI9El6eDBg3rkkUd0yy23aOjQoXr00Ud18OBBZ8cGAACc7LbbblNKSopSU1NlMpn05JNPav/+/XrvvfdY2wQAABfy8fHRddddd8XtlJSUKCMjQ8OGDbMpHzZsmHbs2FHuMTt37rSrHx4erj179lineysuLpbZbLap06hRI23bts2m7MCBA2rdurUCAgL0xz/+UYcOHbpovMXFxSosLLTZAACoaRxOoqelpSkwMFCff/65evTooW7dumnXrl3q2rWr0tPTqyJGAADgROHh4fr000914sQJnTp1Stu2bbP74gwAAKrX3LlzNW/ePJ0+ffqK2snLy1Npaal8fX1tyn19fZWbm1vuMbm5ueXWP3v2rPLy8iSd+/th8eLFOnDggMrK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", 1367 | "text/plain": [ 1368 | "
" 1369 | ] 1370 | }, 1371 | "metadata": {}, 1372 | "output_type": "display_data" 1373 | } 1374 | ], 1375 | "source": [ 1376 | "import matplotlib.pyplot as plt\n", 1377 | "import seaborn as sns\n", 1378 | "\n", 1379 | "fig, axs = plt.subplots(nrows=2, ncols=3, figsize=(15, 8), tight_layout=True)\n", 1380 | "\n", 1381 | "cols = df_results.columns[3:].to_list()\n", 1382 | "\n", 1383 | "for ax, col in zip(axs.flatten(), cols):\n", 1384 | " b = sns.boxplot(x=\"model\", y=col, data=df_results_explode, ax=ax, showmeans=True)\n", 1385 | " b.set_xticklabels(b.get_xticklabels(), fontsize=7)\n", 1386 | "\n", 1387 | "plt.show()" 1388 | ] 1389 | } 1390 | ], 1391 | "metadata": { 1392 | "kernelspec": { 1393 | "display_name": "Python 3 (ipykernel)", 1394 | "language": "python", 1395 | "name": "python3" 1396 | }, 1397 | "language_info": { 1398 | "codemirror_mode": { 1399 | "name": "ipython", 1400 | "version": 3 1401 | }, 1402 | "file_extension": ".py", 1403 | "mimetype": "text/x-python", 1404 | "name": "python", 1405 | "nbconvert_exporter": "python", 1406 | "pygments_lexer": "ipython3", 1407 | "version": "3.11.5" 1408 | } 1409 | }, 1410 | "nbformat": 4, 1411 | "nbformat_minor": 5 1412 | } 1413 | -------------------------------------------------------------------------------- /notebooks/auxiliary_functions.py: -------------------------------------------------------------------------------- 1 | import matplotlib.pyplot as plt 2 | from matplotlib.colors import ListedColormap 3 | from matplotlib.ticker import PercentFormatter 4 | import seaborn as sns 5 | from sklearn.cluster import KMeans 6 | from sklearn.metrics import silhouette_score 7 | import os 8 | import numpy as np 9 | 10 | 11 | os.environ["OMP_NUM_THREADS"] = "9" 12 | 13 | 14 | def inspect_outliers(dataframe, column, whisker_width=1.5): 15 | """Função para inspecionar outliers. 16 | 17 | Parameters 18 | ---------- 19 | dataframe : pandas.DataFrame 20 | Dataframe com os dados. 21 | column : List[str] 22 | Lista com o nome das colunas (strings) a serem utilizadas. 23 | whisker_width : float, opcional 24 | Valor considerado para detecção de outliers, por padrão 1.5 25 | 26 | Returns 27 | ------- 28 | pd.DataFrame 29 | Dataframe com os outliers. 30 | """ 31 | 32 | q1 = dataframe[column].quantile(0.25) 33 | q3 = dataframe[column].quantile(0.75) 34 | iqr = q3 - q1 35 | lower_bound = q1 - whisker_width * iqr 36 | upper_bound = q3 + whisker_width * iqr 37 | 38 | return dataframe[ 39 | (dataframe[column] < lower_bound) | (dataframe[column] > upper_bound) 40 | ] 41 | 42 | 43 | def pairplot( 44 | dataframe, columns, hue_column=None, alpha=0.5, corner=True, palette="tab10" 45 | ): 46 | """Função para gerar pairplot. 47 | 48 | Parameters 49 | ---------- 50 | dataframe : pandas.DataFrame 51 | Dataframe com os dados. 52 | columns : List[str] 53 | Lista com o nome das colunas (strings) a serem utilizadas. 54 | hue_column : str, opcional 55 | Coluna utilizada para hue, por padrão None 56 | alpha : float, opcional 57 | Valor de alfa para transparência, por padrão 0.5 58 | corner : bool, opcional 59 | Se o pairplot terá apenas a diagonal inferior ou será completo, por padrão True 60 | palette : str, opcional 61 | Paleta a ser utilizada, por padrão "tab10" 62 | """ 63 | 64 | analysis = columns.copy() + [hue_column] 65 | 66 | sns.pairplot( 67 | dataframe[analysis], 68 | diag_kind="kde", 69 | hue=hue_column, 70 | plot_kws=dict(alpha=alpha), 71 | corner=corner, 72 | palette=palette, 73 | ) 74 | 75 | 76 | def plot_elbow_silhouette(X, random_state=42, range_k=(2, 11)): 77 | """Gera os gráficos para os métodos Elbow e Silhouette. 78 | 79 | Parameters 80 | ---------- 81 | X : pandas.DataFrame 82 | Dataframe com os dados. 83 | random_state : int, opcional 84 | Valor para fixar o estado aleatório para reprodutibilidade, por padrão 42 85 | range_k : tuple, opcional 86 | Intervalo de valores de cluster, por padrão (2, 11) 87 | """ 88 | 89 | fig, axs = plt.subplots(nrows=1, ncols=2, figsize=(15, 5), tight_layout=True) 90 | 91 | elbow = {} 92 | silhouette = [] 93 | 94 | k_range = range(*range_k) 95 | 96 | for i in k_range: 97 | kmeans = KMeans(n_clusters=i, random_state=random_state, n_init=10) 98 | kmeans.fit(X) 99 | elbow[i] = kmeans.inertia_ 100 | 101 | labels = kmeans.labels_ 102 | silhouette.append(silhouette_score(X, labels)) 103 | 104 | sns.lineplot(x=list(elbow.keys()), y=list(elbow.values()), ax=axs[0]) 105 | axs[0].set_xlabel("K") 106 | axs[0].set_xlabel("Inertia") 107 | axs[0].set_title("Elbow Method") 108 | 109 | sns.lineplot(x=list(k_range), y=silhouette, ax=axs[1]) 110 | axs[1].set_xlabel("K") 111 | axs[1].set_xlabel("Silhouette Score") 112 | axs[1].set_title("Silhouette Method") 113 | 114 | plt.show() 115 | 116 | 117 | def plot_clusters_2D( 118 | dataframe, 119 | columns, 120 | n_colors, 121 | centroids, 122 | show_centroids=True, 123 | show_points=False, 124 | column_clusters=None, 125 | ): 126 | """Gerar gráfico 2D com os clusters. 127 | 128 | Parameters 129 | ---------- 130 | dataframe : pandas.DataFrame 131 | Dataframe com os dados. 132 | columns : List[str] 133 | Lista com o nome das colunas (strings) a serem utilizadas. 134 | n_colors : int 135 | Número de cores para o gráfico. 136 | centroids : np.ndarray 137 | Array com os centroides. 138 | show_centroids : bool, opcional 139 | Se o gráfico irá mostrar os centroides ou não, por padrão True 140 | show_points : bool, opcional 141 | Se o gráfico irá mostrar os pontos ou não, por padrão False 142 | column_clusters : List[int], opcional 143 | Coluna com os números dos clusters para colorir os pontos 144 | (caso mostrar_pontos seja True), por padrão None 145 | """ 146 | 147 | fig = plt.figure() 148 | 149 | ax = fig.add_subplot(111) 150 | 151 | cores = plt.cm.tab10.colors[:n_colors] 152 | cores = ListedColormap(cores) 153 | 154 | x = dataframe[columns[0]] 155 | y = dataframe[columns[1]] 156 | 157 | ligar_centroids = show_centroids 158 | ligar_pontos = show_points 159 | 160 | for i, centroid in enumerate(centroids): 161 | if ligar_centroids: 162 | ax.scatter(*centroid, s=500, alpha=0.5) 163 | ax.text( 164 | *centroid, 165 | f"{i}", 166 | fontsize=20, 167 | horizontalalignment="center", 168 | verticalalignment="center", 169 | ) 170 | 171 | if ligar_pontos: 172 | s = ax.scatter(x, y, c=column_clusters, cmap=cores) 173 | ax.legend(*s.legend_elements(), bbox_to_anchor=(1.3, 1)) 174 | 175 | ax.set_xlabel(columns[0]) 176 | ax.set_ylabel(columns[1]) 177 | ax.set_title("Clusters") 178 | 179 | plt.show() 180 | 181 | 182 | def plot_columns_percent_by_cluster( 183 | dataframe, 184 | columns, 185 | rows_cols=(2, 3), 186 | figsize=(15, 8), 187 | column_cluster="cluster", 188 | ): 189 | """Função para gerar gráficos de barras com a porcentagem de cada valor por cluster. 190 | 191 | Parameters 192 | ---------- 193 | dataframe : pandas.DataFrame 194 | Dataframe com os dados. 195 | columns : List[str] 196 | Lista com o nome das colunas (strings) a serem utilizadas. 197 | rows_cols : tuple, opcional 198 | Tupla com o número de linhas e colunas do grid de eixos, por padrão (2, 3) 199 | figsize : tuple, opcional 200 | Tupla com a largura e a altura da figura, por padrão (15, 8) 201 | column_cluster : str, opcional 202 | Nome da coluna com os números dos clusters, por padrão "cluster" 203 | """ 204 | 205 | fig, axs = plt.subplots( 206 | nrows=rows_cols[0], ncols=rows_cols[1], figsize=figsize, sharey=True 207 | ) 208 | 209 | if not isinstance(axs, np.ndarray): 210 | axs = np.array(axs) 211 | 212 | for ax, col in zip(axs.flatten(), columns): 213 | h = sns.histplot( 214 | x=column_cluster, 215 | hue=col, 216 | data=dataframe, 217 | ax=ax, 218 | multiple="fill", 219 | stat="percent", 220 | discrete=True, 221 | shrink=0.8, 222 | ) 223 | 224 | n_clusters = dataframe[column_cluster].nunique() 225 | h.set_xticks(range(n_clusters)) 226 | h.yaxis.set_major_formatter(PercentFormatter(1)) 227 | h.set_ylabel("") 228 | h.tick_params(axis="both", which="both", length=0) 229 | 230 | for bars in h.containers: 231 | h.bar_label( 232 | bars, 233 | label_type="center", 234 | labels=[f"{b.get_height():.1%}" for b in bars], 235 | color="white", 236 | weight="bold", 237 | fontsize=11, 238 | ) 239 | 240 | for bar in h.patches: 241 | bar.set_linewidth(0) 242 | 243 | plt.subplots_adjust(hspace=0.3, wspace=0.3) 244 | 245 | plt.show() 246 | 247 | 248 | def plot_columns_percent_hue_cluster( 249 | dataframe, 250 | columns, 251 | rows_cols=(2, 3), 252 | figsize=(15, 8), 253 | column_cluster="cluster", 254 | palette="tab10", 255 | ): 256 | """Função para gerar gráficos de barras com a porcentagem de cada valor com cluster 257 | como hue. 258 | 259 | Parameters 260 | ---------- 261 | dataframe : pandas.DataFrame 262 | Dataframe com os dados. 263 | columns : List[str] 264 | Lista com o nome das colunas (strings) a serem utilizadas. 265 | rows_cols : tuple, opcional 266 | Tupla com o número de linhas e colunas do grid de eixos, por padrão (2, 3) 267 | figsize : tuple, opcional 268 | Tupla com a largura e a altura da figura, por padrão (15, 8) 269 | column_cluster : str, opcional 270 | Nome da coluna com os números dos clusters, por padrão "cluster" 271 | palette : str, opcional 272 | Paleta a ser utilizada, por padrão "tab10" 273 | """ 274 | fig, axs = plt.subplots( 275 | nrows=rows_cols[0], ncols=rows_cols[1], figsize=figsize, sharey=True 276 | ) 277 | 278 | if not isinstance(axs, np.ndarray): 279 | axs = np.array(axs) 280 | 281 | for ax, col in zip(axs.flatten(), columns): 282 | h = sns.histplot( 283 | x=col, 284 | hue=column_cluster, 285 | data=dataframe, 286 | ax=ax, 287 | multiple="fill", 288 | stat="percent", 289 | discrete=True, 290 | shrink=0.8, 291 | palette=palette, 292 | ) 293 | 294 | if dataframe[col].dtype != "object": 295 | h.set_xticks(range(dataframe[col].nunique())) 296 | 297 | h.yaxis.set_major_formatter(PercentFormatter(1)) 298 | h.set_ylabel("") 299 | h.tick_params(axis="both", which="both", length=0) 300 | 301 | for bars in h.containers: 302 | h.bar_label( 303 | bars, 304 | label_type="center", 305 | labels=[f"{b.get_height():.1%}" for b in bars], 306 | color="white", 307 | weight="bold", 308 | fontsize=11, 309 | ) 310 | 311 | for bar in h.patches: 312 | bar.set_linewidth(0) 313 | 314 | legend = h.get_legend() 315 | legend.remove() 316 | 317 | labels = [text.get_text() for text in legend.get_texts()] 318 | 319 | fig.legend( 320 | handles=legend.legend_handles, 321 | labels=labels, 322 | loc="upper center", 323 | ncols=dataframe[column_cluster].nunique(), 324 | title="Clusters", 325 | ) 326 | 327 | plt.subplots_adjust(hspace=0.3, wspace=0.3) 328 | 329 | plt.show() 330 | --------------------------------------------------------------------------------