{"cells":[{"metadata":{},"cell_type":"markdown","source":"## Librerias"},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"#Importo las librerias que voy a utilizar para EDA\n\nimport numpy as np \nimport pandas as pd \nimport cv2\nimport matplotlib\nimport matplotlib.pyplot as plt\nimport random\nimport seaborn as sns\nimport os\n%matplotlib inline","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Directorio"},{"metadata":{"trusted":true},"cell_type":"code","source":"path = '/kaggle/input/vinbigdata-chest-xray-abnormalities-detection/'\nos.listdir(path)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## **Lectura del CSV**"},{"metadata":{"trusted":true},"cell_type":"code","source":"#Realizo la lectura del dataset\n\ndf = pd.read_csv(path+\"train.csv\")","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Caracteristicas generales"},{"metadata":{"trusted":true},"cell_type":"code","source":"#Observo las primeras filas del DataFrame\n\ndf.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#Observo los tipos de datos por columna\n\ndf.dtypes","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#Observo el tamaño del dataframe\n\ndf.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#Listo las columnas del dataframe\n\ndf.columns","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#Observo la cantidad de registros para la columna 'class_name', la cual corresponde al nombre de la clase del objeto detectado\n\ncantidad_por_clase = df['class_name'].value_counts()\ncantidad_por_clase","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Segun se indica en la descripcion de los datos la relacion entre el nombre de la clase y el id de la clase es la siguiente:\n\n0 - Aortic enlargement\n\n1 - Atelectasis\n\n2 - Calcification\n\n3 - Cardiomegaly\n\n4 - Consolidation\n\n5 - ILD\n\n6 - Infiltration\n\n7 - Lung Opacity\n\n8 - Nodule/Mass\n\n9 - Other lesion\n\n10 - Pleural effusion\n\n11 - Pleural thickening\n\n12 - Pneumothorax\n\n13 - Pulmonary fibrosis\n\n\nEs importante destacar que el valor 14 corresponde a la ausencia de las observaciones enumeradas anteriormente"},{"metadata":{"trusted":true},"cell_type":"code","source":"#Realizo el grafico correspondiente\n\nplt.figure(figsize = (8,6))\n\nplt.barh(cantidad_por_clase.index,cantidad_por_clase.values)\nplt.title(\"Cantidad de observaciones por tipo\", fontsize=16)\nplt.xlabel(\"Cantidad\", fontsize=12)\nplt.ylabel(\"Tipo\", fontsize=12)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#Para ver los valores en % normalizo los datos y multiplico por 100\n\ncantidad_por_clase_normalizado = df['class_name'].value_counts(normalize=True)*100\ncantidad_por_clase_normalizado","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Se observa que en el 46% de las observaciones no se encuentran anomalias"},{"metadata":{"trusted":true},"cell_type":"code","source":"#A continuacion analizo los NaN por columna\n\ndf.isnull().sum()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Segun se observa los valores nulos se presentan en las columnas donde se incluyen los valores de las coordenadas.\n"},{"metadata":{"trusted":true},"cell_type":"code","source":"#Verifico si los NaN corresponden a la Id de la Clase 14, que segun vimos corresponde a la ausencia de observaciones\n\n#Los valores coinciden\n\ndf[df['class_id']==14].isnull().sum()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#Observo la cantidad de registros para la columna 'rad_id', la cual corresponde al id del readiologo que realizo el diagnostico\n\ncantidad_por_radiologo = df['rad_id'].value_counts()\ncantidad_por_radiologo","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"plt.figure(figsize = (8,6))\n\nplt.barh(cantidad_por_radiologo.index,cantidad_por_radiologo.values,color='r')\n\nplt.title(\"Cantidad de observaciones por radiologo\", fontsize=16)\nplt.xlabel(\"Cantidad\", fontsize=12)\nplt.ylabel(\"Radiologo\", fontsize=12)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Caracteristicas de las Clases"},{"metadata":{"trusted":true},"cell_type":"code","source":"#Defino una funcion para realizar diferentes pairplot de las clases\n\ndef plot_pairplot(i):\n    plt.figure(figsize=(10, 10))\n    sns.pairplot(df[df['class_id']==i],hue='class_id',dropna=True,corner=True)\n    plt.show()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"A continuacion realizo el pairplot para las 3 clases con mayores observaciones:\n\n    * Aortic enlargement (clas_id=0)\n\n    * Cardiomegaly (clas_id=3)\n\n    * Pleural thickening (clas_id=11)"},{"metadata":{"trusted":true},"cell_type":"code","source":"#Pairplot para la clase 0\n\nplot_pairplot(0)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#Pairplot para la clase 1\n\nplot_pairplot(3)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#Pairplot para la clase 2\n\nplot_pairplot(11)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Visualizacion de Imagenes DICOM"},{"metadata":{},"cell_type":"markdown","source":"Segun se observa el formato de las imagenes que se utilizaran para el entranamiento del modelo tienen formato DICOM (Digital Imaging and Communication On Medicine), el cual es un estándar de transmisión de imágenes médicas y datos entre hardware de propósito médico"},{"metadata":{"trusted":true},"cell_type":"code","source":"#Importo los modulos que voy a utilizar\n\nimport pydicom as dicom #pydicom para la lectura de las imagenes DICOM\nimport cv2","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"A continuacion realizo la lectura de una imagen del dataset de entrenamiento"},{"metadata":{"trusted":true},"cell_type":"code","source":"idnum = 3 #Indice del array que voy a utilizar para seleccionar la imagen\n \nimage_id = df.loc[idnum, 'image_id'] #Selecciono el id de la imagen correspondiente a esa posicion en el DataFrame\n\ndata_file = dicom.dcmread(path+'train/'+image_id+'.dicom') #Realizo la lectura de la imagen\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#Obtengo el array de esa imagen\n\nimg = data_file.pixel_array\nimg","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#Observo la metadata de la imagen\n\nprint(data_file)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#Observo el tamaño de la imagen. El mismo tambien se observa en la metadatada\n\nprint('Image shape:', img.shape)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#Realizo la impresion de la imagen con un rectangulo señalando la zona donde se encuentra la patologia\n\nbbox = [df.loc[idnum, 'x_min'],\n        df.loc[idnum, 'y_min'],\n        df.loc[idnum, 'x_max'],\n        df.loc[idnum, 'y_max']]\nfig, ax = plt.subplots(1, 1, figsize=(20, 4))\nax.imshow(img, cmap='gray')\np = matplotlib.patches.Rectangle((bbox[0], bbox[1]),\n                                 bbox[2]-bbox[0],\n                                 bbox[3]-bbox[1],\n                                 ec='r', fc='none', lw=2.)\nax.add_patch(p)\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat":4,"nbformat_minor":4}