Cargamos las librerías a utilizar

library(dplyr)     
library(ggplot2)   
library(readxl)    
library(BSDA)      
library(readxl)

Realizamos la carga de los datos

# Cambiar FALSE por TRUE en la linea superior del archivo para evaluar esta parte de código.
# Ejemplo: cargamos los datos en el objeto "base"
base_entregada = read_excel("dirección del archivo/basegrupo_99.xlsx")
base = na.omit(base_entregada) # base contiene los datos limpios.

# con esta base debe trabajar en el informe.

Actividades:

A partir de la base de datos que le ha sido asignada, desarrolle el siguiente trabajo siguiendo cuidadosamente cada uno de los puntos. Justifique sus respuestas, supuestos utilizados y presente los resultados de forma clara.

Actividad 1

Identifique y clasifique las variables contenidas en la base según su tipo (cualitativas, cuantitativas discretas, cuantitativas continuas). Detecte la presencia de posibles outliers (valores atípicos). En caso de encontrar alguno, elimine la fila correspondiente de la base y justifique su decisión. Si decide no eliminar ningún dato, fundamente adecuadamente su elección.

# 
# Cargar las librerías necesarias
library(readxl)
library(dplyr)

# Establecer el directorio de trabajo
setwd("C:/Users/13375/Downloads") # Asegúrate de que el archivo esté en el directorio correcto

# Cargar la base de datos
df <- read_excel("basegrupo_36.xlsx")

# Inspeccionar la estructura de los datos
str(df)
## tibble [401 × 12] (S3: tbl_df/tbl/data.frame)
##  $ acidez_Fija          : num [1:401] 7.8 7.4 7.8 8.9 8.5 7.8 8.1 7.3 8.8 8.6 ...
##  $ Acidez_Volatil       : num [1:401] 0.88 0.66 0.61 0.62 0.49 0.645 0.38 0.45 0.61 0.38 ...
##  $ AcidoCitrico         : num [1:401] 0 0 0.29 0.19 0.11 0 0.28 0.36 0.3 0.36 ...
##  $ Azucar_Residual      : num [1:401] 2.6 1.8 1.6 3.9 2.3 2 2.1 5.9 2.8 3 ...
##  $ Clorhidratos         : num [1:401] 0.098 0.075 0.114 0.17 0.084 0.082 0.066 0.074 0.088 0.081 ...
##  $ nivel_dioxido_sulfuro: num [1:401] 25 13 9 51 9 8 13 12 17 30 ...
##  $ Tot_dioxido_sulfuro  : num [1:401] 67 40 29 148 67 16 30 87 46 119 ...
##  $ densidad             : num [1:401] 0.997 0.998 0.997 0.999 0.997 ...
##  $ pH                   : num [1:401] 3.2 3.51 3.26 3.17 3.17 3.38 3.23 3.33 3.26 3.2 ...
##  $ sulfatos             : num [1:401] 0.68 0.56 1.56 0.93 0.53 0.59 0.73 0.83 0.51 0.56 ...
##  $ alcohol              : num [1:401] 9.8 9.4 9.1 9.2 9.4 9.8 9.7 10.5 9.3 9.4 ...
##  $ calidad              : num [1:401] 5 5 5 5 5 6 7 5 4 5 ...
# Clasificar las variables como cualitativas o cuantitativas
cualitativas <- names(df)[sapply(df, is.factor)] # Variables cualitativas
cuantitativas <- names(df)[sapply(df, is.numeric)] # Variables cuantitativas

cat("Variables cualitativas: ", cualitativas, "\n") 
## Variables cualitativas:
cat("Variables cuantitativas: ", cuantitativas, "\n")
## Variables cuantitativas:  acidez_Fija Acidez_Volatil AcidoCitrico Azucar_Residual Clorhidratos nivel_dioxido_sulfuro Tot_dioxido_sulfuro densidad pH sulfatos alcohol calidad
# Detectar outliers usando el método IQR
for (var in cuantitativas) { 
  Q1 <- quantile(df[[var]], 0.25, na.rm = TRUE)
  Q3 <- quantile(df[[var]], 0.75, na.rm = TRUE)
  IQR <- Q3 - Q1
  lower_bound <- Q1 - 1.5 * IQR
  upper_bound <- Q3 + 1.5 * IQR
  outliers <- which(df[[var]] < lower_bound | df[[var]] > upper_bound)

  if (length(outliers) > 0) { 
    cat("Outliers en la variable", var, ": ", length(outliers), "valores atípicos\n")
  } else { 
    cat("No hay outliers en la variable", var, "\n") 
  } 
}
## Outliers en la variable acidez_Fija :  13 valores atípicos
## Outliers en la variable Acidez_Volatil :  4 valores atípicos
## No hay outliers en la variable AcidoCitrico 
## Outliers en la variable Azucar_Residual :  30 valores atípicos
## Outliers en la variable Clorhidratos :  40 valores atípicos
## Outliers en la variable nivel_dioxido_sulfuro :  8 valores atípicos
## Outliers en la variable Tot_dioxido_sulfuro :  18 valores atípicos
## Outliers en la variable densidad :  25 valores atípicos
## Outliers en la variable pH :  2 valores atípicos
## Outliers en la variable sulfatos :  19 valores atípicos
## Outliers en la variable alcohol :  7 valores atípicos
## Outliers en la variable calidad :  9 valores atípicos
#

