Primera Unidad

1 Introducción

R es un lenguaje de programación y un entorno de software libre diseñado principalmente para el análisis estadístico y la visualización de datos.

1.1 Caracteristicas

1. Entorno iterativo:R permite ejecutar comandos de forma iteractiva en una consola, lo que facilita la experimentacion y el analisis paso a paso.

2. Amplia coleccion de paquetes:R dispone de una gran cantidad de paquetes (bibliotecas) que extienden sus capacidades. Estos paquetes cubren desde analisis basicos hasta tecnicas avanzadas de machine learning, optimizacion y visualizacion de datos.

1.2 Partes de la Interfas de R

Rstudio tiene cuatro paneles principales:

1.Console(Consola): Donde se ejecutan comandos y ves los resultados.

2.Source Editor(Editor de scripts): pra escribir y guardar codigos en archivos .R

3.Environmet/History(Entorno e Historial):Muestra las variables cargadas y comandos usados

4.plots/Packages/Help(Gaficos,paquetes,ayuda):Para ayudar a visualizar graficos, gestionar paquetes y acceder a documentacion.

1.3 Funcionamiento basico de R

Variables:Se crean con <- o =.

x<-5
y=10

print(x)
## [1] 5
print(y)
## [1] 10

1.3.1 Diferencia de <- o =

Aunque ambos asignan valores a variables, su uso y contexto son diferentes

- <-: Operador de asignacion tradiccional.

- =: Tambien asigna valores, pero se usa con mas frecuencia para nombrar argumentos en llamada de funciones.

1.4 Operaciones Matematicas

 a<- x+y          #Suma
 b<-x-y           #Resta
 c<- sqrt(x)      #Raiz
 d<- x/y          #Division
 e<-x^y           #Potencia
 f<- x%%y         #Modulo(residuo)
 g<- x*y          #Multiplicacion
 h<- x%%y         #Division Entera 
 
print(a)
## [1] 15
print(b)
## [1] -5
print(c)
## [1] 2.236068
print(e)
## [1] 9765625
print(d)
## [1] 0.5
print(f)
## [1] 5
print(g)
## [1] 50
print(h)
## [1] 5

1.5 vectores

R trabaja mucho con vectores, que son listas de valores del mismo tipo

v<-c(1,2,3,4,5,6)
sum(v)    #suma de elementos 
## [1] 21
length(v) #Numero de elementos 
## [1] 6

1.6 Funciones basicas

mean(v)      #media 
## [1] 3.5
summary(v)   #Resumen estadistico
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1.00    2.25    3.50    3.50    4.75    6.00

1.7 Data.frames

la Data.frames son una de las estructuras de datos mas importantes en R para trabajar con datos tabulables, similares a una tabla en una base de datos o una hoja de calculo. A continuacion, se describen sus carcteristicas y como se pueden utilizar:

1.7.1 Caracteristicas de los Data frames

Estructura Tabular:Los data frames organizan los datos en filas y columnas. Cada columna puede tener un tipo de dato diferente (números, caracteres, factores, etc.), lo que los hace ideales para almacenar conjuntos de datos heterogéneos.

Etiquetas de Filas y Columnas:Las filas pueden tener nombres, y las columnas se identifican con nombres, lo que facilita la selección y manipulación de datos.

Flexibilidad:Son muy versátiles para análisis estadísticos y manipulación de datos, permitiendo operaciones como filtrado, agregación, transformación, y combinación de datos.

1.7.2 Creaccion de un Data.frames

#Vectores de datos

nombres <-c("Yandry","valentina","isabela","Dirley", "nicolas")
fecha<-c(17,4,23,23,11)
meses<-c("marzo","mayo","abril","junio","diciembre")

#Crear data frame 

df<-data.frame(nombres,fecha,meses)
print(df)
##     nombres fecha     meses
## 1    Yandry    17     marzo
## 2 valentina     4      mayo
## 3   isabela    23     abril
## 4    Dirley    23     junio
## 5   nicolas    11 diciembre

1.7.3 Operaciones con data.frame

visualizacion

head(df)    #muestra las primeras 6 filas 
##     nombres fecha     meses
## 1    Yandry    17     marzo
## 2 valentina     4      mayo
## 3   isabela    23     abril
## 4    Dirley    23     junio
## 5   nicolas    11 diciembre
tail(df)    #muestra las primeras 6 filas 
##     nombres fecha     meses
## 1    Yandry    17     marzo
## 2 valentina     4      mayo
## 3   isabela    23     abril
## 4    Dirley    23     junio
## 5   nicolas    11 diciembre
summary(df) # Resumen estadistico de cada columna 
##    nombres              fecha         meses          
##  Length:5           Min.   : 4.0   Length:5          
##  Class :character   1st Qu.:11.0   Class :character  
##  Mode  :character   Median :17.0   Mode  :character  
##                     Mean   :15.6                     
##                     3rd Qu.:23.0                     
##                     Max.   :23.0

Subsetting y Seccion

df$fecha  #seleccionar la columna fecha
## [1] 17  4 23 23 11
df[1:2,]  #Filas 1 y 2, todas las columnas 
##     nombres fecha meses
## 1    Yandry    17 marzo
## 2 valentina     4  mayo
df[2,3]   #selecciona una celda especifica fila 2,columna 3)
## [1] "mayo"

Agregar columnas

df$carrera <-c("matematicas","matematicas","ingenieria","matematicas","matematicas")

print(df)
##     nombres fecha     meses     carrera
## 1    Yandry    17     marzo matematicas
## 2 valentina     4      mayo matematicas
## 3   isabela    23     abril  ingenieria
## 4    Dirley    23     junio matematicas
## 5   nicolas    11 diciembre matematicas

Eliminar una colummna

df$carrera <- NULL
print(df)
##     nombres fecha     meses
## 1    Yandry    17     marzo
## 2 valentina     4      mayo
## 3   isabela    23     abril
## 4    Dirley    23     junio
## 5   nicolas    11 diciembre

Agregar una fila

nueva_fila <- data.frame(nombres="wily",fecha=21,meses="febrero")
df <- rbind(df,nueva_fila)
print(df)
##     nombres fecha     meses
## 1    Yandry    17     marzo
## 2 valentina     4      mayo
## 3   isabela    23     abril
## 4    Dirley    23     junio
## 5   nicolas    11 diciembre
## 6      wily    21   febrero

Quitar filas

df<-df[-2, ]
print(df)
##   nombres fecha     meses
## 1  Yandry    17     marzo
## 3 isabela    23     abril
## 4  Dirley    23     junio
## 5 nicolas    11 diciembre
## 6    wily    21   febrero

importar base de datos EXEL

#install.packages("readxl")
library(readxl)
Libro1 <- read_excel("C:/Users/dirle/OneDrive/Escritorio/Documents/INTRODUCCION A R/Libro1.xlsx")
View(Libro1)

print(Libro1)
## # A tibble: 16 × 5
##    nombre     edad ciudad       estrato nivel_de_estudios
##    <chr>     <dbl> <chr>          <dbl> <chr>            
##  1 Yandry       19 Neiva              1 primaria         
##  2 Nicolas      20 Algeciras          2 primaria         
##  3 Dirley       19 Neiva              1 bachiller        
##  4 pepito       20 Medellin           1 universitaria    
##  5 Andrea       23 Barranquilla       2 primaria         
##  6 Carlos       18 Neiva              1 primaria         
##  7 Camila       22 Neiva              1 bachiller        
##  8 Jorgue       30 Pereira            1 primaria         
##  9 Andrew       40 Neiva              1 bachiller        
## 10 Gabriela     55 Neiva              3 primaria         
## 11 Cielo        18 Cali               1 universitaria    
## 12 Lineth        7 Neiva              1 primaria         
## 13 Isabela      19 Neiva              2 universitaria    
## 14 Valentina    21 Neiva              2 universitaria    
## 15 Isabela      19 Neiva              2 universitaria    
## 16 Valentina    21 Neiva              2 universitaria

** Exportacion de Archivos csv**

#install.packages("readr")   # Solo una vez
library(readr)
## Warning: package 'readr' was built under R version 4.4.3
ventas2 <- read_csv("C:/Users/dirle/OneDrive/Escritorio/Documents/INTRODUCCION A R/ventas2.csv")
## Rows: 7 Columns: 1
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (1): fecha de venta  ;Articulo ;Valor de  archivo
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
View(ventas2)
print(ventas2)
## # A tibble: 7 × 1
##   `fecha de venta  ;Articulo ;Valor de  archivo`
##   <chr>                                         
## 1 16-mar;cama ;200000                           
## 2 20-ene;sabana ;40000                          
## 3 7-abr;silla ;30000                            
## 4 10-ene;mueble ;100000                         
## 5 8-abr;escritorio ;300000                      
## 6 17-ene;bolsa;500000                           
## 7 15-may;buso ;100000

1.7.4 Otros

Tipo de variables

edad<-19
nombre<-"Dirley"

print(class(edad))  # "numeric"
## [1] "numeric"
print(class(nombre)) #"character"
## [1] "character"
#print(class(esverdadero)) #"logicos"
#print(typeof(entero)) #"integer"

Nota

nombre<-"Dirley"
apellido<-"Sanchez"
print(nombre)
## [1] "Dirley"
print(apellido)
## [1] "Sanchez"
# mostrar las suma o concatenar 
paste(nombre,apellido)
## [1] "Dirley Sanchez"
paste0(nombre,apellido)
## [1] "DirleySanchez"
print(paste(nombre,apellido,sep = "_"))
## [1] "Dirley_Sanchez"
print(paste("lic.",nombre,apellido))
## [1] "lic. Dirley Sanchez"
# crear variables como fatores 
categoria1<-factor("alto")
categoria2<-factor("bajo")
 paste(as.character(categoria1),as.character(categoria2))
## [1] "alto bajo"
# source("nombre_del_archivo.R"); imprime en la consola 

 # Nota:"Funciones o argumentos"
 5==5 #Igualdad 
## [1] TRUE
 5!=5 #Desigualdad 
## [1] FALSE
name <- "Laura"
age <- 25
sprintf("%s tiene %d anos", name, age)
## [1] "Laura tiene 25 anos"
# Formatos comunes:
# %d → entero
# %f → decimal 
# %s → texto
# %e → notación científica

1.8 creacion de vectores aleatorios

En R,se pueden crear vectores aleatorios utilizando funciones como funif(), rnorm(),sample(), donde cada uno de ellos generan tipos de vectores diferente.

1.8.1 1. runif() Genera vectores aleatorios uniformemente distribuidos entre un rango especifico.

# Genera 10 números aleatorios entre 0 y 1
vector_aleatorio1 <- runif(10)
print(vector_aleatorio1)
##  [1] 0.41716665 0.30511902 0.48870535 0.10129685 0.35252849 0.09162793
##  [7] 0.94063298 0.97473839 0.94991191 0.54427864
# Genera 10 números aleatorios entre 5 y 15
vector_aleatorio2 <- runif(10, min = 5, max = 15)
print(vector_aleatorio2)
##  [1] 10.057691  7.410460  8.375803 11.325228  9.944283 10.564098  6.403740
##  [8] 10.767765  6.582014 11.830752

1.8.2 2. rnorm()

Genera valores aleatorios con distribuccion normal (media 0 y desviacion estandar 1 por defecto)

# Genera 10 valores con media 50 y desviación estándar 10
vector_aleaotorio3 <- rnorm(10, mean = 50, sd = 10)
print(vector_aleaotorio3)
##  [1] 61.58994 44.45406 60.90913 40.30545 40.59191 42.82373 33.81666 41.04582
##  [9] 67.94404 41.24143

1.8.3 3.sample() Genera numeros enteros aleatorios de un conjunto especifico

# Genera 10 números enteros entre 1 y 100 sin reemplazo
vector_aleatorio4<- sample(1:100, 10)
print(vector_aleatorio4)
##  [1] 67 18 69 73  4 38 85 41 34 92
# Genera 10 números enteros entre 1 y 100 con reemplazo
vector_aleatorio5<- sample(1:100, 10, replace = TRUE)
print(vector_aleatorio5)
##  [1]  32  66  56  76  59  40 100   3  59  41

