Interfaz para usar R

Esta compuesto por una interfase que sirve para tener una interacción más fluida con el programa.

  • Ventana 1: Es el editor de sintaxis: se trata del lugar donde editamos la sintaxis para posteriormente ejecutarla. Al escribir allí no sucederá nada, a no ser que se apriete algún botón para ejecutar los comandos o la tecla ctrl+enter.

  • Ventana 2: Entorno de trabajo:en este lugar se muestra el conjunto de datos y los “objetos” (resultados, variables, gráficos, etc.) que se almacenan al ejecutar diferentes análisis.

  • Ventana 3: Esta compuesta por varias pestañas:

    • Files: permite ver el historial de archivos trabajados con el programa.
    • Plots:permite visualizar los gráficos que se generen.
    • Packages: permite ver los paquetes descargados y guardados en el disco duro así como gestionar su instalación o actualización.
  • Ventana 4: Es la consola. Corresponde a lo que sería el software R en su versión básica. Allí el software ejecuta las operaciones realizadas desde el editor de sintaxis.

Elementos fundamentales del uso de sintaxis

Interactuará con el programa mediante códigos. La sintaxis es un conjunto de códigos. Su uso en R es bastante intuitivo y sigue un patrón lógico. De modo general el lenguaje de programación de R (o sintaxis) sigue la siguiente estructura básica:

  • Objeto:Sirve para crear por medio de un nombre una variable.
  • Asignador:Expresa que todo lo que esta a la derecha de la flecha se guardara en el Objeto.
  • Funcion:Por medio de argumentos permite especificar lo que queremos que se realice .

Operaciones básicas

2+2 #suma
## [1] 4
8-4 #resta
## [1] 4
9*7 #multiplicación
## [1] 63
a<-52 #asignación de variables
b<-93 #asignación de variables
sin(a) #seno
## [1] 0.9866276
cos(b) #coseno
## [1] 0.3174287
exp(b-a) #exponencial
## [1] 6.398435e+17
log(a+b) #logaritmo
## [1] 4.976734
log(a*b) #logaritmo
## [1] 8.483843

Comentarios.

  • La forma de colocar comentarios varia dependiendo del lenguaje que estemos usando para escribir nuestro código. Sin embargo, varios lenguajes usan el ‘hashtag’ para indicar que lo que se encuentra a la derecha es un comentario y la computadora no debe interpretarlo como un comando.
# Este es un comentario

Ayuda

  • R dispone de un sistema de ayuda que se puede invocar bien desde el menú que aparece al iniciar el programa (opción Help), bien invocando la ayuda en línea.
#Ejemplo de ayuda para la función"mean".
# help(mean)
# ?mean 

Cargar paqueterias en R

  • Un paquete son muchos archivos juntos en un mismo lugar, como funciones en R, código o datos. De esta forma, Los paquetes permiten hacer más cosas con R ### Para instalar paquetes, podemos utilizar la consola de R o la interfaz de RStudio.
#install.packages("ggplot2")  

Para «activar» o utilizar nuestros paquetes podemos ejecutar el comando

#library(ggplot2)

Creacion de vectores.

Un vector es la estructura de datos más sencilla en R. Un vector es una colección de uno o más datos del mismo tipo.

  • Tipo. Un vector tiene el mismo tipo que los datos que contiene. Si tenemos un vector que contiene datos de tipo numérico, el vector será también de tipo numérico.

  • Largo. Es el número de elementos que contiene un vector. El largo es la única dimensión que tiene esta estructura de datos.

  • Atributos. Los vectores pueden tener metadatos de muchos tipos, los cuales describen características de los datos que contienen.

Los vectores en R son objetos de una única dimensión que puede contener datos numéricos, cadena de caracteres o datos lógicos, entre otros. Esencialmente son uno de los elementos básicos en la estructura de los datos en R. Pueden contener solo elementos de un solo tipo, aunque su tamaño podría ser ilimitado.

 #vector de un solo elemento


vec0<-1:8 #otra forma de crear un vector

vec9<-seq(3,27, length.out = 8)

vec1<-c(1,2,3,4,5) # vector númerico de 6 elementos

vec2<-c("arbol", "casa", "persona") #vector de cadena de texto

vec3<-c(TRUE, TRUE, FALSE, FALSE, TRUE) #vector logico

Algebra de vectores.

Realizar operaciones aritméticas (suma, resta, multiplicación y división) con vectores es muy sencillo.Ahora vamos a realizar operaciones aritméticas entre estos dos vectores, incluyendo la suma, la resta, la multiplicación y la división. Es muy importante destacar que estas operaciones aritméticas se producen entre los valores situados en una misma posición dentro de los vectores respectivos. Es devir, el primer elemento del Vector_1 (1) se relaciona con el primer elemento del Vector_2 (4). Si fuese una suma, el resultado de esta primer elemento sería 5. Este proceso se repite sucesivamente con el resto de los elementos de los vectores.

