Python
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

# Carregar os dados da planilha Excel
file_path = 'ROC.xlsx'  # Substitua pelo caminho do seu arquivo
df = pd.read_excel(file_path)

# Limpeza dos dados: remover a primeira linha de cabeçalho repetida
df.columns = ['Cutpoint', 'Sensitivity', 'Specificity', 'PPV', 'NPV', 'Youden_index', 'AUC', 'Metric_Score']
df = df.drop(0)

# Converter a coluna 'Cutpoint' para float, garantindo que todos os valores
# sejam numéricos
df['Cutpoint'] = pd.to_numeric(df['Cutpoint'], errors='coerce')

# Converter porcentagens para valores numéricos
df['Sensitivity'] = df['Sensitivity'].str.rstrip('%').astype(float) / 100
df['Specificity'] = df['Specificity'].str.rstrip('%').astype(float) / 100

# Calcular o falso positivo rate (1 - Specificity) e o verdadeiro positivo rate
# (Sensitivity)
fpr = 1 - df['Specificity']
tpr = df['Sensitivity']

# Ordenar os valores de acordo com os cutpoints
sorted_indices = np.argsort(df['Cutpoint'])
fpr = fpr.iloc[sorted_indices]
tpr = tpr.iloc[sorted_indices]

# Gerar a Curva ROC
plt.figure(figsize=(10, 8))
plt.plot(fpr, tpr, color='darkorange', lw=2, label='ROC curve')
plt.xlabel('False Positive Rate (1 - Specificity)')
plt.ylabel('True Positive Rate (Sensitivity)')
plt.title('Receiver Operating Characteristic (ROC) Curve')
plt.legend(loc='lower right')
plt.show()

# Encontrar o melhor cutpoint utilizando o índice de Youden
best_cutpoint = df.loc[df['Youden_index'].astype(float).idxmax()]
print(f"Melhor cutpoint: {best_cutpoint['Cutpoint']}")

# Criar um gráfico de contagem baseado no melhor cutpoint
plt.figure(figsize=(10, 8))
df['Above_Cutpoint'] = df['Cutpoint'] >= best_cutpoint['Cutpoint']
df['Above_Cutpoint'].value_counts().plot(kind='bar', color=['blue', 'orange'])
plt.title('Gráfico de Contagem baseado no Melhor Cutpoint')
plt.xlabel('Above Cutpoint')
plt.ylabel('Count')
plt.xticks([0, 1], ['False', 'True'], rotation=0)
plt.show()
Melhor cutpoint: 16.54
Python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.metrics import roc_curve, auc
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import LabelEncoder
from sklearn.impute import SimpleImputer

# Função para carregar os dados do arquivo Excel
def load_data_from_excel(file_path):
    # Lendo o arquivo Excel, ajustando o separador de milhar e decimal
    df = pd.read_excel(file_path, decimal=',', thousands='.')
    
    # Extraindo as colunas 3P Mace e TAE
    mace = df.iloc[:, 0].values  # Primeira coluna (A) -> 3P Mace
    TAE = df.iloc[:, 1].values  # Segunda coluna (B) -> TAE (cm²)
    
    return TAE, mace

# Caminho do arquivo Excel (substitua pelo caminho do seu arquivo)
file_path = '3P MACE.xlsx'

# Carregando os dados
TAE, mace = load_data_from_excel(file_path)

# Preenchendo valores ausentes (NaN) na coluna TAE com a mediana
imputer = SimpleImputer(strategy='median')
TAE = imputer.fit_transform(TAE.reshape(-1, 1)).flatten()

# Codificando os dados binários de 3P Mace como 0 e 1
label_encoder = LabelEncoder()
mace_encoded = label_encoder.fit_transform(mace)  # 'No' -> 0, 'Yes' -> 1

# Dividindo os dados em treino e teste
X_train, X_test, y_train, y_test = train_test_split(TAE.reshape(-1, 1), mace_encoded, test_size=0.3, random_state=42)

# Treinando um modelo de regressão logística
model = LogisticRegression()
model.fit(X_train, y_train)

# Prevendo as probabilidades de classe para os dados de teste
y_scores = model.predict_proba(X_test)[:, 1]

# Calculando a curva ROC
fpr, tpr, thresholds = roc_curve(y_test, y_scores)
roc_auc = auc(fpr, tpr)

# Plotando a curva ROC
plt.figure()
plt.plot(fpr, tpr, color='darkorange', lw=2, label=f'Curva ROC (área = {roc_auc:.2f})')
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('Taxa de Falsos Positivos')
plt.ylabel('Taxa de Verdadeiros Positivos')
plt.title('Curva ROC para TAE (cm²) e 3P Mace')
plt.legend(loc="lower right")
plt.show()