library(ggplot2)
library(dplyr)
##
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library (descriptr)
library(readxl)
El presente estudio documenta un análisis estadístico descriptivo de un conjunto de 1000 registros y 8 variables, en donde se exponen los cálculos y procedimientos utilizados para el análisis y desarrollo del cuestionario de estadística descriptiva. Además, es importante señalar que, para el desarrollo de este estudio, se abordó la totalidad de la base de B_E_D, por lo que no se consideró pertinente la aplicación de funciones de muestreo como sample.
En primer lugar se guarda la base de B_E_D en una variable fácil de usar: B_E_D va a ser el nombre de la base de B_E_D a o largo del todo el trabajo
B_E_D <- read_excel("C:/Users/VISWANATHANARUNACHAL/Downloads/Base_Estadistica_Descriptiva.xlsx")
# Tabla de frecuencias y proporciones
tabla_frecuencia <- B_E_D %>%
group_by(NivelEducativo) %>%
summarise(Frecuencia = n()) %>%
mutate(Proporcion = Frecuencia / sum(Frecuencia))
# Mostrar la tabla
print(tabla_frecuencia)
## # A tibble: 4 × 3
## NivelEducativo Frecuencia Proporcion
## <chr> <int> <dbl>
## 1 Primaria 229 0.229
## 2 Secundaria 288 0.288
## 3 Técnico 231 0.231
## 4 Universitario 252 0.252
# Gráfico de barras
ggplot(tabla_frecuencia, aes(x = NivelEducativo, y = Proporcion, fill = NivelEducativo)) +
geom_bar(stat = "identity") +
scale_y_continuous(labels = scales::percent_format()) +
labs(title = "Proporción de Estudiantes por Nivel Educativo",
x = "Nivel Educativo",
y = "Proporción") +
theme_minimal()
En la grafica de barras realizada de la proporción de estudiantes dependiendo de cada nivel académico se evidencio una distribución uniforme y equilibrada en los distintos niveles (primaria, secundaria, técnico y universitario), Mas sin embargo se demostró que predomina el nivel de secundaria con la mayor cantidad de estudiantes, seguido de universitarios uy luego técnicos, lo cual sugiere que en la prueba muestral hay una población estudiantil diversa con trayectorias educativas diferentes.
# Calcular frecuencias y porcentajes
tabla_genero <- B_E_D %>%
count(Genero) %>% # Contar por género
mutate(
Porcentaje = n / sum(n) * 100, # Calcular porcentaje
Etiqueta = paste0(Genero, "\n", round(Porcentaje, 1), "%") # Crear etiquetas
)
# Mostrar tabla de resultados
print(tabla_genero)
## # A tibble: 3 × 4
## Genero n Porcentaje Etiqueta
## <chr> <int> <dbl> <chr>
## 1 Femenino 306 30.6 "Femenino\n30.6%"
## 2 Masculino 339 33.9 "Masculino\n33.9%"
## 3 Otro 355 35.5 "Otro\n35.5%"
# Crear gráfico de pastel
ggplot(tabla_genero, aes(x = "", y = Porcentaje, fill = Genero)) +
geom_bar(stat = "identity", width = 1, color = "white") +
coord_polar("y", start = 0) + # Convertir a coordenadas polares (pastel)
geom_text(aes(label = Etiqueta),
position = position_stack(vjust = 0.5),
size = 4, color = "black") +
scale_fill_brewer(palette = "Set2") + # Paleta de colores
labs(
title = "Distribución por Género",
fill = "Género",
x = NULL,
y = NULL
) +
theme_void() + # Eliminar elementos no esenciales
theme(legend.position = "none") # Ocultar leyena
En el diagrama de pastel se observa una distribución equilibrada entre las tres categorías de género: masculino, femenino y otro. La diferencia entre la proporción más alta y la más baja no supera el 4.9%, lo que indica una representación bastante uniforme. El grupo con mayor participación es el identificado como “Otro” (35.5%), seguido de “Masculino” (33.9%) y finalmente “Femenino” (30.6%). Esta distribución sugiere que en esta muestra de estudiantes no existe una concentración marcada por género. Por el contrario, la similitud en los porcentajes evidencia una representación equitativa de los distintos géneros.
# Calcular estadísticos descriptivos
tabla_edad <- B_E_D %>%
summarise(
Media = mean(Edad, na.rm = TRUE), # Media aritmética
Mediana = median(Edad, na.rm = TRUE), # Mediana
Desviacion_Estandar = sd(Edad, na.rm = TRUE) # Desviación estándar
)
# Mostrar resultados
print(tabla_edad)
## # A tibble: 1 × 3
## Media Mediana Desviacion_Estandar
## <dbl> <dbl> <dbl>
## 1 41.5 41 13.7
# Visualización con histograma para mejor analisis
# Este no lo pide el ejercicio del parcial pero lo veo conveniente para mejor visualisacion
title = "Distribución de Edades";
#Histograma con ajustes automáticos
ggplot(B_E_D, aes(x = Edad)) +
geom_histogram(binwidth = 5, fill = "steelblue2", color = "white", alpha = 0.8) +
labs(title = "Distribución de Edades",
x = "Edad (años)",
y = "Frecuencia") +
theme_minimal()
A continuación se muestra el código para el diagrama de Barras:
#De la base de B_E_D se saca los B_E_D que se quieren.
#Table lo converite en tabla
#La parte B_E_D$$Hermanos nos ubica en la columna de Hermanos
#[B_E_D$Hermanos > 3] es la función lógica que solo permita los B_E_D que cumplen la condición
hermanos_mayor3 <- table(B_E_D$Hermanos[B_E_D$Hermanos > 3])
#Se convierte en Dataframe para ser leído por ggplot
hermanos_mayor3_df <- as.data.frame(hermanos_mayor3)
#Se le asignan los nombres al data frame, por default esta: Var1, freq
colnames(hermanos_mayor3_df) <- c("Hermanos", "Frecuencia")
#Creación y customización del diagrama de Barras
diag_barra = ggplot(hermanos_mayor3_df, aes(x=Hermanos, y=Frecuencia,fill= Hermanos)) + geom_bar(stat="identity") + ylim(c(0,160)) + geom_text(aes(label = Frecuencia), vjust = 2, colour = "black") + scale_fill_manual(values = c("#FFD700", "#228B22", "#00BFFF")) + theme(legend.position = "bottom") +guides(fill = guide_legend(title = "Cantidad de Hermanos")) + labs( title = "Diagrama de Barras de número de personas con más de 3 hermanos", x = "Cantidad de Hermanos", y = "Frecuencia")
diag_barra
En el diagrama de barras se evidencia que coincidentemente, el número de
personas con 4 hermanos es el mismo que el número de personas con 5
hermanos.Sumando los valores de las barras y sabiendo que en total hay
1000 personas,se dice que: \[\frac{138+138+154}{1000}\times100=43\%\]
El número de personas con mas de 3 hermanos conforma el 43% de los
encuestados.
La respuesta es el siguiente código:
#Cálculo del rango del ingreso mensual
rango_IngresoMensual = range(B_E_D$IngresoMensual, na.rm=FALSE)
paste("El rango del ingreso mensual es de:",round(rango_IngresoMensual[1],3),"a",round(rango_IngresoMensual[2],3))
## [1] "El rango del ingreso mensual es de: -509.91 a 4756.79"
#Cálculo de la varianza del ingreso mensual
varianza_IngresoMensual = round(var(B_E_D$IngresoMensual),5)
paste("La varianza del ingreso mensual es de:",round(varianza_IngresoMensual,3))
## [1] "La varianza del ingreso mensual es de: 631117.321"
#Cálculo del coeficiente de varianza del ingreso mensual
coefvar_IngresoMensual = round(ds_cvar(B_E_D$IngresoMensual),5)
paste("El coeficiente de varianza del ingreso mensual es de:",round(coefvar_IngresoMensual,3))
## [1] "El coeficiente de varianza del ingreso mensual es de: 40.221"
La mejor medida para realizar un análisis de variabilidad mediantes solo los B_E_D es el coefienciente de varianza; este presenta un valor del 40%, valor que es bastante alto, lo que significa que los B_E_D estan dispersos de la media, por lo que usar la media como valor representativo de la población no es fiel a los B_E_D individualmente.
El código es para dibujar la distribución es:
Estatura = B_E_D$Estatura
#Se convierte en Dataframe para ser leído por ggplot
Estatura_df = data.frame("Estaturas"= Estatura)
#Se crea el diagrama de barras
ggplot(Estatura_df, aes(x = Estaturas)) +
geom_histogram(col="black",fill="#fe019a") + scale_x_continuous(breaks = seq(from = 1, to = 2.2, by = 0.1)) +
labs(title = "Distribución de la Altura (m)",x = "Altura (m)",y = "Frecuencia")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
A simple vista la distribución de las B_E_D aparenta ser períodica,
teniendo baajones cada 3 barras. Para una análisis mas detallado se va a
emplear las funciones de “skewness” y “kurtosis”, para obtener medidas
de asímetría y Curtosis:
Asímetria:
sesgo_altura = ds_skewness(Estatura);
paste("El nível de asímetria de altura es:",round(sesgo_altura,3))
## [1] "El nível de asímetria de altura es: -0.004"
El valor da negativo por lo que tiene cierta tendencia asimetrica hacia la izquierda, lo interesante es que el la magnitud es cercana a cero, lo que nos índica que tiene cierta simetría; simetría que se puede corrobarar por la o0bservación realizada, en donde se menciona que laa dsitribución tiene cierto parecido a una curva periodica cuadrada.
Curtosis:
Se cálcula la curtosis con el siguiente código:
curtosis_altura = ds_kurtosis(Estatura);
paste("El nível de curtosis de altura es:",round(curtosis_altura,3))
## [1] "El nível de curtosis de altura es: -1.199"
El valor es negativo por lo que se trata de un curtosis de tipo lplacicúrtica, lo que índica que la disrtibución de B_E_D es mas achatada en comparación a la campana de Gauss; forma que se confirma a simple vista al ver que la distriución es relativamente plana si se mira desde la frecuencia 50.
# Calcular las alturas promedio por género
promedio_altura <- B_E_D %>%
group_by(Genero) %>% #Agrupar por genero
summarise(Promedio_Estatura = mean(Estatura, na.rm = TRUE), # Promedio
Desviacion = sd(Estatura, na.rm = TRUE), # Desviacion
Minimo = min(Estatura, na.rm = TRUE), # Valor mínimo
Maximo = max(Estatura, na.rm = TRUE), # Valor máximo
n = n()
)
# Resultados
promedio_altura
## # A tibble: 3 × 6
## Genero Promedio_Estatura Desviacion Minimo Maximo n
## <chr> <dbl> <dbl> <dbl> <dbl> <int>
## 1 Femenino 1.75 0.143 1.5 1.99 306
## 2 Masculino 1.74 0.148 1.5 2 339
## 3 Otro 1.76 0.141 1.5 2 355
# Diagrama de barras
ggplot(promedio_altura, aes(x = Genero, y = Promedio_Estatura, fill = Genero)) +
geom_bar(stat = "identity") +
geom_errorbar(aes(ymin = Promedio_Estatura - Desviacion,
ymax = Promedio_Estatura + Desviacion),
width = 0.2) +
labs(title = "Altura Promedio Por Genero",
x = "Genero",
y = "Estatura Promedio (metros)") +
theme_minimal()
No existe una diferencia muy notoria en el promedio de las edades con
respecto al genero y esto se puede evidenciar en ell diagrama de
barras
# Calcular ingresos promedio por nivel educativo
ingresos_edu <- B_E_D %>%
group_by(NivelEducativo) %>%
summarise(Promedio_Ingreso = mean(IngresoMensual, na.rm = TRUE),
Desviacion = sd(IngresoMensual, na.rm = TRUE)) %>%
arrange(desc(Promedio_Ingreso))
# Resultados
ingresos_edu
## # A tibble: 4 × 3
## NivelEducativo Promedio_Ingreso Desviacion
## <chr> <dbl> <dbl>
## 1 Primaria 2037. 826.
## 2 Secundaria 2012. 788.
## 3 Universitario 1948. 745.
## 4 Técnico 1897. 820.
# Diagrama
ggplot(ingresos_edu, aes(x = reorder(NivelEducativo, -Promedio_Ingreso),
y = Promedio_Ingreso, fill = NivelEducativo)) +
geom_bar(stat = "identity") +
geom_errorbar(aes(ymin = Promedio_Ingreso - Desviacion,
ymax = Promedio_Ingreso + Desviacion),
width = 0.2) +
labs(title = "Ingresos Promedio por Nivel Educativo",
x = "Nivel Educativo",
y = "Ingreso Promedio") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 80, hjust = 1))
Al analizar la informacion sumistrada y utilizando de guia y por
practicidad el diagrama, se puede evidenciar que los ingresos mensuales
varian segun el nivel eeducativo y que la etapa en la cual se tiene
mayores ingresos promedio es en la primaria y va descendiendo en la
secundaria, Universitario y tecnico lo cual contradice el sentido
comun”.
# Calcular ingresos promedio por nivel educativo
ingresos_educacion <- B_E_D %>%
group_by(NivelEducativo) %>%
summarise(Prom_Ingreso = mean(IngresoMensual, na.rm = TRUE),
Desviacion = sd(IngresoMensual, na.rm = TRUE)) %>%
arrange(desc(Prom_Ingreso))
# Resultados
ingresos_educacion
## # A tibble: 4 × 3
## NivelEducativo Prom_Ingreso Desviacion
## <chr> <dbl> <dbl>
## 1 Primaria 2037. 826.
## 2 Secundaria 2012. 788.
## 3 Universitario 1948. 745.
## 4 Técnico 1897. 820.
# Diagrama
ggplot(ingresos_edu, aes(x = reorder(NivelEducativo, -Promedio_Ingreso),
y = Promedio_Ingreso, fill = NivelEducativo)) +
geom_bar(stat = "identity") + #Se Indica A "geom_bar" Que Use Los Valores Exactos De Los B_E_D
geom_errorbar(aes(ymin = Promedio_Ingreso - Desviacion,
ymax = Promedio_Ingreso + Desviacion),
width = 0.2) +
labs(title = "Ingresos Promedio Por Nivel Educativo",
x = "Nivel Educativo",
y = "Ingresos Promedio") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 60, hjust = 1))
En el diagrama que relaciona el nivel educativo con los ingresos
promedio, aclarando que el nivel educativo son los estudios que recibio
la persona y no tiene relacion con la edad, se puede evidenciar que
existe una tendencia decreciente de tipo inversa mostrando de esta
manera que las personas que solo estudiaron hasta primaria son los que
tienen mayores ingresos mensuales y esto se debe a que estas personas
comenzaron a trabajar desde corta edad y acumularon experiencia laboral
consiguiendo de esta manera que con el tiempo lograran obtener mejores
trabajos por las capacidades que obtuvieron a lo largo de la vida,
subsecuentemente siguen las personas que solo estudiaron hasta la
secundaria y con unos ingresos mensuales ligeramente menores al
anterior, siguen las personas que estudiaron en la universidad y un
tecnico que generan unos ingresos mensuales muy similares aunque menores
a los que estudiaron solo hasta primaria y secundaria, esto puede ser
debido a que las personas que tienen estos estudios no poseen mucha
experiencia laboral y por esos sus ingresos son menores.
No se observa una tendencia clara de que a mayor edad, mayor ingreso, o
cualquier tendencia fuerte, dado que en todas las edades hay personas
tanto con ingresos altos como bajos. No obstante, la mayoría de los
ingresos están concentrados entre $1000 y $4000.
Note that the echo = FALSE
parameter was added to the
code chunk to prevent printing of the R code that generated the
plot.
tabla_entrada_doble <- table(B_E_D$Genero,B_E_D$NivelEducativo)
tabla_entrada_doble #Imprimir la tabla
##
## Primaria Secundaria Técnico Universitario
## Femenino 72 88 71 75
## Masculino 74 93 82 90
## Otro 83 107 78 87
tabla_entrada_doble.sum <- addmargins(tabla_entrada_doble)
tabla_entrada_doble.sum
##
## Primaria Secundaria Técnico Universitario Sum
## Femenino 72 88 71 75 306
## Masculino 74 93 82 90 339
## Otro 83 107 78 87 355
## Sum 229 288 231 252 1000
Para construir esta tabla de doble entrada se usó la función table, la cual es ideal para crear una tabla de información conjunta, en este caso el genero y el nivel educativo, además se uso la función sum para poder analizar con mayor facilidad la relación entre el género y el nivel educativo
En términos del nivel educativo se observa que es más común la secundaria, con un total de 288 personas, seguido por el nivel universitario con 252, mientras que el nivel técnico y primaria presentan una frecuencia ligeramente menor y similar entre sí, con 231 y 229 respectivamente. Por otro lado, al observar la distribución por género, la categoría otro es la más numerosa en la muestra total con 355 personas, superando a la categoría de género masculino con 339 y Femenino con 306. Al analizar la distribución conjunta, se observa que la combinación más frecuente es la de individuos de género otro que han alcanzado el nivel de Secundaria con 107 personas que cumplen ambas clasificaciones, además, se notan otras combinaciones notables como 90 hombres con nivel universitario y 87 personas de género otro también con nivel universitario. Las frecuencias más bajas se encuentran entre las mujeres con nivel de primaria y técnico, que son 72 y 71 mujeres con estos niveles respectivamente.
personas_mas_2_hrms_ingreso_mayor_3000 <- subset(B_E_D, Hermanos > 2 & IngresoMensual > 3000)
personas_mas_2_hrms_ingreso_mayor_3000
## # A tibble: 53 × 8
## ID Genero NivelEducativo Edad Hermanos Estatura IngresoMensual
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl>
## 1 442099291 Femenino Secundaria 45 4 1.78 3635.
## 2 189241370 Femenino Universitario 40 4 1.77 3187.
## 3 547733721 Otro Primaria 34 6 1.78 3104.
## 4 706255831 Masculino Secundaria 23 6 1.87 3159.
## 5 452888736 Femenino Técnico 26 6 1.91 4377.
## 6 673622212 Femenino Primaria 33 6 1.52 3190.
## 7 748155711 Otro Técnico 52 6 1.87 3154.
## 8 452738391 Femenino Técnico 65 5 1.87 3141.
## 9 203859181 Femenino Primaria 52 6 1.68 3078.
## 10 141152119 Masculino Primaria 27 4 1.77 3040.
## # ℹ 43 more rows
## # ℹ 1 more variable: HorasDeTrabajo <dbl>
nrow(personas_mas_2_hrms_ingreso_mayor_3000) # nrow para hacer el conteo de filas
## [1] 53
#de las personas que cumplen las dos condiciones
proporcion <- (nrow(personas_mas_2_hrms_ingreso_mayor_3000)/1000)*100
cat("La proporción de personas con más de 2 hermanos que tienen un ingreso mensual superior a $3000 es:", proporcion,"%")
## La proporción de personas con más de 2 hermanos que tienen un ingreso mensual superior a $3000 es: 5.3 %
Mediante la función subset se extrajo un conjunto de B_E_D bjao unas condiciones. Para este caso, se toman aquellos individuos que tengan más de dos hermanos e ingresos superiores a $3000, para luego calcular su proporción con relación a todos los individuos, obteniendo una proporción del 5.3%
Para estudiar estas relaciones de mejor forma, se creará un diagrama de dispersión entre las variables con las que se notaron una mejor relación gráfica, de este modo, se considera el analisis entre las variables Horas de Trabajo y Estatura con la variable de Ingreso Mensual, ya en este punto no se considera la relación del Ingreso Mensual y el de la Edad debido a que, esta relación ya se desarrollo en el punto 10 de este trabajo y no se notó una relación clara o aparente.
La primera relación a analizar es entre la variable de Horas de trabajo e ingreso mensual, a través de un gráfico de dispersión:
ggplot(data = B_E_D)+
geom_point(aes(x = HorasDeTrabajo, y = IngresoMensual), color = "red")+
labs(
title = " Diagrama de dispersion Horas de Trabajo e Ingreso Mensual", x = "Horas de Trabajo", y = "Ingreso Mensual")+
theme(plot.title = element_text(hjust = 0.5, vjust = 1, size= 14, face = "bold"),
axis.title.x = element_text(face= "bold"),
axis.title.y = element_text(face = "bold"))+
theme(axis.line = element_line(color = "black",
linewidth = 0.5,
linetype = 1))
Se observa una distribución dispersa de los puntos, si bien existe una concentración de individuos trabajando entre 30 y 50 horas y sus ingresos mensuales varían desde niveles bajos hasta aproximadamente 4000.
Asimismo, se realizó una relación entre el ingreso mensual y la estatura. Para ello, también se crea un gráfico de dispersión que permita analizarlo.
ggplot(data = B_E_D)+
geom_point(aes(x = Estatura, y = IngresoMensual), color = "yellow")+
labs(
title = " Diagrama de dispersion Estatura e Ingreso Mensual", x = "Estatura", y = "Ingreso Mensual")+
theme(plot.title = element_text(hjust = 0.5, vjust = 1, size= 14, face = "bold"),
axis.title.x = element_text(face= "bold"),
axis.title.y = element_text(face = "bold"))+
theme(axis.line = element_line(color = "black",
linewidth = 0.5,
linetype = 1))
La distribución de los puntos muestra una ausencia casi total de correlación lineal entre estas dos variables, debido a que los ingresos mensuales se dispersan ampliamente en todo el rango de estaturas observadas, desde aproximadamente 500 hasta 4500, sin mostrar una tendencia ascendente o descendente clara a medida que la estatura aumenta o en alguna zona concentrada.
Luego de obtener las gráficas de dispersión para el ingreso mensual respecto a las variables horas de trabajo y estatura, se observa una mayor relación entre la variable de ingreso mensual y horas de trabajo, en una zona especifica de la gráfica.
Para tratar de predecir la estatura de una persona basándonos en una variable diferente al género y teniendo en cuenta que las variables disponibles son el nivel educativo, los hermanos, el ingreso mensual y las horas de trabajo, la variable que tiene mayor relación con la estatura es la de la edad. Esto debido a que la estatura se puede categorizar dependiendo de la edad de la persona teniendo como referencia que entre los 6 a 12 años los niños pueden tener una estatura entre 1.15 m y 1.50 metros desde los 12 hasta los 22 años que es la etapa de crecimiento de una persona el rango de la estatura puede llegar a ser desde los 1.50 hasta 1.80 posteriormente a esto se tiene comprobado científicamente que el crecimiento se detiene y las personas entre los 22 años hasta los 50 años pueden conservar la misma estatura o decrecer, ulteriormente después de los 50 años hasta los 60 que es la etapa de la vejez esa estatura puede llegar a disminuir hasta hasta 1.50 e inclusivemente más que eso.
Nelamali, N. (2024, May 30). R Subset multiple conditions. Spark by {Examples}. https://sparkbyexamples.com/r-programming/r-subset-multiple-conditions/
Rcoder. (2024, March 14). Subset en R. RCODER. https://r-coder.com/subset-en-r/
Coder, R. (2024, January 5). Títulos, etiquetas, marcas, límites y escalas de los ejes en ggplot2. R CHARTS | Una Colección De Gráficos Hechos Con El Lenguaje De Programación R. https://r-charts.com/es/ggplot2/ejes/#titulos
“Gráfico de barras en ggplot2 con geom_bar y geom_col,” R CHARTS | Una colección de gráficos hechos con el lenguaje de programación R, Apr. 14, 2022. https://r-charts.com/es/ranking/grafico-barras-ggplot2/ (accessed May, 2025).
Drawing Distributions, “Create Beautiful Histograms in R with ggplot2 | Data Visualisation,” YouTube, May 02, 2025. https://www.youtube.com/watch?v=bBVWZYyOF9E&list=PLI46D-hT1ZN1IwUel6OA_nnhUd2A8qfaG&index=24 (accessed May, 2025).
Uso de IA para consultas de errores en el código, ayuda en ciertos análisis y obtención de cierto B_E_D puntuales.