rm(list = ls()) # Se utiliza para borrar todos los objetos del espacio de trabajo.
graphics.off() # Se utiliza para cerrar todas las ventanas gráficas abiertas.
#install.packages("tidyverse")
#install.packages("rvest")
#install.packages("readr")
#install.packages("readxl")
#install.packages("dplyr")
#install.packages("ggplot2")
#install.packages("plotly")
#install.packages("stringi")
#install.packages("tibble")
#install.packages("purrr")
#install.packages("knitr")

library(tidyverse) # Manipulación y visualización de datos.
library(rvest) # Extraer datos de páginas web (web scraping).
library(readr) # Lectura rápida de archivos de texto como CSV.
library(readxl) # Se usa para leer archivos Excel (.xlsx) en R.
library(dplyr) # Proporciona herramientas para manipulación de datos, como filtros, agrupaciones y resúmenes.
library(ggplot2) # Creación de gráficos estáticos y personalizados.
library(plotly) # Creación de gráficos interactivos.
library(stringi) #  Manipulación avanzada de cadenas de texto.
library(tibble) # Es una versión mejorada del data frame que proporciona una visualización más clara y manejable.
library(purrr) # Se usa comúnmente para aplicar funciones a elementos de listas. (programación funcional).
library(knitr) # se utiliza para generar informes dinámicos.
search() #Para saber que paquetes tengo instalados
 [1] ".GlobalEnv"        "package:stringi"   "package:plotly"   
 [4] "package:readxl"    "package:rvest"     "package:lubridate"
 [7] "package:forcats"   "package:stringr"   "package:dplyr"    
[10] "package:purrr"     "package:readr"     "package:tidyr"    
[13] "package:tibble"    "package:ggplot2"   "package:tidyverse"
[16] "package:knitr"     "package:stats"     "package:graphics" 
[19] "package:grDevices" "package:utils"     "package:datasets" 
[22] "package:methods"   "Autoloads"         "package:base"     
setwd('C:/Users/john/Desktop/Practica DS/Universidad del Bosque/2. Probabilidad y estadistica/Trabajo Final') # Establecer el directorio de trabajo

getwd() # Verificar el directorio de trabajo actual
[1] "C:/Users/john/Desktop/Practica DS/Universidad del Bosque/2. Probabilidad y estadistica/Trabajo Final"

ELABORACION DEL TRABAJO FINAL

1. (2 pts) Desarrolle en R los siguientes puntos:

(1a)

Dado que los aspectos medidos se encuentran agrupados en cuatro perfiles: Satisfacción del Consumidor (CS1 - CS5), Preferencia de Marca (BP1 - BP4), Actitud Hacia la Marca (BA1 - BA3) e Intenciones de Compra (PI1 - PI4), con puntuaciones entre 1 y 5 cada una, se requiere que los puntajes dados por cada persona en cada una de las características que conforman los cuatro perfiles queden agrupados (a manera de vector) en cada celda en una misma columna. Así, la base debe ser reducida, eliminando los puntajes originales, a un conjunto de datos como se muestra en la siguiente tabla de siete columnas:

Gender Age MaritalStatus CS BP BA PI
women 19 single (5, 5, 5, 5, 5) (5, 3, 3, 5) (5, 5, 5) (5, 5, 5, 5)
women 19 single (4, 5, 5, 5, 4) (5, 5, 5, 5) (5, 5, 5) (5, 5, 5, 5)
men 24 single (4, 4, 4, 4, 3) (1, 2, 2, 1) (4, 5, 3) (3, 4, 3, 4)

Realice lo anterior empleando R. El objeto creado debe ser un objeto tipo tibble. Imprima las primeras filas del conjunto de datos creado.

Solución 1a

Cargar Los Datos:

Data_Brand_1a <- read_excel('Brand.xlsx') ##Importa los datos a un objeto llamado tibble_Brand
head(Data_Brand_1a) 
# A tibble: 6 × 19
  Gender   Age MaritalStatus   CS1   CS2   CS3   CS4   CS5   BP1   BP2   BP3
  <chr>  <dbl> <chr>         <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 women     19 single            5     5     5     5     5     5     3     3
