Primera Unidad
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. 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.
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.
Variables:Se crean con <- o =.
x<-5
y=10
print(x)
## [1] 5
print(y)
## [1] 10
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.
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
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
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
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:
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.
#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
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
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
En R,se pueden crear vectores aleatorios utilizando funciones como funif(), rnorm(),sample(), donde cada uno de ellos generan tipos de vectores diferente.
# 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
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
# 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
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
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
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
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
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"
Las medidas de tendencia central son valores que describen el centro de un conjunto de datos. En este documento exploraremos:
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.
Si hay un número impar de datos, es el valor central.
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
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
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
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
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
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"
list y data.framelist: 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
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
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
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
# 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
NA hay en el
Data framesum(is.na(datos_faltantes)) # Cuenta todos los NA
## [1] 4
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
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" ...
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
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
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.
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
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.
Ú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")
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))
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
# 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
# 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.
# 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
# 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
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.
# 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))
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
mtcarshead(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)
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
Data.framedim(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…
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
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), .)))
NA en una columna especificaSi 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
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()
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
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.
La poblacion es el conjunto total de los individuos u objetos que se desean estudiar, para asi obtener informacion.
Es un subconjunto representativo de la poblacion , que se elije para hacer el estudio.
Es un numero que describe a toda la poblacion (como el promedio de todos)
Es el numero que describe solo la muestra
Diferencia entre el parametro poblacional y estadistico, es decir, el resultado de la muestra y el verdadero valor de la poblacion.
El nivel de significancia es la probabilidad de rechazar la hipotesis nula siendo verdadera ; usualmente es de 0.05 o 0.01
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.
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.
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
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)
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
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.
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
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
Mide la concordancia entre pares de datos, util con muestras pequeñas
cor(horas_sueno,rendimiento , method = "kendall")
## [1] 0.9449112
Va de [-1,1]
• +1: correlacion perfectamente positiva
•0: No hay correlacion
• -1: correlacion perfectamente negativa
Una hipotesis en estadistica es una afirmacion o suposicion sobre un parametro de la poblacion, como una media, una proposicion, varianza,etc.
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
Afirmacion que se pone a prueba y generalmente propone ausencia de defecto o diferencia.
Afirmacion que contradice la hipotesis nula; propone que si hay efecto o diferencia.
Probabilidad de obtener resultados tan extremos como los observados, si la hipotesis nula es cierta.
Rango de valores dentro del cual se espera que se encuentre el parametro poblacional con ciertas probabilidades (Por ejemplo 95%)
Pruebas estadisticas que se asumen una distribucion especificas, generalmente normal (ej.t de Student).
Pruebas que no asumen distribucion especifica de los datos(ej.U Mann-Whitney, prueba de Kruskal-Wallis)
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
NHANESEs 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.
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 |
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).
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")
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")
El test de chi-cuadrado (χ²) es una prueba estadística
muy utilizada para analizar relaciones entre variables categóricas.
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.
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).
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.
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.
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.
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.
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.
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.
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.
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).
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).
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.
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.
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.
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.
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.
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.
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