Resumiendo datos en Tablas con R

es evidente que R es una herramienta que, a los que realizamos Análisis de Datos, no ha dado bastante libertad. Al respecto es bueno tener ciertas consideraciones respecto de la creacion y presentación en tablas.

¿Qué se debe tener en cuenta?

  • un propósito, si tiene claro que quiere decir con el gráfico es más fácil escogerlo.

  • cúal(es) es (son) el tipo de variable que resumirá

  • a veces es necesario crear nuevas variables en el dataset

  • Las librerías son esenciales para facilitarse la vida. Algunas de ellas

library(tidyverse)  # carga un conjunto de librerias necesarias, entre ellas dplyr, ggplot2
library(report) # genera informe de resultados estadisticos
library(expss) # tablas etiquetas y otras funciones
library(kableExtra) # construccion de tablas avanzadas.
library(rempsyc) #tablas con formato 
library(flextable)
library(broom)
library(xtable)
library(tableone)

Construcción

  • Carguemos un dataset.

pueden encontrar el archivo de datos en el siguiente link:

datos_empleados.xlsx

https://github.com/cjimenezgallardo/DATASETS

Los datos corresponden Sueldo percibidos en una empresa, y que como variable, se tienen:

dataej<-datos_empleados
names(dataej)
##  [1] "ID"             "Sexo"           "FechaNAc"       "educacion"     
##  [5] "labor"          "Sueldo_actual"  "Sueldo_inicial" "antigüedad"    
##  [9] "experiencia"    "minoria"

Tabla de Frecuencia

CONSEJO: realice un bosquejo manual, que le permita entender que quiere mostrar, para que luego lo contrarreste con lo que apareció en R

Objetivo, Conocer la distribución de personal por labor.

Tabla frecuencia clásica (library dplyr)

tabla0 <- dataej %>%
  group_by(labor) %>% 
  summarise(Total=n())

print(tabla0)
## # A tibble: 3 × 2
##   labor Total
##   <dbl> <int>
## 1     1   363
## 2     2    27
## 3     3    84

Tabla frecuencia y porcentajes (library dplyr)

tabla1 <- dataej %>%
  group_by(labor) %>% 
  summarise(Total=n()) %>% 
  mutate(Porcentaje=Total/sum(Total)*100)


print(tabla1)
## # A tibble: 3 × 3
##   labor Total Porcentaje
##   <dbl> <int>      <dbl>
## 1     1   363      76.6 
## 2     2    27       5.70
## 3     3    84      17.7

Tabla frecuencia y porcentajes (library base)

# obtencion de frecuencias
tabla1 <- table(dataej$labor)
tabla1_p <- prop.table(tabla1)

tabla1
## 
##   1   2   3 
## 363  27  84
tabla1_p
## 
##          1          2          3 
## 0.76582278 0.05696203 0.17721519
#transformar datos a conjunto de datos
tabla1<-as.data.frame(tabla1)
tabla1_p<-as.data.frame(tabla1_p)

tabla1
##   Var1 Freq
## 1    1  363
## 2    2   27
## 3    3   84
tabla1_p
##   Var1       Freq
## 1    1 0.76582278
## 2    2 0.05696203
## 3    3 0.17721519
# unir datos
tabla_f1<- data.frame(tabla1,tabla1_p)
tabla_f1<- dplyr::select(tabla_f1,-Var1.1)

#cambiar nombre a columnas "variables"
colnames(tabla_f1)<- c("Var","Frec","Porcentaje")
print (tabla_f1)
##   Var Frec Porcentaje
## 1   1  363 0.76582278
## 2   2   27 0.05696203
## 3   3   84 0.17721519
#corrigiendo valores a dle porcentaje 
tabla_f1$Porcentaje<- round(tabla_f1$Porcentaje*100,2)
tabla_f1
##   Var Frec Porcentaje
## 1   1  363      76.58
## 2   2   27       5.70
## 3   3   84      17.72
tabla1_p <- prop.table(tabla0)
tabla1_p
##         labor   Total
## 1 0.002083333 0.75625
## 2 0.004166667 0.05625
## 3 0.006250000 0.17500

Tabla de Contingencia

para su creación se deben considerar al menos 2 variables discretas (a lo más)

usando XTABS

solo frecuencias

tabla_c1<- xtabs(~labor+Sexo,data=dataej)
tabla_c1
##      Sexo
## labor   h   m
##     1 157 206
##     2  27   0
##     3  74  10

con porcentajes

tabla_c11<- xtabs(~labor+Sexo,data=dataej) %>% prop.table()*100
tabla_c11
##      Sexo
## labor         h         m
##     1 33.122363 43.459916
##     2  5.696203  0.000000
##     3 15.611814  2.109705

solo frecuencias con varios estados por independiente