1.9 creaccion de matrices

en R, puedes crear matrices de diferentes formas usando la funcion matrix() y otras funciones auxiliares.

# Matriz 3x3 con números del 1 al 9
m1 <- matrix(1:9, nrow = 3, ncol = 3)
print(m1)
##      [,1] [,2] [,3]
## [1,]    1    4    7
## [2,]    2    5    8
## [3,]    3    6    9

por defecto,R llena la matriz por columnas. para llenar por filas, usa byrow = TRUE

m2 <- matrix(1:9, nrow = 3, ncol = 3, byrow = TRUE)
print(m2)
##      [,1] [,2] [,3]
## [1,]    1    2    3
## [2,]    4    5    6
## [3,]    7    8    9

1.10 Generador de Datos Aleatorios

Podemos generar edades aleatorias entre 18 y 65 usando la función runif(). Luego, redondeamos los valores al entero más cercano con round().

# Generar 6 edades aleatorias entre 18 y 65
edad1 <- round(runif(6, min = 18, max = 65))
print(edad1)
## [1] 65 31 19 42 55 32

1.10.1 Fijar la semilla

Si queremos asegurarnos de que los números aleatorios sean reproducibles, podemos usar set.seed(). Esto permite obtener siempre los mismos valores cuando ejecutemos el código.

# Fijamos la semilla para obtener siempre los mismos resultados
set.seed(123)

# Generamos 20 edades entre 15 y 35
edad3 <- round(runif(20, min = 15, max = 35))
print(edad3)
##  [1] 21 31 23 33 34 16 26 33 26 24 34 24 29 26 17 33 20 16 22 34

1.10.2 Seleccionar numeros números enteros aleatorios con sample()

La función sample() permite extraer una muestra aleatoria de un conjunto de valores. En este caso, seleccionaremos 5 números aleatorios entre 1 y 45.

# Seleccionar 5 números enteros entre 1 y 45 sin reemplazo
numeros_aleatorios <- sample(1:45, 5)
print(numeros_aleatorios)
## [1] 28  9 29 35  8

1.10.3 General Datos Categoricos

Para generar datos categóricos, como géneros (“M”, “F” y “O”), utilizamos sample() con la opción replace=TRUE para permitir repeticiones.

# Generar 10 valores aleatorios de género
generos <- sample(c("M", "F", "O"), 10, replace = TRUE)
print(generos)
##  [1] "F" "O" "F" "M" "F" "O" "F" "M" "O" "O"

1.11 Medidas de Tendencia Central

Las medidas de tendencia central son valores que describen el centro de un conjunto de datos. En este documento exploraremos:

  • Media (Promedio)
  • Mediana (Valor central)
  • Moda (Valor más frecuente)

1.11.1 Crear un conjunto de datos

Para ilustrar los cálculos, generaremos un vector con 20 números aleatorios entre 10 y 50.

set.seed(123)  # Fijar semilla para reproducibilidad
datos <- sample(10:50, 20, replace = TRUE)  # Generar datos aleatorios
print(datos)
##  [1] 40 24 23 12 46 23 34 35 36 14 36 37 18 38 44 17 35 16 18 28

Media Aritmetica La media se calcula sumando todos los valores y dividiéndolos por la cantidad de datos.

media <- mean(datos)  # Calcular la media
print(media)
## [1] 28.7

Mediana La mediana es el valor central cuando los datos están ordenados.

  1. Si hay un número impar de datos, es el valor central.

  2. Si hay un número par de datos, es el promedio de los dos valores centrales.

mediana <- median(datos)  # Calcular la mediana
print(mediana)
## [1] 31

Moda La moda es el valor más frecuente en el conjunto de datos. R no tiene una función nativa para la moda, pero podemos calcularla con table().

# Crear una tabla de frecuencias
frecuencias <- table(datos)

# Obtener el valor con mayor frecuencia
moda <- as.numeric(names(frecuencias[frecuencias == max(frecuencias)]))
print(moda)
## [1] 18 23 35 36

1.12 Medidas de Dispercion

Nos dicen qué tan dispersos o concentrados están los datos respecto a una medida de tendencia central (como la media).

Rango Diferencia entre el valor máximo y el mínimo. Sirve para medir la extensión total de los datos.

x <- c(5, 8, 12, 15, 20)
range(x)              # Retorna mínimo y máximo
## [1]  5 20
diff(range(x))        # Rango como diferencia
## [1] 15

Varianza Promedio de las diferencias al cuadrado respecto a la media. Mide cuánto varían los datos respecto a su media

var(x)                
## [1] 34.5

Desviasion estandar Raíz cuadrada de la varianza. Mide la dispersión en las mismas unidades que los datos

sd(x)                
## [1] 5.87367

Coeficiente de Variacion elación entre la desviación estándar y la media (en porcentaje). Compara la dispersión entre variables de diferentes unidades.

cv <- sd(x)/mean(x) * 100  # Coeficiente de variación en %
cv
## [1] 48.94725

1.12.1 Resumen de medidas de tendencia central

La función summary() en R proporciona un resumen estadístico de un conjunto de datos. Funciona con vectores, data frames y otros objetos, mostrando diferentes estadísticas según el tipo de datos.

summary(datos)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   12.00   18.00   31.00   28.70   36.25   46.00

Segunda Unidad

2 Crear una Lista en R

Una lista en R es una estructura de datos que puede contener elementos de diferentes tipos (números, caracteres, vectores, data frames e incluso otras listas).

df <- list(
  numeros = c(1, 2, 3, 4, 5),
  nombres = c("Ana", "Luis", "Carlos"),
  matriz = matrix(1:9, nrow = 3)
)
print(df)
## $numeros
## [1] 1 2 3 4 5
## 
## $nombres
## [1] "Ana"    "Luis"   "Carlos"
## 
## $matriz
##      [,1] [,2] [,3]
## [1,]    1    4    7
## [2,]    2    5    8
## [3,]    3    6    9

2.0.1 Acceder a los elementos de una lista

Podemos acceder a los elementos de una lista usando [[ ]] o $:

# Crear una lista con diferentes tipos de datos
mi_lista <- list(
  nombre = "Ana",
  edad = 25,
  calificaciones = c(4.5, 3.8, 4.0),
  aprobado = TRUE
)

# Mostrar la lista
print(mi_lista)
## $nombre
## [1] "Ana"
## 
## $edad
## [1] 25
## 
## $calificaciones
## [1] 4.5 3.8 4.0
## 
## $aprobado
## [1] TRUE
# Acceder por posición
mi_lista[[1]]   # "Ana"
## [1] "Ana"
mi_lista[[2]]   # 25
## [1] 25
# Acceder por nombre
mi_lista$nombre  # "Ana"
## [1] "Ana"
mi_lista$edad    # 25
## [1] 25

Si queremos acceder a un elemento dentro de un vector en la lista:

mi_lista$calificaciones[2]  
## [1] 3.8

2.0.2 Modificar elementos de una lista

Podemos modificar cualquier elemento de la lista:

mi_lista$edad <- 26  # Cambiar la edad
mi_lista$calificaciones <- c(5.0, 4.2, 3.9) 
# Modificar calificaciones

print(mi_lista$edad)
## [1] 26
print(mi_lista$calificaciones)
## [1] 5.0 4.2 3.9

También podemos agregar nuevos elementos:

mi_lista$ciudad <- "Bogota"
print(mi_lista)
## $nombre
## [1] "Ana"
## 
## $edad
## [1] 26
## 
## $calificaciones
## [1] 5.0 4.2 3.9
## 
## $aprobado
## [1] TRUE
## 
## $ciudad
## [1] "Bogota"

2.1 Diferencia entre list y data.frame

list: Listas en R

Una lista en R puede contener elementos de diferentes tipos y longitudes, incluyendo números, caracteres, vectores, matrices e incluso otras listas.

# Crear una lista en R
mi_lista <- list(
  nombre = "Ana",
  edad = 25,
  calificaciones = c(4.5, 3.8, 4.0),
  aprobado = TRUE
)

# Imprimir la lista
print(mi_lista)
## $nombre
## [1] "Ana"
## 
## $edad
## [1] 25
## 
## $calificaciones
## [1] 4.5 3.8 4.0
## 
## $aprobado
## [1] TRUE
# Acceder a elementos de la lista
mi_lista$nombre
## [1] "Ana"
mi_lista$calificaciones[2]
## [1] 3.8

Data frame: Un data frame es una estructura de datos tabular donde todas las columnas tienen el mismo número de elementos.

nombre<-c("Maura","Camila","Johan","elkin","Alejandro","yandry","Nicolas","Dirley","Willian","Daniela","Steven","Yuliana","Karen","Jose","Santiago","Johan","Santaigo","Daniela")
Edad<-c(20,21,21,18,17,19,20,19,18,22,20,19,21,20,19,20,19,20)
promedio<-c(3.5,3.5,3.5,3.3,3.3,3.9,3.7,3.6,3.5,3.2,3.3,3.3,3.5,3.4,3.5,3.9,3.7,3.7)
semestre<-c(7,8,7,3,3,7,7,7,10,7,6,8,7,7,5,5,6,5)
nivelado<-c("si","no","no","no","si","si","no","no","no","no","no","no","no","no","si","no","si","no")

dt<-data.frame(nombre,Edad,promedio,semestre,nivelado)
print(dt)
##       nombre Edad promedio semestre nivelado
## 1      Maura   20      3.5        7       si
## 2     Camila   21      3.5        8       no
## 3      Johan   21      3.5        7       no
## 4      elkin   18      3.3        3       no
## 5  Alejandro   17      3.3        3       si
## 6     yandry   19      3.9        7       si
## 7    Nicolas   20      3.7        7       no
## 8     Dirley   19      3.6        7       no
## 9    Willian   18      3.5       10       no
## 10   Daniela   22      3.2        7       no
## 11    Steven   20      3.3        6       no
## 12   Yuliana   19      3.3        8       no
## 13     Karen   21      3.5        7       no
## 14      Jose   20      3.4        7       no
## 15  Santiago   19      3.5        5       si
## 16     Johan   20      3.9        5       no
## 17  Santaigo   19      3.7        6       si
## 18   Daniela   20      3.7        5       no

2.2 Filtrar Datos en la base de datos

Filtrar datos en R significa seleccionar filas específicas de un conjunto de datos con base en ciertas condiciones. Se utiliza para extraer información relevante y analizar subconjuntos de datos.

# Cargar la librería dplyr
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.4.3
## 
## 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
# Crear un nuevo data frame 

nombre <- c("Luis","Andrea","Carlos","Diana","Fernando","Maria","Jose","Camila","David","Laura","Miguel","Sara", "Juan", "Paula","Ricardo", "Valentina", "Andres", "Sofia")

Edad <- c(23, 21, 24, 22, 25, 23, 20, 22, 21, 24, 23, 22, 20, 21, 23, 22, 24, 20)

promedio <- c(3.8, 4.2, 3.5, 3.9, 4.5, 3.7, 3.2, 3.6, 4.0, 3.1, 
              3.4, 3.9, 4.3, 3.7, 3.5, 3.8, 3.6, 4.1)

semestre <- c(8, 6, 7, 5, 10, 9, 4, 6, 8, 3, 7, 6, 9, 5, 8, 7, 6, 10)

nivelado <- c("no", "no", "si", "no", "si", "no", "si", "no", "no", "no", 
              "si", "no", "no", "si", "si", "no", "no", "no")

# Crear el data frame
datos_estudiantes <- data.frame(nombre, Edad, promedio, semestre, nivelado)

# Imprimir la base de datos
print(datos_estudiantes)
##       nombre Edad promedio semestre nivelado
## 1       Luis   23      3.8        8       no
## 2     Andrea   21      4.2        6       no
## 3     Carlos   24      3.5        7       si
## 4      Diana   22      3.9        5       no
## 5   Fernando   25      4.5       10       si
## 6      Maria   23      3.7        9       no
## 7       Jose   20      3.2        4       si
## 8     Camila   22      3.6        6       no
## 9      David   21      4.0        8       no
## 10     Laura   24      3.1        3       no
## 11    Miguel   23      3.4        7       si
## 12      Sara   22      3.9        6       no
## 13      Juan   20      4.3        9       no
## 14     Paula   21      3.7        5       si
## 15   Ricardo   23      3.5        8       si
## 16 Valentina   22      3.8        7       no
## 17    Andres   24      3.6        6       no
## 18     Sofia   20      4.1       10       no