vec1*3 #operación punto vector
## [1]  3  6  9 12 15
vec1/2
## [1] 0.5 1.0 1.5 2.0 2.5
v<-vec0+vec9 #suma de vectores
v
## [1]  4.000000  8.428571 12.857143 17.285714 21.714286 26.142857 30.571429
## [8] 35.000000
k<-vec9-vec0 #sustracción de vectores
k
## [1]  2.000000  4.428571  6.857143  9.285714 11.714286 14.142857 16.571429
## [8] 19.000000

Matrices

Creacion matrices en R. Con la función matrix(). La función matrix() acepta dos argumentos, nrow y ncol. Con ellos especificamos el número de renglones y columnas que tendrá nuestra matriz. La función matrix permite una matriz en RStudio o R base, pasando como input un vector numérico, de caracteres o lógico Es posible establecer el número de columnas o el número de filas con los argumentos ncol y nrow,

matrix(1:12) #matriz 12*1
##       [,1]
##  [1,]    1
##  [2,]    2
##  [3,]    3
##  [4,]    4
##  [5,]    5
##  [6,]    6
##  [7,]    7
##  [8,]    8
##  [9,]    9
## [10,]   10
## [11,]   11
## [12,]   12
matrix(1:12, nrow = 3, ncol = 4) #matriz 3*4
##      [,1] [,2] [,3] [,4]
## [1,]    1    4    7   10
## [2,]    2    5    8   11
## [3,]    3    6    9   12

Otro procedimiento para crear matrices es la unión vectores con las siguientes funciones:

  • cbind() para unir vectores, usando cada uno como una columna.
  • rbind() para unir vectores, usando cada uno como un renglón.
vector_1 <- 1:4
vector_2 <- 5:8
vector_3 <- 9:12
vector_4 <- 13:16
matriz <- rbind(vector_1, vector_2, vector_3, vector_4) #ejemplo de unión por renglon
matriz
##          [,1] [,2] [,3] [,4]
## vector_1    1    2    3    4
## vector_2    5    6    7    8
## vector_3    9   10   11   12
## vector_4   13   14   15   16

Ten en cuenta que puedes usar cualquier tipo de datos dentro de una matriz, siempre que sean homogéneos.

Algebra de matrices

M1<-matrix(c(1,2,3,4,5,6,7,8,9),nrow = 3)
M2<-matrix(c(9,8,7,6,5,4,3,2,1),nrow = 3)
M2%*%M1 #Multplicación de matrices. Para multiplicar matrices, utilizar %*%
##      [,1] [,2] [,3]
## [1,]   30   84  138
## [2,]   24   69  114
## [3,]   18   54   90
t(M2) #Transpuesta de una matriz
##      [,1] [,2] [,3]
## [1,]    9    8    7
## [2,]    6    5    4
## [3,]    3    2    1
diag(M1) #se crea una matriz diagonal con elementos de ka matriz en la diagonal principal.
## [1] 1 5 9
matriz[3,2] #Seleccionar un elemento en una fila y columna en especifico.
## vector_3 
##       10
matriz[1:2,2:3] #Selecciona ciertao rango de columnas y filas de una matriz.
##          [,1] [,2]
## vector_1    2    3
## vector_2    6    7

Sistemas de ecuaciones con solución matricial

La función solve permite obtener la inversa de una matriz cuando sólo se la da un argumento, y permite resolver sistemas de ecuaciones lineales cuando se le dan dos argumentos.

coeficiente<-matrix(c(3,2,1,5,3,4,1,1,-1),ncol=3,byrow=T)
respuesta<-c(1,2,1)

solve(coeficiente,respuesta)
## [1] -4  6  1

También podemos crear una función más compleja para resolver un sistema de ecuaciónes y una respuesta más personalizada.

res_ecua<-function(matriz,respu){
solve(matriz,respu)}

res_ecua(coeficiente,respuesta)
## [1] -4  6  1
res_ecua2<-function(x,y){
  solucion<-solve(x,y)
  return(paste0("La solución del sistema es: x=",solucion[1]))
}
res_ecua2(y=respuesta,x=coeficiente)
## [1] "La solución del sistema es: x=-3.99999999999999"
coef2<-matrix(c(5,-3,-1,1,4,-6,2,3,4),ncol=3,byrow=TRUE)
resp2<-c(1,-1,9)

