<jupyter_start><jupyter_text>Atividade 03 - B Considerando o conjunto de dados Heart Disease Data Set:6.Explore visualmente e numericamente os dados.7.Prepare os conjunto de dados utilizando as técnicas ensinadas na disciplina, quando pertinente.8.Crie agrupamentos utilizando K-Means e agrupamento hirárquico conforme estudado na disciplina. Pesquise também o DBSCAN, e aplique-o também. Escolha a técnica que obteve melhor resultado justificando a sua resposta.9.Envie a URL do jupyter notebook no GitHub.  ObjetivoConstruir uma aplicação utilizando modelos de regressão para estimar dados referentes a problemas cardiacos.   Passo 1. Setup do projeto<jupyter_code># Bibliotecas:
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
import sklearn
import matplotlib as mpl

# Para Git:
import joblib
import os
import urllib

print('Matplot version : {}'.format(mpl.__version__))
print('Numpy version : {}'.format(np.__version__))
print('Pandas version : {}'.format(pd.__version__))
print('Sklearn version : {}'.format(sklearn.__version__))

DATA_ROOT ='https://archive.ics.uci.edu/ml/machine-learning-databases/heart-disease/'
DATA_PATH = os.path.join('data', 'raw')
DATA_URL = DATA_ROOT + 'processed.cleveland.data' 

DATA_FILE = 'processed.cleveland.csv'
DATA_DATA = os.path.join(DATA_PATH, DATA_FILE)<jupyter_output>Matplot version : 3.1.3
Numpy version : 1.18.1
Pandas version : 1.0.1
Sklearn version : 0.22.1<jupyter_text>Passo 2 . Recuperação de Dados<jupyter_code>def download_data(data_url, data_path, data_file):
    os.makedirs(data_path, exist_ok=True)
    local_path = os.path.join(data_path, data_file)
    urllib.request.urlretrieve(data_url, local_path)
    
download_data(DATA_URL, DATA_PATH, DATA_FILE)



def load_data(data_path, data_file):
    local_path = os.path.join(data_path, data_file)
    return pd.read_csv(local_path)

data_df = load_data(DATA_PATH, DATA_FILE)<jupyter_output><empty_output><jupyter_text>Passo 3. Análise exploratória<jupyter_code>#data_df = pd.read_csv('/content/processed.cleveland.csv')
dat_df = pd.DataFrame(data_df)
dat_df.head()
dat_df.columns = ['idade', 'sexo', 'dor', 'pressão_sanguinea', 'colesterol', 'glicose',
             'ecg_em_repouso', 'freq_card_max', 'dor_causada_exer', 'oldpeak',
             'slope_peak_exercise', 'major_vessels', 'thal', 'diagnostico']
dat_df.head()
dat_df.describe()
dat_df.info()
# Verificando dados ausentes:
ausentes = (dat_df[dat_df.columns] == '?').sum()
print(ausentes)<jupyter_output>idade                  0
sexo                   0
dor                    0
pressão_sanguinea      0
colesterol             0
glicose                0
ecg_em_repouso         0
freq_card_max          0
dor_causada_exer       0
oldpeak                0
slope_peak_exercise    0
major_vessels          4
thal                   2
diagnostico            0
dtype: int64<jupyter_text>Passo 4. Preparação inicial dos dados:<jupyter_code>dat_df[dat_df.columns] = dat_df[dat_df.columns].replace('?', np.nan)
dat_df.dropna(axis = 0, inplace = True)
ausentes = (dat_df[dat_df.columns] == 'Nan').sum()
print(ausentes)
dat_df.info()
# Verificando os resultados possíveis para o diagnóstico:
dat_df['diagnostico'].unique()<jupyter_output><empty_output><jupyter_text>Passo 5. Criação dos Clusters  Agrupamento Hierarquico<jupyter_code>#Biblioteca:
from scipy.cluster.hierarchy import linkage, dendrogram
from sklearn.preprocessing import normalize

# Duplicação do documento para utilizar no Dendograma:
dat_den = dat_df.copy()

# Variavel para normalização
dat_den_norm = normalize(dat_den)
dat_den.head()
#Árvore de decisão:
mesclagens = linkage(dat_den_norm, method='complete')
eixo_x = list(dat_den.index)
_ = fig, ax = plt.subplots(figsize=(25,15))
_ = dendrogram(mesclagens, leaf_font_size=12, labels=eixo_x, ax=ax)
_ = plt.xticks(rotation=90)
_ = ax.set_ylabel('Distancia')<jupyter_output><empty_output><jupyter_text>KMeans<jupyter_code>#tranformar em matriz para podermos montar os gráficos:
dat = dat_df.iloc[:,:-1].values
dat_matriz = dat.copy()
dat
from sklearn.cluster import KMeans

