
En este tutorial, vas a explorar varios métodos de visualización de datos y la estadística que hay detrás. En particular, verás cómo identificar tendencias y relaciones entre variables en un data frame.
Exacto: te centrarás en conceptos como correlación y regresión. Primero, conocerás qué es la correlación en R. Después, verás cómo representar matrices de correlación en R con paquetes como ggplot2 y GGally. Por último, revisarás qué tipos de correlaciones existen y por qué son relevantes para tu análisis.
Si te apetece profundizar en este tema, échale un vistazo al curso de DataCamp Correlation and Regression.
Contexto
En el tutorial de hoy, trabajarás con un conjunto de datos de películas obtenido en Kaggle para aprender a entender mejor las relaciones entre variables.
He armonizado ligeramente los datos para que la comparación sea homogénea, asegurándome, por ejemplo, de que la moneda esté en las mismas unidades. Sin ese paso, el análisis de variables como gross, budget y profit sería engañoso. Puedes acceder al conjunto de datos original.
Importar los datos
Para acceder al conjunto de datos movies y empezar a trabajar con él, utiliza la función read.csv() para importarlo a un data frame y guárdalo en la variable con el nombre tan original de movies.
movies <- read.csv(url("http://s3.amazonaws.com/dcwoods2717/movies.csv"))
¡Y con eso ya puedes empezar!
Inspección básica de tus datos
Tras importar un data frame, conviene hacerte una idea general de los datos. Empieza revisando la estructura del conjunto que vas a analizar. Abajo tienes el resultado de usar la función str(), tan simple como útil:
str(movies)
## 'data.frame': 2961 obs. of 11 variables:
## $ title : Factor w/ 2907 levels "10 Cloverfield Lane",..: 1560 2143 34 2687 1405 1896 2633 894 1604 665 ...
## $ genre : Factor w/ 17 levels "Action","Adventure",..: 6 12 5 5 5 3 2 8 3 8 ...
## $ director : Factor w/ 1366 levels "Aaron Schneider",..: 474 472 781 828 175 1355 1328 1328 968 747 ...
## $ year : int 1920 1929 1933 1935 1936 1937 1939 1939 1940 1946 ...
## $ duration : int 110 100 89 81 87 83 102 226 88 144 ...
## $ gross : int 3000000 2808000 2300000 3000000 163245 184925485 22202612 198655278 84300000 20400000 ...
## $ budget : int 100000 379000 439000 609000 1500000 2000000 2800000 3977000 2600000 8000000 ...
## $ cast_facebook_likes: int 4 109 995 824 352 229 2509 1862 1178 2037 ...
## $ votes : int 5 4546 7921 13269 143086 133348 291875 215340 90360 6304 ...
## $ reviews : int 2 107 162 164 331 349 746 863 252 119 ...
## $ rating : num 4.8 6.3 7.7 7.8 8.6 7.7 8.1 8.2 7.5 6.9 ...
En este data frame en concreto, la consola muestra 2961 observaciones y 11 variables.
Como curiosidad: aunque cada película durase solo una hora, tendrías que ver películas sin parar durante más de cuatro meses para verlas todas.
La consola también lista cada variable por su nombre, su clase y algunos ejemplos. Esto nos da una idea bastante clara de qué contiene el data frame, algo clave para cualquier análisis.
Otra función estupenda para un repaso rápido y de alto nivel es summary(). Fíjate en similitudes y diferencias con la salida de str().
summary(movies)
## title genre
## Home : 3 Comedy :848
## A Nightmare on Elm Street : 2 Action :738
## Across the Universe : 2 Drama :498
## Alice in Wonderland : 2 Adventure:288
## Aloha : 2 Crime :202
## Around the World in 80 Days: 2 Biography:135
## (Other) :2948 (Other) :252
## director year duration
## Steven Spielberg : 23 Min. :1920 Min. : 37.0
## Clint Eastwood : 19 1st Qu.:1999 1st Qu.: 95.0
## Martin Scorsese : 16 Median :2004 Median :106.0
## Tim Burton : 16 Mean :2003 Mean :109.6
## Spike Lee : 15 3rd Qu.:2010 3rd Qu.:119.0
## Steven Soderbergh: 15 Max. :2016 Max. :330.0
## (Other) :2857
## gross budget cast_facebook_likes
## Min. : 703 Min. : 218 Min. : 0
## 1st Qu.: 12276810 1st Qu.: 11000000 1st Qu.: 2241
## Median : 34703228 Median : 26000000 Median : 4604
## Mean : 58090401 Mean : 40619384 Mean : 12394
## 3rd Qu.: 75590286 3rd Qu.: 55000000 3rd Qu.: 16926
## Max. :760505847 Max. :300000000 Max. :656730
##
## votes reviews rating
## Min. : 5 Min. : 2.0 Min. :1.600
## 1st Qu.: 19918 1st Qu.: 199.0 1st Qu.:5.800
## Median : 55749 Median : 364.0 Median :6.500
## Mean : 109308 Mean : 503.3 Mean :6.389
## 3rd Qu.: 133348 3rd Qu.: 631.0 3rd Qu.:7.100
## Max. :1689764 Max. :5312.0 Max. :9.300
##
Con un solo comando, R te devuelve información estadística clave de cada variable del data frame. Ahora que ya sabes con qué trabajas, ¡vamos a explorar un poco más!
Ingeniería de variables: calcular el beneficio
Al revisar las variables disponibles, parece que algunas numéricas se pueden combinar para aportar nuevas ideas sobre el data frame.
Por ejemplo, tienes gross y budget, así que ¿por qué no calcular el beneficio de cada película?
Puedes calcularlo con la fórmula profit = gross - budget. Pruébalo en el bloque de DataCamp Light de abajo.
¡Genial!
Ves que en el data frame hay tanto éxitos de taquilla como auténticos pozos sin fondo.
El profit de las películas seguramente nos sirva para análisis interesantes más adelante, así que vamos a añadir profit como nueva columna al data frame.
Correlación
Ahora que has añadido profit como nueva columna en el data frame, es momento de mirar más de cerca las relaciones entre variables.
Veamos cómo fluctúa profit en relación con el rating de cada película.
Para ello puedes usar las funciones integradas de R plot y abline. plot genera un diagrama de dispersión y abline dibuja una recta de regresión o "línea de mejor ajuste" gracias al modelo lineal que añadimos, como verás a continuación.
¿El resultado ha sido más o menos lo que esperabas?