res_ecua2(y=resp2,x=coef2)
## [1] "La solución del sistema es: x=1"
res_ecua3<-function(x,y){
  solucion<-solve(x,y)
  return(paste0("La solución del sistema es: x=",solucion[1],",",
  "La solución del sistema es: y=",solucion[2],",",  
  "La solución del sistema es: z=",solucion[3]) )
}
res_ecua3(y=resp2,x=coef2)
## [1] "La solución del sistema es: x=1,La solución del sistema es: y=1,La solución del sistema es: z=1"
res_ecua3(y=respuesta,x=coeficiente)
## [1] "La solución del sistema es: x=-3.99999999999999,La solución del sistema es: y=5.99999999999999,La solución del sistema es: z=0.999999999999997"
res_ecua4<-function(x,y){
  solucion<-solve(x,y)
  return(cat("La solución del sistema es:","\n",
  "x=", solucion[1],"\n",
             "y=",solucion[2],"\n",
             "z=",solucion[3]) )
}
res_ecua4(y=respuesta,x=coeficiente)
## La solución del sistema es: 
##  x= -4 
##  y= 6 
##  z= 1
solve(coef2,resp2)
## [1] 1 1 1

Data Frames.

Los data frames son estructuras de datos de dos dimensiones (rectangulares) que pueden contener datos de diferentes tipos, por lo tanto, son heterogéneas. Esta estructura de datos es la más usada para realizar análisis de datos. Podemos entender a los data frames como una versión más flexible de una matriz. Mientras que en una matriz todas las celdas deben contener datos del mismo tipo, los renglones de un data frame admiten datos de distintos tipos, pero sus columnas conservan la restricción de contener datos de un sólo tipo.

Creacion de un data frame.

Para crear un data frame usamos la función data.frame(). Esta función nos pedirá un número de vectores igual al número de columnas que deseemos. Todos los vectores que proporcionemos deben tener el mismo largo.

mi_df <- data.frame(
  "entero" = 1:4, 
  "factor" = c("a", "b", "c", "d"), 
  "numero" = c(1.2, 3.4, 4.5, 5.6),
  "cadena" = as.character(c("a", "b", "c", "d"))
)
mi_df
##   entero factor numero cadena
## 1      1      a    1.2      a
## 2      2      b    3.4      b
## 3      3      c    4.5      c
## 4      4      d    5.6      d
dim(mi_df) #dimensión de filas y columnas
## [1] 4 4
length(mi_df) #El largo de un data frame por columnas
## [1] 4
names(mi_df) #Nos permite ver los nombres de las columnas
## [1] "entero" "factor" "numero" "cadena"

Propiedades de un data frame.

Al igual que con una matriz, si aplicamos una operación aritmética a un data frame, esta se vectorizará.

Los resultados que obtendremos dependerán del tipo de datos de cada columna. R nos devolverá todas las advertencias que ocurran como resultado de las operaciones realizadas, por ejemplo, aquellas que hayan requerido una coerción.

  • dim(), nrow(), ncol() = Número de filas/columnas.
  • diag() = Diagonal de una matriz
    • = Multiplicación elemento a elemento.
  • %*% =Producto matricial.
  • %o% = Producto exterior
  • %x% Producto de Kronecker
  • cbind(), rbind() Agregar filas/columnas
  • t() Matriz traspuesta
  • solve(A) Inversa de la matriz AA
  • solve(A, b) Solución a Ax = bAx=b
  • eigen() Autovalores y autovectores
  • qr() Descomposición QR
  • chol() Descomposicion de Cholesky
  • svd() Descomposición singular

Análisis exploratorio de datos: Iris e Iris 3

Trabajaremos con un dataset muy conocido en analisis de datos llamado ´ Iris. El dataset se compone de 150 observaciones de flores de la planta iris. Existen tres tipos de clases de flores iris: virginica, setosa y versicolor. Hay 50 observaciones de cada una. Las variables o atributos que se miden de cada flor son: - El tipo de flor como variable categorica. ´ - El largo y el ancho del petalo en cm como variables numericas. ´ - El largo y el ancho del sepalo en cm como variables numericas.

data(iris)#cargar el dataset al workspace
data(iris3)

Por medio de de preguntas informativas podemos darnos cuenta de que tipos de datos se tratan estas dos bases de datos

data(iris)
is.matrix(iris)
## [1] FALSE
is.data.frame(iris) #Es un data.frame
## [1] TRUE
is.list(iris)
## [1] TRUE
is.factor(iris[,5])
## [1] TRUE
is.numeric(iris[,1])
## [1] TRUE
data(iris3)
is.data.frame(iris3)
## [1] FALSE
is.matrix(iris3)
## [1] FALSE
is.list(iris3)
## [1] FALSE
dim(iris3)
## [1] 50  4  3
head(iris3)
## , , Setosa
## 
##      Sepal L. Sepal W. Petal L. Petal W.
## [1,]      5.1      3.5      1.4      0.2
## [2,]      4.9      3.0      1.4      0.2
## [3,]      4.7      3.2      1.3      0.2
## [4,]      4.6      3.1      1.5      0.2
## [5,]      5.0      3.6      1.4      0.2
## [6,]      5.4      3.9      1.7      0.4
## 
## , , Versicolor
## 
##      Sepal L. Sepal W. Petal L. Petal W.
## [1,]      7.0      3.2      4.7      1.4
## [2,]      6.4      3.2      4.5      1.5
## [3,]      6.9      3.1      4.9      1.5
## [4,]      5.5      2.3      4.0      1.3
## [5,]      6.5      2.8      4.6      1.5
## [6,]      5.7      2.8      4.5      1.3
## 
## , , Virginica
## 
##      Sepal L. Sepal W. Petal L. Petal W.
## [1,]      6.3      3.3      6.0      2.5
## [2,]      5.8      2.7      5.1      1.9
## [3,]      7.1      3.0      5.9      2.1
## [4,]      6.3      2.9      5.6      1.8
## [5,]      6.5      3.0      5.8      2.2
## [6,]      7.6      3.0      6.6      2.1
head(iris)
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         3.5          1.4         0.2  setosa
## 2          4.9         3.0          1.4         0.2  setosa
## 3          4.7         3.2          1.3         0.2  setosa
## 4          4.6         3.1          1.5         0.2  setosa
## 5          5.0         3.6          1.4         0.2  setosa
## 6          5.4         3.9          1.7         0.4  setosa