2.2.1 Filtracion 1

Estudiantes con promedio mayor a 4.0

datos_promedio_alto <- datos_estudiantes %>% filter(promedio > 4.0)
print(datos_promedio_alto)
##     nombre Edad promedio semestre nivelado
## 1   Andrea   21      4.2        6       no
## 2 Fernando   25      4.5       10       si
## 3     Juan   20      4.3        9       no
## 4    Sofia   20      4.1       10       no

2.2.2 Filtracion 2

Estudiantes del semestre 8 o superior

datos_semestre_alto <- datos_estudiantes %>% filter(semestre >= 8)
print(datos_semestre_alto)
##     nombre Edad promedio semestre nivelado
## 1     Luis   23      3.8        8       no
## 2 Fernando   25      4.5       10       si
## 3    Maria   23      3.7        9       no
## 4    David   21      4.0        8       no
## 5     Juan   20      4.3        9       no
## 6  Ricardo   23      3.5        8       si
## 7    Sofia   20      4.1       10       no

2.3 Creacion de Data Frame con valores faltantes

# Crear un data frame con valores faltantes (NA)
datos_faltantes <- data.frame(
  Nombre = c("Ana", "Carlos", "Sofia", "Luis", NA, "Elena"),
  Edad = c(20, NA, 21, 19, 23, 22),
  Promedio = c(3.5, 4.2, NA, 3.9, 4.5, 3.7),
  Semestre = c(5, 8, 7, NA, 10, 6)
)

# Mostrar la tabla con valores faltantes
print(datos_faltantes)
##   Nombre Edad Promedio Semestre
## 1    Ana   20      3.5        5
## 2 Carlos   NA      4.2        8
## 3  Sofia   21       NA        7
## 4   Luis   19      3.9       NA
## 5   <NA>   23      4.5       10
## 6  Elena   22      3.7        6

2.3.1 Como manejar valores faltantes

  1. Contar cuantos NA hay en el Data frame
sum(is.na(datos_faltantes))  # Cuenta todos los NA
## [1] 4
  1. Filtrar filas que tienen al menos un valor faltantes
datos_con_NA <- datos_faltantes[rowSums(is.na(datos_faltantes)) > 0, ]
print(datos_con_NA)
##   Nombre Edad Promedio Semestre
## 2 Carlos   NA      4.2        8
## 3  Sofia   21       NA        7
## 4   Luis   19      3.9       NA
## 5   <NA>   23      4.5       10

3.Eliminar filas con valores faltantes

datos_limpios <- na.omit(datos_faltantes)
print(datos_limpios)
##   Nombre Edad Promedio Semestre
## 1    Ana   20      3.5        5
## 6  Elena   22      3.7        6

4.Reemplazar los valores faltantes con un valor específico

datos_imputados <- datos_faltantes
datos_imputados[is.na(datos_imputados)] <- 0  # Reemplaza NA con 0
print(datos_imputados)
##   Nombre Edad Promedio Semestre
## 1    Ana   20      3.5        5
## 2 Carlos    0      4.2        8
## 3  Sofia   21      0.0        7
## 4   Luis   19      3.9        0
## 5      0   23      4.5       10
## 6  Elena   22      3.7        6

2.3.2 Describe la bases de datos

str(datos_estudiantes)
## 'data.frame':    18 obs. of  5 variables:
##  $ nombre  : chr  "Luis" "Andrea" "Carlos" "Diana" ...
##  $ Edad    : num  23 21 24 22 25 23 20 22 21 24 ...
##  $ promedio: num  3.8 4.2 3.5 3.9 4.5 3.7 3.2 3.6 4 3.1 ...
##  $ semestre: num  8 6 7 5 10 9 4 6 8 3 ...
##  $ nivelado: chr  "no" "no" "si" "no" ...

3 Creacion de graficos

3.1 Grafico de Pastel

Representa proporciones dentro de un total, mostrando qué porcentaje representa cada categoría.

# Definir categorías correctamente (usando comas)
categorias <- c("aprobados", "reprobados", "retirados")

# Valores correspondientes a cada categoría
valores <- c(50, 30, 20)

# Calcular porcentajes

porcentajes <- round(valores / sum(valores) * 100, 1)

# Crear etiquetas con categorías y porcentajes

etiquetas <- paste(categorias, porcentajes, "%")

# Grafico 

pie(valores, labels = etiquetas,
    main = "Resultados de los estudiantes",
    col = c("green", "red", "yellow"))

#`labels` especificar las etiquetas 

3.2 Grafico de barras:

Compara valores entre diferentes categorías.Usaremos barplot() para representar frecuencias categoricas

#Datos 
semestres<-c("1","2","3","4","5","6","7","8","9","10")
cantidades<-c(12,13,14,15,16,17,19,20,18,11)

#Grafico 

barplot(cantidades,names.arg=semestres,col="blue",main="cantidades de estudiantes por semestre",xlab="semestre",ylab="Numero de estudiantes ")

# **names.arg** Etiquetas de ejes
# **col** colorea las barras

3.3 Histograma:

Muestra la distribución de una variable numérica, dividiéndola en intervalos (bins).Usamos hist() para visualizar la distribucion de datos numericos.

#datos 
numeros<-c(1,2,3,4,5,6,7,8,9,10)

#Grafico
hist(numeros,col="lightblue",breaks=5,main="Distribucion de Edades",xlab="Edad",ylab="Frecuencia")

#`breaks` Define el valor de intervalos.
#`col` Cambia el color de las barras.

3.4 Grafico de Disperccion:(Scatter Plot)

Representa la relación entre dos variables numéricas, útil para detectar correlaciones.Usamos plot() para analizar relaciones entre dos variables.

#Datos
EDAD<-c(18, 19, 20, 21, 22, 23, 24, 25, 26)
promedios<-c(3.5,3.8,3.2,3.9,4.0,3.7,3.5,4.2,4.1)

#Scatter plot
plot(EDAD,promedios,col="red",pch=16,main="Relacion entre Edad y Promedio",xlab="Edad",ylab="Promedio")

# `pch`Usa puntos solidos
# `col` Cambia de color los puntos 

3.5 Grafico de lineas

Muestra tendencias y evolución de datos en el tiempo. Útil en series temporales.Usamos plot() con type="l"

# Datos ficticios
semestre <- 1:8
nota_promedio <- c(3.5, 3.6, 3.8, 3.9, 4.0, 4.1, 4.2, 4.3)

# Gráfico de líneas
plot(semestre, nota_promedio, type="o", col="blue", pch=16,
     main="Evolucion del Promedio por Semestre",
     xlab="Semestre", ylab="Promedio")

# `type="o"` Muestra líneas con puntos.

# `pch` Usa puntos sólidos.

3.6 Diagrama de caja:(Boxplot)

Útil para detectar valores atípicos y la distribución de datos.

# Datos 
notas <- c(2.8, 3.0, 3.2, 3.5, 3.8, 4.0, 4.2, 4.5, 4.8, 5.0)

# Boxplot

boxplot(notas, col="green",
        main="Distribucion de Notas",
        ylab="Notas")

3.7 Grafico de barras Apiladas

Un diagrama de barras apilado sirve para representar la composición de un conjunto de datos dentro de diferentes categorías. Se usa para visualizar cómo se desglosa cada categoría en subcategorías, comparando tanto los valores individuales como el total acumulado.

ventas <- matrix(c(10, 15, 20, 8, 12, 18), nrow = 2, byrow = TRUE)
colnames(ventas) <- c("Ene", "Feb", "Mar")
rownames(ventas) <- c("Producto A", "Producto B")
barplot(ventas,
        beside = FALSE,
        main = "Ventas mensuales por producto",
        col = c("green", "blue"),
        legend = rownames(ventas))

4 Graficos con ggplot2

Para utilizar ggplot2, primeramente se instala si aun no se tiene

#install.packages("ggplot2")  # Instalar (solo una vez)
library(ggplot2)  # Cargar la librería
## Warning: package 'ggplot2' was built under R version 4.4.3

4.1 Grafico de barras

# Datos
data <- data.frame(
  Semestre = factor(c("1", "2", "3", "4", "5", "6", "7", "8")),
  Cantidad = c(15, 10, 12, 18, 20, 25, 30, 12)
)

# Gráfico de barras con ggplot2
library(ggplot2)
ggplot(data, aes(x = Semestre, y = Cantidad)) +
  geom_bar(stat = "identity", fill = "steelblue") +
  ggtitle("Cantidad de Estudiantes por Semestre") +
  xlab("Semestre") + ylab("Cantidad") +
  theme_minimal()

# aes(x=Semestre,y=cantidad): Define ejes
# geom_bar(stat="identity"):Crea las barras
# fill= "steelblue": Cambia el color 
# theme_minimal(): Usa un diseño limpio 

4.2 Histograma

# Datos
set.seed(123)
edades <- data.frame(Edad = round(runif(100, min=18, max=30)))

# Histograma
library(ggplot2)
ggplot(edades, aes(x = Edad)) +
  geom_histogram(binwidth = 2, fill = "lightblue", color = "black") +
  ggtitle("Distribucion de Edades") +
  xlab("Edad") + ylab("Frecuencia") +
  theme_minimal()

#`geom_histogram(binwidth = 2)`: Define el ancho de las barras.
#`fill = "lightblue"`: Color de las barras.
#`color = "black"`: Bordes negros para mejor visualización.

4.3 Grafico de Dispercion(Scatter Plot)

# Datos ficticios
data <- data.frame(
  Edad = c(18, 19, 20, 21, 22, 23, 24, 25, 26),
  Promedio = c(3.5, 3.8, 3.2, 3.9, 4.0, 3.7, 3.5, 4.2, 4.1)
)

# Gráfico de dispersión
library(ggplot2)
ggplot(data, aes(x = Edad, y = Promedio)) +
  geom_point(color = "red", size = 3) +
  ggtitle("Relacion entre Edad y Promedio") +
  xlab("Edad") + ylab("Promedio") +
  theme_minimal()

# `geom_point(size = 3)`: Tamaño de los puntos.
# `color = "red"`: Cambia el color de los puntos

4.4 Grafico de lineas

# Datos ficticios
data <- data.frame(
  Semestre = 1:8,
  Promedio = c(3.5, 3.6, 3.8, 3.9, 4.0, 4.1, 4.2, 4.3)
)

# Gráfico de líneas
library(ggplot2)
ggplot(data, aes(x = Semestre, y = Promedio)) +
  geom_line(color = "blue", size = 1) +
  geom_point(color = "red", size = 3) +
  ggtitle("Evolucion del Promedio por Semestre") +
  xlab("Semestre") + ylab("Promedio") +
  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.

# `geom_line(size = )`: Grosor de la línea.
# `geom_point(size = ): Agrega puntos en la línea

4.5 Diagrama de Cajas

Resume la distribución de datos numéricos, mostrando la mediana, percentiles y valores atípicos.

# Datos ficticios
notas <- data.frame(Notas = c(2.8, 3.0, 3.2, 3.5, 3.8, 4.0, 4.2, 4.5, 4.8, 5.0))

# Boxplot
library(ggplot2)
ggplot(notas, aes(y = Notas)) +
  geom_boxplot(fill = "green") +
  ggtitle("Distribución de Notas") +
  ylab("Notas") +
  theme_minimal()

# `geom_boxplot()`: Crea el diagrama de cajas.
# `fill = "green"`: Color del gráfico.

4.6 Configuracion de cuadricula

# Crear datos de ejemplo
categorias <- c("A", "B", "C", "D")
frecuencia1 <- c(5, 3, 7, 2)
frecuencia2 <- c(4, 6, 1, 8)

# Configurar la cuadrícula 1 fila, 2 columnas
par(mfrow = c(2, 2))  # 1 fila, 2 columnas de gráficos

# Primer gráfico de barras
barplot(frecuencia1,
        names.arg = categorias,
        col = "skyblue",
        main = "Grafico 1: Grupo A",
        ylab = "Frecuencia")
