Librerias

library(tidyr)
library(dplyr)
## 
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats   1.0.0     ✔ readr     2.1.5
## ✔ ggplot2   3.5.2     ✔ stringr   1.5.1
## ✔ lubridate 1.9.4     ✔ tibble    3.2.1
## ✔ purrr     1.0.4
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(ggplot2)
library(fmsb)
library(stringr)
library(tm)
## Cargando paquete requerido: NLP
## 
## Adjuntando el paquete: 'NLP'
## 
## The following object is masked from 'package:ggplot2':
## 
##     annotate
library(RColorBrewer)
library(wordcloud)
library(tidytext)
library(scales)
## 
## Adjuntando el paquete: 'scales'
## 
## The following object is masked from 'package:purrr':
## 
##     discard
## 
## The following object is masked from 'package:readr':
## 
##     col_factor
library(BSDA)
## Cargando paquete requerido: lattice
## 
## Adjuntando el paquete: 'BSDA'
## 
## The following object is masked from 'package:datasets':
## 
##     Orange

Dase de datos

MOLEC=read.csv("C://Users//Bianca//OneDrive//Escritorio//MA1001B//MOLEC_reducido.csv")
head(MOLEC)
##   year nivel_aprobado condicion_actividad libros_origen internet_motivo
## 1 2020              2                   1             2               4
## 2 2020              3                   7             0               4
## 3 2020              3                   1             0               0
## 4 2020              7                   1             2               4
## 5 2020              6                   7             2               0
## 6 2020              3                   1             0               4
##   no_lectura_motivo libros_gasto_num libros_leidos_12m_num
## 1                 0                0                     1
## 2                 0                0                     0
## 3                 3                0                     0
## 4                 0                0                     2
## 5                 0                0                     2
## 6                 0                0                     0

Diccionario:

Relación del nivel educativo y razon para NO leer de las personas

# crear df con el nivel educativo de las personas y su razon para no leer
nivel_no_leer=MOLEC%>%
  select(nivel_aprobado,no_lectura_motivo)%>%
  filter(nivel_aprobado!=99,nivel_aprobado!="b",no_lectura_motivo!=6
         ,no_lectura_motivo!="b",no_lectura_motivo!=0)%>%  # Omite "No se" y Pase
  mutate(nivel_aprobado=case_when(    # Generalizando niveles
    nivel_aprobado==0 ~ "Ninguno",
    nivel_aprobado %in% c(1,2,3) ~ "Básica",
    nivel_aprobado==4 ~ "Media Superior",
    nivel_aprobado %in% c(5,6,7) ~ "Superior",
    nivel_aprobado %in% c(8,9) ~ "Posgrado"))%>%
  mutate(no_lectura_motivo=case_when(  # Nombrando motivos 
    no_lectura_motivo==1 ~ "Falta de interés,motivación o gusto",
    no_lectura_motivo==2 ~ "Prefiere realizar otras actividades",
    no_lectura_motivo==3 ~ "Falta de tiempo",
    no_lectura_motivo==4 ~ "Falta de dinero",
    no_lectura_motivo==5 ~ "Problemas de salud"))
head(nivel_no_leer)
##   nivel_aprobado                   no_lectura_motivo
## 1         Básica                     Falta de tiempo
## 2         Básica                     Falta de tiempo
## 3         Básica                     Falta de tiempo
## 4         Básica                     Falta de tiempo
## 5         Básica                     Falta de tiempo
## 6         Básica Prefiere realizar otras actividades
# generar tabla de freciencias 
tabla=table(nivel_no_leer$no_lectura_motivo,nivel_no_leer$nivel_aprobado)

# grafico de barras extendido
barplot(tabla,beside = TRUE,legend=TRUE,col=rainbow(ncol(tabla)),xlab="Nivel de estudios",ylab="Frecuencia",main = "Razones para la no lectura por nivel de estudios")

Pruebas Hipotesis

nivel de significancia del 0.04

Verificar si existe una diferencia significativa entre las medias de la población que lee y trabaja vs la que lee y no trabaja

# confianza
alpha=0.04
conf=1-alpha

# generar df con información de libros leidos en 12 meses por la condición de activdad de la persona (Trabaja o no trabaja)