Por medio de la función mean podemos obtener promedio de cada flor

#Promedio de Sepal. L de cada flor 
mean(iris3[,1,1]) #Sepal. L de Setosa 
## [1] 5.006
mean(iris3[,1,2]) #Sepal L de versicolor
## [1] 5.936
mean(iris3[,1,3])#Sepal L de Virginica 
## [1] 6.588
mean(iris3[,2,1]) #Sepal. w de Setosa 
## [1] 3.428
mean(iris3[,2,2]) #Sepal w de versicolor
## [1] 2.77
mean(iris3[,2,3])#Sepal w de Virginica 
## [1] 2.974

De igual forma se puede obtener el promedio pero por columna.

#Promedios por columna
prom_setosa<-apply(iris[1:50,-5],2,mean) #Promedios de Setosa
prom_setosa
## Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
##        5.006        3.428        1.462        0.246
prom_versi<-apply(iris[51:100,-5],2,mean) #Promedios de Versicolor
prom_versi
## Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
##        5.936        2.770        4.260        1.326
prom_virgi<-apply(iris[101:150,-5],2,mean) #Promedios de Virginica
prom_virgi
## Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
##        6.588        2.974        5.552        2.026

Podemos crear un data frame que contenga los promedios de cada columna.

promedio_flores<-data.frame(Setosa=prom_setosa,
                            Versicolor=prom_versi,
                            Virginical=prom_virgi)
promedio_flores
##              Setosa Versicolor Virginical
## Sepal.Length  5.006      5.936      6.588
## Sepal.Width   3.428      2.770      2.974
## Petal.Length  1.462      4.260      5.552
## Petal.Width   0.246      1.326      2.026

Apply

En el siguiente data frame estamos usando una función muy util para análisis de datos, apply:

apply aplica una función a todos los elementos de una matriz. El comando apply en R permite aplicar una función a través de una matriz, array o data frame. Puedes hacer esto de varias maneras, dependiendo de cómo configures el argumento MARGIN, que habitualmente puede tomar los valores 1, 2 o c(1, 2).

#Obtener la desviación estandar de cada flor de sus 4 variables
sd_setosa<-apply(iris3[,,1],2,sd)
sd_versi<-apply(iris3[,,2],2,sd)
sd_virgi<-apply(iris3[,,3],2,sd)

#Conjuntar la información
sd_flores<-data.frame(Setosa=sd_setosa,
                      Versicolor=sd_versi,
                      Virginical=sd_virgi)
sd_flores
##             Setosa Versicolor Virginical
## Sepal L. 0.3524897  0.5161711  0.6358796
## Sepal W. 0.3790644  0.3137983  0.3224966
## Petal L. 0.1736640  0.4699110  0.5518947
## Petal W. 0.1053856  0.1977527  0.2746501

Podemos modificar el nombre de las columnas y filas de la siguiente forma.

rownames(sd_flores)<-c("Largo sépalo","Ancho sépalo","Largo pétalo",
                       "Ancho pétalo")
colnames(sd_flores)<-c("Set","Versi","Virgi")
sd_flores
##                     Set     Versi     Virgi
## Largo sépalo 0.3524897 0.5161711 0.6358796
## Ancho sépalo 0.3790644 0.3137983 0.3224966
## Largo pétalo 0.1736640 0.4699110 0.5518947
## Ancho pétalo 0.1053856 0.1977527 0.2746501

Aggregate

En R, puedes usar la función aggregate para calcular resúmenes estadísticos para subconjuntos de datos. Esta función es muy similar a la función tapply pero en este caso también puedes pasar una fórmula o un objeto de serie temporal como entrada y además la salida es un data frame. En este tutorial aprenderás cómo usar la función aggregate en R con varios ejemplos, para agregar filas en base a un factor. La sintaxis de la función aggregate dependerá de los datos de entrada. Hay tres tipos de entrada posibles: un data frame, una fórmula y un objeto de clase serie temporal.