# Segundo gráfico de barras
barplot(frecuencia2,
        names.arg = categorias,
        col = "salmon",
        main = "Grafico 2: Grupo B",
        ylab = "Frecuencia")

# Restaurar parámetro gráfico (opcional, si quieres seguir con un solo gráfico después)
par(mfrow = c(1, 1))

# Crear datos de ejemplo
categorias <- c("A", "B", "C", "D")
frecuencia1 <- c(5, 3, 7, 2)
frecuencia2 <- c(4, 6, 1, 8)

# Configurar la cuadrícula: 2 filas, 2 columnas
par(mfrow = c(2, 2))  

# Primer gráfico de barras
barplot(frecuencia1,
        names.arg = categorias,
        col = "skyblue",
        main = "Grafico 1: Grupo A",
        ylab = "Frecuencia")

# Segundo gráfico de barras
barplot(frecuencia2,
        names.arg = categorias,
        col = "salmon",
        main = "Grafico 2: Grupo B",
        ylab = "Frecuencia")

# Tercer gráfico: Histograma de frecuencias combinadas
hist(c(frecuencia1, frecuencia2),
     col = "lightgreen",
     main = "Histograma de Frecuencias",
     xlab = "Valor",
     ylab = "Frecuencia",
     breaks = 5)

# Cuarto gráfico: Diagrama de dispersión
plot(frecuencia1, frecuencia2,
     col = "darkblue",
     pch = 16,  # Tipo de punto
     main = "Dispersion: Grupo A vs Grupo B",
     xlab = "Grupo A",
     ylab = "Grupo B")

# Restaurar configuracion grafica
par(mfrow = c(1, 1))  

5 data("mtcars")

El comando data("mtcars") en R carga el conjunto de datos mtcars, que es un dataset integrado en R con información sobre automóviles.

#Cargar la data

data("mtcars")
print(mtcars)  
##                      mpg cyl  disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
## Datsun 710          22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
## Hornet 4 Drive      21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
## Hornet Sportabout   18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
## Valiant             18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
## Duster 360          14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
## Merc 240D           24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
## Merc 230            22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
## Merc 280            19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
## Merc 280C           17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
## Merc 450SE          16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3
## Merc 450SL          17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3
## Merc 450SLC         15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3
## Cadillac Fleetwood  10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4
## Lincoln Continental 10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4
## Chrysler Imperial   14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4
## Fiat 128            32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
## Honda Civic         30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
## Toyota Corolla      33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
## Toyota Corona       21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
## Dodge Challenger    15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2
## AMC Javelin         15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2
## Camaro Z28          13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4
## Pontiac Firebird    19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2
## Fiat X1-9           27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
## Porsche 914-2       26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2
## Lotus Europa        30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
## Ford Pantera L      15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4
## Ferrari Dino        19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
## Maserati Bora       15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8
## Volvo 142E          21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2

¿Que es mtcars ?

Es un conjunto de datos que contiene 32 observaciones de automoviles y 11 variables relacionados con su rendimiento y caracteristicas tecnicas

5.1 uso de mtcars

head(mtcars)  # Muestra las primeras 6 filas
##                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
## Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
## Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
## Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
## Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1
str(mtcars)  # Muestra el tipo de datos en cada columna
## 'data.frame':    32 obs. of  11 variables:
##  $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
##  $ cyl : num  6 6 4 6 8 6 8 4 4 6 ...
##  $ disp: num  160 160 108 258 360 ...
##  $ hp  : num  110 110 93 110 175 105 245 62 95 123 ...
##  $ drat: num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
##  $ wt  : num  2.62 2.88 2.32 3.21 3.44 ...
##  $ qsec: num  16.5 17 18.6 19.4 17 ...
##  $ vs  : num  0 0 1 1 0 1 0 1 1 1 ...
##  $ am  : num  1 1 1 0 0 0 0 0 0 0 ...
##  $ gear: num  4 4 4 3 3 3 3 4 4 4 ...
##  $ carb: num  4 4 1 1 2 1 4 2 2 4 ...
summary(mtcars)  # Muestra estadísticas básicas
##       mpg             cyl             disp             hp       
##  Min.   :10.40   Min.   :4.000   Min.   : 71.1   Min.   : 52.0  
##  1st Qu.:15.43   1st Qu.:4.000   1st Qu.:120.8   1st Qu.: 96.5  
##  Median :19.20   Median :6.000   Median :196.3   Median :123.0  
##  Mean   :20.09   Mean   :6.188   Mean   :230.7   Mean   :146.7  
##  3rd Qu.:22.80   3rd Qu.:8.000   3rd Qu.:326.0   3rd Qu.:180.0  
##  Max.   :33.90   Max.   :8.000   Max.   :472.0   Max.   :335.0  
##       drat             wt             qsec             vs        
##  Min.   :2.760   Min.   :1.513   Min.   :14.50   Min.   :0.0000  
##  1st Qu.:3.080   1st Qu.:2.581   1st Qu.:16.89   1st Qu.:0.0000  
##  Median :3.695   Median :3.325   Median :17.71   Median :0.0000  
##  Mean   :3.597   Mean   :3.217   Mean   :17.85   Mean   :0.4375  
##  3rd Qu.:3.920   3rd Qu.:3.610   3rd Qu.:18.90   3rd Qu.:1.0000  
##  Max.   :4.930   Max.   :5.424   Max.   :22.90   Max.   :1.0000  
##        am              gear            carb      
##  Min.   :0.0000   Min.   :3.000   Min.   :1.000  
##  1st Qu.:0.0000   1st Qu.:3.000   1st Qu.:2.000  
##  Median :0.0000   Median :4.000   Median :2.000  
##  Mean   :0.4062   Mean   :3.688   Mean   :2.812  
##  3rd Qu.:1.0000   3rd Qu.:4.000   3rd Qu.:4.000  
##  Max.   :1.0000   Max.   :5.000   Max.   :8.000
library(dplyr)  # Cargar dplyr
mtcars %>% filter(hp > 200)
##                      mpg cyl disp  hp drat    wt  qsec vs am gear carb
## Duster 360          14.3   8  360 245 3.21 3.570 15.84  0  0    3    4
## Cadillac Fleetwood  10.4   8  472 205 2.93 5.250 17.98  0  0    3    4
## Lincoln Continental 10.4   8  460 215 3.00 5.424 17.82  0  0    3    4
## Chrysler Imperial   14.7   8  440 230 3.23 5.345 17.42  0  0    3    4
## Camaro Z28          13.3   8  350 245 3.73 3.840 15.41  0  0    3    4
## Ford Pantera L      15.8   8  351 264 4.22 3.170 14.50  0  1    5    4
## Maserati Bora       15.0   8  301 335 3.54 3.570 14.60  0  1    5    8
library(ggplot2)

grafico <- ggplot(data = mtcars, aes(x = hp, y = mpg)) +
  geom_point(color = "blue") +
  ggtitle("Relacion entre HP y MPG") +
  xlab("Caballos de Fuerza") +
  ylab("Millas por Galon") +
  theme_minimal()

print(grafico)

6 Cargar Datos de una URL

url <- 'https://raw.githubusercontent.com/fhernanb/datos/master/babies.txt'
print(url)
## [1] "https://raw.githubusercontent.com/fhernanb/datos/master/babies.txt"
dt <- read.table(url, header=TRUE, sep='\t')
#print(dt) imprimir el data frame

6.1 Inspeccion de la Data.frame

dim(df)# Dimensiones del Data Frame (Filas y Columnas)
## NULL
head(df)# Primeras 6 filas
## $numeros
## [1] 1 2 3 4 5
## 
## $nombres
## [1] "Ana"    "Luis"   "Carlos"
## 
## $matriz
##      [,1] [,2] [,3]
## [1,]    1    4    7
## [2,]    2    5    8
## [3,]    3    6    9
tail(df)# Últimas 6 filas
## $numeros
## [1] 1 2 3 4 5
## 
## $nombres
## [1] "Ana"    "Luis"   "Carlos"
## 
## $matriz
##      [,1] [,2] [,3]
## [1,]    1    4    7
## [2,]    2    5    8
## [3,]    3    6    9
colnames(df)# Nombre de las columnas
## NULL
str(df) # Estructura del Data Frame
## List of 3
##  $ numeros: num [1:5] 1 2 3 4 5
##  $ nombres: chr [1:3] "Ana" "Luis" "Carlos"
##  $ matriz : int [1:3, 1:3] 1 2 3 4 5 6 7 8 9
library(dplyr)
glimpse(dt)
## Rows: 1,236
## Columns: 7
## $ bwt       <int> 120, 113, 128, 123, 108, 136, 138, 132, 120, 143, 140, 144, …
## $ gestation <int> 284, 282, 279, NA, 282, 286, 244, 245, 289, 299, 351, 282, 2…
## $ parity    <chr> "First born", "First born", "First born", "First born", "Fir…
## $ age       <int> 27, 33, 28, 36, 23, 25, 33, 23, 25, 30, 27, 32, 23, 36, 30, …
## $ height    <int> 62, 64, 64, 69, 67, 62, 62, 65, 62, 66, 68, 64, 63, 61, 63, …
## $ weight    <int> 100, 135, 115, 190, 125, 93, 178, 140, 125, 136, 120, 124, 1…
## $ smoke     <chr> "Not", "Not", "Yes", "Not", "Yes", "Not", "Not", "Not", "Not…

6.2 Analisis de los valores perdidos

6.2.1 Identificaar valores perdidos

1. Cantidad de valores NA en la tabla

sum(is.na(dt))  
## [1] 83

2.cantidad de valores NA por columna

colSums(is.na(dt))  # Muestra cuántos valores faltan por variable
##       bwt gestation    parity       age    height    weight     smoke 
##         0        13         0         2        22        36        10

3.cantidad de valores NA por fila

dt[!complete.cases(dt), ]  # Muestra todas las filas que tienen al menos un NA
##      bwt gestation     parity age height weight smoke
## 4    123        NA First born  36     69    190   Not
## 40   128       282 First born  31     65     NA   Not
## 43   138       302 First born  26     NA     NA   Yes
## 86   129       274 First born  29     71     NA   Yes
## 90   114        NA First born  24     67    113   Yes
## 94    92        NA First born  31     67    130   Not
## 99   128        NA First born  35     62    110   Not
## 103  116       286 First born  24     61     NA   Not
## 111  103       269 First born  26     65     NA   Yes
## 114  134       293 First born  21     65     NA   Not
## 153  127       336 First born  29     NA     NA   Not
## 155  129        NA First born  23     NA     NA   Yes
## 159  105       281 First born  39     61     NA   Not
## 170  126       293 First born  29     59    110  <NA>
## 186  131       286 First born  34     NA     NA   Yes
## 194  125       302 First born  32     61     NA   Yes
## 205  151       310 First born  21     65     NA   Not
## 219   90       269 First born  26     67    125  <NA>
## 231  111       284 First born  22     NA     NA   Yes
## 243  111        NA First born  27     63    105   Yes
## 255  130       274 First born  26     64    185  <NA>
## 256  106       275 First born  31     65    142  <NA>
## 312   93       256 First born  34     66     NA   Yes
## 338  131       283 First born  31     NA     NA   Not
## 353  121       284 First born  27     63     NA   Yes
## 361  107       278    Unknown  27     NA    135   Not
## 364  107       300 First born  19     NA     NA   Yes
## 400  121       286    Unknown  NA     NA     NA   Not
## 429  116       272 First born  NA     63    138   Yes
## 433  115       269 First born  30     62    115  <NA>
## 440  116       315 First born  26     NA     NA   Not
## 444  118       280 First born  27     NA     NA   Yes
## 478  119       280    Unknown  25     61     NA   Yes
## 479  123       272 First born  28     NA     NA   Not
## 482  124       291 First born  26     66     NA   Not
## 509  119       279    Unknown  20     NA     NA   Yes
## 526  146       277 First born  32     NA     NA   Not
## 601  142       284 First born  37     68    155  <NA>
## 642  151       298 First born  37     64    135  <NA>
## 649  109       271 First born  27     61     NA   Yes
## 651  121        NA First born  31     68    132   Not
## 654  120       280 First born  29     NA     NA   Yes
## 666  141       292 First born  29     62    110  <NA>
## 672  158       296 First born  28     66    140  <NA>
## 699  141       281 First born  28     NA     NA   Yes
## 707  114        NA First born  23     63    116   Yes
## 740   71        NA First born  19     64    120   Not
## 754  111       289 First born  26     NA     NA   Yes
## 763  105       261 First born  32     NA     NA   Yes
## 848  134       278 First born  28     NA    126   Yes
## 875  135       300 First born  25     64     NA   Not
## 880  129        NA    Unknown  19     61    110   Not
## 883  116       280    Unknown  22     59     NA   Yes
## 921  108       274 First born  28     66    175  <NA>
## 964  107        NA First born  19     60    118   Not
## 972  136        NA First born  36     66    135   Not
## 1014 133       274 First born  30     63     NA   Not
## 1045 117       323 First born  26     62     NA   Not
## 1178 146       305 First born  23     NA     NA   Not
## 1191 104       275 First born  24     NA     NA   Not
## 1193 124        NA    Unknown  39     65    228   Not
## 1216 152       267 First born  28     NA    119   Yes

