Software R

R es un entorno y lenguaje de programación libre con un enfoque al análisis estadístico para facilitar el análisis de datos.

DESVENTAJA Su interfaz gráfica es limitada lo que genera rechazo por parte de los usuarios no familiarizados con lenguajes de programación.

R Studio

Es el entorno de desarrollo integrado.

  • R Console terminal de comandos donde se ejecutan los programas escritos en el lenguaje R.
  • R Plot ventana de visualización gráfica.
  • R Help ventana de ayudas.
  • R Script Guardar códigos generados.
  • Enviroment Muestra los objetos activos

Instalar R y R studio.

¿Qué es un paquete en R??

Son colecciones de funciones desarrolladas por los usuarios. Aquí podemos encontrar diferentes funciones para realizar desde análisis descriptivos hasta modelos más complejos. Ejemplo de como instalar un paquete.

install.packages(“names”)

Recomendaciones al iniciar una sesión en R

  • Limpiar la sesion rm(list=ls()).
  • Limpiar pantalla: Ctrl + L: La consola de salida de R trabaja de forma acumulativa.
  • Verificar directorio base de trabajo: getwd() El directorio base es el lugar donde R lee los archivos de entrada y ubica las salidas dirigidas por defecto.
  • Asignar directorio: setwd(dir)
 setwd("~/Documents/Asesorias/Clases")
  • Crear un Script para el ingreso de ordenes: Cada línea del script o conjunto de líneas será leída en la consola con la orden Ctrl + R o F5
  • En el script podemos hacer comentarios, utilizando el símbolo # al comienzo de la oración.

Generalidades

  • Inf es un simbolo para infinito
  • NA es un simbolo para dato no disponible o missing.
  • NaN operación imposible.
  • NULL es un símbolo para objeto vacío.
  • TRUE y FALSE son constantes lógicas
  • &, |, ! operadores lógicos.
  • = o <- operador de asignación.
  • ==, !=, <, <= comparaciones.

Lectura de Datos en R

  • Función read.table()
  • Función read.delim()
  • Función read.csv()
  • Library(foreign) importa datos de spss, minitab, stata, etc
  • Guardar datos en el directorio: función write.table(), write.csv().

Antes de importar datos

  • La ruta o directorio donde reposa el archivo.
  • Identificar el nombre del archivo.
  • Identificar la extensión o formato del archivo a importar: .xls, .xlsx, .txt, .csv, .sav, .mpj
  • Las columnas y las filas son consistentes, es decir, no tener celdas combinadas de Excel, filas o columnas en blanco por razones estéticas.
  • Si las columnas o filas están etiquetadas, que no haya símbolos extraños, por preferencia omitir: $, Ñ, %, ‘ (tildes).
  • Si hay datos perdidos, que su codificación sea consistente: NA.

¿Qué son las variables para R?

  • Cada variable es guardada como vector en R.
  • El nombre de cada vector o variable debe ser indicado.
  • Cuando se usen bases de datos usar la función attach(datos) para manipular cada variable por separado.
x <- c(10, 30, 1, 15, 8)
x
## [1] 10 30  1 15  8
y <- c("A", "B", "C", "D", "A")
y
## [1] "A" "B" "C" "D" "A"

Iniciando R

#Limpiar

rm(list=ls())

##Identificar el directorio actual de trabajo
getwd()
##Definir el directorio de trabajo
setwd("")

##Verificación que si se cambio el directorio de trabajo
getwd()

Ayuda en R

##Ayuda en R
help()
##Ayuda sobre una función (exige que sepamos el nombre de la función)
help(sd)
?sd
##Buscar ayuda sobre un concepto estadístico
help.search("Skewness")
??Skewness

Ejemplo de análisis

Se cuenta con la información de 50 trabajadores en quienes se ha documentado el sexo (1: M, 2: F), escolaridad (1: Bachiller, 2: Técnico, 3: Profesional), si conduce carro (0: No, 1: Si), los años de antigüedad en la empresa y la edad. Realice un análisis para cada una de las variables.

Lectura de datos y Organización de la información

