Analítica de datos con Python y Sofia2 (2/4). Gráficos de relación

Un análisis de correlación es un punto de partida importante para identificar las relaciones entre medidas, es importante aclarar que la correlación no tiene porque significar causalidad, pero si al revés, la causa tiene una relación con el efecto. Un ejemplo famoso de esto es un estudio que se hizo en las escuelas donde se afirmaba que los niños con los pies grandes eran mejores en matemáticas, lo cual era cierto ya que los niños con los píes más grandes eran los más mayores pero no es la causa, a igualdad de edad los niños con los píes más grandes no eran ni mejores ni peores en matemáticas.

Los gráficos de relación se usan para ver la relación entre los datos y pueden usarse para encontrar correlaciones, valores atípicos y grupos de datos.

 

¿Existe una correlación entre el gasto publicitario y las ventas de nuestros productos?
¿Cómo varían los gastos y los ingresos por región y cuál es la desviación?

 

Veamos un ejemplo en la plataforma Sofia2 con un dataset sobre características de los modelos de coche.

%python
import matplotlib
import matplotlib.pyplot as plt
import os
import numpy as np
import pandas as pd
import seaborn as sns
import StringIO

matplotlib.use('Agg') 
matplotlib.rcParams['figure.figsize'] = (9.0, 6.0)

Cargamos los datos

%python
autos = pd.read_csv("http://archive.ics.uci.edu/ml/machine-learning-databases/auto-mpg/auto-mpg.data-original", delim_whitespace = True, header=None,
names=['MPG', 'Cylinders', 'Displacement', 'Horse_Power','Weight', 'Acceleration', 'Model_Year', 'Origin', 'Car_Name'])

Preparamos los datos

%python
# Preparación de los datos
autos['maker'] = autos.Car_Name.map(lambda x: x.split()[0])
autos.Origin = autos.Origin.map({1: 'America', 2: 'Europe', 3: 'Asia'})
autos=autos.applymap(lambda x: np.nan if x == '?' else x).dropna()
autos['Horse_Power'] = autos.Horse_Power.astype(float)
autos.sample()

Pintamos la matriz con la correlación de todas las variables.

%python
sns.heatmap(autos.corr(), square=True, annot=True)

matriz correlacion

El color blanco indica que las variables no están correlacionadas y cuanto más hacia el rojo oscuro mayor es la relación y cuanto más hacia el azul mayor correlación inversa.

En primera aproximación parecen datos poco interesantes porque todas las relaciones que muestran son claras: potencia con cilindros y con cilindrada (Displacement) y con aceleración…

Nos quedamos con la variable MPG que es Millas por Galón de Gasolina que viene a indicar la inversa del consumo del coche y lo cruzamos con los orígenes de fabricación, América, Europa y Asia.

%python
sns.boxplot(x="Origin", y="MPG", data=autos)

boxplot

Se muestra que los coches americanos son los menos ecológicos porque claramente tienen un valor más bajo de MPG que los asiáticos y los europeos.

Veamos como es la relación entre la inversa del consumo (MPG) y la potencia (Hose_Power)

%python
sns.lmplot("Horse_Power", "MPG", hue="Origin", data=autos)

lmplot

Aquí tenemos que se fabrican muy pocos coches europeos y asiáticos con muchos caballos de potencia, no tenemos puntos verdes y rojos a la derecha del gráfico y en cambio los coches americanos se fabrican en todo el espectro de la potencia (eje X), tenemos puntos azules a lo largo del eje.

Ordenamos las correlaciones de más relación a menos de la variable MPG.

%python
corr = autos.corr()
corr_dict = corr['MPG'].to_dict()
del corr_dict['MPG']
print("List the numerical features decendingly by their correlation with MPG:\n")
for ele in sorted(corr_dict.items(), key = lambda x: -abs(x[1])):
    print("{0}: \t{1}".format(*ele))
List the numerical features decendingly by their correlation with MPG:
 
Weight: -0.832244214832
Displacement: -0.80512694671
Horse_Power: -0.778426783898
Cylinders: -0.777617508126
Model_Year: 0.580540966091
Acceleration: 0.423328536903
La relacción más fuerte de MPG la tenemos con el peso que es superior a la potencia del coche.
Mostremos unos gráficos donde se crucen el consumo (MPG), potencia (Horse_Power) y el peso (Weight).
%python
# Pairplot. Para visualizar todas las relaciones entre las variables/columnas
sns.pairplot(autos[["MPG", "Horse_Power", "Weight", "Origin"]], hue="Origin", diag_kind="hist")

Pairplot

En estos gráficos se muestran que en América se fabrican coches mucho más pesados que en Europa y en Asia. Para que estos autos puedan alcanzar la misma velocidad que el resto tienen que incluirles motores más potentes lo que acaba derivando en un mayor consumo de gasolina, si en EEUU están interesados en bajar el consumo de gasolina tienen que conseguir cambiar el gusto por los coches grandes que tienen sus habitantes, además de fomentar el coche eléctrico.

Mostramos una gráfica de la inversa del consumo (MPG) por año del modelo del coche.

%python
sns.boxplot(x="Model_Year", y="MPG", data=autos)

model

Se observa la tendencia de las marcas de fabricar coches con un menor consumo, los años con un mayor MPG son los 3 últimos. Aquí si se aprecia el interés de las marcas, y del público de tender hacia coches más ecológicos y económicos en cuanto a gasto de combustible.

Analítica de datos con Python y Sofia2 (2/4). Gráficos de relación

Analítica de datos con Python y Sofia2 (1/4). Gráficos de distribución

