Capítulo 1 Introducción a objetos

Cuando hablamos de fundamentos de R nos referimos a toda la base necesaria y fundamental para, sobre ello, construir las técnicas propias del análisis de datos.

Vamos a empezar desarrollando conceptos en esta unidad y las siguientes hasta poder resolver esta primera problemática:

Queremos mudarnos de Perú a Estados Unidos y no sabemos a qué estado. Nuestra decisión estará basada únicamente en qué tan peligroso es el estado al que nos mudaremos.

Como se dan cuenta, no podemos tomar una decisión sin siquiera saber de dónde extraemos la data. La data en R que más utilizaremos estará almacenada en objetos, como por ejemplo variables, funciones o data frames.

1.1 Variables

En R no necesitamos declarar una variable, sino directamente asignarle un valor. Por ejemplo, creemos la variables: x, y, variable_3 y asignémosle los valores 3, 6, 4 respectivamente. Recuerda seleccionar todas las líneas de tu código antes de correr tu Script (click en Run).

Al ejecutar/correr tu Script verás en la sección consola tu Script ejecutado, pero ningún valor impreso. En la sección Environment/History verás que ya tus variables han sido creadas y qué valor tienen.

Como ves, R nos permite asignar un valor utilizando el símbolo <-

Para ver el valor o el resultado de una operación tenemos que, además de asignarle un valor, llamar a la variable que queremos observar.

Por ejemplo, calculemos y mostremos en pantalla el valor de esta resta: y - x.

1.2 Funciones

R nos provee ya un conjunto de funciones que nos facilitan los cálculos. Algunos tan conocidos como la raíz cuadrada de un número:

Como se puede observar, tenemos que usar el nombre de la función, en este caso sqrt y entre paréntesis el valor que queremos evaluar usando esta función.

Podemos usar una función y dentro de los paréntesis colocar una variable:

Para crear una función utilizaremos la función llamada function(). Por ejemplo, creemos la función que sume dos números x y y.

1.2.1 Funciones anidadas

Esto implica que podemos colocar entre paréntesis de una función otra función y otra dentro. Siempre se evaluará desde adentro hacia fuera. Por ejemplo, si queremos calcular la raíz cuadrada de 100 y luego al resultado queremos volver a aplicar la raíz cuadrada:

1.2.2 Manual de funciones

Para las funciones que vienen incluidas en R podemos obtener un manual de uso utilizando el símbolo ? antes de la función. Por ejemplo, si ejecutamos este código podemos tener el manual para la función logaritmo:

Para ciertas funcines se pide más de una variable entre paréntesis. Si olvidamos los campos podemos utilizar la función args para ver los argumentos, lo esperado por la función:

Aquí vemos que el segundo argumento tiene un =. Eso quiere decir que ya está seteado por defecto y no es obligatorio llenarlo. Así, la función calcula logaritmo en base natural:

Sin embargo, podemos cambiar la base de esta forma:

1.3 Ejercicios

Para todos los ejercicios de los libros tendremos no solo las preguntas y respuestas, sino también píldoras de conocimiento que serán de utilidad para resolver los ejercicios.

Píldora: Si queremos calcular la suma de los n primeros números enteros, podemos hacerlo utilizando la siguiente formula: \(\frac{n(n+1)}{2}\)

  1. Calcula la suma de los números del 1 al 30.

Solución

  1. Define la variable n y asígnale el valor de 30. Luego calcula la suma de los 30 primeros números enteros.

Solución

  1. Cambia el valor de n y ahora calcula la suma de los primeros 100 enteros.

Solución

Píldora: Para ciertos logarítmos ya existe la fórmula directa en vez de especificar la base. Por ejemplo, la fórmula log2(x) calcula el logaritmo en base 2 de un número x. Con la misma idea podemos usar log10(x).

  1. Calcula el logaritmo en base 2 de 32

Solución

  1. Calcula la raíz cuadrada del logaritmo en base 2 de 32

Solución

  1. Calcula el logaritmo en base 10 de la raíz cuadrada de 100.

Solución

1.4 Vectores

También podemos crear y manipular arreglos o listados de datos. Estos son conocidos como vectores.

Para crear vectores vamos a utilizar la función c que significa concatenar. Así, si queremos crear un vector llamado distritos podemos hacerlo de la siguiente forma:

En este caso, dado que estamos ingresando caracteres los ingresamos entre comillas. Pero podemos crear vectores de otro tipo de datos. Por ejemplo, numéricos:

Si queremos saber la cantidad de datos que tiene nuestro vector, su longitud, usaremos la función length().

Además, la función class que nos indica la clase del objeto, representando qué tipo de datos son almacenados en el objeto a analizar. Por ejemplo:

Existen vectores de caracteres, numéricos, lógicos (verdadero y falso), de factores, etc.