#Leer base de datos
data_lab1 <- read.csv("data_lab1.csv")
head(data_lab1)
##   id sexo escolaridad carro anos_laborales edad
## 1  1    1           1     1             19   46
## 2  2    2           2     1             18   39
## 3  3    2           3     1              9   25
## 4  4    2           3     1             12   42
## 5  5    2           3     1             20   21
## 6  6    2           3     0             12   53
#Para saber el tipo de objeto
class(data_lab1)
## [1] "data.frame"
#Recodificación de variables

#El signo $ permite manipular las variables dentro del conjunto de datos
?factor
data_lab1$sexo=factor(data_lab1$sexo, levels=c(1,2), 
                      labels=c("M", "F"))

data_lab1$escolaridad=factor(data_lab1$escolaridad, levels=c(1,2,3), 
                      labels=c("Bachiller", "Técnico", "Profesional"))


data_lab1$carro=factor(data_lab1$carro, levels=c(0,1), 
                             labels=c("No", "Si"))

head(data_lab1)
##   id sexo escolaridad carro anos_laborales edad
## 1  1    M   Bachiller    Si             19   46
## 2  2    F     Técnico    Si             18   39
## 3  3    F Profesional    Si              9   25
## 4  4    F Profesional    Si             12   42
## 5  5    F Profesional    Si             20   21
## 6  6    F Profesional    No             12   53

Análisis Variables Cualitativas (Univariado)

Tablas de frecuencias

#Opcion 1
frec_abs=data.frame(table(data_lab1$sexo))
frec_Rel=frec_abs$Freq/length(data_lab1$sexo)
frec_abs_acum<-cumsum(frec_abs$Freq)
frec_rel_acum<-cumsum(frec_Rel)

tabla<-cbind(frec_abs,frec_Rel,frec_abs_acum,frec_rel_acum)
names(tabla) <- c("Valores", "n_i","f_i","N_i","F_i")
tabla
##   Valores n_i  f_i N_i  F_i
## 1       M  24 0.48  24 0.48
## 2       F  26 0.52  50 1.00
#Opcion 2

#Frecuencias Absolutas
table(data_lab1$sexo)
## 
##  M  F 
## 24 26
#Frecuencias Relativas
prop.table(table(data_lab1$sexo))
## 
##    M    F 
## 0.48 0.52
#Opcion 3
#install.packages("epiDisplay")
#library(epiDisplay)
#tab1(data_lab1$sexo,  cum.percent = TRUE)

La visualización de los datos puede realizarse con el paquete ggplot2.

https://r-graph-gallery.com/

#Gráficos
#install.packages("ggplot2")

# Load ggplot2
library(ggplot2)

#Opcion 1 Gráfico de torta

pct <- tabla$f_i*100
etiquetas <- paste(tabla$Valores, pct) # Añadimos porcentajes a etiquetas
etiquetas <- paste(etiquetas,"%",sep="") # Añadimos el símbolo de %

pie(tabla$n_i, labels = etiquetas,
    main="Diagrama de pastel",
    clockwise = TRUE,radius=1)

#Opción 2 ggplot2 Gráfico de torta

ggplot(tabla, aes(x="", y=f_i, fill=Valores)) +
  geom_bar(stat="identity", width=1) +
  coord_polar("y", start=0) +
  geom_text(aes(label = paste0(f_i, "%")), position = position_stack(vjust=0.5)) +
  labs(x = NULL, y = NULL) +
  theme_classic() +
  theme(axis.line = element_blank(),
        axis.text = element_blank(),
        axis.ticks = element_blank()) 

#Opcion 1 Barras
barplot(tabla$n_i, xlab = "Sexo", names.arg=c("F","M"))

#Opcion 2 Barras ggplot2 
ggplot(data_lab1, aes(x=sexo, fill=sexo)) +
  geom_bar()+
  xlab("Sexo") + 
  ylab("Frecuencia Absoluta") 

Análisis Variables Cualitativas (Bivariado/Tablas de Contingencia)

