Sahlre
20 de abril de 2016
Esta semana aprenderemos sobre cómo tratar con data frame que poseen valores perdidos, conocidos en el lenguaje de R como NA. Profundizaremos en la selección de datos en un data.frame utilizando los operadores lógicos & y ==. Además se enseñará la función order() que nos permitirá ordenar nuestra base de datos a nuestro gusto. Finalmente encontrarán un ejercicio que les servirá de taller para estudiar para el segundo parcial.
Es común que la información con la que estamos tratando tenga información perdida, es probable que un usuario al llenar un formulario no conozca la dirección de su residencia y por tanto cuando estemos procesando la información de ese usuario se genere una casilla vacia en nuestra base de datos de excel. También es posible que al momento de aplicar una encuesta no todos la diligencien completamente debido a desconocimiento o indiferencia. A todas estas situaciones, en el mundo de la estadística, se les conoce como datos o valores perdidos.
En R los datos perdidos se representan con el simbolo NA, y afortunadamente existen diversas funciones que nos permiten realizar un analisis de datos adecuado cuando están presentes. Veamos las más importantes:
is.na(), esta función identifica los valores perdidos en cualquier objeto retornando un objeto con valores booleanos, si es TRUE significa que hay un valor perdido. Veamos diversos ejemplos
#En un vector
x <- c(1, 2, NA, 4, 5)
#Uso la función para verificar los NA
is.na(x)## [1] FALSE FALSE TRUE FALSE FALSE
#En un data frame
misdatos <- data.frame(Nombre = c("Arturo", NA, "Manuela"),
Notas = c(3.2, 5, NA))
#imprimo
misdatos## Nombre Notas
## 1 Arturo 3.2
## 2 <NA> 5.0
## 3 Manuela NA
#Uso la función para verificar los NA
is.na(misdatos)## Nombre Notas
## [1,] FALSE FALSE
## [2,] TRUE FALSE
## [3,] FALSE TRUE
complete.case() es una función muy útil para obtener una base de datos nueva que este limpia de valores perdidos. Observemos como funciona con el siguiente ejemplo:
#Creo la base de datos
datos <- data.frame(Jugador = c("Klose", "Ronaldo", "Muller", "Fontaine", "Pelé"),
Seleccion = c("Alemania", "Brasil", "Alemania", NA, "Brasil"),
Goles = c(16, 15, 14, 13, NA),
Partidos = c(24, NA, 13, 6, 14))
#Imprimo
datos## Jugador Seleccion Goles Partidos
## 1 Klose Alemania 16 24
## 2 Ronaldo Brasil 15 NA
## 3 Muller Alemania 14 13
## 4 Fontaine <NA> 13 6
## 5 Pelé Brasil NA 14
#Creo base de datos limpia de valores perdidos
datos_nuevos <- datos[complete.cases(datos),]
#Imprimo
datos_nuevos## Jugador Seleccion Goles Partidos
## 1 Klose Alemania 16 24
## 3 Muller Alemania 14 13
Dejando a un lado las anteriores funciones es importante tener mucho cuidado cuando trabajas con bases de datos que presentan valores perdidos ya que algunas funciones no van servir a no ser que identifiques esos valores perdidos
Por ejemplo, la función mean() es sensible a los datos perdidos. Con el siguiente código piensa que es lo que quiero decir:
#Vector z con valores númericos y algunos valores perdidos
z <- c(3, 5, 7, 8, NA, 5, 6, 2, 1, NA, 34, NA, 67, NA)
#Promedio de los datos almacenados en z
mean(z)## [1] NA
Wow, se reproduce algo extraño, es porque la función mean() no reconoce los valores perdidos, para solucionar es problema debes decirle a la función que en los datos almacenados en el vector z hay presencia de valores perdidos, esto lo puedes hacer usando el argumento na.rm de la función mean(), como se muestra a continuación:
#Vector z con valores númericos y algunos valores perdidos
z <- c(3, 5, 7, 8, NA, 5, 6, 2, 1, NA, 34, NA, 67, NA)
#Promedio de los datos almacenados en z
mean(z, na.rm = TRUE)## [1] 13.8
Es muy importante la selección de información a partir de una base de datos. En la clase pasada aprendimos a seleccionar información de forma númerica, con los nombres de las variables y utilizando el signo pesos. En esta sección profundizaremos en la selección a través de operadores lógicos.
La base de datos que utilizaremos la puedes encontrar en el archivo .csv que he denominado “Peliculas_mas_Taquilleras”.
Las variables son:
Primero vamos a cargar la base de datos en el entorno de R. Recuerda los pasos que aprendimos la clase pasada, luego observa rápidamente los datos y la estructura de cada uno de ellos utilizando la función str(). Finalmente, trata de responder las siguientes preguntas: ¿Qué tipo de datos almacena la variable Presupuesto?¿o la variable Distribuidora? ¿Cuántas filas y columnas tiene la base de datos?
#Cargo la base de datos
setwd("D:/Santiago/2016/CUA/Asignturas/Semestre_I/Proyecto_Investigacion_II/Data_Frame_2")
misdatos <- read.csv("Peliculas_mas_Taquilleras.csv")
#Utilizo la función str() para dar una mirada eficiente a la base de datos
str(misdatos)## 'data.frame': 50 obs. of 7 variables:
## $ X : int 1 2 3 4 5 6 7 8 9 10 ...
## $ Pelicula : Factor w/ 50 levels "Alicia en el país de las maravillas",..: 30 10 45 38 20 12 13 18 11 5 ...
## $ Distribuidoras : Factor w/ 19 levels "20th Century Fox",..: 15 16 8 1 19 5 5 19 5 17 ...
## $ Taquilla.USA : int 402453882 422783777 658672302 474544677 317575550 315544750 342551365 261988482 377845905 380843261 ...
## $ Taquilla.fuera.USA: num 6.27e+08 5.65e+08 1.53e+09 5.52e+08 6.57e+08 ...
## $ Presupuesto : num 6.30e+07 4.50e+07 2.00e+08 1.15e+08 1.25e+08 9.30e+07 9.40e+07 1.00e+08 9.40e+07 9.40e+07 ...
## $ Periodo.Estreno : int 1993 1994 1997 1999 2001 2001 2002 2002 2003 2003 ...
#Puedo utilizar las funciones que aprendi la clase pasada, las cuales me permiten
#conocer la información que se encuentra almacenada en la base de datos
head(misdatos)## X Pelicula
## 1 1 Parque Jurásico
## 2 2 El rey león
## 3 3 Titanic
## 4 4 Star Wars: Episode I - The Phantom Menace
## 5 5 Harry Potter y la piedra filosofal
## 6 6 El Señor de los Anillos: la Comunidad del Anillo
## Distribuidoras Taquilla.USA Taquilla.fuera.USA
## 1 Universal Studios 402453882 626700000
## 2 Walt Disney Pictures 422783777 564700000
## 3 Paramount Pictures/20th Century Fox 658672302 1528100000
## 4 20th Century Fox 474544677 552500000
## 5 Warner Bros. 317575550 657179821
## 6 New Line Cinema 315544750 555985574
## Presupuesto Periodo.Estreno
## 1 6.30e+07 1993
## 2 4.50e+07 1994
## 3 2.00e+08 1997
## 4 1.15e+08 1999
## 5 1.25e+08 2001
## 6 9.30e+07 2001
tail(misdatos)## X Pelicula
## 45 45 Avengers: Age of Ultron
## 46 46 Minions
## 47 47 Spectre
## 48 48 Inside Out
## 49 49 Zootopia
## 50 50 Batman v Superman: Dawn of Justice
## Distribuidoras Taquilla.USA Taquilla.fuera.USA
## 45 Marvel Studios/Walt Disney Pictures 459005868 946029899
## 46 Universal Studios 336045770 821229247
## 47 Sony/MGM/Columbia 200069575 680600000
## 48 Pixar/Buena Vista 356461711 495172219
## 49 Walt Disney Pictures 307478756 574800000
## 50 Warner Bros 311980143 518000000
## Presupuesto Periodo.Estreno
## 45 2.50e+08 2015
## 46 7.40e+07 2015
## 47 2.45e+08 2015
## 48 1.75e+08 2015
## 49 1.50e+08 2016
## 50 2.50e+08 2016
¿Qué tal si te piden crear una base de datos que contenga todas las variables de aquellas películas que recaudaron en USA una suma superior a los $381000000 dólares y que tuvieron un presupuesto inferior a los $234000000 dólares? A esa nueva base de datos denominela bd
#Cargo la base de datos
setwd("D:/Santiago/2016/CUA/Asignturas/Semestre_I/Proyecto_Investigacion_II/Data_Frame_2")
misdatos <- read.csv("Peliculas_mas_Taquilleras.csv")
#Hay dos maneras
#La primera, forma larga
paso1 <- misdatos[misdatos$Taquilla.USA > 381000000, ]
paso2 <- paso1[paso1$Presupuesto < 234000000, ]
bd <- paso2
str(bd)## 'data.frame': 15 obs. of 7 variables:
## $ X : int 1 2 3 4 11 14 18 22 23 29 ...
## $ Pelicula : Factor w/ 50 levels "Alicia en el país de las maravillas",..: 30 10 45 38 34 32 42 49 46 41 ...
## $ Distribuidoras : Factor w/ 19 levels "20th Century Fox",..: 15 16 8 1 2 16 19 10 17 4 ...
## $ Taquilla.USA : int 402453882 422783777 658672302 474544677 441226247 423315812 534858444 402111870 415004880 623357910 ...
## $ Taquilla.fuera.USA: num 6.27e+08 5.65e+08 1.53e+09 5.52e+08 4.79e+08 ...
## $ Presupuesto : num 6.30e+07 4.50e+07 2.00e+08 1.15e+08 1.50e+08 2.25e+08 1.85e+08 2.00e+08 2.00e+08 2.20e+08 ...
## $ Periodo.Estreno : int 1993 1994 1997 1999 2004 2006 2008 2009 2010 2012 ...
#La segunda, forma eficiente
bd <- misdatos[misdatos$Taquilla.USA > 381000000 & misdatos$Presupuesto < 234000000,]
str(bd)## 'data.frame': 15 obs. of 7 variables:
## $ X : int 1 2 3 4 11 14 18 22 23 29 ...
## $ Pelicula : Factor w/ 50 levels "Alicia en el país de las maravillas",..: 30 10 45 38 34 32 42 49 46 41 ...
## $ Distribuidoras : Factor w/ 19 levels "20th Century Fox",..: 15 16 8 1 2 16 19 10 17 4 ...
## $ Taquilla.USA : int 402453882 422783777 658672302 474544677 441226247 423315812 534858444 402111870 415004880 623357910 ...
## $ Taquilla.fuera.USA: num 6.27e+08 5.65e+08 1.53e+09 5.52e+08 4.79e+08 ...
## $ Presupuesto : num 6.30e+07 4.50e+07 2.00e+08 1.15e+08 1.50e+08 2.25e+08 1.85e+08 2.00e+08 2.00e+08 2.20e+08 ...
## $ Periodo.Estreno : int 1993 1994 1997 1999 2004 2006 2008 2009 2010 2012 ...
¿Qué tal si te piden crear una base de datos de todas las películas que fueron distribuidas por Universal Studios, llame a esa base de datos bd_us?
bd_us <- misdatos[misdatos$Distribuidoras == "Universal Studios",]
str(bd_us)## 'data.frame': 5 obs. of 7 variables:
## $ X : int 1 37 43 44 46
## $ Pelicula : Factor w/ 50 levels "Alicia en el país de las maravillas",..: 30 6 27 15 29
## $ Distribuidoras : Factor w/ 19 levels "20th Century Fox",..: 15 15 15 15 15
## $ Taquilla.USA : int 402453882 370061265 652270625 353007020 336045770
## $ Taquilla.fuera.USA: num 6.27e+08 6.03e+08 1.02e+09 1.16e+09 8.21e+08
## $ Presupuesto : num 6.3e+07 7.6e+07 1.5e+08 1.9e+08 7.4e+07
## $ Periodo.Estreno : int 1993 2013 2015 2015 2015
bd_us## X Pelicula Distribuidoras Taquilla.USA Taquilla.fuera.USA
## 1 1 Parque Jurásico Universal Studios 402453882 626700000
## 37 37 Despicable Me 2 Universal Studios 370061265 602700620
## 43 43 Jurassic World Universal Studios 652270625 1016714301
## 44 44 Furious 7 Universal Studios 353007020 1163038891
## 46 46 Minions Universal Studios 336045770 821229247
## Presupuesto Periodo.Estreno
## 1 6.3e+07 1993
## 37 7.6e+07 2013
## 43 1.5e+08 2015
## 44 1.9e+08 2015
## 46 7.4e+07 2015
La función order() es muy útil para ordenar una base de datos de forma descendente o ascendente según uno o varios criterios.
Supongamos que se desea crear una base de datos tal que ordene la base de datos misdatos de las películas más recientes a la más antiguas. Notar que misdatos esta organizada de las más antiguas a las más recientes. Llame a esa nueva base de datos bd_desc
#Observe el resultado que arroja el uso de la funcion order
order(-misdatos$Periodo.Estreno)## [1] 49 50 42 43 44 45 46 47 48 40 41 35 36 37 38 39 29 30 31 32 33 34 26
## [24] 27 28 23 24 25 19 20 21 22 18 15 16 17 14 12 13 11 9 10 7 8 5 6
## [47] 4 3 2 1
#Base de datos bd_desc
bd_desc <- misdatos[order(-misdatos$Periodo.Estreno), ]También puedo organizar con varios criterios
#Organiza la base de datos misdatos primero por taquilla fuera de USA de forma
#decresciente(de la de mayor ingreso a la de menor), y segundo por presupuesto de forma
#ascendente (de la más barata a la más cara).
bd <- misdatos[order(-misdatos$Taquilla.fuera.USA, misdatos$Presupuesto),]
#Demos un vistazo
head(bd[,-c(1, 3, 4)])## Pelicula Taquilla.fuera.USA
## 19 Avatar 2021767547
## 3 Titanic 1528100000
## 44 Furious 7 1163038891
## 42 Star Wars: Episode VII - The Force Awakens 1128400000
## 43 Jurassic World 1016714301
## 26 Harry Potter y las Reliquias de la Muerte - Parte 2 960500000
## Presupuesto Periodo.Estreno
## 19 2.37e+08 2009
## 3 2.00e+08 1997
## 44 1.90e+08 2015
## 42 2.00e+08 2015
## 43 1.50e+08 2015
## 26 2.50e+08 2011
Supongamos que te piden adicionar a la base de datos misdatos la variable ingreso_total, la cual contiene la taquilla total realizada en USA como fuera de USA. Además suponga que te piden calcular la taquilla promedio realizada a nivel mundial para las 50 películas.
El siguiente código te proporcionará la solución:
misdatos$ingreso_total <- misdatos$Taquilla.USA + misdatos$Taquilla.fuera.USA
str(misdatos)## 'data.frame': 50 obs. of 8 variables:
## $ X : int 1 2 3 4 5 6 7 8 9 10 ...
## $ Pelicula : Factor w/ 50 levels "Alicia en el país de las maravillas",..: 30 10 45 38 20 12 13 18 11 5 ...
## $ Distribuidoras : Factor w/ 19 levels "20th Century Fox",..: 15 16 8 1 19 5 5 19 5 17 ...
## $ Taquilla.USA : int 402453882 422783777 658672302 474544677 317575550 315544750 342551365 261988482 377845905 380843261 ...
## $ Taquilla.fuera.USA: num 6.27e+08 5.65e+08 1.53e+09 5.52e+08 6.57e+08 ...
## $ Presupuesto : num 6.30e+07 4.50e+07 2.00e+08 1.15e+08 1.25e+08 9.30e+07 9.40e+07 1.00e+08 9.40e+07 9.40e+07 ...
## $ Periodo.Estreno : int 1993 1994 1997 1999 2001 2001 2002 2002 2003 2003 ...
## $ ingreso_total : num 1.03e+09 9.87e+08 2.19e+09 1.03e+09 9.75e+08 ...
#Recuerda que también puedes usar la función cbind() que aprendimos cuando trabajamos
#con matrices.
ingreso_total <- misdatos$Taquilla.USA + misdatos$Taquilla.fuera.USA
misdatos <- cbind(misdatos, ingreso_total)
str(misdatos)## 'data.frame': 50 obs. of 9 variables:
## $ X : int 1 2 3 4 5 6 7 8 9 10 ...
## $ Pelicula : Factor w/ 50 levels "Alicia en el país de las maravillas",..: 30 10 45 38 20 12 13 18 11 5 ...
## $ Distribuidoras : Factor w/ 19 levels "20th Century Fox",..: 15 16 8 1 19 5 5 19 5 17 ...
## $ Taquilla.USA : int 402453882 422783777 658672302 474544677 317575550 315544750 342551365 261988482 377845905 380843261 ...
## $ Taquilla.fuera.USA: num 6.27e+08 5.65e+08 1.53e+09 5.52e+08 6.57e+08 ...
## $ Presupuesto : num 6.30e+07 4.50e+07 2.00e+08 1.15e+08 1.25e+08 9.30e+07 9.40e+07 1.00e+08 9.40e+07 9.40e+07 ...
## $ Periodo.Estreno : int 1993 1994 1997 1999 2001 2001 2002 2002 2003 2003 ...
## $ ingreso_total : num 1.03e+09 9.87e+08 2.19e+09 1.03e+09 9.75e+08 ...
## $ ingreso_total : num 1.03e+09 9.87e+08 2.19e+09 1.03e+09 9.75e+08 ...
#El promedio
mean(misdatos$ingreso_total)## [1] 1109908757
Utilizando la base de datos “Peliculas_mas_Taquilleras” responda las siguientes preguntas
¿Cuántas filas estan libres de valores perdidos? Rta = 50
¿Cuál es el recaudo total a nivel mundial de las 50 película? Rta = 55495437871
¿Cuántas personas a nivel mundial fueron a ver las películas del año 2015, suponga que el precio de entrada fue de 8.61 dólares? Rta = 1108360702 de personas
¿En promedio cuántas personas en USA fueron a ver las películas del año 2012, suponga que el precio de entrada fue de 7,87 dólares? Rta = 45161106
¿De la base de datos cuál es el nombre de las diez películas más costosas? Proporcione los nombres de forma decrecientes, es decir el primer nombre corresponde a la más costosa, el segundo nombre a la que le sigue y así sucesivamente. Si dos o más películas coinciden en el presupuesto organice de tal manera que aparezca primero la película más reciente. Rta =
[1] El hobbit: un viaje inesperado
[2] Piratas del Caribe: en el fin del mundo
[3] Spider-Man 3
[4] Batman v Superman: Dawn of Justice
[5] Avengers: Age of Ultron
[6] El hobbit: la batalla de los Cinco Ejércitos
[7] The Dark Knight Rises
[8] Harry Potter y las Reliquias de la Muerte - Parte 2
[9] Pirates of the Caribbean: On Stranger Tides
[10] Harry Potter y las Reliquias de la Muerte - Parte 1
Rta: tenga en cuenta que: 3.4e+1 es 34 y 4.5e-2 es 0.045
[1] min 5.8e+10
[2] primer cuartil 7.351e+08
[3] Mediana 8.282e+08
[4] Media 9.339e+08
[5] Tercer cuartil 9.602e+08
[6] Máximo 2.545e+09