[1.] Configuración inicial

Antes de iniciar, asegúrese de tener instalado R y Rstudio.

1.1 Descargar R

R es un software de acceso libre usado para el análisis estadístico y creación de gráficos. Funciona en una amplia variedad de plataformas UNIX, Windows y MacOS.

1.2 Descargar RStudio

RStudio es un entorno de desarrollo integrado (IDE) para el lenguaje de programación R. Esta IDE brinda una interfaz más amigable con el usuario facilitando el aprendizaje.

1.3 Instalar R y RStudio

Puede ir a este enlace y seguir las instrucciones de instalación para el sistema operativo de su equipo.

[2.] Introducción a la interfaz de R y RStudio

2.1 Consola de R

R es un software de acceso libre usado para el análisis estadístico y creación de gráficos. Funciona en una amplia variedad de plataformas UNIX, Windows y MacOS.

2.2 IDE: RStudio

RStudio es un entorno de desarrollo integrado (IDE) para el lenguaje de programación R. Esta IDE brinda una interfaz más amigable con el usuario facilitando el aprendizaje.

2.2.1 Consola

La consola permite ejecutar una línea de código y visualizar el resultado de ejecutar un código. Sin embargo, cuando se antepone un # a una línea de código, R pinta la línea de código sobre la consola pero no la ejecuta.

Después de ejecutar una línea de código en R, la consola puede retornar un decoding messages. Estos pueden ser:

Warning o message: sugiere que hay detalles de la función que debemos tener en cuenta (no se detiene la ejecución de la función).

Error: se genera cuando ocurrió un error importante causando que la función no continue ejecutándose.

2.2.2 Entorno de trabajo

El entorno de trabajo de R almacena temporalmente los objetos que se asignan durante una sesión. Al momento de cerrar la sesión Rstudio nos preguntará si queremos almacenar en un archivo .Rdata los objetos que se encuentran en la memoria activa de R.

2.2.3 Editor de sintaxis

El editor de sintaxis permite escribir las instrucciones que se van a ejecutar en R. Para ejecutar una línea de código del editor de sintaxis se debe sombrear toda la línea de código y se presionan las teclas Control + Enter o se hace clik sobre el boton run.

2.3 ¿Workspace?

El espacio de trabajo es la colección de objetos almacenados en la memoria activa de R. Para gestionar el espacio de trabajo puede:

objects() ## ver objetos en el espacio de trabajo
## character(0)
object.size(mtcars) ## peso de un objeto
## 7208 bytes
ls() ## ver objetos en el espacio de trabajo
## character(0)

Puede remover uno o varios objetos del espacio de trabajo:

rm() ## remover un objeto del espacio de trabajo
rm(list=ls()) ## Limpiar el entorno de trabajo
cat("\f") ## Limpiar la consola

2.4 Líberias

2.4.1 Acerca de las librerías:

  • Las librerías son un conjunto/paquete de funciones especializadas en tareas específicas.

  • Una librería se debe instalar en el equipo solo una vez -install.packages()-, pero se debe llamar/requerir -library() o require()- cada vez que se inicia una sesión de Rstudio en la que se va a utilizar alguna función de esa librería.

  • Algunas librerías se actualizan constantemente, usted puede actualizar la versión de una librería usando la función update.packages().

Nota: puede inspeccionar las librerías que tiene activas en su sesión corriendo la función sessionInfo() sobre la consola de R:

## información de la sesión
sessionInfo()
R version 4.1.1 (2021-08-10)
Platform: x86_64-apple-darwin17.0 (64-bit)
Running under: macOS Big Sur 10.16

Matrix products: default
BLAS:   /Library/Frameworks/R.framework/Versions/4.1/Resources/lib/libRblas.0.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/4.1/Resources/lib/libRlapack.dylib

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base   

2.4.2 ¿Cómo gestionar las librerías en R?

Cuando inicia sesión, R carga 7 librerías bases (usted,stats,graphics,grDevices,utils, datasets, methods y base). Pero usted puede instalar/llamar aproximadamente 18639 librerías disponibles en el CRAN de R.

¿Como instalar/actualizar una librería?

2.5 Funciones y help

2.5.1 Funciones

Una función permite crear, editar, transformar o eliminar objetos. Están contenidas en librerías. Y cada función contiene por lo menos 1 argumento.

