Identificación de patrones y correlaciones en datos reales¶

Elige un conjunto de datos disponible públicamente (por ejemplo, el Iris Dataset o un conjunto de datos sobre salud o educación). Los datos deben incluir varias variables, como, por ejemplo, información demográfica, rendimiento académico, consumo energético, o estadísticas de salud.

In [10]:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
In [8]:
url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data'
columnas = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width', 'class']
df2 = pd.read_csv(url, header=None, names=columnas)
df2
Out[8]:
sepal_length sepal_width petal_length petal_width class
0 5.1 3.5 1.4 0.2 Iris-setosa
1 4.9 3.0 1.4 0.2 Iris-setosa
2 4.7 3.2 1.3 0.2 Iris-setosa
3 4.6 3.1 1.5 0.2 Iris-setosa
4 5.0 3.6 1.4 0.2 Iris-setosa
... ... ... ... ... ...
145 6.7 3.0 5.2 2.3 Iris-virginica
146 6.3 2.5 5.0 1.9 Iris-virginica
147 6.5 3.0 5.2 2.0 Iris-virginica
148 6.2 3.4 5.4 2.3 Iris-virginica
149 5.9 3.0 5.1 1.8 Iris-virginica

150 rows × 5 columns

Analizar la distribución de cada variable mediante gráficos de dispersión, histogramas y diagramas de caja.

In [11]:
sns.scatterplot(data=df2, y='sepal_length', x='class',color="g")
sns.scatterplot(data=df2, y='sepal_width', x='class', color="y")
sns.scatterplot(data=df2, y='petal_length', x='class', color="blue", legend="full")
sns.scatterplot(data=df2, y='petal_width', x='class', color="red", legend="full")
plt.ylabel('medidas')
plt.xlabel('clases')
Out[11]:
Text(0.5, 0, 'clases')
No description has been provided for this image
In [12]:
sns.histplot (data=df2,x='sepal_length', kde=True, bins=10, color="g", element="poly" )
sns.histplot(data=df2,x='sepal_width', kde=True, bins=10, color="y", element="poly")
plt.xlabel('Medidas sépalo')
Out[12]:
Text(0.5, 0, 'Medidas sépalo')
No description has been provided for this image
In [13]:
sns.histplot(data=df2,x='petal_length', kde=True, bins=10, color="blue", element="poly")
sns.histplot(data=df2,x='petal_width', kde=True, bins=10, color="red", element="poly")
plt.xlabel('Medidas pétalo')
Out[13]:
Text(0.5, 0, 'Medidas pétalo')
No description has been provided for this image
In [14]:
df_num = df2[['sepal_length', 'sepal_width', 'petal_length', 'petal_width']]
df_num.plot.box()
Out[14]:
<Axes: >
No description has been provided for this image

Calcular las correlaciones entre variables clave y explorar si existe alguna relación significativa usando el coeficiente de Pearson o Spearman.

In [15]:
df_num.corr(method='pearson')
Out[15]:
sepal_length sepal_width petal_length petal_width
sepal_length 1.000000 -0.109369 0.871754 0.817954
sepal_width -0.109369 1.000000 -0.420516 -0.356544
petal_length 0.871754 -0.420516 1.000000 0.962757
petal_width 0.817954 -0.356544 0.962757 1.000000

Parece que petal_lenght y petal_width tienen una correlación lineal fuerte. Por otro lado sepal_legth también se correlaciona linealmente con los dos valores de petal, pero sepal_width parece mucho más independiente.

In [16]:
df_num.corr(method='spearman')
Out[16]:
sepal_length sepal_width petal_length petal_width
sepal_length 1.000000 -0.159457 0.881386 0.834421
sepal_width -0.159457 1.000000 -0.303421 -0.277511
petal_length 0.881386 -0.303421 1.000000 0.936003
petal_width 0.834421 -0.277511 0.936003 1.000000

Spearman muestra algo muy parecido a Pearson, por lo que sepal_width no tiene correlación fuerte de ningún tipo con el resto de variables.

Crear visualizaciones (como diagramas de dispersión y mapas de calor) para representar las correlaciones y los patrones detectados.

In [17]:
sns.pairplot(df2, hue='class')
Out[17]:
<seaborn.axisgrid.PairGrid at 0x2574b4901a0>
No description has been provided for this image
In [18]:
sns.heatmap(df_num.corr('pearson'), annot=True, vmin=-1, vmax=1 )
Out[18]:
<Axes: >
No description has been provided for this image
In [19]:
sns.heatmap(df_num.corr('spearman'), annot=True, vmin=-1, vmax=1)
Out[19]:
<Axes: >
No description has been provided for this image

Identificar si existen valores atípicos que afecten las correlaciones y documentar el análisis

In [20]:
# Outliers detectados mediante diagrama de caja
df_num.plot.box()
Out[20]:
<Axes: >
No description has been provided for this image

sepal_width es el único que presenta outliers, uno inferior y 3 superiores, aunque al no estar muy alejados del resto no distorsionan de forma relevante las correlaciones, ya que Pearson y Spearman dan resultados muy similares.

Esto indica que la relación entre las variables principales es estable, incluso con esos valores atípicos.

  • ¿Qué relaciones relevantes se han identificado entre las variables?
  • ¿Alguna variable tiene una fuerte correlación con otra?
  • ¿Se observan patrones generales que permitan formular hipótesis adicionales sobre el conjunto de datos?
  • ¿Qué decisiones podrían tomarse basadas en estos patrones y relaciones?

Las medidas del pétalo aumentan juntas y son muy variables, sepal_width tiene un rango menor por lo que aporta menos variabilidad entre especies y también por eso su correlación puede ser más débil.

Las dimensiones del pétalo son las que mejor diferencian a las especies de Iris. Los gráficos de dispersión muestran que Iris-setosa se separa con mucha facilidad del resto en prácticamente cualquier variable, mientras que Iris-versicolor e Iris-virginica se solapan más y requieren combinaciones de variables para distinguirse con claridad.

Basándonos en esas conclusiones, dado que petal_length y petal_width son las variables más discriminativas, pueden usarse como principales en modelos de clasificación. Si se demuestra que sepal_width aporta poca información adicional se puede simplificar el dataset eliminándolo.