6.2.2 Manejo de valores perdidos

1. Limpieza de datos

dt_sin_na <- na.omit(dt)# Elimina todas las filas con al menos un NA
dt_sin_na_col <- dt[, colSums(is.na(dt)) == 0]  # Elimina columnas con valores faltantes

2. Rellenar NA con la mediana

library(dplyr)
dt <- dt %>% mutate(across(where(is.numeric), ~ ifelse(is.na(.), mean(., na.rm=TRUE), .)))

6.2.3 Analisis de NA en una columna especifica

Si quieres analizar los valores perdidos en una columna específica, como gestation, puedes usar:

dt$gestation[is.na(dt$gestation)]
## numeric(0)
sum(is.na(dt$gestation))  # Cuenta la cantidad de NA en la columna
## [1] 0
dt$gestation[is.na(dt$gestation)] <- mean(dt$gestation, na.rm=TRUE)  # Rellenar con la media

dt$gestation[is.na(dt$gestation)] <- median(dt$gestation, na.rm=TRUE)  # Rellenar con la mediana

6.2.3.1 Analisis de las columanas o filas

1. Acceder a un elemento en cierta posicion

dt$smoke[68]
## [1] "Yes"
library(ggplot2)

ggplot(dt, aes(y = gestation)) +
  geom_boxplot(fill = "green") +
  ggtitle("Distribucion de Gestacion") +
  ylab("Dias de gestacion") +
  theme_minimal()

6.2.3.2 ¿uso de boxplot?

url <- 'https://raw.githubusercontent.com/fhernanb/datos/master/babies.txt'
print(url)
## [1] "https://raw.githubusercontent.com/fhernanb/datos/master/babies.txt"
dt <- read.table(url, header = TRUE, sep = '\t')

# Imprimir el data frame
#print(dt)

# Crear el boxplot
boxplot(dt$bwt, 
        las = 1, 
        col = "darkorchid1", 
        #horizontal = TRUE,
        xlab = "Peso del bebe (onzas)")

boxplot(dt$gestation, 
        las = 1, 
        col = "blue", 
        horizontal = TRUE,
        xlab = "Peso del bebe (onzas)")

Tercera Unidad

7 Estadistica inferencial

Es una rama de la estadistica que permite hacer conclusiones o generalizaciones sobre una poblacion completa a partir de una muestra significativa.A continuacion se daran definiciones de lagunos terminos estadistico necesario para entender la estadistica inferencial.

7.1 Poblacion

La poblacion es el conjunto total de los individuos u objetos que se desean estudiar, para asi obtener informacion.

7.1.1 Muestra

Es un subconjunto representativo de la poblacion , que se elije para hacer el estudio.

7.1.2 Parametro

Es un numero que describe a toda la poblacion (como el promedio de todos)

7.1.3 Estadistico

Es el numero que describe solo la muestra

7.1.4 Error de muestreo

Diferencia entre el parametro poblacional y estadistico, es decir, el resultado de la muestra y el verdadero valor de la poblacion.

7.2 Nivel de significancia (α)

El nivel de significancia es la probabilidad de rechazar la hipotesis nula siendo verdadera ; usualmente es de 0.05 o 0.01

7.3 Distribucion Muestral

Es la forma en que cambian los valores de un estadístico (como un promedio o una proporción) cuando repetimos un estudio muchas veces con diferentes muestras de la misma población.

7.4 Pruebas de normalidad

Es una técnica estadística que se usa para comprobar si los datos siguen una distribución normal (en forma de campana).

Sirve para decidir qué tipo de análisis estadístico es el más adecuado para esos datos.

7.4.1 Shapiro-Wilk

Prueba que evalua si los datos siguen una distribucion normal, recomendada para muestras pequeñas.

Interpretacion

• si el valor-p > 0.05, entonces los datos si son normales.

• si el valor-p <= 0.05, entonces los datos no son normales

#Datos simulados 
horas_sueno <- c(5, 6, 7, 8, 9, 6, 7, 8)
rendimiento <- c(65, 70, 75, 80, 85, 68, 74, 82)
datos <- data.frame(horas_sueno, rendimiento)

shapiro.test(horas_sueno)
## 
##  Shapiro-Wilk normality test
## 
## data:  horas_sueno
## W = 0.96507, p-value = 0.8568
shapiro.test(rendimiento)
## 
##  Shapiro-Wilk normality test
## 
## data:  rendimiento
## W = 0.9638, p-value = 0.8455

7.4.2 Kolmogorov-Smirnov

Prueba que compara los datos con una distribucion normal ideal, se usa con muestras grandes, aunque puede usarse en general

Interpretacion

• si el valor-p > 0.05, entonces los datos si son normales.

• si el valor-p <= 0.05, entonces los datos no son normales

#Datos simulados 
horas_sueno <- c(5, 6, 7, 8, 9, 6, 7, 8)
rendimiento <- c(65, 70, 75, 80, 85, 68, 74, 82)
datos <- data.frame(horas_sueno, rendimiento)

7.5 Grafico de dispercion

Representacion grafica que muestra puntos en el plano, y sirve para ver cómo se relacionan dos variables.

#Datos simulados 
horas_sueno <- c(5, 6, 7, 8, 9, 6, 7, 8)
rendimiento <- c(65, 70, 75, 80, 85, 68, 74, 82)
datos <- data.frame(horas_sueno, rendimiento)
#Visualizacion

library(ggplot2)
ggplot(datos, aes(x =horas_sueno , y = rendimiento)) +
  geom_point(color = "red", size = 3) +
  ggtitle("Relacion entre horas de sueno y rendimiento") +
  xlab("horas_sueno") + ylab("rendimiento") +
  theme_minimal()

## Correlacion de variables La correlación mide la fuerza y dirección de la relación lineal entre dos variables cuantitativas. No implica causalidad, solo asociación.

cor(horas_sueno, rendimiento)  #cor sirve para analizar correlaciones tipo matriz
## [1] 0.9891324

7.5.1 Tipos de correlación:

Correlación positiva: A mayor valor de una variable, mayor valor de la otra. Ejemplo: altura y peso.

Correlación negativa: A mayor valor de una, menor valor de la otra. Ejemplo: número de horas de estudio y errores en un examen.

Sin correlación: No hay relación lineal clara entre las variables.

7.5.2 Pearson

Mide la relacion lineal entre dos variables continuas. Es útil cuando las variables son normales o aproximadamente normales (siguen una distribución tipo campana) y tienen una relación lineal

cor.test(horas_sueno, rendimiento, method = "pearson")
## 
##  Pearson's product-moment correlation
## 
## data:  horas_sueno and rendimiento
## t = 16.479, df = 6, p-value = 3.183e-06
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.9388561 0.9981087
## sample estimates:
##       cor 
## 0.9891324

7.5.3 Spearman.

Mide la relación monótona (no necesariamente lineal) entre dos variables, usando rangos Es útil cuando las variables no siguen una distribución normal o cuando la relación no es lineal. Además, no se basa en el valor exacto de los datos, sino en sus rangos.

cor(horas_sueno,rendimiento , method = "spearman")
## [1] 0.9819805

7.5.4 Kendall

Mide la concordancia entre pares de datos, util con muestras pequeñas

cor(horas_sueno,rendimiento , method = "kendall")
## [1] 0.9449112

7.5.5 Rango para la corralacion

Va de [-1,1]

• +1: correlacion perfectamente positiva

•0: No hay correlacion

• -1: correlacion perfectamente negativa

7.6 ¿Que es una hipoteisis?

Una hipotesis en estadistica es una afirmacion o suposicion sobre un parametro de la poblacion, como una media, una proposicion, varianza,etc.

7.7 Prueba hipotesis

Una prueba de hipótesis es un procedimiento estadístico que nos ayuda a tomar decisiones sobre una población basándonos en los datos de una muestra.

Ejemplo H0:Dormir mas horas no mejora el rendimiento academico H1:Dormir mas horas si mejora el rendimiento academico

7.7.1 Hipotesis Nula

Afirmacion que se pone a prueba y generalmente propone ausencia de defecto o diferencia.

7.7.2 Hipotesis Alternada

Afirmacion que contradice la hipotesis nula; propone que si hay efecto o diferencia.

7.7.3 valor-p

Probabilidad de obtener resultados tan extremos como los observados, si la hipotesis nula es cierta.

7.7.4 Intervalo de confianza

Rango de valores dentro del cual se espera que se encuentre el parametro poblacional con ciertas probabilidades (Por ejemplo 95%)

7.8 Pruebas para datos parametricos

Pruebas estadisticas que se asumen una distribucion especificas, generalmente normal (ej.t de Student).

7.9 Prueba para datos no parametricos

Pruebas que no asumen distribucion especifica de los datos(ej.U Mann-Whitney, prueba de Kruskal-Wallis)

7.10 Ejercicio (Paso a Paso)

Graficos

peso <- c(51, 59, 49, 54, 50, 55, 48, 53, 52, 57)
long <- c(33.5, 38, 32, 37.5, 31.5, 33, 31, 36.5, 34, 35)
pairs(long ~ peso)  #permite elaborar un plot de correlacion

#install.packages("PerformanceAnalytics")
library(PerformanceAnalytics)
## Warning: package 'PerformanceAnalytics' was built under R version 4.4.3
## Cargando paquete requerido: xts
## Warning: package 'xts' was built under R version 4.4.3
## Cargando paquete requerido: zoo
## 
## Adjuntando el paquete: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
## 
## ######################### Warning from 'xts' package ##########################
## #                                                                             #
## # The dplyr lag() function breaks how base R's lag() function is supposed to  #
## # work, which breaks lag(my_xts). Calls to lag(my_xts) that you type or       #
## # source() into this session won't work correctly.                            #
## #                                                                             #
## # Use stats::lag() to make sure you're not using dplyr::lag(), or you can add #
## # conflictRules('dplyr', exclude = 'lag') to your .Rprofile to stop           #
## # dplyr from breaking base R's lag() function.                                #
## #                                                                             #
## # Code in packages is not affected. It's protected by R's namespace mechanism #
## # Set `options(xts.warn_dplyr_breaks_lag = FALSE)` to suppress this warning.  #
## #                                                                             #
## ###############################################################################
## 
## Adjuntando el paquete: 'xts'
## The following objects are masked from 'package:dplyr':
## 
##     first, last
## 
## Adjuntando el paquete: 'PerformanceAnalytics'
## The following object is masked from 'package:graphics':
## 
##     legend
# Nuestros datos es mejor tenerlos en un data.frame
dat1 <- data.frame(peso, long)
chart.Correlation(dat1)

correlacion espearman

cor(horas_sueno,rendimiento , method = "spearman")
## [1] 0.9819805

correlacion kendall

cor(horas_sueno,rendimiento, method = "kendall")
## [1] 0.9449112

Prueba de Normalidad

shapiro.test(peso)
## 
##  Shapiro-Wilk normality test
## 
## data:  peso
## W = 0.97343, p-value = 0.9207
shapiro.test(long)
## 
##  Shapiro-Wilk normality test
## 
## data:  long
## W = 0.93757, p-value = 0.5263