#Tabla Cruzada
table(data_lab1$sexo)
## 
##  M  F 
## 24 26
table(data_lab1$carro)
## 
## No Si 
## 19 31
#Tabla Cruzada de variables
table2=table(data_lab1$sexo, data_lab1$carro)
table2
##    
##     No Si
##   M  6 18
##   F 13 13
#Total de columnas y total por filas
margin.table(table2,1)
## 
##  M  F 
## 24 26
margin.table(table2,2)
## 
## No Si 
## 19 31
#Proporciones ¿Cómo interpretarlo?
prop.table(table2)
##    
##       No   Si
##   M 0.12 0.36
##   F 0.26 0.26
#Contingencia proporciones fila
prop.table(table2, margin = 1)
##    
##       No   Si
##   M 0.25 0.75
##   F 0.50 0.50
#Contingencia proporciones columna
prop.table(table2, margin = 2)
##    
##            No        Si
##   M 0.3157895 0.5806452
##   F 0.6842105 0.4193548
#Usando el paquete epiDisplay
#tabla3=tabpct(data_lab1$sexo, data_lab1$carro, graph = F)
#tabla3

Gráficas para tablas de contingencia

#Grafico de Frecuencias
barplot(table2,beside=T,
        main=' ',xlab = "Conduce carro", ylab="Frecuencia",
        col=c("darkblue", "red"), ylim = c(0,30))
legend("topleft", legend=rownames(table2), cex=0.75, fill=c("darkblue", "red"))

#Grafico de Proporciones
barplot(prop.table(table2,1)*100,beside=T,
        main=' ',xlab = "Conduce carro", ylab="Porcentaje",
        col=c("darkblue", "red"), ylim = c(0,100))
legend("topleft", legend=rownames(table2), cex=0.50, fill=c("darkblue", "red"))

##Usando GGPLOT
library(ggplot2)
ggplot(data_lab1, aes(x = carro)) +  
  geom_bar(aes(y = (..count..)/sum(..count..))) +
  scale_y_continuous(labels=scales::percent) +
  ylab("Porcentaje")
## Warning: The dot-dot notation (`..count..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(count)` instead.

ggplot(data_lab1, aes(sexo, group = carro, fill=carro)) + 
  geom_bar(aes(y = ..prop.., fill = factor(..x..)), stat="count") + 
  scale_y_continuous(labels=scales::percent) +
  ylab("Porcentaje") +
  facet_grid(~carro)

ggplot(data_lab1, aes(carro, group = sexo, fill=sexo)) + 
  geom_bar(aes(y = ..prop.., fill = factor(..x..)), stat="count") + 
  scale_y_continuous(labels=scales::percent) +
  ylab("Porcentaje") +
  facet_grid(~sexo)

Análisis Variables Cuantitativas (Tablas)

Ejemplo con el ejercicio en clase de los pesos de los 98 estudiantes evaluados.

#Generar los pesos
peso=c(34.5, 35.2, 36.1, 37.0, 37.9, 38.5, 38.5, 39.1, 39.6, 40.0,
       40.4, 40.4, 40.5, 40.8, 40.9, 41.1, 45.0, 45.2, 46.0, 47.3,
       47.7, 47.8, 48.0, 48.2, 48.3, 48.3, 48.7, 49.0, 49.1, 49.1,
       49.2, 50.3, 50.5, 50.5, 50.6, 50.9, 52.3, 52.8, 52.9, 53.0,
       53.3, 53.5, 54.0, 54.2, 54.9, 55.1, 55.3, 55.3, 52.9, 53.0,
       55.4, 55.6, 55.8, 55.8, 55.8, 56.0, 56.2, 56.4, 57.4, 58.1,
       58.0, 58.9, 58.9, 59.0, 59.3, 59.3, 60.1, 60.4, 60.5, 60.5,
       60.7, 62.5, 62.7, 63.0, 63.1, 63.2, 63.8, 64.6, 65.0, 65.0,
       65.0, 65.5, 65.6, 65.7, 95.1, 68.2, 68.4, 69.6, 70.1, 70.3,
       72.5, 72.5, 73.0, 79.0, 80.4, 80.7, 85.8, 108.4)