2.5.2 Obtener ayuda de una función

Para obtener más información sobre una función u objeto (con nombre) en R, consulte la documentación de “help” o usando ?:

help(rnorm)
?rnorm 

Hint: Los comentarios en R están delimitados por #. Presiona Ctrl+Shift+c en RStudio para (des)comentar secciones completas del código resaltado.

Hint: ¿Ves la sección Ejemplos en la parte inferior del archivo de ayuda? Puedes ejecutarlos con la función example().

example(rnorm)

2.5.3 Vignettes

Para muchos paquetes, también puede probar la función vignette(), que proporcionará una introducción a un paquete y su propósito a través de una serie de ejemplos útiles. Una complicación es que necesita saber el nombre exacto de la(s) viñeta(s) del paquete. Intente ejecutar:

vignette("base")

2.5.4 Demos

Al igual que las viñetas, muchos paquetes vienen con demostraciones interactivas integradas. Para enumerar todas las demostraciones disponibles en su sistema:

demo("graphics", package = "graphics")
demo(package = .packages(all.available = TRUE))

3. Data pre-proccessing

Para replicar este ejercicio, primero debe descargar el siguiente proyecto de R y abrir el archivo clase-01.Rproj. Ahora puede seguir el script de la clase que está ubicado en: source/clase-01.R

3.1 Configuración inicial

## instalar pacman
if(!require(pacman)) install.packages("pacman") ; require(pacman)

## llamar/instalar librerias de la sesion
p_load(rio, # import/export data
       tidyverse, # tidy-data
       skimr, # summary data
       janitor, # clean_names and tabyl
       caret) # Classification And REgression Training
## leer conjutno de datos
db <- import("input/house_prices.rds") %>% as_tibble()

3.2. Inspeccionar datos

Puede imprimir en la consola tanto las primeras head() como las últimas observaciones de la base de datos tail(). Puede obtener una descripción completa de la base de datos utilizando la función skim() de la biblioteca skimr. Sin embargo, puede producir resúmenes de resultados de una variable usando la función summary(). Déjame mostrarte un ejemplo:

## print data
head(db)
## # A tibble: 6 × 27
##      V1 id      ad_type start_date end_date   created_on   lat   lon l1    l2   
##   <int> <chr>   <chr>   <IDate>    <IDate>    <IDate>    <dbl> <dbl> <chr> <chr>
## 1     1 hAv2f6… Propie… 2019-09-04 2020-03-26 2019-09-04  4.58 -74.2 Colo… Cund…
## 2     2 xj4oZf… Propie… 2019-09-04 2020-07-17 2019-09-04 11.0  -74.8 Colo… Atlá…
## 3     3 6vaUZG… Propie… 2019-09-04 2020-01-31 2019-09-04  6.25 -75.6 Colo… Anti…
## 4     4 ia6a/X… Propie… 2019-09-04 2020-07-17 2019-09-04 11.0  -74.8 Colo… Atlá…
## 5     5 Fn7zE7… Propie… 2019-09-04 9999-12-31 2019-09-04  4.61 -74.1 Colo… Cund…
## 6     6 vfkDDN… Propie… 2019-09-04 2020-07-17 2019-09-04 11.0  -74.8 Colo… Atlá…
## # … with 17 more variables: l3 <chr>, l4 <chr>, l5 <chr>, l6 <chr>,
## #   rooms <int>, bedrooms <int>, bathrooms <int>, surface_total <int>,
## #   surface_covered <int>, price <dbl>, currency <chr>, price_period <chr>,
## #   title <chr>, description <chr>, property_type <chr>, operation_type <chr>,
## #   n <int>
tail(db)
## # A tibble: 6 × 27
##       V1 id     ad_type start_date end_date   created_on   lat   lon l1    l2   
##    <int> <chr>  <chr>   <IDate>    <IDate>    <IDate>    <dbl> <dbl> <chr> <chr>
## 1 239338 r/fu/… Propie… 2019-06-19 2019-07-28 2019-06-19  4.70 -74.0 Colo… Cund…
## 2 239339 ZLVRc… Propie… 2019-06-19 2019-10-05 2019-06-19  4.68 -74.1 Colo… Cund…
## 3 239340 FbNuX… Propie… 2019-06-19 2019-11-06 2019-06-19 11.0  -74.8 Colo… Atlá…
## 4 239341 2HU8D… Propie… 2019-06-19 2020-02-14 2019-06-19 11.0  -74.8 Colo… Atlá…
## 5 239342 l7v/D… Propie… 2019-06-19 2019-11-06 2019-06-19 10.9  -74.8 Colo… Atlá…
## 6 239343 sjA/+… Propie… 2019-06-19 2019-07-28 2019-06-19 11.0  -74.8 Colo… Atlá…
## # … with 17 more variables: l3 <chr>, l4 <chr>, l5 <chr>, l6 <chr>,
## #   rooms <int>, bedrooms <int>, bathrooms <int>, surface_total <int>,
## #   surface_covered <int>, price <dbl>, currency <chr>, price_period <chr>,
## #   title <chr>, description <chr>, property_type <chr>, operation_type <chr>,
## #   n <int>
## summary db
#skim(db)