2 women     19 single            4     5     5     5     4     5     5     5
3 men       24 single            4     4     4     4     3     1     2     2
4 men       44 married           5     5     5     5     5     3     3     2
5 women     21 single            3     4     3     4     3     1     1     1
6 men       31 single            5     5     5     5     4     4     5     5
# ℹ 8 more variables: BP4 <dbl>, BA1 <dbl>, BA2 <dbl>, BA3 <dbl>, PI1 <dbl>,
#   PI2 <dbl>, PI3 <dbl>, PI4 <dbl>
# Cargar las librerías necesarias
library(dplyr)
library(purrr)
library(tibble)

# Asumimos que tu tibble original se llama Data_Brand

# Transformar el tibble
Data_Brand_Col_1a <- Data_Brand_1a %>%
  mutate(
    CS = pmap(list(CS1, CS2, CS3, CS4, CS5), c),  # Combina las columnas CS1 a CS5 en una lista
    BP = pmap(list(BP1, BP2, BP3, BP4), c),     # Combina las columnas BP1 a BP4 en una lista
    BA = pmap(list(BA1, BA2, BA3), c),          # Combina las columnas BA1 a BA3 en una lista
    PI = pmap(list(PI1, PI2, PI3, PI4), c)     # Combina las columnas PI1 a PI4 en una lista
  ) %>%
  select(Gender, Age, MaritalStatus, CS, BP, BA, PI) %>%
  as_tibble()  # Asegurarse de que el resultado sea un tibble

Data_Brand_Col_1a
# A tibble: 195 × 7
   Gender   Age MaritalStatus CS        BP        BA        PI       
   <chr>  <dbl> <chr>         <list>    <list>    <list>    <list>   
 1 women     19 single        <dbl [5]> <dbl [4]> <dbl [3]> <dbl [4]>
 2 women     19 single        <dbl [5]> <dbl [4]> <dbl [3]> <dbl [4]>
 3 men       24 single        <dbl [5]> <dbl [4]> <dbl [3]> <dbl [4]>
 4 men       44 married       <dbl [5]> <dbl [4]> <dbl [3]> <dbl [4]>
 5 women     21 single        <dbl [5]> <dbl [4]> <dbl [3]> <dbl [4]>
 6 men       31 single        <dbl [5]> <dbl [4]> <dbl [3]> <dbl [4]>
 7 men       39 married       <dbl [5]> <dbl [4]> <dbl [3]> <dbl [4]>
 8 women     18 single        <dbl [5]> <dbl [4]> <dbl [3]> <dbl [4]>
 9 women     25 single        <dbl [5]> <dbl [4]> <dbl [3]> <dbl [4]>
10 women     30 married       <dbl [5]> <dbl [4]> <dbl [3]> <dbl [4]>
# ℹ 185 more rows
glimpse(Data_Brand_Col_1a)
Rows: 195
Columns: 7
$ Gender        <chr> "women", "women", "men", "men", "women", "men", "men", "…
$ Age           <dbl> 19, 19, 24, 44, 21, 31, 39, 18, 25, 30, 20, 20, 20, 21, …
$ MaritalStatus <chr> "single", "single", "single", "married", "single", "sing…
$ CS            <list> <5, 5, 5, 5, 5>, <4, 5, 5, 5, 4>, <4, 4, 4, 4, 3>, <5, …
$ BP            <list> <5, 3, 3, 5>, <5, 5, 5, 5>, <1, 2, 2, 1>, <3, 3, 2, 2>,…
$ BA            <list> <5, 5, 5>, <5, 5, 5>, <4, 5, 3>, <4, 4, 4>, <3, 4, 5>, …
$ PI            <list> <5, 5, 5, 5>, <5, 5, 5, 5>, <3, 4, 3, 4>, <4, 3, 3, 3>,…
#print(Data_Brand_Col$Gender, n = Inf) # Para ver todas las filas

