#install.packages("DT")
#install.packages("kableExtra")
#install.packages("tidyverse")
suppressMessages(suppressWarnings(library(tidyverse)))
suppressMessages(suppressWarnings(library(RColorBrewer)))
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
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
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
hist(data, breaks = limite, main = "Histograma de los Datos",
xlab = "Valores", ylab = "Frecuencia absoluta", col = "lightblue",
border = "black", ylim = c(0,max(data)))
# 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)))
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
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")