#install.packages("DT")
#install.packages("kableExtra")
#install.packages("tidyverse")
suppressMessages(suppressWarnings(library(tidyverse))) 
suppressMessages(suppressWarnings(library(RColorBrewer)))

Ejemplo caso cuantitativo:

En la clase de Bioestadística Fundamental del semestre pasado, las notas obtenidas por los estudiantes en el primer examen fueron las siguientes:

5.0 4.5 4.0 3.5 2.8 1.5 4.8 5.0
4.3 4.0 4.0 3.0 4.2 3.8 3.9 2.4
5.0 4.9 4.7 4.5 1.7 4.5 4.1 4.0
data <- c(5.0, 4.5, 4.0, 3.5, 2.8, 1.5, 4.8, 5.0,
           4.3, 4.0, 4.0, 3.0, 4.2, 3.8, 3.9, 2.4,
           5.0, 4.9, 4.7, 4.5, 1.7, 4.5, 4.1, 4.0)
n <- length(data)
#Calcular el número de clases:
#Regla empírica:
m <- round(sqrt(n))
#Regla de sturges:
sturg <- round(1 + log(n, base = 2))

cbind(m,sturg)
##      m sturg
## [1,] 5     6
#Amplitud del intervalo (usando regla empírica):
a <- (max(data) - min(data))/m
a
## [1] 0.7
# limites: 
limite <- min(data) + (0:m)*a
print(limite)
## [1] 1.5 2.2 2.9 3.6 4.3 5.0
#Frecuencias absolutas
ni <- table(cut(data, breaks = limite, include.lowest = TRUE))
print(ni)
## 
## [1.5,2.2] (2.2,2.9] (2.9,3.6] (3.6,4.3]   (4.3,5] 
##         2         2         2         9         9
#La función cut() permite divir los intervalos y breaks define los límites de 
#estos intervalos e include.lowest = TRUE indica que el mínimo se incluye (1.5).
# frecuencias relativas

hi <- ni/n
print(hi)
## 
##  [1.5,2.2]  (2.2,2.9]  (2.9,3.6]  (3.6,4.3]    (4.3,5] 
## 0.08333333 0.08333333 0.08333333 0.37500000 0.37500000
# frecuencias absolutas acumuladas
Ni <- cumsum(ni)
print(Ni)
## [1.5,2.2] (2.2,2.9] (2.9,3.6] (3.6,4.3]   (4.3,5] 
##         2         4         6        15        24
# frecuencias absolutas acumuladas
Hi <- cumsum(hi)
print(Hi)
##  [1.5,2.2]  (2.2,2.9]  (2.9,3.6]  (3.6,4.3]    (4.3,5] 
## 0.08333333 0.16666667 0.25000000 0.62500000 1.00000000
# tabla
nombres <- cbind(ni, hi, Ni, Hi)
total <- c(sum(nombres[,1]), sum(nombres[,2]), NA, NA)
tab <- rbind(nombres, total)
print(tab)
##           ni         hi Ni         Hi
## [1.5,2.2]  2 0.08333333  2 0.08333333
## (2.2,2.9]  2 0.08333333  4 0.16666667
## (2.9,3.6]  2 0.08333333  6 0.25000000
## (3.6,4.3]  9 0.37500000 15 0.62500000
## (4.3,5]    9 0.37500000 24 1.00000000
## total     24 1.00000000 NA         NA

Ejemplo caso cualitativo 1

En un laboratorio en Bogotá, se sometió a un estudio a 30 personas para examinar los microorganismos presentes en sus manos, para lo cual, se tomaron muestras de estos individuos en placas de Petri. Al cabo de unos días, se registraron de cada una el tipo de bacteria con mayor crecimiento

E.C S.A S B S.A S S B L.B
B B B S.A L.M S.A S S.A S
L.M S.A S E.C S.A S B E.C B
L.M B B
bact<- c(
  "E.C", "S.A", "S", "B", "S.A", "S", "S", "B", "L.M",
  "B", "B", "B", "S.A", "L.M", "S.A", "S", "S.A", "S",
  "L.M", "S.A", "S", "E.C", "S.A", "S", "B", "E.C", "B",
  "L.M", "B", "B")