Ahora que tenemos el vector distritos con la relación de 3 distritos y el vector poblacion que indica su respectiva población, podemos utilizar el vector distritos como cabecera del vector población con la función names:

Con esto, el vector población sigue siendo numérico, pero con cabeceras. Si bien los vectores aceptan palabras con espacios en el medio (p.ej. “San Isidro”), utilizaremos únicamente cabeceras sin espacios o con guiónes bajo.

1.4.1 Coerción de vectores

A diferencia de los lenguajes de programación orientados a software, R busca intepretar o cambiar un valor cuando encuentra un error. Esto se entiende más con un ejemplo. Vamos a crear el siguiente vector:

Esto nos crea un un vector de caracteres, puesto que todo está entre comillas. Aun así a este vector podemos aplicarle la función as.numeric() para convertir los datos a números.

R convierte lo que puede y por coerción reemplaza lo que no puede convertir, y sería en otros lenguajes un error, colocando el valor NA. Como data scientist es muy común que encuentres NA insertados por coerción. Por eso es importante entendenrlo y estar preparados para verlo seguido.

1.4.2 Ordenamiento de vectores

Para ordenar los datos de un vector, por ejemplo un vector de distritos, usaremos la función sort():

1.4.2.1 Ordenar usando índices

Así mismo, podemos acceder a los datos de un vector a través de sus índices. Por el siguiente código nos daría el primero y cuarto elementos del vector:

Dentro de los corchetes podemos pedir que nos muestre más de un valor. Para ello tendríamos que ingresar en los corchetes un vector numérico. Miremos el mismo ejemplo pero ingresando un vector numérico aux para obtener ahora el quinto elemento:

Nuestro vector numérico ahora nos muestra el quinto valor, pero podemos agregar más valores. Este código nos muestra cómo extraer el 5to y el 3er valor:

Si colocamos todos los índices disponibles de la siguiente forma obtendremos la cadena ordenada manualmente de menor a mayor (alfabéticamente en el caso de caracteres) utilizando índices:

Esto nos ha permitido ordenar utilizando índices, pero lo hemos hecho observando hasta determinar que el 5to valor (Chorrillos) es el que debería de ir primero por ser el menor (orden alfabético), el 1er valor (Comas) debería de después, etc.

Podemos utilizar, en cambio, la función order() para no tener que hacerlo manualmente:

La función order toma como argumento un vector y devuelve un vector numérico con los índices ordenados del vector agumento.

Hay que tener en cuenta que la función order no ha cambiado para nada el vector. Se pueden percatar al ejecutar ambos:

Nuestro vector distritos sigue desordenado y el vector distritos[aux] lo muestra ordenado de menor a mayor.

1.4.3 NA en vectores

Como vimos anteriormente, encontraremos muchas veces NAs en vectores en R. Para ver qué pasa si no los filtramos calcularemos el promedio de números del siguiente vector con la función mean():

Vemos que nos arroja otro NA en vez de calcular el promedio de los otros valores del vector. Es importante, entonces saber cómo detectarlos y filtrarlos. Para detectar cuáles son NA, R nos da la función is.na().

Esta función nos arroja un vector lógico (verdadero o falso) indicando TRUE si es que el valor es NA. Dado que nos importa cuántos valor NO son NA, utilizaremos la negación de la función con el símbolo: !

Podemos utilizar índices para extraer únicamente los valores numéricos del vector de esta forma:

Cuando colocamos un vector lógico dentro de los corchetes, solos nos mostrará los valores donde encuentra TRUE.

Ahora sí, que ya filtramos a los NA ya podemos calcular el promedio de los valores:

1.5 Ejercicios

  1. Crea un vector llamado presidentes con los nombres de los últimos 3 presidentes del Perú.

Solución

  1. Crea un vector llamado inicio con 3 valores que indiquen en qué año se convirtieron en presidentes c/u de los del ejercicio anterior.

Solución

  1. Relaciona los dos vectores creados anteriormente colocando al vector inicio las cabeceras creadas en el vector presidentes.

Solución

  1. Crea el vector n <- c(34, 53, “hola”, 12). Luego, coerciona el vector a valores numéricos.

Solución

1.6 Data frames

Para entender un data frame podemos imaginarnoslo como una tabla en excel con varias columnas y varias filas donde puedes encontrar números, letras, etc. De hecho, si importamos datos directamente de un .csv se importan por defecto en un objeto de tipo data frame. Para ello podemos utilizar la función read.csv().

Para explorar la estructura de un objeto usaremos la función str().

También podemos encontrar paquetes donde encontraremos data frames con data lista para ser analizada. Recordemos nuestro problema inicial: > Queremos mudarnos de Perú a Estados Unidos y la decisión estará basada en qué tan peligroso es el estado al que nos mudaremos.