libros_por_condicion_act=MOLEC%>%
  select(condicion_actividad,libros_leidos_12m_num)%>%
  filter(condicion_actividad!=6,condicion_actividad!=99)%>% #omite estudiante y pase
  mutate(condicion_actividad=case_when(
    condicion_actividad %in% c(1,2) ~ "Trabaja",
    condicion_actividad %in% c(3,4,5,7,8,9,10) ~ "No trabaja")) # generaliza trabajo
head(libros_por_condicion_act)
##   condicion_actividad libros_leidos_12m_num
## 1             Trabaja                     1
## 2          No trabaja                     0
## 3             Trabaja                     0
## 4             Trabaja                     2
## 5          No trabaja                     2
## 6             Trabaja                     0
# realizar prueba F con var.test()
var.test(libros_por_condicion_act$libros_leidos_12m_num ~ libros_por_condicion_act$condicion_actividad,conf.level=conf)
## 
##  F test to compare two variances
## 
## data:  libros_por_condicion_act$libros_leidos_12m_num by libros_por_condicion_act$condicion_actividad
## F = 0.74386, num df = 2084, denom df = 3722, p-value = 5.217e-14
## alternative hypothesis: true ratio of variances is not equal to 1
## 96 percent confidence interval:
##  0.6873253 0.8057480
## sample estimates:
## ratio of variances 
##           0.743859
cat("\nSe confirma que las varianzas de los grupos NO TRABAJA y TRABAJA son diferentes ya que no se incluye el 1 en el intervalo; varianzas diferentes también porque p es muy bajo")
## 
## Se confirma que las varianzas de los grupos NO TRABAJA y TRABAJA son diferentes ya que no se incluye el 1 en el intervalo; varianzas diferentes también porque p es muy bajo
# Ya que el 1 no se encuentra dentro del intervalo lo más probable es que las varianzas no sean iguales; hacer test de Welch (t inversa) para hallar si existe una diferencia entre las medias 

t.test(libros_por_condicion_act$libros_leidos_12m_num ~ libros_por_condicion_act$condicion_actividad,conf.level=conf,var.equal=FALSE)
## 
##  Welch Two Sample t-test
## 
## data:  libros_por_condicion_act$libros_leidos_12m_num by libros_por_condicion_act$condicion_actividad
## t = -3.5297, df = 4860.6, p-value = 0.0004198
## alternative hypothesis: true difference in means between group No trabaja and group Trabaja is not equal to 0
## 96 percent confidence interval:
##  -0.5796419 -0.1531554
## sample estimates:
## mean in group No trabaja    mean in group Trabaja 
##                 1.143405                 1.509804
cat("\nYa que p<alpha se evidencia la estadistica de diferencia de medias.\nEl intervalo de confianza de medias no incluye el 0 es decir hay diferencia significativa entre ambos grupos")
## 
## Ya que p<alpha se evidencia la estadistica de diferencia de medias.
## El intervalo de confianza de medias no incluye el 0 es decir hay diferencia significativa entre ambos grupos
cat("\n\n Existe evidencia suficiente de para rechazar H0; trabajar si se asocia a leer más libros al año segun datos del MOLEC")
## 
## 
##  Existe evidencia suficiente de para rechazar H0; trabajar si se asocia a leer más libros al año segun datos del MOLEC
alpha <- 0.04
df <- 4860.6                   # grados de libertad
t_crit <- qt(1 - alpha/2, df)  # Valor crítico bilateral de t

x <- seq(-5, 5, length=200)
y <- dt(x, df)

plot(x, y, type="l", lwd=2, xlab="t", ylab="Densidad", main="Diferencia de medias: \nPoblación que lee y trabaja VS lee y no trabaja")
polygon(c(x[x > t_crit], t_crit, max(x)), c(y[x > t_crit], 0, 0), col=rgb(1, 0, 0, 0.3))   # cola derecha
polygon(c(x[x < -t_crit], -t_crit, min(x)), c(y[x < -t_crit], 0, 0), col=rgb(1, 0, 0, 0.3)) # cola izquierda