En general, parece que a mayor rating, mayor profit. Otra forma de decirlo: existe una correlación positiva entre rating y profit, al menos en este data frame.
Dicho esto, con un simple vistazo verás que hay muchas películas muy bien valoradas que no fueron taquillazos, y también otras con grandes beneficios que recibieron valoraciones relativamente bajas.
¡Correlación no implica causalidad!
Un ejemplo para entender correlación frente a causalidad: tengo un puesto de helados en la playa. El número medio de peatones que cruzan fuera del paso de cebra en la ciudad aumenta cuando suben mis ventas de helado. ¿Significa eso que mi helado hace que la gente incumpla las normas de tráfico, o hay otro factor? Mi helado está riquísimo, sí, pero seguramente el sol tenga más que ver con que la gente quiera un helado y no quiera esperar al sol en el semáforo. Existe una relación (correlación) entre mis ventas y el número de peatones imprudentes, pero no podemos afirmar que sea causal.
Ten esto presente mientras avanzas por el tutorial.
Calcular la correlación en R
Entonces, ¿qué relaciones existen entre las variables de movies y cómo evaluarlas cuantitativamente?
Una forma es calcular correlaciones y matrices de correlación con cor():
Nota: también puedes especificar el método para indicar qué coeficiente de correlación quieres calcular. Ojo con las suposiciones: los métodos Kendall y Spearman solo tienen sentido con entradas ordenadas. Es decir, tendrás que ordenar los datos antes de calcular el coeficiente.
Además, el método por defecto, la correlación de Pearson, asume que las variables se distribuyen normalmente, que existe una relación lineal entre ellas y que los datos se distribuyen normalmente alrededor de la recta de regresión.
También puedes usar rcorr(), del paquete Hmisc, para calcular los niveles de significación de las correlaciones de Pearson y Spearman.
Verás que la matriz de correlación es una tabla con los coeficientes entre pares de variables. Es una forma estupenda de empezar a ver qué relaciones hay en tu conjunto de datos, pero vamos un poco más allá en la siguiente sección.
Explorar la correlación visualmente: la matriz de correlación en R
Ahora vas a representar una matriz de correlación usando las variables de tu data frame movies. Este gráfico te permite ver rápidamente qué variables tienen correlación negativa, positiva, débil o fuerte con las demás.
Para ello usaremos el paquete GGally y su función ggcorr().
La llamada tiene la forma ggcorr(df), donde df es el data frame. La salida es una matriz triangular codificada por colores y etiquetada con los nombres de las variables. El coeficiente de correlación de cada par se obtiene leyendo a lo largo o hacia abajo de la matriz, según la posición.
Puede sonar lioso, pero en la práctica es muy sencillo. Pruébalo en el siguiente bloque de código.

