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()
Comments