aggregate(Sepal.Length~Species,data=iris,mean)
##      Species Sepal.Length
## 1     setosa        5.006
## 2 versicolor        5.936
## 3  virginica        6.588
aggregate(Sepal.Width~Species,data=iris,mean)
##      Species Sepal.Width
## 1     setosa       3.428
## 2 versicolor       2.770
## 3  virginica       2.974
aggregate(cbind(Sepal.Length,Sepal.Width,Petal.Length,
                Petal.Width)~Species,data=iris,mean)
##      Species Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1     setosa        5.006       3.428        1.462       0.246
## 2 versicolor        5.936       2.770        4.260       1.326
## 3  virginica        6.588       2.974        5.552       2.026
aggregate(cbind(Sepal.Length,Sepal.Width,Petal.Length,
                Petal.Width)~Species,data=iris,summary)
##      Species Sepal.Length.Min. Sepal.Length.1st Qu. Sepal.Length.Median
## 1     setosa             4.300                4.800               5.000
## 2 versicolor             4.900                5.600               5.900
## 3  virginica             4.900                6.225               6.500
##   Sepal.Length.Mean Sepal.Length.3rd Qu. Sepal.Length.Max. Sepal.Width.Min.
## 1             5.006                5.200             5.800            2.300
## 2             5.936                6.300             7.000            2.000
## 3             6.588                6.900             7.900            2.200
##   Sepal.Width.1st Qu. Sepal.Width.Median Sepal.Width.Mean Sepal.Width.3rd Qu.
## 1               3.200              3.400            3.428               3.675
## 2               2.525              2.800            2.770               3.000
## 3               2.800              3.000            2.974               3.175
##   Sepal.Width.Max. Petal.Length.Min. Petal.Length.1st Qu. Petal.Length.Median
## 1            4.400             1.000                1.400               1.500
## 2            3.400             3.000                4.000               4.350
## 3            3.800             4.500                5.100               5.550
##   Petal.Length.Mean Petal.Length.3rd Qu. Petal.Length.Max. Petal.Width.Min.
## 1             1.462                1.575             1.900            0.100
## 2             4.260                4.600             5.100            1.000
## 3             5.552                5.875             6.900            1.400
##   Petal.Width.1st Qu. Petal.Width.Median Petal.Width.Mean Petal.Width.3rd Qu.
## 1               0.200              0.200            0.246               0.300
## 2               1.200              1.300            1.326               1.500
## 3               1.800              2.000            2.026               2.300
##   Petal.Width.Max.
## 1            0.600
## 2            1.800
## 3            2.500

Which

Este comando nos permite encontrar índices (entiéndase números de orden) que cumplen cierta característica.

x <- c(1,5,8,4,6)
x
## [1] 1 5 8 4 6
which(x == 5)
## [1] 2
which(x != 5)
## [1] 1 3 4 5

Creación de funciones personalizadas.

  1. Rango (max-min)
rango<-function(x){max(x)-min(x)}
rango(iris3[,1,1]) #Setosa
## [1] 1.5
apply(iris3[,,1],2,mean)
## Sepal L. Sepal W. Petal L. Petal W. 
##    5.006    3.428    1.462    0.246
apply(iris3[,,1],2,rango) #Columna
## Sepal L. Sepal W. Petal L. Petal W. 
##      1.5      2.1      0.9      0.5
apply(iris3[,,1],1,rango) #fila
##  [1] 4.9 4.7 4.5 4.4 4.8 5.0 4.3 4.8 4.2 4.8 5.2 4.6 4.7 4.2 5.6 5.3 5.0 4.8 5.4
## [20] 4.8 5.2 4.7 4.4 4.6 4.6 4.8 4.6 5.0 5.0 4.5 4.6 5.0 5.1 5.3 4.7 4.8 5.3 4.8
## [39] 4.2 4.9 4.7 4.2 4.2 4.4 4.7 4.5 4.9 4.4 5.1 4.8
aggregate(cbind(Sepal.Length, Sepal.Width, Petal.Length, Petal.Width)~Species,
          data=iris,mean)
##      Species Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1     setosa        5.006       3.428        1.462       0.246
## 2 versicolor        5.936       2.770        4.260       1.326
## 3  virginica        6.588       2.974        5.552       2.026
aggregate(cbind(Sepal.Length, Sepal.Width, Petal.Length, Petal.Width)~Species,
          data=iris,rango)
##      Species Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1     setosa          1.5         2.1          0.9         0.5
## 2 versicolor          2.1         1.4          2.1         0.8
## 3  virginica          3.0         1.6          2.4         1.1
  1. coeficientes de variabilidad sigma/abs(media)
