Intro a la Estadística Dr. Ulises Flores Llanos
Vamos a preparar el entorno de trabajo estableciendo el directorio donde guardaremos nuestros archivos y resultados
setwd("~/Dropbox/Varios interesantes/UMIE y estadística/FLACSO_2024/Diplom_Data_Science")
Podemos cargar librerías de forma rápida con la siguiente instrucción:
paquetes = c("readr","questionr", "survey", "haven", "readxl", "dplyr", "foreign", "tidyverse", "writexl", "openxlsx", "ggplot2")
for (i in paquetes) {
if (!requireNamespace(i, quietly = TRUE)) {
install.packages(i)
}
library(i, character.only = TRUE)
}
Vamos a definir primero un vector de datos. Los datos representan las calificaciones de algunos alumnos en una prueba estandarizada con valor máximo de 620 puntos y mínimo de 100.
datos<-c(542, 490, 582, 511, 515, 564, 500, 602, 488, 512,
518, 522, 505, 569, 575, 515, 520, 528, 533, 515)
nombre<-c("Luisa","Ana","Miriam","Pedro","Ricardo","José Luis","Alejandra","Marisol",
"John","Juanira","Carolina", "Sandra", "Mercedes", "Jorge", "Luis", "Alberto",
"Carlos", "Karla", "Marla", "Yazmin") # Vector de texto
sexo<-c("M", "M", "M", "H")
edad<-c(23, 45,27,36, 19, 65, 44,42, 39, 27, 35, 56, 23, 31, 32, 28, 34, 29, 31, 35) # Vector de numeros enteros
ingreso<-c(23.50, 450.01, 58.89, 789.85, 625.3, 423.9, 87.9, 855.9, 32.65, 543.8, 627.3,
327.9, 564.9, 627.6, 193, 456.8, 675.9, 402.3, 527.5, 539.6) # Vector de numeros con decimales (flotantes/racionales)
nacion<-c("Mx", "Ur", "Mx", "Pa", "Mx", "Ho", "Co", "Mx", "Mx", "Ar", "Pe", "Ve", "Ec",
"Mx", "Ec", "Pe", "Pa", "Ho", "Co", "Ur")
Cuando seleccionamos “datos” y lo corrmos, aparece en nuestro entorno global los datos. Dado que ya formamos ese vector de valores, podemos visualizarlo si “corremos” su nombre, es decir, seleccionamos datos y damos click en Run
datos
## [1] 542 490 582 511 515 564 500 602 488 512 518 522 505 569 575 515 520 528 533
## [20] 515
O los podemos visualizar ordenados como una tabla de datos, como en Excel :P todos en conjunto.
tabla <- data.frame(nombre, sexo,edad,ingreso,nacion) # data.frame une vectores con distintas caracteristicas
xbarra<-mean(datos) #Media
xbarra<-mean(edad)
xbarra2<-mean(ingreso)
Medias descriptivas que necesitamos para la prueba de hipotesis
dest<-sd(datos) #Desviacion estandar
dest1<-sd(edad)
dest2<- sd(ingreso)
ee<-dest/sqrt(20) #Error estandar
summary(tabla)
## nombre sexo edad ingreso
## Length:20 Length:20 Min. :19.00 Min. : 23.5
## Class :character Class :character 1st Qu.:27.75 1st Qu.:294.2
## Mode :character Mode :character Median :33.00 Median :492.1
## Mean :35.05 Mean :441.7
## 3rd Qu.:39.75 3rd Qu.:625.8
## Max. :65.00 Max. :855.9
## nacion
## Length:20
## Class :character
## Mode :character
##
##
##
tabla %>%
summarise_all(list(media = ~mean(., na.rm = TRUE),
mediana = ~median(., na.rm = TRUE),
sd = ~sd(., na.rm = TRUE)))
## Warning: There were 9 warnings in `summarise()`.
## The first warning was:
## ℹ In argument: `nombre_media = (structure(function (..., .x = ..1, .y = ..2, .
## = ..1) ...`.
## Caused by warning in `mean.default()`:
## ! argument is not numeric or logical: returning NA
## ℹ Run `dplyr::last_dplyr_warnings()` to see the 8 remaining warnings.
## nombre_media sexo_media edad_media ingreso_media nacion_media nombre_mediana
## 1 NA NA 35.05 441.725 NA NA
## sexo_mediana edad_mediana ingreso_mediana nacion_mediana nombre_sd sexo_sd
## 1 NA 33 492.15 NA NA NA
## edad_sd ingreso_sd nacion_sd
## 1 11.20843 249.6084 NA
Para ver los resultados en pantalla
dest
## [1] 31.87327
xbarra
## [1] 35.05
ee
## [1] 7.12708
Para hacer un gráfico podemos utilizar la biblioteca ggplot
ggplot(tabla, aes(x = nombre, y = datos)) +
geom_bar(stat = "identity", fill = "skyblue") +
geom_text(aes(label = datos), vjust = -0.5, color = "black") +
labs(title = "Gráfica de Barras con Valores Máximos",
x = "nombre",
y = "datos") +
theme_minimal()
#Histograma de frecuencias
hist(ingreso,
main = "Histograma de Frecuencias", # Título del histograma
xlab = "Valor", # Etiqueta del eje x
ylab = "Frecuencia", # Etiqueta del eje y
col = "blue", # Color de las barras
border = "black", # Color del borde de las barras
breaks = 4) # Número de intervalos (bins)
Creamos un data frame con los valores de la normal estándar, para poder graficar una curva Normal usando ggplot
x <- seq(-4, 4, length = 100)
y <- dnorm(x)
datos1 <- data.frame(x, y)
ggplot(datos1, aes(x = x, y = y)) +
geom_line(color = "blue", size = 1.5) +
labs(title = "Distribución Normal Estándar",
x = "Z",
y = "Densidad") +
theme_minimal()
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
Obtenemos el estadistico de prueba.
t<-(xbarra-542)/ee
t
## [1] -71.13012
Obtenemos el valor de tablas, como la varianza se desconoce entonces se debe usar una distribucion t, en este caso con alfa=0.05, 1-alfa=.95
tt<-qt(0.05, 19, lower.tail = T)
tt
## [1] -1.729133
Como t=-1.64>tt=-2.19, entonces con nivel de confianza de 98% ¿CUál es el resultado?…
…No hay suficiente evidencia para rechazar H0.
Obtenemos el p-valor
pvalor<-pt(t, 19, lower.tail = TRUE)
pvalor
## [1] 7.94759e-25
Grafica t de Student 20 grados de libertad
plot( function(x) dt( x, df = 20 ), -5, 5, ylim = c( 0, 0.4 ),
col = "red", type = "l", lwd = 2,
main = "Función densidad t de Student con 20 gl" )
Hacemos un contrate de medias.
t.test(datos, mu=542, alternative = "greater", conf.level=0.975 )
##
## One Sample t-test
##
## data: datos
## t = -1.6416, df = 19, p-value = 0.9414
## alternative hypothesis: true mean is greater than 542
## 97.5 percent confidence interval:
## 515.3829 Inf
## sample estimates:
## mean of x
## 530.3
t.test(datos, mu=542, conf.level=0.95 )
##
## One Sample t-test
##
## data: datos
## t = -1.6416, df = 19, p-value = 0.1171
## alternative hypothesis: true mean is not equal to 542
## 95 percent confidence interval:
## 515.3829 545.2171
## sample estimates:
## mean of x
## 530.3
Pvalor de colar derecha
pvalor1<-pt(t, 19, lower.tail = FALSE)
pvalor1
## [1] 1
Pvalor de dos colas
pvalor2<-2*pt(t, 19, lower.tail = TRUE)
pvalor2
## [1] 1.589518e-24
Pruebas de proporciones
prop.test(x = 302, n = 500, correct = TRUE)
##
## 1-sample proportions test with continuity correction
##
## data: 302 out of 500, null probability 0.5
## X-squared = 21.218, df = 1, p-value = 4.099e-06
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.5594851 0.6468922
## sample estimates:
## p
## 0.604
prop.test(x = 302, n = 500, correct = FALSE, p=0.65)
##
## 1-sample proportions test without continuity correction
##
## data: 302 out of 500, null probability 0.65
## X-squared = 4.6505, df = 1, p-value = 0.03104
## alternative hypothesis: true p is not equal to 0.65
## 95 percent confidence interval:
## 0.5604958 0.6459183
## sample estimates:
## p
## 0.604
Proporcion estimada, pgorro
pgorro<-302/500
ee<-sqrt((0.65)*(1-0.65)/(500))
z<-(pgorro-.65)/ee
pgorro
## [1] 0.604
ee
## [1] 0.02133073
z
## [1] -2.156513
qnorm(0.95)
## [1] 1.644854
qnorm(0.975)
## [1] 1.959964
pvalorpr<-pnorm(z,mean=0, sd=1,lower.tail=T)
pvalorpr
## [1] 0.0155218
prop.test(x = 302, n = 500, p=0.65, alternative = "two.sided")
##
## 1-sample proportions test with continuity correction
##
## data: 302 out of 500, null probability 0.65
## X-squared = 4.4505, df = 1, p-value = 0.03489
## alternative hypothesis: true p is not equal to 0.65
## 95 percent confidence interval:
## 0.5594851 0.6468922
## sample estimates:
## p
## 0.604