nb <- length(bact)
nb
## [1] 30
#Frecuencias absolutas
ni_b <- table(bact)
ni_b
## bact
##   B E.C L.M   S S.A 
##   9   3   4   7   7
#Freciencias relativas
hi_b <- prop.table(ni_b)
sort(hi_b, decreasing = TRUE)
## bact
##         B         S       S.A       L.M       E.C 
## 0.3000000 0.2333333 0.2333333 0.1333333 0.1000000
# tabla
nombres_b <- cbind(ni_b, hi_b)
total <- c(sum(nombres_b[,1]), sum(nombres_b[,2]))
tabla_b <- rbind(nombres_b, total)
print(tabla_b)
##       ni_b      hi_b
## B        9 0.3000000
## E.C      3 0.1000000
## L.M      4 0.1333333
## S        7 0.2333333
## S.A      7 0.2333333
## total   30 1.0000000
bacteria <- c(" Bacilos","Escherichia coli", "Listeria monocytogenes","Salmonella",             "Staphylococcus aureus", "Total")
frec <- c("F. Absoluta", "F. Relativa")
rownames(tabla_b) <- bacteria
colnames(tabla_b) <- frec

tabla_b
##                        F. Absoluta F. Relativa
##  Bacilos                         9   0.3000000
## Escherichia coli                 3   0.1000000
## Listeria monocytogenes           4   0.1333333
## Salmonella                       7   0.2333333
## Staphylococcus aureus            7   0.2333333
## Total                           30   1.0000000

Caso cualitativo 2

El nivel de inglés de los estudiantes de Probabilidad y Estadística Fundamental son los siguientes:

A1 A2 C2 B2 B2 A1 A1 B2 A2
B2 B1 C1 A2 B2 A2 C2 C1 A2
B1 C2 B2 B2 A2 A2 B1 C1 C1
B1 B2 C2 A1 A2 B1 C2
ingl <- c(
  "A1", "A2", "C2", "B2", "B2", "A1", "A1", "B2", "A2",
  "B2", "B1", "C1", "A2", "B2", "A2", "C2", "C1", "A2",
  "B1", "C2", "B2", "B2", "A2", "A2", "B1", "C1", "C1",
  "B1", "B2", "C2", "A1", "A2", "B1", "C2"
)

ni <- length(ingl)
ni
## [1] 34
#Frecuencias absolutas
ni_i <- table(ingl)
ni_i
## ingl
## A1 A2 B1 B2 C1 C2 
##  4  8  5  8  4  5
#Freciencias relativas
hi_i <- prop.table(ni_i)
sort(hi_i, decreasing = TRUE)
## ingl
##        A2        B2        B1        C2        A1        C1 
## 0.2352941 0.2352941 0.1470588 0.1470588 0.1176471 0.1176471
#Frecuencia absoluta acumulada
Ni_i <- cumsum(ni_i)
Ni_i
## A1 A2 B1 B2 C1 C2 
##  4 12 17 25 29 34
#Frecuencia relativa acumulada
Hi_i <- cumsum(hi_i)
Hi_i
##        A1        A2        B1        B2        C1        C2 
## 0.1176471 0.3529412 0.5000000 0.7352941 0.8529412 1.0000000
# tabla
nombres_i <- cbind(ni_i, hi_i, Ni_i, Hi_i)
total <- c(sum(nombres_i[,1]), sum(nombres_i[,2]), NA, NA)
tabla_i <- rbind(nombres_i, total)
print(tabla_i)
##       ni_i      hi_i Ni_i      Hi_i
## A1       4 0.1176471    4 0.1176471
## A2       8 0.2352941   12 0.3529412
## B1       5 0.1470588   17 0.5000000
## B2       8 0.2352941   25 0.7352941
## C1       4 0.1176471   29 0.8529412
## C2       5 0.1470588   34 1.0000000
## total   34 1.0000000   NA        NA

Visualizaciones

Caso cuantitativo: histograma

hist(data, breaks = limite, main = "Histograma de los Datos",
     xlab = "Valores", ylab = "Frecuencia absoluta", col = "lightblue",
     border = "black", ylim = c(0,max(data)))

Caso cualiativo: diagrama de barras

# Convertir a data frame y asignar nombres a las columnas
dt <- as.data.frame(ni_b) 

colnames(dt) <- c("Bacteria", "Frecuencia")

#Crear gráfico de barras con la función barplot
barplot(dt$Frecuencia, 
        names.arg = dt$Bacteria, 
        col = "pink", 
        xlab = "Bacterias", 
        ylab = "Frecuencia absoluta", 
        main = "Diagrama de barras",
        ylim = c(0, 10),  # Aumentar el límite superior para mejor visualización
        border = "black"  # Color del borde de las barras
)

