<jupyter_start><jupyter_text>MASTER DATA SCIENCE: NUCLIO PROFESOR: <NAME> CLASE 3: EDA + Visualización + Preprocesamiento<jupyter_code>'''
En este ejercicio vamos a analizar el dataset de un seguro médico, este dataset contiene características de una persona y el precio que se le aplica

Vamos a realizar lo siguiente:

EDA: Explorar los datos
Data Cleaning: Limpiar los datos en blanco, así como detectar outliers y errores lógicos de información
Visualization
Pre-processing
¡Vamos a ello!


'''
#importamos librería
import pandas as pd 
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import math
from sklearn.preprocessing import LabelEncoder,MinMaxScaler, StandardScaler<jupyter_output><empty_output><jupyter_text>LIMPIEZA (hasta el punto 3)<jupyter_code>df_seguro = pd.read_csv("Datasets/dataset_seguros_sin_nulos.csv", sep=";")
'''1. ESTRUCTURA DE DATOS '''
# 1338 filas
# 9 columnas
df_seguro.info()
df_seguro.describe()
df_seguro.shape
'''2. DETECCION DE NULOS'''
df_seguro.isnull().sum()
'''3. VERIFICAMOS FILAS REPETIDAS'''
df_seguro[df_seguro.duplicated(keep=False)]
# ELIMINAMOS DUPLICADOS PORQUE AL MODELO LE INTERESA LA VARIEDAD DE LOS DATOS
df_seguro_sin_duplicados = df_seguro.drop_duplicates().copy(deep=True)
df_seguro_sin_duplicados.reset_index(drop=True, inplace=True)
# 1337 filas
# 9 columnas
df_seguro_sin_duplicados.info()<jupyter_output><class 'pandas.core.frame.DataFrame'>
RangeIndex: 1337 entries, 0 to 1336
Data columns (total 9 columns):
 #   Column       Non-Null Count  Dtype  
---  ------       --------------  -----  
 0   EDAD         1337 non-null   int64  
 1   SEXO         1337 non-null   object 
 2   IMC          1337 non-null   float64
 3   PESO         1337 non-null   int64  
 4   HIJOS        1337 non-null   int64  
 5   TIENE_HIJOS  1337 non-null   int64  
 6   FUMADOR      1337 non-null   object 
 7   CIUDAD       1337 non-null   object 
 8   PRECIO       1337 non-null   int64  
dtypes: float64(1), int64(5), object(3)
memory usage: 94.1+ KB<jupyter_text>otro<jupyter_code>'''4. ANALISIS UNIVARIABLE'''
df_seguro_sin_duplicados["EDAD"].unique()
for i in df_seguro_sin_duplicados.columns:
    print("\n",i, df_seguro_sin_duplicados[i].unique(),"\n")
for i in df_seguro_sin_duplicados.columns:
    print("\n",i, df_seguro_sin_duplicados[i].value_counts(),"\n")
for i in df_seguro_sin_duplicados.columns:
    print("\n",i, df_seguro_sin_duplicados[i].hist(),"\n")

    # asi los histogramas se sovraponen
print("\n",i, df_seguro_sin_duplicados["EDAD"].hist(),"\n")
'''5. SEPARAMOS NUESTRAS VARIABLES EN: TARGET, CATEGORICAS, BOOLEAN Y NUMERICAS'''
'''6. LOGICA DE LAS VARIABLES'''
# VISUALIZACION
target=["PRECIO"]<jupyter_output><empty_output><jupyter_text>funcion importante !!!<jupyter_code># ver el tipo de datos

def obtener_lista_variables(dataset):
    lista_numericas=[]
    lista_boolean=[]
    lista_categorica=[]
    for i in dataset:
        if (dataset[i].dtype=="float64" or dataset[i].dtype=="int64") and i not in target and len(dataset[i].unique())!=2:
            lista_numericas.append(i)
        elif (dataset[i].dtype=="float64" or dataset[i].dtype=="int64") and i not in target and len(dataset[i].unique())==2:
            lista_boolean.append(i)
        elif (dataset[i].dtype=="object") and i not in target:
            lista_categorica.append(i)
    return lista_numericas, lista_boolean, lista_categorica
