Está en la página 1de 26

Introducción a R:

instalación y estadística descriptiva


Mateo Duque Villegas
mateo.duquev@udea.edu.co

Contenido
1. Motivación 3

2. Descargar R 3

3. Instalar R 4
3.1. Sobre RStudio y otros IDE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

4. Utilizando R por primera vez 5


4.1. Consola de R . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
4.2. Funciones en R . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
4.3. Escribiendo scripts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

5. Conociendo los tipos de variables 8


5.1. ¿Qué es una variable? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
5.2. Objetos básicos de R . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
5.2.1. Números . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
5.2.2. Palabras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
5.2.3. Vectores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
5.2.4. Data frames . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

6. Instalando librerías adicionales 11


6.1. Permisos para instalar librerías . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
6.2. Instalar librerías usando la interfaz gráfica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
6.3. Instalar librerías usando la consola . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
6.4. Utilizar las librerías . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

7. Lectura de datos 12
7.1. Función setwd() para ayudar a R a encontrar archivos . . . . . . . . . . . . . . . . . . . . . . . . . . 13
7.2. Leyendo archivos CSV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

8. Análisis estadístico de datos usando R 14


8.1. Los datos: pruebas de choques de carros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
8.2. Comencemos nuestro script y leamos los datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
8.3. Valores representativos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
8.3.1. Valores representativos para filas o categorías específicas . . . . . . . . . . . . . . . . . . . 19
8.3.2. Guardando en archivos de texto los valores . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
8.4. Gráficos con ggplot2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
8.4.1. El lienzo o fondo del dibujo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
8.4.2. Figuras geométricas o geoms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
8.4.3. Histogramas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
8.4.4. Diagramas de cajas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
8.4.5. Diagramas de barras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
8.5. Múltiples ventanas de gráficos y guardar las figuras . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

1
1. Motivación
Todo gran programador que conozcas, llegó a serlo resolviendo problemas
que no estaba cualificado para resolver hasta que los resolvió.

Patrick McKenzie, Ingeniero

Los computadores son las calculadoras científicas más avanzadas que existen y la estadística lo sabe. Es por
esto que es una disciplina que, generalmente, se enseña utilizando alguna herramienta informática. Así agiliza-
mos la implementación de las técnicas estadísticas y nos aseguramos de que las personas pasen menos tiempo
haciendo sumas, restas y dibujitos, y más tiempo gastando neuronas formulando hipótesis y haciendo prediccio-
nes acertadas, que es en última instancia lo más complicado y significativo (chiste estadístico). Además ahora
vivimos en la época de lo que se llama “big data”, que simplemente quiere decir que promediar a mano alzada es
imposible desde el punto de vista práctico.
La pregunta entonces es ¿cuál herramienta computacional es la que mejor se acomoda a un curso introductorio
de estadística? No hay una sola respuesta. Existen muchos programas muy buenos y la verdad la elección de uno
u otro depende enteramente del gusto de cada quien. También sucede que los instructores enseñan aquel que
aprendieron a usar a la fuerza en alguna materia de pregrado o posgrado. Algunas herramientas especializadas
para estadística conocidas son: SAS, SPSS, Minitab, Statgraphics, Stata e incluso el viejo y confiable Microsoft
Excel (o cualquier otro programa de hojas de cálculo). El problema de todas estas que mencionamos, es que
todas son productos que venden empresas y por lo tanto requieren licencias costosas. Y aunque algunos tienen
versiones de prueba (o sabemos dónde conseguir las versiones crackeadas), una vez salimos al mundo laboral
nos damos cuenta de sus limitaciones y además de que la piratería no es bien vista. Entonces aparece R, un
proyecto liderado por gente chévere de todo el mundo, que pone a nuestra disposición, de manera libre y gratuita,
un programa sofisticado para el análisis estadístico de datos y la producción de gráficas.
Pero aunque las cosas gratis son casi siempre excelentes solo por eso (no una enfermedad), R tiene muchas
otras ventajas, entre ellas: puede utilizarse en Windows, Mac OS, y distribuciones de Linux sin problemas; cuenta
con una comunidad amplia de personas en Internet que se encargan de mantenerlo actualizado con los últimos
avances en estadística en todas las ramas de la ciencia; esta misma comunidad está disponible para resolver
dudas y publicar tutoriales y video-ayudas; y además un lenguaje de programación que permite ir más allá de la
estadística si es necesario. Ahora, también es importante destacar sus desventajas, de las cuales la más evidente
es que al ser también un lenguaje de programación, puede tener una curva lenta de aprendizaje al comienzo.
Así pues, toda esta “carreta” ha sido para invitarlos a aprender R con nosotros. Si en algún momento dudan
o se sienten frustrados ante posiblemente su primera experiencia de programación, pueden recurrir a alguno
de los otros programas que se mencionaron arriba, a excepción de Microsoft Excel, que no está especializado
para el tratamiento estadístico de datos aunque posea muchas de las mismas funciones. Sin más preámbulos,
descarguemos e instalemos R.

2. Descargar R
Para descargar R debe visitarse la página del proyecto en: https://www.r-project.org/. En el panel del lado izquierdo
habrá una sección que se llama “Download” y debajo de ella dice “CRAN”, dar clic aquí. CRAN quiere decir
Comprehensive R Archive Network, que es un nombre muy elaborado para simplemente referirse al lugar donde
está guardado el programa en Internet. La cosa es que el CRAN no queda en un solo lugar, sino que tiene copias
(o espejos o mirrors) por todo el mundo, por si alguna copia se daña, existan otras intactas. Lo normal es que uno
seleccione un mirror cercano a la ubicación geográfica en la que uno se encuentra, pero hoy en día el Internet es
tan veloz que eso no importa tanto. Aún así, solo por seguirles la corriente, seleccionemos el mirror de Colombia
(cualquiera de los dos) que está ubicado en los computadores de la Universidad ICESI en Cali.
Esto nos llevará a una página en la que se listan las opciones para cada sistema operativo. Asumiremos que
estamos trabajando en Windows, así que hacemos clic en “Download R for Windows”. Esto nos llevará a otra
página en la que vamos a escoger cuál distribución de R queremos. Por ahora, no necesitamos muchas cosas así
que solo instalemos el programa base, así que hacer clic en “base”. Esto nos lleva a una página final en la que
por fin vemos el instalador de Windows para descargarlo “Download R 3.5.1 for Windows”. Esto nos preguntará

2
Figura 1: Descargar R para su instalación: (1) ir a la página del proyecto, (2) seleccionar el repositorio CRAN, (3)
escoger el mirror para Colombia, (4) seleccionar sistema operativo (Windows), (5) elegir la versión base de R, (6)
hacer clic en el vínculo para descargar R con las opciones especificadas, y finalmente (7) elegir guardar el archivo
instalador.

si queremos guardar el ejecutable, y lo guardamos en algún lugar del computador, que puede ser la carpeta
“Descargas”. En la Figura 1 pueden verse los pasos descritos aquí.

3. Instalar R
Instalar R usando el instalador de Windows es tan sencillo como hacer clic seguidas veces en "Siguiente"(o
"Next"). Siendo este un curso introductorio, no entraremos en los destalles de las posibles maneras de instalar
el programa. En la Figura 2 se observan pantallazos de una instalación corriente de R. En esta ocasión no se
hicieron modificaciones a las opciones predeterminadas del instalador.

3.1. Sobre RStudio y otros IDE


Algunos de ustedes pueden haber obtenido R por medio de la instalación de algún otro programa como RStudio
o Architect. Estos se llaman Integrated Development Environments o IDEs en inglés, que significa “entornos
integrados para desarrollo” de código. Son herramientas (o software) que facilitan la tarea de escribir (o programar)
códigos de computador. Ayudan con cosas como señalando y corrigiendo errores de escritura, con colores para
palabras importantes y con botones que ayudan a la hora de guardar y de ejecutar. Una IDE muy famosa es la
de MATLAB. En este tutorial no se utilizará ninguna de estas herramientas, sino que solo se utilizará el programa

3
Figura 2: Instalación de R: (1) ejecutar el instalador, (2) aceptar los permisos de ejecución, (3) seleccionar el
idioma para el instalador, (4) aceptar los términos de la licencia de uso, (5) seleccionar el lugar de instalación de
R, (6) seleccionar los componentes a instalar, (7) escoger si se inicia R con Windows, (8) escoger si crear ícono
en escritorio y comenzar instalación, (9) instalación en progreso, (10) finalizar. Además se muestra el ícono de
acceso directo que aparece en el Escritorio.

base de R. Pero si el lector o lectora quieren utilizar algún IDE, seguro se sentirán muy cómodos y podrán seguir
esta misma guía sin problemas.

4. Utilizando R por primera vez


Una vez ha finalizado la instalación, debería aparecer en su escritorio un ícono como el que se muestra abajo en
la Figura 2. Si no es así, podrá encontrar un menú para R en el menú de aplicaciones del “Inicio” de Windows.
Según su computador (sea Windows de 32-bit o de 64-bit) su programa de R tendrá un i386 (32-bit) o un x64 (64-
bit) en algún lugar del nombre. No nos preocuparemos aquí de las diferencias entre ambos, pues sigue siendo el
mismo programa de R. Haga doble clic en el ícono y verá una ventana similar a la que se muestra en la Figura 3.
La figura señala las diferentes partes de la interfaz gráfica de R.
El usuario de Windows reconocerá la barra de menú en la parte superior de la ventana de R. Los menú de
“Archivo”, “Editar”, “Visualizar” y demás, son similares en otros programas. Contienen opciones de configuración
del programa y algunas funciones útiles (como “Deshacer”). Luego la barra de herramientas tiene íconos para
algunas de las funciones más comunes durante la utilización del programa. Estas mismas funciones se encuentran
en algún lugar de la barra de menú, pero nos ahorran el trabajo de buscarlas con estos íconos. Luego se tiene
un amplio espacio de color gris al que nos referiremos como el “panel multi-ventanas”, por ser un espacio en
el que se encuentran otras ventanas pequeñas. Al momento de iniciar R solo verá una ventana allí adentro que

