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.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
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
| 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.
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')
Text(0.5, 0, 'clases')
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')
Text(0.5, 0, 'Medidas sépalo')
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')
Text(0.5, 0, 'Medidas pétalo')
df_num = df2[['sepal_length', 'sepal_width', 'petal_length', 'petal_width']]
df_num.plot.box()
<Axes: >
Calcular las correlaciones entre variables clave y explorar si existe alguna relación significativa usando el coeficiente de Pearson o Spearman.
df_num.corr(method='pearson')
| 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.
df_num.corr(method='spearman')
| 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.
sns.pairplot(df2, hue='class')
<seaborn.axisgrid.PairGrid at 0x2574b4901a0>
sns.heatmap(df_num.corr('pearson'), annot=True, vmin=-1, vmax=1 )
<Axes: >
sns.heatmap(df_num.corr('spearman'), annot=True, vmin=-1, vmax=1)
<Axes: >
Identificar si existen valores atípicos que afecten las correlaciones y documentar el análisis
# Outliers detectados mediante diagrama de caja
df_num.plot.box()
<Axes: >
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.