En la matriz que acabas de crear (¡buen trabajo!), puedes ir a la fila o columna de una variable, como year, y ver su coeficiente según el color de la celda que cruza con otra variable.
Por ejemplo, para year observas una correlación positiva débil con budget y una correlación negativa también débil con rating.
Los coeficientes de correlación siempre están entre -1 y 1, ambos incluidos. Un coeficiente -1 indica un ajuste perfecto y negativo: los valores de y disminuyen al mismo ritmo que aumentan los de x. Un coeficiente 1 indica un ajuste perfecto y positivo: y crece al mismo ritmo que x.
En la mayoría de casos, como en el ejemplo de year, el coeficiente estará en algún punto intermedio.
¿Has notado algo raro en las variables que aparecen en la matriz?
¡No están todas las variables de movies!
Esto es porque no todas son numéricas. La función ggcorr ignora automáticamente las no numéricas, ahorrándote el "subsetting" previo a crear la matriz.
Si quieres que tu matriz tenga más impacto (o si eres un poco daltónico, como yo), puedes hacer unos ajustes sencillos para que sea más informativa y visual.
En el bloque que sigue, hemos añadido el argumento label, que puede ser TRUE o FALSE. Por defecto es FALSE, pero con label = TRUE se muestra el valor del coeficiente en cada celda. Así evitas estimarlo solo por el color.
El argumento label_alpha permite ajustar la opacidad de las etiquetas según la fuerza de la correlación. Muy útil para el análisis visual rápido.
No te fíes de mi palabra: ¡pruébalo!
Vamos a dibujar una matriz de correlación más clara:

En los gráficos que verás a continuación, cuando haya una correlación "fuerte", la pendiente de la recta de regresión (x/y) estará más cerca de 1/1 o -1/1. Con una correlación "débil", la pendiente será casi plana. Una pendiente próxima a 1/1 o -1/1 sugiere que las dos variables están estrechamente relacionadas.
En el caso de movies, esa línea de regresión puede aportar información valiosa sobre la naturaleza de tus variables y apuntar a una posible interdependencia.
Por ejemplo, en tu gráfico de profit frente a rating has visto que la recta tenía una pendiente positiva moderada. Si miras de nuevo la matriz, el coeficiente de estas variables es 0,3.
Tiene sentido, ¿verdad?
Tipos de correlación
Veamos ahora más gráficos que ilustran los distintos tipos de correlaciones que acabas de ver.
Correlación fuerte: votos frente a reseñas
Empecemos representando dos variables con una correlación positiva fuerte.
En la matriz parece que votes frente a reviews cumple el criterio, con un coeficiente de 0,8. Eso implica una pendiente relativamente cercana a 1/1.
En este ejercicio y los siguientes usarás el paquete ggplot2, un conjunto de herramientas muy versátil para crear visualizaciones potentes.
En este caso aprovecharemos la función qplot de ggplot2, que puede generar distintos tipos de gráficos según el tipo pasado al argumento geom (geometría).
En el código siguiente, geom es un vector con dos geometrías, point y smooth: point genera el diagrama de dispersión y smooth añade una línea de tendencia. Además, method se ha fijado en lm, por lo que la línea será una recta de regresión, como la que creamos al representar profit frente a years antes.
En resumen, vas a ver lo fácil que es crear visualizaciones potentes en un momento.

