<jupyter_start><jupyter_text>Tema do Projeto:Uso de Medicamentos Apresentação dos Dados Neste estudo serão utilizados dados coletados do repositório Kaggle disponibilizados no seguinte link: (https://www.kaggle.com/ibrahimbahbah/drug200Com base neste dataset, será feito um modelo preditivo para a possibilidade de ter ou não diabetes tipo 2. Problema a ser resolvido 1-Classificar os pacientes  para usar o medicamento corretamente2-Verificar  qual algoritmo (Naive Bayes /Random Forest) é mais eficiente para obter resposta correta Objetivos do ProjetoInstalar e importar bibliotecas apropriadasPré-processar os dadosEstabelecer as Variáveis Preditoras e de ClasseRealizar tratamento de atributos categóricos usando o LabelEncoder Tratar os dados desbalanceados s/n usando Tomek LinksEscalonar os AtributosDividir a base de dados em Treinamento e TesteTreinar o algoritmo Naive Baiyes  e Random ForestTestar o algoritmo utilizando a matriz de confusão, a função accuracy_score e a classification_report Importando Bibliotecas e Dados<jupyter_code>! pip install pyod
!pip  install plotly --upgrade
import pandas as pd  # biblioteca para manipulação de dados
import numpy as np # biblioteca para manipulação de  dados numéricos
import seaborn as sns # biblioteca para otimizar gráficos
import matplotlib.pyplot as plt # biblioteca para geração de gráficos
import plotly.express as px  # biblioteca para geração de gráficos interativos
import sklearn # bilioteca para subsidiar Machine Learning
import plotly.graph_objects as go # para concatenar graficos
from sklearn.preprocessing import StandardScaler #para escalonar variaveis
from sklearn.naive_bayes import GaussianNB #  para  usar o Naive Bayes
from sklearn.preprocessing import LabelEncoder #para transformar  variaveis
from sklearn.preprocessing import StandardScaler #para escalonar variaveis
from sklearn.compose import ColumnTransformer #para transformar variaveis
from sklearn.model_selection import train_test_split  #para dividir base de teste e treinamento
from sklearn.metrics import accuracy_score #para avaliar a acurácia
import pickle
from sklearn.metrics import confusion_matrix
from sklearn.metrics import classification_report
from yellowbrick.classifier import ConfusionMatrix
from numpy.ma.core import filled
from IPython.core.pylabtools import figsize
from pyod. models.knn import KNN
from imblearn.under_sampling import TomekLinks
from sklearn.ensemble import RandomForestClassifier
from google.colab import files
uploaded = files.upload()<jupyter_output><empty_output><jupyter_text>Pré-Processamento dos Dados<jupyter_code>Medicamento = pd.read_csv ('/content/drug200.csv')
print( ' Este dataset tem %s linhas e %s colunas' % (Medicamento.shape[0] , Medicamento.shape[1] ) )
Medicamento.head(10)
Medicamento.tail()<jupyter_output><empty_output><jupyter_text>**Acima você pode conferir as primeiras e últimas linhas do dataset e o total de linhas e colunas. Como os dados podem causar certa confusão, será alterado o idioma dos cabeçalhos das colunas.**<jupyter_code>Medicamento.columns = ['Idade','Sexo',' Pressao_Arterial','Colesterol','Razao_Sodio_Potassio_sangue','Medicamentos']
Medicamento.head()<jupyter_output><empty_output><jupyter_text>**Continuando a tratamento dos dados, serão renomeados os registros das colunas Pressao_Arterial, Colesterol e Medicamentos para melhor compreensão. Antes de renomear, será necessário, verificar os registros que serão alterados. Para isto , usaremos a função unique.**<jupyter_code>np.unique (Medicamento[' Pressao_Arterial'])
np.unique (Medicamento['Colesterol'])
np.unique (Medicamento['Medicamentos'])
Medicamento[' Pressao_Arterial']= Medicamento [' Pressao_Arterial']. replace ( ['HIGH','LOW','NORMAL'], ['Alta','Baixa', 'Normal'])
Medicamento['Colesterol']= Medicamento ['Colesterol']. replace ( ['HIGH','NORMAL'], ['Alto', 'Normal'])
Medicamento['Medicamentos']= Medicamento ['Medicamentos']. replace ( ['DrugY','drugA','drugB','drugC','drugX'], ['DrogaY','DrogaA', 'DrogaB','DrogaC','DrogaX'])
Medicamento.head()
Medicamento.tail()<jupyter_output><empty_output><jupyter_text>**Vejamos um Resumo do Dataset.**<jupyter_code>Medicamento.describe()<jupyter_output><empty_output><jupyter_text>**Como se observa a idade média é de 44 anos, sendo a idade mínima 15 e a máxima 74. A razão sódio potássio, assim como a  idade,  apresenta dados desbalanceados.** **Após este processamento inicial será caracterizado os tipos de variáveis e seus significados.**<jupyter_code>Medicamento.dtypes<jupyter_output><empty_output><jupyter_text>**Se tem 2 variáveis Numéricas e 4 Categóricas, assim classificadas:**Idade : Numérica DiscretaRazao_Sodio_Potassio_sangue: Numérica ContínuaPressao_Arterial, Colesterol : Categórica OrdinalMedicamentos: Categórica Nominal **Dicionário de Dados**    *   Idade: Idade da pessoa*  Razao_Sodio_Potassio_sangue: Razão entre sódio e potássio*   Colesterol: valores em mg/dL, classificado em alto ou normal*   Pressão Aterial:classificada em alta,normal e baixa*   Sexo: Sexo*  Medicamentos: 5 tipos de medicamentos usados  **Prosseguindo o processamento de dados, será analisado se há valores faltantes e inconsistentes**<jupyter_code>Medicamento.isnull()
Medicamento.isnull().sum()
Medicamento.loc[Medicamento['Idade']<=0]
Medicamento.loc [Medicamento['Razao_Sodio_Potassio_sangue']<=0]
np.unique(Medicamento['Medicamentos'],return_counts=True)<jupyter_output><empty_output><jupyter_text>**Não foram observados valores inconsistentes nem faltantes  no dataset, porém há dados desbalanceados na variável target. Agora, serão feitas as Visualizações gráficas, que ajudam a identificar,também, existência de valores inconsistentes** Visualizando Gráficos<jupyter_code>Medicamento["Idade"].hist()
sns.displot(Medicamento['Razao_Sodio_Potassio_sangue'],color='green')
Grafico = Medicamento['Medicamentos'].value_counts()
Grafico.plot(kind='pie', autopct='%1.2f%%')
sns.countplot(x=Medicamento['Sexo'])
Grafico1 = Medicamento['Colesterol'].value_counts()
Grafico1.plot(kind ='barh',color=['red','green'])
sns.countplot(x=Medicamento[' Pressao_Arterial']);<jupyter_output><empty_output><jupyter_text>**De acordo com as  visualizações acima, percebe-se que a maior frequência das idades  está entre 45 e 50 anos, a razão sódio/potásio entre 10 e 15, a maior quantidade de medicamento é da droga Y seguida da X, a quantidade  de homens e mulheres  tem pouca diferença, assim como os valores de colesterol  e os  valores  de pressão alta  se destaca pouco das baixas e normal.** **Não foram visualizados  valores inconsistentes.** **Verificando se há Outliers.**<jupyter_code>sns.boxplot(y= 'Razao_Sodio_Potassio_sangue',data= Medicamento,color='yellow');
sns.boxplot(y= 'Idade',data= Medicamento,color='orange');
grafico= px.scatter(x=Medicamento['Razao_Sodio_Potassio_sangue'], y=Medicamento['Idade'])
grafico.show()<jupyter_output><empty_output><jupyter_text>**O  que se percebe  é  que  os  registros estão dispersos  e  que há  uma correlação entre razão sódio/potássio e idade. Será feito então uma análise utilizando a biblioteca pyod. **<jupyter_code>detector = KNN()
detector.fit(Medicamento.iloc[:,[0,4]])
previsores = detector.labels_
previsores
np.unique( previsores,return_counts=True)<jupyter_output><empty_output><jupyter_text>**Foram detectados 20 outliers. O número 0 representa a não presença de outliers e o 1 a presença.Porém pela análise gráfica, fica difícil dizer  se  estes outliers são significativos.** **Verificando a confiabilidade dos previsores.**<jupyter_code>confianca_previsoes = detector.decision_scores_
confianca_previsoes
outliers =[]
for i in range(len(previsores)):
   if previsores[i]== 1:
     outliers.append(i)
print(outliers)<jupyter_output>[19, 22, 24, 26, 33, 48, 60, 65, 69, 92, 93, 96, 98, 128, 131, 164, 168, 184, 188, 194]<jupyter_text>**Estes são os indices que se encontram os outliers.** Preparando o banco de dados para análise dos algoritmos Dividindo as Variáveis Preditoras e de Classe ***Serão criadas duas variáveis: a X será a variável preditora e a Y a de classe ***<jupyter_code>X_Medicamento = Medicamento.iloc[:,0:5].values
X_Medicamento
type(X_Medicamento)
type(Medicamento)
Y_Medicamento = Medicamento.iloc[:,5].values
Y_Medicamento<jupyter_output><empty_output><jupyter_text>Tratando atributos Categóricos com Label Encoder<jupyter_code>label_encoder_Sexo = LabelEncoder()
label_encoder_Pressao_Arterial = LabelEncoder()
label_encoder_Colesterol = LabelEncoder()
X_Medicamento[:,1]=label_encoder_Sexo.fit_transform(X_Medicamento[:,1])
X_Medicamento[:,2]=label_encoder_Pressao_Arterial.fit_transform(X_Medicamento[:,2])
X_Medicamento[:,3]=label_encoder_Colesterol.fit_transform(X_Medicamento[:,3])
X_Medicamento<jupyter_output><empty_output><jupyter_text>Tratando os Dados Desbalanceados com Tomek Links<jupyter_code>np.unique(Medicamento['Medicamentos'],return_counts=True)
sns.countplot(x=Medicamento['Medicamentos'])
from imblearn.under_sampling import TomekLinks
tl= TomekLinks(sampling_strategy='majority')
X_under, Y_under = tl.fit_resample(X_Medicamento,Y_Medicamento)
X_under.shape,Y_under.shape
np.unique(Y_Medicamento,return_counts=True)
np.unique(Y_under,return_counts=True)<jupyter_output><empty_output><jupyter_text>Escalonando os Atributos **Vamos verificar os valores existentes inicialmente**<jupyter_code>X_under[:,0].min()
X_under[:,0].max()
X_under[:,4].min()
X_under[:,4].max()
X_under[:,4].min(),X_under[:,0].min()
X_under[:,4].max(),X_under[:,0].max()<jupyter_output><empty_output><jupyter_text>**Como há muito discrepância  entre os  valores idade e razão sódio/potássio, vamos padronizar os valores.**<jupyter_code>scaler_Medicamento = StandardScaler()
X_under = scaler_Medicamento.fit_transform(X_under)
X_under<jupyter_output><empty_output><jupyter_text>**Feito a Padronização, se procede à divisão das bases de dados em Treinamento e Teste.** Divisão Base de Treinamento e Teste **Serão criados 4 variáveis , duas para treinamento e 2 para teste.**<jupyter_code>X_under_treinamento, X_under_teste,Y_under_treinamento,Y_under_teste = train_test_split(X_under,Y_under, test_size=0.25,random_state=0)<jupyter_output><empty_output><jupyter_text>**Verificando as variáveis criadas.**<jupyter_code>X_under_treinamento.shape
X_under_teste.shape
Y_under_treinamento.shape
Y_under_teste.shape
X_under_teste.shape,Y_under_teste.shape<jupyter_output><empty_output><jupyter_text>Treinando  e Testando  o Algoritmo *Naive Bayes*<jupyter_code>naive_Tipo_Medicamento = GaussianNB()
naive_Tipo_Medicamento.fit(X_under_treinamento, Y_under_treinamento)<jupyter_output><empty_output><jupyter_text>**  Testando o Algoritmo  com  os  grupos X  e Y teste**<jupyter_code>previsao = naive_Tipo_Medicamento.predict(X_under_teste)
previsao<jupyter_output><empty_output><jupyter_text>**Comparando com os dados reais  que  estão na  base Y_under_Teste**<jupyter_code>Y_under_teste<jupyter_output><empty_output><jupyter_text>Métricas de Avaliação  do Algoritmo Naive Bayes  **Matriz de Confusão**<jupyter_code>confusion_matrix(Y_under_teste,previsao)
cm = ConfusionMatrix(naive_Tipo_Medicamento)
cm.fit(X_under_treinamento, Y_under_treinamento)
cm.score(X_under_teste,Y_under_teste)<jupyter_output><empty_output><jupyter_text>**Avaliando a Acurácia**<jupyter_code>accuracy_score (Y_under_teste,previsao)<jupyter_output><empty_output><jupyter_text>**Avaliando Precisão e Sensibilidade**<jupyter_code>print (classification_report(Y_under_teste,previsao))<jupyter_output>precision    recall  f1-score   support

      DrogaA       0.86      1.00      0.92         6
      DrogaB       0.25      0.50      0.33         2
      DrogaC       0.60      1.00      0.75         3
      DrogaX       1.00      1.00      1.00        16
      DrogaY       1.00      0.77      0.87        22

    accuracy                           0.88        49
   macro avg       0.74      0.85      0.78        49
weighted avg       0.93      0.88      0.89        49<jupyter_text>**Para  as  drogas A, C e X  tem uma  ótima sensibilidade,porém a precisão  não fica  boa na droga C. O recall e precisão da droga B é muito fraco. E para a droga Y não tem boa  sensibilidade se  considerarmos  que  estamos lidando com uso de medicamentos para pacientess, porém tem ótima precisão.** Treinando e testando o algoritmo *Random Forest*<jupyter_code>random_forest_Medicamento= RandomForestClassifier(n_estimators=10,criterion='entropy', random_state=0)
random_forest_Medicamento.fit(X_under_treinamento, Y_under_treinamento)
previsores= random_forest_Medicamento.predict(X_under_teste)
previsores
Y_under_teste<jupyter_output><empty_output><jupyter_text>Métricas de Avaliação do algoritmo Random Forest **Matriz de Confusão**<jupyter_code>confusion_matrix(Y_under_teste,previsores)
cm = ConfusionMatrix(random_forest_Medicamento)
cm.fit(X_under_treinamento, Y_under_treinamento)
cm.score(X_under_teste,Y_under_teste)<jupyter_output><empty_output><jupyter_text>**Avaliando a Acurácia**<jupyter_code>accuracy_score (Y_under_teste,previsores)<jupyter_output><empty_output><jupyter_text>**Avaliando Precisão e Sensibilidade**<jupyter_code>print (classification_report(Y_under_teste,previsores))<jupyter_output>precision    recall  f1-score   support

      DrogaA       0.86      1.00      0.92         6
      DrogaB       1.00      0.50      0.67         2
      DrogaC       1.00      1.00      1.00         3
      DrogaX       1.00      1.00      1.00        16
      DrogaY       1.00      1.00      1.00        22

    accuracy                           0.98        49
   macro avg       0.97      0.90      0.92        49
weighted avg       0.98      0.98      0.98        49
{'fraction_non_alphanumeric': 0.08927786729163616, 'fraction_numerical': 0.02021385674527611, 'mean_word_length': 6.045923632610939, 'pattern_counts': {'":': 0, '<': 112, '<?xml version=': 0, '>': 110, 'https://': 1, 'lorem ipsum': 0, 'www.': 1, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 7, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '28', 'dir': 'jupyter-structured-clean-dedup', 'id': '280989', 'license': 'MIT', 'n_tokens_mistral': 5114, 'n_tokens_neox': 4916, 'n_words': 1131, 'path': 'Projeto_Machine_Learning_Medicamentos.ipynb', 'repo_name': 'Catia2021/Projeto6_Machine_learning_Medicamentos', 'size': '13654'}