Si existe algún tema sobre el que haya consenso en el mundo de las Tecnología de la Información es sin lugar a dudas la importancia de los datos. Son necesarios para entender el presente (análisis descriptivo), para predecir el futuro (análisis predictivo) y para obtener información que nos permita actuar para cambiar el futuro (análisis prescriptivo). Es una materia prima de alto valor en el presente y lo será más en el futuro, pero el simple acopio de grandes volúmenes de datos no aporta valor este se consigue por su interpretación y la aplicación de el conocimiento extraído en el negocio.

Una de las mejores formas de entender la información de los datos es mediante su visualización en gráficos.

 

Existen 4 tipos de visualizaciones básicas de los datos: Gráficos de distribución, de relación, de comparación y de composición.
Los gráficos de distribución/histogramas se usan para conocer la frecuencia de los como valores de una variable y responden a preguntas del estilo:

¿Número de clientes qué tengo por grupo de edad? ¿Cuántos días tardan nuestros pagos?

 

Si la representación es de una única variable y son pocos los datos que hay se utiliza gráficos de barras (Bar histogram). Por ejemplo: Número de habitantes por Comunidad Autónoma.

 

Si la representación es de una única variable y hay muchos datos se utilizan gráfico lineales (Line histogram).

 

Si se quiere representar dos variables hay varias opciones como utilizar gráfico de Scatter plot o de barras con distinto color o varios gráficos.
Posiblemente el “Hola Mundo” de la analítica de datos sea los datos de los pasajeros del Titanic así que los utilizaremos para mostrar las gráficas de distribución.

 

Vamos a utilizar las capacidades analíticas de la plataforma Sofia2 en el CloudLab que utiliza el notebook Zeppelin y un cluster de Cloudera con Spark para la paralelización del procesamiento.


%python
import matplotlib
import matplotlib.pyplot as plt
import os
import numpy as np
import pandas as pd
import seaborn as sns
import StringIO

matplotlib.use('Agg')
matplotlib.rcParams['figure.figsize'] = (9.0, 6.0)

Cargamos el dataset del Titanic y cambiamos los valores de la columna Survived

titanic = pd.read_csv("https://gist.github.com/tpetricek/263fb1bee9366170b2ef/raw/90d012bac3713e8618d3ae2f83f2f6535b6bebd9/titanic.csv")
titanic['Survived'].replace([0,1],['No','Si'], inplace=True)

Mostramos en una gráfica todos los pasajeros con la edad que tenían por aquel entonces.

plt.plot(titanic.Age, '.')

Titanic Edad de los pasajeros

 

Y aunque se pueden extraer conclusiones como que viajaban 3 pasajeros con más de 80 años y que hay 7 que tenían entre 70 y 80 años no es una gráfica útil para obtener un conocimiento claro sobre la edades de los viajeros.

Para obtener una visión más clara de la distribución de los pasajeros por edad lo mejor es realizar una gráfica con el número de viajeros por su edad.

# distplot -> histograma
# Para mostrar la distribución de los valores de una variable numérica.
sns.distplot(titanic.Age.dropna())

Titanic Distribución por edad 1

  • Donde por ejemplo se aprecia una distribución más o menos uniforme pero con una pequeña montaña entre los 0 y los 10 años lo que indica que viajaban más familias con hijos pequeños que con hijos más mayores parece que a las familias con hijos menores les atrae más el empezar una nueva vida en América que a las que tienen hijos más mayores.

En los gráficos de distribución se pueden mostrar dos variables así que añadimos la única variable continua que tenemos que es el campo fare que es el precio de billete e incluimos la regresión lineal entre las dos variables, edad y precio del pasaje.

sns.jointplot(data=titanic, x='Age', y='Fare', kind='reg', color='g')

 

Titanic Distribución por edad 2

  • Se aprecia una ligera correlacción entre la edad y el precio del pasaje (coeficiente de Pearson de 0.096) pero si nos fijamos en la alta densidad de puntos que hay en la parte inferior izquierda y la ausencia de puntos en la derecha (edades pequeñas) nos indica que el precio del pasaje de los niños es más barato que el de los adultos (parece lógico) y que está bajando la recta de la correlación por la derecha y aumentando su pendiente así que si excluyésemos a los niños tendríamos que el precio del pasaje no está correlacionado con la edad (a excepción del caso de los niños).

Comparemos la supervivencia al accidente del Titanic distribuida por edad.

fare_bins = np.arange(0, 100, 4)
sns.distplot(titanic[titanic['Survived']=='Si'].Age.dropna(), bins=fare_bins, color="b")
sns.distplot(titanic[titanic['Survived']=='No'].Age.dropna(), bins=fare_bins, color="r")

Titanic Distribución por edad 3

  • De 0 hasta los 20 años los supervivientes del accidente del Titanic superan ampliamente a los muertos se cumplió la máxima de los niños primero
  • De los 20 años hasta mediados de los 40 murieron más que sobrevivieron, a partir de esa edad cambía la tendencia hasta los 60 donde se vuelven a salvar más que a morir así que también se cumplió lo de los mayores primero y muchos jóvenes hicieron de héroes anónimos prefirieron ayudar antes que salvarse.
  • Y en el último tramo de edad, a partir de los 60, hay otro giro y vuelven a morir más que a sobrevivir parece que a los más abueletes no les incluyeron en el grupo de de los mayores primero y sus menores facultades físicas comparadas con los de 45 a los 60 años en una situación como la del Titanic no les favoreció.

 

Resumiendo los gráficos de distribución o histograma son útiles para tener una “primera vista” general de la distribución de la muestra respecto a una característica, cuantitativa y continua. Ofrecen una visión de grupo y permiten observar una preferencia, o tendencia, por parte de la muestra y poder utilizarlos a partir de un dataset que esté en Internet con Sofia2 y Zeppelin es muy sencillo.

Analítica de datos con Python y Sofia2 (1/4). Gráficos de distribución