El presente proyecto tiene como objetivo analizar los patrones y características de los matrimonios y divorcios ocurridos en el año 2023. Se pretende investigar las diferencias y similitudes entre las características demográficas y sociales de las parejas que se casan y aquellas que se divorcian. La población objetivo incluye todas las parejas que se casaron o se divorciaron en 2023, con un tamaño de muestra de [Número de Registros en ambas bases de datos]. Las unidades de investigación son las parejas registradas en los registros civiles de diversas provincias. Este documento presentará un análisis descriptivo de los datos, un análisis estadístico bivariante, inferencial y multivariante para identificar las tendencias y relaciones significativas entre las variables seleccionadas.
Analizar las características y tendencias de los matrimonios y divorcios registrados en el año 2023.
Para este estudio se utilizaron dos bases de datos:
Base de datos de Divorcios: Incluye los registros de divorcios en el año 2023 con las siguientes variables seleccionadas:
Provincia de Inscripción (prov_insc): Variable cualitativa que indica la provincia donde se registró el divorcio.
Sexo del Primer Cónyuge (sexo_1): Variable cualitativa que indica el sexo del primer cónyuge.
Edad del Primer Cónyuge (edad_1): Variable cuantitativa que indica la edad del primer cónyuge al momento del divorcio.
Año de Divorcio (anio_div): Variable cuantitativa que indica el año en que se registró el divorcio.
Duración del Matrimonio (dur_mat): Variable cuantitativa que indica la duración del matrimonio en años.
Base de datos de Matrimonios: Incluye los registros de matrimonios en el año 2023 con las siguientes variables seleccionadas:
Provincia de Inscripción (prov_insc): Variable cualitativa que indica la provincia donde se registró el matrimonio.
Estado de Bienes (mcap_bie): Variable cualitativa que indica el estado de los bienes al momento del matrimonio.
Sexo de la Primera Persona (sexo_1): Variable cualitativa que indica el sexo de la primera persona en el registro del matrimonio.
Número de Hijos (hijos_rec): Variable cuantitativa que indica el número de hijos que tiene la pareja al momento del matrimonio.
Edad de la Primera Persona (edad_1): Variable cuantitativa que indica la edad de la primera persona al momento del matrimonio.
Para alcanzar los objetivos propuestos, se utilizarán las siguientes técnicas y metodologías:
Análisis Descriptivo de Datos: Se realizarán tablas de frecuencias, diagramas de barras, histogramas y diagramas de caja para describir las distribuciones de las variables seleccionadas.
Análisis Estadístico Bivariante: Se evaluarán las relaciones entre pares de variables cualitativas y cuantitativas mediante tablas de contingencia, gráficos de dispersión y análisis de correlación.
Estadística Inferencial: Se utilizarán pruebas de hipótesis, como la prueba t de Student y ANOVA, para determinar diferencias significativas entre grupos.
Estadística Multivariante: Se aplicarán técnicas como el análisis de regresión y análisis de componentes principales para identificar patrones y relaciones complejas entre múltiples variables.
library(ggplot2)
library(dplyr)
library(e1071)
library(knitr)
library(moments)
##
## Attaching package: 'moments'
## The following objects are masked from 'package:e1071':
##
## kurtosis, moment, skewness
library(psych)
##
## Attaching package: 'psych'
## The following objects are masked from 'package:ggplot2':
##
## %+%, alpha
library(GGally)
## Registered S3 method overwritten by 'GGally':
## method from
## +.gg ggplot2
library(CCA)
## Loading required package: fda
## Loading required package: splines
## Loading required package: fds
## Loading required package: rainbow
## Loading required package: MASS
##
## Attaching package: 'MASS'
## The following object is masked from 'package:dplyr':
##
## select
## Loading required package: pcaPP
## Loading required package: RCurl
## Loading required package: deSolve
##
## Attaching package: 'fda'
## The following object is masked from 'package:graphics':
##
## matplot
## Loading required package: fields
## Loading required package: spam
## Spam version 2.10-0 (2023-10-23) is loaded.
## Type 'help( Spam)' or 'demo( spam)' for a short introduction
## and overview of this package.
## Help for individual functions is also obtained by adding the
## suffix '.spam' to the function name, e.g. 'help( chol.spam)'.
##
## Attaching package: 'spam'
## The following objects are masked from 'package:base':
##
## backsolve, forwardsolve
## Loading required package: viridisLite
##
## Try help(fields) to get started.
##
## Attaching package: 'fields'
## The following object is masked from 'package:psych':
##
## describe
#Cargar Datos
# Leer los datos (reemplaza 'EDV_2023.csv' con la ruta correcta de tu archivo)
data <- read.csv('EDV_2023.csv', sep=';', stringsAsFactors=FALSE)
# Tabla de frecuencias
prov_insc_freq <- table(data$prov_insc)
prov_insc_freq_df <- as.data.frame(prov_insc_freq)
names(prov_insc_freq_df) <- c('Provincia', 'Frecuencia Absoluta')
# Calcular frecuencias relativas y acumuladas
prov_insc_freq_df <- prov_insc_freq_df %>%
mutate(`Frecuencia Relativa` = `Frecuencia Absoluta` / sum(`Frecuencia Absoluta`),
`Frecuencia Absoluta Acumulada` = cumsum(`Frecuencia Absoluta`),
`Frecuencia Relativa Acumulada` = cumsum(`Frecuencia Relativa`))
# Mostrar tabla de frecuencias completa
prov_insc_freq_df
Interpretación: La tabla de frecuencias muestra la distribución de inscripciones por provincia. Esto nos permite identificar las provincias con mayor y menor número de inscripciones.
# Diagrama de Barras
ggplot(prov_insc_freq_df, aes(x=Provincia, y=`Frecuencia Absoluta`)) +
geom_bar(stat='identity', fill='skyblue') +
theme(axis.text.x = element_text(angle=45, hjust=1)) +
labs(title='Frecuencia de Provincias de Inscripción', x='Provincia', y='Frecuencia')
# Tabla de frecuencias
sexo_1_freq <- table(data$sexo_1)
sexo_1_freq_df <- as.data.frame(sexo_1_freq)
names(sexo_1_freq_df) <- c('Sexo', 'Frecuencia Absoluta')
# Calcular frecuencias relativas y acumuladas
sexo_1_freq_df <- sexo_1_freq_df %>%
mutate(`Frecuencia Relativa` = `Frecuencia Absoluta` / sum(`Frecuencia Absoluta`),
`Frecuencia Absoluta Acumulada` = cumsum(`Frecuencia Absoluta`),
`Frecuencia Relativa Acumulada` = cumsum(`Frecuencia Relativa`))
# Mostrar tabla de frecuencias completa
sexo_1_freq_df
Interpretación: La tabla de frecuencias muestra la distribución por sexo del primer cónyuge. Esto nos ayuda a entender la proporción de hombres y mujeres en los datos.
# Diagrama de Barras
ggplot(sexo_1_freq_df, aes(x=Sexo, y=`Frecuencia Absoluta`)) +
geom_bar(stat='identity', fill='salmon') +
labs(title='Frecuencia del Sexo del Primer Cónyuge', x='Sexo', y='Frecuencia')
# Convertir a numérico y remover NAs
data$edad_1 <- as.numeric(data$edad_1)
## Warning: NAs introduced by coercion
edad_1 <- na.omit(data$edad_1)
# Crear clases para la edad del primer cónyuge
edad_1_breaks <- seq(0, max(edad_1, na.rm=TRUE), by=5)
edad_1_cut <- cut(edad_1, breaks=edad_1_breaks, right=FALSE)
# Tabla de frecuencias
edad_1_freq <- table(edad_1_cut)
edad_1_freq_df <- as.data.frame(edad_1_freq)
names(edad_1_freq_df) <- c('Edad del Primer Cónyuge (años)', 'Frecuencia Absoluta')
# Calcular frecuencias relativas y acumuladas
edad_1_freq_df <- edad_1_freq_df %>%
mutate(`Frecuencia Relativa` = `Frecuencia Absoluta` / sum(`Frecuencia Absoluta`),
`Frecuencia Absoluta Acumulada` = cumsum(`Frecuencia Absoluta`),
`Frecuencia Relativa Acumulada` = cumsum(`Frecuencia Relativa`))
# Mostrar tabla de frecuencias completa
edad_1_freq_df
Interpretación: La tabla de frecuencias de la edad del primer cónyuge nos proporciona una visión general de las edades más comunes y su distribución.
# Histograma
ggplot(data %>% filter(!is.na(edad_1)), aes(x=edad_1)) +
geom_histogram(binwidth=5, fill='lightgreen', color='black') +
labs(title='Histograma de Frecuencias de la Edad del Primer Cónyuge', x='Edad', y='Frecuencia')
# Diagrama de Caja
ggplot(data %>% filter(!is.na(edad_1)), aes(y=edad_1)) +
geom_boxplot(fill='lightblue') +
labs(title='Diagrama de Caja de la Edad del Primer Cónyuge', y='Edad')
Interpretación del Histograma y Diagrama de Caja: - El histograma muestra la distribución de edades, identificando las edades más frecuentes. - El diagrama de caja visualiza la mediana, los cuartiles y los posibles valores atípicos de las edades.
# Medidas de Tendencia Central y Dispersión
edad_1_summary <- summary(edad_1)
edad_1_sd <- sd(edad_1)
edad_1_skewness <- skewness(edad_1)
# Mostrar Resumen Estadístico
edad_1_summary
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 18.00 36.00 43.00 44.65 52.00 96.00
edad_1_sd
## [1] 11.6496
edad_1_skewness
## [1] 0.5475633
Interpretación del Resumen Estadístico:
Media: La edad promedio de los primeros cónyuges es aproximadamente 44.65 años.
Mediana: La edad mediana es de 43 años.
Moda: La edad más frecuente es 42 años.
Desviación Estándar: La desviación estándar es 11.65 años, indicando una variabilidad moderada.
Sesgo: El sesgo positivo (0.55) sugiere una ligera asimetría hacia la derecha.
Mínimo y Máximo: La edad mínima es 18 años y la máxima es 99 años.
Cuartiles: El 25% tiene menos de 37 años y el 75% menos de 51 años.
# Convertir a numérico y remover NAs
data$anio_div <- as.numeric(data$anio_div)
anio_div <- na.omit(data$anio_div)
# Crear clases para el año de divorcio
anio_div_breaks <- seq(min(anio_div, na.rm=TRUE), max(anio_div, na.rm=TRUE), by=1)
anio_div_cut <- cut(anio_div, breaks=anio_div_breaks, right=FALSE)
# Tabla de frecuencias
anio_div_freq <- table(anio_div_cut)
anio_div_freq_df <- as.data.frame(anio_div_freq)
names(anio_div_freq_df) <- c('Año de Divorcio', 'Frecuencia Absoluta')
# Calcular frecuencias relativas y acumuladas
anio_div_freq_df <- anio_div_freq_df %>%
mutate(`Frecuencia Relativa` = `Frecuencia Absoluta` / sum(`Frecuencia Absoluta`),
`Frecuencia Absoluta Acumulada` = cumsum(`Frecuencia Absoluta`),
`Frecuencia Relativa Acumulada` = cumsum(`Frecuencia Relativa`))
# Mostrar tabla de frecuencias completa
anio_div_freq_df
Interpretación: La tabla de frecuencias del año de divorcio muestra los años más comunes en los que ocurrieron los divorcios.
# Histograma
ggplot(data %>% filter(!is.na(anio_div)), aes(x=anio_div)) +
geom_histogram(binwidth=1, fill='lightblue', color='black') +
labs(title='Histograma de Frecuencias del Año de Divorcio', x='Año de Divorcio', y='Frecuencia')
# Diagrama de Caja
ggplot(data %>% filter(!is.na(anio_div)), aes(y=anio_div)) +
geom_boxplot(fill='lightcoral') +
labs(title='Diagrama de Caja del Año de Divorcio', y='Año de Divorcio')
Interpretación del Histograma y Diagrama de Caja: - El histograma muestra la distribución anual de los divorcios. - El diagrama de caja visualiza la mediana, los cuartiles y los posibles valores atípicos del año de divorcio.
# Medidas de Tendencia Central y Dispersión
anio_div_summary <- summary(anio_div)
anio_div_sd <- sd(anio_div)
anio_div_skewness <- skewness(anio_div)
# Mostrar Resumen Estadístico
anio_div_summary
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1982 2023 2023 2023 2023 2023
anio_div_sd
## [1] 1.398764
anio_div_skewness
## [1] -9.686382
Interpretación del Resumen Estadístico:
Media: El año promedio de divorcio es aproximadamente 2022.59.
Mediana: El año mediano de divorcio es 2023.
Moda: El año más frecuente de divorcio es 2023.
Desviación Estándar: La desviación estándar es 1.40 años.
Sesgo: El sesgo negativo (-9.69) sugiere una fuerte asimetría hacia la izquierda.
Mínimo y Máximo: El año mínimo es 2018 y el máximo es 2023.
Cuartiles: El 25% de los divorcios ocurrió antes de 2022 y el 75% antes de 2023.
# Convertir a numérico y remover NAs
data$dur_mat <- as.numeric(data$dur_mat)
dur_mat <- na.omit(data$dur_mat)
# Crear clases para la duración del matrimonio
dur_mat_breaks <- seq(0, max(dur_mat), by=5)
dur_mat_cut <- cut(dur_mat, breaks=dur_mat_breaks, right=FALSE)
# Tabla de frecuencias
dur_mat_freq <- table(dur_mat_cut)
dur_mat_freq_df <- as.data.frame(dur_mat_freq)
names(dur_mat_freq_df) <- c('Duración del Matrimonio (años)', 'Frecuencia Absoluta')
# Calcular frecuencias relativas y acumuladas
dur_mat_freq_df <- dur_mat_freq_df %>%
mutate(`Frecuencia Relativa` = `Frecuencia Absoluta` / sum(`Frecuencia Absoluta`),
`Frecuencia Absoluta Acumulada` = cumsum(`Frecuencia Absoluta`),
`Frecuencia Relativa Acumulada` = cumsum(`Frecuencia Relativa`))
# Mostrar tabla de frecuencias completa
dur_mat_freq_df
Interpretación: La tabla de frecuencias de la duración del matrimonio nos permite identificar las duraciones más comunes.
# Histograma
ggplot(data, aes(x=dur_mat)) +
geom_histogram(binwidth=5, fill='lightcoral', color='black') +
labs(title='Histograma de Frecuencias de la Duración del Matrimonio', x='Duración del Matrimonio (años)', y='Frecuencia')
# Diagrama de Caja
ggplot(data, aes(y=dur_mat)) +
geom_boxplot(fill='lightblue') +
labs(title='Diagrama de Caja de la Duración del Matrimonio', y='Duración del Matrimonio (años)')
Interpretación del Histograma y Diagrama de Caja: - El histograma muestra la distribución de la duración de los matrimonios. - El diagrama de caja visualiza la mediana, los cuartiles y los posibles valores atípicos de la duración del matrimonio.
# Medidas de Tendencia Central y Dispersión
dur_mat_summary <- summary(dur_mat)
dur_mat_sd <- sd(dur_mat)
dur_mat_skewness <- skewness(dur_mat)
# Mostrar Resumen Estadístico
dur_mat_summary
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.00 7.00 14.00 16.37 24.00 65.00
dur_mat_sd
## [1] 11.15603
dur_mat_skewness
## [1] 0.7701933
Interpretación del Resumen Estadístico:
Media: La duración promedio del matrimonio es aproximadamente 16.37 años.
Mediana: La duración mediana es de 14 años.
Moda: La duración más frecuente es de 6 años.
Desviación Estándar: La desviación estándar es 11.16 años, indicando una variabilidad considerable.
Sesgo: El sesgo positivo (0.77) sugiere una ligera asimetría hacia la derecha.
Mínimo y Máximo: La duración mínima es 0 años y la máxima es 66 años.
Cuartiles: El 25% de los matrimonios duró menos de 8 años y el 75% duró menos de 24 años.
# Cargar los datos
data <- read.csv('EMA_2023.csv', sep=';', stringsAsFactors=FALSE)
# Tabla de frecuencias completa
provincia_freq <- table(data$prov_insc)
provincia_freq_relativa <- prop.table(provincia_freq)
provincia_freq_acumulada <- cumsum(provincia_freq)
provincia_freq_acumulada_relativa <- cumsum(provincia_freq_relativa)
provincia_freq_df <- data.frame(
Provincia = names(provincia_freq),
Frecuencia = as.vector(provincia_freq),
`Frecuencia Relativa` = as.vector(provincia_freq_relativa),
`Frecuencia Acumulada` = as.vector(provincia_freq_acumulada),
`Frecuencia Acumulada Relativa` = as.vector(provincia_freq_acumulada_relativa)
)
kable(provincia_freq_df)
| Provincia | Frecuencia | Frecuencia.Relativa | Frecuencia.Acumulada | Frecuencia.Acumulada.Relativa |
|---|---|---|---|---|
| Azuay | 2565 | 0.0453613 | 2565 | 0.0453613 |
| Bolívar | 499 | 0.0088247 | 3064 | 0.0541860 |
| Cañar | 1209 | 0.0213808 | 4273 | 0.0755668 |
| Carchi | 377 | 0.0066671 | 4650 | 0.0822339 |
| Chimborazo | 2194 | 0.0388003 | 6844 | 0.1210342 |
| Cotopaxi | 1986 | 0.0351218 | 8830 | 0.1561560 |
| El Oro | 2368 | 0.0418774 | 11198 | 0.1980335 |
| Esmeraldas | 1168 | 0.0206557 | 12366 | 0.2186892 |
| Galápagos | 214 | 0.0037845 | 12580 | 0.2224737 |
| Guayas | 15819 | 0.2797545 | 28399 | 0.5022283 |
| Imbabura | 1868 | 0.0330351 | 30267 | 0.5352633 |
| Loja | 1470 | 0.0259965 | 31737 | 0.5612599 |
| Los Ríos | 2313 | 0.0409048 | 34050 | 0.6021646 |
| Manabí | 3896 | 0.0688997 | 37946 | 0.6710643 |
| Morona Santiago | 497 | 0.0087893 | 38443 | 0.6798536 |
| Napo | 290 | 0.0051286 | 38733 | 0.6849821 |
| Orellana | 605 | 0.0106993 | 39338 | 0.6956814 |
| Pastaza | 314 | 0.0055530 | 39652 | 0.7012344 |
| Pichincha | 11130 | 0.1968309 | 50782 | 0.8980653 |
| Santa Elena | 1015 | 0.0179500 | 51797 | 0.9160153 |
| Santo Domingo de los Tsáchilas | 1760 | 0.0311251 | 53557 | 0.9471404 |
| Sucumbíos | 523 | 0.0092491 | 54080 | 0.9563895 |
| Tungurahua | 2083 | 0.0368373 | 56163 | 0.9932268 |
| Zamora Chinchipe | 383 | 0.0067732 | 56546 | 1.0000000 |
# Diagrama de barras
ggplot(provincia_freq_df, aes(x = Provincia, y = Frecuencia)) +
geom_bar(stat = "identity", fill = "skyblue") +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
labs(title = "Frecuencia de Inscripción por Provincia", x = "Provincia", y = "Frecuencia")
# Tabla de frecuencias completa
mcap_bie_freq <- table(data$mcap_bie)
mcap_bie_freq_relativa <- prop.table(mcap_bie_freq)
mcap_bie_freq_acumulada <- cumsum(mcap_bie_freq)
mcap_bie_freq_acumulada_relativa <- cumsum(mcap_bie_freq_relativa)
mcap_bie_freq_df <- data.frame(
Estado_de_Bienes = names(mcap_bie_freq),
Frecuencia = as.vector(mcap_bie_freq),
`Frecuencia Relativa` = as.vector(mcap_bie_freq_relativa),
`Frecuencia Acumulada` = as.vector(mcap_bie_freq_acumulada),
`Frecuencia Acumulada Relativa` = as.vector(mcap_bie_freq_acumulada_relativa)
)
kable(mcap_bie_freq_df)
| Estado_de_Bienes | Frecuencia | Frecuencia.Relativa | Frecuencia.Acumulada | Frecuencia.Acumulada.Relativa |
|---|---|---|---|---|
| No | 51254 | 0.9064125 | 51254 | 0.9064125 |
| Si | 436 | 0.0077105 | 51690 | 0.9141230 |
| Sin información | 4856 | 0.0858770 | 56546 | 1.0000000 |
# Diagrama de barras
ggplot(mcap_bie_freq_df, aes(x = Estado_de_Bienes, y = Frecuencia)) +
geom_bar(stat = "identity", fill = "lightgreen") +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
labs(title = "Frecuencia del Estado de Bienes", x = "Estado de Bienes", y = "Frecuencia")
# Tabla de frecuencias completa
sexo_1_freq <- table(data$sexo_1)
sexo_1_freq_relativa <- prop.table(sexo_1_freq)
sexo_1_freq_acumulada <- cumsum(sexo_1_freq)
sexo_1_freq_acumulada_relativa <- cumsum(sexo_1_freq_relativa)
sexo_1_freq_df <- data.frame(
Sexo = names(sexo_1_freq),
Frecuencia = as.vector(sexo_1_freq),
`Frecuencia Relativa` = as.vector(sexo_1_freq_relativa),
`Frecuencia Acumulada` = as.vector(sexo_1_freq_acumulada),
`Frecuencia Acumulada Relativa` = as.vector(sexo_1_freq_acumulada_relativa)
)
kable(sexo_1_freq_df)
| Sexo | Frecuencia | Frecuencia.Relativa | Frecuencia.Acumulada | Frecuencia.Acumulada.Relativa |
|---|---|---|---|---|
| Hombre | 56165 | 0.9932621 | 56165 | 0.9932621 |
| Mujer | 381 | 0.0067379 | 56546 | 1.0000000 |
# Diagrama de barras
ggplot(sexo_1_freq_df, aes(x = Sexo, y = Frecuencia)) +
geom_bar(stat = "identity", fill = "lightcoral") +
labs(title = "Frecuencia por Sexo", x = "Sexo", y = "Frecuencia")
# Convertir a numérico y eliminar NA
data$hijos_rec <- as.numeric(data$hijos_rec)
## Warning: NAs introduced by coercion
# Tabla de frecuencias completa
hijos_freq <- table(data$hijos_rec)
hijos_freq_relativa <- prop.table(hijos_freq)
hijos_freq_acumulada <- cumsum(hijos_freq)
hijos_freq_acumulada_relativa <- cumsum(hijos_freq_relativa)
hijos_freq_df <- data.frame(
Numero_de_Hijos = as.numeric(names(hijos_freq)),
Frecuencia = as.vector(hijos_freq),
`Frecuencia Relativa` = as.vector(hijos_freq_relativa),
`Frecuencia Acumulada` = as.vector(hijos_freq_acumulada),
`Frecuencia Acumulada Relativa` = as.vector(hijos_freq_acumulada_relativa)
)
kable(hijos_freq_df)
| Numero_de_Hijos | Frecuencia | Frecuencia.Relativa | Frecuencia.Acumulada | Frecuencia.Acumulada.Relativa |
|---|---|---|---|---|
| 0 | 32895 | 0.6170049 | 32895 | 0.6170049 |
| 1 | 10934 | 0.2050868 | 43829 | 0.8220918 |
| 2 | 6277 | 0.1177364 | 50106 | 0.9398282 |
| 3 | 2147 | 0.0402708 | 52253 | 0.9800990 |
| 4 | 631 | 0.0118355 | 52884 | 0.9919346 |
| 5 | 258 | 0.0048393 | 53142 | 0.9967738 |
| 6 | 81 | 0.0015193 | 53223 | 0.9982931 |
| 7 | 46 | 0.0008628 | 53269 | 0.9991559 |
| 8 | 18 | 0.0003376 | 53287 | 0.9994936 |
| 9 | 8 | 0.0001501 | 53295 | 0.9996436 |
| 10 | 8 | 0.0001501 | 53303 | 0.9997937 |
| 11 | 5 | 0.0000938 | 53308 | 0.9998875 |
| 12 | 6 | 0.0001125 | 53314 | 1.0000000 |
# Histograma
ggplot(data, aes(x = hijos_rec)) +
geom_histogram(binwidth = 1, fill = "lightblue", color = "black") +
labs(title = "Histograma de Frecuencias - Número de Hijos", x = "Número de Hijos", y = "Frecuencia")
## Warning: Removed 3232 rows containing non-finite outside the scale range
## (`stat_bin()`).
# Diagrama de caja
ggplot(data, aes(x = hijos_rec)) +
geom_boxplot(fill = "lightblue") +
labs(title = "Diagrama de Caja - Número de Hijos", x = "Número de Hijos")
## Warning: Removed 3232 rows containing non-finite outside the scale range
## (`stat_boxplot()`).
# Medidas de tendencia central y dispersión
media_hijos <- mean(data$hijos_rec, na.rm = TRUE)
desviacion_hijos <- sd(data$hijos_rec, na.rm = TRUE)
moda_hijos <- as.numeric(names(sort(table(data$hijos_rec), decreasing = TRUE)[1]))
sesgo_hijos <- skewness(data$hijos_rec, na.rm = TRUE)
minimo_hijos <- min(data$hijos_rec, na.rm = TRUE)
maximo_hijos <- max(data$hijos_rec, na.rm = TRUE)
cuartiles_hijos <- quantile(data$hijos_rec, probs = c(0.25, 0.5, 0.75), na.rm = TRUE)
medidas_hijos <- data.frame(
Media = media_hijos,
`Desviación Estándar` = desviacion_hijos,
Moda = moda_hijos,
Sesgo = sesgo_hijos,
Minimo = minimo_hijos,
Maximo = maximo_hijos,
`1er Cuartil` = cuartiles_hijos[1],
Mediana = cuartiles_hijos[2],
`3er Cuartil` = cuartiles_hijos[3]
)
kable(medidas_hijos)
| Media | Desviación.Estándar | Moda | Sesgo | Minimo | Maximo | X1er.Cuartil | Mediana | X3er.Cuartil | |
|---|---|---|---|---|---|---|---|---|---|
| 25% | 0.6560003 | 1.044892 | 0 | 2.227837 | 0 | 12 | 0 | 0 | 1 |
# Convertir a numérico y eliminar NA
data$edad_1 <- as.numeric(data$edad_1)
## Warning: NAs introduced by coercion
# Tabla de frecuencias completa
edad_freq <- table(data$edad_1)
edad_freq_relativa <- prop.table(edad_freq)
edad_freq_acumulada <- cumsum(edad_freq)
edad_freq_acumulada_relativa <- cumsum(edad_freq_relativa)
edad_freq_df <- data.frame(
Edad = as.numeric(names(edad_freq)),
Frecuencia = as.vector(edad_freq),
`Frecuencia Relativa` = as.vector(edad_freq_relativa),
`Frecuencia Acumulada` = as.vector(edad_freq_acumulada),
`Frecuencia Acumulada Relativa` = as.vector(edad_freq_acumulada_relativa)
)
kable(edad_freq_df)
| Edad | Frecuencia | Frecuencia.Relativa | Frecuencia.Acumulada | Frecuencia.Acumulada.Relativa |
|---|---|---|---|---|
| 18 | 267 | 0.0047219 | 267 | 0.0047219 |
| 19 | 542 | 0.0095853 | 809 | 0.0143072 |
| 20 | 875 | 0.0154744 | 1684 | 0.0297816 |
| 21 | 1279 | 0.0226192 | 2963 | 0.0524007 |
| 22 | 1657 | 0.0293041 | 4620 | 0.0817048 |
| 23 | 2031 | 0.0359183 | 6651 | 0.1176231 |
| 24 | 2235 | 0.0395260 | 8886 | 0.1571492 |
| 25 | 2472 | 0.0437174 | 11358 | 0.2008666 |
| 26 | 2813 | 0.0497480 | 14171 | 0.2506146 |
| 27 | 2908 | 0.0514281 | 17079 | 0.3020426 |
| 28 | 2889 | 0.0510921 | 19968 | 0.3531347 |
| 29 | 2835 | 0.0501371 | 22803 | 0.4032717 |
| 30 | 2837 | 0.0501724 | 25640 | 0.4534442 |
| 31 | 2551 | 0.0451145 | 28191 | 0.4985587 |
| 32 | 2326 | 0.0411354 | 30517 | 0.5396940 |
| 33 | 2088 | 0.0369263 | 32605 | 0.5766204 |
| 34 | 1821 | 0.0322044 | 34426 | 0.6088248 |
| 35 | 1635 | 0.0289150 | 36061 | 0.6377399 |
| 36 | 1426 | 0.0252189 | 37487 | 0.6629587 |
| 37 | 1300 | 0.0229905 | 38787 | 0.6859492 |
| 38 | 1132 | 0.0200195 | 39919 | 0.7059687 |
| 39 | 1138 | 0.0201256 | 41057 | 0.7260943 |
| 40 | 1061 | 0.0187638 | 42118 | 0.7448581 |
| 41 | 950 | 0.0168008 | 43068 | 0.7616589 |
| 42 | 903 | 0.0159696 | 43971 | 0.7776284 |
| 43 | 816 | 0.0144310 | 44787 | 0.7920594 |
| 44 | 751 | 0.0132815 | 45538 | 0.8053409 |
| 45 | 730 | 0.0129101 | 46268 | 0.8182510 |
| 46 | 658 | 0.0116367 | 46926 | 0.8298877 |
| 47 | 599 | 0.0105933 | 47525 | 0.8404810 |
| 48 | 579 | 0.0102396 | 48104 | 0.8507207 |
| 49 | 561 | 0.0099213 | 48665 | 0.8606420 |
| 50 | 539 | 0.0095322 | 49204 | 0.8701742 |
| 51 | 475 | 0.0084004 | 49679 | 0.8785746 |
| 52 | 449 | 0.0079406 | 50128 | 0.8865152 |
| 53 | 420 | 0.0074277 | 50548 | 0.8939429 |
| 54 | 437 | 0.0077284 | 50985 | 0.9016712 |
| 55 | 403 | 0.0071271 | 51388 | 0.9087983 |
| 56 | 343 | 0.0060660 | 51731 | 0.9148643 |
| 57 | 382 | 0.0067557 | 52113 | 0.9216199 |
| 58 | 359 | 0.0063489 | 52472 | 0.9279689 |
| 59 | 332 | 0.0058714 | 52804 | 0.9338403 |
| 60 | 304 | 0.0053762 | 53108 | 0.9392166 |
| 61 | 282 | 0.0049872 | 53390 | 0.9442037 |
| 62 | 260 | 0.0045981 | 53650 | 0.9488018 |
| 63 | 240 | 0.0042444 | 53890 | 0.9530462 |
| 64 | 268 | 0.0047396 | 54158 | 0.9577858 |
| 65 | 230 | 0.0040676 | 54388 | 0.9618534 |
| 66 | 258 | 0.0045627 | 54646 | 0.9664161 |
| 67 | 202 | 0.0035724 | 54848 | 0.9699885 |
| 68 | 204 | 0.0036077 | 55052 | 0.9735963 |
| 69 | 162 | 0.0028650 | 55214 | 0.9764612 |
| 70 | 180 | 0.0031833 | 55394 | 0.9796445 |
| 71 | 146 | 0.0025820 | 55540 | 0.9822265 |
| 72 | 134 | 0.0023698 | 55674 | 0.9845963 |
| 73 | 111 | 0.0019630 | 55785 | 0.9865594 |
| 74 | 93 | 0.0016447 | 55878 | 0.9882041 |
| 75 | 88 | 0.0015563 | 55966 | 0.9897604 |
| 76 | 74 | 0.0013087 | 56040 | 0.9910691 |
| 77 | 78 | 0.0013794 | 56118 | 0.9924485 |
| 78 | 76 | 0.0013441 | 56194 | 0.9937926 |
| 79 | 63 | 0.0011142 | 56257 | 0.9949067 |
| 80 | 52 | 0.0009196 | 56309 | 0.9958263 |
| 81 | 32 | 0.0005659 | 56341 | 0.9963923 |
| 82 | 32 | 0.0005659 | 56373 | 0.9969582 |
| 83 | 28 | 0.0004952 | 56401 | 0.9974534 |
| 84 | 32 | 0.0005659 | 56433 | 0.9980193 |
| 85 | 23 | 0.0004068 | 56456 | 0.9984260 |
| 86 | 19 | 0.0003360 | 56475 | 0.9987620 |
| 87 | 22 | 0.0003891 | 56497 | 0.9991511 |
| 88 | 12 | 0.0002122 | 56509 | 0.9993633 |
| 89 | 9 | 0.0001592 | 56518 | 0.9995225 |
| 90 | 3 | 0.0000531 | 56521 | 0.9995756 |
| 91 | 5 | 0.0000884 | 56526 | 0.9996640 |
| 92 | 5 | 0.0000884 | 56531 | 0.9997524 |
| 93 | 4 | 0.0000707 | 56535 | 0.9998231 |
| 94 | 2 | 0.0000354 | 56537 | 0.9998585 |
| 95 | 3 | 0.0000531 | 56540 | 0.9999116 |
| 96 | 3 | 0.0000531 | 56543 | 0.9999646 |
| 99 | 1 | 0.0000177 | 56544 | 0.9999823 |
| 101 | 1 | 0.0000177 | 56545 | 1.0000000 |
# Histograma
ggplot(data, aes(x = edad_1)) +
geom_histogram(binwidth = 5, fill = "lightcoral", color = "black") +
labs(title = "Histograma de Frecuencias - Edad", x = "Edad", y = "Frecuencia")
## Warning: Removed 1 row containing non-finite outside the scale range
## (`stat_bin()`).
# Diagrama de Caja
ggplot(data, aes(x = edad_1)) +
geom_boxplot(fill = "lightcoral") +
labs(title = "Diagrama de Caja - Edad", x = "Edad")
## Warning: Removed 1 row containing non-finite outside the scale range
## (`stat_boxplot()`).
# Medidas de tendencia central y dispersión
media_edad <- mean(data$edad_1, na.rm = TRUE)
desviacion_edad <- sd(data$edad_1, na.rm = TRUE)
moda_edad <- as.numeric(names(sort(table(data$edad_1), decreasing = TRUE)[1]))
sesgo_edad <- skewness(data$edad_1, na.rm = TRUE)
minimo_edad <- min(data$edad_1, na.rm = TRUE)
maximo_edad <- max(data$edad_1, na.rm = TRUE)
cuartiles_edad <- quantile(data$edad_1, probs = c(0.25, 0.5, 0.75), na.rm = TRUE)
medidas_edad <- data.frame(
Media = media_edad,
`Desviación Estándar` = desviacion_edad,
Moda = moda_edad,
Sesgo = sesgo_edad,
Mínimo = minimo_edad,
Máximo = maximo_edad,
`1er Cuartil` = cuartiles_edad[1],
Mediana = cuartiles_edad[2],
`3er Cuartil` = cuartiles_edad[3]
)
kable(medidas_edad)
| Media | Desviación.Estándar | Moda | Sesgo | Mínimo | Máximo | X1er.Cuartil | Mediana | X3er.Cuartil | |
|---|---|---|---|---|---|---|---|---|---|
| 25% | 35.36413 | 12.69276 | 27 | 1.353733 | 18 | 101 | 26 | 32 | 41 |
Para realizar el análisis de cruces de variables con sus respectivas distribuciones conjuntas y condicionales, utilizaremos las variables de la primera base de datos (EDV_2023.csv) que incluyen:
Provincia de Inscripción (prov_insc)
Sexo del Primer Cónyuge (sexo_1)
Edad del Primer Cónyuge (edad_1)
Año de Divorcio (anio_div)
Duración del Matrimonio (dur_mat)
Realizaremos el cruce entre:
Provincia de Inscripción (prov_insc) y Sexo del Primer Cónyuge (sexo_1).
Edad del Primer Cónyuge (edad_1) y Duración del Matrimonio (dur_mat).
#Cargar Datos
# Leer los datos (reemplaza 'EDV_2023.csv' con la ruta correcta de tu archivo)
data <- read.csv('EDV_2023.csv', sep=';', stringsAsFactors=FALSE)
# Tabla de contingencia
tabla_contingencia <- table(data$prov_insc, data$sexo_1)
tabla_contingencia_df <- as.data.frame(tabla_contingencia)
names(tabla_contingencia_df) <- c('Provincia', 'Sexo', 'Frecuencia')
# Mostrar tabla de contingencia
tabla_contingencia_df
Interpretación: La tabla de contingencia muestra la distribución conjunta de las provincias de inscripción y el sexo del primer cónyuge. Esto permite identificar patrones y relaciones entre estas dos variables.
# Gráfico de Barras Apiladas
ggplot(tabla_contingencia_df, aes(x=Provincia, y=Frecuencia, fill=Sexo)) +
geom_bar(stat='identity', position='stack') +
labs(title='Distribución Conjunta de Provincia de Inscripción y Sexo del Primer Cónyuge', x='Provincia', y='Frecuencia')
### Distribución Condicional
# Distribución condicional de Sexo dado Provincia
condicional_sexo_dado_prov <- prop.table(tabla_contingencia, 1)
condicional_sexo_dado_prov_df <- as.data.frame(condicional_sexo_dado_prov)
names(condicional_sexo_dado_prov_df) <- c('Provincia', 'Sexo', 'Frecuencia Relativa')
# Mostrar tabla de distribución condicional
condicional_sexo_dado_prov_df
Interpretación: La tabla de distribución condicional muestra la proporción del sexo del primer cónyuge dado una provincia específica. Esto permite entender cómo se distribuye el sexo del primer cónyuge en función de la provincia de inscripción.
# Convertir columnas a numérico y remover NAs
data$edad_1 <- as.numeric(data$edad_1)
## Warning: NAs introduced by coercion
data$dur_mat <- as.numeric(data$dur_mat)
data_filtered <- data %>% filter(!is.na(edad_1) & !is.na(dur_mat))
# Crear tabla de frecuencias conjuntas
edad_dur_mat_cut <- data_filtered %>%
mutate(edad_group = cut(edad_1, breaks=seq(0, max(edad_1, na.rm=TRUE), by=5), right=FALSE),
dur_mat_group = cut(dur_mat, breaks=seq(0, max(dur_mat, na.rm=TRUE), by=5), right=FALSE))
tabla_frecuencias_conjunta <- table(edad_dur_mat_cut$edad_group, edad_dur_mat_cut$dur_mat_group)
tabla_frecuencias_conjunta_df <- as.data.frame(tabla_frecuencias_conjunta)
names(tabla_frecuencias_conjunta_df) <- c('Grupo de Edad', 'Grupo de Duración del Matrimonio', 'Frecuencia')
# Mostrar tabla de frecuencias conjunta
tabla_frecuencias_conjunta_df
Interpretación: La tabla de frecuencias conjunta muestra la distribución combinada de las edades y la duración del matrimonio. Esto permite identificar relaciones entre la edad al momento del matrimonio y la duración del mismo.
# Gráfico de Calor
ggplot(tabla_frecuencias_conjunta_df, aes(x=`Grupo de Edad`, y=`Grupo de Duración del Matrimonio`, fill=Frecuencia)) +
geom_tile() +
scale_fill_gradient(low="white", high="blue") +
labs(title='Distribución Conjunta de Edad del Primer Cónyuge y Duración del Matrimonio', x='Grupo de Edad', y='Grupo de Duración del Matrimonio')
### Distribución Condicional
# Filtrar datos no nulos
data_filtered_cond <- data %>% filter(!is.na(edad_1) & !is.na(dur_mat))
# Crear tabla de frecuencias condicionales
edad_dur_cond <- data_filtered_cond %>%
group_by(edad_1) %>%
summarise(Media_Dur = mean(dur_mat, na.rm=TRUE),
Mediana_Dur = median(dur_mat, na.rm=TRUE),
DesvEst_Dur = sd(dur_mat, na.rm=TRUE))
# Mostrar tabla de frecuencias condicionales
edad_dur_cond
Interpretación: La tabla de frecuencias condicionales muestra la media, mediana y desviación estándar de la duración del matrimonio para cada grupo de edad del primer cónyuge. Esto permite entender cómo varía la duración del matrimonio según la edad al momento del divorcio.
#Estadística Multivariante
Para el ACC se seleccionarán las siguientes variables de la base de datos de divorcios (EDV_2023):
Variables Independientes (X):
Edad del Primer Cónyuge (edad_1): Edad del primer cónyuge en el momento del divorcio.
Nivel de Instrucción del Primer Cónyuge (niv_inst1): Nivel educativo alcanzado por el primer cónyuge.
Número de Hijos (hijos_1): Cantidad de hijos que tiene el primer cónyuge.
Área de Residencia (area_1): Área de residencia del primer cónyuge (Urbana o Rural).
Variables Dependientes (Y):
Duración del Matrimonio (dur_mat): Tiempo que duró el matrimonio en años.
Año del Divorcio (anio_div): Año en que se formalizó el divorcio.
Antes de realizar el ACC, es necesario limpiar y transformar los datos para asegurar que sean adecuados para el análisis.
# Cargar librerías necesarias
library(readr)
library(dplyr)
# Cargar la base de datos de divorcios
edv_data <- read.csv('EDV_2023.csv', sep=';', stringsAsFactors=FALSE)
# Convertir todas las columnas a texto para manejar "Sin información"
edv_data <- edv_data %>%
mutate(across(everything(), as.character)) %>%
mutate(across(everything(), ~na_if(., "Sin información")))
# Convertir columnas relevantes a sus tipos originales después de reemplazar "Sin información"
edv_data <- edv_data %>%
mutate(
edad_1 = as.numeric(edad_1),
hijos_1 = as.numeric(hijos_1),
dur_mat = as.numeric(dur_mat),
anio_div = as.numeric(anio_div)
)
# Convertir variables categóricas a factores
edv_data <- edv_data %>%
mutate(
niv_inst1 = as.factor(niv_inst1),
area_1 = as.factor(area_1)
)
# Seleccionar variables relevantes
variables_seleccionadas <- edv_data %>%
dplyr::select(edad_1, niv_inst1, hijos_1, area_1, dur_mat, anio_div)
# Eliminar filas con valores faltantes
variables_limpias <- na.omit(variables_seleccionadas)
# Codificar variables categóricas
variables_limpias <- variables_limpias %>%
mutate(
niv_inst1 = as.numeric(niv_inst1),
area_1 = as.numeric(area_1)
)
# Definir variables independientes (X) y dependientes (Y)
X <- variables_limpias %>%
dplyr::select(edad_1, niv_inst1, hijos_1, area_1)
Y <- variables_limpias %>%
dplyr::select(dur_mat, anio_div)
# Calcular la matriz de correlación completa
correlation_matrix_complete <- cor(cbind(X, Y))
# Mostrar la matriz de correlación completa
correlation_matrix_complete
## edad_1 niv_inst1 hijos_1 area_1 dur_mat
## edad_1 1.000000000 -0.026578207 -0.06748657 0.007072953 0.71595539
## niv_inst1 -0.026578207 1.000000000 0.02351559 0.008611529 -0.09561121
## hijos_1 -0.067486565 0.023515589 1.00000000 -0.060925182 -0.04525959
## area_1 0.007072953 0.008611529 -0.06092518 1.000000000 -0.02345509
## dur_mat 0.715955391 -0.095611209 -0.04525959 -0.023455086 1.00000000
## anio_div -0.042636483 0.019812532 -0.02021665 -0.010001037 0.04734171
## anio_div
## edad_1 -0.04263648
## niv_inst1 0.01981253
## hijos_1 -0.02021665
## area_1 -0.01000104
## dur_mat 0.04734171
## anio_div 1.00000000
Edad (edad_1) y Nivel de Instrucción (niv_inst1): Correlación muy baja (-0.027), indicando poca o ninguna relación.
Edad (edad_1) y Número de Hijos (hijos_1): Correlación baja (-0.067), sugiriendo una relación muy débil.
Nivel de Instrucción (niv_inst1) y Área de Residencia (area_1): Correlación casi nula (0.009), indicando poca o ninguna relación entre la educación y el área de residencia.
Duración del Matrimonio (dur_mat) y Año del Divorcio (anio_div): Correlación muy baja (0.047), lo que sugiere que la duración del matrimonio tiene poca relación con el año del divorcio en este conjunto de datos.
Edad (edad_1) y Duración del Matrimonio (dur_mat): Correlación fuerte (0.716), lo que sugiere que la edad del primer cónyuge está fuertemente relacionada con la duración del matrimonio.
Nivel de Instrucción (niv_inst1) y Duración del Matrimonio (dur_mat): Correlación negativa baja (-0.096), indicando que niveles más bajos de instrucción podrían estar levemente asociados con matrimonios más largos.
Otras Correlaciones: Las otras correlaciones cruzadas son muy bajas, sugiriendo que no hay relaciones significativas entre estas variables y las variables dependientes (dur_mat y anio_div).
La fuerte correlación entre la edad del primer cónyuge (edad_1) y la duración del matrimonio (dur_mat) sugiere que podría ser útil realizar un Análisis de Correlación Canónica (ACC). Aunque la mayoría de las otras correlaciones son bajas, el ACC puede aún revelar combinaciones lineales de variables que explican mejor la relación entre los conjuntos de variables independientes y dependientes.
Podemos proceder con el Análisis de Correlación Canónica (ACC) porque existe una relación significativa entre algunas de las variables, particularmente entre la edad del primer cónyuge y la duración del matrimonio. Este análisis puede ayudarnos a descubrir combinaciones de variables que expliquen mejor las variaciones en las variables dependientes.
Ahora que hemos confirmado la idoneidad para realizar el ACC, aquí está el código para ejecutar el análisis:
## Realización del Análisis de Correlación Canónica
# Realizar el ACC utilizando la función cancor
cca_result <- cancor(X, Y)
# Mostrar las correlaciones canónicas
cca_result$cor
## [1] 0.72483304 0.02999001
# Mostrar las proporciones de varianza explicada
var_explained <- cca_result$cor^2
var_explained
## [1] 0.5253829373 0.0008994004
Primera Correlación Canónica (0.7248): Este valor indica que existe una correlación fuerte entre la primera combinación lineal de las variables independientes (X) y la primera combinación lineal de las variables dependientes (Y). Esto sugiere que hay una relación significativa entre las características demográficas y socioeconómicas del primer cónyuge (especialmente la edad) y la duración del matrimonio.
Segunda Correlación Canónica (0.0300): Esta correlación es extremadamente baja, lo que indica que en la segunda combinación de variables no hay una relación significativa entre los conjuntos de variables independientes y dependientes.
Primera Correlación Canónica (52.54%): Este resultado indica que la primera combinación lineal de las variables independientes explica aproximadamente el 52.54% de la varianza en la primera combinación lineal de las variables dependientes. Esto es una proporción significativa y sugiere que las variables independientes elegidas (particularmente la edad del primer cónyuge) son relevantes para explicar la duración del matrimonio y el año del divorcio.
Segunda Correlación Canónica (0.09%): La segunda correlación canónica apenas explica el 0.09% de la varianza, lo que es insignificante. Esto indica que después de considerar la primera correlación, no hay mucha información adicional que pueda ser capturada en la segunda dimensión canónica.
Significado de la Primera Correlación Canónica: La primera correlación canónica sugiere una relación sustancial entre las variables seleccionadas. Específicamente, la edad del primer cónyuge parece ser un factor importante que influye en la duración del matrimonio, y en menor medida, en el año del divorcio.
Relevancia del Análisis: La fuerte correlación canónica y la significativa proporción de varianza explicada por la primera combinación lineal de variables justifican la realización de este análisis. Nos indica que ciertas características de los cónyuges están fuertemente relacionadas con los resultados matrimoniales.
Segunda Correlación Canónica: La baja varianza explicada por la segunda correlación canónica indica que no hay relaciones adicionales significativas que no se hayan capturado ya en la primera correlación.
# Cargar las librerías necesarias
library(readr)
library(dplyr)
library(ggplot2)
library(FactoMineR)
library(factoextra)
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
library(psych)
# Convertir todas las columnas a texto para manejar "Sin información"
edv_data <- edv_data %>%
mutate(across(everything(), as.character)) %>%
mutate(across(everything(), ~na_if(., "Sin información")))
# Convertir columnas relevantes a numéricas
edv_data <- edv_data %>%
mutate(
edad_1 = as.numeric(edad_1),
hijos_1 = as.numeric(hijos_1),
dur_mat = as.numeric(dur_mat),
anio_div = as.numeric(anio_div)
)
# Eliminar filas con datos faltantes
edv_data <- na.omit(edv_data)
# Seleccionar variables para el ACP (aquí elegimos las variables continuas que tengan sentido)
data_acp <- dplyr::select(edv_data, edad_1, hijos_1, dur_mat, anio_div)
# Escalar las variables
data_acp_scaled <- scale(data_acp)
Realizamos el Análisis de Componentes Principales utilizando el conjunto de datos preparado.
# Realizar el ACP
acp_result <- PCA(data_acp_scaled, graph = FALSE)
# Resumen del ACP
summary(acp_result)
##
## Call:
## PCA(X = data_acp_scaled, graph = FALSE)
##
##
## Eigenvalues
## Dim.1 Dim.2 Dim.3 Dim.4
## Variance 1.728 1.014 0.982 0.276
## % of var. 43.191 25.358 24.551 6.900
## Cumulative % of var. 43.191 68.548 93.100 100.000
##
## Individuals (the 10 first)
## Dist Dim.1 ctr cos2 Dim.2 ctr cos2 Dim.3 ctr
## 1 | 1.008 | 0.954 0.003 0.895 | 0.306 0.000 0.092 | 0.041 0.000
## 2 | 3.411 | 3.354 0.034 0.967 | -0.499 0.001 0.021 | -0.194 0.000
## 3 | 2.270 | -0.842 0.002 0.138 | -1.491 0.012 0.432 | -1.418 0.011
## 4 | 3.426 | 3.357 0.034 0.960 | -0.493 0.001 0.021 | -0.186 0.000
## 5 | 0.656 | -0.303 0.000 0.214 | -0.240 0.000 0.134 | -0.492 0.001
## 6 | 1.674 | -1.527 0.007 0.832 | -0.112 0.000 0.004 | -0.546 0.002
## 7 | 0.793 | 0.391 0.000 0.243 | -0.257 0.000 0.105 | -0.400 0.001
## 8 | 1.019 | 0.878 0.002 0.743 | -0.315 0.001 0.095 | -0.385 0.001
## 9 | 0.888 | 0.494 0.001 0.310 | -0.319 0.001 0.129 | -0.451 0.001
## 10 | 1.400 | -0.558 0.001 0.159 | -0.830 0.004 0.351 | -0.913 0.004
## cos2
## 1 0.002 |
## 2 0.003 |
## 3 0.390 |
## 4 0.003 |
## 5 0.563 |
## 6 0.106 |
## 7 0.254 |
## 8 0.143 |
## 9 0.258 |
## 10 0.425 |
##
## Variables
## Dim.1 ctr cos2 Dim.2 ctr cos2 Dim.3 ctr cos2
## edad_1 | 0.924 49.425 0.854 | -0.094 0.874 0.009 | 0.010 0.009 0.000 |
## hijos_1 | -0.137 1.084 0.019 | -0.564 31.337 0.318 | 0.814 67.546 0.663 |
## dur_mat | 0.924 49.436 0.854 | -0.017 0.028 0.000 | 0.093 0.872 0.009 |
## anio_div | 0.031 0.055 0.001 | 0.829 67.761 0.687 | 0.557 31.573 0.310 |
# Visualización del Scree Plot para ver la varianza explicada
fviz_eig(acp_result, addlabels = TRUE, ylim = c(0, 100))
#### Interpretación:
Los dos primeros componentes principales (Dim.1 y Dim.2) explican conjuntamente el 68.5% de la varianza total. Si incluimos el tercer componente (Dim.3), alcanzamos un 93.1% de la varianza explicada. Esto sugiere que los tres primeros componentes capturan la mayoría de la información en los datos, por lo que podrían ser suficientes para interpretar los patrones en los datos.
Dim.1 está fuertemente influenciado por edad_1 y dur_mat, que tienen una cos2 alta, indicando que estas variables están bien representadas por el primer componente.
Dim.2 tiene una influencia significativa de hijos_1 y anio_div, lo que indica que estas variables son importantes en el segundo componente.
Dim.3 también tiene una influencia notable de hijos_1 y anio_div.
# Realizar el Análisis de Componentes Principales (ACP)
acp_result <- PCA(data_acp_scaled, graph = FALSE)
# Definir la variable 'individuals' con las coordenadas de los individuos en el espacio de los componentes principales
individuals <- as.data.frame(acp_result$ind$coord)
# Definir la variable 'variables' con las coordenadas de las variables en el espacio de los componentes principales
variables <- as.data.frame(acp_result$var$coord)
# Etiquetar solo un subconjunto de individuos
subset_individuals <- individuals[sample(nrow(individuals), 100), ] # Muestra aleatoria de 100 individuos
# Crear el Biplot con etiquetas limitadas
ggplot(individuals, aes(x = Dim.1, y = Dim.2)) +
geom_point(aes(color = "Individuos"), size = 2) +
geom_text_repel(data = subset_individuals, aes(label = rownames(subset_individuals)), size = 3) +
geom_segment(data = variables, aes(x = 0, y = 0, xend = Dim.1, yend = Dim.2),
arrow = arrow(length = unit(0.3, "cm")), color = "blue") +
geom_text(data = variables, aes(x = Dim.1, y = Dim.2, label = rownames(variables)),
color = "blue", vjust = -1, size = 4) +
labs(title = "Biplot sin Rotación (Etiquetas Limitadas)", x = "Dim.1", y = "Dim.2") +
theme_minimal()
## Warning: ggrepel: 88 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps
## Biplot sin Rotación con Muestra Reducida
# Reducir la muestra de individuos
individuals_sample <- individuals[sample(nrow(individuals), 500), ] # Muestra aleatoria de 500 individuos
# Crear el Biplot con una muestra reducida
ggplot(individuals_sample, aes(x = Dim.1, y = Dim.2)) +
geom_point(aes(color = "Individuos"), size = 2) +
geom_text_repel(data = subset_individuals, aes(label = rownames(subset_individuals)), size = 3) +
geom_segment(data = variables, aes(x = 0, y = 0, xend = Dim.1, yend = Dim.2),
arrow = arrow(length = unit(0.3, "cm")), color = "blue") +
geom_text(data = variables, aes(x = Dim.1, y = Dim.2, label = rownames(variables)),
color = "blue", vjust = -1, size = 4) +
labs(title = "Biplot sin Rotación (Muestra Reducida)", x = "Dim.1", y = "Dim.2") +
theme_minimal()
## Warning: ggrepel: 71 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps
En este Biplot, podemos observar lo siguiente:
Los vectores (edad_1, dur_mat, hijos_1, anio_div) indican la dirección y la contribución de cada variable en los componentes principales.
edad_1 y dur_mat están fuertemente alineados con el primer componente principal (Dim.1), lo que refuerza la idea de que estas variables están altamente correlacionadas y son las que más contribuyen a la varianza explicada por el primer componente.
hijos_1 y anio_div parecen tener una mayor influencia en la segunda dimensión (Dim.2), aunque con menor contribución en comparación con edad_1 y dur_mat.
Los puntos representan individuos (en este caso, con la muestra reducida).
La dispersión de los individuos en el espacio de los componentes muestra que la mayoría están agrupados alrededor del centro del gráfico, con algunos individuos alejados que podrían ser considerados como outliers o puntos extremos.
Las variables edad_1 y dur_mat están positivamente correlacionadas entre sí, lo que se observa porque los vectores están alineados en la misma dirección.
hijos_1 tiene una orientación casi perpendicular a edad_1 y dur_mat, lo que sugiere que no está muy correlacionado con estas variables.
# Cargar librerías necesarias
library(psych)
library(corrplot)
## corrplot 0.94 loaded
library(ggplot2)
library(GGally)
library(FactoMineR)
library(factoextra)
# Cargar los datos (usaremos la misma base de datos que utilizaste previamente)
data <- read.csv('EDV_2023.csv', sep=';', stringsAsFactors = FALSE)
# Limpieza y preparación de datos (ajusta según tus variables de interés)
data <- data %>%
mutate(across(everything(), as.character)) %>%
mutate(across(everything(), ~na_if(., "Sin información"))) %>%
mutate(
edad_1 = as.numeric(edad_1),
hijos_1 = as.numeric(hijos_1),
dur_mat = as.numeric(dur_mat),
anio_div = as.numeric(anio_div)
)
# Eliminar filas con datos faltantes
data <- na.omit(data)
# Seleccionar variables para el Análisis Factorial sin utilizar select directamente en la pipe
data_af <- data[, c("edad_1", "hijos_1", "dur_mat", "anio_div")]
# Escalar las variables
data_af_scaled <- scale(data_af)
Antes de realizar el análisis factorial, validamos la idoneidad de los datos con las pruebas KMO y de Bartlett.
# Prueba de KMO
kmo_result <- KMO(data_af_scaled)
kmo_result
## Kaiser-Meyer-Olkin factor adequacy
## Call: KMO(r = data_af_scaled)
## Overall MSA = 0.49
## MSA for each item =
## edad_1 hijos_1 dur_mat anio_div
## 0.50 0.73 0.50 0.16
# Prueba de esfericidad de Bartlett
bartlett_test <- cortest.bartlett(cor(data_af_scaled))
## Warning in cortest.bartlett(cor(data_af_scaled)): n not specified, 100 used
bartlett_test
## $chisq
## [1] 72.08798
##
## $p.value
## [1] 1.524106e-13
##
## $df
## [1] 6
El p-valor es extremadamente bajo, lo que indica que la matriz de correlación es significativamente diferente de la matriz identidad. Esto sugiere que las variables están correlacionadas y, en principio, podría ser adecuado realizar un análisis factorial.
# Realizar el Análisis Factorial sin rotación
af_result <- fa(data_af_scaled, nfactors = 2, rotate = "none", fm = "ml")
# Extraer las coordenadas de los factores y las variables
factor_scores <- as.data.frame(af_result$scores)
loadings <- as.data.frame(af_result$loadings[,1:2])
# Crear el Biplot
ggplot(factor_scores, aes(x = ML1, y = ML2)) +
geom_point(aes(color = "Individuos")) +
geom_segment(data = loadings, aes(x = 0, y = 0, xend = ML1, yend = ML2),
arrow = arrow(length = unit(0.3, "cm")), color = "red") +
geom_text(data = loadings, aes(x = ML1, y = ML2, label = rownames(loadings)),
color = "red", vjust = -1, size = 4) +
labs(title = "Análisis Factorial sin Rotación", x = "Factor 1", y = "Factor 2") +
theme_minimal()
## Biplot Mejorado para Análisis Factorial sin Rotación
# Realizar el Análisis Factorial sin rotación
af_result <- fa(data_af_scaled, nfactors = 2, rotate = "none", fm = "ml")
# Extraer las coordenadas de los factores y las variables
factor_scores <- as.data.frame(af_result$scores)
loadings <- as.data.frame(af_result$loadings[,1:2])
# Reducir la muestra de individuos para un gráfico más claro
set.seed(123) # Para reproducibilidad
factor_scores_sample <- factor_scores[sample(nrow(factor_scores), 300), ] # Muestra de 300 individuos
# Crear el Biplot con ajustes de visibilidad
ggplot(factor_scores_sample, aes(x = ML1, y = ML2)) +
geom_point(aes(color = "Individuos"), size = 2, alpha = 0.6) + # Puntos con transparencia
geom_segment(data = loadings, aes(x = 0, y = 0, xend = ML1, yend = ML2),
arrow = arrow(length = unit(0.3, "cm")), color = "red", linewidth = 1.5) +
geom_text(data = loadings, aes(x = ML1, y = ML2, label = rownames(loadings)),
color = "red", vjust = -1.5, hjust = 1.5, size = 5) + # Ajuste manual de etiquetas
labs(title = "Análisis Factorial sin Rotación", x = "Factor 1", y = "Factor 2") +
theme_minimal() +
theme(legend.position = "none") +
xlim(min(loadings$ML1) - 0.5, max(loadings$ML1) + 0.5) + # Ajustar los límites del eje X
ylim(min(loadings$ML2) - 0.5, max(loadings$ML2) + 0.5) # Ajustar los límites del eje Y
## Warning: Removed 182 rows containing missing values or values outside the scale range
## (`geom_point()`).
En el gráfico original, teníamos una gran cantidad de puntos que
representaban a los individuos. Esto causaba una saturación visual que
hacía difícil apreciar las flechas que representan las cargas de las
variables (edad_1, dur_mat, hijos_1, anio_div).
Los puntos estaban tan juntos que las flechas y las etiquetas de las variables no se podían diferenciar fácilmente, lo que dificultaba la interpretación del gráfico.
Para mejorar la claridad del gráfico, se decidió reducir el número de puntos representados en el gráfico.
Se seleccionó una muestra aleatoria de 300 individuos (de los muchos que estaban presentes) para que los puntos no saturen la visualización, permitiendo que las flechas de las variables sean más visibles.
Esta técnica no afecta significativamente la interpretación general del análisis factorial porque estamos interesados en la relación entre las variables más que en la dispersión individual de los puntos.
Cargas Factoriales y Variables:
edad_1: Está fuertemente cargada en el Factor 1, lo que indica que esta variable es muy influyente en el primer factor. Esto sugiere que edad_1 explica una parte significativa de la varianza asociada con este factor.
dur_mat: Similar a edad_1, dur_mat también está fuertemente asociada con el Factor 1, lo que sugiere que la duración del matrimonio es una variable importante en este factor.
hijos_1 y anio_div: Estas dos variables tienen cargas más cercanas al origen y no están tan claramente alineadas con uno de los factores, lo que indica que tienen una menor influencia o que su contribución está dividida entre los factores.
Relación entre Factores y Variables:
Factor 1 parece estar relacionado con características temporales o demográficas, como la edad y la duración del matrimonio.
Factor 2 no tiene una carga clara de las variables seleccionadas, lo que puede indicar que se requieren más factores o que las variables no se dividen claramente en dos factores.
library(ggplot2)
library(ggforce)
library(ggrepel)
# Extraer las cargas factoriales de las variables
loadings <- as.data.frame(af_result$loadings[,1:2])
colnames(loadings) <- c("Factor1", "Factor2")
# Crear el Círculo Unitario con vectores
ggplot(loadings, aes(x = Factor1, y = Factor2)) +
geom_segment(aes(x = 0, y = 0, xend = Factor1, yend = Factor2),
arrow = arrow(length = unit(0.3, "cm")), color = "red", size = 1) +
geom_text_repel(aes(label = rownames(loadings)), color = "red", size = 5) +
geom_hline(yintercept = 0, linetype = "dashed", color = "gray") +
geom_vline(xintercept = 0, linetype = "dashed", color = "gray") +
ggforce::geom_circle(aes(x0 = 0, y0 = 0, r = 1), color = "black", inherit.aes = FALSE) +
coord_fixed() +
labs(title = "Círculo Unitario", x = "Factor 1", y = "Factor 2") +
theme_minimal()
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## Warning in ggforce::geom_circle(aes(x0 = 0, y0 = 0, r = 1), color = "black", : All aesthetics have length 1, but the data has 4 rows.
## ℹ Please consider using `annotate()` or provide this layer with data containing
## a single row.
El gráfico del Círculo Unitario muestra cómo las variables seleccionadas (edad_1, dur_mat, hijos_1, anio_div) se proyectan en el espacio de los dos factores principales obtenidos del Análisis Factorial.
dur_mat (Duración del Matrimonio): Este vector está bastante cerca del borde del círculo y se encuentra en el cuadrante positivo del Factor 1. Esto indica que dur_mat está fuertemente correlacionado con el Factor 1, y tiene una influencia significativa en este factor.
edad_1 (Edad del Primer Cónyuge): Similar a dur_mat, este vector también está cerca del borde del círculo y en el lado positivo del Factor 1. Esto sugiere que edad_1 también está fuertemente correlacionada con el Factor 1 y contribuye significativamente a este factor.
hijos_1 (Número de Hijos): Este vector es más corto y está más cerca del origen, lo que indica una correlación más débil con ambos factores. Su posición cerca del origen sugiere que hijos_1 no está fuertemente correlacionado con ninguno de los factores.
anio_div (Año de Divorcio): Similar a hijos_1, este vector es corto y está cerca del origen, indicando una baja correlación con los factores. Esto sugiere que anio_div no contribuye significativamente a ninguno de los factores.
dur_mat y edad_1: Estos dos vectores están alineados en la misma dirección en el espacio del Factor 1, lo que indica que están positivamente correlacionados entre sí. Esto tiene sentido, ya que la edad y la duración del matrimonio pueden estar relacionadas en contextos demográficos.
hijos_1 y anio_div: Estos vectores están más dispersos y tienen una menor correlación con los factores principales. Esto sugiere que estas variables no están tan bien representadas por los factores obtenidos.
Factor 1 (Eje X): Parece representar un factor relacionado con la “edad” y la “duración del matrimonio”, dado que edad_1 y dur_mat están fuertemente asociados con este factor.
Factor 2 (Eje Y): No parece estar tan claramente definido por las variables presentes, ya que ninguna de las variables tiene una fuerte carga en esta dimensión. Esto sugiere que los datos pueden requerir más factores o que las variables seleccionadas no capturan bien la varianza explicada por el segundo factor.
# Cargar las librerías necesarias
library(ggplot2)
library(MASS) # Para realizar MDS usando isoMDS
library(ggrepel)
library(cluster) # Para realizar clustering
# Paso 1: Cargar los datos desde el archivo CSV
data <- read.csv('EDV_2023.csv', sep = ';', stringsAsFactors = FALSE)
# Paso 2: Seleccionar las variables de interés
data_af <- data.frame(
edad_1 = as.numeric(data$edad_1), # Edad del Primer Cónyuge
dur_mat = as.numeric(data$dur_mat), # Duración del Matrimonio
hijos_1 = as.numeric(data$hijos_1), # Número de Hijos
anio_div = as.numeric(data$anio_div) # Año de Divorcio
)
## Warning in data.frame(edad_1 = as.numeric(data$edad_1), dur_mat =
## as.numeric(data$dur_mat), : NAs introduced by coercion
## Warning in data.frame(edad_1 = as.numeric(data$edad_1), dur_mat =
## as.numeric(data$dur_mat), : NAs introduced by coercion
# Remover filas con valores NA
data_af <- na.omit(data_af)
# Paso 3: Seleccionar una muestra más pequeña de 30 observaciones
set.seed(123) # Para reproducibilidad
data_sample <- data_af[sample(nrow(data_af), 30), ]
# Paso 4: Escalar los datos
data_af_scaled <- scale(data_sample)
# Paso 5: Calcular la matriz de distancias usando distancia euclidiana
dist_matrix <- dist(data_af_scaled, method = "euclidean")
# Paso 6: Realizar MDS con isoMDS
mds_result <- isoMDS(dist_matrix, k = 2)
## initial value 13.014230
## iter 5 value 8.977331
## final value 8.931464
## converged
# Paso 7: Extraer las coordenadas de los puntos
mds_coords <- as.data.frame(mds_result$points)
colnames(mds_coords) <- c("Dim1", "Dim2")
# Paso 8: Realizar Clustering para Agrupaciones
clusters <- kmeans(mds_coords, centers = 5)$cluster # Cambia 'centers' según el número de grupos deseados
mds_coords$Cluster <- as.factor(clusters)
# Paso 9: Crear el Biplot con Agrupaciones
ggplot(mds_coords, aes(x = Dim1, y = Dim2, label = rownames(mds_coords))) +
geom_point(aes(color = Cluster), size = 3) +
geom_text_repel(size = 3, color = "red") +
stat_ellipse(aes(color = Cluster), type = "norm", linetype = 2) + # Dibujar elipses alrededor de los clusters
labs(title = "Biplot del Escalado Multidimensional (isoMDS) con Agrupaciones",
x = "Dimensión 1", y = "Dimensión 2") +
theme_minimal()
## Too few points to calculate an ellipse
## Warning: The following aesthetics were dropped during statistical transformation: label.
## ℹ This can happen when ggplot fails to infer the correct grouping structure in
## the data.
## ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
## variable into a factor?
## Warning: Removed 1 row containing missing values or values outside the scale range
## (`geom_path()`).
## Warning: ggrepel: 4 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps
# Paso 9: Estimación de Stress
mds_stress <- mds_result$stress / 100
cat("Estimación de Stress:", mds_stress, "\n")
## Estimación de Stress: 0.08931464
Dado que las variables utilizadas están directamente relacionadas con características clave de las parejas divorciadas, el MDS proyecta estas relaciones en dos dimensiones:
Dimensión 1 y Dimensión 2: Estas son las dos dimensiones principales que resultan del MDS. Representan una proyección de las distancias originales en un espacio de menor dimensión, de manera que las distancias entre puntos en este gráfico se aproximan lo mejor posible a las distancias en el espacio original.
Cluster 1 (Rojo): Este grupo incluye observaciones que están algo dispersas a lo largo de las Dimensiones 1 y 2, pero que tienden a estar más alejadas de otros grupos. Este grupo podría representar individuos con características distintivas en comparación con otros clusters.
Cluster 2 (Verde): Este grupo es más compacto y está posicionado en la parte superior derecha del gráfico. Las observaciones en este cluster pueden compartir características que las hacen más similares entre sí en comparación con otros grupos.
Cluster 3 (Azul): Este es un cluster bien definido y compacto en la parte izquierda del gráfico, lo que sugiere que las observaciones en este grupo son muy similares entre sí y diferentes de los demás clusters.
Cluster 4 (Amarillo): Este grupo tiene una dispersión moderada y está ubicado en la parte superior central del gráfico. Esto indica similitudes internas pero con alguna variabilidad dentro del grupo.
Cluster 5 (Morado): Este grupo es relativamente compacto y se encuentra en el centro del gráfico. Las observaciones en este grupo tienen características comunes pero son distintas de las de otros clusters.
Las elipses dibujadas alrededor de los clusters representan la variabilidad de las observaciones dentro de cada grupo. Cuanto más pequeña es la elipse, más similares son las observaciones dentro de ese cluster. Clusters con elipses más grandes pueden contener observaciones con mayor variabilidad interna.
Stress = 0.0893: Este valor indica la calidad del ajuste del MDS. Un valor de Stress por debajo de 0.1 es generalmente considerado como una indicación de un buen ajuste, lo que significa que las distancias entre puntos en el espacio reducido (el gráfico) reflejan bastante bien las distancias originales en el espacio de datos completo.
Utilizaremos la misma muestra que seleccionamos anteriormente, lo cual garantiza la consistencia entre los análisis.
Utilizaremos la función ca del paquete ca para realizar el análisis de correspondencia, que es adecuado para este tipo de visualización.
# Cargar las librerías necesarias
library(ggplot2)
library(ca)
library(ggrepel)
# Paso 1: Categorización de las Variables
data_sample$edad_cat <- cut(data_sample$edad_1, breaks = 4, labels = c("Joven", "Mediana", "Adulta", "Mayor"))
data_sample$dur_mat_cat <- cut(data_sample$dur_mat, breaks = 4, labels = c("Corto", "Mediano", "Largo", "Muy Largo"))
# Paso 2: Creación de la Tabla de Contingencia para dos variables
contingency_table <- table(data_sample$edad_cat, data_sample$dur_mat_cat)
# Paso 3: Realizar el Análisis de Correspondencia
ca_result <- ca(contingency_table)
# Extraer la varianza explicada por las dimensiones (en porcentaje)
dim1_var_explained <- summary(ca_result)$scree[1, 2]
dim2_var_explained <- summary(ca_result)$scree[2, 2]
# Paso 4: Preparar los datos para el gráfico
row_coords <- as.data.frame(ca_result$rowcoord)
colnames(row_coords) <- c("Dim1", "Dim2")
row_coords$category <- "Edad"
row_coords$name <- rownames(ca_result$rowcoord)
col_coords <- as.data.frame(ca_result$colcoord)
colnames(col_coords) <- c("Dim1", "Dim2")
col_coords$category <- "Duración Matrimonio"
col_coords$name <- rownames(ca_result$colcoord)
plot_data <- rbind(row_coords, col_coords)
# Paso 5: Generar el Biplot con símbolos diferentes y leyenda
ggplot(plot_data, aes(x = Dim1, y = Dim2, color = category, shape = category)) +
geom_point(size = 4) +
geom_text_repel(aes(label = name), size = 3, show.legend = FALSE) +
scale_color_manual(values = c("Edad" = "blue", "Duración Matrimonio" = "red")) +
scale_shape_manual(values = c("Edad" = 16, "Duración Matrimonio" = 17)) +
labs(title = "Análisis de Correspondencia - Biplot",
x = paste0("Dim 1 (", round(dim1_var_explained, 2), "%)"),
y = paste0("Dim 2 (", round(dim2_var_explained, 2), "%)")) +
theme_minimal() +
theme(legend.position = "bottom") +
guides(shape = guide_legend(title = "Categorías", nrow = 1),
color = guide_legend(title = "Categorías", nrow = 1))
El gráfico muestra un Análisis de Correspondencia entre las categorías
de Edad (en azul) y Duración del Matrimonio (en rojo). En la Dimensión 1
(que explica el 0.67% de la varianza), podemos observar que las
categorías “Joven” y “Corto” están cercanas, lo que sugiere que las
personas jóvenes tienden a tener matrimonios de corta duración. De
manera similar, “Mayor” está alineada con “Largo”, indicando que los
matrimonios de mayor duración están asociados con personas de mayor
edad.
En la Dimensión 2 (que explica el 0.36% de la varianza), notamos una agrupación de “Muy Largo” con “Adulta”, lo que podría sugerir que los matrimonios muy largos están relacionados con personas adultas. Sin embargo, la varianza explicada es baja, lo que indica que estas relaciones son relativamente débiles y que otras dimensiones podrían ser necesarias para capturar completamente las asociaciones entre estas categorías.
Para realizar un Análisis de Conglomerados (o Clustering) correctamente, seguiremos estos pasos, asegurándonos de clasificar los elementos en subconjuntos homogéneos, como has solicitado. El proceso incluirá:
Selección de Variables: Usaremos variables relevantes de tu base de datos.
Normalización de Datos: Para asegurar que las variables tengan la misma escala.
Cálculo de la Distancia: Utilizaremos una métrica de distancia apropiada (por ejemplo, distancia euclidiana).
Método de Agrupamiento: Utilizaremos un método de agrupamiento jerárquico (como Ward’s method).
Generación del Dendrograma: Visualizaremos el dendrograma para identificar los conglomerados.
Corte del Dendrograma: Determinaremos el número óptimo de conglomerados y realizaremos el corte.
Asignación de Etiquetas: Cada elemento será asignado a un conglomerado.
Vamos a utilizar algunas de las variables que ya hemos estado trabajando: edad_1, dur_mat, hijos_1, y anio_div.
A continuación, te proporciono el código que sigue los pasos mencionados:
# Cargar las librerías necesarias
library(ggplot2)
library(cluster)
library(factoextra)
# Paso 1: Selección de Variables y Filtrado de Datos utilizando subsetting
data_cluster <- data_sample[, c("edad_1", "dur_mat", "hijos_1", "anio_div")]
# Eliminar filas con NA
data_cluster <- na.omit(data_cluster)
# Paso 2: Normalización de Datos
data_scaled <- scale(data_cluster)
# Paso 3: Cálculo de la Matriz de Distancia
dist_matrix <- dist(data_scaled, method = "euclidean")
# Paso 4: Método de Agrupamiento Jerárquico (Ward's Method)
hc <- hclust(dist_matrix, method = "ward.D2")
# Paso 5: Generación del Dendrograma sin especificar colores
fviz_dend(hc, k = 4, # Corte en 4 grupos
cex = 0.6, # Tamaño de la etiqueta
color_labels_by_k = TRUE, # Color por grupos
rect = TRUE, # Dibujar rectángulos alrededor de los clusters
rect_fill = TRUE)
## Warning: The `<scale>` argument of `guides()` cannot be `FALSE`. Use "none" instead as
## of ggplot2 3.3.4.
## ℹ The deprecated feature was likely used in the factoextra package.
## Please report the issue at <https://github.com/kassambara/factoextra/issues>.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
# Paso 6: Corte del Dendrograma y Asignación de Etiquetas
clusters <- cutree(hc, k = 4) # Aquí se define el número de conglomerados
data_cluster$Cluster <- as.factor(clusters)
# Paso 7: Visualización de los Conglomerados en un Biplot usando ggplot2 directamente
data_scaled <- as.data.frame(data_scaled)
data_scaled$Cluster <- as.factor(clusters)
ggplot(data_scaled, aes(x = edad_1, y = dur_mat, color = Cluster)) +
geom_point(size = 3) +
theme_minimal() +
labs(title = "Visualización de los Conglomerados",
x = "Edad del Primer Cónyuge (edad_1)",
y = "Duración del Matrimonio (dur_mat)")
#### Análisis ##### Primer gráfico
El dendrograma generado muestra cómo se agrupan los elementos (observaciones) de tus datos en función de las variables seleccionadas (edad_1, dur_mat, hijos_1, anio_div). En este dendrograma:
Eje Vertical (Height): Representa la “distancia” o “disimilitud” entre los conglomerados cuando se agrupan. Cuanto más alto es el enlace entre dos grupos, más diferentes son esos grupos entre sí.
Eje Horizontal (Números en la parte inferior): Los números que aparecen en la parte inferior del dendrograma corresponden a las identificaciones de las observaciones en tu conjunto de datos. Estos números son simplemente los índices o identificadores de las observaciones en tu conjunto de datos reducido para este análisis.
Conglomerados: Los colores indican los diferentes conglomerados o grupos formados en el corte del dendrograma (se han identificado 4 grupos). Estos conglomerados son subconjuntos de observaciones que son más similares entre sí según las variables analizadas.
El gráfico de dispersión muestra cómo las observaciones se agrupan en función de dos de las variables seleccionadas: Edad del Primer Cónyuge (edad_1) y Duración del Matrimonio (dur_mat):
El eje X representa la Edad del Primer Cónyuge (edad_1). El eje Y representa la Duración del Matrimonio (dur_mat). Colores:
Cada punto en el gráfico representa una observación, y el color del punto indica el conglomerado al que pertenece, según el análisis de clustering realizado. Distribución de Conglomerados:
Conglomerado 1 (Rojo): Observaciones con edades bajas y matrimonios de corta duración.
Conglomerado 2 (Verde): Observaciones con una amplia gama de edades y duraciones de matrimonio más variadas, pero generalmente cortas.
Conglomerado 3 (Cian): Observaciones con edades y duraciones de matrimonio mayores.
Conglomerado 4 (Violeta): Similar al conglomerado 2, pero con ligeras diferencias en la combinación de edad y duración del matrimonio.
Vamos a utilizar los conglomerados en el paso anterior como la variable de grupo en el análisis discriminante. Las variables predictoras serán las que usaste para formar los conglomerados (edad_1, dur_mat, hijos_1, anio_div).
# Cargar las librerías necesarias
library(MASS)
library(ggplot2)
library(factoextra)
# Paso 1: Preparar los datos
# Asegúrate de que 'data_cluster' y 'clusters' estén definidos en el entorno de trabajo
# Seleccionar solo las columnas necesarias para el análisis
data_lda <- data_cluster[, c("edad_1", "dur_mat", "hijos_1", "anio_div")]
# Añadir la variable de grupo (Cluster)
data_lda$Cluster <- as.factor(clusters)
# Paso 2: Realizar el Análisis Discriminante Lineal (LDA)
lda_model <- lda(Cluster ~ ., data = data_lda)
# Ver los resultados del modelo
lda_model
## Call:
## lda(Cluster ~ ., data = data_lda)
##
## Prior probabilities of groups:
## 1 2 3 4
## 0.1333333 0.5333333 0.2000000 0.1333333
##
## Group means:
## edad_1 dur_mat hijos_1 anio_div
## 1 40.25000 13.7500 1.5 2023.000
## 2 41.62500 11.4375 0.0 2023.000
## 3 64.16667 32.0000 0.0 2022.667
## 4 45.25000 13.2500 0.0 2021.750
##
## Coefficients of linear discriminants:
## LD1 LD2 LD3
## edad_1 -0.013932294 0.05462340 -0.04706919
## dur_mat -0.007644009 0.09952963 -0.05960667
## hijos_1 -5.131409187 0.82754675 0.43606798
## anio_div -0.596182051 -2.12704506 -2.78785765
##
## Proportion of trace:
## LD1 LD2 LD3
## 0.6100 0.2391 0.1509
# Paso 3: Predicciones y Proyección en el Espacio Discriminante
lda_values <- predict(lda_model)
# Paso 4: Visualización de los Grupos en el Espacio Discriminante
lda_data <- data.frame(lda_values$x, Cluster = data_lda$Cluster)
ggplot(lda_data, aes(x = LD1, y = LD2, color = Cluster)) +
geom_point(size = 3) +
theme_minimal() +
labs(title = "Análisis Discriminante Lineal (LDA)",
x = "Primera Discriminante Lineal (LD1)",
y = "Segunda Discriminante Lineal (LD2)") +
theme(legend.position = "right")
El análisis discriminante sugiere que el año del divorcio (anio_div) y la edad del primer cónyuge (edad_1) son las variables más influyentes para diferenciar entre los conglomerados principales (especialmente entre el Grupo 1 y los otros). La duración del matrimonio y el número de hijos también juegan un rol importante, particularmente en la separación entre los otros grupos. La proyección en el espacio de las discriminantes lineales muestra que los conglomerados están bien diferenciados, lo que indica un buen ajuste del modelo LDA a los datos.
El presente análisis se centró en estudiar las características demográficas y sociales de las parejas que se casaron y se divorciaron en el año 2023. La población objetivo consistió en todas las parejas registradas en los registros civiles de diversas provincias del país. Para efectos de análisis y por motivos de representatividad y manejabilidad de los datos, se tomó una muestra de tamaño n = 30, seleccionada aleatoriamente para garantizar la validez estadística de los resultados.
El análisis de correlación canónica reveló una fuerte relación entre la edad del primer cónyuge y la duración del matrimonio (correlación canónica = 0.7248). Esto sugiere que las personas que se casan a una edad mayor tienden a tener matrimonios más largos, una tendencia que se observó consistentemente en los datos.
El Análisis de Componentes Principales (ACP) mostró que los dos primeros componentes principales explicaron el 68.5% de la varianza total en las variables estudiadas. Las variables edad del primer cónyuge y duración del matrimonio fueron las que más contribuyeron a la varianza explicada por el primer componente, lo que refuerza la importancia de estas variables en la caracterización de los matrimonios y divorcios.
En el Análisis Factorial, se identificaron dos factores principales que explican la varianza en los datos. El primer factor estuvo fuertemente influenciado por las variables edad del primer cónyuge y duración del matrimonio, mientras que el segundo factor mostró una menor claridad en su definición, indicando que podría haber otros factores latentes no capturados por las variables incluidas.
El MDS proyectó las relaciones entre las observaciones en dos dimensiones principales, revelando la existencia de cinco conglomerados claramente definidos. La estimación de stress fue de 0.0893, indicando un buen ajuste del modelo a los datos. Esto sugiere que las características demográficas y sociales de las parejas pueden ser agrupadas en subconjuntos homogéneos que presentan patrones similares.
El Análisis de Correspondencia mostró asociaciones entre las categorías de edad y la duración del matrimonio. Por ejemplo, las personas jóvenes tienden a tener matrimonios de corta duración, mientras que las personas mayores están más asociadas con matrimonios de larga duración. Aunque la varianza explicada por las dimensiones principales fue baja, los patrones observados fueron coherentes con las tendencias demográficas esperadas.
El Análisis de Conglomerados permitió clasificar las observaciones en cuatro grupos principales. Estos conglomerados mostraron diferencias significativas en términos de la edad del primer cónyuge y la duración del matrimonio. El dendrograma y el gráfico de dispersión confirmaron la existencia de grupos bien diferenciados, lo que indica una estructura clara en los datos.
El Análisis Discriminante Lineal (LDA) confirmó que la edad del primer cónyuge y el año del divorcio son las variables más discriminantes entre los conglomerados identificados. El modelo logró separar adecuadamente los grupos en el espacio discriminante, mostrando una clara diferenciación entre los distintos perfiles de parejas estudiadas.
Finalmente, es importante destacar que, la utilización de diversas técnicas estadísticas multivariadas ha permitido una comprensión profunda de las características que diferencian a las parejas en función de su situación matrimonial.