Conclusiones

En mi análisis de datos, he observado lo siguiente:

En mi dataset, tengo tanto a mujeres como a hombres. La presencia de ambos géneros me permite analizar posibles diferencias en las evaluaciones y percepciones de los participantes.

Las edades de los participantes en mi muestra varían desde 18 hasta 44 años. Esto indica que mi muestra incluye tanto a jóvenes adultos como a personas de mayor edad, lo que me permite explorar cómo diferentes grupos etarios pueden influir en las variables que estoy analizando.

Las puntuaciones de satisfacción del cliente en la columna CS van de 3 a 5. Esta variabilidad sugiere que los participantes tienen opiniones diversas sobre su satisfacción, y esto podría ayudarme a identificar patrones o áreas de mejora en el servicio o producto que estoy evaluando.

En cuanto a la columna BP, las puntuaciones varían de 1 a 5, lo que indica que hay una gama amplia de percepciones sobre el rendimiento empresarial. De manera similar, las puntuaciones en BA también oscilan entre 3 y 5. Al comparar estas evaluaciones, puedo obtener una visión más completa de cómo se percibe el rendimiento de la empresa y en qué áreas podría haber discrepancias.

Las puntuaciones en PI también van de 3 a 5, mostrando una variedad en las percepciones del índice de rendimiento. Esta variabilidad me ayudará a entender mejor cómo se percibe el rendimiento general y a identificar posibles inconsistencias en la percepción entre diferentes participantes.

(1b)

  • Usando el conjunto de datos creado en el Ejercicio 1a, empleando R, cree cuatro nuevas columnas (Tcs, Tbp, Tba y Tpi) que contengan la suma de los puntajes dados por cada persona dentro de cada perfil. Además, agregue una columna con el puntaje total (Total) obtenido como la suma de los puntajes de cada per l (Total = Tcs + Tbp + Tba + Tpi). El conjunto de datos resultante debe verse como la siguiente tabla de ocho columnas:
Gender Age MaritalStatus Tcs Tbp Tba Tpi Total
women 19 single 25 16 15 20 61
women 19 single 23 20 15 20 78
men 24 single 19 6 12 14 51

Solucion 1b

# Paso 1: Calcular las sumas de las columnas
Data_Brand_1b <- Data_Brand_Col_1a %>%
  mutate(
    Tcs = map_dbl(CS, sum, na.rm = TRUE),
    Tbp = map_dbl(BP, sum, na.rm = TRUE),
    Tba = map_dbl(BA, sum, na.rm = TRUE),
    Tpi = map_dbl(PI, sum, na.rm = TRUE),
    Total = Tcs + Tbp + Tba + Tpi
  ) %>%
  select(Gender, Age, MaritalStatus, Tcs, Tbp, Tba, Tpi, Total)

# Paso 3: Verificar el resultado
Data_Brand_1b
# A tibble: 195 × 8
   Gender   Age MaritalStatus   Tcs   Tbp   Tba   Tpi Total
   <chr>  <dbl> <chr>         <dbl> <dbl> <dbl> <dbl> <dbl>
 1 women     19 single           25    16    15    20    76
 2 women     19 single           23    20    15    20    78
 3 men       24 single           19     6    12    14    51
 4 men       44 married          25    10    12    13    60
 5 women     21 single           17     4    12    11    44
 6 men       31 single           24    19    15    17    75
 7 men       39 married          25    12    12    16    65
 8 women     18 single           24    20    15    20    79
 9 women     25 single           15     4     9    12    40
10 women     30 married          21     9     9    16    55
# ℹ 185 more rows

(1c)

  • Usando el conjunto de datos creado en el Ejercicio 1b, empleando principalmente las funciones de la librería dplyr de R, calcule el mínimo, el máximo, el promedio, la mediana, la desviación estándar, el coeficiente de variacón y los cuantiles 0.3 y 0.7 de las variables creadas (Tcs, Tbp, Tba, Tpi y Total), discriminando los resultados por Gender. Debe obtener una tabla de resultados como la siguiente:
