Data Frame 2

Sahlre

20 de abril de 2016

Data Frame 2

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.

Datos perdidos (NA)

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

Selección de datos utilizando el operador lógico &

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 ...

Selección de datos utilizando el operador lógico ==

¿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

Función order()

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

Adicionar una variable o columna a una base de datos

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

Ejercicio

Utilizando la base de datos “Peliculas_mas_Taquilleras” responda las siguientes preguntas

[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