#Paso 1: rango
range=max(peso)-min(peso)
range
## [1] 73.9
c(max(peso),min(peso), max(peso)-min(peso))
## [1] 108.4  34.5  73.9
#Paso 2: definir m con sturgles
N=98
m=1+3.3*log10(98)
print(m)
## [1] 7.571046
#Usando hist
#install.packages("fdth")
library(fdth)
## 
## Attaching package: 'fdth'
## The following objects are masked from 'package:stats':
## 
##     sd, var
peso_tabla=fdt(peso,start=30,
               end=110,
               h=10)
peso_tabla
##  Class limits  f   rf rf(%) cf  cf(%)
##       [30,40)  9 0.09  9.18  9   9.18
##       [40,50) 22 0.22 22.45 31  31.63
##       [50,60) 35 0.36 35.71 66  67.35
##       [60,70) 21 0.21 21.43 87  88.78
##       [70,80)  6 0.06  6.12 93  94.90
##       [80,90)  3 0.03  3.06 96  97.96
##      [90,100)  1 0.01  1.02 97  98.98
##     [100,110)  1 0.01  1.02 98 100.00
#Densidad
hist(peso,freq=FALSE,col="lightcyan", xaxt = "n", main=" ",xlab="Peso", ylab="Densidad", xlim=c(30,110))
axis(1, at =seq(30,110,10))

hist(peso,col="lightcyan", xaxt = "n", main=" ",xlab="Peso", ylab="Frecuencias Absolutas", xlim=c(30,110))
axis(1, at =seq(30,110,10))

#Ojiva con distribución empirica acumulada
ECDF=ecdf(peso)
plot(ECDF,col="red",lwd=2,xlab="Peso",
     ylab="Frecuencia acumulada",main=" ")

Ejemplo de tabla de frecuencia para la edad de trabajadores.

#Definición de intervalos con la función fdt
edad_tabla=fdt(data_lab1$edad,breaks=c("Sturges"))
edad_tabla
##   Class limits f   rf rf(%) cf cf(%)
##  [17.82,23.93) 7 0.14    14  7    14
##  [23.93,30.04) 7 0.14    14 14    28
##  [30.04,36.15) 8 0.16    16 22    44
##  [36.15,42.27) 8 0.16    16 30    60
##  [42.27,48.38) 7 0.14    14 37    74
##  [48.38,54.49) 9 0.18    18 46    92
##   [54.49,60.6) 4 0.08     8 50   100

Análisis Variables Cuantitativas (Indicadores)

#Varios indicadores de resumen
summary(data_lab1$edad)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    18.0    29.0    38.5    38.9    49.5    60.0
#Media
mean(data_lab1$edad)
## [1] 38.9
#Desviación estandar
sd(data_lab1$edad)
## [1] 11.95613
#Percentiles
quantile(data_lab1$edad,probs=0.5)
##  50% 
## 38.5
#Varios Percentiles
quantile(data_lab1$edad,probs=c(0.25,0.50,0.75))
##  25%  50%  75% 
## 29.0 38.5 49.5
#install.packages("moments")
library("moments")
#Asimetría
skewness(data_lab1$edad)
## [1] -0.03109101
#Kurtosis
kurtosis(data_lab1$edad)
## [1] 1.948691
boxplot(data_lab1$edad,
        main = "Diagrama de cajas",
        ylab = "Edad", 
        col= "blue")

boxplot(data_lab1$edad~ data_lab1$carro,
        ylab = "Edad", xlab="Conduce Carro")

Indicadores de acuerdo a grupos.

#Edad de acuerdo a la habilidad de conducción

tapply(data_lab1$edad, data_lab1$carro, summary) 
## $No
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   18.00   25.00   40.00   39.26   53.00   60.00 
## 
## $Si
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   21.00   32.00   38.00   38.68   46.00   60.00
tapply(data_lab1$edad, data_lab1$carro, sd) 
##        No        Si 
## 15.110122  9.816269
#¿Qué distribución de edad presenta una mayor variabilidad?

cv_si=(9.8162/38.68)*100
cv_si
## [1] 25.37797
cv_no=(15.1101/39.26)*100
cv_no
## [1] 38.48726