tabla_c2<- xtabs(~labor+educacion+Sexo,data=dataej)
tabla_c2
## , , Sexo = h
## 
##      educacion
## labor   8  12  14  15  16  17  18  19  20  21
##     1  10  48   6  78  10   2   2   1   0   0
##     2  13  13   0   1   0   0   0   0   0   0
##     3   0   1   0   4  25   8   7  26   2   1
## 
## , , Sexo = m
## 
##      educacion
## labor   8  12  14  15  16  17  18  19  20  21
##     1  30 128   0  33  14   1   0   0   0   0
##     2   0   0   0   0   0   0   0   0   0   0
##     3   0   0   0   0  10   0   0   0   0   0
tabla_c2<- xtabs(~labor+educacion+Sexo,data=dataej) %>% prop.table()*100
tabla_c2<-round(tabla_c2,2) #redondea a 2 decimales

print(tabla_c2)

agregando totales

tabla_r1<-round(addmargins(cbind(tabla_c1),c(1,2)),2)

#tabla_r1<-round(addmargins(tabla_r1,c(1,2)),2)

tabla_r1
##       h   m Sum
## 1   157 206 363
## 2    27   0  27
## 3    74  10  84
## Sum 258 216 474

Distribución porcentual respecto del total

tabla_r1<-round(addmargins(prop.table(cbind(tabla_c1)),c(1,2))*100,2)
                
tabla_r1
##         h     m    Sum
## 1   33.12 43.46  76.58
## 2    5.70  0.00   5.70
## 3   15.61  2.11  17.72
## Sum 54.43 45.57 100.00

Distribución porcentual respecto del total por fila

tabla_r1<-round(addmargins(prop.table(cbind(tabla_c1), margin = 1),c(2))*100,2)

tabla_r1 
##        h     m Sum
## 1  43.25 56.75 100
## 2 100.00  0.00 100
## 3  88.10 11.90 100

Distribución porcentual respecto del total por columna

tabla_r1<-round(addmargins(prop.table(cbind(tabla_c1),margin = 2),c(1))*100,2)

tabla_r1
##          h      m
## 1    60.85  95.37
## 2    10.47   0.00
## 3    28.68   4.63
## Sum 100.00 100.00

Tabla de frecuencia agrupada programada

vd<- datos_empleados$Sueldo_actual

###---recopilacion de datos
  
  n.datos<-length(vd)
  min.datos<-min(vd)
  max.datos<-max(vd)
  rango.datos<-max.datos-min.datos
  n_int.datos<-trunc(3.322*log10(n.datos)+1,0)
  incremento<-round(rango.datos/n_int.datos,4)
  delta=0.0001
  
### Paramtetros de la tabla
  li.t<-1:n_int.datos
  ls.t<-1:n_int.datos
  marca.t<-1:n_int.datos
  f.t<-1:n_int.datos
  Fa.t<-1:n_int.datos
  h.t<-1:n_int.datos
  Ha.t<-1:n_int.datos
  
#### Inicializacion
  for (j in 1:n_int.datos){
  f.t[j]=0
  
  }
  
#### proceso llenado tabla
  
      li.t[1]<-min.datos
      ls.t[1]<-min.datos+incremento
      marca.t[1]<- round((li.t[1]+ls.t[1])/2,2)
  
  for (i in 2:n_int.datos){
      
      li.t[i]<-ls.t[i-1]+delta
      ls.t[i]<-li.t[i]+incremento
      marca.t[i]<- (li.t[i]+ls.t[i])/2
    
  }
      
  tabla_final<- data.frame(matrix(nrow = n_int.datos, ncol = 7))
  names(tabla_final) <- c("LI","LS","Clase","f","FA","h", "HA")
  
  for (i in 1: n.datos){
    for (j in 1:n_int.datos){
      if (vd[i]>= li.t[j] & vd[i]<=ls.t[j]) {
        f.t[j]<-f.t[j]+1

        j<-n_int.datos            
      }
    }
  }
  
  Fa.t[1]<-f.t[1]
  h.t[1]<-round(f.t[1]/n.datos*100,2)
  Ha.t[1]<-h.t[1]
  tabla_final[1,]<-c(li.t[1],ls.t[1],marca.t[1],f.t[1],Fa.t[1],h.t[1],Ha.t[1])
  for (j in 2:n_int.datos){
    Fa.t[j]<-Fa.t[j-1]+f.t[j]
    h.t[j]<-round(f.t[j]/n.datos*100,2)
    Ha.t[j]<-Ha.t[j-1]+h.t[j]
    tabla_final[j,]<-c(li.t[j],ls.t[j],marca.t[j],f.t[j],Fa.t[j],h.t[j],Ha.t[j])  
  }
print(tabla_final)
##       LI     LS  Clase   f  FA     h    HA
## 1  15750  29000  22375 238 238 50.21 50.21
## 2  29000  42250  35625 144 382 30.38 80.59
## 3  42250  55500  48875  36 418  7.59 88.18
## 4  55500  68750  62125  30 448  6.33 94.51
## 5  68750  82000  75375  14 462  2.95 97.46
## 6  82000  95250  88625   6 468  1.27 98.73
## 7  95250 108500 101875   4 472  0.84 99.57
## 8 108500 121750 115125   1 473  0.21 99.78
## 9 121750 135000 128375   1 474  0.21 99.99