coef_var<-function(x){sd(x)/abs(mean(x))}
apply(iris3[,,1],2,mean)
## Sepal L. Sepal W. Petal L. Petal W. 
##    5.006    3.428    1.462    0.246
apply(iris3[,,1],2,coef_var) 
##   Sepal L.   Sepal W.   Petal L.   Petal W. 
## 0.07041344 0.11057887 0.11878522 0.42839670
aggregate(cbind(Sepal.Length, Sepal.Width, Petal.Length, Petal.Width)~Species,
          data=iris,coef_var)
##      Species Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1     setosa   0.07041344   0.1105789   0.11878522   0.4283967
## 2 versicolor   0.08695606   0.1132846   0.11030774   0.1491348
## 3  virginica   0.09652089   0.1084387   0.09940466   0.1355627
  1. Media cortada: Descartar los de mayor y menor peso.
iris3[,1,1]
##  [1] 5.1 4.9 4.7 4.6 5.0 5.4 4.6 5.0 4.4 4.9 5.4 4.8 4.8 4.3 5.8 5.7 5.4 5.1 5.7
## [20] 5.1 5.4 5.1 4.6 5.1 4.8 5.0 5.0 5.2 5.2 4.7 4.8 5.4 5.2 5.5 4.9 5.0 5.5 4.9
## [39] 4.4 5.1 5.0 4.5 4.4 5.0 5.1 4.8 5.1 4.6 5.3 5.0
max(iris3[,1,1])
## [1] 5.8
min(iris3[,1,1])
## [1] 4.3
descarte<-c(which(iris3[,3,1]==max(iris3[,3,1])),
            which(iris3[,3,1]==min(iris3[,3,1])))

mean(iris3[-descarte,1,1])
## [1] 5.017021
desc_media<-function(x){
  descarte<-c(which(x==max(x)),
              which(x==min(x)))
  
  mean(x[-descarte]) }

desc_media(iris3[,3,1])
## [1] 1.453191
desc_media(iris3[,4,1])
## [1] 0.2545455
mean(iris3[,3,1])
## [1] 1.462
apply(iris3[,,1],2,desc_media) 
##  Sepal L.  Sepal W.  Petal L.  Petal W. 
## 5.0041667 3.4312500 1.4531915 0.2545455
aggregate(cbind(Sepal.Length, Sepal.Width, Petal.Length, Petal.Width)~Species,
          data=iris,desc_media)
##      Species Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1     setosa     5.004167    3.431250     1.453191   0.2545455
## 2 versicolor     5.935417    2.772917     4.268750   1.3690476
## 3  virginica     6.595833    2.955319     5.545833   2.0086957

Quitarle los dos últimos y los dos primeros

longi<-length(iris3[,3,1])
posis_quit<-c(1,2,longi-1,longi)
ordenado<-sort(iris3[,3,1],decreasing=TRUE)
mean(ordenado[-posis_quit])
## [1] 1.46087
corte_dos<-function(w){
  longi<-length(w)
  posis_quit<-c(1,2,longi-1,longi)
  ordenado<-sort(w,decreasing=TRUE)
  mean(w[-posis_quit]) }

corte_dos(iris[,2])
## [1] 3.05274
apply(iris3[,,1],2,corte_dos)
## Sepal L. Sepal W. Petal L. Petal W. 
## 5.000000 3.432609 1.465217 0.250000
aggregate(cbind(Sepal.Length, Sepal.Width, Petal.Length, Petal.Width)~Species,
          data=iris,corte_dos)
##      Species Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1     setosa     5.000000    3.432609     1.465217    0.250000
## 2 versicolor     5.926087    2.756522     4.276087    1.326087
## 3  virginica     6.634783    2.963043     5.565217    2.017391

Análisis exploratorio de datos: ToothGrowth

Esta base de datos corresponde a la longitud de odontoblastos (Celulas responsables del crecimiento de los dientes) de 60 conejillos de indias. Cada animal recibió uno de los tres niveles de dosis de vitamina C (0.5, 1 y 2 mg / día) por uno de dos métodos de administración: jugo de naranja (OJ) y el otro es ácido ascórbico (una forma de vitamina C) codificada como (VC).

Variables: Este es un dataframe de 60 observaciones con tres variables len: Longitud del diente. Esta es una variable cuantitativa continua y está expresada en milimetros.

supp: Tipo de suplemento: Jugo de Naranja (OJ)- Ácido ascorbico (VC).Esta es una variable categórica

Dose: Dosis numérica en miligramos/día de vitamina C. Esta es una variable cuantitativa continua

data("ToothGrowth")
head(ToothGrowth)
##    len supp dose
## 1  4.2   VC  0.5
## 2 11.5   VC  0.5
## 3  7.3   VC  0.5
## 4  5.8   VC  0.5
## 5  6.4   VC  0.5
## 6 10.0   VC  0.5
dim(ToothGrowth)
## [1] 60  3
?ToothGrowth
## starting httpd help server ... done
mean(ToothGrowth$len)
## [1] 18.81333
mean(ToothGrowth$dose)
## [1] 1.166667
sd(ToothGrowth$dose)
## [1] 0.6288722
max(ToothGrowth$len)
## [1] 33.9
min(ToothGrowth$len)
## [1] 4.2