Tabla de Estadísticas por Género
Gender Variable Mín Máx Prom. Med. DE CV Q0.3 Q0.7
women Tcs
women Tbp
women Tba
women Tpi
women Total
men Tcs
men Tbp
men Tba
men Tpi
men Total

Solución 1c

library(dplyr)

# Transformar datos a formato largo
Data_Brand_1c <- Data_Brand_1b %>%
  select(Gender, Tcs, Tbp, Tba, Tpi, Total) %>%
  pivot_longer(cols = Tcs:Total, names_to = "Variable", values_to = "Value")

# Calcular estadísticas descriptivas
Data_Brand_Est_1c <- Data_Brand_1c %>%
  group_by(Gender, Variable) %>%
  summarise(
    Min = min(Value, na.rm = TRUE),
    Max = max(Value, na.rm = TRUE),
    Prom = mean(Value, na.rm = TRUE),
    Med = median(Value, na.rm = TRUE),
    DE = sd(Value, na.rm = TRUE),
    CV = sd(Value, na.rm = TRUE) / mean(Value, na.rm = TRUE),
    Q0.3 = quantile(Value, 0.3, na.rm = TRUE),
    Q0.7 = quantile(Value, 0.7, na.rm = TRUE),
    .groups = 'drop'  # Elimina el agrupamiento después del resumen
  ) %>%
  mutate(Gender = factor(Gender, levels = c("women", "men"))) %>%
  arrange(Gender, Variable)  # Ordenar por Gender y luego por Variable

Data_Brand_Est_1c
# A tibble: 10 × 10
   Gender Variable   Min   Max  Prom   Med    DE    CV  Q0.3  Q0.7
   <fct>  <chr>    <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
 1 women  Tba          3    15  12.7    14  2.88 0.227  12    15  
 2 women  Tbp          4    20  13.8    14  5.47 0.397  10    19  
 3 women  Tcs          5    25  20.1    21  5.25 0.262  18    25  
 4 women  Total       24    80  62.3    66 15.0  0.241  52    74  
 5 women  Tpi          4    20  15.8    17  4.04 0.256  13    19  
 6 men    Tba          5    15  12.3    13  2.82 0.230  11    15  
 7 men    Tbp          4    20  13.6    14  5.11 0.375  12    16.8
 8 men    Tcs          5    25  18.7    20  6.14 0.329  17    23.8
 9 men    Total       19    80  59.9    63 16.3  0.272  52.6  71  
10 men    Tpi          5    20  15.3    16  4.17 0.272  13.2  19  