# Crear el gráfico de barras con ggplot
ggplot(dt, aes(x = Bacteria, y = Frecuencia)) +
  geom_bar(stat = "identity", fill = "pink") +
  labs(x = "Bacterias", y = "Frecuencia absoluta", title = "Diagrama de barras") +
  scale_y_continuous(labels = scales::number_format(accuracy = 1))+
  theme_minimal()

Ahora con las frecuencias relativas:

dtr <- as.data.frame(hi_b)
colnames(dtr) <- c("Bacteria", "Frecuencia")

barplot(dtr$Frecuencia, 
        names.arg = dtr$Bacteria, 
        col = "brown", 
        xlab = "Bacterias", 
        ylab = "Frecuencia relativa", 
        main = "Diagrama de barras",
        ylim = c(0, max(hi_b)),  # Aumentar el límite superior para mejor visualización
        border = "black"  # Color del borde de las barras
)

# Crear el gráfico de barras
ggplot(dtr, aes(x = Bacteria, y = Frecuencia)) +
  geom_bar(stat = "identity", fill = "coral") +
  labs(x = "Bacterias", y = "Frecuencia relativa", title = "Diagrama de barras") +
  theme_minimal()

También se puede hacer un gráfico de pastel:

pie(hi_b, 
    main = "Frecuencia Relativa de Bacterias", 
    col = topo.colors(length(hi_b)), # Colores del pastel
    labels = paste(names(hi_b), "\n", round(hi_b, 2)))

Datos bivariados cualitativos

hombres <- c(36, 44, 43,28)
mujeres <- c(34, 50, 52, 53)
categorias <- c("Ocasional", "Cátedra", "Asociado", "Titular")

# Ajustar márgenes para hacer espacio para la leyenda

par(mar = c(5, 5, 5, 6) + 0.1)  # Aumentar margen derecho

# Crear gráfico de barras agrupadas
bp <- barplot(rbind(hombres, mujeres), beside = TRUE, col = c("plum2", "mediumpurple1"),
              names.arg = categorias, 
              main = "Género y Tipo de Vinculación",
              xlab = "Tipo de Vinculación", ylab = "Cantidad")

#Rbind agrupa por filas el sexo, beside=T indica que las barras se ponen una al 
#lado de la otra. 

# Añadir leyenda con especificaciones
legend("topright", inset = c(-0.19, 0), legend = c("Hombres", "Mujeres"),
       fill = c("plum2", "mediumpurple1"), title = "Género", cex = 0.9, xpd=T)

#Acá se pueden ver algunos colores https://r-charts.com/es/colores/
#inset indica la ubicación de la leyenda
#Usando ggplot

#Primero se crea el data frame:
df <- data.frame(
  Genero = rep(c("Hombre", "Mujer"), each = 4), #Repetir 4 veces cada uno
  Vinculacion = rep(c("Ocasional", "Cátedra", "Asociado", "Titular"), 2), 
  Frecuencia = c(36, 44, 43, 28, 34, 50, 52, 53) #Van en orden primera y segunda fila
)


ggplot(df, aes(x = Vinculacion, y = Frecuencia, fill = Genero)) +
  geom_bar(stat = "identity", position = "dodge") + 
  labs(x = "Tipo de Vinculación", y = "Cantidad", fill = "Género") +
  theme_light() +
  ggtitle("Género y Tipo de Vinculación") +
  scale_fill_brewer(palette = "Pastel2") 

#En position se puede poner stack (defecto), dodge y fill
#En stat, "count" por defecto y identity porque ya se tienen las frecuencias
#Aquí hay algunas paletas https://r-graph-gallery.com/38-rcolorbrewers-palettes.html

Diagrama de dispersión

disp <- data.frame(
  x = c(1, 3, 4, 8, 10, 11, 2, 6, 8, 9, 10, 15, 8, 4, 12),
  y = c(19, 18, 15, 14, 13, 12, 11, 9, 8, 7, 5, 3, 12, 13, 7)
)
#Usando la función plot
plot(disp$x,disp$y, main="Diagrama de dispersión", col="purple", ylab="Y", xlab="X")

#Segunda forma usano ggplot2
ggplot(disp, aes(x = x, y = y)) +
  geom_point(color = "purple", size= 3) +
  labs(title = "Diagrama de dispersión", x = "X", y = "Y")

# Otro ejemplo
data <- data.frame(
  x = c(2, 3, 3.5, 2.5, 4.5, 4.8, 4),
  y = c(1, 2.5, 3.5, 3, 3.8, 3.9, 3)
)

ggplot(data, aes(x = x, y = y)) +
  geom_point(color = "purple", size = 3) +
  labs(title = "Diagrama de dispersión", x = "Valores de X", y = "Valores de Y")