Tal vez te haya sonado el argumento alpha usado en qplot. alpha aplica un gradiente de opacidad a los puntos del diagrama de dispersión, de forma similar a como ajustaba la opacidad de las etiquetas en ggcorr.
Con la configuración usada, la opacidad total solo se alcanza cuando un punto queda cubierto por otros 5. Aumentar o reducir el denominador de alpha cambia cuántos solapes se necesitan para hacer más opaco un punto. Esta estética ayuda a identificar rápidamente concentraciones de puntos en el gráfico y, con un simple vistazo, descubrir nuevos patrones.
Trastea un poco con el código y compruébalo por ti mismo.
Correlación débil: beneficio a lo largo de los años
Ahora veamos cómo se ve una correlación negativa "débil" representando profit frente a years. Esta vez no se especifica method, así que la línea de tendencia se ajustará de forma curvilínea según los datos (una curva ajustada), que es el comportamiento por defecto. Verás una zona gris alrededor de la curva que aumenta o disminuye según el intervalo de confianza.
Si no te suena el concepto de intervalo de confianza, no te preocupes: R hará el trabajo y lo entenderás mejor tras el ejercicio.
De momento, completa los huecos con el código necesario y observa.

Ahora que has visto el intervalo de confianza y la curva de suavizado en acción, ¿qué observas?
- Primero, al principio del gráfico, el
profitparece aumentar cadayear. - Segundo, la zona gris alrededor de la curva es inicialmente grande y hay pocos puntos (pocas observaciones).
- Tercero, cuando la curva entra en zonas con más observaciones, la zona gris disminuye y prácticamente abraza la curva, que empieza a descender en los últimos
years.
En conclusión, representar el intervalo de confianza junto a la curva de suavizado nos permite ver la incertidumbre asociada a la recta de regresión. Esa incertidumbre aumenta cuando hay pocas observaciones y disminuye cuando hay más.
Esto es muy útil para visualizar cómo cambia la relación entre variables a lo largo del data frame y cómo las concentraciones de observaciones alteran la curva.
El matiz aquí es que el gráfico puede ser algo equívoco, ya que cuesta ver a simple vista si la correlación es positiva o negativa.
Ahora representemos profit frente a year igual que hiciste con votes y reviews: sustituye los "….." en cada argumento para que year vaya en el eje x y profit en el eje y. No olvides indicar el data frame en el argumento "data".

Si vuelves a la matriz, verás que el coeficiente de profit y year es -0,1, algo que se aprecia mejor en el gráfico con línea de mejor ajuste que en el de curva ajustada.
Juntándolo todo
Ahora vamos a ver otra función potente de GGally llamada ggpairs. Es genial porque permite crear una matriz que muestra, a la vez, el coeficiente de correlación de varias variables, un diagrama de dispersión (con línea de mejor ajuste y su intervalo de confianza) y un gráfico de densidad.
Con una sola función, puedes condensar todo lo que hemos visto en este tutorial de una forma clara y fácil de entender.
En el siguiente bloque, elige tus tres variables favoritas del data frame (¡no hace falta "subsetear"!), añádelas y a jugar.

Como habrás imaginado, hay muchos casos en los que un tipo de gráfico es más adecuado que otro. La clave es conocer qué técnicas de visualización existen, cómo usarlas y qué significan sus resultados.
Próximos pasos
Has cubierto mucho terreno en este tutorial, así que enhorabuena por llegar al final.
Ojalá puedas poner estos conceptos en práctica en tus propios análisis. Esto son los fundamentos de la exploración de datos en R y hay muchísimo más que puedes hacer para familiarizarte con tus datos antes de analizarlos y modelizarlos. ¿Por qué no subir un peldaño y empezar el curso de DataCamp Exploratory Data Analysis?
Mientras tanto, te animo a pasarte por Kaggle y buscar un conjunto de datos interesante para explorar si no quieres seguir con el de movies.