7.11 NHANES

Es una base de datos sobre salud, que contiene datos de salud nutricion en Estados Unidos, con variables como peso,edad,presion,colesterol, entre otros.

#install.packages("NHANES")
library(NHANES)
## Warning: package 'NHANES' was built under R version 4.4.3
data("NHANES")
head(NHANES)
## # A tibble: 6 × 76
##      ID SurveyYr Gender   Age AgeDecade AgeMonths Race1 Race3 Education   
##   <int> <fct>    <fct>  <int> <fct>         <int> <fct> <fct> <fct>       
## 1 51624 2009_10  male      34 " 30-39"        409 White <NA>  High School 
## 2 51624 2009_10  male      34 " 30-39"        409 White <NA>  High School 
## 3 51624 2009_10  male      34 " 30-39"        409 White <NA>  High School 
## 4 51625 2009_10  male       4 " 0-9"           49 Other <NA>  <NA>        
## 5 51630 2009_10  female    49 " 40-49"        596 White <NA>  Some College
## 6 51638 2009_10  male       9 " 0-9"          115 White <NA>  <NA>        
## # ℹ 67 more variables: MaritalStatus <fct>, HHIncome <fct>, HHIncomeMid <int>,
## #   Poverty <dbl>, HomeRooms <int>, HomeOwn <fct>, Work <fct>, Weight <dbl>,
## #   Length <dbl>, HeadCirc <dbl>, Height <dbl>, BMI <dbl>,
## #   BMICatUnder20yrs <fct>, BMI_WHO <fct>, Pulse <int>, BPSysAve <int>,
## #   BPDiaAve <int>, BPSys1 <int>, BPDia1 <int>, BPSys2 <int>, BPDia2 <int>,
## #   BPSys3 <int>, BPDia3 <int>, Testosterone <dbl>, DirectChol <dbl>,
## #   TotChol <dbl>, UrineVol1 <int>, UrineFlow1 <dbl>, UrineVol2 <int>, …
data("NHANES")
nhanes_filtrado <- na.omit(NHANES[, c("Age", "BPSysAve")])
print(nhanes_filtrado)
## # A tibble: 8,551 × 2
##      Age BPSysAve
##    <int>    <int>
##  1    34      113
##  2    34      113
##  3    34      113
##  4    49      112
##  5     9       86
##  6     8      107
##  7    45      118
##  8    45      118
##  9    45      118
## 10    66      111
## # ℹ 8,541 more rows

HIPOTESIS PARA LA CORRELACION

-Hipotesis nulaH_0:

La edad influye en la variación de la presion arterial sistólica.

-Hipotesis AlternaH_1:

La edad no influye en la variación de la presión arterial sistólica.

library(ggplot2)
ggplot(nhanes_filtrado, aes(x = Age, y = BPSysAve)) +
  geom_point(color = "blue", alpha = 0.6) +
  labs(
    title = "Relación entre Edad y Presión Sistólica",
    x = "Edad",
    y = "Presión Sistólica Promedio"
  ) +
  theme_minimal()

ks.test(nhanes_filtrado$Age, "pnorm", mean = mean(nhanes_filtrado$Age), sd = sd(nhanes_filtrado$Age))
## Warning in ks.test.default(nhanes_filtrado$Age, "pnorm", mean =
## mean(nhanes_filtrado$Age), : ties should not be present for the one-sample
## Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  nhanes_filtrado$Age
## D = 0.063203, p-value < 2.2e-16
## alternative hypothesis: two-sided
ks.test(nhanes_filtrado$BPSysAve, "pnorm", mean = mean(nhanes_filtrado$BPSysAve), sd = sd(nhanes_filtrado$BPSysAve))
## Warning in ks.test.default(nhanes_filtrado$BPSysAve, "pnorm", mean =
## mean(nhanes_filtrado$BPSysAve), : ties should not be present for the one-sample
## Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  nhanes_filtrado$BPSysAve
## D = 0.071972, p-value < 2.2e-16
## alternative hypothesis: two-sided

la prueba de normalidad Kolmogorov-Smirnov aplicada a ambas variables (Age y BPSysAve) arrojó un valor-p muy bajo (p-value < 2.2e-16), lo que indica que ninguna de las dos variables sigue una distribución normal. Además, se presentaron valores repetidos (ties), lo que limita la aplicabilidad de esta prueba para normalidad.

Debido a la no normalidad y la presencia de valores repetidos, se utilizó la correlación de Spearman, que es una medida no paramétrica adecuada para estos casos

cor_spearman <- cor(nhanes_filtrado$Age, nhanes_filtrado$BPSysAve, method = "spearman")
cat("Correlación de Spearman:", cor_spearman, "\n")
## Correlación de Spearman: 0.5150074

El coeficiente de correlación de Spearman fue de 0.515, lo que refleja una correlación positiva moderada entre la edad y la presión arterial sistólica. es decir, se acepta la hipostesis nula y se rechaza la alterna.

7.12 Pruebas de Hipotesis Estadisticas

tabla <- data.frame(
  Prueba = c(
    "t-student",
    "Chi-cuadrado",
    "Prueba de Fisher",
    "Kruskal-Wallis",
    "Levene",
    "Wilcoxon-Mann-Whitney",
    "Prueba exacta de Fisher",
    "ANOVA",
    "Prueba de McNemar",
    "Correlación",
    "Regresión lineal"
  ),
 
  Tipo = c(
    "Paramétrica",
    "No paramétrica",
    "No paramétrica",
    "No paramétrica",
    "Paramétrica auxiliar",
    "No paramétrica",
    "No paramétrica",
    "Paramétrica",
    "No paramétrica (pareada)",
    "Paramétrica / No paramétrica",
    "Paramétrica"
  )
)

# Mostrar tabla con kable
knitr::kable(tabla,  align = "c")
Prueba Tipo
t-student Paramétrica
Chi-cuadrado No paramétrica
Prueba de Fisher No paramétrica
Kruskal-Wallis No paramétrica
Levene Paramétrica auxiliar
Wilcoxon-Mann-Whitney No paramétrica
Prueba exacta de Fisher No paramétrica
ANOVA Paramétrica
Prueba de McNemar No paramétrica (pareada)
Correlación Paramétrica / No paramétrica
Regresión lineal Paramétrica

7.12.1 Prueba T-Studen

Es una prueba estadística usada para comparar las medias de dos grupos independientes y determinar si son significativamente diferentes entre sí. Se usa cuando se cumplan estas condiciones:

1)Hay dos grupos independientes (por ejemplo, hombres vs. mujeres).

2)La variable que comparas es cuantitativa continua (como altura, peso, nota).

3)La variable debe seguir una distribución aproximadamente normal.

4)Idealmente, las varianzas de los dos grupos son iguales (puedes verificarlo con la prueba de Levene).

7.12.1.1 Ejemplo 1.

Queremos saber si hay diferencia significativa en las notas promedio entre mujeres y hombres.

notas <- c(4.0, 3.5, 3.8, 4.1, 3.7,   # Mujeres
           3.2, 3.4, 3.6, 3.3, 3.5)   # Hombres
grupo <- c(rep("Mujer", 5), rep("Hombre", 5))

Paso 1: Planteamiento de hipótesis

-H_0=μMujer=μHombre (Las medias de notas son iguales.)

-H_1=μMujer≠μHombre (Las medias de notas son diferentes.)

Paso 2: Comprobar normalidad:

Antes de usar la prueba t, verificamos si los datos son normales:

shapiro.test(notas[grupo == "Mujer"])
## 
##  Shapiro-Wilk normality test
## 
## data:  notas[grupo == "Mujer"]
## W = 0.97378, p-value = 0.8989
shapiro.test(notas[grupo == "Hombre"])
## 
##  Shapiro-Wilk normality test
## 
## data:  notas[grupo == "Hombre"]
## W = 0.98676, p-value = 0.9672

Analisis Normalidad

-H_0: Los datos presentan una distribución normal.

-H_1: Los datos presentan una distribución normal.

El valor p > 0.05 en ambos grupos indica que no se rechaza la hipótesis nula. En otras palabras,existe una distribucion normal en ambas variables.

Paso 3: Comprobar igualdad de varianzas

Usamos prueba de igualdad de varianzas

var.test(notas ~ grupo)
## 
##  F test to compare two variances
## 
## data:  notas by grupo
## F = 0.4386, num df = 4, denom df = 4, p-value = 0.4443
## alternative hypothesis: true ratio of variances is not equal to 1
## 95 percent confidence interval:
##  0.04566559 4.21251311
## sample estimates:
## ratio of variances 
##          0.4385965

Analisis igualdad de Varianzas

-Hipótesis nula H_0: Las varianzas de ambos grupos son iguales

-Hipótesis alternativa H_1: Las varianzas son diferentes

El valor p = 0.4443 > 0.05, entonces no rechazamos la hipótesis nula. Por lo tanto, las varianzas de ambos grupos son iguales

Paso 4: Prueba t de Student

t.test(notas ~ grupo, var.equal = TRUE)  # si hay igualdad de varianzas
## 
##  Two Sample t-test
## 
## data:  notas by grupo
## t = -3.2796, df = 8, p-value = 0.01119
## alternative hypothesis: true difference in means between group Hombre and group Mujer is not equal to 0
## 95 percent confidence interval:
##  -0.7153126 -0.1246874
## sample estimates:
## mean in group Hombre  mean in group Mujer 
##                 3.40                 3.82

El valor p (0.01119) es menor que 0.05, por lo tanto rechazamos H_0. Es decir, que las medias de los datos son diferentes. La media de mujeres (3.82) es mayor que la media de hombres (3.40), lo que sugiere que las mujeres obtuvieron notas significativamente mayores que los hombres en esta muestra.

#Grafico 

boxplot(notas ~ grupo, col=c("blue", "green"),
        main="Boxplot - Comparación de dos grupos",
        ylab="notas", xlab="Grupo")

7.12.1.2 Ejemplo 2

library(NHANES)
data("NHANES")
head(NHANES)
## # A tibble: 6 × 76
##      ID SurveyYr Gender   Age AgeDecade AgeMonths Race1 Race3 Education   
##   <int> <fct>    <fct>  <int> <fct>         <int> <fct> <fct> <fct>       
## 1 51624 2009_10  male      34 " 30-39"        409 White <NA>  High School 
## 2 51624 2009_10  male      34 " 30-39"        409 White <NA>  High School 
## 3 51624 2009_10  male      34 " 30-39"        409 White <NA>  High School 
## 4 51625 2009_10  male       4 " 0-9"           49 Other <NA>  <NA>        
## 5 51630 2009_10  female    49 " 40-49"        596 White <NA>  Some College
## 6 51638 2009_10  male       9 " 0-9"          115 White <NA>  <NA>        
## # ℹ 67 more variables: MaritalStatus <fct>, HHIncome <fct>, HHIncomeMid <int>,
## #   Poverty <dbl>, HomeRooms <int>, HomeOwn <fct>, Work <fct>, Weight <dbl>,
## #   Length <dbl>, HeadCirc <dbl>, Height <dbl>, BMI <dbl>,
## #   BMICatUnder20yrs <fct>, BMI_WHO <fct>, Pulse <int>, BPSysAve <int>,
## #   BPDiaAve <int>, BPSys1 <int>, BPDia1 <int>, BPSys2 <int>, BPDia2 <int>,
## #   BPSys3 <int>, BPDia3 <int>, Testosterone <dbl>, DirectChol <dbl>,
## #   TotChol <dbl>, UrineVol1 <int>, UrineFlow1 <dbl>, UrineVol2 <int>, …
# Filtrar datos completos para BMI y Gender
datos <- NHANES[!is.na(NHANES$BMI) & !is.na(NHANES$Gender), ]