abline(v=t_crit, col="red", lwd=2, lty=2)
abline(v=-t_crit, col="red", lwd=2, lty=2)
t_stat <- -3.5297 # tu estadístico t
abline(v=t_stat, col="blue", lwd=2)

legend("topright", legend=c("Zona de rechazo H0","Estadístico t"), col=c("red","blue"), lty=2:1, lwd=2)

Verificar si hay una diferencia significativa entre las proporciones de las personas que no lee por falta de tiempo y no tienen estudios vs las pesonas que tienen posgrados

#Usar prueba Z para diferencia de proporciones; muestra grande y grupos categoricos diferentes

# df de personas con estudios basicos o sin estudios
basicos_estudios=nivel_no_leer%>%
  filter(nivel_aprobado!="Media Superior", nivel_aprobado!="Posgrado",
         nivel_aprobado!="Superior")

# df de personas con posgrado o estudios superiores
superiores_estudios=nivel_no_leer%>%
  filter(nivel_aprobado!="Media Superior", nivel_aprobado!="Ninguno",
         nivel_aprobado!="Básica")

# n2: total de personas con estudios superiores o de posgrado; x2: total de personas con estudios superiores o de posgrado Y que no leer por falta de tiempo

n2=nrow(superiores_estudios)
x2=sum(superiores_estudios$no_lectura_motivo =="Falta de tiempo",na.rm = TRUE)

# n1: total de personas sin estudios o con estudios basicos; x1: total de personas sine studios o con estudios basicos Y que no leen por falta de tiempo

n1=nrow(basicos_estudios)
x1=sum(basicos_estudios$no_lectura_motivo =="Falta de tiempo",na.rm = TRUE)

# Calcular proporciones (digase que el grupo 2 son las personas con estudios superiores/posgrado y que el grupo 1 son las personas sin estudios o con estudios basicos) 

p2=x2/n2 # proporción de personas del grupo 2 Y que no leen por falta de tiempo
p1=x1/n1 # proproción de personas del grupo 1 Y que no leen por falta de tiempo

p=(x1+x2)/(n1+n2) # proporción combinada

# calculo de estadistico z
Z=(p1-p2)/sqrt(p*(1-p)*(1/n1+1/n2))

# calcular P bilateral
p=2*pnorm(-abs(Z))

# calcular z critico
z_critico=abs(qnorm(alpha/2))
cat("\nestadistico z:",abs(Z),"\nValor p:",p,"\nZ critico:",z_critico)
## 
## estadistico z: 2.338132 
## Valor p: 0.0193804 
## Z critico: 2.053749
cat("\nH0 es que las proporciones son iguales,\nHa es que las proporciones son diferentes.\n\n Según el analisis hay suficiente evidencia para rechazar H0 ya que p<alpha y además |z| es mayor que el valor critico de z ")
## 
## H0 es que las proporciones son iguales,
## Ha es que las proporciones son diferentes.
## 
##  Según el analisis hay suficiente evidencia para rechazar H0 ya que p<alpha y además |z| es mayor que el valor critico de z
# Valores típicos
alpha <- 0.04
z_crit <- qnorm(1 - alpha/2)   # Prueba bilateral
z_stat <- 2.3                  # z calculado

# Secuencia para la curva
x <- seq(-4, 4, length=100)
y <- dnorm(x)

plot(x, y, type="l", lwd=2, xlab="z", ylab="Densidad", main="Diferencia de Proporciones: No lectura por falta de tiempo \n Personas sin o con estudios basicos VS posgrado/superior")
abline(v=z_crit, col="red", lwd=2, lty=2)           # Valor crítico derecha
abline(v=-z_crit, col="red", lwd=2, lty=2)          # Valor crítico izquierda
abline(v=z_stat, col="blue", lwd=2)                 # Estadístico prueba
polygon(c(x[x>z_crit], z_crit, max(x)), c(y[x>z_crit], 0, 0), col=rgb(1,0,0,0.2))      # Sombra cola derecha
polygon(c(x[x<(-z_crit)], -z_crit, min(x)), c(y[x<(-z_crit)], 0, 0), col=rgb(1,0,0,0.2)) # Sombra cola izquierda
legend("topright", legend=c("Valor crítico","Estadístico z"), col=c("red","blue"), lty=2:1, lwd=2)