Ejercicio práctico 2: Analisis de Base de datos sin conocer

Base de datos en el siguientes links:

#Importamos la base de datos
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union

Cuántas observaciones hay por lealtad?

Cuántas observaciones hay por lealtad y genero?

Cuántos casas existen en la base de datos?

Existen varitas que se repitan? cuáles?

Existen variables con missings?

Existen variables outliers?

Etapas de Team Data Science Process

  1. Business understanding:
  1. Data acquisition and understanding: Exploración de la base de datos.
  1. Modeling
  2. Deployment
  3. Customer acceptance

Clase 5: Creación de variables, Análisis Univariado, Multivariado, creación de funciones y estructuras de control

url <- "https://raw.githubusercontent.com/edojimenez/r_datascience/main/titanic.csv"
titanic<-read.csv(url)

Creación de variables

El comando mutate sirve para crear nuevas variables.

Crearemos una variable para identificar a las personas que están viajando solas

#Primero creamos una variable para saber con cuantas personas esta viajando

#Ahora crearemos las variables 

SibSP : Numeric - indica el número de hermanos o esposos abordo con el pasajero. Parch : Numeric - indica el número de padres abordo

Cuál es la tasa de sobrevivencia de las personas que viajan solas?

Cuál es la tasa de sobrevivencia de las personas que viajan sola por sexo? y por clase?

Cuál es el promedio de la edad de las personas que viajan solas?

Creación de variables: Intervalos

titanic<- titanic %>% mutate(intervalo_edad= case_when(is.na(Age) ~ "Faltante",
                                           Age > 0 & Age < 13 ~ "Niño",
                                           Age > 12 & Age < 20 ~ "Adolescente",
                                           Age > 19 & Age < 36 ~ "Adulto Joven",
                                           Age > 35 & Age < 56  ~  "Mediana Edad",
                                           TRUE ~ "Adulto Mayor"))

titanic$intervalo_edad<- as.factor(titanic$intervalo_edad)

¿Quá se imaginan representa case_when en terminos de funciones lógicas? his function allows you to vectorise multiple if and else if statements. It is an R equivalent of the SQL CASE WHEN statement. case_when

Creación de etiquetas

titanic$Embarked  <- factor(titanic$Embarked ,
levels = c("C","Q","S"),
labels = c("Cherbourg", "Queensland", "Southhampton"))

Análisis univariado

La principal herramienta de analisis univariado es un histograma

#install.packages('DataExplorer') 
library(DataExplorer)
titanic_numeric<-select_if(titanic, is.numeric)
plot_histogram(titanic_numeric)

Análisis bivariado