Actividad 2

Elija una variable cualitativa o discreta con la cual se puedan diferenciar al menos dos grupos. En los siguientes puntos, la expresión cada grupo hará referencia a las categorías de esta variable.

# 
# Ejemplo: Supongamos que la variable cualitativa seleccionada es 'calidad'
# Vamos a calcular las medias de la variable 'alcohol' por cada nivel de 'calidad'

grupo_alcohol <- df %>%
  group_by(calidad) %>%
  summarise(
    media_alcohol = mean(alcohol, na.rm = TRUE), 
    sd_alcohol = sd(alcohol, na.rm = TRUE), 
    n = n() # Número de observaciones en cada grupo 
)

# Mostrar los resultados
print(grupo_alcohol)
## # A tibble: 6 × 4
##   calidad media_alcohol sd_alcohol     n
##     <dbl>         <dbl>      <dbl> <int>
## 1       3          9.1       0.990     2
## 2       4          9.83      0.665     7
## 3       5          9.97      0.838   175
## 4       6         10.5       1.04    156
## 5       7         11.4       1.03     54
## 6       8         12.2       1.38      7
#

Actividad 3

Para una variable continua (var1), estime un intervalo de confianza al 95% de la media en cada grupo definido previamente. Comente e interprete los resultados.

# 
# Calcular el intervalo de confianza al 95% para la media de alcohol por calidad
resultados_ic <- df %>%
  group_by(calidad) %>%
  summarise( 
    n = n(),
    media = mean(alcohol), 
    sd = sd(alcohol), 
    error = qt(0.975, df = n - 1) * sd / sqrt(n), 
    li = media - error, # límite inferior 
    ls = media + error # límite superior 
)

# Mostrar resultados
print(resultados_ic)
## # A tibble: 6 × 7
##   calidad     n media    sd error     li    ls
##     <dbl> <int> <dbl> <dbl> <dbl>  <dbl> <dbl>
## 1       3     2  9.1  0.990 8.89   0.206  18.0
## 2       4     7  9.83 0.665 0.615  9.21   10.4
## 3       5   175  9.97 0.838 0.125  9.85   10.1
## 4       6   156 10.5  1.04  0.165 10.3    10.7
## 5       7    54 11.4  1.03  0.280 11.1    11.7
## 6       8     7 12.2  1.38  1.28  10.9    13.4
#

Actividad 4

Seleccione otra variable continua distinta (var2) y estime el intervalo de confianza para la diferencia de medias entre dos de los grupos definidos anteriormente. Indique si, en base a este intervalo, es posible afirmar que ambos grupos tienen la misma media.

# 
# Filtrar los dos grupos a comparar (por ejemplo, calidad 5 y calidad 6)
grupo_1 <- df %>% filter(calidad == 5) %>% pull(pH)
grupo_2 <- df %>% filter(calidad == 6) %>% pull(pH)

# Calcular las estadísticas necesarias
n1 <- length(grupo_1)
n2 <- length(grupo_2)
media1 <- mean(grupo_1)
media2 <- mean(grupo_2)
sd1 <- sd(grupo_1)
sd2 <- sd(grupo_2)

# Diferencia de medias
diferencia <- media1 - media2

# Error estándar de la diferencia
error <- sqrt((sd1^2 / n1) + (sd2^2 / n2))

# Grados de libertad aproximados
gl <- ((sd1^2 / n1 + sd2^2 / n2)^2) / (((sd1^2 / n1)^2 / (n1 - 1)) + ((sd2^2 / n2)^2 / (n2 - 1)))

# Intervalo de confianza
t_critico <- qt(0.975, df = gl)
li <- diferencia - t_critico * error
ls <- diferencia + t_critico * error

# Mostrar resultados
cat("Diferencia de medias (calidad 5 - calidad 6):", diferencia, "\n")
## Diferencia de medias (calidad 5 - calidad 6): -0.01716777
cat("IC 95% para la diferencia:", "[", li, ",", ls, "]\n")
## IC 95% para la diferencia: [ -0.05089203 , 0.0165565 ]
#

Actividad 5

Responda la pregunta anterior mediante un test de hipótesis adecuado para comparar medias. Calcule e interprete el p-value asociado al test.