# Mostrar los primeros registros para verificar
head(datos[, c("BMI", "Gender")])
## # A tibble: 6 × 2
##     BMI Gender
##   <dbl> <fct> 
## 1  32.2 male  
## 2  32.2 male  
## 3  32.2 male  
## 4  15.3 male  
## 5  30.6 female
## 6  16.8 male
# Prueba de Normalidad 
shapiro.test(datos$BMI[datos$Gender == "male"])
## 
##  Shapiro-Wilk normality test
## 
## data:  datos$BMI[datos$Gender == "male"]
## W = 0.97807, p-value < 2.2e-16
shapiro.test(datos$BMI[datos$Gender == "female"])
## 
##  Shapiro-Wilk normality test
## 
## data:  datos$BMI[datos$Gender == "female"]
## W = 0.94275, p-value < 2.2e-16
#Prueba de igualdad de varianza
var.test(BMI ~ Gender, data = datos)
## 
##  F test to compare two variances
## 
## data:  BMI by Gender
## F = 1.3464, num df = 4840, denom df = 4792, p-value < 2.2e-16
## alternative hypothesis: true ratio of variances is not equal to 1
## 95 percent confidence interval:
##  1.272407 1.424606
## sample estimates:
## ratio of variances 
##           1.346363
# Aplicacion de la prueba 
resultado_welch <- t.test(BMI ~ Gender, data = datos, var.equal = FALSE)
print(resultado_welch)
## 
##  Welch Two Sample t-test
## 
## data:  BMI by Gender
## t = 1.4981, df = 9452.6, p-value = 0.1341
## alternative hypothesis: true difference in means between group female and group male is not equal to 0
## 95 percent confidence interval:
##  -0.06939849  0.51940903
## sample estimates:
## mean in group female   mean in group male 
##             26.77208             26.54707
#Grafico
boxplot(BMI ~ Gender, data = datos,
        col = c("blue", "green"),
        main = "Boxplot - Comparación de BMI por Género",
        ylab = "BMI", xlab = "Género")

7.12.2 chi-Cuadrado

El test de chi-cuadrado (χ²) es una prueba estadística muy utilizada para analizar relaciones entre variables categóricas.

7.12.2.1 Ejemplo 1

H_0=No hay relación entre el género y el uso de lentes (son independientes).

H_1= Sí hay relación entre el género y el uso de lentes (son dependientes).

# Creamos la tabla manualmente
tabla <- matrix(c(30, 20, 10, 40), nrow = 2, byrow = TRUE)
colnames(tabla) <- c("UsaLentes_Si", "UsaLentes_No")
rownames(tabla) <- c("Hombre", "Mujer")

# Convertimos a tabla
tabla <- as.table(tabla)

# Mostramos la tabla
tabla
##        UsaLentes_Si UsaLentes_No
## Hombre           30           20
## Mujer            10           40
# Test chi-cuadrado
resultado <- chisq.test(tabla)

# Ver resultado
print(resultado)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  tabla
## X-squared = 15.042, df = 1, p-value = 0.0001052
# Barplot agrupado
barplot(tabla, beside=TRUE, col=c("lightgreen", "orange"),
        legend=rownames(tabla),
        main="Distribución por Género y Preferencia",
        ylab="Frecuencia")

Interpretacion

Como p<0.05, rechazamos la hipótesis nula. Es decir que Existe evidencia estadísticamente significativa de que el uso de lentes está asociado al género.

7.12.2.2 Ejemplo 2.

H_0=No hay relación entre genero y fumar ahora(son independientes).

H_1= Sí hay relación entre el género y fumar ahora (son dependientes).

library(NHANES)
data("NHANES")
head(NHANES)
## # A tibble: 6 × 76
##      ID SurveyYr Gender   Age AgeDecade AgeMonths Race1 Race3 Education   
##   <int> <fct>    <fct>  <int> <fct>         <int> <fct> <fct> <fct>       
## 1 51624 2009_10  male      34 " 30-39"        409 White <NA>  High School 
## 2 51624 2009_10  male      34 " 30-39"        409 White <NA>  High School 
## 3 51624 2009_10  male      34 " 30-39"        409 White <NA>  High School 
## 4 51625 2009_10  male       4 " 0-9"           49 Other <NA>  <NA>        
## 5 51630 2009_10  female    49 " 40-49"        596 White <NA>  Some College
## 6 51638 2009_10  male       9 " 0-9"          115 White <NA>  <NA>        
## # ℹ 67 more variables: MaritalStatus <fct>, HHIncome <fct>, HHIncomeMid <int>,
## #   Poverty <dbl>, HomeRooms <int>, HomeOwn <fct>, Work <fct>, Weight <dbl>,
## #   Length <dbl>, HeadCirc <dbl>, Height <dbl>, BMI <dbl>,
## #   BMICatUnder20yrs <fct>, BMI_WHO <fct>, Pulse <int>, BPSysAve <int>,
## #   BPDiaAve <int>, BPSys1 <int>, BPDia1 <int>, BPSys2 <int>, BPDia2 <int>,
## #   BPSys3 <int>, BPDia3 <int>, Testosterone <dbl>, DirectChol <dbl>,
## #   TotChol <dbl>, UrineVol1 <int>, UrineFlow1 <dbl>, UrineVol2 <int>, …
# Creamos la tabla 
tabla2 <- table(NHANES$Gender, NHANES$SmokeNow)
print(tabla)
##        UsaLentes_Si UsaLentes_No
## Hombre           30           20
## Mujer            10           40
# Test chi-cuadrado
resultado <- chisq.test(tabla2)

# Ver resultado
print(resultado)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  tabla2
## X-squared = 0.012915, df = 1, p-value = 0.9095
# Barplot agrupado
barplot(tabla2, beside=TRUE, col=c("lightgreen", "orange"),
        legend=rownames(tabla),
        main="genero vs fumar",
        ylab="Frecuencia")

Interpretacion

Como p>0.05, por tanto se acepta la hipótesis nula. Es decir que no existe evidencia estadísticamente significativa para rechazar la hipotesis nula es decir, que no hay relación entre genero y fumar ahora(son independientes).

7.12.3 Prueba Fisher

La prueba exacta de Fisher es una alternativa al test chi-cuadrado, especialmente útil cuando las tablas de contingencia son pequeñas o no cumplen los supuestos del chi-cuadrado.

7.12.3.1 Ejemplo 1

H_0=No hay asociación entre tener mascota y preferir té (las variables son independientes).

H_1=Sí hay asociación entre tener mascota y preferir té.

# Crear tabla 2x2
tabla <- matrix(c(8, 2, 1, 9), nrow = 2, byrow = TRUE)
rownames(tabla) <- c("Tiene mascota", "No tiene mascota")
colnames(tabla) <- c("Prefiere Té", "No Prefiere Té")
print(tabla)
##                  Prefiere Té No Prefiere Té
## Tiene mascota              8              2
## No tiene mascota           1              9
# Aplicar la prueba de Fisher 
resultado <- fisher.test(tabla)
print(resultado)
## 
##  Fisher's Exact Test for Count Data
## 
## data:  tabla
## p-value = 0.005477
## alternative hypothesis: true odds ratio is not equal to 1
## 95 percent confidence interval:
##     2.057999 1740.081669
## sample estimates:
## odds ratio 
##   27.32632

Interpretacion

Como el p-value < 0.05, rechazamos la hipótesis nula.Hay una asociación significativa entre tener mascota y preferir té. Además, el odds ratio = 27.33 indica que quienes tienen mascota tienen 27 veces más probabilidades (aproximadamente) de preferir té comparado con quienes no tienen mascota.

7.12.3.2 Ejemplo 2

H_0= No hay asociación entre el sexo y la actividad física.

H_1=Hay asociación entre el sexo y la actividad física.

# Cargar paquete y datos
library(NHANES)
data("NHANES")

# Verifica las variables
table(NHANES$Gender)
## 
## female   male 
##   5020   4980
table(NHANES$PhysActive)
## 
##   No  Yes 
## 3677 4649
# Crear tabla 2x2 entre Gender y PhysActive (ambas categóricas)
tabla <- table(NHANES$Gender, NHANES$PhysActive)
print(tabla)
##         
##            No  Yes
##   female 1972 2240
##   male   1705 2409
# Aplicar la prueba de Fisher
resultado <- fisher.test(tabla)

# Ver resultado
print(resultado)
## 
##  Fisher's Exact Test for Count Data
## 
## data:  tabla
## p-value = 8.525e-07
## alternative hypothesis: true odds ratio is not equal to 1
## 95 percent confidence interval:
##  1.139508 1.357788
## sample estimates:
## odds ratio 
##   1.243817

Interpretacion

Dado que el p-value < 0.05, rechazamos la hipótesis nula.Esto significa que sí hay una asociación estadísticamente significativa entre el sexo y el hecho de ser físicamente activo.

7.12.4 Kruskal-Wallis

La prueba de Kruskal-Wallis es una prueba no paramétrica muy útil cuando quieres comparar más de dos grupos independientes sobre una variable cuantitativa, sin asumir normalidad. Es una extensión de la prueba de Mann-Whitney (Wilcoxon rank-sum) para más de dos grupos. Sirve para verificar si al menos uno de los grupos tiene una distribución distinta.

7.12.4.1 Ejemplo 1

H_0=Las distribuciones del nivel de estrés son iguales en los tres tipos de trabajo (oficina, construcción, docencia).

H_1=Al menos uno de los grupos tiene una distribución diferente.

# Cargamos valores ficticios
estres <- c(
  5, 6, 6, 7, 5,     # Oficina
  7, 8, 9, 6, 8,     # Construcción
  4, 3, 5, 4, 3      # Docencia
)

trabajo <- factor(rep(c("Oficina", "Construccion", "Docencia"), each = 5))

# Creamos el data frame
datos <- data.frame(estres, trabajo)

#Aplicacion de la Prueba

kruskal.test(estres ~ trabajo, data = datos)
## 
##  Kruskal-Wallis rank sum test
## 
## data:  estres by trabajo
## Kruskal-Wallis chi-squared = 11.082, df = 2, p-value = 0.003922
# Boxplot
boxplot(estres ~ trabajo, col=c("pink", "lightblue", "lightgreen"),
        main="Boxplot - Kruskal-Wallis",
        ylab="Valores", xlab="Grupo")

Interpretacion Dado que el p-value < 0.05, rechazamos la hipótesis nula. Es decir, que existe evidencia estadísticamente significativa para afirmar que los niveles de estrés difieren según el tipo de trabajo.

7.12.4.2 Ejemplo 2

H_0=El BMI tiene la misma distribución en todos los grupos de edad. H_1=Al menos un grupo de edad tiene una distribución diferente de BMI.

library(NHANES)
data("NHANES")
head(NHANES)
## # A tibble: 6 × 76
##      ID SurveyYr Gender   Age AgeDecade AgeMonths Race1 Race3 Education   
##   <int> <fct>    <fct>  <int> <fct>         <int> <fct> <fct> <fct>       
## 1 51624 2009_10  male      34 " 30-39"        409 White <NA>  High School 
## 2 51624 2009_10  male      34 " 30-39"        409 White <NA>  High School 
## 3 51624 2009_10  male      34 " 30-39"        409 White <NA>  High School 
## 4 51625 2009_10  male       4 " 0-9"           49 Other <NA>  <NA>        
## 5 51630 2009_10  female    49 " 40-49"        596 White <NA>  Some College
## 6 51638 2009_10  male       9 " 0-9"          115 White <NA>  <NA>        
## # ℹ 67 more variables: MaritalStatus <fct>, HHIncome <fct>, HHIncomeMid <int>,
## #   Poverty <dbl>, HomeRooms <int>, HomeOwn <fct>, Work <fct>, Weight <dbl>,
## #   Length <dbl>, HeadCirc <dbl>, Height <dbl>, BMI <dbl>,
## #   BMICatUnder20yrs <fct>, BMI_WHO <fct>, Pulse <int>, BPSysAve <int>,
## #   BPDiaAve <int>, BPSys1 <int>, BPDia1 <int>, BPSys2 <int>, BPDia2 <int>,
## #   BPSys3 <int>, BPDia3 <int>, Testosterone <dbl>, DirectChol <dbl>,
## #   TotChol <dbl>, UrineVol1 <int>, UrineFlow1 <dbl>, UrineVol2 <int>, …
# Eliminar filas con valores NA en BMI y AgeDecade
datos <- subset(NHANES, !is.na(BMI) & !is.na(AgeDecade))