¿Cuál es el promedio de crecimiento por método de aplicación? Para este caso hacemos uso de la función aggregate.

aggregate(len~supp,data=ToothGrowth,mean)
##   supp      len
## 1   OJ 20.66333
## 2   VC 16.96333
aggregate(len~dose,data=ToothGrowth, mean)
##   dose    len
## 1  0.5 10.605
## 2  1.0 19.735
## 3  2.0 26.100
aggregate(len~supp+dose,data=ToothGrowth, mean)
##   supp dose   len
## 1   OJ  0.5 13.23
## 2   VC  0.5  7.98
## 3   OJ  1.0 22.70
## 4   VC  1.0 16.77
## 5   OJ  2.0 26.06
## 6   VC  2.0 26.14
aggregate(len~dose+supp,data=ToothGrowth,mean)
##   dose supp   len
## 1  0.5   OJ 13.23
## 2  1.0   OJ 22.70
## 3  2.0   OJ 26.06
## 4  0.5   VC  7.98
## 5  1.0   VC 16.77
## 6  2.0   VC 26.14

Análisis exploratorio de datos: Aguascalientes.

Cargamos la base de datos de Excel

library("readxl")

datos10 <- read_excel("C:/Users/permi/Desktop/CIDE/Primer semestre/ESTADISTICA/datos_ags_estado_2020.xlsx",sheet="Hoja1",range="A1:HV481",na =c("*","N/D"))

Con el propósito de hacer EDA(Análsis de Datos Exploratorio) nos hacemos las siguientes preguntas:

  • ¿Cuál es la población total de los 11 municipios?
  • ¿Cuál es el total de hombres de los 11 municipios?
  • ¿Cuál es el total de mujeres de los 11 municipios?
aggregate(as.numeric(POBTOT)~NOM_MUN,data=datos10,mean)
##                      NOM_MUN as.numeric(POBTOT)
## 1             Aguascalientes           2707.045
## 2                   Asientos           1110.000
## 3                   Calvillo           1668.647
## 4                      Cosío           1211.000
## 5                   El Llano           2102.333
## 6                Jesús María           2378.634
## 7        Pabellón de Arteaga           2356.733
## 8            Rincón de Romos           2660.125
## 9  San Francisco de los Romo           2431.368
## 10        San José de Gracia            934.500
## 11                  Tepezalá           1302.000
aggregate(as.numeric(POBTOT)~NOM_MUN, data=datos10,sum)
##                      NOM_MUN as.numeric(POBTOT)
## 1             Aguascalientes             901446
## 2                   Asientos              17760
## 3                   Calvillo              28367
## 4                      Cosío               8477
## 5                   El Llano               6307
## 6                Jesús María              97524
## 7        Pabellón de Arteaga              35351
## 8            Rincón de Romos              42562
## 9  San Francisco de los Romo              46196
## 10        San José de Gracia               5607
## 11                  Tepezalá               9114
aggregate(as.numeric(POBFEM)~NOM_MUN, data=datos10,sum)
##                      NOM_MUN as.numeric(POBFEM)
## 1             Aguascalientes             463697
## 2                   Asientos               9087
## 3                   Calvillo              14561
## 4                      Cosío               4410
## 5                   El Llano               3219
## 6                Jesús María              49513
## 7        Pabellón de Arteaga              18046
## 8            Rincón de Romos              21748
## 9  San Francisco de los Romo              23331
## 10        San José de Gracia               2972
## 11                  Tepezalá               4590
aggregate(as.numeric(POBMAS)~NOM_MUN, data=datos10,sum)
##                      NOM_MUN as.numeric(POBMAS)
## 1             Aguascalientes             437749
## 2                   Asientos               8673
## 3                   Calvillo              13806
## 4                      Cosío               4067
## 5                   El Llano               3088
## 6                Jesús María              48011
## 7        Pabellón de Arteaga              17305
## 8            Rincón de Romos              20808
## 9  San Francisco de los Romo              22865
## 10        San José de Gracia               2635
## 11                  Tepezalá               4524
  1. Aprox. personas por vivienda en cada municipio
tabla15<-aggregate(cbind(as.numeric(VIVTOT),as.numeric(POBTOT))~NOM_MUN,data=datos10,sum)
tabla15$Pro_viv<-tabla15$V2/tabla15$V1
tabla15$Pro_viv
##  [1] 3.027008 3.462663 3.002117 3.460000 3.326477 3.166981 3.719200 3.544175
##  [9] 2.872171 2.946400 3.430184
  1. De San José de Gracia. ¿Cuál es la población de sus AGEBs urbanos?
san_jose<-which(datos10$NOM_MUN=="San José de Gracia")
datos_san_jose<-datos10[san_jose,]
sum(as.numeric(datos_san_jose$POBTOT))
## [1] 5607
  1. De todos los AGEBs del estado ¿cuál es la prop de mujeres?