# 
# Realizar test t para comparar medias de pH entre calidad 5 y calidad 6
resultado <- t.test(grupo_1, grupo_2, var.equal = FALSE)

# Mostrar resultados
print(resultado)
## 
##  Welch Two Sample t-test
## 
## data:  grupo_1 and grupo_2
## t = -1.0014, df = 328.6, p-value = 0.3174
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -0.05089203  0.01655650
## sample estimates:
## mean of x mean of y 
##  3.304114  3.321282
#

Actividad 6

Suponga que un investigador desea saber si la variabilidad de una tercera variable continua (var3) es la misma en dos grupos. Conteste esta pregunta utilizando un intervalo de confianza al 90% o un test de hipótesis, según estime conveniente. Justifique su elección metodológica.

# 
# Filtrar los dos grupos a comparar (calidad 5 y calidad 6) para 'Azucar_Residual'
grupo5 <- df$Azucar_Residual[df$calidad == 5]
grupo6 <- df$Azucar_Residual[df$calidad == 6]

# Realizar test de F para comparar varianzas
resultado_fisher <- var.test(grupo5, grupo6)

# Mostrar resultados
print(resultado_fisher)
## 
##  F test to compare two variances
## 
## data:  grupo5 and grupo6
## F = 1.6225, num df = 174, denom df = 155, p-value = 0.002199
## alternative hypothesis: true ratio of variances is not equal to 1
## 95 percent confidence interval:
##  1.191731 2.203014
## sample estimates:
## ratio of variances 
##           1.622546
#

Actividad 7

Construya gráficos de boxplot para una cuarta variable continua (var4), separando los datos por grupo según la variable seleccionada al inicio. A partir de la visualización, formule una pregunta estadística que pueda responderse mediante un test de hipótesis a una significancia de \(\alpha=0.05\), y realice dicho análisis.

# 
# Boxplot para la variable 'alcohol' por los grupos de 'calidad'
boxplot(alcohol ~ calidad, data = df, main = "Boxplot de Alcohol por Calidad", xlab = "Calidad", ylab = "Alcohol")

# Realizar test t para comparar medias de 'alcohol' entre dos grupos (ej. calidad 5 y 6)
grupo_1_alcohol <- df$alcohol[df$calidad == 5]
grupo_2_alcohol <- df$alcohol[df$calidad == 6]

test_alcohol <- t.test(grupo_1_alcohol, grupo_2_alcohol, var.equal = FALSE)

# Mostrar resultados del test
print(test_alcohol)
## 
##  Welch Two Sample t-test
## 
## data:  grupo_1_alcohol and grupo_2_alcohol
## t = -4.9532, df = 297.36, p-value = 1.227e-06
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -0.7250476 -0.3127252
## sample estimates:
## mean of x mean of y 
##  9.970857 10.489744
#

Actividad 8

Análisis detallado de dos variables:

Grafique la distribución de los datos mediante un histograma o gráfico de densidad. Realice un resumen estadístico que incluya medidas de posición, dispersión y forma (asimetría y curtosis). Comente brevemente las características de cada variable a partir del análisis anterior.

# Análisis variable 1

# Histograma de 'alcohol'
hist(df$alcohol, 
     main = "Distribución de Alcohol",
     xlab = "Alcohol",
     col = "lightblue", 
     border = "black")

# Resumen estadístico de 'alcohol'
summary(df$alcohol)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     8.4     9.5    10.0    10.4    11.0    14.9
sd(df$alcohol)
## [1] 1.0916
# Asimetría y curtosis de 'alcohol'
library(e1071)
asimetria_alcohol <- skewness(df$alcohol)
curtosis_alcohol <- kurtosis(df$alcohol)

cat("Asimetría de alcohol: ", asimetria_alcohol, "\n")
## Asimetría de alcohol:  1.027266
cat("Curtosis de alcohol: ", curtosis_alcohol, "\n")
## Curtosis de alcohol:  0.6825638
#
# Análisis variable 2

# Histograma de 'acidez_Fija'
hist(df$acidez_Fija, 
     main = "Distribución de Acidez Fija",
     xlab = "Acidez Fija",
     col = "lightgreen", 
     border = "black")

# Resumen estadístico de 'acidez_Fija'
summary(df$acidez_Fija)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   5.000   7.100   7.900   8.358   9.200  15.900
sd(df$acidez_Fija)
## [1] 1.735597
# Asimetría y curtosis de 'acidez_Fija'
asimetria_acidez <- skewness(df$acidez_Fija)
curtosis_acidez <- kurtosis(df$acidez_Fija)

cat("Asimetría de acidez_Fija: ", asimetria_acidez, "\n")
## Asimetría de acidez_Fija:  0.9929786
cat("Curtosis de acidez_Fija: ", curtosis_acidez, "\n")
## Curtosis de acidez_Fija:  0.8858792
#