# Aplicacion de la prueba 
kruskal.test(BMI ~ AgeDecade, data = datos)
## 
##  Kruskal-Wallis rank sum test
## 
## data:  BMI by AgeDecade
## Kruskal-Wallis chi-squared = 3240, df = 7, p-value < 2.2e-16
#grafico 
boxplot(BMI ~ AgeDecade, data = datos,
        col = c("blue", "green"),
        main = "Boxplot - Comparación de BMI por Género",
        ylab = "BMI", xlab = "Género")

Interpretacion

Como p-value < 0.05, rechazamos la hipotesis nula. Es decir, el BMI difiere significativamente entre los distintos grupos de edad.

7.12.5 Levene Test

La prueba de Levene se utiliza para comprobar la homogeneidad de varianzas (también llamada homocedasticidad) antes de aplicar pruebas como ANOVA o regresión.

7.12.5.1 Ejemplo 1

H_0=La varianza de concentración es la misma en los tres ambientes.

H_1=Al menos un ambiente tiene una varianza diferente en la concentración.

# Instalar y cargar el paquete si no está instalado
#install.packages("car")  # Solo una vez
library(car)
## Warning: package 'car' was built under R version 4.4.3
## Cargando paquete requerido: carData
## 
## Adjuntando el paquete: 'car'
## The following object is masked from 'package:dplyr':
## 
##     recode
# Datos ficticios
ambiente <- rep(c("Silencio", "Musica", "Ruido"), each = 10)
concentracion <- c(
  9, 8, 9, 10, 9, 8, 9, 10, 9, 9,     # Silencio (poca variabilidad)
  7, 6, 8, 6, 7, 5, 6, 7, 8, 6,       # Musica (variabilidad media)
  4, 3, 6, 2, 5, 7, 3, 2, 6, 4        # Ruido (alta variabilidad)
)

datos <- data.frame(ambiente, concentracion)

#Grafico
boxplot(concentracion ~ ambiente, data = datos,
        col = c("purple", "orange", "cyan"),
        main = "Boxplot para Levene Test",
        ylab = "Concentración", xlab = "Ambiente")

# Aplicacion de la prueba 
leveneTest(concentracion ~ ambiente, data = datos)
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
## Levene's Test for Homogeneity of Variance (center = median)
##       Df F value  Pr(>F)  
## group  2  5.3023 0.01142 *
##       27                  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Interpretacion

dado que p-valor< 0.05, rechazamos la hipótesis nula. Existe evidencia estadística para afirmar que las varianzas del nivel de concentración difieren entre los grupos (ambiente de estudio).

7.12.5.2 Ejemplo 2

H_0=Las varianzas del índice de masa corporal (BMI) son iguales en todos los grupos de edad.

H_1=Al menos una de las varianzas del BMI es diferente.

# Cargar librerías necesarias
library(NHANES)
library(car)

# Filtrar datos válidos (sin NA)
datos <- subset(NHANES, !is.na(BMI) & !is.na(AgeDecade))

# Verificar que AgeDecade es un factor
datos$AgeDecade <- as.factor(datos$AgeDecade)

boxplot(BMI ~ AgeDecade, data = datos,
        col = c("purple", "orange", "cyan"),
        main = "Boxplot para Levene Test",
        ylab = "BMI", xlab = "AgeDecade")

# Aplicar la prueba de Levene
leveneTest(BMI ~ AgeDecade, data = datos)
## Levene's Test for Homogeneity of Variance (center = median)
##         Df F value    Pr(>F)    
## group    7  66.924 < 2.2e-16 ***
##       9303                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Interpretacion

Dado que el p-valor es mucho menor que 0.05, rechazamos la hipótesis nula.Esto indica que la varianza del índice de masa corporal (BMI) varía significativamente entre los diferentes grupos de edad (AgeDecade).

7.12.6 Wilcoxon (Mann-Whitney U)

Es una prueba no paramétrica que se utiliza para comparar dos grupos independientes cuando:

-Los datos no siguen una distribución normal,

-Cuando los datos son ordinales o no continuos,

-Cuando las varianzas son desiguales y no se puede aplicar una t de Student.

7.12.6.1 Ejemplo

H_0=La distribución del estrés es igual en ambos grupos.

H_1=Las distribuciones son distintas (hay diferencia de estrés).

# Creamos los vectores de datos
estres_presencial <- c(7, 8, 6, 9, 7, 8, 6)
estres_remoto     <- c(4, 5, 3, 4, 5, 6, 5)

#Grafico 

boxplot(estres_presencial, estres_remoto, col=c("red", "blue"),
        main="Boxplot - Wilcoxon (Mann-Whitney)",
        ylab="BMI", xlab="Gender")

# Prueba de Wilcoxon
wilcox.test(estres_presencial, estres_remoto)
## Warning in wilcox.test.default(estres_presencial, estres_remoto): cannot
## compute exact p-value with ties
## 
##  Wilcoxon rank sum test with continuity correction
## 
## data:  estres_presencial and estres_remoto
## W = 48, p-value = 0.00293
## alternative hypothesis: true location shift is not equal to 0

Interpretacion

El p-value = 0.0053 es menor que 0.05, por lo tanto, rechazamos la hipótesis nula.Hay evidencia significativa de que el nivel de estrés difiere entre quienes trabajan presencial y quienes trabajan remoto.

7.12.6.2 Ejemplo 2.

H_0=No hay diferencia en la tendencia central del BMI entre hombres y mujeres (las distribuciones son iguales).

H_1=Hay diferencia en la tendencia central del BMI entre hombres y mujeres (las distribuciones son distintas).

library(NHANES)
data("NHANES")

# Filtrar los datos (eliminar NA)
datos <- subset(NHANES, !is.na(BMI) & Gender %in% c("male", "female"))

#Grafico 

boxplot(BMI ~ Gender, data = datos, col=c("lightgrey", "lightgreen"),
        main="Boxplot - Wilcoxon (Mann-Whitney)",
        ylab="BMI", xlab="Gender")

#Aplicacion de la prueba 
wilcox.test(BMI ~ Gender, data = datos)
## 
##  Wilcoxon rank sum test with continuity correction
## 
## data:  BMI by Gender
## W = 11362268, p-value = 0.0797
## alternative hypothesis: true location shift is not equal to 0

Interpretacion}

El p-value = 0.0797 es mayor que 0.05, por lo tanto, No se rechaza la hipótesis nula. No hay evidencia estadísticamente significativa para afirmar que el índice de masa corporal (BMI) difiere entre hombres y mujeres.

7.12.7 ANOVA

7.12.7.1 Ejemplo 1.

H_0=El nivel de estrés es igual en todos los trabajos.

H_1=Al menos un grupo tiene un nivel de estrés diferente.

set.seed(42)

# Crear datos ficticios: nivel de estrés en 3 tipos de trabajo
oficina <- rnorm(10, mean = 55, sd = 5)
medico <- rnorm(10, mean = 70, sd = 6)
profesor <- rnorm(10, mean = 60, sd = 7)

# Unir datos en un solo vector
estres <- c(oficina, medico, profesor)

# Crear factor que indique el grupo
trabajo <- factor(rep(c("Oficina", "Médico", "Profesor"), each = 10))

# Crear data frame
datos <- data.frame(trabajo, estres)

# Ver primeras filas
head(datos)
##   trabajo   estres
## 1 Oficina 61.85479
## 2 Oficina 52.17651
## 3 Oficina 56.81564
## 4 Oficina 58.16431
## 5 Oficina 57.02134
## 6 Oficina 54.46938
# Prueba ANOVA
modelo <- aov(estres ~ trabajo, data = datos)
summary(modelo)
##             Df Sum Sq Mean Sq F value  Pr(>F)   
## trabajo      2  779.1   389.5   6.541 0.00483 **
## Residuals   27 1607.9    59.6                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Comparaciones post hoc
TukeyHSD(modelo)
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = estres ~ trabajo, data = datos)
## 
## $trabajo
##                        diff        lwr       upr     p adj
## Oficina-Médico   -11.282776 -19.839543 -2.726009 0.0080049
## Profesor-Médico  -10.265816 -18.822583 -1.709049 0.0163020
## Profesor-Oficina   1.016959  -7.539808  9.573726 0.9533437
# Boxplot
boxplot(estres ~ trabajo, data = datos,
        col = c("lightblue", "pink", "lightgreen"),
        main = "Estrés por tipo de trabajo",
        ylab = "Nivel de Estrés")

Interpretacion

El p-value = 0.0001 < 0.05, por lo tanto:Rechazamos la hipotesis nula.hay diferencia significativa en los niveles de estrés entre al menos dos tipos de trabajo.

7.12.7.2 Ejemplo 2.

H_0= Todas las medias de BMI son iguales para los diferentes niveles educativos.

H_1= Al menos una media de BMI es diferente entre los niveles educativos.

library(NHANES)
data("NHANES")

# Filtrar datos válidos
datos <- subset(NHANES, !is.na(BMI) & !is.na(Education))
#ANOVA
modelo_anova <- aov(BMI ~ Education, data = datos)
summary(modelo_anova)
##               Df Sum Sq Mean Sq F value Pr(>F)    
## Education      4   4178  1044.6    23.9 <2e-16 ***
## Residuals   7153 312614    43.7                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#grafico 
boxplot(BMI ~ Education, data = datos,
        main = "BMI según Nivel Educativo",
        ylab = "Índice de Masa Corporal",
        col = rainbow(5))

interpretacion

El valor p (< 2e-16) es mucho menor que 0.05, lo que significa que: Rechazamos la hipótesis nula.Existe evidencia estadísticamente significativa de que al menos un grupo educativo tiene un BMI medio diferente.

7.12.8 McNemar

7.12.8.1 Ejemplo 1

H_0=La proporción de cambios de Sí a No es igual a la proporción de cambios de No a Sí (no hay efecto).

H_1=Las proporciones son diferentes (hay efecto o cambio significativo).

# Creamos la tabla de contingencia 2x2
tabla_mcnemar <- matrix(c(20, 5,
                         15, 10), 
                       nrow = 2,
                       byrow = TRUE)

rownames(tabla_mcnemar) <- c("Usa gafas antes: Sí", "Usa gafas antes: No")
colnames(tabla_mcnemar) <- c("Usa gafas después: Sí", "Usa gafas después: No")

# Mostramos la tabla
print(tabla_mcnemar)
##                     Usa gafas después: Sí Usa gafas después: No
## Usa gafas antes: Sí                    20                     5
## Usa gafas antes: No                    15                    10
# Aplicamos la prueba de McNemar
resultado <- mcnemar.test(tabla_mcnemar)

# Resultados
print(resultado)
## 
##  McNemar's Chi-squared test with continuity correction
## 
## data:  tabla_mcnemar
## McNemar's chi-squared = 4.05, df = 1, p-value = 0.04417

Interpretacion

p-valor = 0.04417, que es menor que 0.05 (nivel de significancia típico).Rechazamos la hipótesis nula,por lo tanto, existe evidencia estadística para afirmar que el cambio en el uso de gafas antes y después es significativo.

7.12.9 Correlacion y Regresion lineal

set.seed(123)

# Crear datos ficticios
x <- 1:20
y <- 2 + 3 * x + rnorm(20, 0, 4)  # Y = 2 + 3X + ruido

# Correlación
correlacion <- cor(x, y)
print(paste("Coeficiente de correlación:", round(correlacion, 3)))
## [1] "Coeficiente de correlación: 0.976"
# Gráfico de dispersión
plot(x, y, main="Dispersión con línea de regresión",
     xlab="Variable X", ylab="Variable Y")

# Ajuste de regresión lineal
modelo <- lm(y ~ x)
abline(modelo, col="red")

# Resumen del modelo
summary(modelo)
## 
## Call:
## lm(formula = y ~ x)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -7.9516 -2.4112 -0.1507  2.0777  6.9341 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   3.2404     1.8480   1.753   0.0965 .  
## x             2.9358     0.1543  19.031 2.27e-13 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3.978 on 18 degrees of freedom
## Multiple R-squared:  0.9527, Adjusted R-squared:   0.95 
## F-statistic: 362.2 on 1 and 18 DF,  p-value: 2.267e-13