# ---
# jupyter:
#   jupytext:
#     text_representation:
#       extension: .py
#       format_name: light
#       format_version: '1.5'
#       jupytext_version: 1.14.4
#   kernelspec:
#     display_name: Python 3
#     language: python
#     name: python3
# ---

# # Regressão logística

# Determinar se um usuário comprou uma SUV baseado em sua idade e estimativa salarial

# Dataset obtido no Kaggle (https://www.kaggle.com/hamzaalijoiyah/users-of-a-social-networks-who-bought-suv)

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

dados = pd.read_csv('Social_Network_Ads.csv')

dados.head()

sns.scatterplot(x='Age',y='EstimatedSalary',data=dados,hue='Purchased')
plt.xlabel('Idade')
plt.ylabel('Salário')
plt.tight_layout()

# A coluna ID do usuário não é relevante e será removida

dados = dados.drop('User ID',axis=1)

dados.head()

# Informações iniciais da amostra

dados.info()

# Verificando a existência de NaNs

dados.isna().sum()

# Determinando número de clientes homens ou mulher

sns.countplot(x='Gender',data=dados)

# Verificando distribuição das idades

sns.distplot(dados['Age'])

# Verificando distribuição da renda

sns.distplot(dados['EstimatedSalary'])

# Verificando quantidade de clientes quem compraram ou não SUV

sns.countplot(x='Purchased',data=dados)

# A coluna genero (Gender) precisa ser transformada de variável categórica para variável numérica

from sklearn.preprocessing import LabelEncoder

le = LabelEncoder()

le.fit(dados['Gender'])

list(le.classes_)

dados['Gender'] = le.transform(dados['Gender'])

dados.head()

# Normalizando os dados dos salários

from sklearn.preprocessing import StandardScaler

sc_X=StandardScaler()

dados[['Age','EstimatedSalary']] = sc_X.fit_transform(dados[['Age','EstimatedSalary']])

dados.head()

# Separando as variáveis X e Y

X = dados.drop('Purchased',axis=1).values
Y = dados['Purchased'].values

# Separando dados em amostras de treino e teste

from sklearn.model_selection import train_test_split
X_treino,X_teste,Y_treino,Y_teste=train_test_split(X,Y,test_size=0.25,random_state=0)

# Aplicando modelo de regressão logística

from sklearn.linear_model import LogisticRegression

modelo = LogisticRegression()

modelo.fit(X_treino,Y_treino)

# Realizando previsão na amostra de teste

Y_previsto = modelo.predict(X_teste)

# Determinando a matriz de confusão para verificar eficácio do modelo

from sklearn.metrics import confusion_matrix

cm=confusion_matrix(Y_teste,Y_previsto)

cm

sns.heatmap(cm,annot=True, fmt="d")

# Calculando as métricas do modelo

from sklearn.metrics import classification_report,f1_score,precision_score,average_precision_score,recall_score,accuracy_score

# Relatório de classificação

cr = classification_report(Y_teste,Y_previsto,labels=[0,1])
print(cr)

# F1-score

f1 = f1_score(Y_teste,Y_previsto)
print("F1 score = {:0.2f}%".format(f1*100))

# Precision score

precisao = precision_score(Y_teste,Y_previsto)
print("Precision score = {:0.2f}%".format(precisao*100))

# Average precision score

avg_precision = average_precision_score(Y_teste,Y_previsto)
print("Averaged Precision score = {:0.2f}%".format(avg_precision*100))

# Recall score

rec = recall_score(Y_teste,Y_previsto)
print("Recall score = {:0.2f}%".format(rec*100))

# Accuracy score

acc = accuracy_score(Y_teste,Y_previsto)
print("Accuracy score = {:0.2f}%".format(acc*100))

# # Curva ROC

from sklearn.metrics import roc_curve, roc_auc_score

roc_score = roc_auc_score(Y_teste, Y_previsto)
print("ROC score = {:0.2f}%".format(roc_score*100))

roc_fpr, roc_tpr, _ = roc_curve(Y_teste, Y_previsto)

plt.plot(roc_fpr, roc_tpr, linestyle='--')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')

# # Curva Precision-Recall

from sklearn.metrics import precision_recall_curve,auc

lr_precision, lr_recall, _ = precision_recall_curve(Y_teste, Y_previsto)
lr_auc = auc(lr_recall, lr_precision)

print("AUC score = {:0.2f}%".format(lr_auc*100))

plt.plot(lr_recall, lr_precision)
plt.xlabel('Recall')
plt.ylabel('Precision')



StarcoderdataJupyterScriptsDedupFiltered