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