Análisis de Enfermedades Cardiovasculares¶
El preprocesamiento de datos es uno de los pasos mas importantes a la hora de trabajar de manera eficiente. Es por eso que este post lo dedico a el paso a paso desde la extraccion y limpieza del dataset, pasando por la discretizacion de variables (OneHot Encoding), hasta finalmente el código para guardar el dataset limpio y procesado.
Se realiza un Análisis de Datos Exploratorio (EDA) no visual sobre el dataset de enfermedades cardiacas extraido de la página oficial de repositorios de Machine Learning de la Universidad de California Irvine UCI.
Descripción del conjunto de datos.¶
Descripción de los datos Hay 14 características:
1 'Edad' : Edad en años¶
continuo: unidades edad = años
2 'Sexo' |¶
categórico | 1 = hombre 0 = mujer
3 'Tipo de dolor en el pecho' |¶
categórico | 1 = angina típica 2 = angina atípica 3 = dolor no anginoso 4 = asintomático
4 'Presión arterial en reposo' (al ingreso en el hospital en mmHg) |¶
continuo |
5 'Colesterol sérico' (en mg / dl) |¶
continuo |
'Azúcar en sangre en ayunas' (> 120 mg / dl) |¶
categórico | 1 = verdadero 0 = falso
'Electrocardiográfico en reposo' |¶
categórico | 0 = normal 1 = onda ST-T anormal 2 = hipertrofia ventricular izquierda Estes)
'Frecuencia cardíaca máxima alcanzada durante el ejercicio' (en bpm) |¶
continuo |
'Angina inducida por ejercicio' |¶
categórico 1 = si 0 = no
'Depresión del ST inducida por el ejercicio en relación con el reposo' |¶
continuo |
'Pendiente del segmento ST de ejercicio pico' |¶
categórico 1 = pendiente ascendente 2 = plano 3 = descendente
Inclinación del segmento ST del EKG durante el ejercicio.
'# Embarcaciones principales coloreadas por flouroscopia' |¶
categórico | 0 = color de fluoroscopia 0 1 = color de fluoroscopia 1 2 = color de fluoroscopia 2 3 = color de fluoroscopia 3
'Talasemia' |¶
categórico | 3 = normal 6 = defecto fijo 7 = defecto reversible
'diagnóstico' |¶
categórico | 0 = Sin enfermedad x> 0 = Enfermedad
Importar librerias¶
Lo primero que se realiza es importar las librerias necesarias para realizar el análisis.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
Definicion del archivo y nombres de columnas¶
#url="http://archive.ics.uci.edu/ml/machine-learning-databases/heart-disease/processed.cleveland.data"
file='processed.cleveland.data'
nombresCol=['Edad',
'Sexo',
'Tipo dolor de pecho',
'Presión arterial en reposo',
'Colesterol',
'Glucemia',
'Electrocardiograma',
'Frecuencia cardíaca máxima',
'Angina inducida',
'Depresión del ST',
'Pendiente máxima del segmento ST',
'# Vasos principales coloreados por flouroscopia',
'Talasemia',
'Diagnóstico']
Carga de Datos¶
Se cargan los datos y se guardan en data:
data=pd.read_csv(file, names=nombresCol)
Analisis Exploratorio de Datos¶
Se observan las primeras 10 muestras del dataset:
data.head(10)
Tranformacion de la variable predictiva 'Diagnóstico' en binaria¶
El interes de este trabajo es identificar si predice o no una enfermedad cardiaca independientemente de cual sea el tipo de esta. Para ello, se transforma la columna 'Diagnóstico' para que presente solamente valores de 0 y 1.
data["Diagnóstico"]=np.where((data["Diagnóstico"]>0),1,0)
Inspeccion del tipo de datos¶
data.dtypes
Aparentemente las columnas 11 y 12 son numéricas pero data.dtypes muestra que son de tipo "object" lo que significa que dentro de estas columnas se encuentran valores de tipo 'cadena de texto' o Strings. Inpeccionando los valores únicos dentro de estas dos columnas se encuentra:
df['# Vasos principales coloreados por flouroscopia'].unique() df['Talasemia (normal, Corregir. Defecto, invertir. Defecto)'].unique()
for columna in data.iloc[:,11:13]:
print(data[columna].value_counts())
Así se encuentra que:
la columna 11'# Vasos principales coloreados por flouroscopia' y la columna 12 'Talasemia (normal, Corregir. Defecto, invertir. Defecto)' tienen 2 y 4 valores respectivamente escritos como "?"
Dado que son solo 6 valores en total y no es un numero significante de valores nulos se procede a eliminarlos.
Se revisa todas las caracteristicas para ver si se encuentran otro tipo de datos extraños.
for i in df.columns: print(df[i].value_counts())
todo parece encontrarse bien asi que se continua. El siguiente paso es tomar estas dos columnas y transformarlas a numericas. Para esto, primero se eliminan los 6 registros con valores nulos.
Se remplazan los valores '?' en las columnas por el valor nan
data=data.replace('?',np.nan)
Se procede a eliminar las muestras que presentan estos valores inválidos
data=data.dropna(axis=0)
data.isnull().sum()
data['# Vasos principales coloreados por flouroscopia']=data['# Vasos principales coloreados por flouroscopia'].astype(str).astype(float).astype(int)
data['Talasemia']=data['Talasemia'].astype(str).astype(float).astype(int)
data.dtypes
Ingenieria de atributos¶
data.nunique()
dolor_de_pecho_dummy=pd.get_dummies(data['Tipo dolor de pecho'],prefix='Tipo dolor de pecho')
electro_dummy=pd.get_dummies(data['Electrocardiograma'],prefix='Electrocardiograma')
pendiente_dummy=pd.get_dummies(data['Pendiente máxima del segmento ST'],prefix='Pendiente máxima del segmento ST')
fluo_dummy=pd.get_dummies(data['# Vasos principales coloreados por flouroscopia'], prefix='# Vasos principales coloreados por flouroscopia')
talasemia_dummy=pd.get_dummies(data['Talasemia'],prefix='Talasemia')
nueva_data=pd.concat([data,dolor_de_pecho_dummy,electro_dummy,pendiente_dummy,fluo_dummy,talasemia_dummy],axis=1)
# se eliminan las antiguas columnas
nueva_data=nueva_data.drop(['Tipo dolor de pecho','Electrocardiograma','Pendiente máxima del segmento ST','# Vasos principales coloreados por flouroscopia','Talasemia'], axis=1)
nueva_data.head()
for i in nueva_data.columns:
print(i)
nueva_data.to_csv('preprocessed_heart_data.csv', index=False)
No hay comentarios:
Publicar un comentario
Nota: solo los miembros de este blog pueden publicar comentarios.