FALSE Registered S3 method overwritten by 'GGally':
FALSE   method from   
FALSE   +.gg   ggplot2
FALSE `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
FALSE `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
FALSE `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
FALSE `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
FALSE `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
FALSE `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
FALSE `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
FALSE `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
FALSE `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
FALSE `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
FALSE `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
FALSE `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
FALSE `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
FALSE `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
FALSE `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
FALSE `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
FALSE `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
FALSE `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
FALSE `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
FALSE `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
FALSE `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Creación de funciones

Las funciones tienen las siguiente entructura:

function.name <- function(arguments) { computations on the arguments some other code }

myFirstFun<-function(n) { # Compute the square of integer n n*n
}

myFirstFun<-function(n)
{
  # Compute the square of integer `n`
  n*n   
}
sum.of.squares <- function(x,y) {
  x^2 + y^2
}
sum.of.squares(2,3)
## [1] 13
addPercent <- function(x){
 percent <- round(x * 100, digits = 1)
 result <- paste(percent, "%")
 return(result)
}

addPercent(5)
## [1] "500 %"

Ejercicio de función (¿Cuál es el error?)

print_names <- function(x){
  
  print(x)
}

print_names("Data Science es muy genial")
## [1] "Data Science es muy genial"

Ejercicio de función 2

Vamos a calcular la media armónica, que corresponde al reciproco de la media aritmética del reciproco de la data, en otras palabras:

\[harmonic\_mean(x)=\frac{1}{arithmetic\_mean(\frac{1}{x})}\]

[Media Armónica: Construcción geométrica para hallar las medias aritmética (A), cuadrática (Q), geométrica (G) y armónica (H) de dos números a y b.En matemáticas y estadística, la media aritmética, también llamada promedio o media,es un conjunto finito de números, es el valor característico de una serie de datos cuantitativos, objeto de estudio que parte del principio de la esperanza matemática o valor esperado, se obtiene a partir de la suma de todos sus valores dividida entre el número de sumandos. Cuando el conjunto es una muestra aleatoria, recibe el nombre de media, siendo uno de los principales estadísticos muestrales.]

source

Paso 1

Bajar la base de datos que usaremos para el ejercicio. No olvidar las librerias que usaremos para este ejercicio, readr-> dplyr->

   library(readr) # readr
   library(dplyr) # dplyr
link <- "https://raw.githubusercontent.com/edojimenez/r_datascience/main/SP500_financial_data.csv"
std_and_poor500 <- read_csv(link) # ¿Cuál es el código para leer csv separados por coma?
## 
## ── Column specification ────────────────────────────────────────────────────────
## cols(
##   Symbol = col_character(),
##   Name = col_character(),
##   Sector = col_character(),
##   ROE = col_double(),
##   ROA = col_double(),
##   PB_ratio = col_double(),
##   PE_ratio = col_double(),
##   Net_margin = col_double(),
##   Asset_turn = col_double(),
##   Div_payout_ratio = col_double(),
##   LT_debt_to_equity = col_double(),
##   Equity_to_assets = col_double(),
##   Current_ratio = col_double(),
##   Div_yield = col_double(),
##   Capex_to_revenue = col_double()
## )

El primer paso es construir una función que calcule el reciproco de un número.

\[recíproco = \frac{1}{x} \]

reciproco <-  function(x){
  1/x
}

Luego usamos la función anterior y creamos una función con el calculo final de la media armónica.

\[harmonic\_mean(x)=\frac{1}{arithmetic\_mean(\frac{1}{x})}\]

calc_harmonic_mean <- function(x) {
  x %>%
    reciproco() %>%
    mean() %>%
    reciproco()
}

Finalmente usemos la función que hemos creado y probemos con la base de datos de standard and poor 500 (agrupemos por sector):

std_and_poor500 %>% 
  # Group by sector
  group_by(Sector) %>% 
  # Summarize, calculating harmonic mean of P/E ratio
  summarize(hmean_pe_ratio = calc_harmonic_mean(PE_ratio))

Estructura de Control

Las estructuras de control en R le permiten controlar el flujo de ejecución de una serie de expresiones R. Básicamente, las estructuras de control le permiten poner algo de “lógica” en su código R, en lugar de simplemente ejecutar siempre el mismo código R cada vez. Las estructuras de control le permiten responder a entradas o características de los datos y ejecutar diferentes expresiones R en consecuencia.

¿Cuáles son las funciones de control que existe?

if else

La combinación if-else es probablemente la estructura de control más utilizada en R (o quizás en cualquier lenguaje). Esta estructura le permite probar una condición y actuar en función de si es verdadera o falsa.

Primer Caso: La condicion realiza una accion cuando es verdad y otra cuando es falso

#if(<condition>) {
        ## do something
#} 
#else {
        ## do something else
#}

Ejemplo

quantity <-  15
# Set the is-else statement
if (quantity > 20) {
    print('You sold a lot!')
} else {
    print('Not enough for today')  
}
## [1] "Not enough for today"

Segundo caso: Existen diversas condiciones

#if(<condition1>) {
        ## do something
#} else if(<condition2>)  {
        ## do something different
#} else {
        ## do something different
#}

Ejemplo

quantity <-  25
# Create multiple condition statement
if (quantity <20) {
      print('Not enough for today')
} else if (quantity > 20  &quantity <= 30) {
     print('Average day')
} else {
      print('What a great day!')
}
## [1] "Average day"

Loops: For.

Su objetivo es ejecutar un loop una cantidad fija de veces.

Primer Caso: “For” simple

#for (variable in secuencia) { 
#"expresion"
#}

Ejemplo

for(i in 2000:2010) {
  print(i)
 }
## [1] 2000
## [1] 2001
## [1] 2002
## [1] 2003
## [1] 2004
## [1] 2005
## [1] 2006
## [1] 2007
## [1] 2008
## [1] 2009
## [1] 2010
 x <- c("a", "b", "c", "d")
 
 for(i in 1:4) {
         ## Print out each element of 'x'
         print(x[i])  
 }
## [1] "a"
## [1] "b"
## [1] "c"
## [1] "d"

Segundo caso: for anidado

Los loops anidados son comúnmente necesarios para estructuras de datos multidimensionales o jerárquicas (por ejemplo, matrices, listas). Sin embargo, ten cuidado con la anidación. Anidar más allá de 2 a 3 niveles a menudo dificulta la lectura / comprensión del código

x <- matrix(1:6, 2, 3)

for(i in seq_len(nrow(x))) {
        for(j in seq_len(ncol(x))) {
                print(x[i, j])
        }   
}
## [1] 1
## [1] 3
## [1] 5
## [1] 2
## [1] 4
## [1] 6

Loops: while

Su objetivo es ejecutar un loop cuando se cumpla una condición.Mientras que los bucles comienzan probando una condición. Si es cierto, ejecutan el cuerpo del bucle. Una vez que se ejecuta el cuerpo del bucle, la condición se prueba nuevamente, y así sucesivamente, hasta que la condición sea falsa, después de lo cual se cierra el bucle.

#while (condition) {
#    expression
#}

Ejemplo

 count <- 0
 while(count < 10) {
         print(count)
         count <- count + 1
 }
## [1] 0
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7
## [1] 8
## [1] 9

Hay ciertas situaciones donde no voy a querer que el loop realize todas las iteraciones. En esos casos, me sirve realizar un Break o Next Statement.

break statement.

Es una forma de salida de la rutina.

number <- 1:10

for (val in number)  {
  if (val == 5)  {
    print(paste("El loop terminara en el valor =  ", val))
    break
  }
  print(paste("El valor es :  ", val))
}
## [1] "El valor es :   1"
## [1] "El valor es :   2"
## [1] "El valor es :   3"
## [1] "El valor es :   4"
## [1] "El loop terminara en el valor =   5"

Ejemplo 2

number <- 10

while (number > 0)  {
  if (number == 3)  {
    print(paste("Coming out from While loop Where number =  ", number))
    break
  }
  print(paste("Values are :  ", number))
  number = number - 1
}
## [1] "Values are :   10"
## [1] "Values are :   9"
## [1] "Values are :   8"
## [1] "Values are :   7"
## [1] "Values are :   6"
## [1] "Values are :   5"
## [1] "Values are :   4"
## [1] "Coming out from While loop Where number =   3"

next statement.

Permite seguir la interccion pero saltanto algun elemento sin terminarlo.

x <- 1:5
for (val in x) {
if (val == 5){
next
}
print(val)
}
## [1] 1
## [1] 2
## [1] 3
## [1] 4

Ejercicio extra con if

# micr
micr <- 105.67

# Veamos 
if() {  # aquí la condición es que micr sea menos de 55
    print("Comprar!") # cp,`rar
} else if( ){ # aqui la condición es que micr este sea 55 o mas, o menos de 75
    print("Hacer Nada!")
} else () { # aquí es en el caso que micr sea mayor igual a 75
    print("vender!")
}
## Error: <text>:5:4: unexpected ')'
## 4: # Veamos 
## 5: if()
##       ^