Conclusiones

  • Al analizar los datos, he observado que, en general, las medias de las variables para mujeres y hombres son bastante similares, aunque los hombres tienden a tener medias ligeramente menores en la mayoría de las variables comparadas con las mujeres.

  • En cuanto a las variables específicas, para Tba, el promedio para las mujeres es 12.7 con un rango de 3 a 15 y una desviación estándar de 2.88, lo que indica una variabilidad moderada. Los hombres tienen un promedio de 12.3, con un rango de 5 a 15 y una desviación estándar ligeramente menor de 2.82, sugiriendo menor variabilidad. En Tbp, las mujeres muestran un promedio de 13.8 con un rango de 4 a 20 y una desviación estándar alta de 5.47, mientras que los hombres tienen un promedio similar de 13.6 con una desviación estándar de 5.11, que es ligeramente menor. Para Tcs, el promedio femenino es 20.1 con un rango de 5 a 25 y una desviación estándar de 5.25, indicando una variabilidad notable. En contraste, los hombres tienen un promedio de 18.7 con una desviación estándar mayor de 6.14, sugiriendo mayor variabilidad en comparación con las mujeres.

  • En la variable Total, el promedio para las mujeres es 62.3 con un rango de 24 a 80 y una desviación estándar alta de 15.0, mientras que para los hombres el promedio es 59.9 con un rango de 19 a 80 y una desviación estándar ligeramente mayor de 16.3. Finalmente, en Tpi, las mujeres tienen un promedio de 15.8 con un rango de 4 a 20 y una desviación estándar moderada de 4.04, mientras que los hombres presentan un promedio de 15.3 con un rango similar y una desviación estándar ligeramente mayor de 4.17.

  • En cuanto al coeficiente de variación (CV), he notado que las mujeres muestran un CV relativamente menor en la mayoría de las variables, lo que sugiere una mayor consistencia en sus mediciones comparado con los hombres. Los percentiles 30 (Q0.3) y 70 (Q0.7) indican que, en general, los valores de las variables para ambos géneros tienen una distribución relativamente homogénea, pero las mujeres tienden a tener percentiles más altos en la mayoría de las variables, indicando que la mayoría de sus valores se sitúan en el rango superior de la distribución en comparación con los hombres.

  • Aunque existen algunas diferencias en las estadísticas descriptivas entre mujeres y hombres, estas diferencias no son extremadamente grandes. Las mujeres tienden a tener valores promedio ligeramente más altos en las variables medidas, pero la variabilidad en los datos es comparable a la de los hombres en la mayoría de los casos.

(1d)

Usando el conjunto de datos creado en el Ejercicio 1b, realice un gráfico de dispersión entre Age y el puntaje Total, donde cada punto tenga un tamaño proporcional a Tpi y esté coloreado de acuerdo a Gender, esto empleando el ggplot2 de R.

Solucion 1d

Gráfico de dispersión

# Extraer las columnas necesarias de Estadisticas
Data_Dispersion_1d <- Data_Brand_1b %>%
  select(Age, Total, Tpi, Gender)

# Crear el gráfico de dispersión
ggplot(Data_Dispersion_1d, aes(x = Age, y = Total, color = Gender, size = Tpi)) +
  geom_point(alpha = 0.7) +           # Añadir puntos con algo de transparencia
  scale_size_continuous(range = c(1, 6)) +  # Ajustar el rango de tamaños de los puntos
  labs(title = "Gráfico de Dispersión",
       x = "Edad - Age",                     # Corregir etiqueta del eje X
       y = "Total",
       size = "Tpi",
       color = "Género") +
  theme_minimal() +
  theme(legend.position = "right")

Gráfico de dispersión Interactivo

# Extraer las columnas necesarias de Estadisticas
Data_Dispersion <- Data_Brand_1b %>%
  select(Age, Total, Tpi, Gender)

# Crear el gráfico de dispersión con ggplot2
ggplot_plot <- ggplot(Data_Dispersion, aes(x = Age, y = Total, color = Gender, size = Tpi)) +
  geom_point(alpha = 0.7) +           # Añadir puntos con algo de transparencia
  scale_size_continuous(range = c(1, 4)) +  # Ajustar el rango de tamaños de los puntos para que sean más pequeños
  labs(title = "Gráfico de Dispersión",
       x = "Edad",                     # Corregir etiqueta del eje X
       y = "Total",
       size = "Tpi",
       color = "Género") +
  theme_minimal() +
  theme(legend.position = "right")

# Convertir el gráfico a interactivo con plotly
ggplotly(ggplot_plot)

2. (2 pts)

Replique el Ejercicio 1 empleando Python.

3. (1 pto)

Cree una función en R o Python que tome el puntaje Total obtenido en el Ejercicio 1b (o 2b) y calcule el índice de Gini Adaptado para Puntajes, el cual es una medida de dispersión que varía entre 0 y 1, donde 0 indica una distribución perfectamente uniforme (todos los puntajes son iguales) y 1 indica máxima desigualdad (un puntaje concentra todo el valor). El índice de Gini nos da una idea de la dispersión o variabilidad en los puntajes. La fórmula de cálculo del índice es:

\[ \text{Gini} = \frac{\sum_{i=1}^n \sum_{j=1}^n |x_i - x_j|}{2n^2 * \bar{x}} \]

donde:

  • \(x_i\) es el puntaje total de la persona \(i\)-ésima.

  • \(| . |\) denota el valor absoluto de un número.

  • \(n\) es el número total de personas.

Fórmula Alternativa del Índice de Gini

\[ \text{Gini} = \frac{1}{2} - \frac{2}{2n^2 * \bar{x}} \sum_{i=1}^n \left[(n - i + 0.5) * x_{(i)}\right] \]

donde:

  • \(n\) es el número de observaciones.

  • \(x_{(i)}\) es el dato ordenado en la posición \(i\)-ésima (por ejemplo, en el conjunto de datos \((3.5, 2.3, 5.6)\), \(x_{(1)} = 2.3\), \(x_{(2)} = 3.5\), y \(x_{(3)} = 5.6\)).

Solución 3

1. Función Usando la Fórmula Directa (Suma de Diferencias Absolutas)

calculate_gini_direct <- function(x) {
  n <- length(x)
  x_bar <- mean(x)
  
  # Calcular la suma de las diferencias absolutas
  sum_diff <- sum(outer(x, x, function(a, b) abs(a - b)))
  
  # Calcular el índice de Gini
  gini_index <- sum_diff / (2 * n^2 * x_bar)
  
  return(gini_index)
}

2. Función Usando la Fórmula Alternativa (Ordenando y Sumando)

calculate_gini_alternative <- function(x) {
  n <- length(x)
  x_bar <- mean(x)
  
  # Ordenar los datos
  x_sorted <- sort(x)
  
  # Calcular la suma para la fórmula alternativa
  sum_gini <- sum((n - seq_along(x_sorted) + 0.5) * x_sorted)
  
  # Calcular el índice de Gini
  gini_index <- 1 - (2 / (2 * n^2 * x_bar)) * sum_gini
  
  return(gini_index)
}

3. Función Usando Matriz de Diferencias Absolutas con rowSums

calculate_gini_with_rowSums <- function(x) {
  n <- length(x)
  x_bar <- mean(x)
  
  # Calcular la matriz de diferencias absolutas
  abs_diff_matrix <- abs(outer(x, x, "-"))
  
  # Sumar las filas de la matriz
  sum_diff <- sum(rowSums(abs_diff_matrix))
  
  # Calcular el índice de Gini
  gini_index <- sum_diff / (2 * n^2 * x_bar)
  
  return(gini_index)
}

4. Función Usando la Fórmula Alternativa con sapply para la Suma

calculate_gini_alternative_sapply <- function(x) {
  n <- length(x)
  x_bar <- mean(x)
  
  # Ordenar los datos
  x_sorted <- sort(x)
  
  # Calcular la suma para la fórmula alternativa usando sapply
  sum_gini <- sum(sapply(seq_along(x_sorted), function(i) (n - i + 0.5) * x_sorted[i]))
  
  # Calcular el índice de Gini
  gini_index <- 1 - (2 / (2 * n^2 * x_bar)) * sum_gini
  
  return(gini_index)
}

5. Función Usando matrix para la Suma de Diferencias Absolutas

calculate_gini_with_matrix <- function(x) {
  n <- length(x)
  x_bar <- mean(x)
  
  # Crear una matriz de diferencias absolutas
  abs_diff_matrix <- matrix(0, nrow = n, ncol = n)
  for (i in 1:n) {
    for (j in 1:n) {
      abs_diff_matrix[i, j] <- abs(x[i] - x[j])
    }
  }
  
  # Calcular la suma de todas las entradas de la matriz
  sum_diff <- sum(abs_diff_matrix)
  
  # Calcular el índice de Gini
  gini_index <- sum_diff / (2 * n^2 * x_bar)
  
  return(gini_index)
}

Ejemplo Uso uso de Funciones

# Definición de funciones para calcular el índice de Gini

