El manejo eficiente y preciso de la información es un pilar fundamental en las disciplinas que dependen de la interpretación rigurosa de datos. En este contexto, RStudio, como entorno de desarrollo integrado para el lenguaje de programación R, se ha convertido en una herramienta indispensable para el procesamiento, análisis y visualización de datos.
RStudio es una herramienta clave para el análisis y visualización de
datos en diversas disciplinas.
En Derecho, facilita el estudio de jurisprudencia y
estadísticas judiciales para identificar patrones y evaluar
reformas.
En Ciencia de Datos, permite limpiar, transformar,
modelar y visualizar información mediante librerías
especializadas.
En Psicología, apoya la validación de hipótesis y el
análisis de datos de experimentos y encuestas.
En Relaciones Internacionales, ayuda a procesar
indicadores globales y modelar escenarios geopolíticos.
Su dominio fortalece las habilidades analíticas y promueve decisiones basadas en evidencia en un mercado laboral orientado a los datos.
Para comenzar a usar R, el primer paso es instalarlo en tu computadora. R es compatible con casi todas las plataformas, incluyendo los sistemas operativos más comunes. Windows, Mac OS X y Linux. Links de descarga para R y RStudio.
RStudio es un entorno de desarrollo integrado (IDE) disponible para R, el cual tiene un buen editor con resaltado de sintaxis, un visor de objetos de R y un gran número de características agradables que están integradas.Ademas, esta dedicado a la computación estadística y gráficos.
El Tidyverse es una colección de paquetes del R que permiten preparar, procesar y graficar bases de datos. Se destacan los siguientes:
ggplot: permite crear visualizaciones elegantes de los datos de una manera relativamente sencilla.
stringr: permite manipular cadenas de caracteres con el fin de realizar sustituciones, detectar duplicados, analizar patrones, etc.
tidyr: tiene como
objetivo obtener datos ordenados. Destacan funciones como
gather para crear factores con base en nombres de columnas
y separate para crear factores separando los caracteres de
una columna.
readr: permite importar
y exportar bases de datos en diferentes formatos y tiene implementada la
función problems que detecta problemas en nuestras
bases.
Para más información visitar la página web:
https://www.tidyverse.org/packages/
library(magrittr)
# Crear los datos
comandos <- c("x == y", "x != y", "x > y", "x < y", "x >= y", "x <= y", "&", "|", "!", "isTRUE(A)")
significado <- c("x es igual a y", "x no es igual a y", "x es mayor que y", "x es menor que y",
"x es mayor o igual que y", "x es menor o igual que y", "y", "o", "No", "Evalúa si A es cierta")
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
library(kableExtra)
##
## Adjuntando el paquete: 'kableExtra'
## The following object is masked from 'package:dplyr':
##
## group_rows
tabla <- data.frame(Comando = comandos, Significado = significado)
tabla %>%
kbl(col.names = c("Comando", "Significado"), booktabs = TRUE) %>%
kable_styling(full_width = TRUE, position = "center", font_size = 24) %>%
row_spec(0, bold = TRUE, background = "#D3D3D3") %>%
kable_paper("striped", full_width = FALSE) %>%
column_spec(1, width = "6cm") %>%
column_spec(2, width = "12cm")
| Comando | Significado |
|---|---|
| x == y | x es igual a y |
| x != y | x no es igual a y |
| x > y | x es mayor que y |
| x < y | x es menor que y |
| x >= y | x es mayor o igual que y |
| x <= y | x es menor o igual que y |
| & | y |
R es un lenguaje orientado a objetos. Los objetos pueden ser usados para guardar valores y pueden madificarse mediante funciones como por ejemplo sumar dos objetos o calcular la media.
X <- 4
Y <- 2
Puedes usar el programa R como una calculadora, basta con conocer cuáles son los signos y comandos a utilizar para realizar las operaciones. Copia los comandos en tu script de R y ejecútalos para ver los resultados.
#suma
Z <- X +Y
Z
## [1] 6
#multiplicación
2*2
## [1] 4
#división
2/2
## [1] 1
#potencia
4^2
## [1] 16
#raíz cuadrada
sqrt(16)
## [1] 4
Lo primero que tenemos que hacer es cargar los paquetes que vamos a utilizar para el análisis. En este caso vamos a usar:
library(tidyverse)# Incluye paquetes de importación, visualización entre otros
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats 1.0.1 ✔ readr 2.2.0
## ✔ ggplot2 4.0.3 ✔ stringr 1.6.0
## ✔ lubridate 1.9.5 ✔ tibble 3.2.1
## ✔ purrr 1.2.2 ✔ tidyr 1.3.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ tidyr::extract() masks magrittr::extract()
## ✖ dplyr::filter() masks stats::filter()
## ✖ kableExtra::group_rows() masks dplyr::group_rows()
## ✖ dplyr::lag() masks stats::lag()
## ✖ purrr::set_names() masks magrittr::set_names()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(dplyr)# Manipulación de Datos
library(ggplot2)# Visualización de datos
library(readxl)# Importación de datos
require(tibble)# Tablas
Recordar que si no ha instalado estos paquetes debe correr primero el
comando:
install.packages("nombre del paquete")
El análisis exploratorio de datos (Ver video) (EDA por sus siglas en inglés) implica el uso de gráficos y visualizaciones para explorar y analizar un conjunto de datos. El objetivo es explorar, investigar y aprender, no confirmar hipótesis estadísticas.
El análisis exploratorio de datos es una potente herramienta para explorar un conjunto de datos. Incluso cuando su objetivo es efectuar análisis planificados, el EDA puede utilizarse para limpiar datos, para análisis de subgrupos o simplemente para comprender mejor los datos. Un paso inicial importante en cualquier análisis de datos es representar los datos gráficamente.
No gráfico: Calcula estadísticas descriptivas de las variables
Gráfico: Calcula estadísticas de forma gráfica
Univariado: Analiza una sola variable a la vez
Multivariado: Analiza dos o más variables
A su vez, cada uno de esas dividisiones puede subdividirse según los tipos de datos con los que trabajemos: categóricos o numéricos.
Revisión de los tipos de datos y conversión si es necesario.
Revisión de valores faltantes.
Resumen estadístico inicial.
Detección de outliers.
tabla <- data.frame(
"Naturaleza de la variable" = c("Cualitativa", "", "Cuantitativa", ""),
"Escala de Medidas" = c("Nominal", "Ordinal", "Intervalo", "Razon"),
"Frecuencias" = c("Si", "Si", "Agrupadas", ""),
"Medidas de Localizacion" = c("Moda", "Moda", "Media, Mediana y Moda", ""),
"Medidas de Dispersion" = c("No", "No", "Si", "Si"),
"Medidas de Distribucion" = c("No", "No", "Si", "Si"),
"Graficos" = c("Sectores, Barras", "Sectores, Barras (sin orden)", "Histograma, Tallo y hojas, Cajas y Bigotes, Dispersion.", "")
)
# Create the table with kableExtra
library(knitr)
## Warning: package 'knitr' was built under R version 4.4.3
library(kableExtra)
tabla %>%
kable("html", align = "c", col.names = c(
"Naturaleza de la variable",
"Escala de Medidas",
"Frecuencias",
"Medidas de Localizacion",
"Medidas de Dispersion",
"Medidas de Distribucion",
"Graficos"
)) %>%
kable_styling(full_width = F, position = "center", bootstrap_options = c("striped", "hover", "condensed", "responsive")) %>%
row_spec(0, bold = TRUE, background = "#D9E2F1", color = "black") %>%
row_spec(1:2, background = "white", color = "black") %>%
row_spec(3:4, background = "#E7E7E7", color = "black")
| Naturaleza de la variable | Escala de Medidas | Frecuencias | Medidas de Localizacion | Medidas de Dispersion | Medidas de Distribucion | Graficos |
|---|---|---|---|---|---|---|
| Cualitativa | Nominal | Si | Moda | No | No | Sectores, Barras |
| Ordinal | Si | Moda | No | No | Sectores, Barras (sin orden) | |
| Cuantitativa | Intervalo | Agrupadas | Media, Mediana y Moda | Si | Si | Histograma, Tallo y hojas, Cajas y Bigotes, Dispersion. |
| Razon | Si | Si |
tabla <- data.frame(
"Tipo de Tabla" = c(
"De Frecuencia (Variable Cualitativa)",
"De Frecuencia (Variable Cuantitativa)",
"De Asociacion (Dos Variables Cualitativas)",
"De Asociacion (Una Variable Cualitativa y una Cuantitativa Discreta)",
"De Asociacion (Una Variable Cualitativa y una Cuantitativa Continua)",
"De Asociacion (Dos Variables Cuantitativas)"
),
"Tipo de Grafico" = c(
"- Barras simples\n- Pastel",
"- Histograma",
"- Barras compuestas\n- Barras superpuestas",
"- Barras:\n * Compuestas\n * Superpuestas",
"- Poligono de Frecuencia\n- Box plot (diagrama de cajas y bigotes)",
"- Diagrama de Puntos"
),
stringsAsFactors = FALSE
)
# Creating the table using kableExtra
tabla %>%
kable("html", escape = FALSE, align = "l", col.names = c("Tipo de Tabla", "Tipo de Grafico")) %>%
kable_styling(full_width = F, position = "center", bootstrap_options = c("striped", "hover", "condensed", "responsive")) %>%
row_spec(0, bold = TRUE, background = "#D9E2F1", color = "black") %>%
row_spec(c(3, 4), background = "#F2F2F2", color = "black") %>%
row_spec(c(2, 5), background = "white", color = "black") %>%
row_spec(c(1, 6), background = "#E7E7E7", color = "black") %>%
column_spec(1, width = "4cm") %>%
column_spec(2, width = "6cm")
| Tipo de Tabla | Tipo de Grafico |
|---|---|
| De Frecuencia (Variable Cualitativa) |
|
| De Frecuencia (Variable Cuantitativa) |
|
| De Asociacion (Dos Variables Cualitativas) |
|
| De Asociacion (Una Variable Cualitativa y una Cuantitativa Discreta) |
|
| De Asociacion (Una Variable Cualitativa y una Cuantitativa Continua) |
|
| De Asociacion (Dos Variables Cuantitativas) |
|
Exploración de la Intersección entre la Psicología y la Ciencia de Datos: Comportamiento Humano en Entornos Digitales
En un centro de investigación psicológica enfocado en el comportamiento humano en entornos digitales como redes sociales y plataformas de juegos en línea. Recopilamos datos que incluyen variables demográficas, patrones de uso de redes sociales, datos de juegos en línea y mediciones psicológicas. Utilizamos herramientas de ciencia de datos y análisis estadístico para identificar patrones significativos que ayuden a comprender cómo diferentes factores influyen en el comportamiento en línea y el bienestar psicológico. Este enfoque integrado entre la psicología y la ciencia de datos nos permite desarrollar intervenciones efectivas para mejorar la calidad de vida en línea y promover la salud mental de los usuarios.
A continuación se construirá la primera base de datos a partir de las variables. Para esto, como se observa en los siguientes comandos, se parte por la construcción de 11 variables de 20 casos cada una:
#Creación de las variables: todas tienen la misma cantidad de casos.
Paciente <- c("Mario", "Luis", "Pedro", "Maria", "Sandra", "Erika", "Laura","Luz","Olga")
Edad <- c(18, 20, 20, 17, 19, 22, 22, 22,31)
Sexo <- c("Masculino", "Femenino", "Masculino", "Femenino", "Masculino", "Femenino", "Masculino", "Femenino","Femenino")
Educacion <- c("Universidad", "Secundaria", "Universidad", "Posgrado", "Universidad", "Universidad", "Universidad", "Posgrado","Posgrado")
Ocupacion <- c("Estudiante", "Profesional", "Estudiante", "Profesional", "Estudiante", "Profesional", "Estudiante", "Profesional","Posgrado")
Red_Social_Principal <- c("Instagram", "Facebook", "Instagram", "Twitter", "TikTok", "Instagram", "Facebook", "Instagram","TikTok")
Tiempo_en_Redes_Sociales <- c(2.5, 3.0, 2.0, 2.5, 3.5, 2.2, 2.8, 3.0,2.0)
Horas_Semanales_de_Juego <- c(15, 20, 12, 10, 18, 15, 20, 15,41)
Autoestima <- c(8.2, 6.9, 7.8, 7.0, 8.5, 7.3, 8.0, 7.6,9)
Ansiedad_Social <- c(42, 50, 38, 45, 35, 48, 40, 42,45)
Satisfaccion_con_la_Vida <- c(7.5, 6.9, 8.0, 7.2, 7.8, 6.5, 7.0, 7.3,8)
Estres<- c(2,2,1,3,4,2,1,4,4)
A partir de las variables ya creadas se puede construir una base de datos.
df=data.frame(Paciente, Edad,Sexo,Edad,Educacion, Ocupacion, Red_Social_Principal,Horas_Semanales_de_Juego,Ansiedad_Social,Satisfaccion_con_la_Vida,Estres)
df
La representación de datos se refiere al proceso de presentar la información de manera visual o tabular para facilitar su comprensión, análisis y comunicación. Esta representación puede tomar diversas formas, incluyendo gráficos, tablas, diagramas, mapas y resúmenes estadísticos. El objetivo principal de la representación de datos es convertir datos crudos en información comprensible y significativa.
Aquí hay una descripción de algunas formas comunes de representación de datos:
Gráficos: Los gráficos son representaciones visuales de datos que utilizan diferentes tipos de elementos visuales, como líneas, barras, puntos y áreas, para mostrar la relación entre variables o la distribución de datos. Algunos tipos comunes de gráficos incluyen gráficos de barras, gráficos de líneas, gráficos circulares, histogramas y diagramas de dispersión.
Tablas: Las tablas son representaciones tabulares de datos que organizan la información en filas y columnas. Las tablas son útiles para mostrar datos detallados o para comparar valores entre diferentes categorías o grupos. Pueden incluir valores numéricos, texto descriptivo y otras características.
Para visualizar los datos en formato dataframe puede usar el comando View() o también head() para visualizar las primeras filas en consola.
head(df)
ggplot2 es un sistema para crear gráficos de forma declarativa, basado en la Gramática de los Gráficos. Se deben proporcionar los datos, indicar a ggplot2 cómo asignar las variables a la estética y qué tipo de gráficas utilizar. La función geom_bar() se utiliza para producir gráficos de área 1d: gráficos de barras para x categóricas, e histogramas para y continuas
library(ggplot2)
ggplot(data=df, aes(x=Paciente, y=Edad)) + geom_bar(stat="identity")+labs(title = "Distribución de Edad por Paciente")
El diagrama puede ser dibujado en forma horizontal usando la función coord_flip()
ggplot(data=df, aes(x=Paciente, y=Edad)) + geom_bar(stat="identity")+labs(title = "Distribución de Edad por Paciente")+ coord_flip()
Podemos cambiar el ancho, así como también el color de las barras y bordes. Nótese que se puede hacer una copia de la gráfica en una variable, en este ejemplo en p para que luego pueda ser usada para presentar el grafico o realizar más transformaciones
ggplot(data=df, aes(x=Paciente, y=Edad)) + geom_bar(stat="identity",width=0.5)+labs(title = "Distribución de Edad por Paciente")
ggplot(data=df, aes(x=Paciente, y=Edad)) + geom_bar(stat="identity",width=0.5,color="blue", fill="green3")+labs(title = "Distribución de Edad por Paciente")
ggplot(data=df, aes(x=Paciente, y=Edad)) + geom_bar(stat="identity",width=0.8, fill="steelblue")+labs(title = "Distribución de Edad por Paciente")
#creando tabla de resumen
Tabla_1 <- df %>%
dplyr::group_by(Red_Social_Principal) %>%
dplyr::summarise(Total = n()) %>%
dplyr::mutate(Porcentaje = round(Total/sum(Total)*100, 1)) %>%
dplyr::arrange(Red_Social_Principal)
Tabla_1
"Grafico"
## [1] "Grafico"
G1<-ggplot(Tabla_1, aes(x =Red_Social_Principal, y=Total) ) +
geom_bar(width = 0.7,stat="identity",
position = position_dodge(), fill="cyan4") +
ylim(c(0,5))+
#xlim(c(0,300)) +
#ggtitle("Un título") +
labs(x="Red Social", y= "Frecuencias \n (Porcentajes)") +
geom_text(aes(label=paste0(Total," ", "", "(", Porcentaje, "%", ")")),
vjust=-0.9,
color="black",
hjust=0.5,
# define text position and size
position = position_dodge(0.9),
angle=0,
size=4.5) +
theme(axis.text.x = element_text(angle = 0, vjust = 1, hjust=1)) +
theme_bw(base_size = 16) +
#coord_flip() +
facet_wrap(~"Distribución de Tipo de Red Social")
G1
Un gráfico de barras agrupado muestra un valor numérico para un conjunto de entidades divididas en grupos y subgrupos.
El conjunto de datos para el presente ejemplo proporciona 3 columnas: el valor numérico (value), y 2 variables categóricas. En el llamada aes(), x es (categ), y el subgrupo (categ) se da al argumento fill. En la función geom_bar(), debe especificarse position=“dodge” para que las barras estén una al lado de la otra.
head(df)
ggplot(df, aes(fill = Sexo, y = Edad, x = Red_Social_Principal, label = Edad)) +
geom_bar(position = "dodge", stat = "identity") +
labs(title = "Distribución de la Red Social según la Edad y Sexo",
x = "Red Social Principal",
y = "Edad",
fill = "Sexo")
ggplot(df, aes(fill = Sexo, x = Red_Social_Principal)) +
geom_bar(position = "stack") +
geom_text(stat = 'count', aes(label = ..count..), position = position_stack(vjust = 0.5), size = 3, color = "black") +
labs(title = "Distribución de la Red Social según el Sexo",
x = "Red Social Principal",
y = "Frecuencia") +
scale_fill_manual(values = c("blue2", "pink2"), name = "Sexo", labels = c("Hombre", "Mujer")) +
theme(legend.position = "right") # Ubicación de la leyenda
## Warning: The dot-dot notation (`..count..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(count)` instead.
## This warning is displayed once per session.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
Los histogramas son útiles para representar la distribución de variables continuas como Edad, Tiempo en Redes Sociales y Horas Semanales de Juego. Cada barra del histograma muestra la frecuencia de los datos..
ggplot(data = df, aes(x = Edad)) +
geom_histogram(binwidth = 1, fill = "skyblue", color = "black", alpha = 0.8) +
labs(title = "Histograma de Edades",
x = "Edad",
y = "Frecuencia")
ggplot2 no ofrece ningún geom específica para construir diagramas circulares (piecharts). El truco es el siguiente: El marco de datos de entrada tiene 2 columnas: los nombres de los grupos (group here) y su valor (value here), se construye un gráfico de barras apilado con una sola barra utilizando la función geom_bar(), luego se hace circular con coord_polar()
library(magrittr)
library(dplyr)
#Tabla resumen
Tabla_2 <- df %>%
group_by(Sexo) %>% # Variable a ser transformada
count() %>%
ungroup() %>%
mutate(Porcentaje = `n` / sum(`n`)) %>%
arrange(Porcentaje) %>%
mutate(etiquetas = scales::percent(Porcentaje))
#Grafico #2
require(scales)
## Cargando paquete requerido: scales
##
## Adjuntando el paquete: 'scales'
## The following object is masked from 'package:purrr':
##
## discard
## The following object is masked from 'package:readr':
##
## col_factor
ggplot(Tabla_2, aes(x = "", y = Porcentaje, fill = Sexo)) +
geom_col(color = "black") +
geom_label(aes(label = etiquetas),
position = position_stack(vjust = 0.5),
show.legend = FALSE) +
guides(fill = guide_legend(title = "Distribución de Pacientes según el Sexo")) + scale_color_gradient() +
coord_polar(theta = "y") + ggtitle ("")
#theme_void()
La libreria questionr de R contiene la función freq la cual genera y formatea tablas de frecuencia simples a partir de una variable o una tabla, con porcentajes y opciones de formato. El resultado es un objeto de la clase data.frame.
library(questionr)
Tabla_Sexo <- questionr::freq(Sexo, cum = TRUE, sort = "dec", total = TRUE)
knitr::kable(Tabla_Sexo)
| n | % | val% | %cum | val%cum | |
|---|---|---|---|---|---|
| Femenino | 5 | 55.6 | 55.6 | 55.6 | 55.6 |
| Masculino | 4 | 44.4 | 44.4 | 100.0 | 100.0 |
| Total | 9 | 100.0 | 100.0 | 100.0 | 100.0 |
La tabla puede ordenarse opcionalmente en frecuencia descendente, y funciona bien con kable. Si deseamos ver la estructura de la tabla generada por freq() utilizamos la función str()
str(Tabla_Sexo)
## Classes 'freqtab' and 'data.frame': 3 obs. of 5 variables:
## $ n : num 5 4 9
## $ % : num 55.6 44.4 100
## $ val% : num 55.6 44.4 100
## $ %cum : num 55.6 100 100
## $ val%cum: num 55.6 100 100
Para realizar una tabla de frecuencias agrupada utilizaremos en este ejemplo la Regla de Sturges, en la que el número de clases es obtenido por medio de: \(c=1+ln(N)/ln(2)\) donde \(N\) representa el número total de datos. Consideremos el Ejemplo 23 de los apuntes, en el que se representan las edades de un conjunto de estudiantes.
Ejemplo: Se tienen las siguientes edades de algunos estudiantes
edades <- c(22, 19, 16, 13, 18, 15, 20, 14, 15, 16,
15, 16, 20, 13, 15, 18, 15, 13, 18, 15)
knitr::kable(head(edades))
| x |
|---|
| 22 |
| 19 |
| 16 |
| 13 |
| 18 |
| 15 |
Encontremos el número de clases usando la regla de Sturges
n_sturges = 1 + log(length(edades))/log(2)
n_sturgesc = ceiling(n_sturges)
n_sturgesf = floor(n_sturges)
n_clases = 0
if (n_sturgesc%%2 == 0) {
n_clases = n_sturgesf
} else {
n_clases = n_sturgesc
}
R = max(edades) - min(edades)
w = ceiling(R/n_clases)
Calculemos ahora nuestra tabla de frecuencias con número de clases n_clases. Primero creamos una lista de fronteras de clases bins y luego agrupamos los datos basados en estas
bins <- seq(min(edades), max(edades) + w, by = w)
bins
## [1] 13 15 17 19 21 23
Edades <- cut(edades, bins)
Freq_table <- transform(table(Edades), Rel_Freq=prop.table(Freq), Cum_Freq=cumsum(Freq))
knitr::kable(Freq_table)
| Edades | Freq | Rel_Freq | Cum_Freq |
|---|---|---|---|
| (13,15] | 7 | 0.4117647 | 7 |
| (15,17] | 3 | 0.1764706 | 10 |
| (17,19] | 4 | 0.2352941 | 14 |
| (19,21] | 2 | 0.1176471 | 16 |
| (21,23] | 1 | 0.0588235 | 17 |
str(Freq_table)
## 'data.frame': 5 obs. of 4 variables:
## $ Edades : Factor w/ 5 levels "(13,15]","(15,17]",..: 1 2 3 4 5
## $ Freq : int 7 3 4 2 1
## $ Rel_Freq: num 0.4118 0.1765 0.2353 0.1176 0.0588
## $ Cum_Freq: int 7 10 14 16 17
Podemos también crear un histograma para la tabla de frecuencias agrupada
df2 <- data.frame(x = Freq_table$Edades, y = Freq_table$Freq)
knitr::kable(df2)
| x | y |
|---|---|
| (13,15] | 7 |
| (15,17] | 3 |
| (17,19] | 4 |
| (19,21] | 2 |
| (21,23] | 1 |
ggplot(data=df2, aes(x=x, y=y)) +
geom_bar(stat="identity", color="blue", fill="green") +
xlab("Rango de Edades") +
ylab("Frecuencia")
Una función multiuso muy útil en R es summary(X), donde X puede ser uno de cualquier número de objetos, incluyendo conjuntos de datos, variables y modelos lineales, por nombrar algunos. Cuando se utiliza, el comando proporciona datos de resumen relacionados con el objeto individual que se introdujo en él. Así, la función de resumen tiene diferentes resultados dependiendo del tipo de objeto que tome como argumento. Además de ser ampliamente aplicable, este método es valioso porque a menudo proporciona exactamente lo que se necesita en términos de estadísticas de resumen.
Usando la función summary() podemos obtener estadísticos de interes y valores de posición:
summary(df$Horas_Semanales_de_Juego)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 10.00 15.00 15.00 18.44 20.00 41.00
Del anterior resultado se puede observar que la hora mínima en el juego fue de 10, el 25% se ubicó en 15 horas indicando que dedicaron 15 o menor o igual a 15, al igual que el 50%, en promedio dedicaron 18,4 horas de juego, el 75% dedicó menos o igual que 20 horas y la hora que más dedicaron fue de 41.
Por otro lado, se puede notar la función summary() no nos entrega todos los estadísticos de interés, para solucionar esto podemos hacer uso de la librería, pastecs y la función stat.desc(), como se muestra a continuación.
library(pastecs)
##
## Adjuntando el paquete: 'pastecs'
## The following object is masked from 'package:tidyr':
##
## extract
## The following objects are masked from 'package:dplyr':
##
## first, last
## The following object is masked from 'package:magrittr':
##
## extract
stat.desc(df)
Los gráficos de caja (box plots), también conocidos como diagramas de cajas y bigotes, son una representación gráfica que permite resumir las características principales de los datos (posición, dispersión, asimetría, …) e identificar la presencia de valores atípicos. En esta sección revisaremos cómo hacer box plots en R base y en ggplot2.
Utilizando boxplot() R base
boxplot(df$Edad, horizontal=TRUE, col='steelblue')
Usando geom_boxplot() de la librería ggplot2
library(tidyverse)
library(hrbrthemes)
library(viridis)
## Cargando paquete requerido: viridisLite
##
## Adjuntando el paquete: 'viridis'
## The following object is masked from 'package:scales':
##
## viridis_pal
df %>%
ggplot(aes(x = "", y = Edad)) +
geom_boxplot(color = "black", fill = "yellow2", alpha = 0.5) +
theme_ipsum() +
theme(legend.position = "none", plot.title = element_text(size = 11)) +
ggtitle("Distribución de las Edades") +
coord_flip()
ggplot(df, aes(x = Sexo, y = Edad, fill = Sexo)) +
geom_boxplot() +
labs(title = "Diagrama de Edades según el Sexo",
x = "Sexo", y = "Edades") +
scale_fill_manual(values = c("lightblue", "pink")) +
theme_minimal()
El coeficiente de variación (CV) es una medida estadística que se utiliza para evaluar la variabilidad relativa de una muestra o población en relación con su media. Se calcula como la desviación estándar de los datos dividida por la media, y se expresa como un porcentaje multiplicado por 100 para facilitar su interpretación.
El CV es útil cuando se comparan distribuciones de datos con diferentes escalas o unidades, ya que normaliza la variabilidad en relación con la magnitud de los datos. Esto permite realizar comparaciones más significativas entre diferentes conjuntos de datos.
\[CV = \left( \frac{\text{Desviación Estándar}}{\text{Media}} \right) \times 100\]
Ahora vamos a hallar el coeficiente de variación de la variable Edad.
media <- mean(df$Edad)
desviacion <- sd(df$Edad)
coef_variacion <- (desviacion / media) * 100
cat("El coeficiente de variación es:", coef_variacion, "%\n")
## El coeficiente de variación es: 19.25285 %
El coeficiente de asimetría de Pearson es que es una medida estandarizada de la asimetría de una distribución de datos. Se calcula como el tercer momento estandarizado de la distribución, es decir, la diferencia promedio al cubo entre los datos y la media, dividida por la desviación estándar al cubo. Si el coeficiente de asimetría de Pearson es cero, la distribución es simétrica. Si es positivo, la cola de la distribución está en el lado derecho, y si es negativo, la cola está en el lado izquierdo. Esto proporciona información sobre la forma y dirección de la asimetría en la distribución de datos.
\[\text{Coeficiente de Asimetría de Pearson} = \frac{E[(X - \mu)^3]}{\sigma^3}\]
Como el coefiente de asmetría de Pearson es mayo que cero, indica que la edad presenta distribución asimetrica hacia la derecha.
La curtosis es una medida estadística que describe la forma de la distribución de los datos en relación con una distribución normal estándar. La curtosis es una medida de la “picudez” de la distribución, es decir, cuán puntiaguda o aplanada es en comparación con una distribución normal.
\[\text{Curtosis} = \frac{1}{n} \sum_{i=1}^{n} \left(\frac{x_i - \bar{x}}{s}\right)^4 - 3\]
Platicúrtica: Una distribución platicúrtica es aquella que tiene un exceso de curtosis negativo en comparación con la distribución normal estándar (cuyo exceso de curtosis es 0). Esto significa que la distribución tiene colas más ligeras y es más aplanada en comparación con la distribución normal. En una distribución platicúrtica, los valores se concentran más cerca de la media y hay menos valores extremos en comparación con una distribución normal.
Mesocúrtica: Una distribución mesocúrtica es aquella que tiene un exceso de curtosis igual a 0, es decir, su forma es similar a la de una distribución normal estándar. Esto significa que la distribución tiene una cantidad “normal” de picos y colas, y su forma se asemeja a una campana simétrica.
Leptocúrtica: Una distribución leptocúrtica es aquella que tiene un exceso de curtosis positivo en comparación con la distribución normal estándar. Esto significa que la distribución tiene colas más pesadas y es más puntiaguda en comparación con la distribución normal. En una distribución leptocúrtica, los valores tienden a agruparse más cerca de la media y hay más valores extremos en comparación con una distribución normal.
curtosis <- kurtosis(df$Edad)
cat("La curtosis de la muestra es:", curtosis, "\n")
## La curtosis de la muestra es: 0.8255815
Consideremos nuevamente la base de datos que contiene información acerca de incautaciones de bebidas alcohólicas fraudulentas y de contrabando en cierta ciudad. Puede acceder a la base de datos en el siguiente enlace: BASE_DATOS.xlsx.
url_base_Datos <-"https://raw.github.com/Kalbam/Datos/blob/main/BASE_DATOS.xlsx"
Las variables se describen como:
require(readxl)
direccion="BASE_DATOS.xlsx"
DATOS<-read_excel(direccion,sheet="datos")
NOTA: La función read_excel importa un objeto tibble, que es en esencia un data.frame, pero que cuenta con algunas ventajas estéticas en las presentaciones e informes.
Verifiquemos que leímos bien los datos viendo el encabezado y la cola de los datos:
head(DATOS)
tail(DATOS)
Las dimensiones, los nombres de las columnas y la estructura de la base de datos se obtienen con los códigos:
dim(DATOS) # dimensiones de los datos
## [1] 300 5
colnames(DATOS) # Nombres de las columnas o variables
## [1] "TL" "PI" "GAE" "GAQ" "CE"
str(DATOS)
## tibble [300 × 5] (S3: tbl_df/tbl/data.frame)
## $ TL : chr [1:300] "Aguardiente" "Aguardiente" "Aguardiente" "Aguardiente" ...
## $ PI : num [1:300] 21470 26422 19737 30240 28374 ...
## $ GAE: num [1:300] 29 29 29 29 38 38 29 38 38 38 ...
## $ GAQ: num [1:300] 25.1 29 25.3 29 33.5 ...
## $ CE : num [1:300] 251 262 289 266 232 ...
Otra función que funciona igual a str es
glimpse, que hace parte del paquete
tibble:
require(tibble)
glimpse(DATOS)
## Rows: 300
## Columns: 5
## $ TL <chr> "Aguardiente", "Aguardiente", "Aguardiente", "Aguardiente", "Tequi…
## $ PI <dbl> 21470, 26422, 19737, 30240, 28374, 33601, 33207, 33029, 30964, 309…
## $ GAE <dbl> 29, 29, 29, 29, 38, 38, 29, 38, 38, 38, 29, 29, 29, 35, 29, 38, 29…
## $ GAQ <dbl> 25.143, 29.000, 25.288, 29.000, 33.516, 31.198, 29.000, 33.060, NA…
## $ CE <dbl> 250.6536, 261.7272, 289.1134, 266.3064, 231.7978, 248.8542, 252.57…
summary(DATOS)
## TL PI GAE GAQ
## Length:300 Min. : 16308 Min. :29.00 Min. :24.27
## Class :character 1st Qu.: 26682 1st Qu.:29.00 1st Qu.:26.04
## Mode :character Median : 29390 Median :35.00 Median :30.07
## Mean : 31846 Mean :33.54 Mean :30.74
## 3rd Qu.: 32751 3rd Qu.:38.00 3rd Qu.:34.10
## Max. :430091 Max. :40.00 Max. :40.00
## NA's :5 NA's :2
## CE
## Min. : 0.0
## 1st Qu.:239.4
## Median :250.3
## Mean :249.6
## 3rd Qu.:261.7
## Max. :296.5
## NA's :3
summary(DATOS$PI)
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 16308 26682 29390 31846 32751 430091 5
summary(DATOS$GAE)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 29.00 29.00 35.00 33.54 38.00 40.00
summary(DATOS$GAQ)
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 24.27 26.04 30.07 30.74 34.10 40.00 2
Para hacer una tabla de frecuencias de las variables categóricas es necesario transformar primero la variable en factor:
# Se transforma primero en factor
TL_FACTOR<- as.factor(DATOS$TL)
# Se obtiene el resumen
summary(TL_FACTOR)
## Aguardiente Aguardientre Ron Run Tequila Whiski
## 131 1 60 1 85 1
## Whisky NA's
## 20 1
Otra forma de obtener una tabla de frecuencias para las variables
categóricas consiste en utilizar la función table del
paquete base, que se carga automáticamente cuando abrimos
una sesión del R o del R-Studio:
table(DATOS$TL)
##
## Aguardiente Aguardientre Ron Run Tequila Whiski
## 131 1 60 1 85 1
## Whisky
## 20
Para extraer los nombres de las categorías de una variable categórica
usamos la función labels del paquete base:
unique(DATOS$TL)
## [1] "Aguardiente" "Tequila" "Ron" "Whisky" "Run"
## [6] NA "Whiski" "Aguardientre"
Reemplazar los nombres de las categorías mal codificadas, utilizamos
la función str_replace del paquete stringr y
lo guardamos ya corregido directamente en la variable TL de DATOS:
require(stringr)
DATOS$TL <- str_replace(DATOS$TL, "Aguardientre", "Aguardiente")
unique(DATOS$TL)
## [1] "Aguardiente" "Tequila" "Ron" "Whisky" "Run"
## [6] NA "Whiski"
Reemplazar los nombres de las categorías mal codificadas, utilizamos
la función str_replace del paquete stringr y
lo guardamos ya corregido directamente en la variable TL de DATOS:
require(stringr)
reemplazos <- c("Run" = "Ron", "Whiski" = "Whisky")
DATOS$TL <- str_replace_all(DATOS$TL, reemplazos)
unique(DATOS$TL)
## [1] "Aguardiente" "Tequila" "Ron" "Whisky" NA
is.na(DATOS[1:10,]) # Identifica cuáles valores son NA
## TL PI GAE GAQ CE
## [1,] FALSE FALSE FALSE FALSE FALSE
## [2,] FALSE FALSE FALSE FALSE FALSE
## [3,] FALSE FALSE FALSE FALSE FALSE
## [4,] FALSE FALSE FALSE FALSE FALSE
## [5,] FALSE FALSE FALSE FALSE FALSE
## [6,] FALSE FALSE FALSE FALSE FALSE
## [7,] FALSE FALSE FALSE FALSE FALSE
## [8,] FALSE FALSE FALSE FALSE FALSE
## [9,] FALSE FALSE FALSE TRUE FALSE
## [10,] FALSE FALSE FALSE FALSE FALSE
is.na(DATOS$TL) # Identifica cuáles valores son NA en TL
## [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [13] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [25] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [37] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [49] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [61] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [73] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [85] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [97] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [109] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE
## [121] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [133] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [145] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [157] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [169] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [181] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [193] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [205] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [217] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [229] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [241] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [253] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [265] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [277] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [289] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
NAS_TL<-is.na(DATOS$TL) #GuardamosenNAS_TL
DATOS[NAS_TL,] #FiltramosporlosNASdeTL
NAS_PI<-is.na(DATOS$PI) # Guardamos en NAS_PI
DATOS[NAS_TL | NAS_PI,] # Filtramos por los NAS de TL y PI
La función complete.cases del paquete stats
nos muestra cuáles filas tienen datos en TODAS sus
columnas:
complete.cases(DATOS)
## [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE TRUE TRUE TRUE
## [13] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [25] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [37] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [49] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [61] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [73] FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [85] TRUE TRUE TRUE TRUE TRUE TRUE FALSE TRUE TRUE TRUE TRUE TRUE
## [97] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE
## [109] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE TRUE TRUE TRUE
## [121] TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE TRUE TRUE TRUE TRUE
## [133] TRUE TRUE TRUE TRUE TRUE TRUE FALSE TRUE TRUE TRUE TRUE TRUE
## [145] TRUE TRUE TRUE TRUE TRUE FALSE TRUE TRUE TRUE TRUE TRUE TRUE
## [157] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [169] TRUE TRUE TRUE TRUE TRUE TRUE FALSE TRUE TRUE TRUE TRUE TRUE
## [181] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [193] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [205] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [217] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [229] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [241] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [253] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [265] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [277] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [289] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
Cuando negamos estos casos completos obtenemos las filas donde hay al menos un valor faltante, es decir,
!complete.cases(DATOS)
## [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE
## [13] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [25] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [37] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [49] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [61] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [73] TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [85] FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE
## [97] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE
## [109] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE
## [121] FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE
## [133] FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE
## [145] FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE
## [157] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [169] FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE
## [181] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [193] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [205] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [217] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [229] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [241] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [253] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [265] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [277] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [289] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
Guardamos los valores anteriores en un vector para luego filtrar por
las filas donde hay al menos un valor NA:
NAS_ALL <- !complete.cases(DATOS)
DATOS[NAS_ALL, ] # Filas donde hay al menos un valor NA
suppressWarnings(require(Amelia))
## Cargando paquete requerido: Amelia
## Cargando paquete requerido: Rcpp
## ##
## ## Amelia II: Multiple Imputation
## ## (Version 1.8.3, built: 2024-11-07)
## ## Copyright (C) 2005-2026 James Honaker, Gary King and Matthew Blackwell
## ## Refer to http://gking.harvard.edu/amelia/ for more information
## ##
suppressWarnings(missmap(DATOS))
summary(DATOS)# Analicemos las mediadas de tendencia
## TL PI GAE GAQ
## Length:300 Min. : 16308 Min. :29.00 Min. :24.27
## Class :character 1st Qu.: 26682 1st Qu.:29.00 1st Qu.:26.04
## Mode :character Median : 29390 Median :35.00 Median :30.07
## Mean : 31846 Mean :33.54 Mean :30.74
## 3rd Qu.: 32751 3rd Qu.:38.00 3rd Qu.:34.10
## Max. :430091 Max. :40.00 Max. :40.00
## NA's :5 NA's :2
## CE
## Min. : 0.0
## 1st Qu.:239.4
## Median :250.3
## Mean :249.6
## 3rd Qu.:261.7
## Max. :296.5
## NA's :3
par(mfrow=c(1,4))
boxplot(DATOS$PI,main="PI")
boxplot(DATOS$GAE,main="GAE")
boxplot(DATOS$GAQ,main="GAQ")
boxplot(DATOS$CE,main="CE")
De los gráficos anteriores podemos ver que:
Filtramos los datos sin los valores atípicos de la variable
PI y de la variable CE, filtrando con
la función filter del paquete dplyr con el
siguiente código:
require(dplyr)
filter(DATOS, PI > 100000)
filter(DATOS, CE < 200)
Reemplazamos los valores atípicos por valores NA (lo
cual es equivalente a eliminarlos):
DATOS$PI[DATOS$PI > 100000] <- NA
DATOS$CE[DATOS$CE < 200] <- NA
Repetimos los gráficos boxplot:
par(mfrow=c(1,4))
boxplot(DATOS$PI,main="PI")
boxplot(DATOS$GAE,main="GAE")
boxplot(DATOS$GAQ,main="GAQ")
boxplot(DATOS$CE,main="CE")
Si se supone que estas variables tienen Distribución normal, se modifican por la Media, de lo contrario seria por la Mediana, como técnica básica de Imputación de datos.
Calculamos la media de las columnas numéricas con la función
colMeans del paquete base. Para esto primero
excluimos la variable categórica TL que se encuentra en
la columna 1:
medias <- colMeans(DATOS[,-1], na.rm = TRUE)
medias
## PI GAE GAQ CE
## 29518.52560 33.54000 30.74141 250.49003
El argumento na.rm=TRUE permite
calcular las medias de los datos que no son NA.
Para esto usamos la función replace_na del paquete
tidyr:
require(tidyr) # Cargamos el paquete
# Creamos una lista con los reemplazos:
reemplazos <- list(PI = medias[1], GAE = medias[2], GAQ = medias[3], CE = medias[4])
# Reemplazamos y guardamos en DATOS:
DATOS <- replace_na(DATOS, reemplazos)
summary(DATOS)
## TL PI GAE GAQ
## Length:300 Min. :16308 Min. :29.00 Min. :24.27
## Class :character 1st Qu.:26710 1st Qu.:29.00 1st Qu.:26.04
## Mode :character Median :29519 Median :35.00 Median :30.22
## Mean :29519 Mean :33.54 Mean :30.74
## 3rd Qu.:32459 3rd Qu.:38.00 3rd Qu.:34.07
## Max. :42022 Max. :40.00 Max. :40.00
## CE
## Min. :210.9
## 1st Qu.:239.7
## Median :250.5
## Mean :250.5
## 3rd Qu.:261.5
## Max. :296.5
unique(DATOS$TL)
## [1] "Aguardiente" "Tequila" "Ron" "Whisky" NA
FACTOR_TL<-as.factor(DATOS$TL) #Convertimos en factorTL
FRECUENCIAS_TL<-summary(FACTOR_TL) #Tabla de frecuencias
barplot(FRECUENCIAS_TL) #Graficamos las frecuencias
Si decidimos reemplazar por el valor más frecuente, lo cual NO es recomendable, lo hacemos con el código:
reemplazos <- list(TL = "Aguardiente")
DATOS <- replace_na(DATOS, reemplazos)
# Verificamos el cambio:
unique(DATOS$TL)
## [1] "Aguardiente" "Tequila" "Ron" "Whisky"
FACTOR_TL<-as.factor(DATOS$TL) #Convertimos enfactor TL
FRECUENCIAS_TL<-summary(FACTOR_TL) #Tabla de frecuencias
barplot(FRECUENCIAS_TL) #Graficamos las frecuencias
suppressWarnings(missmap(DATOS))
Una vez realizado el procesamiento y limpieza de los datos, el siguiente paso consiste en efectuar el análisis exploratorio de datos. Para ello, continúe el ejercicio representando gráficamente las variables de mayor interés.
Para aplicar las técnicas de estadística inferencial, es necesario realizar previamente un análisis exploratorio de los datos. Tomaremos este contexto como base para la aplicación de dichas técnicas.
El estudio de las relaciones internacionales no solo se basa en la política y la economía global, sino también en cómo los individuos perciben e interactúan con el mundo. Factores psicológicos como el nivel de estrés, la resiliencia y la percepción de equidad global pueden influir en la manera en que una persona interpreta los conflictos internacionales, participa en el activismo político o confía en instituciones internacionales.
La base de datos utilizada para este análisis, titulada “Base de Datos Psicología y Relaciones Internacionales”, se encuentra disponible en el siguiente repositorio: GitHub - Kalbam/Datos.
Antes de aplicar las técnicas de estadística Inferecial se debe realizar un:
En primer lugar analizamos las dimensiones de la base de datos:
#Necesitas instalar los sigueintes paquetes
#if (!require("readxl")) install.packages("readxl", dependencies=TRUE)
#if (!require("ggplot2")) install.packages("ggplot2", dependencies=TRUE)
#if (!require("dplyr")) install.packages("dplyr", dependencies=TRUE)
#if (!require("corrplot")) install.packages("corrplot", dependencies=TRUE)
#if (!require("ggpubr")) install.packages("ggpubr", dependencies=TRUE)
library(readxl)
library(ggplot2)
library(dplyr)
library(corrplot)
## Warning: package 'corrplot' was built under R version 4.4.2
## corrplot 0.95 loaded
library(ggpubr)
data <- read_excel("Base_Datos_Psicologia_RI.xlsx", sheet = "Sheet1")
dim(data)
## [1] 100 14
Luego de visualizar la base de datos, se observa que consta de 100 observaciones con 14 variables. Además, se revela que la base de datos no cuenta con valores NA. A continuacion un resumen de las variables númericas
library(Amelia)
# Convertir a data frame clásico
data_df <- as.data.frame(data)
# Visualizar los NA
missmap(data_df)
summary(data)
## ID Edad Género Nivel de depresión
## Min. : 1.00 Min. :19.00 Length:100 Min. : 1.00
## 1st Qu.: 25.75 1st Qu.:30.00 Class :character 1st Qu.: 3.00
## Median : 50.50 Median :44.50 Mode :character Median : 5.50
## Mean : 50.50 Mean :42.31 Mean : 5.38
## 3rd Qu.: 75.25 3rd Qu.:54.25 3rd Qu.: 8.00
## Max. :100.00 Max. :63.00 Max. :10.00
## Nivel de resiliencia Índice de felicidad global (0-100)
## Min. : 1.0 Min. : 0.00
## 1st Qu.: 3.0 1st Qu.:29.75
## Median : 5.0 Median :61.50
## Mean : 5.5 Mean :53.48
## 3rd Qu.: 8.0 3rd Qu.:77.50
## Max. :10.0 Max. :98.00
## Horas de interacción con extranjeros por semana
## Min. : 0.00
## 1st Qu.: 5.75
## Median :11.00
## Mean :10.41
## 3rd Qu.:15.00
## Max. :20.00
## Conocimiento en política internacional (0-100) Apertura a la migración (0-10)
## Min. : 1.00 Min. : 0.00
## 1st Qu.: 20.75 1st Qu.: 2.00
## Median : 42.00 Median : 4.00
## Mean : 45.10 Mean : 4.28
## 3rd Qu.: 69.00 3rd Qu.: 7.00
## Max. :100.00 Max. :10.00
## Nivel de preocupación por conflictos internacionales (0-10)
## Min. : 0.00
## 1st Qu.: 2.00
## Median : 4.00
## Mean : 4.48
## 3rd Qu.: 7.00
## Max. :10.00
## Participación en ONGs internacionales Grado de activismo político (0-10)
## Length:100 Min. : 0.00
## Class :character 1st Qu.: 3.00
## Mode :character Median : 5.00
## Mean : 4.93
## 3rd Qu.: 7.00
## Max. :10.00
## Percepción de equidad global (0-10) Horas semanales dedicadas a temas de RRII
## Min. : 0.00 Min. : 0.00
## 1st Qu.: 3.00 1st Qu.: 5.00
## Median : 5.00 Median : 9.00
## Mean : 5.34 Mean :10.11
## 3rd Qu.: 8.00 3rd Qu.:16.00
## Max. :10.00 Max. :20.00
La muestra analizada presenta un rango de edad entre 19 y 63 años, con una media de 42.31 años y una mediana de 44.50 años. El nivel de depresión varía entre 1 y 10, con una media de 5.38 y una mediana de 5.50, donde el 25% de los participantes tienen valores inferiores a 3 y el 75% inferiores a 8. En cuanto a la resiliencia, su distribución es equilibrada, con valores entre 1 y 10, y una media y mediana de 5. El índice de felicidad global presenta una amplia variabilidad (0-98), con una media de 53.48 y una mediana de 61.50, mostrando una distribución sesgada a la izquierda. Se recomienda analizar las correlaciones entre resiliencia, felicidad y depresión para comprender mejor los patrones de bienestar psicológico.
ggplot(data, aes(x = Edad)) +
geom_histogram(binwidth = 5, fill = "skyblue", color = "black") +
theme_minimal() +
ggtitle("Distribución de Edad")
El histograma muestra la distribución de edades en la base de datos, con un rango que va aproximadamente de los 18 a los 70 años. Se observa una mayor concentración de individuos en los grupos de edad entre los 25 y 30 años, así como entre los 50 y 60 años, lo que indica posibles picos en la frecuencia de participantes en estas edades.
La distribución no es completamente uniforme, ya que hay fluctuaciones en la cantidad de observaciones por intervalo, lo que sugiere que algunos rangos de edad están mejor representados que otros en la muestra. También se nota una menor cantidad de individuos en los extremos de la distribución, especialmente en edades cercanas a los 70 años.
gender_counts <- data %>%
count(Género)
kable(gender_counts, format = "html") %>%
kable_styling("striped", full_width = FALSE)
| Género | n |
|---|---|
| Femenino | 43 |
| Masculino | 45 |
| No binario | 12 |
library(ggplot2)
ggplot(data, aes(x = Género, fill = Género)) +
geom_bar(color = "black", alpha = 0.7) +
geom_text(stat = "count", aes(label = ..count..), vjust = -0.5) +
scale_fill_manual(values = c("skyblue", "lightcoral", "plum")) +
labs(title = "Distribución de la muestra por Género",
x = "Género",
y = "Frecuencia") +
theme_minimal() +
theme(legend.position = "none",
plot.title = element_text(hjust = 0.5, size = 14, face = "bold"))
La muestra está compuesta por Masculino ≈ 45%, Femenino ≈ 43% y No binario ≈ 12%.
Se observa equilibrio entre hombres y mujeres, lo que facilita comparaciones entre estos dos grupos.
El grupo No binario es menor pero relevante para un análisis inclusivo; conviene reportar intervalos de confianza o evitar sobre-interpretar diferencias para este subgrupo por su menor tamaño.
ggplot(data, aes(x = Género, y = `Nivel de depresión`, fill = Género)) +
geom_boxplot() +
theme_minimal() +
ggtitle("Nivel de Depresión por Género")
El gráfico de cajas muestra la distribución del nivel de depresión según el género de los participantes en la base de datos. Se observan diferencias en la mediana y la dispersión de los valores entre los grupos.
En general, se pueden notar diferencias en la variabilidad y centralidad del nivel de depresión según el género, lo que sugiere posibles factores diferenciales que influyen en la distribución de la variable analizada.
ggplot(data, aes(x = `Nivel de resiliencia`, y = `Índice de felicidad global (0-100)`)) +
geom_point(color = "blue") +
geom_smooth(method = "lm", se = FALSE, color = "red") +
theme_minimal() +
ggtitle("Relación entre Resiliencia y Felicidad")
## `geom_smooth()` using formula = 'y ~ x'
El gráfico de dispersión representa la relación entre el nivel de resiliencia y el índice de felicidad global (0-100). Se observa que los datos están distribuidos de manera dispersa, sin un patrón claramente definido.
La línea de tendencia en rojo indica una leve pendiente negativa, lo que sugiere una relación inversa muy débil entre resiliencia y felicidad. Es decir, a medida que el nivel de resiliencia aumenta, el índice de felicidad tiende a disminuir ligeramente, aunque la dispersión de los datos indica que esta relación no es fuerte ni consistente.
En general, la gran variabilidad en los datos sugiere que existen otros factores que podrían estar influyendo en la felicidad más allá de la resiliencia.
Plazo máximo: 17 de Agosto.
Valor: 20 % del Primer Corte.
El propósito del taller es realizar un Análisis Exploratorio de Datos (EDA) que permita comprender la estructura, características y principales patrones de una base de datos.
Cada grupo deberá seleccionar una de las bases disponibles en:
https://github.com/Kalbam/Data_Psicolog-a
El análisis deberá desarrollarse en R Markdown y adjuntar en plataforma PDF.
El taller deberá realizarse en grupos de tres estudiantes.
Todos los integrantes deberán:
No se permitirán trabajos idénticos o sustancialmente similares entre grupos.
Debe incluir:
Redacte un resumen de máximo 250 palabras que incluya brevemente:
Incluya entre 3 y 5 palabras clave relacionadas con el estudio.
La introducción deberá contener:
Formule una pregunta clara que pueda ser explorada mediante los datos disponibles.
Ejemplo:
¿Cuáles son las principales características de los niveles de ansiedad de los estudiantes y qué patrones se observan en las variables analizadas?
Debe estar relacionado directamente con la pregunta problema.
Ejemplo:
Analizar descriptivamente los niveles de ansiedad y las principales características de los estudiantes incluidos en la base de datos.
Los antecedentes deberán estar respaldados por al menos cinco referencias académicas, de las cuales como mínimo tres deberán corresponder a:
Explique brevemente los conceptos estadísticos necesarios para comprender el análisis.
Puede incluir:
Los conceptos deberán explicarse con las palabras del grupo y relacionarse con el análisis realizado.
Describa:
Identifique:
Determine si existen valores ausentes (NA).
colSums(is.na(datos))
Comente:
No elimine valores faltantes automáticamente. Toda decisión deberá estar justificada.
Calcule, cuando corresponda:
Realice gráficos apropiados, como:
Construya:
Analice posibles valores atípicos mediante:
Recuerde:
\[ RI=Q_3-Q_1 \]
\[ L_i=Q_1-1.5(RI) \]
\[ L_s=Q_3+1.5(RI) \]
Ejemplo:
boxplot( datos$variable, horizontal = TRUE, main = “Detección de posibles valores atípicos” )
Un valor atípico no debe eliminarse automáticamente. Primero debe determinarse si corresponde a un error o a una observación válida.
La sección de resultados deberá contener:
No será suficiente copiar las salidas generadas por R.
Cada resultado deberá explicar:
Todas las tablas y figuras deberán:
Presente entre 3 y 5 conclusiones.
Las conclusiones deberán:
Las referencias deberán presentarse siguiendo las normas APA, última edición.
Todas las referencias incluidas deberán haber sido citadas dentro del documento.
Al final del informe deberá incluirse una declaración indicando:
Ejemplo:
| Aspecto | Información |
|---|---|
| Uso de IA | Sí |
| Herramienta | ChatGPT |
| Finalidad | Revisión de redacción |
| Porcentaje estimado | 15 % |
Cuando no se haya utilizado IA:
Este trabajo fue desarrollado completamente por los integrantes del grupo sin utilizar herramientas de Inteligencia Artificial.
El archivo .Rmd deberá:
Ejemplo correcto:
datos <- read.csv("datos/base_datos.csv")
Evite:
datos <- read.csv("C:/Users/Nombre/Documents/base_datos.csv")
Cada grupo deberá entregar:
.Rmd;Todo deberá organizarse en una carpeta .zip.
Ejemplo:
Taller_1_Grupo_03/
│
├── Taller_1_Grupo_03.Rmd
├── Taller_1_Grupo_03.html
├── Taller_1_Grupo_03.pdf
│
├── datos/
│ └── base_datos.csv
│
└── archivos_auxiliares/
No está permitido:
Las faltas estarán sujetas a lo establecido en el Reglamento Estudiantil de la Universidad.
| Criterio | Puntaje |
|---|---|
| Estructura solicitada | 10 |
| Introducción y antecedentes | 10 |
| Marco teórico | 10 |
| Metodología estadística | 20 |
| Análisis e interpretación | 30 |
| Conclusiones | 10 |
| Tablas, figuras y presentación | 5 |
| Redacción, ortografía y formato | 5 |
| Total | 100 |
La nota final se calculará mediante:
\[ \text{Nota definitiva}=0.05\times\text{Puntaje total} \]
Verifique que:
Secuencia esperada del trabajo:
\[ \text{Contexto} \rightarrow \text{Pregunta problema} \rightarrow \text{Objetivo} \rightarrow \text{Marco teórico} \rightarrow \text{Metodología} \rightarrow \text{EDA} \rightarrow \text{Resultados} \rightarrow \text{Conclusiones} \]
La estadística descriptiva permite resumir las características observadas en una muestra. Sin embargo, en muchas investigaciones el interés principal no se limita a describir a los individuos observados, sino que se busca utilizar la información muestral para realizar inferencias acerca de una población.
En este segundo corte se utilizarán los datos muestrales para estimar parámetros poblacionales mediante intervalos de confianza.
Un intervalo de confianza tiene la estructura general:
\[ \boxed{ \text{Estimador} \pm \text{Margen de error} } \]
donde:
\[ \text{Margen de error} = (\text{valor crítico}) (\text{error estándar}). \]
Los intervalos permiten incorporar la incertidumbre asociada al proceso de estimación.
Continuaremos trabajando con la base de datos:
Base de Datos Psicología y Relaciones Internacionales
disponible en:
https://github.com/Kalbam/Datos/blob/main/Base_Datos_Psicologia_RI.xlsx
La base contiene información relacionada con bienestar psicológico, percepción política, interacción internacional y participación social.
Entre las variables disponibles se encuentran:
Un equipo interdisciplinario conformado por investigadores de Psicología, Relaciones Internacionales y Ciencia de Datos desea utilizar la información recolectada para realizar inferencias sobre la población representada por la muestra.
El interés ya no consiste únicamente en describir los valores observados.
Ahora se desea responder preguntas como:
¿Entre qué valores plausibles se encuentra el nivel promedio de depresión de la población?
¿Qué proporción de la población participa en organizaciones internacionales?
¿Qué tan variable es la preocupación por los conflictos internacionales?
¿Existen diferencias en el nivel promedio de apertura a la migración entre diferentes grupos de participantes?
Para responder estas preguntas utilizaremos intervalos de confianza.
¿Qué valores plausibles pueden establecerse para los principales parámetros poblacionales asociados con el bienestar psicológico, la participación internacional y las percepciones sobre asuntos globales, a partir de la información contenida en la muestra?
Estimar mediante intervalos de confianza parámetros poblacionales relacionados con variables psicológicas y de Relaciones Internacionales, utilizando procedimientos matemáticos y su implementación en R.
Primero cargamos nuevamente la base de datos.
library(readxl)
library(dplyr)
data <- read_excel(
"Base_Datos_Psicologia_RI.xlsx",
sheet = "Sheet1"
)
dim(data)
## [1] 100 14
Verificamos las variables:
names(data)
## [1] "ID"
## [2] "Edad"
## [3] "Género"
## [4] "Nivel de depresión"
## [5] "Nivel de resiliencia"
## [6] "Índice de felicidad global (0-100)"
## [7] "Horas de interacción con extranjeros por semana"
## [8] "Conocimiento en política internacional (0-100)"
## [9] "Apertura a la migración (0-10)"
## [10] "Nivel de preocupación por conflictos internacionales (0-10)"
## [11] "Participación en ONGs internacionales"
## [12] "Grado de activismo político (0-10)"
## [13] "Percepción de equidad global (0-10)"
## [14] "Horas semanales dedicadas a temas de RRII"
El nivel de depresión es una variable cuantitativa medida en una escala de 1 a 10.
Un investigador desea estimar el nivel promedio de depresión de la población representada por la muestra.
El parámetro de interés es:
\[ \mu= \text{nivel promedio poblacional de depresión}. \]
Como la desviación estándar poblacional \(\sigma\) es desconocida, se utilizará la distribución \(t\) de Student.
Primero obtenemos los valores necesarios.
La muestra presenta:
\[ n=100 \]
\[ \bar{x}=5.38 \]
\[ s=2.95. \]
Como \(\sigma\) es desconocida:
\[ IC_{\mu} = \bar{x} \pm t_{\alpha/2,n-1} \frac{s}{\sqrt{n}}. \]
\[ gl=n-1 \]
\[ gl=100-1=99. \]
Para un nivel de confianza del 95%:
\[ \alpha=0.05 \]
y:
\[ \frac{\alpha}{2}=0.025. \]
Entonces:
\[ t_{\alpha/2,99} = 1.9842. \]
\[ EE= \frac{s}{\sqrt n} \]
\[ EE= \frac{2.95} {\sqrt{100}} \]
\[ \boxed{ EE=0.2947 } \]
\[ E= t_{\alpha/2,n-1} \left( \frac{s}{\sqrt n} \right) \]
\[ E= 1.9842 (0.2947) \]
\[ \boxed{ E=0.5847 } \]
\[ IC_{95\%} = 5.38 \pm 0.5847 \]
Por tanto:
\[ \boxed{ 4.8 < \mu < 5.96 } \]
Con un nivel de confianza del 95%, se estima que el nivel promedio poblacional de depresión se encuentra entre:
\[ \boxed{ 4.8 \text{ y } 5.96 } \]
puntos.
Este intervalo permite pasar de una descripción exclusivamente muestral a una inferencia sobre el parámetro poblacional.
Podemos obtener el intervalo directamente mediante:
t.test(
data$`Nivel de depresión`,
conf.level = 0.95
)
##
## One Sample t-test
##
## data: data$`Nivel de depresión`
## t = 18.258, df = 99, p-value < 2.2e-16
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
## 4.795332 5.964668
## sample estimates:
## mean of x
## 5.38
También podemos reproducir manualmente el procedimiento:
n <- length(na.omit(data$`Nivel de depresión`))
media <- mean(
data$`Nivel de depresión`,
na.rm = TRUE
)
s <- sd(
data$`Nivel de depresión`,
na.rm = TRUE
)
t_critico <- qt(
0.975,
df = n - 1
)
EE <- s / sqrt(n)
LI <- media - t_critico * EE
LS <- media + t_critico * EE
c(
Limite_Inferior = LI,
Limite_Superior = LS
)
## Limite_Inferior Limite_Superior
## 4.795332 5.964668
Otro interés del estudio consiste en conocer la proporción de personas que participan en ONGs internacionales.
Sea:
\[ p= \text{proporción poblacional que participa en ONGs internacionales}. \]
El estimador de \(p\) es:
\[ \hat p= \frac{x}{n}, \]
donde \(x\) representa el número de participantes que respondieron afirmativamente.
Primero verificamos cómo está codificada la variable:
table(
data$`Participación en ONGs internacionales`,
useNA = "ifany"
)
##
## No Sí
## 67 33
Para el siguiente código se supone que la respuesta afirmativa está
registrada como "Sí".
Tenemos:
\[ n=100 \]
\[ x=33. \]
Entonces:
\[ \hat p = \frac{33}{100} = 0.33. \]
En porcentaje:
\[ \boxed{ \hat p=33\% } \]
El intervalo aproximado para una proporción es:
\[ IC_p = \hat p \pm z_{\alpha/2} \sqrt{ \frac{\hat p(1-\hat p)}{n} }. \]
Para 95% de confianza:
\[ z_{\alpha/2}=1.96. \]
\[ EE= \sqrt{ \frac{\hat p(1-\hat p)}{n} } \]
Sustituyendo:
\[ EE= \sqrt{ \frac{ (0.33) (1-0.33) }{ 100 } } \]
\[ \boxed{ EE=0.047 } \]
\[ E= 1.96 (0.047) \]
\[ \boxed{ E=0.0922 } \]
\[ IC_{95\%} = 0.33 \pm 0.0922 \]
Por tanto:
\[ \boxed{ 0.2378 < p < 0.4222 } \]
En porcentajes:
\[ \boxed{ 23.78\% < p < 42.22\% } \]
Con un nivel de confianza del 95%, se estima que la proporción poblacional de personas que participan en ONGs internacionales se encuentra entre:
\[ \boxed{ 23.78\% \text{ y } 42.22\% } \]
x <- sum(
data$`Participación en ONGs internacionales`
%in% c("Sí","Si","SI","sí","si"),
na.rm = TRUE
)
n <- sum(
!is.na(
data$`Participación en ONGs internacionales`
)
)
p_hat <- x/n
z <- qnorm(0.975)
EE <- sqrt(
p_hat*(1-p_hat)/n
)
LI <- p_hat - z*EE
LS <- p_hat + z*EE
c(
Proporcion = p_hat,
Limite_Inferior = LI,
Limite_Superior = LS
)
## Proporcion Limite_Inferior Limite_Superior
## 0.33000 0.23784 0.42216
También puede utilizarse:
prop.test(
x = x,
n = n,
conf.level = 0.95,
correct = FALSE
)
##
## 1-sample proportions test without continuity correction
##
## data: x out of n, null probability 0.5
## X-squared = 11.56, df = 1, p-value = 0.0006739
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.2456312 0.4269466
## sample estimates:
## p
## 0.33
Nota: prop.test() utiliza un
procedimiento para el intervalo que puede producir valores ligeramente
diferentes al intervalo normal calculado manualmente.
Además de conocer el promedio, puede ser importante determinar qué tan heterogéneas son las percepciones de los participantes.
Utilizaremos la variable:
Nivel de preocupación por conflictos internacionales (0-10).
El parámetro de interés será:
\[ \sigma^2= \text{varianza poblacional del nivel de preocupación}. \]
Para construir este intervalo utilizamos la distribución:
\[ \chi^2. \]
Tenemos:
\[ n=100 \]
\[ s^2=8.7168 \]
y:
\[ gl=99. \]
El intervalo de confianza para una varianza poblacional es:
\[ \boxed{ \frac{(n-1)s^2} {\chi^2_{1-\alpha/2}} < \sigma^2 < \frac{(n-1)s^2} {\chi^2_{\alpha/2}} } \]
Para 95% de confianza:
\[ \alpha=0.05. \]
Los valores críticos son:
\[ \chi^2_{0.025,99} = 73.3611 \]
y:
\[ \chi^2_{0.975,99} = 128.422. \]
\[ LI= \frac{ (99) (8.7168) }{ 128.422 } \]
\[ \boxed{ LI=6.7197 } \]
\[ LS= \frac{ (99) (8.7168) }{ 73.3611 } \]
\[ \boxed{ LS=11.7632 } \]
Por tanto:
\[ \boxed{ 6.7197 < \sigma^2 < 11.7632 } \]
Tomamos raíz cuadrada:
\[ \boxed{ \sqrt{6.7197} < \sigma < \sqrt{11.7632} } \]
Entonces:
\[ \boxed{ 2.59 < \sigma < 3.43 } \]
Con un nivel de confianza del 95%, la desviación estándar poblacional del nivel de preocupación por conflictos internacionales se estima entre:
\[ \boxed{ 2.59 \text{ y } 3.43 } \]
puntos de la escala.
Este resultado permite cuantificar la heterogeneidad existente en las percepciones de los participantes.
x <- na.omit(
data$`Nivel de preocupación por conflictos internacionales (0-10)`
)
n <- length(x)
s2 <- var(x)
gl <- n-1
LI <- (gl*s2) /
qchisq(0.975, df = gl)
LS <- (gl*s2) /
qchisq(0.025, df = gl)
c(
Varianza_LI = LI,
Varianza_LS = LS,
Desviacion_LI = sqrt(LI),
Desviacion_LS = sqrt(LS)
)
## Varianza_LI Varianza_LS Desviacion_LI Desviacion_LS
## 6.719722 11.763186 2.592243 3.429750
Los investigadores también desean estudiar si la apertura a la migración presenta diferencias entre grupos.
Para fines didácticos se compararán los participantes registrados como:
La variable respuesta será:
Apertura a la migración (0-10).
El parámetro de interés es:
\[ \mu_F-\mu_M. \]
Las muestras corresponden a individuos diferentes, por lo que se consideran muestras independientes.
Como no se supondrán varianzas poblacionales iguales, se utilizará el procedimiento de Welch.
Los estadísticos son:
\[ n_F=43, \qquad \bar{x}_F=4.58, \qquad s_F=2.95. \]
\[ n_M=45, \qquad \bar{x}_M=3.87, \qquad s_M=2.92. \]
La diferencia puntual es:
\[ \bar{x}_F-\bar{x}_M \]
\[ = 4.58 - 3.87 \]
\[ \boxed{ \bar{x}_F-\bar{x}_M = 0.71 } \]
\[ EE= \sqrt{ \frac{s_F^2}{n_F} + \frac{s_M^2}{n_M} } \]
Sustituyendo:
\[ EE= \sqrt{ \frac{(2.95)^2}{43} + \frac{(2.92)^2}{45} } \]
\[ \boxed{ EE=0.6264 } \]
Los grados de libertad aproximados son:
\[ \boxed{ gl\approx 85.72 } \]
El valor crítico es:
\[ \boxed{ t^*=1.988 } \]
\[ E= t^*EE \]
\[ E= (1.988) (0.6264) \]
\[ \boxed{ E=1.2454 } \]
\[ IC_{95\%} = (\bar{x}_F-\bar{x}_M) \pm E \]
\[ IC_{95\%} = 0.71 \pm 1.2454. \]
Por tanto:
\[ \boxed{ -0.53 < \mu_F-\mu_M < 1.96 } \]
El intervalo estima la diferencia entre la apertura promedio a la migración del grupo femenino y del grupo masculino.
t.test(
`Apertura a la migración (0-10)` ~ Género,
data = data %>%
filter(Género %in% c("Femenino","Masculino")),
conf.level = 0.95,
var.equal = FALSE
)
##
## Welch Two Sample t-test
##
## data: Apertura a la migración (0-10) by Género
## t = 1.141, df = 85.717, p-value = 0.2571
## alternative hypothesis: true difference in means between group Femenino and group Masculino is not equal to 0
## 95 percent confidence interval:
## -0.5306249 1.9600822
## sample estimates:
## mean in group Femenino mean in group Masculino
## 4.581395 3.866667
A partir de una misma base de datos fue posible estimar diferentes parámetros poblacionales:
| Situación | Parámetro | Procedimiento |
|---|---|---|
| Nivel promedio de depresión | \(\mu\) | \(t\) de Student |
| Participación en ONGs | \(p\) | Normal para una proporción |
| Variabilidad de preocupación por conflictos | \(\sigma^2\) | \(\chi^2\) |
| Diferencia en apertura a la migración | \(\mu_F-\mu_M\) | \(t\) de Welch |
El procedimiento general utilizado fue:
\[ \boxed{ \text{Pregunta} \rightarrow \text{Parámetro} \rightarrow \text{Estimador} \rightarrow \text{Distribución} \rightarrow \text{IC} \rightarrow \text{Interpretación} } \]
La interpretación es fundamental. No basta con obtener los límites numéricos del intervalo.
Valor: 20 % del Segundo Corte.
El propósito del taller es aplicar técnicas de estimación por intervalos de confianza para obtener información acerca de parámetros poblacionales a partir de una muestra.
Cada grupo continuará trabajando con una de las bases disponibles en:
https://github.com/Kalbam/Data_Psicolog-a
El análisis deberá realizarse mediante R Markdown, combinando:
El taller deberá realizarse en grupos de tres estudiantes.
Todos los integrantes deberán:
No se permitirán trabajos idénticos o sustancialmente similares entre grupos.
Debe incluir:
Redacte un resumen de máximo 250 palabras que incluya:
Incluya entre 3 y 5 palabras clave relacionadas con el estudio.
La introducción deberá contener:
La pregunta deberá permitir realizar inferencias sobre uno o varios parámetros poblacionales.
Ejemplo:
¿Entre qué valores plausibles se encuentran los principales parámetros poblacionales asociados con el bienestar psicológico de los individuos representados por la muestra?
Otro ejemplo:
¿Qué valores plausibles pueden establecerse para el nivel promedio de ansiedad y la proporción de individuos que presenta determinadas características psicológicas?
Ejemplo:
Estimar mediante intervalos de confianza parámetros poblacionales relacionados con las variables de interés de la base de datos seleccionada.
Los antecedentes deberán estar respaldados por al menos cinco referencias académicas, de las cuales como mínimo tres deberán corresponder a:
Explique los conceptos necesarios para comprender los análisis realizados.
Debe incluir, cuando corresponda:
Los conceptos deberán explicarse con las palabras del grupo y relacionarse con el estudio realizado.
Describa:
Cada grupo deberá construir e interpretar intervalos de confianza utilizando variables de su base de datos.
Seleccione una variable cuantitativa.
Debe presentar:
Seleccione una variable cualitativa dicotómica o una categoría de interés.
Debe identificar:
\[ p= \text{proporción poblacional de interés}. \]
Calcule:
\[ \hat p=\frac{x}{n} \]
y construya el intervalo correspondiente.
Seleccione una variable cuantitativa para estudiar su variabilidad.
Estime:
\[ \sigma^2 \]
mediante la distribución:
\[ \chi^2. \]
Cuando sea pertinente, obtenga también el intervalo para:
\[ \sigma. \]
Dependiendo de las variables disponibles en la base, construya al menos un intervalo de comparación, seleccionando uno de los siguientes:
Cada intervalo deberá resolverse inicialmente de forma matemática.
La estructura mínima será:
\[ \boxed{ \text{Parámetro} \rightarrow \text{Estimador} \rightarrow \text{Error estándar} \rightarrow \text{Valor crítico} \rightarrow \text{Margen de error} \rightarrow IC } \]
No será suficiente presentar únicamente una salida de R.
Después del desarrollo matemático, cada procedimiento deberá reproducirse en R.
Pueden utilizar funciones como:
mean()
sd()
var()
qnorm()
qt()
qchisq()
qf()
t.test()
prop.test()
Los resultados obtenidos en R deberán compararse con el procedimiento matemático.
Cada intervalo deberá responder:
No será suficiente escribir únicamente:
``El intervalo es \((a,b)\).’’
Debe redactarse una interpretación estadística contextualizada.
Presente entre 3 y 5 conclusiones.
Las conclusiones deberán:
Las referencias deberán presentarse siguiendo las normas APA, última edición.
Todas las referencias incluidas deberán haber sido citadas dentro del informe.
Al final del informe deberá incluirse una declaración indicando:
Ejemplo:
| Aspecto | Información |
|---|---|
| Uso de IA | Sí |
| Herramienta | ChatGPT |
| Finalidad | Revisión de redacción |
| Porcentaje estimado | 15 % |
Cuando no se haya utilizado IA:
Este trabajo fue desarrollado completamente por los integrantes del grupo sin utilizar herramientas de Inteligencia Artificial.
El archivo .Rmd deberá:
Ejemplo correcto:
datos <- read_excel(
"datos/base_datos.xlsx"
)
Evite rutas como:
datos <- read_excel(
"C:/Users/Nombre/Documents/base_datos.xlsx"
)
Cada grupo deberá entregar:
.Rmd;Todo deberá organizarse en una carpeta .zip.
Ejemplo:
Taller_2_Grupo_03/
│
├── Taller_2_Grupo_03.Rmd
├── Taller_2_Grupo_03.html
├── Taller_2_Grupo_03.pdf
│
├── datos/
│ └── base_datos.xlsx
│
└── archivos_auxiliares/
No está permitido:
Las faltas estarán sujetas a lo establecido en el Reglamento Estudiantil de la Universidad.
| Criterio | Puntaje |
|---|---|
| Estructura solicitada | 10 |
| Introducción y antecedentes | 10 |
| Marco teórico | 10 |
| Metodología estadística | 20 |
| Cálculos, análisis e interpretación | 30 |
| Conclusiones | 10 |
| Tablas, resultados y presentación | 5 |
| Redacción, ortografía y formato | 5 |
| Total | 100 |
La nota final se calculará mediante:
\[ \text{Nota definitiva} = 0.05 \times \text{Puntaje total}. \]
Verifique que:
Secuencia esperada del trabajo:
\[ \boxed{ \text{Contexto} \rightarrow \text{Pregunta problema} \rightarrow \text{Objetivo} \rightarrow \text{Marco teórico} \rightarrow \text{Metodología} \rightarrow \text{Estimación} \rightarrow \text{IC} \rightarrow \text{R} \rightarrow \text{Interpretación} \rightarrow \text{Conclusiones} } \]
La estimación por intervalos de confianza permite establecer un rango de valores plausibles para un parámetro poblacional.
Sin embargo, en muchas investigaciones se desea responder preguntas más específicas, por ejemplo:
Para responder este tipo de preguntas se utilizan las pruebas de hipótesis.
Una prueba de hipótesis parte de dos afirmaciones:
\[ H_0: \text{hipótesis nula} \]
y:
\[ H_1: \text{hipótesis alternativa}. \]
La decisión se toma utilizando evidencia muestral.
Una regla frecuente basada en el valor-\(p\) es:
\[ \boxed{ p\text{-valor}<\alpha \Rightarrow \text{Rechazar }H_0 } \]
mientras que:
\[ \boxed{ p\text{-valor}\geq\alpha \Rightarrow \text{No rechazar }H_0 } \]
Continuaremos utilizando la base:
Base de Datos Psicología y Relaciones Internacionales
disponible en:
https://github.com/Kalbam/Datos/blob/main/Base_Datos_Psicologia_RI.xlsx
La base contiene variables relacionadas con:
Un grupo interdisciplinario de investigadores desea determinar si algunos patrones observados en la muestra proporcionan evidencia suficiente para realizar afirmaciones sobre la población.
El interés ahora no consiste únicamente en estimar parámetros, sino en contrastar afirmaciones específicas.
Por ejemplo:
¿El nivel promedio de depresión poblacional es diferente de 5 puntos?
¿Más de la mitad de los participantes forman parte de una ONG internacional?
¿La variabilidad de la preocupación por conflictos internacionales supera un valor determinado?
¿Existen diferencias en la apertura hacia la migración entre hombres y mujeres?
¿Existe evidencia estadística suficiente para afirmar que los parámetros poblacionales asociados con las variables psicológicas y de Relaciones Internacionales difieren de determinados valores de referencia o entre grupos de la población?
Aplicar pruebas de hipótesis para analizar parámetros poblacionales relacionados con variables psicológicas y de Relaciones Internacionales, combinando el desarrollo matemático, el valor-\(p\), la decisión estadística y su implementación en R.
library(readxl)
library(dplyr)
data <- read_excel(
"Base_Datos_Psicologia_RI.xlsx",
sheet = "Sheet1"
)
dim(data)
## [1] 100 14
names(data)
## [1] "ID"
## [2] "Edad"
## [3] "Género"
## [4] "Nivel de depresión"
## [5] "Nivel de resiliencia"
## [6] "Índice de felicidad global (0-100)"
## [7] "Horas de interacción con extranjeros por semana"
## [8] "Conocimiento en política internacional (0-100)"
## [9] "Apertura a la migración (0-10)"
## [10] "Nivel de preocupación por conflictos internacionales (0-10)"
## [11] "Participación en ONGs internacionales"
## [12] "Grado de activismo político (0-10)"
## [13] "Percepción de equidad global (0-10)"
## [14] "Horas semanales dedicadas a temas de RRII"
Un investigador desea determinar si el nivel promedio poblacional de depresión es diferente de 5 puntos.
La variable utilizada es:
Nivel de depresión
y el parámetro de interés es:
\[ \mu= \text{nivel promedio poblacional de depresión}. \]
Se desea contrastar:
\[ H_0:\mu=5 \]
frente a:
\[ H_1:\mu\neq5. \]
Esta es una prueba:
\[ \boxed{\text{bilateral}} \]
con:
\[ \alpha=0.05. \]
Tenemos:
\[ n=100 \]
\[ \bar{x}=5.38 \]
\[ s=2.95. \]
Como \(\sigma\) es desconocida, utilizamos:
\[ \boxed{ t= \frac{ \bar{x}-\mu_0 }{ s/\sqrt{n} } } \]
\[ EE= \frac{s}{\sqrt n} \]
\[ EE= \frac{ 2.95 }{ \sqrt{100} } \]
\[ \boxed{ EE=0.2947 } \]
\[ t= \frac{ 5.38-5 }{ 0.2947 } \]
\[ \boxed{ t=1.2896 } \]
\[ gl=n-1 \]
\[ gl=100-1 \]
\[ \boxed{ gl=99 } \]
Para:
\[ \alpha=0.05 \]
y prueba bilateral:
\[ \alpha/2=0.025. \]
Entonces:
\[ \boxed{ t^*= 1.9842 } \]
\[ \boxed{ p\text{-valor} = 0.2002 } \]
## [1] "No se rechaza H0"
Como:
\[ p=0.2002 \]
y:
\[ \alpha=0.05, \]
la decisión es:
\[ \boxed{ No se rechaza H0 } \]
No existe evidencia estadística suficiente para afirmar que el nivel promedio poblacional de depresión sea diferente de 5 puntos.
t.test(
data$`Nivel de depresión`,
mu = 5,
alternative = "two.sided",
conf.level = 0.95
)
##
## One Sample t-test
##
## data: data$`Nivel de depresión`
## t = 1.2896, df = 99, p-value = 0.2002
## alternative hypothesis: true mean is not equal to 5
## 95 percent confidence interval:
## 4.795332 5.964668
## sample estimates:
## mean of x
## 5.38
Se desea determinar si la proporción poblacional de personas que participa en ONGs internacionales es superior al 50%.
Sea:
\[ p= \text{proporción poblacional de participantes en ONGs internacionales}. \]
Las hipótesis son:
\[ H_0:p=0.50 \]
frente a:
\[ H_1:p>0.50. \]
Esta es una prueba:
\[ \boxed{\text{cola derecha}} \]
table(
data$`Participación en ONGs internacionales`,
useNA = "ifany"
)
##
## No Sí
## 67 33
Tenemos:
\[ n=100 \]
\[ x=33 \]
y:
\[ \hat p= \frac{33}{100} = 0.33. \]
El estadístico para una proporción es:
\[ \boxed{ Z= \frac{ \hat p-p_0 }{ \sqrt{ \frac{ p_0(1-p_0) }{n} } } } \]
\[ EE= \sqrt{ \frac{ 0.50(1-0.50) }{ 100 } } \]
\[ \boxed{ EE=0.05 } \]
\[ Z= \frac{ 0.33-0.50 }{ 0.05 } \]
\[ \boxed{ Z=-3.4 } \]
Para una prueba de cola derecha con:
\[ \alpha=0.05, \]
se obtiene:
\[ \boxed{ Z_{0.05}= 1.6449 } \]
\[ \boxed{ p\text{-valor} = 0.9997 } \]
## [1] "No se rechaza H0"
Por tanto:
\[ \boxed{ No se rechaza H0 } \]
No existe evidencia estadística suficiente para afirmar que más del 50% de la población participa en ONGs internacionales.
prop.test(
x = x_ong,
n = n_ong,
p = 0.50,
alternative = "greater",
correct = FALSE
)
##
## 1-sample proportions test without continuity correction
##
## data: x_ong out of n_ong, null probability 0.5
## X-squared = 11.56, df = 1, p-value = 0.9997
## alternative hypothesis: true p is greater than 0.5
## 95 percent confidence interval:
## 0.2580294 1.0000000
## sample estimates:
## p
## 0.33
Los investigadores desean estudiar la variabilidad del:
Nivel de preocupación por conflictos internacionales (0-10).
Se desea determinar si la varianza poblacional supera:
\[ \sigma_0^2=6. \]
Las hipótesis son:
\[ H_0:\sigma^2=6 \]
frente a:
\[ H_1:\sigma^2>6. \]
Tenemos:
\[ n=100 \]
y:
\[ s^2=8.7168. \]
El estadístico es:
\[ \boxed{ \chi^2= \frac{ (n-1)s^2 }{ \sigma_0^2 } } \]
\[ gl=100-1 \]
\[ \boxed{ gl=99 } \]
\[ \chi^2= \frac{ (99) (8.7168) }{ 6 } \]
\[ \boxed{ \chi^2=143.8267 } \]
Para:
\[ \alpha=0.05 \]
en cola derecha:
\[ \boxed{ \chi^2_{\text{crítico}} = 123.2252 } \]
\[ \boxed{ p\text{-valor} = 0.0022 } \]
## [1] "Se rechaza H0"
Por tanto:
\[ \boxed{ Se rechaza H0 } \]
Existe evidencia estadística suficiente para afirmar que la varianza poblacional del nivel de preocupación por conflictos internacionales es superior a 6.
R no posee una función base directa equivalente a
t.test() para una varianza, por lo que podemos realizar el
cálculo manualmente:
x <- na.omit(
data$`Nivel de preocupación por conflictos internacionales (0-10)`
)
n <- length(x)
s2 <- var(x)
sigma20 <- 6
chi <- (n-1)*s2/sigma20
p_valor <- pchisq(
chi,
df = n-1,
lower.tail = FALSE
)
chi
## [1] 143.8267
p_valor
## [1] 0.002200887
Los investigadores desean determinar si existe diferencia en la apertura a la migración entre participantes registrados como:
El parámetro de interés es:
\[ \mu_F-\mu_M. \]
Las hipótesis son:
\[ H_0: \mu_F-\mu_M=0 \]
frente a:
\[ H_1: \mu_F-\mu_M\neq0. \]
Como se comparan personas distintas, las muestras son independientes.
Se utilizará la prueba:
\[ \boxed{ t\text{ de Welch} } \]
Grupo femenino:
\[ n_F=43, \qquad \bar{x}_F=4.58, \qquad s_F=2.95. \]
Grupo masculino:
\[ n_M=45, \qquad \bar{x}_M=3.87, \qquad s_M=2.92. \]
\[ \bar{x}_F-\bar{x}_M \]
\[ = 4.58 - 3.87 \]
\[ \boxed{ \bar{x}_F-\bar{x}_M = 0.7147 } \]
\[ EE= \sqrt{ \frac{s_F^2}{n_F} + \frac{s_M^2}{n_M} } \]
\[ EE= \sqrt{ \frac{(2.95)^2}{43} + \frac{(2.92)^2}{45} } \]
\[ \boxed{ EE=0.6264 } \]
\[ t= \frac{ (\bar{x}_F-\bar{x}_M)-0 }{ EE } \]
\[ t= \frac{ 0.7147 }{ 0.6264 } \]
\[ \boxed{ t=1.141 } \]
Mediante la aproximación de Welch:
\[ \boxed{ gl\approx 85.72 } \]
\[ \boxed{ p\text{-valor} = 0.2571 } \]
## [1] "No se rechaza H0"
Por tanto:
\[ \boxed{ No se rechaza H0 } \]
No existe evidencia estadística suficiente para afirmar que la apertura promedio a la migración difiera entre los participantes femeninos y masculinos.
t.test(
`Apertura a la migración (0-10)` ~ Género,
data = data %>%
filter(
Género %in%
c("Femenino","Masculino")
),
alternative = "two.sided",
var.equal = FALSE,
conf.level = 0.95
)
##
## Welch Two Sample t-test
##
## data: Apertura a la migración (0-10) by Género
## t = 1.141, df = 85.717, p-value = 0.2571
## alternative hypothesis: true difference in means between group Femenino and group Masculino is not equal to 0
## 95 percent confidence interval:
## -0.5306249 1.9600822
## sample estimates:
## mean in group Femenino mean in group Masculino
## 4.581395 3.866667
Para una prueba bilateral:
\[ H_0:\theta=\theta_0 \]
frente a:
\[ H_1:\theta\neq\theta_0, \]
existe una relación directa con el intervalo de confianza correspondiente.
Si:
\[ \theta_0 \notin IC_{95\%}, \]
entonces:
\[ \boxed{ \text{se rechaza }H_0 } \]
con:
\[ \alpha=0.05. \]
En cambio, si:
\[ \theta_0 \in IC_{95\%}, \]
entonces:
\[ \boxed{ \text{no se rechaza }H_0 } \]
Suponga que R produce:
One Sample t-test
data: Nivel de depresión
t = 1.42
df = 99
p-value = 0.159
alternative hypothesis:
true mean is not equal to 5
95 percent confidence interval:
4.91 5.85
sample estimates:
mean of x
5.38
Responda:
El procedimiento que utilizaremos será:
\[ \boxed{ \text{Contexto} \rightarrow \text{Parámetro} \rightarrow H_0,H_1 \rightarrow \alpha \rightarrow \text{Estadístico} \rightarrow p\text{-valor} \rightarrow \text{Decisión} \rightarrow \text{Interpretación} } \]
Valor: 20 % del Tercer Corte.
El propósito del taller es aplicar pruebas de hipótesis para evaluar afirmaciones relacionadas con parámetros poblacionales a partir de información muestral.
Cada grupo continuará trabajando con una de las bases disponibles en:
https://github.com/Kalbam/Data_Psicolog-a
El análisis deberá desarrollarse en R Markdown y combinar:
El taller deberá realizarse en grupos de tres estudiantes.
Todos los integrantes deberán:
No se permitirán trabajos idénticos o sustancialmente similares entre grupos.
Debe incluir:
Redacte un resumen de máximo 250 palabras que incluya:
Incluya entre 3 y 5 palabras clave relacionadas con el estudio.
La introducción deberá contener:
La pregunta debe poder responderse mediante pruebas de hipótesis.
Ejemplo:
¿Existe evidencia estadística suficiente para afirmar que el nivel promedio de ansiedad de la población difiere del valor establecido como referencia?
Otro ejemplo:
¿Existen diferencias estadísticamente significativas entre dos grupos respecto a una variable psicológica o social de interés?
Ejemplo:
Evaluar mediante pruebas de hipótesis diferentes afirmaciones acerca de parámetros poblacionales relacionados con las variables seleccionadas.
Los antecedentes deberán estar respaldados por al menos cinco referencias académicas, de las cuales como mínimo tres deberán ser:
Explique los conceptos necesarios para comprender las pruebas realizadas.
Debe incluir:
Cuando corresponda, incluya además:
Describa:
Cada grupo deberá desarrollar varias pruebas utilizando variables de su base.
Seleccione una variable cuantitativa.
Plantee:
\[ H_0:\mu=\mu_0 \]
y una alternativa apropiada:
\[ H_1:\mu\neq\mu_0 \]
o:
\[ H_1:\mu>\mu_0 \]
o:
\[ H_1:\mu<\mu_0. \]
Debe incluir:
Seleccione una variable cualitativa.
Plantee una hipótesis sobre:
\[ p. \]
Ejemplo:
\[ H_0:p=0.50. \]
Determine:
Seleccione una variable cuantitativa.
Plantee una hipótesis sobre:
\[ \sigma^2. \]
Utilice:
\[ \boxed{ \chi^2= \frac{ (n-1)s^2 }{ \sigma_0^2 } } \]
e interprete el resultado.
Realice al menos una comparación seleccionando una de las siguientes:
La selección deberá estar justificada por la estructura de los datos.
Cada prueba deberá resolverse inicialmente de forma matemática.
La secuencia mínima será:
\[ \boxed{ H_0,H_1 \rightarrow \alpha \rightarrow \text{Estadístico} \rightarrow \text{Valor crítico o }p \rightarrow \text{Decisión} } \]
No será suficiente presentar únicamente una salida de R.
Cada procedimiento deberá reproducirse posteriormente en R.
Pueden utilizar funciones como:
qnorm()
pnorm()
qt()
pt()
qchisq()
pchisq()
qf()
pf()
t.test()
prop.test()
var.test()
Cada grupo deberá incluir al menos dos salidas de R completas y explicar:
No será suficiente copiar directamente la salida del software.
Para cada prueba deberá explicarse:
Presente entre 3 y 5 conclusiones.
Las conclusiones deberán:
Las referencias deberán presentarse siguiendo normas APA, última edición.
Todas las referencias incluidas deberán estar citadas dentro del documento.
Al final deberá incluirse una declaración sobre:
Ejemplo:
| Aspecto | Información |
|---|---|
| Uso de IA | Sí |
| Herramienta | ChatGPT |
| Finalidad | Revisión de redacción |
| Porcentaje estimado | 15 % |
El archivo .Rmd deberá:
Cada grupo deberá entregar:
.Rmd;Todo deberá organizarse en una carpeta .zip.
Ejemplo:
Taller_3_Grupo_03/
│
├── Taller_3_Grupo_03.Rmd
├── Taller_3_Grupo_03.html
├── Taller_3_Grupo_03.pdf
│
├── datos/
│ └── base_datos.xlsx
│
└── archivos_auxiliares/
No está permitido:
| Criterio | Puntaje |
|---|---|
| Estructura solicitada | 10 |
| Introducción y antecedentes | 10 |
| Marco teórico | 10 |
| Metodología estadística | 20 |
| Pruebas, cálculos e interpretación | 30 |
| Conclusiones | 10 |
| Tablas, resultados y presentación | 5 |
| Redacción, ortografía y formato | 5 |
| Total | 100 |
La nota final se calculará mediante:
\[ \text{Nota definitiva} = 0.05\times \text{Puntaje total}. \]
Verifique que:
Secuencia esperada del trabajo:
\[ \boxed{ \text{Contexto} \rightarrow \text{Pregunta} \rightarrow H_0,H_1 \rightarrow \alpha \rightarrow \text{Cálculo} \rightarrow p\text{-valor} \rightarrow \text{Decisión} \rightarrow \text{R} \rightarrow \text{Interpretación} \rightarrow \text{Conclusiones} } \]
En los cortes anteriores utilizamos la información de una muestra para describir datos, estimar parámetros y contrastar hipótesis.
En este corte estudiaremos la relación entre dos variables cuantitativas mediante:
\[ \boxed{ \text{Correlación} \quad+\quad \text{Regresión lineal simple} } \]
El propósito será determinar si existe una asociación lineal entre dos variables y construir un modelo que permita explicar o predecir una variable respuesta \(Y\) a partir de una variable explicativa \(X\).
Un grupo de investigadores desea estudiar la posible relación entre las horas promedio de sueño nocturno y un puntaje de bienestar psicológico en estudiantes universitarios.
Para fines didácticos utilizaremos la siguiente muestra:
psicologia <- data.frame(
Sueno = c(4.0, 4.5, 5.0, 5.2, 5.8, 6.0,
6.3, 6.7, 7.0, 7.4, 7.8, 8.0),
Bienestar = c(45, 48, 49, 54, 56, 58,
61, 62, 66, 69, 72, 74)
)
psicologia
¿Qué relación lineal existe entre las horas de sueño y el bienestar psicológico de los estudiantes y qué modelo permite estimar el bienestar a partir de las horas de sueño?
Analizar mediante correlación y regresión lineal simple la relación entre las horas de sueño y el bienestar psicológico, evaluar el ajuste del modelo y verificar sus principales supuestos.
Definimos:
\[ \boxed{ X=\text{horas de sueño} } \]
como variable explicativa.
Y:
\[ \boxed{ Y=\text{puntaje de bienestar psicológico} } \]
como variable respuesta.
Antes de construir cualquier modelo debemos observar la relación entre las variables.
library(ggplot2)
ggplot(
psicologia,
aes(
x = Sueno,
y = Bienestar
)
) +
geom_point(size = 3) +
labs(
title = "Horas de sueño y bienestar psicológico",
x = "Horas de sueño",
y = "Bienestar psicológico"
) +
theme_minimal()
El diagrama permite observar:
El coeficiente de correlación de Pearson se define como:
\[ \boxed{ r= \frac{ \sum_{i=1}^{n} (x_i-\bar{x})(y_i-\bar{y}) }{ \sqrt{ \sum_{i=1}^{n}(x_i-\bar{x})^2 \sum_{i=1}^{n}(y_i-\bar{y})^2 } } } \]
y cumple:
\[ -1\leq r\leq1. \]
cor(
psicologia$Sueno,
psicologia$Bienestar
)
## [1] 0.9934627
Para realizar inferencia:
cor.test(
psicologia$Sueno,
psicologia$Bienestar
)
##
## Pearson's product-moment correlation
##
## data: psicologia$Sueno and psicologia$Bienestar
## t = 27.52, df = 10, p-value = 9.3e-11
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.9760637 0.9982260
## sample estimates:
## cor
## 0.9934627
El modelo poblacional es:
\[ \boxed{ Y_i= \beta_0+ \beta_1X_i+ \varepsilon_i } \]
donde:
Como \(\beta_0\) y \(\beta_1\) son desconocidos, utilizaremos la muestra para estimarlos.
La recta estimada será:
\[ \boxed{ \hat Y_i= b_0+b_1X_i } \]
Para cada observación tenemos un valor observado:
\[ y_i \]
y un valor estimado:
\[ \hat y_i=b_0+b_1x_i. \]
La diferencia es el residuo:
\[ \boxed{ e_i= y_i-\hat y_i } \]
Por tanto:
\[ \boxed{ e_i= y_i-b_0-b_1x_i } \]
El método de mínimos cuadrados busca minimizar:
\[ \boxed{ S(b_0,b_1) = \sum_{i=1}^{n} (y_i-b_0-b_1x_i)^2 } \]
Es decir:
\[ \boxed{ \min_{b_0,b_1} \sum_{i=1}^{n} (y_i-b_0-b_1x_i)^2 } \]
Derivamos:
\[ \frac{\partial S}{\partial b_0} = -2 \sum_{i=1}^{n} (y_i-b_0-b_1x_i). \]
Para encontrar el mínimo igualamos a cero:
\[ -2 \sum_{i=1}^{n} (y_i-b_0-b_1x_i)=0. \]
Entonces:
\[ \sum y_i - nb_0 - b_1\sum x_i = 0. \]
Por tanto:
\[ \boxed{ \sum y_i = nb_0+b_1\sum x_i } \]
Dividiendo entre \(n\):
\[ \bar y=b_0+b_1\bar x. \]
Despejando:
\[ \boxed{ b_0= \bar y-b_1\bar x } \]
Derivamos:
\[ \frac{\partial S}{\partial b_1} = -2 \sum_{i=1}^{n} x_i (y_i-b_0-b_1x_i). \]
Igualamos a cero:
\[ \sum_{i=1}^{n} x_i (y_i-b_0-b_1x_i) = 0. \]
Desarrollando:
\[ \sum x_iy_i - b_0\sum x_i - b_1\sum x_i^2 = 0. \]
Por tanto:
\[ \boxed{ \sum x_iy_i = b_0\sum x_i + b_1\sum x_i^2 } \]
Tenemos el sistema:
\[ \boxed{ \begin{aligned} \sum y_i &= nb_0+b_1\sum x_i, \\ \sum x_iy_i &= b_0\sum x_i+b_1\sum x_i^2. \end{aligned} } \]
Al resolverlo obtenemos:
\[ \boxed{ b_1= \frac{ \sum(x_i-\bar{x})(y_i-\bar{y}) }{ \sum(x_i-\bar{x})^2 } } \]
y:
\[ \boxed{ b_0= \bar y-b_1\bar x } \]
Primero calcularemos los valores necesarios mediante R, para luego reproducir matemáticamente el procedimiento.
Tenemos:
\[ n=12 \]
\[ \bar{x}=6.142 \]
y:
\[ \bar{y}=59.5. \]
Además:
\[ S_{XX} = \sum(x_i-\bar{x})^2 = 18.4692 \]
y:
\[ S_{XY} = \sum(x_i-\bar{x})(y_i-\bar{y}) = 135.35. \]
Utilizamos:
\[ b_1= \frac{S_{XY}}{S_{XX}}. \]
Entonces:
\[ b_1= \frac{ 135.35 }{ 18.4692 }. \]
Por tanto:
\[ \boxed{ b_1=7.3284 } \]
Utilizamos:
\[ b_0= \bar y-b_1\bar x. \]
Sustituyendo:
\[ b_0= 59.5 - (7.3284) (6.142). \]
Por tanto:
\[ \boxed{ b_0=14.4912 } \]
La recta estimada es:
\[ \boxed{ \hat Y= 14.4912 + 7.3284X } \]
La pendiente estimada es:
\[ b_1=7.3284. \]
Por tanto, dentro del rango de datos estudiado, por cada hora adicional de sueño, el modelo estima un cambio promedio de aproximadamente:
\[ \boxed{ 7.33 \text{ puntos} } \]
en el puntaje de bienestar psicológico.
El intercepto es:
\[ b_0=14.4912. \]
Matemáticamente corresponde al bienestar estimado cuando:
\[ X=0. \]
Sin embargo, como cero horas de sueño se encuentra fuera del rango de la muestra, su interpretación psicológica debe realizarse con precaución.
lm()Ahora estimamos el mismo modelo directamente mediante R:
modelo <- lm(
Bienestar ~ Sueno,
data = psicologia
)
modelo
##
## Call:
## lm(formula = Bienestar ~ Sueno, data = psicologia)
##
## Coefficients:
## (Intercept) Sueno
## 14.491 7.328
Los coeficientes pueden obtenerse mediante:
coef(modelo)
## (Intercept) Sueno
## 14.49122 7.32843
Deben coincidir, salvo redondeo, con los calculados matemáticamente.
ggplot(
psicologia,
aes(
x = Sueno,
y = Bienestar
)
) +
geom_point(size = 3) +
geom_smooth(
method = "lm",
se = FALSE
) +
labs(
title = "Modelo de regresión lineal",
x = "Horas de sueño",
y = "Bienestar psicológico"
) +
theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'
Un valor ajustado es:
\[ \hat y_i= b_0+b_1x_i. \]
El residuo es:
\[ \boxed{ e_i= y_i-\hat y_i } \]
En R:
psicologia$Ajustado <- fitted(modelo)
psicologia$Residuo <- residuals(modelo)
psicologia
Definimos la variabilidad total:
\[ \boxed{ SST= \sum(y_i-\bar y)^2 } \]
y el error del modelo:
\[ \boxed{ SSE= \sum(y_i-\hat y_i)^2 } \]
Calculamos:
Por tanto:
\[ SST=1005 \]
y:
\[ SSE=13.097. \]
El coeficiente de determinación es:
\[ \boxed{ R^2= 1-\frac{SSE}{SST} } \]
Entonces:
\[ R^2 = 1- \frac{ 13.097 }{ 1005 }. \]
Por tanto:
\[ \boxed{ R^2=0.987 } \]
En porcentaje:
\[ \boxed{ R^2=98.7\% } \]
Aproximadamente:
\[ \boxed{ 98.7\% } \]
de la variabilidad observada en el bienestar psicológico de esta muestra es explicada por la relación lineal con las horas de sueño.
Un \(R^2\) elevado no demuestra causalidad ni garantiza que todos los supuestos del modelo se cumplan.
summary(modelo)
##
## Call:
## lm(formula = Bienestar ~ Sueno, data = psicologia)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2.1334 -0.5954 0.3090 0.6185 1.4009
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 14.4912 1.6685 8.685 5.69e-06 ***
## Sueno 7.3284 0.2663 27.520 9.30e-11 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.144 on 10 degrees of freedom
## Multiple R-squared: 0.987, Adjusted R-squared: 0.9857
## F-statistic: 757.4 on 1 and 10 DF, p-value: 9.3e-11
La salida presenta:
Deseamos determinar si existe evidencia estadística de una relación lineal entre \(X\) y \(Y\).
Planteamos:
\[ \boxed{ H_0:\beta_1=0 } \]
frente a:
\[ \boxed{ H_1:\beta_1\neq0 } \]
Si:
\[ p\text{-valor}<0.05, \]
rechazamos \(H_0\).
En R:
confint(
modelo,
level = 0.95
)
## 2.5 % 97.5 %
## (Intercept) 10.77352 18.208925
## Sueno 6.73509 7.921771
Si el intervalo correspondiente a \(\beta_1\) no contiene:
\[ 0, \]
la conclusión será coherente con el rechazo de:
\[ H_0:\beta_1=0. \]
Antes de utilizar la regresión para realizar inferencia debemos revisar:
R permite obtener los principales gráficos mediante:
par(
mfrow = c(2,2)
)
plot(modelo)
par(
mfrow = c(1,1)
)
Los gráficos son:
plot(
modelo,
which = 1
)
Esperamos observar:
Una nube aproximadamente aleatoria favorece el supuesto de linealidad.
plot(
modelo,
which = 2
)
Esperamos que los puntos se encuentren aproximadamente próximos a la línea diagonal.
Desviaciones fuertes pueden indicar que la distribución de los errores se aleja de la Normal.
plot(
modelo,
which = 3
)
La homocedasticidad supone:
\[ \boxed{ \operatorname{Var}(\varepsilon_i\mid X_i) = \sigma^2 } \]
Esperamos una dispersión relativamente uniforme.
Una forma de embudo puede sugerir heterocedasticidad.
plot(
modelo,
which = 5
)
Se deben identificar posibles observaciones con:
Una observación influyente no debe eliminarse automáticamente. Primero debe investigarse su origen.
La independencia depende principalmente del diseño de recolección de los datos.
Cuando existe un orden natural de las observaciones puede analizarse:
plot(
seq_along(residuals(modelo)),
residuals(modelo),
type = "b",
xlab = "Orden de observación",
ylab = "Residuo"
)
abline(
h = 0,
lty = 2
)
Buscamos ausencia de patrones sistemáticos.
Suponga que deseamos estimar el bienestar para:
\[ X=6.5 \]
horas de sueño.
Matemáticamente:
\[ \hat Y= b_0+b_1(6.5). \]
En R:
predict(
modelo,
newdata = data.frame(
Sueno = 6.5
)
)
## 1
## 62.12602
Si queremos estimar el bienestar promedio de estudiantes que duermen 6.5 horas:
predict(
modelo,
newdata = data.frame(
Sueno = 6.5
),
interval = "confidence",
level = 0.95
)
## fit lwr upr
## 1 62.12602 61.35983 62.89221
Si queremos predecir el bienestar de un estudiante individual que duerme 6.5 horas:
predict(
modelo,
newdata = data.frame(
Sueno = 6.5
),
interval = "prediction",
level = 0.95
)
## fit lwr upr
## 1 62.12602 59.46347 64.78857
El intervalo de predicción individual suele ser más amplio que el intervalo para la media porque incorpora además la variabilidad individual.
Aunque encontremos:
\[ r\neq0 \]
o:
\[ \beta_1\neq0, \]
no podemos concluir automáticamente:
\[ X\longrightarrow Y. \]
La asociación puede estar influida por:
\[ \boxed{ \text{Pregunta problema} \rightarrow X,Y \rightarrow \text{Dispersión} \rightarrow r \rightarrow \text{Mínimos cuadrados} \rightarrow \hat Y } \]
\[ \boxed{ \hat Y \rightarrow R^2 \rightarrow H_0:\beta_1=0 \rightarrow \text{Residuos} \rightarrow \text{Supuestos} \rightarrow \text{Predicción} } \]
Valor: 20 % del Cuarto Corte.
Cada grupo deberá utilizar la base correspondiente al contexto de su programa.
Student Mental Health Survey - Cleaned / Scaled
https://www.kaggle.com/datasets/avinashbunga/student-mental-health-survey-cleaned-scaled
La base contiene información relacionada con bienestar académico, emocional y psicológico de estudiantes.
Global Democracy Index
https://www.kaggle.com/datasets/umitka/global-democracy-index
Variables especialmente útiles:
score_2018;score_2022.Una posible pregunta es:
¿Qué relación existe entre el nivel de democracia registrado en 2018 y el observado en 2022 en los países incluidos en la base?
MLOps Dataset
https://www.kaggle.com/datasets/daniilkrizhanovskyi/mlops-dataset
Variables disponibles incluyen:
learning_rate;batch_size;epochs;accuracy;precision;recall;f1_score;training_time_minutes.Una posible pregunta es:
¿Qué relación existe entre el número de épocas y el tiempo de entrenamiento de los modelos?
Aplicar técnicas de correlación y regresión lineal simple para analizar la relación entre dos variables cuantitativas en un contexto aplicado.
El análisis deberá combinar:
El taller deberá realizarse en grupos de tres estudiantes.
Todos los integrantes deberán:
Incluya:
Máximo 250 palabras.
Debe contener:
Incluya entre 3 y 5 palabras clave.
Incluya:
Debe utilizar al menos cinco referencias académicas, de las cuales como mínimo tres deberán ser artículos, libros o documentos técnicos.
Explique:
Describa:
Revise:
dim(datos)
names(datos)
str(datos)
summary(datos)
colSums(is.na(datos))
No elimine datos sin justificación.
Formule una pregunta que relacione dos variables cuantitativas.
Identifique:
\[ \boxed{ X=\text{variable explicativa} } \]
y:
\[ \boxed{ Y=\text{variable respuesta} } \]
Construya:
ggplot(
datos,
aes(
x = X,
y = Y
)
) +
geom_point() +
theme_minimal()
Interprete:
Calcule:
cor(
datos$X,
datos$Y,
use = "complete.obs"
)
y:
cor.test(
datos$X,
datos$Y
)
Interprete \(r\) y el valor-\(p\).
Plantee:
\[ Y_i= \beta_0+ \beta_1X_i+ \varepsilon_i. \]
Parta de:
\[ S(b_0,b_1) = \sum (y_i-b_0-b_1x_i)^2. \]
Muestre las derivadas:
\[ \frac{\partial S}{\partial b_0}=0 \]
y:
\[ \frac{\partial S}{\partial b_1}=0. \]
Obtenga:
\[ \boxed{ b_1= \frac{ \sum(x_i-\bar{x})(y_i-\bar{y}) }{ \sum(x_i-\bar{x})^2 } } \]
y:
\[ \boxed{ b_0= \bar y-b_1\bar x. } \]
Calcule:
\[ \bar{x}, \qquad \bar{y}, \qquad S_{XX}, \qquad S_{XY}. \]
Posteriormente:
\[ b_1= \frac{S_{XY}}{S_{XX}} \]
y:
\[ b_0= \bar y-b_1\bar x. \]
Escriba finalmente:
\[ \boxed{ \hat Y=b_0+b_1X } \]
modelo <- lm(
Y ~ X,
data = datos
)
summary(modelo)
Compare los resultados con los cálculos manuales.
Interprete:
\[ b_0 \]
y:
\[ b_1. \]
La pendiente deberá interpretarse utilizando las unidades reales de las variables.
Calcule:
\[ SST = \sum(y_i-\bar y)^2 \]
\[ SSE = \sum(y_i-\hat y_i)^2 \]
y:
\[ \boxed{ R^2= 1-\frac{SSE}{SST} } \]
Compare con:
summary(modelo)$r.squared
Plantee:
\[ H_0:\beta_1=0 \]
frente a:
\[ H_1:\beta_1\neq0. \]
Use:
\[ \alpha=0.05. \]
Interprete el valor-\(p\) obtenido en:
summary(modelo)
Obtenga:
confint(
modelo,
level = 0.95
)
Analice especialmente el intervalo para:
\[ \beta_1. \]
Ejecute:
par(
mfrow = c(2,2)
)
plot(modelo)
par(
mfrow = c(1,1)
)
Analice:
plot(
modelo,
which = 1
)
Determine si existen:
Analice:
plot(
modelo,
which = 2
)
Determine si los residuos siguen aproximadamente la línea de referencia.
Analice:
plot(
modelo,
which = 3
)
Determine si la dispersión permanece aproximadamente constante.
Analice:
plot(
modelo,
which = 5
)
Revise:
Incluya:
| Supuesto | Gráfico o evidencia | Interpretación | ¿Se cumple? |
|---|---|---|---|
| Linealidad | Residuals vs Fitted | … | Sí/No |
| Independencia | Diseño/orden | … | Sí/No |
| Normalidad | Q-Q | … | Sí/No |
| Homocedasticidad | Scale-Location | … | Sí/No |
| Influencia | Leverage/Cook | … | Sí/No |
Seleccione un valor de \(X\) dentro del rango observado.
Realice manualmente:
\[ \hat Y= b_0+b_1X. \]
Compruebe en R:
predict(
modelo,
newdata = data.frame(
X = valor
)
)
Discuta:
Presente entre 3 y 5 conclusiones.
Deben responder:
Utilice normas APA, última edición.
Incluya:
| Aspecto | Información |
|---|---|
| Uso de IA | Sí/No |
| Herramienta | … |
| Finalidad | … |
| Porcentaje estimado | … |
Cada grupo deberá entregar:
.Rmd;Organice todo en:
Taller_4_Grupo_03/
│
├── Taller_4_Grupo_03.Rmd
├── Taller_4_Grupo_03.html
├── Taller_4_Grupo_03.pdf
│
├── datos/
│ └── base_datos.csv
│
└── figuras/
| Criterio | Puntaje |
|---|---|
| Introducción, contexto y pregunta | 10 |
| Marco teórico | 10 |
| Metodología | 10 |
| Correlación y análisis gráfico | 10 |
| Estimación matemática de la regresión | 15 |
| Modelo, \(R^2\) e inferencia | 15 |
| Diagnóstico de supuestos | 15 |
| Interpretación y discusión | 5 |
| Conclusiones | 5 |
| Presentación y reproducibilidad | 5 |
| Total | 100 |
La nota definitiva será:
\[ \boxed{ \text{Nota definitiva} = 0.05 \times \text{Puntaje total} } \]
Verifique:
Ruta del Cuarto Corte:
\[ \boxed{ \text{Pregunta} \rightarrow (X,Y) \rightarrow \text{Dispersión} \rightarrow r \rightarrow \text{Regresión} \rightarrow R^2 } \]
\[ \boxed{ R^2 \rightarrow \text{Inferencia} \rightarrow \text{Supuestos} \rightarrow \text{Predicción} \rightarrow \text{Conclusión} } \]