4
Figura 3: Ventana inicial de R.

corresponde a la consola de R. Esta pequeña ventana es la más importante de todas pues es la que se encarga
de ejecutar todos nuestras instrucciones. Esta consola es R, es lo que aprenderemos a usar con esta guía. Todo
los demás menú y cosas son solo adicionales para hacer el uso de esta ventana de consola más agradable.

4.1. Consola de R
La consola de R viene con unos colores predeterminados. El fondo es de color blanco. Tiene un color azul naval
para los mensajes que la misma consola de R nos muestra. Y tiene un color rojo normal para el texto que nosotros
como usarios le escribamos. Naturalmente esos colores pueden modificarse según le gusten al usuario en el menú
“Editar” y “Preferencias de la interface gráfica”. En ese mismo menú pueden editarse muchas cosas sobre cómo
se muestra R para el usuario, aunque no todas las cosas pueden cambiarse. Como se muestra en la Figura 3,
la consola al inicio imprime un largo mensaje en el que se dice la versión de R que se está usando, y además
dan información sobre el lenguaje en el que está R (puede que el suyo aparezca en español), y abajo aparecen
algunos comandos sobre pedir ayuda o hacer pequeñas demostraciones. Luego de este mensaje largo aparece
una flecha roja (o “mayor que”) seguida de una línea vertical:

> |
La barra vertical usualmente está titilando, igual que en cualquier editor de texto (como Microsoft Word). Esto
significa que el programa está a la expectativa de que el usuario ingrese algo de texto. En inglés esto se denomina
prompt y es donde escribimos instrucciones para que R las ejecute. El símbolo de "mayor que"(>) está ahí por
razones históricas, pues en los computadores antigüos esa era la manera de decir “aquí estamos”. Entonces uno
escribe un comando en el prompt y luego presiona la tecla “Enter” para que R ejecute nuestra instrucción. Por
ejemplo hagamos operaciones aritméticas:

> 4 + 5
[1] 9
> 10*2
[1] 20
Los números entre corchetes ([1]) indican el número de renglones de cada cosa que se imprime. En estas
operaciones matemáticas solo se imprime un renglón, y por eso el único número 1. En cambio, si por ejemplo se

5
tratara de una matriz, tendría varios renglones. Una definición importante en la consola de R es la de workspace
(área de trabajo en inglés):

Workspace de la consola: este término se refiere a todo lo que se escribe en la consola y a todo lo que esta
imprime. Es decir, el workspace es todo lo que ocurre en la consola: todas las variables, instrucciones, funciones,
resultados, mensajes, entre otras cosas. Al final de toda sesión de R, el programa le pregunta al usuario si
quiere guardar el workspace, esto por si quiere repetir exactamente los mismos cálculos e instrucciones con las
mismas variables en un futuro. Generalmente nosotros no querremos hacer exactamente los mismos cálculos
para los mismos datos (¿para qué hacer lo mismo dos veces?), y por eso casi nunca guardaremos el workspace.
Además en cualquier procedimiento pueden hacerse pruebas y errores en la consola que no querremos guardar
de ninguna forma. Sin embargo, pueden existir ocasiones en las que sea útil hacerlo y por eso el programa lo
pregunta, como por ejemplo cuando se queda uno en medio de alguna operación pero ya no queda tiempo de
clase y debe continuar luego.
Se debe entonces pensar en la consola de R como una calculadora muy sofisticada, que no solo hace operaciones
aritméticas, sino que tiene muchas funciones programadas para el análisis estadístico de información. Estas
funciones las iremos aprendiendo a medida que avanza este documento.

4.2. Funciones en R
Hemos dicho que la consola de R es una calculadora sofisticada. Esta entonces tiene funciones de alto calibre,
no solo sumar (+), restar (-), multiplicar (*) y dividir (/). Una función es simplemente un código de computador que
con unas entradas o argumentos, hace diversas operaciones para entregar un resultado o salida. Hay funciones
para muchas cosas y aquí no vamos a enlistarlas todas, pero sí a mostrar su forma básica. Toda función tiene un
nombre alusivo a lo que esta entrega como resultado y luego del nombre siguen unos paréntesis entre los cuales
van a ir los argumentos de entrada para la función. Si no hay nada entre los paréntesis, es porque no se necesitan
argumentos, como es el caso de algunas funciones. Entonces siempre que hablemos de alguna función, debemos
recordar que estas llevan unos paréntesis que les acompañan el nombre. Estos nombres además no deberíamos
utilizarlos para los nombres de variables, aunque es posible. Veamos algunos ejemplos:

mean(x): promedia un vector x.


help(nombre): muestra el manual sobre el objeto nombre.
getwd(): entrega el directorio de trabajo.

No se preopcupen si no entienden bien lo que hacen las funciones. Ese no es el punto, lo importante es el
lenguaje, y que entiendan a qué nos referimos con funciones y que recuerden los paréntesis. Y noten por ejemplo
que mean() requiere un argumento de entrada, mientras que la función getwd() no.

4.3. Escribiendo scripts


Como usuarios de R podríamos hacer todos nuestros cálculos en la consola siempre. Hay personas que trabajan
así y no está mal. Podríamos siempre ingresar instrucción tras instrucción en la consola hasta llegar al número o
a la gráfica deseada. Pero pronto descrubriríamos que esto puede ser muy tedioso, porque ante el menor cambio
habría que repetir todas las instrucciones. Por ejemplo, si ustedes hacen todos sus cálculos con unos datos, y al
final descubren que debían haber hecho una modificación o que eran otros los datos, tendrían que repetir de nuevo
todos los comandos de la consola. Esto es ineficiente y podría aburrir a cualquiera rápidamente. Para evitarnos
el dolor de cabeza de estar repitiendo una a una las instrucciones en la consola, lo mejor es siempre escribir
todas las operaciones en un solo archivo y hacer que R las lea todas al mismo tiempo. Además estos archivos
nos permiten reutilizar secciones de ellos que hagan las mismas tareas, y mejor aún, nos permiten compartir con
otros colegas nuestro trabajo. A estos archivos se les denomina scripts, y son simplemente archivos de texto con
recetas de código reutilizables.
Los scripts llevan la extensión .R y pueden escribirse con cualquier bloc de notas. Pero en vez de utilizar un bloc
de notas cualquiera, podemos utilizar el editor de scripts que trae R consigo. Para crear un nuevo script vamos
al menú “Archivo” y seleccionamos la opción “Nuevo script”. Entonces se abrirá una ventana nueva con una hoja

6
Figura 4: Creando un nuevo script de R: (a) abriendo el editor y (b) organizando las ventanas verticalmente en el
panel multi-ventanas.

en blanco, como se muestra en la Figura 4a. Lo primero que debe notarse es que cuando se tiene enfocada
esta ventana de editor, desaparecen algunos de los íconos de la barra de herramientas y algunos de los menús
de la barra superior (como “Visualizar” y “Misc”). Esto es indicativo de que la ventana de editor de scripts tiene
una funcionalidad distinta. La más relevante de todas es la que tiene que ver con ejecutar las líneas de código
que escribamos en esa nueva ventana. Puede verse en el menú “Editar” (con la ventana de editor enfocada) las
opciones “Correr línea o selección” y “Ejecutar todo”. Lo que hacen estas funciones es pasar lo que escribamos
en el script a la consola de R, que es como dijimos anteriormente donde sucede todo. Es útil recordar el atajo
de teclado Ctrl + R, que nos permite ejecutar el renglón en el que estamos parados en el editor de scripts, o la
selección que hagamos (puede ser con el mouse) en esa misma ventana. Con este atajo, podemos ir probando
las cosas que vamos escribiendo en el script hasta que llegamos al resultado deseado.
Finalmente, ahora que tenemos dos ventanas: una para la consola y otra para el editor de scripts, podemos
ver la utilidad del menú “Ventanas”, en el que podemos escoger cómo queremos organizarlas: en cascada (una
encima de la otra), divididas verticalmente u horizontalmente. La Figura 4b muestra cómo se organizaron las
dos ventanas separadas verticalmente. En el curso de esta guía puede que aparezcan más ventanas (como una
para los gráficos o varios scripts abiertos al tiempo), ya entonces pueden escoger cómo organizarlas para su
comodidad.

5. Conociendo los tipos de variables


En este momento ya deberíamos estar familiarizados con el aspecto de R. Sabemos que existe una consola (o
calculadora) con un prompt que aguarda por nuestros comandos para ejecutarlos y un editor de scripts en el que
ordenadamente escribiremos nuestras instrucciones y que iremos ejecutando una a una usando el atajo Ctrl +
R. Si alguno de ustedes decide utilizar RStudio o alguna IDE, su situación será similar. Pero aún no estamos listos
para escribir un script. Primero conozcamos los elementos básicos que componen cualquier función de R. Para
esto utilizaremos solo la consola.

7
5.1. ¿Qué es una variable?
Este tema es elemental, y a veces los instructores lo pasamos por alto creyendo que todos entienden lo que es
una variable. Pero una variable en programación no es lo mismo que una variable en un curso de matemáticas, y
tampoco nos referimos aquí a los tipos de variables (cualitativas o cuantitativas) que se ven en estadística. Una
variable es simplemente un nombre que se le asigna a algún objeto. Piensen en que tenemos por ejemplo una
matriz de 80 filas por 80 columnas, si cada vez que quisiéramos hacerle una operación, por ejemplo un promedio,
tuviéramos que escribir las 80 filas y las 80 columnas, nos quedarían doliendo las manos y odiaríamos al profesor
o profesora de esa materia por hacernos doler nuestras manitas. Así que preferimos escribir esa matriz una sola
vez, pero asignándole un nombre, bautizándola, para que solo con usar ese nombre, el programa ya entienda que
se trata de esa inmensa matriz.
Los nombres de una variable en R tienen reglas como por ejemplo:
No pueden iniciar con números: no se puede 123variable.
No pueden tener espacios (utilice guiones_al_piso mejor).
No pueden tener símbolos extraños como asterisco (*).
Las mayúsculas importan: no es lo mismo r que R.
Para bautizar o nombrar los objetos con variables se utiliza el símbolo <- que quiere decir “creado a partir de”,
con espacios a cada lado así:
nombre_de_variable <- objeto.de.R
Entonces cuando tenemos un objeto de R (números, palabras, vectores, etc.) al que le hemos bautizado (utilizando
el <-) con un nombre, tenemos una variable.