# 1. Usando la fórmula directa (Suma de diferencias absolutas)
calculate_gini_direct <- function(x) {
  n <- length(x)
  x_bar <- mean(x)
  
  # Calcular la suma de las diferencias absolutas
  sum_diff <- sum(outer(x, x, function(a, b) abs(a - b)))
  
  # Calcular el índice de Gini
  gini_index <- sum_diff / (2 * n^2 * x_bar)
  
  return(gini_index)
}

# 2. Usando la fórmula alternativa (Ordenando y sumando)
calculate_gini_alternative <- function(x) {
  n <- length(x)
  x_bar <- mean(x)
  
  # Ordenar los datos
  x_sorted <- sort(x)
  
  # Calcular la suma para la fórmula alternativa
  sum_gini <- sum((n - seq_along(x_sorted) + 0.5) * x_sorted)
  
  # Calcular el índice de Gini
  gini_index <- 1 - (2 / (2 * n^2 * x_bar)) * sum_gini
  
  return(gini_index)
}

# 3. Usando `rowSums` para la suma de diferencias absolutas
calculate_gini_with_rowSums <- function(x) {
  n <- length(x)
  x_bar <- mean(x)
  
  # Calcular la matriz de diferencias absolutas
  abs_diff_matrix <- abs(outer(x, x, "-"))
  
  # Sumar las filas de la matriz
  sum_diff <- sum(rowSums(abs_diff_matrix))
  
  # Calcular el índice de Gini
  gini_index <- sum_diff / (2 * n^2 * x_bar)
  
  return(gini_index)
}

# 4. Usando `sapply` para la suma en la fórmula alternativa
calculate_gini_alternative_sapply <- function(x) {
  n <- length(x)
  x_bar <- mean(x)
  
  # Ordenar los datos
  x_sorted <- sort(x)
  
  # Calcular la suma para la fórmula alternativa usando sapply
  sum_gini <- sum(sapply(seq_along(x_sorted), function(i) (n - i + 0.5) * x_sorted[i]))
  
  # Calcular el índice de Gini
  gini_index <- 1 - (2 / (2 * n^2 * x_bar)) * sum_gini
  
  return(gini_index)
}

# 5. Usando una matriz para la suma de diferencias absolutas
calculate_gini_with_matrix <- function(x) {
  n <- length(x)
  x_bar <- mean(x)
  
  # Crear una matriz de diferencias absolutas
  abs_diff_matrix <- matrix(0, nrow = n, ncol = n)
  for (i in 1:n) {
    for (j in 1:n) {
      abs_diff_matrix[i, j] <- abs(x[i] - x[j])
    }
  }
  
  # Calcular la suma de todas las entradas de la matriz
  sum_diff <- sum(abs_diff_matrix)
  
  # Calcular el índice de Gini
  gini_index <- sum_diff / (2 * n^2 * x_bar)
  
  return(gini_index)
}

# Datos de ejemplo
scores <- c(10, 20, 30, 40, 50)

# Calcular el índice de Gini usando cada función
gini_direct <- calculate_gini_direct(scores)
gini_alternative <- calculate_gini_alternative(scores)
gini_with_rowSums <- calculate_gini_with_rowSums(scores)
gini_alternative_sapply <- calculate_gini_alternative_sapply(scores)
gini_with_matrix <- calculate_gini_with_matrix(scores)

# Imprimir resultados
print(gini_direct)
[1] 0.2666667
print(gini_alternative)
[1] 0.6333333
print(gini_with_rowSums)
[1] 0.2666667
print(gini_alternative_sapply)
[1] 0.6333333
print(gini_with_matrix)
[1] 0.2666667

Conclusion:

  • Los resultados diferentes que se estan observando entre las funciones gini_direct y gini_with_rowSums versus gini_alternative y gini_alternative_sapply se deben a que cada método de cálculo está utilizando una fórmula distinta para calcular el índice de Gini.

CONCLUSIONES FINALES