Ejercicio extra con while

# Crear la variable speed
speed <- 64

# Trabajemos un while con varias capas
while ( {  # mientras la velocidad sea mayor a 30
  print(paste("Tu velocidad es",speed))
  if () { # la velocdad es mayor a 48
  print(paste("Reduce la velocidad de inmediato!"))
  speed <- speed  # restemos 11 a la velocidad
  } else {
  print(paste("Baja la velocidad!"))  
  speed <- speed  # restemos 6 a velocidad
  }
}
## Error: <text>:7:7: unexpected ')'
## 6:   print(paste("Tu velocidad es",speed))
## 7:   if ()
##          ^

Familia Apply

Realiza una misma funcion a todas las variables de una base de datos

apply(X, MARGIN, FUN)

# Creemos una Matriz de 5x6
X <- matrix(rnorm(30), nrow=5, ncol=6)

# los valores de cada columna con apply()
apply(X, 2, sum)
## [1]  0.4768381 -2.8418374  3.8657526  2.7804332 -1.4413256  5.9488244
# Creemos una lista de matrices
A <- matrix( 1:9, nrow=3, ncol=3, byrow=FALSE)
B <- matrix(4:15, nrow=4, ncol=3, byrow=FALSE)
C <- matrix(8:10, nrow=3, ncol=2, byrow=FALSE)

MyList <- list(A,B,C)

# Extraigamos la segunda columna de `MyList` con el operador de selección`[` con `lapply () `
lapply(MyList,"[", , 2)
## [[1]]
## [1] 4 5 6
## 
## [[2]]
## [1]  8  9 10 11
## 
## [[3]]
## [1]  8  9 10
# Extraigamos la primera fila de `MyList`
lapply(MyList,"[", 1, )
## [[1]]
## [1] 1 4 7
## 
## [[2]]
## [1]  4  8 12
## 
## [[3]]
## [1] 8 8

Un ejemplo puede ayudar a comprender esto: digamos que desea repetir la operación de extracción de un solo elemento como en el último ejemplo, pero ahora tome el primer elemento de la segunda fila (índices 2 y 1) para cada matriz. Aplicar la función lapply()nos daría una lista a menos que pase simplify = FALSE como parámetro a sapply(). Luego, se devolverá una lista. Vea cómo funciona en el fragmento de código a continuación:

# Return a list with `lapply()`
lapply(MyList,"[", 2, 1 )
## [[1]]
## [1] 2
## 
## [[2]]
## [1] 5
## 
## [[3]]
## [1] 9
# Return a vector with `sapply()`
sapply(MyList,"[", 2, 1 )
## [1] 2 5 9
# Return a list with `sapply()`
sapply(MyList,"[", 2, 1, simplify=F)
## [[1]]
## [1] 2
## 
## [[2]]
## [1] 5
## 
## [[3]]
## [1] 9
# Return a vector with `unlist()`
unlist(lapply(MyList,"[", 2, 1 ))
## [1] 2 5 9

Existen más funciones dentro de la familya apply:

Estas las veremos más adelante. Pero si quieren investigar, aqui hay un link

clase de hoy