#cargamos la librerias
library(dplyr)
library(descriptr)
library(ggplot2)
library(datos)
library(plotrix)
library(readxl)
library(knitr)
library(modeest)
library(moments)
library(flextable)
vamos a llamar el chunk que lee el excel que contiene la base de datos
# La función read_excel lee el archivo en la ruta especificada
Base_Estadistica_Descriptiva <- read_excel("C:\\Users\\kashi\\Downloads\\Base_Estadistica_Descriptiva.xlsx")
datos.estu <-Base_Estadistica_Descriptiva
set.seed(0439)#platamos la semilla con los dos ultimos digitos de identificacion de los integrantes
datos.m <- sample_n(Base_Estadistica_Descriptiva,size = 500,replace = FALSE)#creamos una muestra con un tamaño de 500 datos para evitar que utilice los 1000 que tiene la base de datos
datos.m <- datos.m %>%
rename(Sexo = Genero)
¿Cual es la proporcion de estudiantes por cada nivel educativo?
Fórmula de Proporcionalidad:
La proporción de una categoría específica se calcula dividiendo la frecuencia (o conteo) de esa categoría entre el total de observaciones.
La fórmula general es: \[ proporcion= \frac{\text{Frecuencia de la Categoría}}{\text{Frecuencia Total}}\] en este caso seria: \[ proporcion.de.nivel.educativo= \frac{\text{numero de estudiantes en el nivel}}{\text{numero total de estudiantes}}\] ejemplo: \[ primaria= \frac{\text{118 estudiantes}}{\text{500 estudiantes}}=0.236\]
para obtener la proporcion de estudiantes utilizamos el siguiente codigo:
proporciones_niveles <- Base_Estadistica_Descriptiva %>%
# El operador %>% conecta la base de datos con la primera función
group_by(NivelEducativo) %>%
summarise(Conteo = n()) %>%
# El total se calcula automáticamente con sum(Conteo)
mutate(Proporcion = Conteo / sum(Conteo)) %>%
# Opcional: para mostrarlo como porcentaje
mutate(Porcentaje = paste0(round(Proporcion * 100, 2), "%"))
#este kable es de la libreria knitr sirve para que la tabla que arroja nuestro codigo de proporciones se vea mas estetico
kable(
proporciones_niveles,
caption = " Tabla de frecuencia :Proporción de Estudiantes por Nivel Educativo", # Título
align = c('l', 'r', 'r', 'r'), # Alineación de columnas: izquierda y derechas
digits = 3 # Número de decimales para las columnas numéricas
)
| NivelEducativo | Conteo | Proporcion | Porcentaje |
|---|---|---|---|
| Primaria | 229 | 0.229 | 22.9% |
| Secundaria | 288 | 0.288 | 28.8% |
| Técnico | 231 | 0.231 | 23.1% |
| Universitario | 252 | 0.252 | 25.2% |
en la anterior tabla de frecuencia de proporciones contiene los valores que necesitabamos saber respecto a la cantidad de estudiantes con diferentes tipos de nivel educativo.
ggplot(data = datos.m, aes(x = NivelEducativo)) +
geom_bar(fill = rainbow(n=4)) #manda a cada nivel un color distinto
labs(
title = "Distribución por Nivel Educativo",
x = "Nivel",
y = "Conteo"
) +
theme_bw() # Un tema blanco y negro, muy limpio
## NULL
tabla_sexo_NivelEDU <- datos.m %>%
# Cruza y cuenta las combinaciones de Nivel Educativo y Sexo
count(NivelEducativo, Sexo, name = "Frecuencia_Absoluta") %>%
# Calcula el porcentaje de cada combinación sobre el total general
mutate(
Porcentaje_Global = Frecuencia_Absoluta / sum(Frecuencia_Absoluta) * 100,
# Formatea el porcentaje para la tabla
Porcentaje_Global = paste0(round(Porcentaje_Global, 2), "%")
)
# 2. Muestra la tabla formateada con kable()
kable(
tabla_sexo_NivelEDU,
caption = "Frecuencia de Estudiantes por Sexo y Nivel Educativo",
digits = 2,
align = c('l', 'l', 'r', 'r'),
col.names = c("Nivel Educativo", "Sexo", "Conteo (n)", "Porcentaje Global (%)")
)
| Nivel Educativo | Sexo | Conteo (n) | Porcentaje Global (%) |
|---|---|---|---|
| Primaria | Femenino | 38 | 7.6% |
| Primaria | Masculino | 35 | 7% |
| Primaria | Otro | 45 | 9% |
| Secundaria | Femenino | 46 | 9.2% |
| Secundaria | Masculino | 52 | 10.4% |
| Secundaria | Otro | 51 | 10.2% |
| Técnico | Femenino | 31 | 6.2% |
| Técnico | Masculino | 37 | 7.4% |
| Técnico | Otro | 41 | 8.2% |
| Universitario | Femenino | 34 | 6.8% |
| Universitario | Masculino | 47 | 9.4% |
| Universitario | Otro | 43 | 8.6% |
El analisis matematico detras del grafico es el siguiente: \[\frac{\text{frecuencia(nivel)}}{\text{numero total de estudiantes(nivel)}}*100 \] para el grafico de pastel de primaria donde \(f:femenino\) ,\(m:masculino\) ,\(o:otro\)
logica: \[total primaria=38f +35m+45o=118\\Femenino: \frac{38}{118}*100=32.2\%\\Masculino:\frac{35}{118}*100=29.7\\Otro:\frac{45}{118}*100=38.1\%\\suma\%:38.1+29.7+32.2=100\%\\100\%=grafico.pastel \]
n_primaria <- c(38, 35, 45)
categorias_sexo <- c("Femenino", "Masculino", "Otro")
porcentajes <- round(n_primaria / sum(n_primaria) * 100, 1)
etiquetas_pastel <- paste(categorias_sexo, "\n(", porcentajes, "%)", sep="")
colores=c("pink","skyblue","green")
pie(
n_primaria,
labels = etiquetas_pastel,
main = "Distribucion por Sexo - Nivel Primaria (Total N=118)",
col = colores
)
logica \[ \text{Total Secundaria}=46f +52m+51o=149\\Femenino: \frac{46}{149}*100\approx30.9\%\\Masculino:\frac{52}{149}*100\approx34.9\%\\Otro:\frac{51}{149}*100\approx34.2\%\\suma\%:30.9+34.9+34.2=100\%\\100\%=\text{Gráfico de Pastel de Secundaria} \]
# --- 1. Preparar los datos y calcular los porcentajes ---
# Conteo (n) para Secundaria: Femenino (46), Masculino (52), Otro (51)
n_secundaria <- c(46, 52, 51)
# Definir las categorías de Sexo
categorias_sexo <- c("Femenino", "Masculino", "Otro")
# Calcular los porcentajes internos (Total Secundaria = 149)
porcentajes <- round(n_secundaria / sum(n_secundaria) * 100, 1)
# Crear etiquetas que combinan Sexo y Porcentaje
etiquetas_pastel <- paste(categorias_sexo, "\n(", porcentajes, "%)", sep="")
# --- 2. Crear el Gráfico de Pastel con la función pie() ---
pie(
n_secundaria,
labels = etiquetas_pastel,
# Título sin tilde para evitar el error de codificación
main = "Distribucion por Sexo - Nivel Secundaria (Total N=149)",
col = rainbow(length(n_secundaria))
)
logica
\[ \text{Total Universitario}=34f +47m+43o=124\\Femenino: \frac{34}{124}*100\approx27.4\%\\Masculino:\frac{47}{124}*100\approx37.9\%\\Otro:\frac{43}{124}*100\approx34.7\%\\suma\%:27.4+37.9+34.7=100\%\\100\%=\text{Gráfico de Pastel de Universitario} \]
n_universitario <- c(34, 47, 43)
categorias_sexo <- c("Femenino", "Masculino", "Otro")
porcentajes <- round(n_universitario / sum(n_universitario) * 100, 1)
etiquetas_pastel <- paste(categorias_sexo, "\n(", porcentajes, "%)", sep="")
colores=c("pink4","blue","purple")
pie(
n_primaria,
labels = etiquetas_pastel,
main = "Distribucion por Sexo - universitario (Total N=124)",
col = colores)
logica \[ \text{Total Técnico}=31f +37m+41o=109\\Femenino: \frac{31}{109}*100\approx28.4\%\\Masculino:\frac{37}{109}*100\approx33.9\%\\Otro:\frac{41}{109}*100\approx37.6\%\\suma\%:28.4+33.9+37.6=99.9\% \approx 100\%\\100\%=\text{Gráfico de Pastel de Técnico} \]
n_tecnico <- c(31, 37, 41)
categorias_sexo <- c("Femenino", "Masculino", "Otro")
porcentajes <- round(n_tecnico / sum(n_tecnico) * 100, 1)
etiquetas_pastel <- paste(categorias_sexo, "\n(", porcentajes, "%)", sep="")
colores=c("coral","skyblue3","gold")
pie(
n_primaria,
labels = etiquetas_pastel,
main = "Distribucion por Sexo - Nivel Tecnico (Total N=109)",
col = colores)
Mediana Edad La mediana es el valor central de un conjunto de datos ordenados. Su fórmula no es de cálculo directo, sino posicional.
Media Edad también conocida como el promedio, es una medida de tendencia central que representa un valor central de un conjunto de datos
Desviacion estandar Edad
La desviación estándar en estadística es una medida de dispersión que indica cuán esparcidos o agrupados están los puntos de datos respecto a la media del conjunto. Una desviación estándar baja significa que los datos están muy cerca de la media, mientras que una desviación estándar alta indica una gran variabilidad y que los datos están más dispersos. Se calcula como la raíz cuadrada de la varianza y se utiliza para evaluar la volatilidad y el riesgo en campos como las finanzas.
formula media arimetica
Donde:
\(\bar{x}\) es la media muestral. \ \(x_i\) es el valor de la observación \(i\). \ \(n\) es el número total de observaciones. \ \(\sum_{i=1}^{n}\) es la suma de todas las observaciones. \[ \bar{x} = \frac{1}{n} \sum_{i=1}^{n} x_i \] formula Mediana
posicion
Donde:
\(M_e\) es la mediana. \ \(n\) es el número total de observaciones. \ \(x_{(k)}\) es el valor en la posición \(k\) del conjunto de datos ordenado. \[ M_e = \begin{cases} x_{\left(\frac{n+1}{2}\right)} & \text{si } n \text{ es impar} \\ \frac{x_{\left(\frac{n}{2}\right)} + x_{\left(\frac{n}{2} + 1\right)}}{2} & \text{si } n \text{ es par} \end{cases} \]
formula desviacion estandar
Donde:
\(s\) es la desviación estándar muestral. \ \(x_i\) es el valor de cada observación individual \(i\). \ \(\bar{x}\) es la media muestral de las observaciones. \ \(n\) es el número total de observaciones de la muestra. \ \(n-1\) son los grados de libertad.
\[ s = \sqrt{\frac{\sum_{i=1}^{n} (x_i - \bar{x})^2}{n-1}} \\Desviación Estándar Poblacional: \sigma = \sqrt{\frac{\sum_{i=1}^{N} (x_i - \mu)^2}{N}} \]
en este codigo esta la forma para hallar la media, mediana, varianza y desviacion estandar
# 1. Calcular la Media, Mediana ,etc.
resumen_edad <- datos.m %>%
summarise(
Media_Edad = mean(Edad), # Calcula la Media
Mediana_Edad = median(Edad), # Calcula la Mediana
Varianza_Edad = var(Edad), # Calcula la Varianza
Desviacion_Estandar = sd(Edad) # Desviación Estándar (raíz de la Varianza)#(na.rm)este argumento es crucial. Significa "remover valores no disponibles (Not Available)" y asegura que el cálculo ignora cualquier fila donde la Edad sea un valor faltante
)
kable(resumen_edad)
| Media_Edad | Mediana_Edad | Varianza_Edad | Desviacion_Estandar |
|---|---|---|---|
| 41.248 | 41 | 180.0506 | 13.41829 |
Grafico de barras hermanos
datos_con_categoria <- mutate(
datos.m,
Categoria_Hermanos = case_when(
Hermanos > 3 ~ "Más de 3",
Hermanos <= 3 ~ "3 o Menos",
TRUE ~ "Sin Dato" ))
# 2. Agrupar y contar el número de personas en cada grupo
datos_conteo <- summarise(
group_by(datos_con_categoria, Categoria_Hermanos),
Conteo = n())
# 3. Desagrupar
datos_conteo <- ungroup(datos_conteo)
fg <- ggplot(data = datos_conteo,
mapping = aes(x = Categoria_Hermanos, y = Conteo)) +
geom_col(fill = rainbow(n=2)) +
# Añadir etiquetas con el número exacto sobre cada barra
geom_text(aes(label = Conteo),
vjust = -0.5,
size = 5,
color = "black") +
scale_y_continuous(
limits = c(0, 300), # Establece el límite inferior en 0 y el superior en 300
expand = expansion(mult = c(0, 0.05)) # Ajusta la expansión para que las barras no toquen los bordes
) +
# Definir títulos y etiquetas
labs(
title = "Frecuencia de Personas con Más de 3 Hermanos",
x = "Categoría de Hermanos",
y = "Frecuencia (Conteo)"
) +
theme_minimal()
# Muestra el gráfico
fg
Rango
Es una medida de dispersión que se calcula como la diferencia entre el valor máximo y el valor mínimo de un conjunto de datos. se halla de la siguiente manera;
Formula El rango (R) de un conjunto de datos se calcula como: \[R = X_{\text{max}} - X_{\text{min}}\] Donde \(X_{\text{max}}\) es el valor más grande y \(X_{\text{min}}\) es el valor más pequeño.
varianza
Es una medida de dispersión definida como la esperanza del cuadrado de la desviación de dicha variable respecto a su media.
se expresa de la siguiente manera: \[s^2 = \frac{\sum_{i=1}^{n} (x_i - \bar{x})^2}{n-1}\] Coeficiente de variacion
Se define como la razón entre la desviación estándar (σ o s) y la media (μ o x), a menudo expresada en porcentaje (multiplicando por 100).
se expresa de la siguiente manera: \[\text{CV} = \frac{s}{\left|\bar{x}\right|} \times 100\%\]
A continuacion analizaremos la varianza , el rango y el cofienciente de variacion para la variable ingresos mensuales
min_ingreso <- min(datos.m$IngresoMensual, na.rm = TRUE)
max_ingreso <- max(datos.m$IngresoMensual, na.rm = TRUE)
rango <- max_ingreso - min_ingreso
cat("El Rango es:", rango)
## El Rango es: 5127.34
varianza <- var(datos.m$IngresoMensual)#varianza se utiliza; var, para hallar la varianza
cat("La Varianza es:", varianza)
## La Varianza es: 619297
# Desviación Estándar y Media (para CV)
desviacion_estandar <- sd(datos.m$IngresoMensual)
media_ingreso <- mean(datos.m$IngresoMensual)
# Coeficiente de Variación (%)
coef_variacion <- (desviacion_estandar / abs(media_ingreso)) * 100
cat("El Coeficiente de Variación es:", coef_variacion, "%")
## El Coeficiente de Variación es: 40.89345 %
# --- PASO 2: Crear el Data Frame de Resultados ---
Estadistico <- c("Rango", "Varianza Muestral", "Desviación Estándar", "Coeficiente de Variación (%)")# Nombres de las estadísticas
Valor <- c(rango, varianza, desviacion_estandar, coef_variacion)# Valores calculados
tabla_resultados <- data.frame(Estadistico, Valor)# Combinamos en el data frame
kable(tabla_resultados, # PASO 3: Generar la Tabla con kable
caption = "Dispersión del Ingreso Mensual",
digits = 2) # dos decimales
| Estadistico | Valor |
|---|---|
| Rango | 5127.34 |
| Varianza Muestral | 619297.04 |
| Desviación Estándar | 786.95 |
| Coeficiente de Variación (%) | 40.89 |
Conclusión General y Representatividad de la Media
El \(\textbf{Coeficiente de Variación}\) te permite evaluar qué tan representativa es la media (el promedio) para describir los datos:
Cálculo Implícito de la Media (\(\bar{x}\))}
Con los valores, podemos estimar el promedio: \[ \bar{x} = \frac{\text{Desviación Estándar}}{\text{CV}} = \frac{786.95}{0.4089} \approx \$1,924.50 \] El promedio de ingresos mensuales es de aproximadamente \(\textbf{\$1,924.50}.\)
\({Representatividad de la Media (40.89\%)}\) Generalmente.
un \(\text{CV}\) menor al \(30\%\) se considera un conjunto de datos \(\textbf{homogéneo}\) (la media es muy representativa).
Un \(\text{CV}\) cercano o superior al \(50\%\) se considera \(\textbf{heterogéneo}\)
El valor de \(\text{CV} = 40.89\%\) cae en una zona de \(\textbf{dispersión moderada a alta}.\)
Existe una \(\textbf{dispersión considerable}\) en los ingresos mensuales. Aunque la media (\(\$1,924.50\)) es útil, la variabilidad de los ingresos es \(\textbf{alta} (40.89\%)\), lo que significa que hay una diferencia notable entre los ingresos más altos y más bajos, tal como lo confirma la \(\textbf{alta Desviación Estándar} (\$786.95).\)
# Calcular la estatura promedio por género
promedio_estatura_genero <- datos.m %>%
group_by(Sexo) %>%
summarise(
Promedio_Estatura = mean(Estatura, na.rm = TRUE),
Desviacion = sd(Estatura, na.rm = TRUE),
Conteo = n()
)
kable(promedio_estatura_genero,
caption = "Altura promedio por Género",
digits = 2)
| Sexo | Promedio_Estatura | Desviacion | Conteo |
|---|---|---|---|
| Femenino | 1.75 | 0.14 | 149 |
| Masculino | 1.73 | 0.15 | 171 |
| Otro | 1.76 | 0.14 | 180 |
promedio_ingreso_nivel <- datos.m %>%
group_by(NivelEducativo) %>%
summarise(
Promedio_Ingreso = mean(IngresoMensual, na.rm = TRUE),
Desviacion = sd(IngresoMensual, na.rm = TRUE),
Conteo = n()
)
kable(promedio_ingreso_nivel,
caption = "Ingreso promedio según Nivel Educativo",
digits = 2)
| NivelEducativo | Promedio_Ingreso | Desviacion | Conteo |
|---|---|---|---|
| Primaria | 2015.29 | 842.94 | 118 |
| Secundaria | 1949.80 | 753.52 | 149 |
| Técnico | 1849.61 | 828.14 | 109 |
| Universitario | 1873.14 | 731.34 | 124 |
ggplot(datos.m, aes(x = NivelEducativo, y = IngresoMensual, fill = NivelEducativo)) +
geom_boxplot() +
labs(
title = "Ingresos Mensuales por Nivel Educativo",
x = "Nivel Educativo",
y = "Ingreso Mensual"
) +
theme_minimal()
ggplot(datos.m, aes(x = Edad, y = IngresoMensual)) +
geom_point(alpha = 0.6, color = "blue") +
geom_smooth(method = "lm", col = "red") +
labs(
title = "Relación entre Edad e Ingreso Mensual",
x = "Edad",
y = "Ingreso Mensual"
) +
theme_light()
## `geom_smooth()` using formula = 'y ~ x'
tabla_genero_nivel <- datos.m %>%
count(Sexo, NivelEducativo) %>%
mutate(Porcentaje = round(100 * n / sum(n), 2))
kable(tabla_genero_nivel,
caption = "Distribución conjunta de Género y Nivel Educativo",
digits = 2)
| Sexo | NivelEducativo | n | Porcentaje |
|---|---|---|---|
| Femenino | Primaria | 38 | 7.6 |
| Femenino | Secundaria | 46 | 9.2 |
| Femenino | Técnico | 31 | 6.2 |
| Femenino | Universitario | 34 | 6.8 |
| Masculino | Primaria | 35 | 7.0 |
| Masculino | Secundaria | 52 | 10.4 |
| Masculino | Técnico | 37 | 7.4 |
| Masculino | Universitario | 47 | 9.4 |
| Otro | Primaria | 45 | 9.0 |
| Otro | Secundaria | 51 | 10.2 |
| Otro | Técnico | 41 | 8.2 |
| Otro | Universitario | 43 | 8.6 |
# Filtramos personas con más de 2 hermanos e ingreso mayor a 3000
filtro_personas <- datos.m %>%
filter(Hermanos > 2, IngresoMensual > 3000)
# Calculamos proporción
proporcion_personas <- nrow(filtro_personas) / nrow(datos.m)
cat("La proporción es:", round(proporcion_personas*100,2), "%")
## La proporción es: 5 %