1a. Elaboración y Visualización de Datos en R:

  • La transformación de los datos en vectores agrupados por perfil (Satisfacción del Consumidor, Preferencia de Marca, Actitud Hacia la Marca, e Intenciones de Compra) ha simplificado el análisis, permitiendo una revisión más clara y directa de las puntuaciones de cada participante en los diferentes perfiles. Este enfoque facilita la identificación de patrones y tendencias dentro de cada perfil y mejora la manejabilidad de los datos para análisis posteriores.

  • La tabla creada refleja una distribución equilibrada entre mujeres y hombres con una concentración significativa de participantes jóvenes. Las altas puntuaciones en las variables evaluadas sugieren una tendencia general hacia evaluaciones positivas. Sin embargo, la variabilidad en algunas variables como BP y BA indica diferencias en la percepción del bienestar entre los participantes, lo que puede ser relevante para interpretaciones más profundas y segmentaciones del mercado.

1b. Cálculo de Sumas y Estadísticas Descriptivas:

  • La adición de las columnas de suma (Tcs, Tbp, Tba, Tpi) y el cálculo del puntaje total (Total) proporcionan una visión integral del rendimiento de cada individuo en todos los perfiles. Este enfoque permite comparaciones directas entre individuos y facilita el análisis de tendencias generales.

  • El análisis revela que las mujeres tienen un promedio más alto en el puntaje total comparado con los hombres, lo que sugiere diferencias en las evaluaciones generales entre géneros. La desviacion estándar altas en ciertas variables para los hombres indican una mayor variabilidad en sus evaluaciones, mientras que la mediana y el coeficiente de variación proporcionan una visión adicional sobre la dispersión y consistencia de las evaluaciones entre géneros. Estas estadísticas son esenciales para entender cómo diferentes grupos perciben y evalúan las variables medidas.

1c. Estadísticas Descriptivas Detalladas:

  • El análisis muestra que, en general, las mujeres tienden a puntuar más alto en el puntaje total, mientras que los hombres muestran una mayor variabilidad en sus puntuaciones para algunas variables. La comparación de cuantiles y coeficientes de variación destaca que, aunque las diferencias entre géneros son moderadas, existen patrones distintivos en cómo cada grupo evalúa las variables.

1d. Gráfico de Dispersión:

  • El gráfico de dispersión muestra la relación entre la edad y el puntaje total, con el tamaño de los puntos representando la variable Tpi y el color diferenciando por género. La representación gráfica facilita la identificación de patrones y relaciones en los datos, mostrando cómo el puntaje total varía con la edad y cómo este cambio se asocia con la variable Tpi. La visualización interactiva con Plotly añade una capa adicional de exploración, permitiendo un análisis más dinámico y detallado de los datos.

2. Adaptación en Python:

  • Los ejercicio realizado en R fueron replicados en Python, demostrando la capacidad de estos lenguajes para manejar y analizar datos. La conversión de R a Python implica un entendimiento profundo de ambos entornos y permite la validación cruzada de resultados, asegurando que los análisis y conclusiones sean consistentes independientemente de la herramienta utilizada.

3. Cálculo del Índice de Gini:

  • Las funciones desarrolladas para calcular el índice de Gini proporcionan una medida útil de la desigualdad en los puntajes. Las distintas implementaciones (fórmula directa, fórmula alternativa, y usando funciones específicas como rowSums y sapply) ofrecen formas variadas de calcular esta medida de dispersión, permitiendo comparar y validar la precisión del índice de Gini bajo diferentes enfoques.

  • Función Directa: Proporciona una solución directa para calcular el índice de Gini utilizando la suma de las diferencias absolutas.

  • Función Alternativa: Utiliza la fórmula alternativa basada en ordenación, que puede ser más eficiente en términos de cálculo.

  • Funciones con rowSums y sapply: Ofrecen variaciones en la forma de calcular la suma de diferencias absolutas, proporcionando flexibilidad y diferentes perspectivas para obtener el índice de Gini.