Un data frame que nos ayude a tomar esta decisión listaría todos los estados dentro de Estados Unidos, así como el total de asesinatos de algún determinado año.

Existe un data frame disponible con data del 2010, el cual contiene la data de asesinados con armas de fuego en EEUU en ese año y es la data que tomaremos como referencia para resolver nuestro caso/problemática. Para acceder al mismo, tenemos que instalar el paquete donde se encuentra la librería que contiene ese data frame de esta forma:

En este caso nos muestra que es un data frame con 51 filas y 5 columas:

  • state: lista todos los estados de Estados Unidos
  • abb: es el nombre abreviado de cada Estado
  • region: es la región, puede estar al Sur, Oeste, Este, etc
  • population: población de cada Estado
  • total: total de asesinatos del año pasado

Podemos explorar las primeras filas de este data frame usando la función head(x), donde x puede ser data frame, o también podría ser un vector, tabla, etc.

1.6.1 Extrayendo datos de un data frame

Ya hemos leído el data frame, pero para analizarlo tenemos que poder acceder a los datos. La manera que más utilizaremos en esta etapa será utilizando el símbolo $.

Como nuestro problema es determinar a qué estado nos mudaremos, lo primero que haremos será acceder a ver el listado de todos los estados (primera columna de nuestro data frame):

Los números entre corchetes no los usaremos. Solo tenlos como referencia porque te indican el orden. Por ejemplo, el primer valor en la columna es “Alabama”, el 10mo valor en la columna es “Florida”, etc.

El resultado obtenido no es un solo dato, sino un listado de datos (un vector). Como estamos interesados en el estado con el mayor número de delitos ordenaremos utilizando la columna total:

Tenemos un listado de índices. El número 46 indica que en la fila 46 se encuentra el valor mínimo del vector. En la fila 35 se encuentra el siguiente valor, etc.

Ahora utilizamos estos índices para mostrar otra columna estado (state), utilizando los índices del total:

Esto nos indica que el estado de Vermont es el que reportó menor número de asesinatos, mientras que California fue el estado que reportó mayor número de estos delitos.

1.7 Ejercicios

  1. Accede a la variable abb del data frame murders y almacena ese vector en el objeto abreviaciones. Ordena el objeto alfabéticamente y guarda el resultado en el mismo objeto. Reporta el primer valor del vector abreviaciones.

Solución

Para calcular el mínimo valor de un vector y el máximo podemos usar la función min() y max() respectivamente

  1. Reporta el mínimo y el máximo valor de la variable total del data frame murders.

Solución

  1. Accede a la variable population del data frame murders y almacénalo en la variable poblacion. Luego crea el objeto index_pob donde almacenes los índices ordenados del vector poblacion. Reporta el objeto index_pob

Solución

  1. Usa el accesador $ para extraer únicamente la población. Almacena el resultado en el objeto pob. Luego determina la clase del objeto pob.

Solución

La función table(x) toma un vector x como input y devuelve la cantidad de veces (qué tan frecuente) que cada valor aparece.

  1. Calcula el número de estados por región que tenemos en nuestro data frame.

Solución

1.8 Ejercicios integradores

  1. Calcula el resultado de la siguiente formula: \({a}^{2}+2{a}{b}+{b}^2\), donde a es igual a 31 y b es igual a 56.

Solución

  1. Crea el vector c(18, 14, 19, 11) y almacénalo en la variable notas. Crea el vector c(0.15, 0.3, 0.10, 0.45) y almacénalo en la variable peso_ponderado. Esta variable nos indica el peso que tiene cada nota en la nota final de un estudiante.

Calcula la máxima nota y cuánto es el peso máximo que se le da a una nota de ese curso.

Solución

  1. Calcula el promedio de notas del vector notas y calcula el promedio ponderado utilizando los vectores notas y peso_ponderado.

Solución

Calculamos directamente multiplicando porque los pesos ya están expresados en porcentajes. Podemos ver que el promedio ponderado es menor al promedio aritmético porque el estudiante sacó bajas notas en examenes que tenían mayor peso (Sacó 11 en el examen que pesaba 45% de la nota).

  1. Explora el data frame llamado movielens que incluye un listado de películas estrenadas, así como sus ratings. Está incluido en el paquete dslabs que ya instalamos, en la misma librería dslabs. Calcula cuántas filas hay en el data frame.

Solución

  1. ¿Cuál es la clase de la columna género? (género en inglés es genres)

Solución

  1. Del data frame murders calcula el ratio de total de homicidios por la población de cada estado. El resultado almacénalo en la variable ratio_homicidios. Reporta el resultado

Solución

  1. Modifica tu respuesta anterior para calcula el ratio de homicidios por cada 100 mil habitantes.

Solución