## summary var
summary(db$price)
##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
## 0.000e+00 2.530e+08 4.200e+08 8.416e+08 7.940e+08 8.500e+11

3.3 Visualizar datos

## data + mapping
ggplot(data = db , mapping = aes(x = log(surface_total) , y = log(price)))
## Warning in log(surface_total): NaNs produced

## Warning in log(surface_total): NaNs produced

## + geometry
ggplot(data = db , mapping = aes(x = log(surface_total) , y = log(price))) +
geom_point(col = "red" , size = 0.5)
## Warning in log(surface_total): NaNs produced

## Warning in log(surface_total): NaNs produced
## Warning: Removed 156170 rows containing missing values (`geom_point()`).

## by group
ggplot(data = db , 
       mapping = aes(x = log(surface_total) , y = log(price) , group=as.factor(l3) , color=as.factor(l3))) +
       geom_point()
## Warning in log(surface_total): NaNs produced

## Warning in log(surface_total): NaNs produced
## Warning: Removed 156170 rows containing missing values (`geom_point()`).

Puede guardar el gráfico en un objeto:

## box_plot: estrato1 vs totalHoursWorked
box_plot <- ggplot(data=db , mapping = aes(log(price) , y = as.factor(l3))) + 
            geom_boxplot() 
box_plot
## Warning: Removed 132 rows containing non-finite values (`stat_boxplot()`).

## add theme
box_plot +  labs(x="Log(Precio)" , y="Ciudad") + theme_test()
## Warning: Removed 132 rows containing non-finite values (`stat_boxplot()`).

3.4 Transformaciones

3.4.1 Centrado y escalado
h_bathrooms = ggplot() + geom_histogram(data=db , aes(x=bathrooms) , fill="#99FF33" , alpha=0.5)
h_bathrooms
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## Warning: Removed 31736 rows containing non-finite values (`stat_bin()`).

db = db %>% mutate(esc_bathrooms = scale(bathrooms))

h_bathrooms + geom_histogram(data=db , aes(x=esc_bathrooms) , fill="#FF0066" , alpha=0.5)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## Warning: Removed 31736 rows containing non-finite values (`stat_bin()`).
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## Warning: Removed 31736 rows containing non-finite values (`stat_bin()`).

3.4.2 Lidiar con outliers
quantile(x=db$surface_total , na.rm=T)
##     0%    25%    50%    75%   100% 
##    -36     74    115    214 198000
IQR(x=db$surface_total , na.rm=T)
## [1] 140
iqr <- IQR(x=db$surface_total , na.rm=T)

db_out <- db %>% subset(surface_total <= 2*iqr | is.na(surface_total)==T)

cat("¡Elimina las NA!")
## ¡Elimina las NA!
quantile(x=db_out$surface_total , na.rm=T)
##   0%  25%  50%  75% 100% 
##  -36   68   98  148  280
nrow(db) - nrow(db_out)
## [1] 14575

3.5 Crear, modificar y eliminar variables

3.5.1 Variables dummy
db = db %>% 
     mutate(surface_total_out = ifelse(test = surface_total > 4*iqr, 
                               yes = 1, 
                               no = 0))