lista_numericas, lista_boolean, lista_categoricas = obtener_lista_variables(df_seguro_sin_duplicados)
for i in lista_numericas:
    df_seguro_sin_duplicados.hist(column=i)
    # con 30 años hay un poco demas que 100 personas
'''7. PREPROCESAMIENTO'''
# el DF esta todo limpio, hago check point 
df_seguro_clean = df_seguro_sin_duplicados.copy(deep=True)
# NORMALIZAR LAS VARIABLES
'''7.1 CORRELACION: DETECTAR SI HAY VARIABLES QUE EXPLICAN LO MISMO'''

corr = df_seguro_clean.corr()
sns.heatmap(corr, annot=True)
corr.style.background_gradient(cmap="coolwarm")
# desde 0.85/0.90 se eliminan las variables
# se eliminan 
del(df_seguro_clean["PESO"])
'''7.2 ANALISIS DEL TARGET'''
df_seguro_clean.hist(column="PRECIO")

# galton board normal distribution -> mirar el viedo youtube
# cheat sheet para entender cual es el mejor metodo: https://www.datacamp.com/community/data-science-cheatsheets
# SESGO = BIAS = SUPERFICIAL
# este histograma me dice que la distribution es: skewed  !!!
outliers_precio = sns.boxplot(x=df_seguro_clean["PRECIO"])
# muy complicado por el modelo predicir valores mayor de 3000
df_seguro_clean["LOG_PRECIO"]=np.log10(df_seguro_clean["PRECIO"])
outliers_precio = sns.boxplot(x=df_seguro_clean["LOG_PRECIO"])
'''7.3 TARGET VS VARIABLES INDEPENDIENTES'''
df_seguro_clean.head()
# ver como se comportan las variables en respecto al PRECIO
sns.violinplot(x="SEXO",y="PRECIO", data=df_seguro_clean)
# la variable SEXO no influe sobre el precio
sns.violinplot(x="FUMADOR",y="PRECIO", data=df_seguro_clean)
sns.violinplot(x="CIUDAD",y="PRECIO", data=df_seguro_clean)
# por las variables NUMERICAS mejor un SCATTERPLOT para entender si se influencian
sns.scatterplot(x="EDAD",y="PRECIO", data=df_seguro_clean)
sns.violinplot(x="EDAD",y="PRECIO", data=df_seguro_clean)

# este grafico no nos dice NADA
'''7.4 REESCALAR VARIABLES'''
# reescalar significa -> trasformar las variables
# asignar un numero a las ciudades -> pero eso da mas peso a una ciudad que otra -> asi que hacemos ????? -> pues una columna por cada ciudad y ponemos 0 y 1
df_seguro_prep_categ = pd.get_dummies(data=df_seguro_clean,
                                        prefix=None,
                                        prefix_sep="_",
                                        columns=lista_categoricas,
                                        drop_first=True # possiamo eliminare una delle due colonne (per es se e maschio, non ho bisogno della colonna femmina, che gia lo so)
                                        )
df_seguro_prep_categ
'''
Nuestro objetivo es predecir el precio del seguro médico, vamos a utilizar las siguientes estrategias
Label Encoding
One Hot Encoding
Min max scaling
'''<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.10586505472961934, 'fraction_numerical': 0.02172847573925829, 'mean_word_length': 4.140218303946264, 'pattern_counts': {'":': 0, '<': 18, '<?xml version=': 0, '>': 23, 'https://': 1, 'lorem ipsum': 0, 'www.': 1, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 5, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '4', 'dir': 'jupyter-structured-clean-dedup', 'id': '162462', 'license': 'MIT', 'n_tokens_mistral': 2330, 'n_tokens_neox': 2217, 'n_words': 556, 'path': 'Clase3_Preprocesamiento_en_clase.ipynb', 'repo_name': 'alfredo-bb/Nuclio-proyects', 'size': '6129'}