kmeans = KMeans(n_clusters=5, random_state=42, init='k-means++')
y_kmeans = kmeans.fit_predict(dat)
y_kmeans
# contagem:
from collections import Counter

Counter(kmeans.labels_)
y_kmeans is kmeans.labels_

## as labels foram preservadas
centroids = kmeans.cluster_centers_
centroids_x = centroids[:, 0]
centroids_y = centroids[:, 4]
sns.set()
plt.figure(figsize=(20,15))

_ = plt.scatter(centroids_x, centroids_y, c='black', marker='x', s=100)

plt.scatter(dat[y_kmeans == 0, 0], dat[y_kmeans == 0, 4], s = 50, c = 'magenta', alpha=0.8)
plt.scatter(dat[y_kmeans == 1, 0], dat[y_kmeans == 1, 4], s = 50, c = 'orange', alpha=0.3)
plt.scatter(dat[y_kmeans == 2, 0], dat[y_kmeans == 2, 4], s = 50, c = 'purple', alpha=0.5)
plt.scatter(dat[y_kmeans == 3, 0], dat[y_kmeans == 3, 4], s = 50, c = 'blue', alpha=0.5)
plt.scatter(dat[y_kmeans == 4, 0], dat[y_kmeans == 4, 4], s = 50, c = 'red', alpha=0.5)
plt.title('Probabilidade de desenvolvimento de doenças cardíacas', fontsize=16)
plt.xlabel('Idade', fontsize=10)
plt.ylabel('Colesterol', fontsize=10)
plt.show()

# Comparação:

df = pd.DataFrame({'Grupos': y_kmeans, 'diagnostico': dat_df['diagnostico']})
ct = pd.crosstab(df['Grupos'], df['diagnostico'])
print(ct)
ks = range(1, 9)
inercias = []

for k in ks:
    modelo = KMeans(n_clusters=k)
    modelo.fit(dat)
    inercias.append(modelo.inertia_)

_ = plt.plot(ks, inercias)
_ = plt.title('Inércias', fontsize=15)
_ = plt.xlabel('k')
_ = plt.ylabel('Inercia')
_ = plt.xticks(ks)
#Análise da silhueta dos clusters do KMeans
#Biblioteca:
from sklearn.metrics import silhouette_score

kmeans_per_k = [KMeans(n_clusters=k, random_state=42).fit(dat) for k in range(1, 10)]
silhouette_scores = [silhouette_score(dat, modelo.labels_) for modelo in kmeans_per_k[1:]]

silhouette_scores
plt.figure(figsize=(8, 3))
plt.plot(range(2, 10), silhouette_scores)
plt.title('Análise da silhueta', fontsize=15)
plt.xlabel("k")
plt.ylabel("Score")
plt.show()<jupyter_output><empty_output><jupyter_text>DBSCAN<jupyter_code>#Biblioteca:
from sklearn.cluster import DBSCAN

#Variáveis:
dbscan = DBSCAN(eps=20, min_samples=4)
clusters = dbscan.fit_predict(dat_matriz)
clusters
sns.set()
plt.figure(figsize=(20, 15))

plt.scatter(dat_matriz[clusters == 0, 0], dat_matriz[clusters == 0, 4], s = 50, c = 'darkBlue', alpha=0.8)
plt.scatter(dat_matriz[clusters == 1, 0], dat_matriz[clusters == 1, 4], s = 50, c = 'magenta', alpha=0.8)
plt.scatter(dat_matriz[clusters == 2, 0], dat_matriz[clusters == 2, 4], s = 50, c = 'red', alpha=0.8)
plt.scatter(dat_matriz[clusters == 3, 0], dat_matriz[clusters == 3, 4], s = 50, c = 'orange', alpha=0.8)
plt.scatter(dat_matriz[clusters == 4, 0], dat_matriz[clusters == 4, 4], s = 50, c = 'yellow', alpha=0.8)

plt.title('Probabilidade de desenvolvimento de doenças cardíacas', fontsize=15)
plt.xlabel('Idade', fontsize=10)
plt.ylabel('Colesterol', fontsize=10)
plt.show()<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.13533941814033087, 'fraction_numerical': 0.025527666856816886, 'mean_word_length': 5.306654676258993, 'pattern_counts': {'":': 0, '<': 27, '<?xml version=': 0, '>': 27, 'https://': 1, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 2, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '7', 'dir': 'jupyter-structured-clean-dedup', 'id': '249348', 'license': 'MIT', 'n_tokens_mistral': 2933, 'n_tokens_neox': 2751, 'n_words': 578, 'path': 'atividade_final_b.ipynb', 'repo_name': 'AnnaGouvea/tarefa_final_AM1', 'size': '7012'}