a. Crear una función sin entradas pero que simule el lanzamiento de dos dados legales y sume el resulado de ellos.
Se define la variable aleatoria como: Suma de las caras resultantes de dos dados en un lanzamiento.
dos_dados=function(){
x=sample(1:6,1,replace=F)
y=sample(1:6,1,replace=F)
return(x+y)
}
dos_dados()
## [1] 3
b. Generalizar la función para que tenga como entrada el total de lanzamientos y cuente los resultados de una condición en particular (ejemplo suma igual a 12).
n_lan = function(n, condicion){
cont=0
for (i in 1:n){
if (dos_dados()==condicion){
cont=cont+1}
}
print(cont)
}
n_lan(1000,12)
## [1] 21
c. Con la función de b. compare los resultados de la simulación para 10000 lanzamientos con los resultados esperados de acuerdo a la probabilidad calculada con el total de combinaciones.
#Teóricamente
Posibles=expand.grid(D1=1:6, D2=1:6) #Calcula todas posibles combinaciones en el lanzamiento de dos dados con 6 caras cada uno
Suma=apply(Posibles,1,sum) #Calcula la suma de las caras para cada posible combinación
Combinaciones=data.frame(Posibles,Suma)
colnames(Combinaciones)<-c("Dado 1", "Dado 2", "Suma")
P.teorica=table(Suma)/36 #Calcula la probabilidad teórica de los posibles resultados, es decir, 2, 3, 4, 5, 6, 7, 8, 9 ,10 ,11 o 12.
#Empíricamente se simula para 10000 lanzamientos
#Se comparan las probabilidades teóricas con las empíricas
P.empirica = function(n2, condicion2){
n_lan(n = n2, condicion = condicion2)/n2
}
#Comparación de la probabilidad teórica vs la probabilidad empírica
x=c()
for(i in 2:12){
x[i]=P.empirica(n2 = 10000, condicion2=i)
}
## [1] 305
## [1] 569
## [1] 776
## [1] 1112
## [1] 1419
## [1] 1597
## [1] 1352
## [1] 1135
## [1] 811
## [1] 555
## [1] 269
plot(P.teorica, xlab="Suma de las caras resultantes", ylab="Probabilidad teórica")
points(x,col="red")
legend(x = "topright", legend = c("Teórica", "Empírica"), fill = c("black", "red"),
title = "Probabilidad")
Se observa que, dado que la cantidad de lanzamientos es grande, entonces la probabilidad empírica converge a la probabilidad teórica.
a. Genere una población con una cantidad dada de 0 y 1.
Poblacion=sample(x = c(0, 1), size = 10000, replace = TRUE)
b. Crear una función que obtenga una muestra de esa población de a. y calcule el porcentaje de 1.
Muestra01 = function(Poblacion2, n, Condicion){
Muestra <- sample(x=Poblacion2, size = n, replace = TRUE)
cont=0
for (i in 1:length(Muestra)){
if (Muestra[i] == Condicion){
cont=cont+1
}
}
PorcentajeCond <- (cont/length(Muestra))
return(PorcentajeCond)
}
El porcentaje de unos de la muestra de tamaño 300 es de
Muestra01(Poblacion2=Poblacion,300,1)*100
## [1] 49.66667
c. Repita este proceso una cantidad (mas de 1000 veces) y guarde los porcentajes de cada iteración.
m<-1050
PorcentajeM<-c()
for (i in 1:m) {
PorcentajeM[i] <- Muestra01(Poblacion2=Poblacion,300,1)
}
PorcentajeM[1:60]
## [1] 0.4600000 0.4900000 0.4800000 0.4966667 0.5266667 0.4933333 0.4800000
## [8] 0.5100000 0.4566667 0.4966667 0.4966667 0.4833333 0.4900000 0.5300000
## [15] 0.5133333 0.5133333 0.4800000 0.5133333 0.5033333 0.4533333 0.5266667
## [22] 0.5433333 0.5200000 0.5100000 0.5100000 0.5233333 0.5233333 0.5333333
## [29] 0.4433333 0.4800000 0.4966667 0.5033333 0.5166667 0.4866667 0.5100000
## [36] 0.4900000 0.5033333 0.5533333 0.4733333 0.5000000 0.4566667 0.5200000
## [43] 0.5266667 0.5000000 0.4600000 0.4900000 0.5066667 0.5066667 0.4866667
## [50] 0.5800000 0.4933333 0.4833333 0.5466667 0.4766667 0.5366667 0.5000000
## [57] 0.5400000 0.5400000 0.5400000 0.4900000
d. Grafique los resultados de estos porcentajes y calcule algunos indicadores descriptivos (compare los resultados con la población generada inicial).
hist(PorcentajeM, main="Frecuencias de unos para 1050 muestras de tamaño 300")
abline(v=0.5,col="red")
Se observa que los porcentajes de ocurrencia del resultado 1 para 1050 muestras de tamaño 300, están centrados en el porcentaje teórico esperado, es decir, al rededor del 50%.
summary(PorcentajeM)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.4033 0.4900 0.5067 0.5066 0.5267 0.5967
Esto se puede evidenciar ya que el rango de valores es pequeño (ver mínimo y máximo) y el primer y tercer cuartil están a distancias similares del valor medio y mediano.
library(ggplot2)
library(ggpubr)
#Datos cuantitativos
Estatura=sample(100:170, 40,replace = TRUE)
#Datos cualitativos
Satisfacion=sample(1:3, 40,replace = TRUE)
#Matriz de datos
Datos =data.frame("Estatura" = Estatura, "Satisfacion"=as.character(Satisfacion))
Datos
## Estatura Satisfacion
## 1 168 3
## 2 154 2
## 3 102 2
## 4 164 3
## 5 151 1
## 6 125 1
## 7 144 2
## 8 143 1
## 9 112 1
## 10 164 2
## 11 147 3
## 12 110 3
## 13 167 3
## 14 121 3
## 15 151 1
## 16 153 2
## 17 139 1
## 18 135 3
## 19 150 3
## 20 102 1
## 21 153 1
## 22 133 2
## 23 137 2
## 24 150 2
## 25 112 2
## 26 147 1
## 27 147 2
## 28 168 2
## 29 120 3
## 30 102 3
## 31 123 2
## 32 151 3
## 33 168 3
## 34 111 2
## 35 165 2
## 36 158 2
## 37 163 3
## 38 158 1
## 39 111 3
## 40 162 1
a. Genere una función que calcule indicadores y graficos descriptivos de una variable cuantitativa.
library(statip)
cuantitativa = function(matriz,variableAnalizar) {
cant=length(matriz[[variableAnalizar]])
minimo = min(matriz[[variableAnalizar]], na.rm = TRUE)
q1 = quantile(matriz[[variableAnalizar]], probs = 0.25, na.rm = TRUE)
media = mean.default(matriz[[variableAnalizar]], na.rm = TRUE)
mediana = median.default(matriz[[variableAnalizar]], na.rm = TRUE)
q3 = quantile(matriz[[variableAnalizar]], probs = 0.75, na.rm = TRUE)
maximo = max(matriz[[variableAnalizar]], na.rm = TRUE)
var = var(matriz[[variableAnalizar]], na.rm = TRUE)
desv = sd(matriz[[variableAnalizar]], na.rm = TRUE)
moda = mfv(matriz[[variableAnalizar]])
descrip=as.numeric(unlist(c(cant,minimo, q1, media, mediana, q3, maximo, round(var,3), round(desv,3), moda)))
indicador = c("Tamaño","Mínimo", "Q1", "Media", "Mediana","Q3","Máximo","Var","Desviación","Moda")
resumen = as.data.frame(rbind(indicador,descrip))
print(paste("Indicadores", "->", variableAnalizar))
return(resumen)
}
Visualcuantitativa=function(matriz,variableAnalizar){
g1=ggplot(matriz,aes(matriz[[variableAnalizar]]))+geom_histogram()+theme_bw()
return(ggarrange(g1,size=2))
}
b. Genere una función que calcule indicadores y graficos descriptivos de una variable cualitativa.
cualitativa=function(matriz,variableAnalizar) {
print(paste("Proporción de ", variableAnalizar," del conjunto de datos"))
return(prop.table(table(matriz[[variableAnalizar]]))*100)
}
Visualcualitativa=function(matriz,variableAnalizar){
g1 =ggplot(matriz, aes(matriz[[variableAnalizar]]))+geom_bar()+ ggtitle(paste("Frecuencia de ", variableAnalizar))+xlab(variableAnalizar)+theme_bw()
return(ggarrange(g1,size=2))
}
c. Genere una función que de acuerdo al tipo de variable use la función de a. ó b. para generar resultados descriptivos.
Descriptivas=function(matriz,variableAnalizar){
switch(class(matriz[[variableAnalizar]]),
character = {
print(paste("Descriptivas variable ",variableAnalizar))
print(cualitativa(matriz,variableAnalizar))
print(Visualcualitativa(matriz,variableAnalizar))
},
integer = {
print(paste("Descriptivas variable ",variableAnalizar))
print(cuantitativa(matriz,variableAnalizar))
print(Visualcuantitativa(matriz,variableAnalizar))
},
numeric ={
print(paste("Descriptivas variable ",variableAnalizar))
print(cuantitativa(matriz,variableAnalizar))
print(Visualcuantitativa(matriz,variableAnalizar))
},
"Tipo de dato no válido"
)
}
Note que con la función c. es posible recorrer una base de datos grande y realizar una exploración univariada de forma automatica.
Resultados
name.var=names(Datos)
for (i in 1:length(name.var)){
Descriptivas(Datos,name.var[i])
}
## [1] "Descriptivas variable Estatura"
## [1] "Indicadores -> Estatura"
## V1 V2 V3 V4 V5 V6 V7 V8 V9
## indicador Tamaño Mínimo Q1 Media Mediana Q3 Máximo Var Desviación
## descrip 40 102 122.5 141.025 147 158 168 450.948 21.236
## V10 V11 V12 V13
## indicador Moda Tamaño Mínimo Q1
## descrip 102 147 151 168
## [1] "Descriptivas variable Satisfacion"
## [1] "Proporción de Satisfacion del conjunto de datos"
##
## 1 2 3
## 27.5 37.5 35.0