26/07/25
Abstract
La teoría mencionada puede revisarse en el capítulo 2 de mis notas de clase que aparecen en el siguiente documento: 1.1. Estadística básica. En Rpubs:: toc se pueden ver otros documentos de posible interés.
En R podemos encontrar diversas funciones para ello:
expand.grid
en el paquete base
de R.combn
en el paquete combinat
.Para nuestros cálculos, utilizaremos la función
expand.grid
. En este caso, creamos la siguientes CINCO
funcione: tosscoin(n)
, rolldie(n)
,
isin()
, urnsamples()
y nsamp()
.
Se describirán a continuación.
tosscoin(n)
La idea de esta función es generar el espacio muestral de lanzar una
moneda exactamente \(n\) veces, con
valores cara (H
) y sello (T
):
tosscoin <- function(n) {
df <- expand.grid(replicate(n, c("H", "T"), simplify = FALSE),
KEEP.OUT.ATTRS = FALSE,
stringsAsFactors = FALSE)
names(df) <- paste0("X", seq_len(n))
return(df)
}
rolldie(n)
Con ella se genera el espacio muestral al lanzar un dado exactamente \(n\) veces, con valores de 1 a 6 por lanzamiento.
rolldie <- function(n, sides = 6, makespace = FALSE) {
df <- expand.grid(replicate(n, 1:sides, simplify = FALSE),
KEEP.OUT.ATTRS = FALSE)
names(df) <- paste0("X", seq_len(n))
if (makespace) {
df$prob <- rep(1 / nrow(df), nrow(df)) # Agrega la columna de probabilidad
}
return(df)
}
NOTA: En esta función, makespace = TRUE
agregará una
columna de probabilidades (prob = 1/n) al espacio muestral, para
convertirlo en un “objeto tipo espacio de probabilidad”.
isin()
Con ella se verifica si ciertos valores están presentes en cada fila de una matriz o data frame. Se puede usar con o sin tener en cuenta el orden.
isin <- function(x, table, ordered = FALSE) {
# Si x es un vector, lo convertimos en una matriz con una sola fila
if (is.vector(x)) {
x <- matrix(x, nrow = 1)
}
# Validación
if (!is.data.frame(x) && !is.matrix(x)) stop("x debe ser un vector, data.frame o matriz")
# Aplicar fila por fila
apply(x, 1, function(row) {
row_vals <- as.character(row)
tab_vals <- as.character(table)
if (ordered) {
# Buscar subsecuencia exacta
len_row <- length(row_vals)
len_tab <- length(tab_vals)
if (len_tab > len_row) return(FALSE)
for (i in 1:(len_row - len_tab + 1)) {
if (all(row_vals[i:(i + len_tab - 1)] == tab_vals)) return(TRUE)
}
return(FALSE)
} else {
# Verificar si todos los valores de 'table' están presentes (sin importar orden)
all(tab_vals %in% row_vals)
}
})
}
urnsamples()
Esta función genera todas las muestras posibles de una urna según estos cuatro escenarios:
urnsamples <- function(x, size, ordered = TRUE, replace = FALSE) {
if (ordered) {
# Producto cartesiano
expand.grid(replicate(size, x, simplify = FALSE),
KEEP.OUT.ATTRS = FALSE)
} else {
# Combinaciones sin orden
combn(x, size, simplify = FALSE) |>
do.call(what = rbind)
}
}
nsamp()
Esta función calcula cuántas formas distintas hay de tomar \(k\) elementos de una población de n elementos, bajo distintas condiciones:
n
: Tamaño de la población (elementos
disponibles).
k
: Tamaño de la muestra-
replace = FALSE
: Sin reemplazo (sin repetir
elementos).
ordered = TRUE
: Orden importa (permuta, no
combina).
nsamp <- function(n, k, replace = FALSE, ordered = TRUE) {
if (ordered) {
if (replace) {
return(n^k) # Producto cartesiano con repetición
} else {
return(factorial(n) / factorial(n - k)) # Permutaciones sin repetición
}
} else {
if (replace) {
return(choose(n + k - 1, k)) # Combinaciones con repetición
} else {
return(choose(n, k)) # Combinaciones sin repetición
}
}
}
Sean \(A\) y \(B\) dos eventos de un espacio muestral \(\Omega\ne \emptyset\). La probabilidad condicional del evento \(A\) dado el evento \(B\), simbolizada por \(P(A/B)\), se define como \[P(A/B)\;=\; \frac{P(A \cap B)}{P(B)} \;=\; \frac{\# (A\cap B)}{\# B}, \quad \mbox{si $P(B) > 0$}\]
El código para escribir la expresión anterior es:
$$P(A/B)\;=\; \frac{P(A \cap B)}{P(B)} \;=\; \frac{\# (A\cap B)}{\# B}, \quad \mbox{si $P(B) >0$}$$
Si \(A\) y \(B\) son dos eventos de un espacio muestral \(\Omega\ne \emptyset\) y si \(P(B\cap A)>0\), entonces \[P(B \cap A)\; = \; P(B/A)\, P(A) \;=\; P(A/B) \,P(B)\]
El código para escribir la expresión anterior es:
$$P(B \cap A)\; = \; P(B/A)\, P(A) \;=\; P(A/B) \,P(B)$$
Supongamos que se lanzan tres dados. El objetivo es calcular la probabilidad de que las caras sean iguales sabiendo que su suma es mayor o igual que 17. Nuestro espacio muestral correspondiente es:
Omega <- rolldie(3) #A) Lanzamiento de 3 dados
nrow(Omega) #B) Tamaño de Omega
## [1] 216
Definimos nuestros eventos (el símbolo “&” es el “y” lógico) y su intersección:
A <- subset(Omega, X1 == X2 & X2== X3); A #C) Evento A
## X1 X2 X3
## 1 1 1 1
## 44 2 2 2
## 87 3 3 3
## 130 4 4 4
## 173 5 5 5
## 216 6 6 6
B <- subset(Omega, X1 + X2 +X3>= 17); B #D) Evento condicional B
## X1 X2 X3
## 180 6 6 5
## 210 6 5 6
## 215 5 6 6
## 216 6 6 6
Int <- intersect(A, B); Int #E) Intersección de A y B
## list()
Por lo tanto, sabiendo que B es el evento condicional, la probabilidad pedida es
nrow(Int)/nrow(B) #F) Probabilidad condicional con la definición
## numeric(0)
makespace = TRUE
)Supongamos que se lanzan tres dados. El objetivo es calcular la probabilidad de que las caras sean iguales sabiendo que su suma es mayor o igual que 17.
SOLUCIÓN: Para calcular la probabilidad condicional, usaremos el argumento “given” de la función “prob”. Pero antes de hacerlo, se debe agregar la opción “makespace = TRUE” para generar el espacio muestral:
Omega <- rolldie(3, makespace = TRUE) #G) Lanzamiento de 3 dados
nrow(Omega) #H) Tamaño de Omega
## [1] 216
Definimos nuestros eventos (el símbolo “&” es el “y” lógico):
A <- subset(Omega, X1 == X2 & X2== X3); A #I) Evento A
## X1 X2 X3 prob
## 1 1 1 1 0.00462963
## 44 2 2 2 0.00462963
## 87 3 3 3 0.00462963
## 130 4 4 4 0.00462963
## 173 5 5 5 0.00462963
## 216 6 6 6 0.00462963
B <- subset(Omega, X1 + X2 +X3>= 17); B #J) Evento condicional B
## X1 X2 X3 prob
## 180 6 6 5 0.00462963
## 210 6 5 6 0.00462963
## 215 5 6 6 0.00462963
## 216 6 6 6 0.00462963
Como la función rolldie(n)
que incluye
makespace = TRUE
, se puede usar este cálculo manualmente.
Por lo tanto, sabiendo que \(B\) es el
evento condicional, la probabilidad pedida es
# Intersección A ∩ B
AB <- merge(A, B)
# Probabilidades condicionales
p_A_given_B <- sum(AB$prob) / sum(B$prob)
p_A_given_B
## [1] 0.25
Los siguientes datos representan los resultados obtenidos al realizar una encuesta a 400 estudiantes universitarios. En este documento, se importará la base de datos desde una dirección web (dos opciones):
Opción A (web, desde github): Para esta opción, se necesita cargar la librería “repmis”:
library(repmis)
source_data("https://github.com/hllinas/DatosPublicos/blob/main/Estudiantes.Rdata?raw=false")
datosCompleto <- Estudiantes
attach(datosCompleto)
Opción B (web, desde Google Drive):
url.dat<- "http://bit.ly/Database-Estudiantes"
datosCompleto <- read.delim(url.dat)
attach(datosCompleto)
Recuérdense las otras opciones, si tienen las bases de datos descargadas en su sesión de trabajo (ya sea en extensiones en Rdata, en excel o en otros formatos). Para más detalles, véase el documento R básico. A manera de ejemplo:
Opción C (local, con archivo en Rdata):
load(file="Estudiantes.Rdata")
datosCompleto <- Estudiantes
attach(datosCompleto)
Opción D (local, con archivo en excel):
datosCompleto <- read.delim('clipboard')
attach(datosCompleto)
El objetivo es utilizar esta información para calcular probabilidades condicionales. Para ello, nos ayudaremos de la definición de probabilidad clásica. Es decir, probablidades de la forma: \[P(A)\;= \; \frac{\mbox{Número de elementos de $A$}}{\mbox{Número de elementos de $\Omega$}}\]
Considere solamente las primeras 100 observaciones. De esta base de datos, tenga solo en cuenta los estudiantes que son fumadores. Supongamos que, al azar, se seleccionan cuatro estudiantes que son fumadores.
a) Defina dos data frames:
- "datos": con las 100 primeras observaciones. Verifique su tamaño.
- "datosFuma": obtenido al filtrar "datos" y representa a los estudiantes fumadores.
Verifique su tamaño.
b) Defina tres objetos:
- "Fuma": estudiantes que fuman (dentro de "datos"). Conviértalo en factor.
- "Sexo": sexo de los estudiantes (dentro de "datos"). Conviértalo en factor.
- "SexoF" sexo de los estudiantes (dentro de "datosFuma"). Conviértalo en factor.
c) Construya dos tablas de frecuencias:
- Una tabla de contingencia (cruzada) para Sexo y Fuma.
- Una tabla de frecuencias solo para SexoF. Compare con la tabla anterior.
d) ¿Cuál es la probabilidad de seleccionar dos mujeres y dos hombres?
e) Si seleccionan de uno en uno, ¿cuál es la probabilidad de que las dos primeras personas
seleccionadas sean mujeres y las dos últimas, hombres.
f) ¿Cuál es la probabilidad de seleccionar cuatro mujeres?
g) ¿Cuál es la probabilidad de seleccionar tres hombres?
h) ¿Cuál es la probabilidad de seleccionar cuatro mujeres y tres hombres?
i) ¿Cuál es la probabilidad de seleccionar cuatro mujeres o tres hombres?
j) ¿Cuál es la probabilidad de que no seleccionemos hombres?
k) ¿Cuál es la probabilidad de que seleccionemos un hombre?
l) ¿Cuál es la probabilidad de que seleccionemos dos hombres?
m) ¿Cuál es la probabilidad de seleccionar máximo dos hombres?
n) ¿Cuál es la probabilidad de seleccionar al menos tres hombres?
o) ¿Cuál es la probabilidad de seleccionar máximo dos mujeres?
p) Si se seleccionan de uno en uno, ¿cuál es la probabilidad de que los tres
primeros estudiantes seleccionados sean mujeres y el último un hombre?
q) Si se seleccionan de uno en uno, ¿cuál es la probabilidad de que los dos
primeros estudiantes seleccionados sean mujeres, el tercero un hombre y el último, una mujer?
r) Si se seleccionan de uno en uno, ¿cuál es la probabilidad de que los cuatro estudiantes
seleccionados sean mujeres?
s) Si se seleccionan de uno en uno, ¿cuál es la probabilidad de que los dos primeros estudiantes seleccionados sean mujeres?
Filtramos nuestra base de datos:
datos <- datosCompleto[1:100,] #A) La nueva base de datos
nrow(datos) #B) Número de observaciones
## [1] 100
names(datos)
## [1] "Observacion" "ID" "Sexo" "SexoNum" "Edad"
## [6] "Fuma" "Estatura" "Colegio" "Estrato" "Financiacion"
## [11] "Acumulado" "P1" "P2" "P3" "Final"
## [16] "Definitiva" "Gastos" "Ingreso" "Gas" "Clases"
## [21] "Ley" "PandemiaCat" "PandemiaNum" "Likert1" "Likert2"
## [26] "Likert3" "Likert4" "Likert5" "AGPEQ1" "AGPEQ2"
## [31] "AGPEQ3" "SATS1" "SATS2" "SATS3" "SATS4"
## [36] "IDARE1.1" "IDARE1.2" "IDARE1.3" "IDARE1.4" "IDARE1.5"
## [41] "IDARE2.6" "IDARE2.7" "IDARE2.8" "IDARE2.9" "IDARE2.10"
## [46] "Puntaje"
Ahora volvemos a filtrar el data frame anterior para obtener
solamente la información de estudiantes que fuman (se utilizará la
librería dplyr
):
library(dplyr)
datosFuma <- datos %>% filter(Fuma=="Si") #C) Data frame estudiantes que fuman
nrow(datosFuma) #D) Número de observaciones
## [1] 55
Definimos las variables categóricas y revisamos sus niveles:
Fuma <- as.factor(datos$Fuma) #E) La variable Fuma en "datos"
levels(Fuma) #F) Sus niveles
## [1] "No" "Si"
Sexo <- as.factor(datos$Sexo) #G) La variable Sexo en "datos"
levels(Sexo) #H) Sus niveles
## [1] "Femenino" "Masculino"
SexoF <- as.factor(datosFuma$Sexo) #I) La variable Sexo en "datosFuma"
levels(SexoF) #J) Sus niveles
## [1] "Femenino" "Masculino"
La tabla de contingencia para Sexo y Fuma es:
xtabs(~Sexo +Fuma, data=datos) #K) Tabla de contingencia: Sexo vs Fuma
## Fuma
## Sexo No Si
## Femenino 21 28
## Masculino 24 27
La tabla de frecuencias para SexoF es
xtabs(~SexoF, data=datos) #L) Tabla de frecuencias para SexoF
## SexoF
## Femenino Masculino
## 28 27
Utilizaremos combinaciones y aplicaremos probabilidad clásica. Tenemos:
Omega <- choose(55, 4); Omega #M) Tamaño del espacio muestral
## [1] 341055
Mujer <- choose(28, 2); Mujer #N) Combinaciones de las mujeres
## [1] 378
Hombre <- choose(27,2); Hombre #O) Combinaciones de los hombres
## [1] 351
La probabilidad de seleccionar dos mujeres y dos hombres es \[P(A)= \frac{(378)(351)}{341055}= 0.3890\]
El código para escribir la expresión anterior es:
$$P(A)= \frac{(378)(351)}{341055}= 0.3890$$
Probabilidad_d <- (Mujer * Hombre)/Omega; Probabilidad_d #P) Probabilidad pedida
## [1] 0.3890223
Utilizaremos permutaciones sin repetición de \(n\) objetos tomados de \(k\) en \(k\):
Omega <- factorial(55)/factorial(55-4); Omega #Q) Tamaño del espacio muestral
## [1] 8185320
Mujer <- factorial(28)/factorial(28-2); Mujer #R) Permutaciones de las mujeres
## [1] 756
Hombre <- factorial(27)/factorial(27-2); Hombre #S) Permutaciones de los hombres
## [1] 702
La probabilidad de que las dos primeras personas seleccionadas sean mujeres y las dos últimas, hombres, es \[P(A)= \frac{(756)(702)}{8185320}=0.0648\]
El código para escribir la expresión anterior es:
$$P(A)= \frac{(756)(702)}{8185320}=0.0648$$
Probabilidad_e <- (Mujer * Hombre)/Omega; Probabilidad_e #T) Probabilidad pedida
## [1] 0.06483705
Utilizaremos combinaciones y aplicaremos probabilidad clásica. Tenemos:
Omega <- choose(55, 4); Omega #A) Tamaño del espacio muestral
## [1] 341055
Mujer <- choose(28, 4); Mujer #B) Combinaciones de las mujeres
## [1] 20475
La probabilidad de seleccionar cuatro mujeres es \[P(A)= \frac{20475}{341055}=0.0600\]
El código para escribir la expresión anterior es:
$$P(A)= \frac{20475}{341055}=0.0600$$
Probabilidad_f <- Mujer/Omega; Probabilidad_f #C) Probabilidad pedida
## [1] 0.06003431
Utilizaremos combinaciones y aplicaremos probabilidad clásica. Tenemos:
Omega <- choose(55, 4); Omega #D) Tamaño del espacio muestral
## [1] 341055
Hombre <- choose(27,3); Hombre #E) Combinaciones de los hombres
## [1] 2925
Mujer <- choose(28, 1); Mujer #F) Combinaciones de las mujeres
## [1] 28
La probabilidad de seleccionar tres hombres es \[P(A)= \frac{(2925)(28)}{341055}=0.2401\]
El código para escribir la expresión anterior es:
$$P(A)= \frac{(2925)(28)}{341055}=0.2401$$
Probabilidad_g <- (Hombre * Mujer)/Omega; Probabilidad_g #G) Probabilidad pedida
## [1] 0.2401372
La probabilidad de seleccionar cuatro mujeres y tres hombres es 0, ya que los eventos “seleccionar cuatro mujeres” y “seleccionar tres hombres” son disyuntos (intersecciones vacías):
Probabilidad_h <- 0; Probabilidad_h #H) Prob. pedida
## [1] 0
Se aplicará el teorema de adición para dos eventos: \[P(A\cup B)= P(A) + P(B) - P(A\cap B)\]
El código para escribir la expresión anterior es:
$$P(A\cup B)= P(A) + P(B) - P(A\cap B)$$
Por el inciso (h), la probabilidad de la intersección de los eventos “seleccionar cuatro mujeres” y “seleccionar tres hombres” es cero. Entonces: \(P(A\cup B)= P(A) + P(B)\). De los resultados encontrados en f y g, la probabilidad de seleccionar cuatro mujeres o tres hombres es: \[P(A) = 0.0600 + 0.2401 = 0.3001\]
El código para escribir la expresión anterior es:
$$P(A) = 0.0600 + 0.2401 = 0.3001$$
Probabilidad_i <- Probabilidad_f +Probabilidad_g; Probabilidad_i #I) Prob. pedida
## [1] 0.3001715
Si no se seleccionan hombres, entonces, hemos seleccionado cuatro mujeres. Por lo tanto, por la parte (f), la probabilidad de que no seleccionemos hombres es 0.0600.
Probabilidad_j <- Probabilidad_f; Probabilidad_j #J) Probabilidad pedida
## [1] 0.06003431
Utilizaremos combinaciones y aplicaremos probabilidad clásica. Tenemos:
Omega <- choose(55, 4); Omega #J) Tamaño del espacio muestral
## [1] 341055
Hombre <- choose(27,1); Hombre #K) Combinaciones de los hombres
## [1] 27
Mujer <- choose(28, 3); Mujer #L) Combinaciones de las mujeres
## [1] 3276
La probabilidad de seleccionar un hombre es \[P(A)= \frac{(27)(3276)}{341055}=0.2593\]
El código para escribir la expresión anterior es:
$$P(A)= \frac{(27)(3276)}{341055}=0.2593$$
Probabilidad_k <- (Hombre * Mujer)/Omega; Probabilidad_k #M) Probabilidad pedida
## [1] 0.2593482
Al seleccionar dos hombres, también estaremos seleccionando dos mujeres. Por lo tanto, por la parte (d), la probabilidad de que seleccionemos dos hombres es 0.3890.
Probabilidad_l <- Probabilidad_d; Probabilidad_l #M) Probabilidad pedida
## [1] 0.3890223
la probabilidad de seleccionar máximo dos hombres se halla sumando las probabilidades de seleccionar 0, 1 y 2 hombres. Entonces, por las partes (j), (k) y (l), tenemos que \[P(A) = 0.0600 + 0.2593 + 0.3890 = 0.7084\]
El código para escribir la expresión anterior es:
$$P(A) = 0.0600 + 0.2593 + 0.3890 = 0.7084$$
Probabilidad_m <- Probabilidad_j + Probabilidad_k + Probabilidad_l; Probabilidad_m #N) Probabilidad pedida
## [1] 0.7084048
El evento “seleccionar al menos tres hombres” es el complemento del evento “seleccionar máximo dos hombres”. Por lo tanto, por la parte (m), la probabilidad pedida es: \[P(\overline {A})= 1- P(A) = 1 - 0.7084 = 0.2916\]
El código para escribir la expresión anterior es:
$$P(\overline {A})= 1- P(A) = 1 - 0.7084 = 0.2916$$
Probabilidad_n <- 1 - Probabilidad_m; Probabilidad_n #O) Probabilidad pedida
## [1] 0.2915952
la probabilidad de seleccionar máximo dos mujeres es equivalente a la probabilidad de seleccionar al menos tres hombres. Por lo tanto, por la parte (n), la probabilidad pedida es: 0.2916
Probabilidad_o <- Probabilidad_n; Probabilidad_o #P) Probabilidad pedida
## [1] 0.2915952
Utilizaremos permutaciones sin repetición de \(n\) objetos tomados de \(k\) en \(k\):
Omega <- factorial(55)/factorial(55-4); Omega #Q) Tamaño del espacio muestral
## [1] 8185320
Mujer <- factorial(28)/factorial(28-3); Mujer #R) Permutaciones de las mujeres
## [1] 19656
Hombre <- factorial(27)/factorial(27-1); Hombre #S) Permutaciones de los hombres
## [1] 27
La probabilidad de que los tres primeros estudiantes seleccionados sean mujeres y el último un hombre es \[P(A)= \frac{(19656)(27)}{8185320}=0.0648\]
El código para escribir la expresión anterior es:
$$P(A)= \frac{(19656)(27)}{8185320}=0.0648$$
Probabilidad_p <- (Mujer * Hombre)/Omega; Probabilidad_p #T) Probabilidad pedida
## [1] 0.06483705
Basicamente, en este inciso, se pide la misma probabilidad formulada en (p). Por lo tanto, la probabilidad de que los dos primeros estudiantes seleccionados sean mujeres, el tercero un hombre y el último, una mujer es 0.0648.
Probabilidad_q <- Probabilidad_p; Probabilidad_q #A) Probabilidad pedida
## [1] 0.06483705
Utilizaremos permutaciones sin repetición de \(n\) objetos tomados de \(k\) en \(k\):
Omega <- factorial(55)/factorial(55-4); Omega #B) Tamaño del espacio muestral
## [1] 8185320
Mujer <- factorial(28)/factorial(28-4); Mujer #C) Permutaciones de las mujeres
## [1] 491400
La probabilidad de que los tres primeros estudiantes seleccionados sean mujeres y el último un hombre es \[P(A)= \frac{491400}{8185320}=0.0600\]
El código para escribir la expresión anterior es:
$$P(A)= \frac{491400}{8185320}=0.0600$$
Probabilidad_r <- Mujer/Omega; Probabilidad_r #D) Probabilidad pedida
## [1] 0.06003431
Como en la dos primeras selecciones aparecen las mujeres, entonces, para en las dos últimas dos posiciones pueden ocurrir alguno de los eventos siguientes:
Por esta razón, la probabilidad de que los dos primeros estudiantes seleccionados sean mujeres es la suma de aquéllas halladas en esos incisos. Es decir, \[P(A) =0.06484 + 0.06484 + 0.06484 + 0.0600 = 0.5787\]
El código para escribir la expresión anterior es:
$$P(A) =0.06484 + 0.06484 + 0.06484 + 0.0600 = 0.5787$$
Probabilidad_s <- Probabilidad_d + Probabilidad_p + Probabilidad_q + Probabilidad_r
Probabilidad_s #E) Probabilidad pedida
## [1] 0.5787307
Crear un nuevo documento R Markdown, realizando los ejercicios que se indican abajo. Interprete los resultados hallados.
NOTA: Al final de la sección 2.4 de la referencia 2 (ver abajo), se pueden revisar más ejercicios.
Considere solamente las observaciones que van desde la 132 hasta la 193. De esta base de datos, tenga solo en cuenta los estudiantes que son fumadores. Supongamos que se seleccionan cuatro estudiantes al azar.
Repita el ejercicio anterior, considerando solamente las observaciones que van desde la 133 hasta la 193 y, de esta base de datos, teniendo en cuenta solo en cuenta los estudiantes que son fumadores.
Repita el ejercicio anterior, considerando solamente las observaciones que van desde la 131 hasta la 194 y, de esta base de datos, teniendo en cuenta solo los estudiantes que sean fumadores.
Repita el ejercicio anterior, considerando solamente las observaciones que van desde la 130 hasta la 195 y, de esta base de datos, teniendo en cuenta solo los estudiantes que sean mujeres.
IPSUR (Introduction to Probability and Statistics Using R): https://www.nongnu.org/ipsur/
LLinás, H.; Rojas, C., Estadística descriptiva y distribuciones de probabilidad. Barranquilla: Ediciones Uninorte, 2005.
If you found any ERRORS or have SUGGESTIONS, please report them to my email. Thanks.