%matplotlib inline
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
Cargamos los dataframes con los que haremos los ejemplos...
#Características de unos cuantos coches
mtcars=pd.read_csv('mtcars.csv')
Vamos a cargar un archivo con datos de coeficientes hidrodinámicos de unos cuantos yates medidos en canal de ensayos.
https://archive.ics.uci.edu/ml/datasets/Yacht+Hydrodynamics
No conozco bien las condiciones en las que se generó este conjunto de datos, pero espero que lo podamos entender un poco mejor gracias a las visualizaciones.
#Datos de coeficientes hidrodinámicos de unos cuantos yates
# medidos en canal de ensayos
yacht = pd.read_csv('yacht_hydrodynamics.csv')
Realizamos un análisis rápido:
print(yacht.head())
print('-----')
print(yacht.shape)
print('-----')
print(yacht.info())
mtcars.head()
mtcars.info()
Transformamos las columnas con variables categóricas ('vs','carb','am', 'cyl', 'gear') al tipo correcto
a_transformar=['vs','carb','am','cyl','gear']
for columna in a_transformar:
mtcars[columna] = mtcars[columna].astype('category')
mtcars.info()
Pandas (a través de matplotlib) incorpora una serie de funciones gráficas que pueden ser útiles cuando queremos realizar un gráfico sencillo. Si no se le da más instrucciones, visualiza una gráfica con la columna índice en el eje de abscisas y todas las demás columnas en las ordenadas. Este tipo de gráfica puede resultar útil para detectar fallos al importar, pero a menudo es poco iluminador, especialmente si las columnas se miden en unidades muy distintas.
yacht.plot(figsize=(8,8))
plt.show()
Los gráficos de barras se obtienen con la función plot.bar. Son útiles para visualizar los valores de cada una de las observaciones
#Al poner yacht.iloc[:10] dibujamos solo los 10 primeros registros
yacht.iloc[:10].plot.bar(figsize=(10,10))
Como puede observarse estas funciones gráficas sólo responden a las variables continuas. Esta es una primera (y obvia) limitación.
Si queremos visualizar la distribución de una variable continua, normalmente usaremos alguna de estas funciones
yacht.plot.hist(y = ['resistence'], bins = 30)
plt.show()
## Pandas puede mostrar varias variables en el mismo histograma
yacht.plot.density(y = 'resistence')
plt.show()
Las gráficas de cajas (boxplot) muestran una caja delimitada por el primer y el tercer cuartil, con una línea interior a la caja que marca la mediana. Los dos bigotes (whiskers) contienen al resto de los datos, excepto los datos extremos (outliers), que son las observaciones que distan del primer y tercer cuartil más de un RIC (rango intercuartílico, la longitud de la caja) y medio.
yacht.plot.box(y = 'resistence')
plt.show()
Puede ser útil, para empezar, dibujar un diagrama de las marginales de cada variable por separado.
fig, axes = plt.subplots(nrows=1, ncols=len(yacht.columns), figsize=(15,8))
for ax,col in zip(axes, yacht.columns):
ax.boxplot(yacht[col])
ax.set_title(col)
plt.legend()
plt.show()
Podemos hacer un histograma en vez de un boxplot:
fig, axes = plt.subplots(nrows=1, ncols=len(yacht.columns), figsize=(15,8))
for ax,col in zip(axes, yacht.columns):
ax.hist(yacht[col], bins=20)
ax.set_title(col)
plt.legend()
plt.show()
Podemos visualizar el histograma en dos dimensiones por medio de un diagrama de dispersión (scatter plot)
yacht.plot.scatter(y = 'resistence', x = 'Froude')
plt.show()
La librería seaborn permite dibujar las relaciones entre cada par de variables. En la diagonal aparecen los histogramas.
sns.pairplot(yacht)
Sobre el dataset mtcars, visualizar:
Vamos a hacer unas gráficas de la extensión del hielo en los océanos ártico y antártico, y luego os pediremos que hagáis un análisis similar para otra serie temporal con patrón estacional: el oleaje en una boya de la Bahía de Cádiz.
#Extensión del hielo en los polos
ice = pd.read_csv('seaice.csv')
ice.head()
Pregunta: mirando el output de describe(include='all')
: ¿qué puedes decir sobre las columnas "Missing" y "hemisphere"?
ice.describe(include='all')
Los datos contienen columnas para el año, mes y día. Puede ser interesante crear un campo Date
que contenga toda la fecha.
ice['Date'] = pd.to_datetime(ice[['Year','Month','Day']])
ice.head()
Parece conveniente separar los datos del hemisferio norte y del hemisferio sur.
icen = ice[ice.hemisphere=='north']
ices = ice[ice.hemisphere=='south']
plt.figure(figsize=(9,9))
icen.Extent.plot()
plt.figure(figsize=(9,9))
ices.Extent.plot()
Es difícil detectar la tendencia histórica cuando la variación inter-anual es tan fuerte, así que dibujamos los datos de un sólo mes:
plt.scatter(x=icen[icen.Month==1].Year, y=icen[icen.Month==1].Extent, s=3)
Otra forma de representar los datos, usando Seaborn y boxplot
plt.figure(figsize=(9,9))
sns.boxplot(x="Year", y="Extent", data=icen[icen.Month==1])
sns.despine(offset=10, trim=True)
Los datos de hielo del hemisferio sur no son tan dramáticos:
plt.scatter(x=ices[ices.Month==6].Year, y=ices[ices.Month==6].Extent, s=3)
En fin, parece que el hielo del Ártico disminuye en extensión (y en grosor), pero el del Antártico aumenta en extensión (y el balance global es negativo):
Más abajo se cargan datos de cierta boya de la Bahía de Cádiz:
simar=pd.read_csv('/home/OYE/SIMAR_6006052.csv')
simar.head()