top of page
Search
  • Writer's picturesiria sadeddin

Detección de Cancer de Piel con Deep Learning. SEGUNDA PARTE: EXPLORACIÓN DE DATOS

Hola!😋 en este post continuaremos con nuestro proyecto: Clasificación de imágenes dermatológicas para detección de Cancer de Piel con Redes Neurales. En el post anterior, obtuvimos un conjunto de datos que usaremos para hacer un análisis estadístico, y mirar si las variables que tenemos en el conjunto de datos son útiles para predecir si una lesión es cancerígena o no.





Como habremos notado, este conjunto de datos no nos dice mucho hacerca de la lesión (solamente el area del cuerpo donde se encuentra) pero si nos da información hacerca del paciente en sí: Edad y sexo. Vamos a estudiar como sólamente estas variables pueden influir en el desarrollo de una lesión cancerígena.


Lo primero que haremos es estudiar la distribución de los casos malignos y benignos

plt.bar([1,2],data.is_ca.value_counts(),color=['gray','purple'], alpha=0.5)
plt.title('Malignant vs Benign cases')
plt.xticks([1,2],('Benign','Malignant'))
plt.ylabel('Count')
pd.DataFrame({'percentage':data.is_ca.value_counts()/sum(data.is_ca.value_counts())})


Observamos que hay un desbalance entre las clases en nuestra variable objetivo, esto es un problema para la clasificación en machine learning, ya que el modelo se entrenará inclinandose hacia la clase con mayor cantidad de datos. Pero de esto nos ocuparemos en el siguiente post.


Veamos como afecta el sexo del paciente en el desarrollo de lesiones malignas o benignas, para esto hacemos los siguiente gráficos de barras


fig, (ax1, ax2) = plt.subplots(1, 2)
p1=ax1.bar([1,2],data.sex[data.is_ca=='malignant'].value_counts(), alpha=0.5)
ax1.set_title('Male/Female Malignant cases')
ax1.set(ylabel='Count')
p1[0].set_color('gray')
p1[1].set_color('purple')
p2=ax2.bar([1,2],data.sex[data.is_ca=='benign'].value_counts(),color='g', alpha=0.5)
ax2.set_title('Male/Female benign cases')
plt.setp((ax1, ax2), xticks=[1, 2], xticklabels=['Male','Female'])
ax2.set(ylabel='Count')
p2[0].set_color('gray')
p2[1].set_color('purple')
plt.tight_layout()
plt.show()
perc1=data.sex[data.is_ca=='malignant'].value_counts()/sum(data.sex[data.is_ca=='malignant'].value_counts())
perc2=data.sex[data.is_ca=='benign'].value_counts()/sum(data.sex[data.is_ca=='benign'].value_counts())
pd.DataFrame({'Malignant':perc1.values,'Benign':perc2.values}, index=['Male','Famale'])


Observamos un resultado interesante! Para las lesiones benignas no existe una relación directa con el sexo, ambos adquieren lesiones benignas por igual. Mientras que las lesiones Malignas se presentan alrededor de 16% mas en hombres que en mujeres.


Veamos la distribución de edades para las lesiones malignas y benignas.

data.age_approx[data.is_ca=='malignant'].plot.hist(grid=True, bins=len(data.age_approx.unique())-1, rwidth=0.9,alpha=.5,color='purple',label='malignant')
plt.title('Age Distribution of Cases for malignant and benign spots')
data.age_approx[data.is_ca=='benign'].plot.hist(grid=True, bins=len(data.age_approx.unique())-1, rwidth=0.9,alpha=.5,color='gray',label='benign')
plt.ylabel('Counts')
plt.xlabel('Age')
plt.legend()
plt.show()


print('mean age for benign cases: ',np.mean(data.age_approx[data.is_ca=='benign']))
print('mean age for malignant cases: ',np.mean(data.age_approx[data.is_ca=='malignant']))
mean age for benign cases:  48.48122485471614 
mean age for malignant cases:  63.78670788253478

Observamos no solo que las distribuciones son distintas, sino que la edad media de aparición para lesiones malignas es 15 años mayor que para las lesiones benignas.


Veamos como influye la posición de la lesión en el diagnóstico

fig, (ax1, ax2) = plt.subplots(1, 2)
d1=pd.DataFrame({'count':data[data.is_ca=='benign'].groupby('anatom_site_general').count().sort_values('image',ascending=False)['image']})
p1=ax1.bar(range(len(d1.index)),data.anatom_site_general[data.is_ca=='benign'].value_counts(),color='gray',alpha=.5)
ax1.set_title('Benign')
ax1.set_xticks(range(len(d1.index)))
ax1.set_xticklabels(d1.index, fontsize=12,rotation=90)
ax1.set(ylabel='Count')
d2=pd.DataFrame({'count':data[data.is_ca=='malignant'].groupby('anatom_site_general').count().sort_values('image',ascending=False)['image']})
p2=ax2.bar(range(len(d2.index)),data.anatom_site_general[data.is_ca=='malignant'].value_counts(),color='purple',alpha=.5)
ax2.set_title('malignant')
ax2.set_xticks(range(len(d2.index)))
ax2.set_xticklabels(d2.index, fontsize=12,rotation=90)
ax2.set(ylabel='Count')
plt.tight_layout()
plt.show()




Vaya! la posición de la lesión varía en frecuencias para lesiones malignas o benignas, es decir, existe una relación entre la posición de la lesión y el diagnóstico.


En conclusión, nuestros datos nos indican que existe una relación entre la edad, sexo y lugar de la lesión con el diagnostico de la patología. Esto nos indica que los datos son útiles para crear un modelo predictivo de Machine Learning que use estos datos para inferir un posible diagnóstico.

Esto es lo que haremos el el proximo post! 😉


49 views0 comments
Post: Blog2_Post
bottom of page