Un ejemplo de análisis
Vamos a realizar un ejemplo práctico de Análisis Exploratorio de Datos (AED) utilizando un dataset real. En este caso, utilizaremos el famoso Iris Dataset, que contiene mediciones de diferentes características de flores de tres especies de iris: Setosa, Versicolor, y Virginica. El dataset tiene 150 filas y 5 columnas: cuatro columnas numéricas que miden la longitud y el ancho de los sépalos y pétalos de cada flor, y una columna categórica que indica la especie.
El análisis que haremos incluirá:
- Cargar y explorar los datos.
- Estadística descriptiva.
- Detección de valores nulos.
- Visualización de distribuciones y relaciones entre variables.
- Detección de outliers.
- Correlación entre variables.
1. Cargar y explorar los datos
Primero, cargamos el dataset y revisamos su estructura general.
Código:
import pandas as pd
# Cargar el dataset Iris desde la librería Seaborn
df = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data',
names=['sepal_length', 'sepal_width', 'petal_length', 'petal_width', 'species'])
# Ver las primeras filas
print(df.head())
# Verificar el tipo de datos y si hay valores faltantes
print(df.info())
Salida esperada:
sepal_length sepal_width petal_length petal_width species
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
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 150 entries, 0 to 149
Data columns (total 5 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 sepal_length 150 non-null float64
1 sepal_width 150 non-null float64
2 petal_length 150 non-null float64
3 petal_width 150 non-null float64
4 species 150 non-null object
dtypes: float64(4), object(1)
Explicación:
- El dataset tiene 150 observaciones y 5 columnas. Cuatro de ellas son numéricas (longitud y ancho del sépalo y pétalo), mientras que la columna
species
es categórica. - No hay valores nulos, lo que es una buena señal.
2. Estadística Descriptiva
Obtenemos un resumen estadístico de las variables numéricas.
Código:
# Resumen estadístico descriptivo
print(df.describe())
Salida esperada:
sepal_length sepal_width petal_length petal_width
count 150.000000 150.000000 150.000000 150.000000
mean 5.843333 3.054000 3.758667 1.198667
std 0.828066 0.433594 1.764420 0.763161
min 4.300000 2.000000 1.000000 0.100000
25% 5.100000 2.800000 1.600000 0.300000
50% 5.800000 3.000000 4.350000 1.300000
75% 6.400000 3.300000 5.100000 1.800000
max 7.900000 4.400000 6.900000 2.500000
Explicación:
- Media (mean): La longitud promedio del sépalo es de 5.84 cm, mientras que la longitud promedio del pétalo es de 3.76 cm.
- Desviación estándar (std): Nos muestra la variabilidad de las características. El ancho del sépalo tiene menos variabilidad (0.43) en comparación con la longitud del pétalo (1.76).
- Mínimo y máximo: La longitud del sépalo varía entre 4.3 cm y 7.9 cm, mientras que el ancho del pétalo varía entre 0.1 cm y 2.5 cm.
3. Detección de valores nulos
Confirmamos que no hay valores nulos, pero siempre es una buena práctica verificar antes de proceder.
Código:
# Comprobar valores nulos
print(df.isnull().sum())
Salida esperada:
sepal_length 0
sepal_width 0
petal_length 0
petal_width 0
species 0
dtype: int64
4. Visualización de datos
Vamos a crear algunas visualizaciones para comprender mejor la distribución y las relaciones entre las variables.
a) Histograma de la longitud del sépalo
import seaborn as sns
import matplotlib.pyplot as plt
# Histograma para la longitud del sépalo
sns.histplot(df['sepal_length'], kde=True)
plt.title('Distribución de la Longitud del Sépalo')
plt.xlabel('Longitud del Sépalo (cm)')
plt.ylabel('Frecuencia')
plt.show()
Explicación:
- El histograma muestra la distribución de la longitud del sépalo. La mayoría de los sépalos tienen una longitud entre 5 y 6 cm, pero también hay flores con sépalos más cortos o más largos.
b) Diagrama de dispersión entre la longitud del sépalo y la longitud del pétalo
# Diagrama de dispersión
sns.scatterplot(x='sepal_length', y='petal_length', hue='species', data=df)
plt.title('Relación entre Longitud del Sépalo y Longitud del Pétalo')
plt.show()
Explicación:
- El diagrama de dispersión muestra la relación entre la longitud del sépalo y la longitud del pétalo. Cada especie de flor se representa con un color diferente. Podemos ver que existe una correlación positiva entre ambas variables: a medida que la longitud del sépalo aumenta, también lo hace la del pétalo.
c) Boxplot para detectar outliers en el ancho del pétalo
# Boxplot para detectar outliers
sns.boxplot(x='petal_width', data=df)
plt.title('Diagrama de Caja del Ancho del Pétalo')
plt.show()
Explicación:
- El boxplot nos ayuda a detectar valores atípicos (outliers). En este caso, no se observan demasiados valores atípicos significativos en el ancho del pétalo, pero es una técnica útil para identificar posibles errores o rarezas en los datos.
5. Detección de Outliers
Usamos el rango intercuartílico (IQR) para identificar valores atípicos en la longitud del pétalo.
Código:
# Cálculo de IQR para la longitud del pétalo
Q1 = df['petal_length'].quantile(0.25)
Q3 = df['petal_length'].quantile(0.75)
IQR = Q3 - Q1
limite_inferior = Q1 - 1.5 * IQR
limite_superior = Q3 + 1.5 * IQR
outliers = df[(df['petal_length'] < limite_inferior) | (df['petal_length'] > limite_superior)]
print(outliers)
Explicación:
- Calculamos los valores límite para identificar outliers. En este caso, podríamos ver si algunas flores tienen una longitud de pétalo extremadamente larga o corta, lo que podría indicar anomalías.
6. Correlación entre variables
Finalmente, calculamos la correlación entre las variables numéricas.
Código:
# Matriz de correlación
correlacion = df.corr()
# Visualización de la matriz de correlación
sns.heatmap(correlacion, annot=True, cmap='coolwarm')
plt.title('Matriz de Correlación')
plt.show()
Explicación:
- La matriz de correlación nos muestra qué tan relacionadas están las variables entre sí. Por ejemplo, podemos esperar que la longitud del sépalo y la longitud del pétalo estén positivamente correlacionadas, como vimos en el diagrama de dispersión.
Conclusión
En este análisis exploratorio, hemos revisado un conjunto de datos real, obteniendo un entendimiento más profundo de sus características a través de estadísticas descriptivas y visualizaciones. Este AED nos ha permitido identificar patrones, distribuciones, relaciones entre variables