table(db$surface_total_out)
## 
##     0     1 
## 77174  6000
3.5.2 Variables categoricas
q = quantile(db$surface_total_out , na.rm=T)
q
##   0%  25%  50%  75% 100% 
##    0    0    0    0    1
db = db %>% 
     mutate(surface_q = case_when(surface_total_out < q[2] ~ "Q-1", 
                                  surface_total_out >= q[2] & surface_total_out < q[3] ~ "Q-2", 
                                  surface_total_out >= q[3] & surface_total_out < q[4] ~ "Q-3", 
                                  surface_total_out >= q[4] ~ "Q-4"))
table(db$surface_q)
## 
##   Q-4 
## 83174
3.4.4 Mantener solo algunas variables
## select: delete a variable
head(db)
## # A tibble: 6 × 30
##      V1 id      ad_type start_date end_date   created_on   lat   lon l1    l2   
##   <int> <chr>   <chr>   <IDate>    <IDate>    <IDate>    <dbl> <dbl> <chr> <chr>
## 1     1 hAv2f6… Propie… 2019-09-04 2020-03-26 2019-09-04  4.58 -74.2 Colo… Cund…
## 2     2 xj4oZf… Propie… 2019-09-04 2020-07-17 2019-09-04 11.0  -74.8 Colo… Atlá…
## 3     3 6vaUZG… Propie… 2019-09-04 2020-01-31 2019-09-04  6.25 -75.6 Colo… Anti…
## 4     4 ia6a/X… Propie… 2019-09-04 2020-07-17 2019-09-04 11.0  -74.8 Colo… Atlá…
## 5     5 Fn7zE7… Propie… 2019-09-04 9999-12-31 2019-09-04  4.61 -74.1 Colo… Cund…
## 6     6 vfkDDN… Propie… 2019-09-04 2020-07-17 2019-09-04 11.0  -74.8 Colo… Atlá…
## # … with 20 more variables: l3 <chr>, l4 <chr>, l5 <chr>, l6 <chr>,
## #   rooms <int>, bedrooms <int>, bathrooms <int>, surface_total <int>,
## #   surface_covered <int>, price <dbl>, currency <chr>, price_period <chr>,
## #   title <chr>, description <chr>, property_type <chr>, operation_type <chr>,
## #   n <int>, esc_bathrooms <dbl[,1]>, surface_total_out <dbl>, surface_q <chr>
db %>% select(-V1)
## # A tibble: 239,343 × 29
##    id     ad_type start_date end_date   created_on   lat   lon l1    l2    l3   
##    <chr>  <chr>   <IDate>    <IDate>    <IDate>    <dbl> <dbl> <chr> <chr> <chr>
##  1 hAv2f… Propie… 2019-09-04 2020-03-26 2019-09-04  4.58 -74.2 Colo… Cund… Bogo…
##  2 xj4oZ… Propie… 2019-09-04 2020-07-17 2019-09-04 11.0  -74.8 Colo… Atlá… Barr…
##  3 6vaUZ… Propie… 2019-09-04 2020-01-31 2019-09-04  6.25 -75.6 Colo… Anti… Mede…
##  4 ia6a/… Propie… 2019-09-04 2020-07-17 2019-09-04 11.0  -74.8 Colo… Atlá… Barr…
##  5 Fn7zE… Propie… 2019-09-04 9999-12-31 2019-09-04  4.61 -74.1 Colo… Cund… Bogo…
##  6 vfkDD… Propie… 2019-09-04 2020-07-17 2019-09-04 11.0  -74.8 Colo… Atlá… Barr…
##  7 jKz6w… Propie… 2019-09-04 9999-12-31 2019-09-04 11.0  -74.8 Colo… Atlá… Barr…
##  8 Fb1fk… Propie… 2019-09-04 2020-02-15 2019-09-04 11.0  -74.8 Colo… Atlá… Barr…
##  9 go9wq… Propie… 2019-09-04 2019-10-08 2019-09-04  6.25 -75.6 Colo… Anti… Mede…
## 10 pR+Qq… Propie… 2019-09-04 2020-05-15 2019-09-04  6.25 -75.6 Colo… Anti… Mede…
## # … with 239,333 more rows, and 19 more variables: l4 <chr>, l5 <chr>,
## #   l6 <chr>, rooms <int>, bedrooms <int>, bathrooms <int>,
## #   surface_total <int>, surface_covered <int>, price <dbl>, currency <chr>,
## #   price_period <chr>, title <chr>, description <chr>, property_type <chr>,
## #   operation_type <chr>, n <int>, esc_bathrooms <dbl[,1]>,
## #   surface_total_out <dbl>, surface_q <chr>
## select variable: by patter name 
db %>% select(starts_with("l1"))
## # A tibble: 239,343 × 1
##    l1      
##    <chr>   
##  1 Colombia
##  2 Colombia
##  3 Colombia
##  4 Colombia
##  5 Colombia
##  6 Colombia
##  7 Colombia
##  8 Colombia
##  9 Colombia
## 10 Colombia
## # … with 239,333 more rows
db %>% select(id,contains("surface"))
## # A tibble: 239,343 × 5
##    id                       surface_total surface_covered surface_tota…¹ surfa…²
##    <chr>                            <int>           <int>          <dbl> <chr>  
##  1 hAv2f68Zh76gc8Y76dDK5A==            NA             350             NA <NA>   
##  2 xj4oZfMeI/bzfOLsZNloeQ==           826             626              1 Q-4    
##  3 6vaUZGrqA+nV75QQ+m3akg==         15850              NA              1 Q-4    
##  4 ia6a/XwU0DNFRz+dMIKbcQ==           489              NA              0 Q-4    
##  5 Fn7zE7rbRzt/2xPFyaiiSw==           727            2800              1 Q-4    
##  6 vfkDDN6uhpCeWdLjQmhNbA==          1800            1800              1 Q-4    
##  7 jKz6wjiUmwJtnJC0R/sZtw==            NA              62             NA <NA>   
##  8 Fb1fkjHrw6UoyvRa/zaa/Q==            NA              68             NA <NA>   
##  9 go9wq1m/BM6mplBvqIVK3g==           103             103              0 Q-4    
## 10 pR+QqJXd61KOIJyh+8SW8A==            89              89              0 Q-4    
## # … with 239,333 more rows, and abbreviated variable names ¹​surface_total_out,
## #   ²​surface_q
## select variable: by class
db %>% select_if(is.character)
## # A tibble: 239,343 × 15
##    id          ad_type l1    l2    l3    l4    l5    l6    curre…¹ price…² title
##    <chr>       <chr>   <chr> <chr> <chr> <chr> <chr> <chr> <chr>   <chr>   <chr>
##  1 hAv2f68Zh7… Propie… Colo… Cund… Bogo… "Zon… "Ciu… ""    COP     ""      Casa…
##  2 xj4oZfMeI/… Propie… Colo… Atlá… Barr… ""    ""    ""    COP     ""      Casa…
##  3 6vaUZGrqA+… Propie… Colo… Anti… Mede… "Can… ""    ""    COP     ""      Lote…
##  4 ia6a/XwU0D… Propie… Colo… Atlá… Barr… ""    ""    ""    COP     ""      Lote…
##  5 Fn7zE7rbRz… Propie… Colo… Cund… Bogo… "Zon… "San… ""    COP     ""      Edif…
##  6 vfkDDN6uhp… Propie… Colo… Atlá… Barr… ""    ""    ""    COP     ""      Bode…
##  7 jKz6wjiUmw… Propie… Colo… Atlá… Barr… ""    ""    ""    COP     ""      Apar…
##  8 Fb1fkjHrw6… Propie… Colo… Atlá… Barr… ""    ""    ""    COP     ""      Apar…
##  9 go9wq1m/BM… Propie… Colo… Anti… Mede… "La … ""    ""    COP     ""      Casa…
## 10 pR+QqJXd61… Propie… Colo… Anti… Mede… "La … ""    ""    COP     ""      Apar…
## # … with 239,333 more rows, 4 more variables: description <chr>,
## #   property_type <chr>, operation_type <chr>, surface_q <chr>, and abbreviated
## #   variable names ¹​currency, ²​price_period

References

  • Colin Gillespie and Robin Lovelace, 2017. Efficient R Programming, A Practical Guide to Smarter Programming [Avaiable here]

    • Cap. 3: Efficient programming

    • Cap. 4: Efficient programming

  • Kuhn, M., & Johnson, K. (2013). Applied predictive modeling (Vol. 26, p. 13). New York: Springer. [Avaiable here]

    • Cap. 3: Data Pre-processing