5.2. Objetos básicos de R


La cantidad de cosas a las que se les puede asignar nombre en R es muy grande. Pero no es necesario conocerlas
todas, sino solo algunas, las más comunes.

5.2.1. Números
Los objetos numéricos en R o numeric son simplemente los números. No importa si son enteros o decimales.
Creemos algunas variables con números en la consola de R:
> edad <- 15
> velocidad <- 50.2
Noten que el punto decimal (.) es un punto y no una coma.

5.2.2. Palabras
Los objetos de caracteres o de palabras son todos los que puedan escribirse con un teclado. Estos tienen que ir
encerrados entre comillas (") y pueden ser tan largos como se quiera y contener espacios. A estos también se les
llama de tipo string porque son vistos como cadenas o secuencias de letras. Creemos algunas variables de tipo
string en la consola de R:
> nombre_completo <- "Helio Argemiro Otiundo Palmira"
> mensaje_bienvenida <- "Bienvenido al mundo de programar"
Comprobemos que efectivamente hemos creado estas variables, escribiendo sus nombres en la consola de R y
presionando “Enter” para que nos muestre qué representan o qué contienen:
> edad
[1] 15
> velocidad
[1] 50.2
> nombre_completo
[1] "Helio Argemiro Otiundo Palmira"

8
5.2.3. Vectores
La palabra vector en este contexto simplemente quiere decir colección ordenada de objetos. Estos pueden ser
numéricos o de palabras, pero solo pueden contener objetos de un solo tipo: todos son números o todos son
palabras. Se construyen con la función c() que sirve para coleccionar objetos. Dentro de esta función, cada uno
de los objetos se separa con comas (,). Creemos dos vectores en la consola de R, uno de caracteres y otro de
números:

> equipos <- c("Nacional", "Medellín", "Millonarios", "América")


> puntos <- c(21, 18, 15, 12)

Si escribimos el nombre en la consola, esta nos muestra los contenidos del vector (sin las comas):

> puntos
[1] 21 18 15 12

Algo importante sobre los vectores, es que son colecciones ordenadas, esto quiere decir que a cada elemento
de la colección se le asigna una posición dentro del vector. Las posiciones en R comienzan contando desde 1.
Para acceder a cada una de las posiciones se utiliza un índice que va entre corchetes luego del nombre de la
variable. Por ejemplo si quisieramos imprimir en la consola el tercer equipo en la variable equipos, lo haríamos
así:

> equipos[3]
[1] "Millonarios"

También se pueden especificar varios índices, en el caso de que se quieran varios elementos:

> equipos[c(1,2,4)]
[1] "Nacional", "Medellín", "América"

Noten que los índices tuvieron que especificarse en un pequeño vector de números utilizando la función c().
Además pueden especificarse índices negativos, que quieren decir “excepto esta posición”:

> equipos[-2]
[1] "Nacional", "Millonarios", "América"

Pero además de utilizar índices para acceder a cada posición, en los vectores podemos utilizar operadores boo-
leanos (igual, no igual, menor que, mayor que) para seleccionar algunos elementos particulares. Para esto se
especifica entre los corchetes la condición deseada:

> puntos[puntos > 15]


[1] 21 18

Esta manera “inteligente” de seleccionar fracciones de vectores puede sernos muy útil más adelante, pero por
ahora no entraremos en más detalles.

5.2.4. Data frames


Finalmente vamos a conocer un tipo de variable muy característico de R. Estos se denominan data frames y son
como tablas inteligentes en las que cada columna y fila tiene un nombre característico. De manera similar en
Microsoft Excel, cada columna tiene un nombre “A”, “B”, “C”, y cada fila tiene un número como nombre. Así como
un vector es una colección de números o palabras, un data frame es una colección de vectores, que terminan
configurando una tabla con información valiosa de varias índoles: de palabras y de números. Para crear data
frames se utiliza la función data.frame() en la que se especifican los vectores y los nombres de cada uno de
ellos. Creemos nuestro primer data frame que sea la tabla de posiciones del torneo local de fútbol, usando los
dos vectores que creamos en la sección anterior:

> tabla <- data.frame(Equipo = equipos, Puntaje = puntos)

9
Notemos que aquí es importante que los vectores que se utilicen en el data frame deben tener el mismo número
de elementos (4 en este caso). Además veamos cómo a cada uno de los vectores se les ha asignado un nombre
distintivo: “Equipo” para el vector de equipos y “Puntaje” para el vector de puntos. Veamos cómo queda la variable
tabla:
> tabla
Equipo Puntaje
1 Nacional 21
2 Medellín 18
3 Millonarios 15
4 América 12
Vemos que R le ha asignado automáticamente a cada uno un número de fila y ha relacionado los elementos de
los dos vectores según su posición en ellos. Ahora, para acceder a cada una de las columnas de un data frame,
es decir a cada uno de los vectores, se utiliza el operador $ seguido del nombre que tenga la columna así:
> tabla$Puntaje
[1] 21 18 15 12
> tabla$Equipo
[1] Nacional Medellín Millonarios América
Levels: América Medellín Millonarios Nacional
Notemos que para el vector numérico, R imprimió solo los valores, como si fuera un vector cualquiera. En cambio
para el vector de palabras que es tabla$Equipo, imprimió las palabras sin comillas (") y además imprimió algo
que es Levels. No entraremos en mucho detalle aún, de pronto más adelante lo explicaremos mejor, pero basta
decir que R por instinto piensa que las variables de palabras son categorías y las considera algo que se llaman
factores, y los niveles o levels son las distintas categorías de ese factor.

6. Instalando librerías adicionales


Como se dijo muy al comienzo de esta guía, R es un esfuerzo colaborativo de un montón de gente chévere. Toda
esa gente trabaja en campos distintos de la ciencia y de la industria. R lo utilizan psicólogos, políticos, antropólo-
gos, biólogos, médicos, físicos, ingenieros mecánicos, un porcentaje privilegiado de estudiantes de pregrado de la
Universidad de Antioquia, y muchas más profesiones. Cada uno de estos grupos tiene sus intereses particulares
con R y necesitan hacer algunos cálculos más que otros. Es por esto que cada uno de esos grupos puede crear
paquetes o librerías de R que tienen funciones específicas para su campo de acción. Entonces existen una gran
cantidad (miles) de librerías adicionales al paquete base de R que podemos instalar en nuestro computador, para
hacer nuestro R más musculoso.
Nosotros en este curso introductorio no utilizaremos muchas librerías, pero sí es importante que todos sepamos
cómo instalar alguna, en caso de que sea necesaria. Dos librerías que sí vamos a utilizar seguro son: ggplot2
que es para hacer dibujos y gráficas bonitas, y pastecs que es una librería creada por unos ecólogos y que tiene
una función útil para estadística descriptiva. Aprenderemos entonces a instalar librerías adicionales y además a
cargarlas o importarlas en nuestros scripts para poder utilizarlas.

6.1. Permisos para instalar librerías


Hay dos maneras de instalar cualquier cosa en Windows: para todos los usuarios o cuentas de un computador
(o sea en el C:\Archivos de Programa) o para una cuenta específica en la carpeta de Mis Documentos de esa
cuenta. Generalmente nosotros tenemos una sola cuenta en nuestros computadores personales así que nunca
nos preocupamos por esta distinción y siempre lo instalamos todo en el C:\Archivos de Programa. Pero como
algunos de nosotros utilizaremos los computadores de las salas informáticas de la Universidad, es importante
que entendamos esta diferencia. Aparecen dos problemas: lo más probable es que no podamos instalar las cosas
en C: porque no tenemos los permisos, y segundo, si instalamos algo en Mis Documentos, puede que se borre
al apagar el equipo. Así que aquellos de nosotros que utilicemos los computadores de las salas, puede que
tengamos que estar constantemente re-instalando librerías. A menos que los instructores de la materia soliciten
a la gente encargada que instalen las librerías de manera permanente. Pero bueno, no hay que estresarnos por
esto, instalar las librerías toma solo unos segundos con una medianamente buena conexión a Internet.

10
6.2. Instalar librerías usando la interfaz gráfica
Si está en su computador personal, inicie R haciendo clic derecho en el ícono de escritorio y seleccione “Ejecutar
como administrador”. Si no es su computador personal, entonces simplemente ejecute R como lo haría normal-
mente. A continuación vamos al menú “Paquetes” y seleccionamos “Instalar paquete(s)...”. Lo primero que va a
aparecernos es una ventana de selección del mirror o sitio de Internet de donde queremos descargar el paquete.
Como el Internet ya es tan rápido, no es muy importante escoger el de Colombia, y puede dejarse el 0-Cloud que
aperece predeterminado. Luego de que uno escoge el lugar, debe seleccionar el nombre del paquete a instalar.
En nuestro caso queremos instalar primero ggplot2, así que buscamos este nombre en la lista desplegada y pre-
sionamos “Ok”. Ahora pueden suceder varias cosas, porque ahora se trata de escoger dónde en el computador
va a instalarse la librería: si es su computador personal y ustedes iniciaron R con permisos de administrador, no
preguntará nada e instalará la librería en el C:. En cambio si ustedes no tienen permiso, y no existe una carpeta
en Mis Documentos que R reconozca como su librería, va a preguntarles que escojan una carpeta para instalar la
librería. O si ya existe dicha carpeta en Mis Documentos, entonces el programa no preguntará nada e instalará la
librería allí. Una vez instalen ggplot2, procedan a instalar pastecs.

6.3. Instalar librerías usando la consola


Se puede utilizar la consola para instalar paquetes así:

> install.packages("ggplot2")

Noten que las comillas son importantes. Una vez se ejecuta ese comando, el programa seguirá la misma ruta
utilizando la interfaz gráfica como se explicó en la sección anterior.

6.4. Utilizar las librerías


Para utilizar las funciones que trae una librería simplemente se utiliza el comando library() con el nombre de la
librería sin comillas así:

> library(ggplot2)

Luego de este comando, tendremos acceso a todas las funciones útiles que tiene la librería. Este comando por lo
general debe ir al inicio de cualquier script. Más adelante lo veremos al inicio de todos los nuestros.

7. Lectura de datos
La información la miden muchos tipos de instrumentos. Muchas personas además en el mundo se encargan de
procesar datos medidos. Existen muchas variables qué medir. Todo esto hace que en últimas, la información
nunca se encuentre de la manera que nosotros la necesitamos. Mucho menos la información se encuentra ya
lista para ser leída con R. Existen muchos formatos y tipos de archivos. Si todos en el mundo utilizáramos R, de
pronto entonces sería muy fácil leer los datos y procesarlos. Pero no es así, porque existen muchas herramientas
y la gente es toda diferente. Aún así, existe un tipo de archivo muy sencillo que muchas personas utilizan y que
es útil para nosotros en R: archivos de texto plano con Valores Separados por Comas o CSV en inglés. Se tratan
de pequeños archivos de texto con la extensión .csv que se pueden ver en un “Bloc de notas” o en un Microsoft
Word y que simplemente tienen una tabla con los datos y las columnas están separadas por comas. Los CSV
en Windows generalmente están asociados al programa Microsoft Excel, pero no podemos olvidarnos de que no
se trata de libros de Excel (que tienen la extensión .xls o .xlsx).
La ventaja de este formato CSV es que no solo es útil para R, sino también para MATLAB, Python, y cuanto
lenguaje de programación o herramienta estadística exista. Además es bastante útil para nosotros que podamos
utilizar Excel para ver los datos y de pronto corregir rápidamente errores antes de iniciar el procesamiento de los
datos con R. Si tenemos un archivo de Excel, que es un punto común para muchas personas en el mundo, fácil-
mente podemos crear un archivo CSV en la opción “Guardar como”. El siguiente es un ejemplo de los contenidos
de un CSV. El archivo se llama tabla_posiciones.csv:

11
Posición,Equipo,Puntos,Jugados,Victorias,Derrotas,Empates
1,La Equidad,9,3,3,0,0
2,Junior,7,3,2,0,1
3,Independiente Medellín,7,3,2,0,1
4,Once Caldas,7,3,2,0,1
5,Alianza Petrolera,6,3,2,1,0

Noten que no hay ningún espacio entre las columnas, solo comas. Así pues, a pesar de que R está diseñado
para leer muchos tipos de archivos, no exclusivamente CSV, nosotros en este curso trabajaremos con estos
archivos por las razones anotadas. A veces pasa que Excel no guarda adecuadamente el archivo CSV y utiliza
otro separador, como un punto y coma (;) en vez de la coma. Para evitar cualquier problema, lo mejor siempre
es revisar el archivo guardado como CSV con el “Bloc de Notas” de Windows. Simplemente se hace clic derecho
en el archivo CSV y se escoge “Abrir con” y se selecciona el “Bloc de Notas”. Si al ver el archivo, se nota que el
separador no son comas, entonces se puede ir al menú “Edición” y seleccionar “Reemplazar”, para reemplazar el
separador que sea por las comas. A continuación entonces aprenderemos lo básico de leer un archivo CSV en R.

7.1. Función setwd() para ayudar a R a encontrar archivos


Lo primero antes de leer un archivo, es poder ubicarlo. En R esto significa indicarle a la consola dónde en el
sistema de archivos debe efectuar sus operaciones. Este lugar se conoce en inglés como working directory o
carpeta de trabajo, pues directorio es simplemente una palabra cachet para carpeta. Para ver dónde está parado
R en el sistema se puede utilizar la función getwd(). Hagámoslo en la consola:

> getwd()
[1] "C:/Users/Mateo/Documents"

Esto quiere decir que nuestra consola de R está parada en la carpeta de mi cuenta de usuario “Mateo” y en
“Documents” (o “Mis Documentos”). A este tipo de “palabra” que comienza con una C: (el nombre del disco
duro) y separa los nombres de carpetas con slashes o diagonales al frente (/) se le llama ruta. Las rutas son
importantes porque nos permiten navegar entre los archivos del sistema. Es por esta razón que un sinónimo de
carpeta es directorio, porque en verdad los nombres de carpetas simplemente sirven para cambiar la ubicación de
los archivos, a manera de direcciones en la ciudad. ¿Qué significa la expresión “la consola está parada”? Significa
que R es capaz de ver todos los archivos que están al interior de esa carpeta. Que puede ubicarlos fácilmente solo
escribiendo su nombre. Para ver los contenidos de la carpeta en la que estamos, podemos utilizar otra función de
la consola que es dir(). Hagámoslo a continuación:

> dir()
[1] "archivos" "birbran"
[3] "catedra" "Clase_3.xlsx"
[5] "Custom Office Templates" "desktop.ini"
[7] "drive" "libros"
[9] "maestria" "My Music"
[11] "My Pictures" "My Videos"
[13] "R" "software"
[15] "Zoom"

Pueden ver muchas carpetas y algunos archivos como por ejemplo Clase_3.xlsx. Entonces R puede ver estas
ubicaciones en el sistema. Pero lo ideal no es trabajar en esta ubicación, sino en el lugar donde tenemos nuestros
archivos de interés, aquellos que vamos a procesar. Supongamos entonces que tenemos nuestros archivos en
una carpeta específica para nuestra asignatura, o que estamos usando una memoria USB en la que tenemos
todos nuestros archivos y queremos que R vaya hasta allá para que pueda leer nuestros archivos. Para esto
utilizamos la función setwd(), para decirle a la consola de R su lugar de trabajo, donde debería encontrar los
archivos necesarios y donde debería guardar cualquier archivo que generemos. La función es muy fácil de utilizar,
la dificultad está en saber escribir la ruta de manera adecuada. La verdad no es complicado, simplemente se
comienza con el nombre de un disco duro: por ejemplo C: si es el computador con Windows, o D: si es una
memoria USB a la que se le ha asignado la letra D (a veces es F: o G: según el número de memorias que se
inserten). Y luego se continúa con las carpetas separadas por slashes (/) hasta llegar a la ubicación deseada.

12
Supongamos entonces que queremos que la consola se “pare” en la carpeta R, que está dentro de la carpeta
clase, dentro de la carpeta estadística que he creado en mi memoria USB a la que Windows le ha asignado la
letra D:, luego:

> setwd("D:/estadistica/clase/R/")

Y ahora R puede ver el contenido de esa carpeta donde tenemos nuestros archivos de trabajo.

7.2. Leyendo archivos CSV


Ahora que podemos ubicar nuestra consola de R en algún lugar donde estén nuestros archivos, la función para
leerlos es bastante sencilla: read.csv(), la cual crea un data frame con la información contenida en el CSV. Los
dos argumentos necesarios son: el nombre del archivo entre comillas y la opción header = TRUE que le indica a R
que nuestro archivo contiene los encabezados o nombres de cada columna, que como vimos anteriormente son
importantes para los data frames.
La sección anterior nos había dejado “parados” en una carpeta de una memoria USB. Veamos que contiene esa
carpeta con el comando dir() de la consola:

> dir()
[1] "tabla_posiciones.csv"

¡Oh sorpresa! Es nuestro archivo CSV con la tabla de posiciones de la emocionante liga de fútbol local. Vamos
entonces a leerlo en la consola, creando una variable tipo data frame que llamaremos tablapos:

> tablapos <- read.csv("tabla_posiciones.csv", header = TRUE)

Ahora veamos si R pudo crear correctamente el data frame:

> tablapos
Posición Equipo Puntos Jugados Victorias Derrotas Empates
1 1 La Equidad 9 3 3 0 0
2 2 Junior 7 3 2 0 1
3 3 Independiente Medellín 7 3 2 0 1
4 4 Once Caldas 7 3 2 0 1
5 5 Alianza Petrolera 6 3 2 1 0

Parece que sí. Veamos solo los nombres de los equipos:

> tablapos$Equipo
[1] La Equidad Junior Independiente Medellín
[4] Once Caldas Alianza Petrolera
5 Levels: Alianza Petrolera Independiente Medellín Junior ... Once Caldas

Vemos que sí imprime los nombres. De nuevo, no se preocupen por lo de Levels, que simplemente es porque la
variable es de caracteres entonces R cree que son diferentes categorías o niveles (level en español).

8. Análisis estadístico de datos usando R


Ahora estamos listos para poner en práctica todo lo que hemos aprendido hasta el momento analizando una base
de datos real. Es cierto que aún nos faltan cosas por aprender, pero las iremos aprendiendo en el camino. Si usted
ha leído concienzudamente todo hasta este punto del documento, no debería tener mayores dificultades. Si usted
en cambio, es de los perezosos que lee en diagonal las cosas, puede que algo lo tome por sorpresa. En cualquier
caso siempre pueden revisar las páginas anteriores, y además por eso hemos incluído una tabla de contenidos
al inicio del documento. En esta sección crearemos nuestro primer script, leeremos un conjunto de datos grande,
calcularemos algunos valores representativos y finalmente haremos gráficas de alta calidad.

13
8.1. Los datos: pruebas de choques de carros
La seguridad vial es fundamental para la industria automotriz. Por eso hay gente que se dedica a estrellar carros de
prueba contra paredes para estimar la posibilidad de lesiones en situaciones reales. Ninguno de nosotros quiere
sufrir accidentes graves de carretera, pero en el peor de los casos, al menos es bueno saber que el carro que
estamos manejando tiene alguna medida de seguridad para protegernos de fuertes impactos y serias lesiones.
No basta con que el carro tenga cinturones de seguridad y airbags, sino también la carrocería debe proveer algún
tipo de protección.
En este tipo de pruebas se utilizan muñecos (en inglés
dummies) llenos de sensores de fuerza que miden el
impacto recibido. El muñeco puede ubicarse en cual-
quier asiento del carro para la prueba. Con el muñeco
en posición, el carro es arrancado a distancia con con-
trol remoto y se estrella contra una pared u objeto a
una velocidad de 35 mph (alrededor de 55 km/h). En
la Figura 5 puede verse un ejemplo de una prueba de
estas (que en inglés se llama crash test) en la que se
tienen muñecos en el asiento del conductor y el del
pasajero.
Nos han entregado entonces un documento de Excel
(extensión .xlsx) que tiene información sobre diferen-
tes pruebas de choque para muchos modelos de ca-
Figura 5: Prueba de choque con muñecos en asientos
rro diferentes para muñecos que estaban sentados en
frontales. Tomada sin permiso de: Global NCAP.
el asiento del conductor. Nos dicen que estos datos
han sido tomados por la National Highway Traffic Sa-
fety Administration, la agencia que vela por la seguridad vial en todos los Estados Unidos, y que se pueden
descargar libremente de la Data and Story Library de la Universidad Carnegie Mellon del mismo país. Al ver
esta información en Excel, notamos que se tienen 9 columnas diferentes para diferentes medidas. Aunque aquí
no somos expertos en este tema, algo de investigación en Internet nos revela qué significa cada una de estas
columnas:

1. Marca: compañía que hace el vehículo.


2. Modelo: diseño de automóvil comercial de la marca.

3. Criterio de lesión de cabeza: medida de la probabilidad de lesiones de cabeza. En Estados Unidos el


valor máximo permitido es 700, que significa un 5 % de probabilidad de una lesión severa. Un valor de 1000
significa una probabilidad de 18 % de una lesión severa, 55 % de una lesión seria, y un 90 % de una lesión
moderada.
4. Gravedades en el pecho (desaceleración súbita): esto es el número de fuerza-g que recibiría alguien en
el pecho. Si es mayor, es peor para la persona. En un accidente de IndyCar una persona alcanzó a recibir
214 g y sobrevivió.
5. Carga en el fémur izquierdo (lbf): fuerza del impacto en el fémur medida en libras de fuerza. Fracturas
suceden alrededor de 1400.
6. Carga en el fémur derecho (lbf): similar al izquierdo.

7. Número de puertas: coupe significa dos puertas y sedan significa cuatro puertas. Algunos vehículos como
minivans tienen puertas raras y no entran en estas categorías.
8. Peso del carro (lb): peso en libras del carro.
9. Tamaño: clasificación del tamaño según su diseño, para diferenciar entre autos deportivos, familiares, ca-
mionetas, etc. Las categorías son: mini, ligero, compacto, mediano, pesado, van, multipropósito (familiares)
y camioneta.

14
Aunque ha sido muy formal la persona que nos ha entregado este documento de Excel, y además nos ha entrega-
do la descripción de cada una de las columnas, esta persona no sabe que nosotros utilizamos R y que nos gusta
más el formato de archivos CSV. Así que lo primero que haremos será crear el archivo CSV, utilizando la función
de “Guardar como” de Excel, donde seleccionaremos la opción “CSV (Comma delimited)(*.csv)”. Al guardarlo, el
archivo en un bloc de notas queda viéndose así:

marca,modelo,lesion_cabeza,g_pecho,carga_femur_i,carga_femur_d,puertas,peso_lb,tamano
Acura,Integra,599,35,791,262,coupe,2350,ligero
Acura,Integra RS,585,NA,1545,1301,sedan,2490,ligero
Acura,Legend LS,435,50,926,708,sedan,3280,mediano
Audi,80,600,49,168,1871,sedan,2790,compacto
Audi,100,185,35,998,894,sedan,3100,mediano
BMW,325i,1036,56,865,NA,coupe,2862,compacto
Buick,Century,815,47,1340,315,sedan,2992,compacto
Buick,Elect. Park Ave,1467,54,712,1366,sedan,3360,mediano
Buick,Le Sabre,NA,35,1049,908,coupe,3240,mediano
[...]

Si al verlo con el bloc de notas, el archivo no se ve así, entonces es posible que Excel haya cometido errores al
guardarlo y debemos corregirlo manualmente. En estos casos la función “Buscar y reemplazar” es útil.

8.2. Comencemos nuestro script y leamos los datos


Vamos a escribir por fin nuestro primer script. Hasta ahora veníamos probando las cosas en la consola de R
por facilidad. Pero a la hora de analizar un conjunto de datos siempre será mejor tener un script como respaldo
del trabajo que se hizo y además en caso de necesitar modificar luego nuestro trabajo. Entonces en la interfaz
gráfica de R vamos a seleccionar “Archivo” y “Nuevo script”. En esta ventana de editor escribiremos una a una las
instrucciones necesarias para estudiar esta información que nos han dado.
Al inicio de todo script vamos siempre a cargar cualquier librería que sea necesaria. Es importante que estas
librerías hayan sido previamente instaladas por el usuario. Si no está seguro de cómo hacerlo vaya a las secciones
anteriores donde explicamos diferentes métodos. Además vamos a poner comentarios en nuestros scripts, en
caso de que se nos olvide por qué pusimos algo o en caso de que otra persona vaya a revisar nuestro trabajo.
Para escribir comentarios en R utilizamos el símbolo numeral (#) al inicio del renglón o después de haber ejecutado
algún comando. Comencemos entonces llamando las librerías que nos interesan en esta primera parte descriptiva:

# Llamamos librerias que necesitamos


library(ggplot2) # para dibujar
library(pastecs) # para resumen con valores representativos

Noten que aquí no hemos puesto ni el símbolo > ni los colores. Esto es porque vamos a estar escribiendo en
el editor de scripts. Noten además los comentarios explicativos al finalizar cada comando. Aunque no es bueno
hacer esto siempre, porque llenamos todo de comentarios, sí es bueno hacerlo ahora al comienzo de las clases
para que nos quede bien claro el por qué de todo. Adicionalmente noten que no utilizamos tildes. Aunque esto
no es obligatorio, generalmente las tildes son problemáticas a la hora de programar porque casi todo ha sido
hecho por gente que habla inglés. Así que aunque no hay problema, vamos a dejar las tildes por fuera al menos
solo en nuestros códigos de R. Ahora necesitamos ubicar nuestro script en el mismo lugar del sistema donde
está guardado el archivo CSV con la información. Vamos a suponer que lo tenemos en alguna carpeta que hemos
creado para este ejercicio en “Mis Documentos”. Si tienen dudas sobre este paso, revisen las secciones anteriores
sobre las rutas en el sistema de Windows:

# Definimos nuestra carpeta de trabajo donde estan nuestros archivos


setwd("C:/Users/SALASDRAI/Mis Documentos/Mateo/Choques/")

Ahora simplemente leemos los datos utilizando la función que vimos para archivos CSV. Recuerden que nuestros
datos tienen encabezado con los nombres de las columnas así que debemos especificar la opción header =
TRUE:

15
# Leemos los datos
datos_choques <- read.csv("choques_conductores.csv", header = TRUE)

Recordemos que estamos en el editor de scripts de R. Ahora es un buen momento para llevar nuestro código
a la consola, para que ejecutemos lo que llevamos hasta el momento y asegurarnos de que las librerías cargan
bien y no hubo problemas en la lectura del archivo. Así que seleccionemos todas las líneas con el mouse (o con
el atajo Ctrl + A) y luego corramos todas las líneas con el atajo Ctrl + R. ¿Tuvieron problemas? De pronto no
instalaron alguna de las librerías, o no especificaron bien la ruta y R no pudo encontrar su archivo. Revisen su
código y si es necesario pidan ayuda. En caso de que todo haya ido bien, miremos nuestro data frame con los
datos en la consola. Para esto utilicemos la función head() que nos muestra solo las primeras líneas de un data
frame solo para convencernos de que se han leído bien los datos:

> head(datos_choques)
marca modelo lesion_cabeza g_pecho carga_femur_i carga_femur_d puertas peso_lb tamano
1 Acura Integra 599 35 791 262 coupe 2350 ligero
2 Acura Integra RS 585 NA 1545 1301 sedan 2490 ligero
3 Acura Legend LS 435 50 926 708 sedan 3280 mediano
4 Audi 80 600 49 168 1871 sedan 2790 compacto
5 Audi 100 185 35 998 894 sedan 3100 mediano
6 BMW 325i 1036 56 865 NA coupe 2862 compacto

Ahora con datos reales en nuestras manos, podemos hacer algo de estadística descriptiva.

8.3. Valores representativos


Es mucho mejor una respuesta aproximada para la pregunta correcta, que
una respuesta exacta para la pregunta equivocada.

John Tukey, Matemático

Lo primero que veremos es la obtención de estadísticos representativos, es decir números como la media, media-
na y la desviación estándar. Para esto es necesario que aprendamos a seleccionar aquella parte de los datos para
los que tienen sentido estas operaciones, que son los datos numéricos más no categóricos. A partir de ahora, una
habilidad importante será la de poder seleccionar información en los data frames. Creemos entonces un data
frame adicional que contenga solamente los datos de tipo numérico de nuestra base de datos:

# Crear un df solo con los datos numericos


datos_numericos <- datos_choques[c(-1,-2,-7,-9)]

Detengámonos un segundo y asegurémonos de que entendemos esta línea de código. Estamos creando una nue-
va variable de tipo data frame que se llama datos_numericos. La creamos con base en la variable datos_choques,
pero le estamos diciendo específicamente cuáles columnas nos interesan utilizando los índices entre los corche-
tes. Recuerden que el signo negativo (-) lo que quiere decir es “excepto la posición tal”, por lo que le estamos
diciendo a R que ignore las columnas 1, 2, 7 y 9, que si ustedes revisan la tabla, son las que tienen variables no
numéricas. Con esta nueva variable que tiene solo las columnas numéricas, ahora tiene sentido obtener todas las
cantidades representativas. Para esto vamos a hacer uso de la función stat.desc() de la librería que instalamos
previamente pastecs. Esta función nos hace un resumen de los valores representativos más comunes. Ejecute-
mos la última operación en el editor de scripts para crear en la consola la variable datos_numericos y en la misma
consola probemos la función:

> stat.desc(datos_numericos)
lesion_cabeza g_pecho carga_femur_i carga_femur_d peso_lb
nbr.val 1.750000e+02 173.0000000 1.710000e+02 1.700000e+02 1.760000e+02
nbr.null 0.000000e+00 0.0000000 0.000000e+00 0.000000e+00 0.000000e+00
nbr.na 1.000000e+00 3.0000000 5.000000e+00 6.000000e+00 0.000000e+00
min 1.850000e+02 35.0000000 1.200000e+02 1.030000e+02 1.590000e+03
max 3.665000e+03 97.0000000 2.930000e+03 2.856000e+03 5.619000e+03
range 3.480000e+03 62.0000000 2.810000e+03 2.753000e+03 4.029000e+03

16
sum 1.708310e+05 8936.0000000 1.734650e+05 1.362500e+05 5.157400e+05
median 9.030000e+02 51.0000000 9.960000e+02 6.740000e+02 2.855000e+03
mean 9.761771e+02 51.6531792 1.014415e+03 8.014706e+02 2.930341e+03
SE.mean 3.369263e+01 0.7300050 4.025612e+01 3.409219e+01 4.733956e+01
CI.mean.0.95 6.649886e+01 1.4409220 7.946625e+01 6.730140e+01 9.342994e+01
var 1.986589e+05 92.1929695 2.771149e+05 1.975871e+05 3.944219e+05
std.dev 4.457116e+02 9.6017170 5.264170e+02 4.445077e+02 6.280302e+02
coef.var 4.565889e-01 0.1858882 5.189365e-01 5.546151e-01 2.143198e-01

Como podemos ver, la función imprime los números en un formato algo maluco de leer. Para ver los números de
una manera más clara, vamos a redondearlos hasta 3 decimales utilizando la función round():

> round(stat.desc(datos_numericos), digits = 3)


lesion_cabeza g_pecho carga_femur_i carga_femur_d peso_lb
nbr.val 175.000 173.000 171.000 170.000 176.000
nbr.null 0.000 0.000 0.000 0.000 0.000
nbr.na 1.000 3.000 5.000 6.000 0.000
min 185.000 35.000 120.000 103.000 1590.000
max 3665.000 97.000 2930.000 2856.000 5619.000
range 3480.000 62.000 2810.000 2753.000 4029.000
sum 170831.000 8936.000 173465.000 136250.000 515740.000
median 903.000 51.000 996.000 674.000 2855.000
mean 976.177 51.653 1014.415 801.471 2930.341
SE.mean 33.693 0.730 40.256 34.092 47.340
CI.mean.0.95 66.499 1.441 79.466 67.301 93.430
var 198658.871 92.193 277114.903 197587.115 394421.940
std.dev 445.712 9.602 526.417 444.508 628.030
coef.var 0.457 0.186 0.519 0.555 0.214

Ahora sí los números son más claros. Ahora miremos qué es lo que nos entrega esta función de resumen:

nbr.val: número de valores válidos (ni NULL ni NA).


nbr.null: número de campos vacíos.
nbr.na: número de datos no vacíos pero faltantes.
min: valor mínimo.
max: valor máximo.
range: rango (max - min).
sum: la sumatoria total de la columna.
median: la mediana.
mean: la media aritmética.
SE.mean: el error estándar de la media (luego lo entenderemos).
CI.mean.0.95: intervalos de confianza de la media con un 95 % de confianza (luego lo entenderemos).

Guardemos entonces estos estadísticos en una variable para que luego podamos usarla para verlos:

# Calcular estadisticos y guardarlos


estadisticos <- round(stat.desc(datos_numericos), digits = 3)

Algunas de estas medidas ya son conocidas para nosotros, mientras que otras no tanto. La idea es que al final
de este curso entendamos todas ellas e incluso más. En este caso aprovecharemos para discutir la diferencia
entre los datos NULL y los datos NA. Los datos NULL son campos vacíos en nuestros archivos. Están relacionados
con “huecos” en los datos. Quizás ese día el instrumento estuvo en mantenimiento y no registró mediciones, o el

17
dato se perdió en algún momento. Ahora, lo normal es que no haya datos vacíos en nuestros datos, porque a los
computadores no les gustan los vacíos, es decir, una matriz de datos debe tener algún valor en todas sus celdas,
así el valor sea indeterminado. Es aquí donde aparecen los valores NA, que son datos que sabemos que son
faltantes pero que ponemos en la tabla de datos para que los computadores no tengan problemas procesando los
datos que sí se tienen. Es decir, lo ideal es que siempre la tabla tenga algún valor, así el valor sea indeterminado
o NA, por eso la gente creadora de R se ingeniaron el valor NULL que sirve para rellenar los huecos en las matrices
de manera automática. En términos prácticos, NULL y NA son muy similares, pero es importante que nosotros
entendamos la distinción de que los primeros son “huecos” que nadie se encargó de al menos rellenar con NA
para alertarnos de que faltan, mientras que NA quiere decir que la persona encargada de reportar los datos al
menos sí se tomó el trabajo de informarnos que ese dato por alguna razón no se tomó. Utilicemos la función
mean() para promediar para que veamos la importancia de los valores faltantes. Si promediamos por ejemplo la
columna de datos_choques$lesion_cabeza en la consola:

> mean(datos_choques$lesion_cabeza)
[1] NA

Vemos que R no se atreve a promediar datos que incluyen datos faltantes automáticamente. Esto porque se
quiere obligar al analista de los datos que sea consciente de que su información tiene defectos. Si queremos
promediar a pesar de la incertidumbre en ese dato particular (como lo hace automáticamente por nosotros la
función stat.desc()) hay que utilizar la opción na.rm = TRUE que le indica a R que ignore esos valores faltantes:

> mean(datos_choques$lesion_cabeza, na.rm = TRUE)


[1] 976.1771

Comprueben que este fue el mismo valor que nos entregó la función stat.desc() para esta columna.

8.3.1. Valores representativos para filas o categorías específicas


No queremos avanzar a la siguiente sección sin antes mostrar un par de ejemplos adicionales en los que probe-
mos nuestras habilidades de selección de datos en el data frame. A veces se necesitan valores representativos
para una fracción de los datos o para una sola categoría de los datos. Así por ejemplo supongamos que nos han
dicho que solo se quieren los promedios para la marca de carros “Chevrolet”, porque es la marca patrocinadora
de nuestra empresa. Entonces seleccionamos los datos:

# Valores representativos solo para Chevrolet


datos_chevy <- datos_choques[datos_choques$marca == "Chevrolet", c(-1,-2,-7,-9)]
estadisticos_chevy <- round(stat.desc(datos_chevy), digits = 3)

Hay varias cosas para explicar aquí. La primera es la manera de seleccionar filas y columnas. Esto es contrario
a lo que se mostró en clase (pido disculpas): a la hora de seleccionar los índices entre corchetes la estructura es
variable[filas, columnas]. Y para seleccionar filas y columnas hay distintas opciones. En la sección anterior vimos
cómo seleccionar algunas columnas numéricas, que también lo volvimos a hacer en esta ocasión, señalando
cuáles columnas no queríamos. Pero en este caso también hemos escogido las filas usando un condicional que
nos ayuda a filtrar solo las filas que cumplan la condición, en este caso que en la columna marca sean equivalentes
a Chevrolet. Si comparamos con la marca Toyota:

# Valores representativos solo para Toyota


datos_toyota <- datos_choques[datos_choques$marca == "Toyota", c(-1,-2,-7,-9)]
estadisticos_toyota <- round(stat.desc(datos_toyota), digits = 3)

Podemos comparar los distintos estadísticos y concluir que en términos generales, la marca Toyota produce
carros más seguros (esta conclusión es a vuelo de pájaro, así que no se debe tomar seriamente). Otra forma de
seleccionar las filas es usando rangos de la manera inicio:final:

> datos_80filas <- datos_choques[1:80, c(-1,-2,-7,-9)]

En fin, en R hay mil formas de hacer las cosas. Lo importante es que practiquemos y ganemos confianza a la hora
de seleccionar un subconjunto de datos que nos interese.

18
Figura 6: Todo gráfico con ggplot2 son capas una encima de otra. Adaptada sin permiso del libro de Andy Field.

8.3.2. Guardando en archivos de texto los valores


Finalmente vamos a guardar nuestros estadísticos descriptivos en archivos de texto que podamos consultar luego.
Para esto utilizamos la función write.table() en la que tenemos que especificar la variable de data frame, un nom-
bre de archivo que se creará en la ruta de trabajo donde estemos parados, el separador que pueden ser comas(,)
o tabulaciones (simbolizadas con "\t"), y también debemos decirle que si queremos que ponga los nombres de las
filas (que a veces son simplemente los números de los reglones entonces no se necesitan):

# Guardar los estadisticos en un archivo de texto


write.table(estadisticos, "valores_representativos.txt", sep = ",", row.names = TRUE)
write.table(estadisticos_chevy, "valores_representativos_chevy.txt", sep = ",", row.names = TRUE)
write.table(estadisticos_toyota, "valores_representativos_toyota.txt", sep = ",", row.names = TRUE)

No siempre se necesitan guardar los datos en archivos de texto, solo ver los números en la consola basta, pero
es importante saber al menos cómo se hace.

8.4. Gráficos con ggplot2

Mi parte favorita del análisis de datos: tomar información en tablas


aburridas y darle vida por medio de la visualización gráfica.

John Tukey, Matemático

Ahora viene la parte divertida según John Tukey, una leyenda del análisis de datos y además inventor del mé-
todo numérico más rápido que existe. Y es cierto, en términos generales, dibujar es muy entretenido. Venden
exitosamente libros de mandalas por ejemplo. Ahora, seamos honestos, esto es programar y no tanto colorear
mandalas, pero aún así vamos a creer que estamos haciendo dibujos bonitos. Para esta parte hay muchas opcio-
nes. No existe una sola única forma de hacer gráficas en R y diferentes instructores podemos enseñar distintas
maneras. Ustedes en Internet pueden ver de pronto ejemplos de otras personas que utilizan métodos alternativos
al que presentaremos aquí. Eso está bien, en la variedad todo es mejor. Simplemente por limitaciones de espacio
y de tiempo, no vamos a enseñar todas las formas o hacer un discurso de por qué una es mejor o peor que otra.
Aquí utilizaremos la librería ggplot2 para hacer gráficas. Esta la instalamos en las secciones anteriores. ¿Por qué
ggplot2? Porque sí.
Lo primero que debemos entender en ggplot2 es que los dibujos se construyen a partir de capas, unas encima
de otras, al mismo estilo de la cebolla más cabezona. La Figura 6 muestra a qué nos referimos cuando hablamos
de las capas. Así que comenzamos con un lienzo en blanco y vamos a ir agregándole cosas encima para construir
finalmente un dibujo bonito.

19
8.4.1. El lienzo o fondo del dibujo
Nos referimos a lienzo como esa primera capa que hay que crear para hacer un dibujo. Es como el fondo blanco.
Para este paso se utiliza la función ggplot(), en la que debe especificarse el data frame que contiene los datos
que queremos dibujar. Aquí además se especifican las variables que van a ir en el dibujo. Estas se “empaquetan”
en algo que se llaman aes(), de la palabra en inglés aesthetics. Los aesthetics son las propiedades estéticas
que tiene cada capa que adicionemos. Pueden especificarse para todas las capas, o para alguna en específico.
Algunas propiedades son formas (shape), colores (colour ), tamaños (size) y posiciones (location). Entonces la
primera propiedad estética o aes() es la que se define desde la primera capa del dibujo, que corresponde a las
variables a dibujar. Si hay más de una variable, como cuando son x e y, se especifica así: aes(x = variable1,
y = variable2). En este primer ejemplo vamos a crear un histograma para la variable de lesion_cabeza, así que
el script comienza así:

# Histograma para la variable lesion_cabeza


histo_lesion <- ggplot(datos_choques, aes(lesion_cabeza))

¡Este es solo el comienzo del dibujo, todavía no está terminado! Si usted se acelera y ejecuta la línea de
código que acabamos de escribir, verá que no sucede nada. Apenas estamos comenzando a dibujar y solo
llevamos el fondo en blanco, que no vemos. Pero al menos ya le dijimos a R que vamos a dibujar una variable del
data frame datos_choques y que la variable es lesion_cabeza.

8.4.2. Figuras geométricas o geoms


Ahora vamos a continuar agregándole capas a nuestro lienzo. La primera capa se agrega utilizando una forma
geométrica que viene en forma de funciones que se llaman geoms y que representan objetos geométricos. Algunas
de las funciones más utilizadas son:

geom_bar(): diagrama de barras.


geom_point(): diagrama de puntos o dispersión.
geom_line(): diagrama de líneas.
geom_histogram(): histograma.
geom_boxplot(): diagrama de cajas.
geom_errorbar(): capa con las barras de errores.

8.4.3. Histogramas
En este caso queremos dibujar un histograma, así que le añadiremos a nuestro comando inicial un geom_histogram()
con algunas opciones de colores. Las opciones más importantes a la hora de crear un histograma son la del nú-
mero de intervalos de clase, y el ancho del intervalo. Estas opciones pueden especificarse dentro del comando
geom_histogram() con las palabras bins para el número y binwidth para el ancho de cada uno. Por defec-
to, ggplot2 dibuja los histogramas con 30 clases y por ahora eso está bien para nosotros. Para agregar capas
utilizamos el símbolo de adición (+). Así:

# Histograma para la variable lesion_cabeza


histo_lesion <- ggplot(datos_choques, aes(lesion_cabeza)) +
geom_histogram(colour = "Black", fill = "DodgerBlue")

Noten que estas líneas de código van a empezar a volverse largas. Una estrategia para que no se hagan muy
largas es partir las líneas después del símbolo de adición. Ahora, R no tiene ningún problema en que se partan
las líneas en algún lugar, pero entonces debemos recordar que para que la instrucción funcione hay que señalar
o seleccionar ambas líneas de código antes de usar el atajo Ctrl + R o F5. Los nombres de los colores pueden
buscarlos en Internet, son muchas las opciones, pero siempre deben ir en comillas. Puede que encuentren su
color favorito en la vida, si es que ya no tienen uno. La opción colour sirve para las líneas de los contornos,
mientras que fill se refiere al relleno de los rectángulos. Ahora sí puede ver el gráfico que estamos creando.
Ejecute esa última línea y luego vaya a la consola y escriba el nombre del dibujo:

20
Frecuencia absoluta
20 20

count
10 10

0 0
0 1000 2000 3000 0 1000 2000 3000
lesion_cabeza Criterio de lesión de cabeza

(a) (b)
Frecuencia absoluta

25
20

Frecuencia absoluta
20

15
10
10

5
0
0
0 1000 2000 3000
0 500 1000 1500 2000 2500 3000 3500
Criterio de lesión de cabeza Criterio de lesión de cabeza

(c) (d)

Figura 7: Primeros histogramas con ggplot2.

> histo_lesion

Entonces verá el histograma que se muestra en la Figura 7a. Aunque esta figura ya nos está mostrando infor-
mación valiosa, como que hay unos pequeños casos aislados de valores por encima de 2000, todavía le faltan
pequeños detalles. Por ejemplo, vamos a nombrar bien los ejes. Para esto hay que agregarle otra capa al dibujo.
Una que se utiliza la función labs(), que viene de la palabra labels en inglés que quiere decir etiquetas. Una vez
más, agreguémole esto al comando del dibujo:

# Histograma para la variable lesion_cabeza


histo_lesion <- ggplot(datos_choques, aes(lesion_cabeza)) +
geom_histogram(colour = "Black", fill = "DodgerBlue") +
labs(x = "Criterio de lesión de cabeza", y = "Frecuencia absoluta")

Ahora volvemos a ejecutar el comanto histo_lesion en la consola para ver el nuevo dibujo y vemos el que
aparece en la Figura 7b.
Pero seguro hay alguno de ustedes que aún no está contento. Quizás ese fondo no les gusta. Para este problema
han creado unos temas que podemos utilizar para cambiar la apariencia general del dibujo:

theme_gray(): este es el predeterminado con fondo grise y líneas de cuadrícula blancas.


theme_bw(): fondo blanco, cuadrícula negra.
theme_linedraw(): solo cuadrícula, sin color de fondo.
theme_light(): como linedraw pero la cuadrícula no se ve tanto.
theme_minimal(): sin líneas en los ejes y cuadrícula gris.

21
theme_classic(): sin cuadrícula, solo líneas en los ejes.
Y hay más e incluso se pueden definir nuevos. Por ahora vamos a volver a lo clásico:
# Histograma para la variable lesion_cabeza
histo_lesion <- ggplot(datos_choques, aes(lesion_cabeza)) +
geom_histogram(colour = "Black", fill = "DodgerBlue") +
labs(x = "Criterio de lesión de cabeza", y = "Frecuencia absoluta") +
theme_classic()
El resultado ahora se ve en la Figura 7c. Finalmente, se demuestra aquí la manera en que pueden escogerse los
lugares donde van los tick marks que son esas rayitas pequeñas que aparecen en los ejes:
scale_x_continuous(): cuando se tiene una variable continua en el eje x, podemos escoger cada cuanto
van las rayitas y sus valores. Para esto se utiliza la opción breaks que recibe un vector con los lugares
donde queremos las rayitas. Lo usual es tener rayitas cada cierto número fijo de valores, para eso usamos
la función seq(inicio, fin, incremento) que nos permite crear vectores espaciados uniformemente desde el
inicio hasta el fin con un mismo incremento.
scale_y_continuous(): igual que el anterior pero para el eje-y.
A continuación vamos a definir que en el eje-y las rayitas vayan cada 5 desde 0 hasta 40 y que en el eje-x vayan
de 0 a 4000 cada 500:
# Histograma para la variable lesion_cabeza
histo_lesion <- ggplot(datos_choques, aes(lesion_cabeza)) +
geom_histogram(colour = "Black", fill = "DodgerBlue") +
labs(x = "Criterio de lesión de cabeza", y = "Frecuencia absoluta") +
theme_classic() +
scale_y_continuous(breaks = seq(0,40,5)) +
scale_x_continuous(breaks = seq(0,4000,500))
El resultado de esto último se ve en la Figura 7d. La conclusión al ver estos histogramas es que parece que hay
unos pocos datos muy grandes que nos están perjudicando la forma de campana que tienen las distribuciones
normales. Aunque ese tema todavía no lo manejamos.

8.4.4. Diagramas de cajas


Ahora dibujemos un boxplot. Este es diferente de un histograma porque ahora no se trata simplemente de contar
las ocurrencias de una misma variable, sino que tenemos que relacionar dos: una x y una y. Para este caso,
sigamos trabajando con la variable lesion_cabeza, y veamos cuál es su relación con los tipos de carros según el
número de puertas que tienen. Ahora entonces en el aes() del lienzo, debemos especificar x e y, y para la figura
geométrica simplemente usamos geom_boxplot(). Esta función se encarga de calcular la mediana, los cuartiles
y los extremos de los bigotes.
# Boxplot para la variable lesion_cabeza versus el numero de puertas
boxp_lesion <- ggplot(datos_choques, aes(x = puertas, y = lesion_cabeza)) +
geom_boxplot(colour = "Purple") +
labs(x = "Número de puertas", y = "Criterio de lesión de cabeza") +
scale_x_discrete(labels = c("Coupe, "Otro", "Sedan"))
Este resulta en la Figura 8a. Nótese que se ha utilizado una función nueva scale_x_discrete similar a la que
usamos en los histogramas, pero en este caso no es una variable continua sino discreta porque solo se trata de
las categorías del número de puertas. Esta figura, no se ve mal, pero podemos mejorarla un poquito agregándole
colores de relleno según la misma variable que tenemos en el eje-x. Para hacer esto debemos definir la variable
de puertas como una categoría de la cual depende el color de relleno o fill de nuestras cajas. La manera de
hacer esto es incluyendo la opción fill = puertas dentro del comando aes() del inicio del lienzo. La cosa
es que cuando se hace esto, ggplot2 automáticamente intentará poner un pequeño cuadro explicativo de los
colores, pero como no necesitamos que nos los expliquen porque son los mismos del eje-x, vamos a decirle que
no ponga la leyenda en ningún lado, para eso utilizamos la instrucción theme(legend.position = none). Así
queda entonces el comando que resulta en la Figura 8b:

22
● ●

Criterio lesión de cabeza

Criterio lesión de cabeza


3000 3000
● ●

2000 ●
● 2000 ●


● ● ●
● ●

1000 1000

Coupe Otro Sedan Coupe Otro Sedan


Número de puertas Número de puertas
(a) (b)

Figura 8: Primeros boxplots con ggplot2: (a) sin utilizar la opción fill = puertas dentro del aes(), (b) utilizán-
dolo.

# Boxplot para la variable lesion_cabeza versus el numero de puertas


boxp_lesion <- ggplot(datos_choques, aes(x = puertas, y = lesion_cabeza,
fill = puertas)) +
geom_boxplot() +
labs(x = "Número de puertas", y = "Criterio de lesión de cabeza") +
scale_x_discrete(labels = c("Coupe, "Otro", "Sedan")) +
theme(legend.position = "none")
Pero en nuestros datos también tenemos otra variable categórica, así que hagamos otro boxplot para esta misma
variable, en este caso veamos qué sucede con el tipo de carrocería:

# Boxplot para comparar las distintas carrocerias


boxp_lesion_carroc <- ggplot(datos, aes(tamano, lesion_cabeza)) +
geom_boxplot(color="ForestGreen") +
labs(x = "Clasificación carrocería", y = "Criterio lesión de cabeza") +
scale_x_discrete(limits = c("mini", "ligero", "compacto", "mediano",
"multiprop", "pesado" ,"camioneta", "van"), labels = c("Mini", "Ligero",
"Compacto", "Mediano", "Multipropósito", "Pesado", "Camioneta", "Van"))
Noten que hemos especificado el orden en que queremos que aparezcan las categorías utilizando la opción
limits, y hemos redefinido sus etiquetas para que sean más presentables. El resultado se ve en la Figura 9a.
Según estos boxplot vemos claramente que el culpable de que nuestros datos tengan un histograma con una
distribución tan “charra” son los datos provenientes de la categoría de carrocería “van”. En un estudio de inves-
tigación podríamos analizar la posibilidad de eliminar esta categoría de nuestro estudio. Además vemos que la
carrocería que más le conviene a nuestras cabezas es la que se denomina “pesada”. Y también cuando los ca-
rros son coupe. Ahora hagamos lo mismo que en el boxplot que fuen especificar una variable para los colores
del relleno utilizando la opción fill = tamano dentro de la función aes() en el llamado del lienzo. E igualmente
escondemos la leyenda que ggplot2 intenta poner:

# Boxplot para comparar las distintas carrocerias


boxp_lesion_carroc <- ggplot(datos, aes(tamano, lesion_cabeza,
fill = tamano)) +
geom_boxplot() +
labs(x = "Clasificación carrocería", y = "Criterio lesión de cabeza") +
scale_x_discrete(limits = c("mini", "ligero", "compacto", "mediano",
"multiprop", "pesado" ,"camioneta", "van"), labels = c("Mini", "Ligero",
"Compacto", "Mediano", "Multipropósito", "Pesado", "Camioneta", "Van")) +
theme(legend.position = "none")

23

Criterio lesión de cabeza 3000


2000 ● ●
● ● ●
● ●

1000

Mini Ligero Compacto Mediano Multipropósito Pesado Camioneta Van


Clasificación carrocería
(a)

Criterio lesión de cabeza

3000

2000 ● ●
● ● ●
● ●

1000

Mini Ligero Compacto Mediano Multipropósito Pesado Camioneta Van


Clasificación carrocería
(b)

Figura 9: Más boxplots con ggplot2. (a) sin utilizar la opción fill = tamano dentro del aes(), (b) utilizándolo.

El resultado se ve en la Figura 9b.

8.4.5. Diagramas de barras


A veces es útil ver promedios para las variables según ciertas categorías. Miremos por ejemplo el siguiente código
que es un poco más complicado que los anteriores porque no solo utiliza geoms:

barras_lesion <- ggplot(datos, aes(tamano, lesion_cabeza, fill = puertas)) +


stat_summary(fun.y=mean, geom="bar", position="dodge") +
stat_summary(fun.data = mean_cl_normal, geom = "errorbar", position =
position_dodge(width = 0.9),width = 0.2) + labs(x = "Categoría de
carrocería", y = "Promedio de criterio de lesión de cabeza", fill = "Número
de puertas") + theme(legend.position = "bottom") + scale_x_discrete(limits =
c("mini", "ligero", "compacto", "multiprop", "pesado", "camioneta", "van"))
Este es un gráfico más avanzado en el que no solo agregamos figuras geoms, sino que también utilizamos algunas
funciones estadísticas que nos ayudan en este caso a calcular los promedios para una variable y que constituyen
las alturas de las barras. Eso es lo que hace la función stat_summary() en la que le especificamos la función
que queremos que efectúe: mean, y luego le especificamos la manera en que queremos que nos muestre este
promedio, en este caso con barras: geom = "bar". La opción position = "dodge" es para que nos separe las
barras según el número de puertas, que es la característica diferenciadora que especificamos en el aes() del
comando ggplot() cuando le dijimos fill = puertas. Para las barras de error también utilizamos la función
stat_summary de manera especial.

24
Promedio de criterio de lesión de cabeza

1500

1000

500

mini ligero compacto multiprop pesado camioneta van


Categoría de carrocería

Número de puertas coupe otro sedan

Figura 10: Primer diagrama de barras usando stat_summary() para obtener los promedios y dibujarlos como
barras.

Esta figura es más para que vean qué podemos hacer con R, pero con histogramas y boxplots es suficiente. Más
adelante aprenderemos más funciones de ser necesario. La Figura 10 muestra el resultado de dicho comando.
Este ha sido solo un abrebocas. Las funciones para dibujar son demasiadas y apenas estamos comenzando. Por
ahora simplemente se han mostrado los resúmenes gráficos más importantes: histogramas y boxplots. En el nivel
que estamos es importante que al menos puedan utilizar estas dos herramientas. Los queremos motivar a que
intenten hacer todas estas mismas gráficas que hemos hecho aquí para las otras variables como carga_femur_i
y carga_femur_d y demás.

Recomendación aquí hemos escritos códigos de scripts a la loca para que ustedes vean cómo se hicieron los
gráficos. Pero es importante que ustedes sean inteligentes a la hora de escribir sus códigos. Traten de que cada
código tenga una sola función principal. Por ejemplo un solo script puede encargarse del resumen numérico con
stat.desc(), otro script puede encargarse de dibujar un solo histograma, y otro puede dibujar un solo boxplot. Es
decir, no intenten poner todo en un solo salchichón de código con muchos renglones porque entonces se vuelve
inmanejable.

8.5. Múltiples ventanas de gráficos y guardar las figuras


Hasta antes de esta sección de gráficos, habíamos conocido dos tipos de ventanas en el panel multi-ventanas de
R: la consola y la ventana del editor. Pues existe un tercer tipo de ventana que es la ventana de gráficos. Cada
vez que se intente dibujar algo en la consola, y este quiera mostrarse, aparecerá una ventana con el nombre de
“R Graphics Device X (ACTIVE)”, donde la X corresponde al número de la ventana de gráficos. La palabra ACTIVE
quiere decir que esa ventana será el lugar donde se muestre cualquier gráfico. Pero sucede que a veces queremos
tener diferentes ventanas con diferentes gráficos abiertos, para eso utilizamos el comando en la consola dev.new()
que creará una nueva ventana activa para los dibujos, al mismo tiempo que inactiva cualquiera vieja que hubiera.
Esto nos permite estar dibujando nuevas cosas en distintas ventanas sin perder los dibujos viejos que teníamos.

25
Figura 11: Haciendo uso de múltiples ventanas de gráficos.

En la Figura 11 se muestra una sesión de R que se utilizó para producir las gráficas de esta sección. Noten que
hay muchas figuras que podemos observar al tiempo. Eso sucedió porque cada vez que se quería dibujar algo
nuevo, se ejecutó en la consola el comando:

> dev.new()

Ahora, para guardar las figuras solo es necesario tener enfocada alguna de las ventanas de gráficos e ir al menú
“Archivo” para elegir la opción “Guardar como”, donde los formatos que recomendamos aquí son primero PDF y
segundo PNG. Ambos son formatos livianos y muy portables como para enviar por correo o incluir en documentos
más elaborados. Lo bueno de guardar imágenes en PDF es que se conserva toda la información de la imagen
sin perder calidad (zoom infinito). Mientras que el formato PNG es como si la imagen estuviera impresa en papel
(solo que digital) así que algo de la calidad se perdió a la hora de imprimirla (borroso a partir de cierto zoom).

26

También podría gustarte