tabla18<-aggregate(cbind(as.numeric(POBTOT),as.numeric(POBFEM))~NOM_MUN+AGEB, 
                    data=datos10,sum)
tabla18$Prop_muj<-tabla18$V2/tabla18$V1
head(tabla18$Prop_muj)
## [1] 0.5129280 0.5082700 0.5115773 0.5137969 0.5249846 0.4960110

Análisis exploratorio de datos: COVID.

Procedemos a descargar las bases de datos con las que trabajaremos. En este caso son archivos csv:

covid_oaxaca<-read.csv("C:\\Users\\permi\\Desktop\\CIDE\\Primer semestre\\R\\covid_oaxaca.csv")

fallecidos_oaxaca<-read.csv("C:\\Users\\permi\\Desktop\\CIDE\\Primer semestre\\R\\fallecidos.csv")

Para este caso, la base de datos contiene una columna de fechas y es la que procedemos a manipular. Cuando vamos a realizar algún tipo de código en R para el que necesitemos utilizar fechas, debemos tener presente el formato en el que R almacena las fechas, ya que nos será de utilidad a la hora de trabajar con ellas.

El estándar utilizado por R para las fechas es yyyy-mm-dd, es decir, año-mes-día. Para introducir una fecha en R, debemos utilizar siempre el comando ‘as.Date‘. Si no lo utilizamos, el programa leerá nuestra fecha como una variable ‘character‘, y lógicamente no podremos utilizarla como fecha. * %d día (numérico, de 0 a 31) * %a día de la semana abreviado a tres letras * %A día de la semana (nombre completo) * %m mes (numérico de 0 a 12) * %b mes (nombre abreviado a tres letras) * %B mes (nombre completo) * %y año (con dos dígitos) * %Y año (con cuatro dígitos)

library(lubridate)
## 
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
## 
##     date, intersect, setdiff, union
FechasIngreso<- as.Date(covid_oaxaca$FECHA_INGRESO,format="%Y-%m-%d")
mes<- month(FechasIngreso) 
hist(mes, main="Mes", xlab = "meses", ylab="ingreso")

DiasIngreso<- day(FechasIngreso)
boxplot(DiasIngreso)

Análisis exploratorio de datos: BOSQUE DE HARVARD

bosque<-read.csv("C:\\Users\\permi\\Desktop\\CIDE\\Primer semestre\\R\\Datos bosque Harvard.csv")
bosque$datetime[1]
## [1] "2005-01-01T00:15"
fechax<-substr(bosque$datetime[1],1,10)
horax<-substr(bosque$datetime[1],12,16)
hora_fechx<-paste0(fechax," ",horax)

hora_fechaxx<-strptime(hora_fechx,format = "%Y-%m-%d %H:%M")
hour(hora_fechaxx)
## [1] 0
minute(hora_fechaxx)
## [1] 15
year(hora_fechaxx)
## [1] 2005
month(hora_fechaxx)
## [1] 1
day(hora_fechaxx)
## [1] 1

Funcion que transforme el formato 2005-01-01T00:15 a uno de tipo strptime

transformadora <-function(x){
    f_bosque <-substr(x,1,10)
    t_bosque <-substr(x,12,16)
    f_t_bosque <-paste0(f_bosque," ",t_bosque)
    f_t_bosque_strptime <-strptime(f_t_bosque,
               format="%Y-%m-%d %H:%M")
    return(f_t_bosque_strptime)
  }

bosque$datetime[1]
## [1] "2005-01-01T00:15"
transformadora(bosque$datetime[1])
## [1] "2005-01-01 00:15:00 CST"

Devolviendo lista

head(lapply(bosque$datetime,FUN = transformadora))
## [[1]]
## [1] "2005-01-01 00:15:00 CST"
## 
## [[2]]
## [1] "2005-01-01 00:30:00 CST"
## 
## [[3]]
## [1] "2005-01-01 00:45:00 CST"
## 
## [[4]]
## [1] "2005-01-01 01:00:00 CST"
## 
## [[5]]
## [1] "2005-01-01 01:15:00 CST"
## 
## [[6]]
## [1] "2005-01-01 01:30:00 CST"

Devolviendo vector o matriz

head(sapply(bosque$datetime,FUN = transformadora))
## $`2005-01-01T00:15`
## [1] "2005-01-01 00:15:00 CST"
## 
## $`2005-01-01T00:30`
## [1] "2005-01-01 00:30:00 CST"
## 
## $`2005-01-01T00:45`
## [1] "2005-01-01 00:45:00 CST"
## 
## $`2005-01-01T01:00`
## [1] "2005-01-01 01:00:00 CST"
## 
## $`2005-01-01T01:15`
## [1] "2005-01-01 01:15:00 CST"
## 
## $`2005-01-01T01:30`
## [1] "2005-01-01 01:30:00 CST"