R es un entorno y lenguaje de programación con un enfoque al análisis estadístico. A través de este curso veremos cuáles son las funcionalidades y herramientas con las cuales podrás desarrollar tareas tan sencillas como sumas y restas hasta modelos de analítica de datos que usan compañías como Airbnb, Uber o Twitter.
En este curso haremos una introducción a los conceptos básicos para el manejo de datos y el desarrollo de análisis estadísticos básicos. Así pues, ¡empecemos!
Aunque las estructuras de datos son útiles para trabajar en R, los datos que vamos a utilizar vienen en diferentes formatos de datos. Por tanto, es vital establecer una conexión entre la máquina y R. Este espacio en el cual estaremos trabajando se denomina Workspace y varía entre máquina y máquina. Sin embargo, R hace que funcione en diferentes tipos de computadores.
Lo primero que nos interesa es conocer nuestro actual directorio con la función getwd().
getwd()
## [1] "C:/Curso R"
Una vez sabemos dónde estamos, queremos saber qué tenemos. Para esto, usamos el comando dir().
dir()
## [1] "Asistencia Curso R_30 HORAS.xlsx"
## [2] "Clase-2.docx"
## [3] "Clase-2.html"
## [4] "Clase-2.Rmd"
## [5] "Clase-2.tex"
## [6] "Clase-2_files"
## [7] "Clase 1.pptx"
## [8] "Clase 2.csv"
## [9] "Clase 2.Rmd"
## [10] "Contrato Curso R_30 HORAS.pdf"
## [11] "Curso R"
## [12] "Figura1.JPG"
## [13] "Figura1.png"
## [14] "Figura2.png"
## [15] "Figura3.png"
## [16] "Modelo Cuenta de Cobro - Andrés Acero.pdf"
## [17] "Modelo Cuenta de Cobro - Carlos Mauricio Cubillos Villegas.docx"
## [18] "test.R"
Recuerden que queremos cambiar tan poco como sea posible la información, o como dicen los creadores de R “Solamente toma foto, deja únicamente huellas”. Por eso, asignaremos nuestro trabajo a esta carpeta con el comando setwd()
setwd("C:/Users/Andres Acero/Dropbox/Politécnico/Curso R")
Ahora, crearemos y agregaremos archivos a esta carpeta con el comando file.create(). Para empezar crearemos un script de R al que llamaremos test.
file.create("test.R")
## [1] TRUE
En general, pueden revisar todas las funciones asociadas con file como exists, rename, copy, path
Ahora, lo que necesitamos hacer ahora es conseguir la información que tenemos en este directorio. Con el archivo de excel llamado “Clase 2.csv” cargaremos esta información. Carguen este archivo en su directorio.
https://www.dropbox.com/s/14by1g23c7hnjbm/Clase%202.csv?dl=0
Hay una serie de formatos de datos comunes que se pueden leer dentro y fuera de R. Esto incluye archivos de texto en formatos como csv, txt, html y json. También incluye archivos de salida de aplicaciones estadísticas como SAS y SPSS. Los recursos en línea que incluyen servicios web y páginas HTML también se pueden leer en R.
La primera función que examinaremos es read.csv(), incorporada en R que es casi idéntica a la read.table(), con la excepción de que los argumentos de encabezado y relleno se establecen en TRUE de forma predeterminada. En este paso, verás lo fácil que es cargar un archivo csv utilizando read.csv().
data3 = read.csv("Clase 2.csv")
Una vez tenemos los datos cargados nos preguntaremos acerca de la naturaleza de ellos. Primero conoceremos los datos usando la función dim(), la cual nos dirá el tamaño de la base de datos que utilizaremos:
dim(data3)
## [1] 18147 48
Ahora queremos conocer las variables que tenemos en el archivo. Para eso utilizaremos el comando summary():
summary(data3)
Formular una pregunta puede ser una forma útil de guiar el proceso de análisis de datos exploratorios y limitar el número exponencial de rutas que se pueden tomar con cualquier conjunto de datos de tamaño considerable. En particular, una pregunta aguda o hipótesis puede servir como una herramienta de reducción de dimensión que puede eliminar variables que no son inmediatamente relevantes para la pregunta.
Por ejemplo, en este capítulo veremos un conjunto de datos de los jugadores que están en este momento inscritos en la FIFA para el año 2019. Una pregunta general podría ser:
*¿Los niveles de desempeño de un jugador son más altos si son más ágiles?
Pero una pregunta más específica podría ser
*¿Los niveles de desempeño potencial de un jugador son más altos para los jugadores esbeltos que para los jugadores normales?
Tenga en cuenta que ambas preguntas pueden ser de interés y que ninguna es correcta o incorrecta. Pero la primera pregunta requiere analizar todos los tipos de desempeño en todas las variables, mientras que la segunda pregunta solo requiere observar un solo tipo de desempeño en dos tipos de cuerpos.
Por lo general, es una buena idea dedicar unos minutos a averiguar cuál es la pregunta que realmente le interesa y reducirla para que sea lo más específica posible (sin dejar de ser interesante).
Para este capítulo, no nos centraremos en una pregunta específica, ya que veremos a lo largo del tiempo iremos cambiando la pregunta.
Como nota al margen, una de las preguntas más importantes que puede responder con un análisis exploratorio de datos es “¿Tengo los datos correctos para responder a esta pregunta?” A menudo, esta pregunta es difícil de responder al principio, pero puede ser más clara a medida que ordenamos y miramos los datos.
Para eso, empezaremos con un resumen de los datos y las medidas de tendencia central.
Las medidas de posición (o medidas de tendencia central) describen brevemente la ubicación de los datos en la recta numérica real. Especifican un punto central alrededor del cual los datos tienen la tendencia a reunirse. Las medidas de posición más importantes son la moda, la media y la mediana.
La primera de la medida que expondremos es la moda. Dado que no existe una función específica en R (sin usar un paquete). Para hacerlo, usaremos la tabla de frecuencias y calcularemos el valor máximo. Nota: usaremos una variable que nos interese conocer
table(data3$Age)
La siguiente medida que nos interesa es la media. Esta es la medida más popular, y se calcula con la función mean():
mean(data3$Age)
Por último, nos interesa conocer la mediana. La mediana es el valor de la observación mediana, cuando las observaciones se ordenan en orden ascendente o descendente. Si el número de observaciones (n) es un número impar, entonces la observación mediana es el (n + 1) / 2, mientras que si el número de observaciones es un número par, tenemos dos observaciones de la mediana en las posiciones n / 2 yn / 2 +1, entonces la mediana es el valor medio de estos dos valores. Para calcularla, usaremos la función median():
median(data3$Age)
Ahora trataremos las medidas de dispersión. Estas medidas describen brevemente la variabilidad de los datos en la recta numérica real. En otras palabras, revelan la variabilidad de las observaciones. La variabilidad no siempre es clara a partir de las medidas de posición, como por ejemplo la media. Si los datos se recopilan alrededor de la media, por ejemplo, si la varianza es baja, la media puede representar datos de manera bastante efectiva. Sin embargo, en el escenario opuesto, las medidas de posición no proporcionan una manera efectiva de describir los datos. Para esto, las medidas de dispersión más importantes, que se describen más adelante, son el rango, la varianza, la desviación estándar, el coeficiente de variación y los valores percentiles.
Para calcular el rango tenemos dos opciones. Primero, usando los valores mínimos y máximos de la función y la segunda usando la función range():
#Versión 1: valores mínimos y máximos
minimo <- min(data3$Age)
maximo <- max(data3$Age)
maximo - minimo
## [1] 29
#Versión 2: función range
range(data3$Age)
## [1] 16 45
range(data3$Age)[2] - range(data3$Age)[1]
## [1] 29
El valor del percentil p de una muestra con n observaciones, se define como la observación para la cual el p% de las observaciones son más pequeñas que él y el (1-p)% de las observaciones son mayores que este. Para calcular estos cuantiles usaremos la función quantile():
quantile(data3$Age, 0.75, type=7)
## 75%
## 28
La varianza es el promedio de las diferencias al cuadrado de la media, y se usa para medir la extensión de los datos. Para calcular este valor, se usa la función var()
var(data3$Age)
## [1] 21.807
Sin embargo, hay que hacer una aclaración. Esta es la varianza de la muestra, no de la población. Para ajustar este valor, deberá multiplicar por el tamaño de la muestra menos 1 y dividir por el tamaño de la muestra.
La desviación estándar es la raíz cuadrada de una varianza y mide la dispersión de los datos. Las variaciones se incrementan cuando hay más variaciones y se reducen cuando hay variaciones menores, porque la variación es un resultado cuadrado. Con la desviación estándar, la varianza es la raíz cuadrada, por lo que es más fácil de visualizar y aplicar. Para calcular la desviación estándar usaremos la función sd()
sd(data3$Age)
## [1] 4.669796
Ahora, ¿con estos datos puedo construir intervalos de confianza? Claro que si, ya tenemos suficiente información para lograr este resultado.
En este capítulo presentaremos las formas que podemos utilizar para visualizar nuestras observaciones. La visualización puede realizarse con vectores y tablas, pero también mediante diagramas como histogramas, gráficos de barras, gráficos circulares, etc. En cada caso, es muy importante distinguir nuestras observaciones en datos cuantitativos o cualitativos. Comenzamos con datos cualitativos, que generalmente se representan con tablas, gráficos de barras y gráficos circulares.
Lo primero que haremos será crear tablas de frecuencia. Para esto usaremos el comando table():
table(data3$Body.Type)
##
## Akinfenwa C. Ronaldo Courtois Lean Messi Neymar Normal
## 1 1 1 6412 1 1 10588
## Shaqiri Stocky
## 1 1141
Si lo que deseamos no son la frecuencias absolutas sino las frecuencias relativas usaremos la función prop.table() sobre la función table:
prop.table(table(data3$Body.Type))*100
##
## Akinfenwa C. Ronaldo Courtois Lean Messi Neymar
## 0.005510553 0.005510553 0.005510553 35.333663966 0.005510553 0.005510553
## Normal Shaqiri Stocky
## 58.345732077 0.005510553 6.287540640
También podemos crear matrices de contingencia. Una matriz de contingencia tiene que ver con dos variables categóricas y muestra su distribución de frecuencia. Estas las creamos igual que las tablas de frecuencia:
table(data3$Body.Type, data3$Preferred.Foot)
##
## Left Right
## Akinfenwa 0 1
## C. Ronaldo 0 1
## Courtois 1 0
## Lean 1597 4815
## Messi 1 0
## Neymar 0 1
## Normal 2358 8230
## Shaqiri 1 0
## Stocky 251 890
prop.table(table(data3$Body.Type, data3$Preferred.Foot))*100
##
## Left Right
## Akinfenwa 0.000000000 0.005510553
## C. Ronaldo 0.000000000 0.005510553
## Courtois 0.005510553 0.000000000
## Lean 8.800352675 26.533311291
## Messi 0.005510553 0.000000000
## Neymar 0.000000000 0.005510553
## Normal 12.993883286 45.351848790
## Shaqiri 0.005510553 0.000000000
## Stocky 1.383148730 4.904391911
Ahora, trataremos de visualizar los datos a través de gráficas de barras. Para eso utilizaremos dos versiones, los gráficos de R y el paquete ggplot2 (que veremos más adelante). Ggplot2 es un paquete que ofrece un poderoso lenguaje que permite crear gráficos que representan datos univariados, multivariados y categóricos de manera directa. La funcionalidad incorporada de R ofrece el trazado de gráficos, pero ggplot nos permite trazar gráficos más avanzados utilizando la gramática de gráficos.
Primero crearemos la gráfica con barplot() sobre la tabla de frecuencias relativas:
barplot(table(data3$Body.Type))
Finalmente, si queremos un gráfico de pie o circular, con R podemos usar el comando pie:
pie(table(data3$Body.Type))
La primera tabla que veremos será la misma que en el caso anterior, la tabla de frecuencia. No lo explicaremos de nuevo, pero es una opción. Acá nos centraremos en tres tipos de gráficas, los histogramas, los gráficos de dispersión y los diagramas de caja.
un histograma es una representación gráfica de una variable en forma de barras, donde la superficie de cada barra es proporcional a la frecuencia de los valores representados. Sirven para obtener una “primera vista” general, o panorama, de la distribución de la población, o de la muestra, respecto a una característica, cuantitativa y continua (como la longitud o el peso).
Para representar un histograma con R, la función que utilizaremos será hist() y para personalizar la clases usaremos nclass:
hist(data3$Potential, nclass = 50)
El diagrama de caja es una forma adecuada de mostrar las características más importantes de la distribución de observación de las muestras. El diagrama de caja es un rectángulo basado en los valores del primer, segundo (mediana) y tercer cuartil, mientras que los bigotes varían desde el valor más pequeño hasta el más alto de las observaciones.
Para crear estos gráficos en R usaremos la función boxplot():
boxplot(data3$Potential)
boxplot(data3$Potential, data3$Overall)
Finalmente, haremos un gráfico de dispersión para mirar la relación entre dos variables. Para esto, usaremos el graficador por excelencia de R, plot():
plot(data3$Potential ~ data3$Crossing)
Una vez hemos entendido qué hay detras de las variables, vale la pena preguntarnos acerca de su distribución de probabilidad. Pero ¿qué es una distribución en este caso? Ya que todas las variables aleatorias tienen un comportamiento dado, es importante reconocer el patrón que se da en la variable. Para ello, hemos creado una serie de “distribuciones” que emulan el comportamiento natural, ya que está definida sobre el conjunto de todos los sucesos y cada uno de los sucesos o rango de valores de la variable aleatoria. También puede decirse que tiene una relación estrecha con las distribuciones de frecuencia. De hecho, una distribución de probabilidades puede comprenderse como una frecuencia teórica, ya que describe cómo se espera que varíen los resultados.
Algunas de las distribuciones más populares son las siguientes:
Figura 1: Distribuciones de probabilidad discretas y continuas
Figura 2: Distribución binomial
Figura 3: Distribución normal
¿Y cómo puedo saber la distribución de mis datos? Lastimosamente R no es espacio óptimo para entender distribuciones, por lo que para hacerlo funcionar correctamente usaremos un paquete avanzado que ajusta los datos a diferentes distribuciones de probabilidad.
library("rriskDistributions")
¿Cómo haremos que funcione adecuadamente? Para ellos usaremos el comando fit.cont() sobre la variable que queremos ajustar a los datos:
dist1 <- fit.cont(data3$Height)
##
## Begin fitting distributions ---------------------------------------
## * fitting normal distribution ... OK
## * fitting Cauchy distribution ... OK
## * fitting logistic distribution ... OK
## * fitting beta distribution ... failed
## * fitting exponential distribution ... OK
## * fitting chi-square distribution ... OK
## * fitting uniform distribution ... OK
## * fitting gamma distribution ... OK
## * fitting lognormal distribution ... OK
## * fitting Weibull distribution ... OK
## * fitting F-distribution ... OK
## * fitting Student's t-distribution ... OK
## * fitting Gompertz distribution ... failed
## * fitting triangular distribution ... failed
## End fitting distributions -----------------------------------------
Como podrás ver, tendremos una pantalla adicional que nos dirá si una variable se comporta como ciertas distribuciones. Sin embargo, el teorema del límite central nos dice que: “Cuando el tamaño de la muestra es lo suficientemente grande, la distribución de las medias sigue aproximadamente una distribución normal.” Por tanto, muchas de las operaciones las podemos hacer solamente determinando si sigue un comportamiento normal. Por tanto, usaremos el gráfico QQ.
qqnorm(data3$Potential)
qqline(data3$Potential)
Si una variable se comporta como una variable normal, entonces estará muy cerca de la línea central. Esto nos será muy útil más adelante.
Hasta este punto ya hemos entendido cómo hacer análisis estadísticos sobre una sola variable y hemos finalizado la primera parte del análisis exploratorio de datos. ¿Eso quiere decir que ya acabé? No, eso quiere decir que ahora va a empezar lo más interesante. Pero…¿y la relación de las variables’. Tranquilos, empezaremos por hablar de correlaciones y covarianza.
Aunque los diagramas de dispersión proporcionan mucha información visual, cuando hay más de unas pocas variables, puede ser útil evaluar la relación entre cada par con un solo número.Una medida de la relación entre dos variables es la covarianza, que se puede calcular para dos variables cualesquiera usando la función cov():
cov(data3$BallControl, data3$Height)
## [1] -0.4671107
Si las variables tienden a ir en la misma dirección (ambos más altos o ambos más bajos que sus respectivas medias) entre las observaciones, entonces tienen una covarianza positiva. Si cov (x, y) es cero, entonces no hay asociación (lineal) entre x e y. La covarianza negativa significa que las variables van en direcciones opuestas con respecto a sus medias: cuando x es menor, y tiende a ser mayor.
El problema con esta medida es igual al de la varianza, no se encuentra en una medida adecuada para ser analizado. Por tanto, usaremos la función cor() para revisar las correlaciones de las variables. Si deseo calcular la correlación bivariada podemos usar la función cor() o cor.test():
cor(data3$Height,data3$Potential)
## [1] -0.009792023
cor.test(data3$Height,data3$Potential)
##
## Pearson's product-moment correlation
##
## data: data3$Height and data3$Potential
## t = -1.3191, df = 18145, p-value = 0.1872
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## -0.024338151 0.004758251
## sample estimates:
## cor
## -0.009792023
¿Y cómo sabemos si es pequeña o grande una correlación? Sencillo, se llama débil entre 0.1 y 0.3, mediana entre 0.3 y 0.5 y fuerte por encima de 0.5.