1 Todas las Variables Ordinales

Las variables ordinales se caracterizan por tener un orden entre sus categorías, aunque no se puede saber con exactitud cuánto hay de diferencia entre ellas. Por eso, al analizarlas en estadística inferencial, no se usan métodos tradicionales. En su lugar, se aplican pruebas como la chi-cuadrado, que permite identificar si existe relación entre variables categóricas. Este tipo de pruebas ayudan a interpretar los datos respetando su naturaleza ordinal, sin asumir distribuciones específicas.

Cargamos los datos:

#Cargar los datos
setwd("C:/Users/Usuario/Documents/Trabajo Estadistica/PROYECTO/")
datos<-read.csv("database.csv",header = TRUE, sep = ",", dec = ".")
str(datos)
## 'data.frame':    38113 obs. of  81 variables:
##  $ Vehicle.ID                         : int  26587 27705 26561 27681 27550 28426 27549 28425 27593 28455 ...
##  $ Year                               : int  1984 1984 1984 1984 1984 1984 1984 1984 1984 1984 ...
##  $ Make                               : chr  "Alfa Romeo" "Alfa Romeo" "Alfa Romeo" "Alfa Romeo" ...
##  $ Model                              : chr  "GT V6 2.5" "GT V6 2.5" "Spider Veloce 2000" "Spider Veloce 2000" ...
##  $ Class                              : chr  "Minicompact Cars" "Minicompact Cars" "Two Seaters" "Two Seaters" ...
##  $ Drive                              : chr  "" "" "" "" ...
##  $ Transmission                       : chr  "Manual 5-Speed" "Manual 5-Speed" "Manual 5-Speed" "Manual 5-Speed" ...
##  $ Transmission.Descriptor            : chr  "" "" "" "" ...
##  $ Engine.Index                       : int  9001 9005 9002 9006 1830 1880 1831 1881 1524 1574 ...
##  $ Engine.Descriptor                  : chr  "(FFS)" "(FFS) CA model" "(FFS)" "(FFS) CA model" ...
##  $ Engine.Cylinders                   : int  6 6 4 4 4 4 6 6 6 6 ...
##  $ Engine.Displacement                : num  2.5 2.5 2 2 2.5 2.5 4.2 4.2 4.2 4.2 ...
##  $ Turbocharger                       : logi  NA NA NA NA NA NA ...
##  $ Supercharger                       : chr  "" "" "" "" ...
##  $ Fuel.Type                          : chr  "Regular" "Regular" "Regular" "Regular" ...
##  $ Fuel.Type.1                        : chr  "Regular Gasoline" "Regular Gasoline" "Regular Gasoline" "Regular Gasoline" ...
##  $ Fuel.Type.2                        : chr  "" "" "" "" ...
##  $ City.MPG..FT1.                     : int  17 17 18 18 18 18 13 13 15 15 ...
##  $ Unrounded.City.MPG..FT1.           : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ City.MPG..FT2.                     : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ Unrounded.City.MPG..FT2.           : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ City.Gasoline.Consumption..CD.     : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ City.Electricity.Consumption       : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ City.Utility.Factor                : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ Highway.MPG..FT1.                  : int  24 24 25 25 17 17 13 13 20 19 ...
##  $ Unrounded.Highway.MPG..FT1.        : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ Highway.MPG..FT2.                  : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ Unrounded.Highway.MPG..FT2.        : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ Highway.Gasoline.Consumption..CD.  : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ Highway.Electricity.Consumption    : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ Highway.Utility.Factor             : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ Unadjusted.City.MPG..FT1.          : num  21 21 23 23 22 22 16 16 19 19 ...
##  $ Unadjusted.Highway.MPG..FT1.       : num  34 34 35 35 24 24 18 18 27 26 ...
##  $ Unadjusted.City.MPG..FT2.          : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ Unadjusted.Highway.MPG..FT2.       : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ Combined.MPG..FT1.                 : int  20 20 21 21 17 17 13 13 17 17 ...
##  $ Unrounded.Combined.MPG..FT1.       : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ Combined.MPG..FT2.                 : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ Unrounded.Combined.MPG..FT2.       : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ Combined.Electricity.Consumption   : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ Combined.Gasoline.Consumption..CD. : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ Combined.Utility.Factor            : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ Annual.Fuel.Cost..FT1.             : int  1750 1750 1650 1650 2050 2050 2700 2700 2050 2050 ...
##  $ Annual.Fuel.Cost..FT2.             : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ Gas.Guzzler.Tax                    : chr  "" "" "" "" ...
##  $ Save.or.Spend..5.Year.             : int  -2000 -2000 -1500 -1500 -3500 -3500 -6750 -6750 -3500 -3500 ...
##  $ Annual.Consumption.in.Barrels..FT1.: num  16.5 16.5 15.7 15.7 19.4 ...
##  $ Annual.Consumption.in.Barrels..FT2.: num  0 0 0 0 0 0 0 0 0 0 ...
##  $ Tailpipe.CO2..FT1.                 : int  -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ...
##  $ Tailpipe.CO2.in.Grams.Mile..FT1.   : num  444 444 423 423 523 ...
##  $ Tailpipe.CO2..FT2.                 : int  -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ...
##  $ Tailpipe.CO2.in.Grams.Mile..FT2.   : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ Fuel.Economy.Score                 : int  -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ...
##  $ GHG.Score                          : int  -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ...
##  $ GHG.Score..Alt.Fuel.               : int  -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ...
##  $ My.MPG.Data                        : chr  "N" "N" "N" "N" ...
##  $ X2D.Passenger.Volume               : int  74 74 0 0 0 0 0 0 0 0 ...
##  $ X2D.Luggage.Volume                 : int  7 7 0 0 0 0 0 0 0 0 ...
##  $ X4D.Passenger.Volume               : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ X4D.Luggage.Volume                 : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ Hatchback.Passenger.Volume         : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ Hatchback.Luggage.Volume           : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ Start.Stop.Technology              : chr  "" "" "" "" ...
##  $ Alternative.Fuel.Technology        : chr  "" "" "" "" ...
##  $ Electric.Motor                     : chr  "" "" "" "" ...
##  $ Manufacturer.Code                  : chr  "" "" "" "" ...
##  $ Gasoline.Electricity.Blended..CD.  : chr  "False" "False" "False" "False" ...
##  $ Vehicle.Charger                    : chr  "" "" "" "" ...
##  $ Alternate.Charger                  : chr  "" "" "" "" ...
##  $ Hours.to.Charge..120V.             : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ Hours.to.Charge..240V.             : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ Hours.to.Charge..AC.240V.          : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ Composite.City.MPG                 : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ Composite.Highway.MPG              : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ Composite.Combined.MPG             : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ Range..FT1.                        : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ City.Range..FT1.                   : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ Highway.Range..FT1.                : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ Range..FT2.                        : chr  "" "" "" "" ...
##  $ City.Range..FT2.                   : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ Highway.Range..FT2.                : num  0 0 0 0 0 0 0 0 0 0 ...

Empezamos el desarrollo para cada variable ordinal:

2 Fuel Economy Score

Tabla de distribución de frecuencias

punteconomica <- datos$Fuel.Economy.Score
punteconomica <- punteconomica[!is.na(punteconomica) & punteconomica != -1 & punteconomica != ""]
TDF_punteco <- table(punteconomica)
Tabla <- as.data.frame(TDF_punteco)
colnames(Tabla) <- c("Puntaje", "ni")   # Renombrar columnas
Tabla$hi <- (Tabla$ni / sum(Tabla$ni)) * 100
# Asegurar que Puntaje es carácter
Tabla$Puntaje <- as.character(Tabla$Puntaje)
fila_total <- data.frame(Puntaje = "Total", 
                         ni = sum(Tabla$ni), 
                         hi = sum(Tabla$hi),
                         stringsAsFactors = FALSE)
# Agregar fila total
Tabla <- rbind(Tabla, fila_total)
# Mostrar tabla final
print(Tabla)
##    Puntaje   ni         hi
## 1        1  130   2.124183
## 2        2  294   4.803922
## 3        3  514   8.398693
## 4        4 1139  18.611111
## 5        5 1555  25.408497
## 6        6  958  15.653595
## 7        7  809  13.218954
## 8        8  458   7.483660
## 9        9   95   1.552288
## 10      10  168   2.745098
## 11   Total 6120 100.000000

Gráficas:

# Ajustar márgenes para etiquetas largas
par(mar = c(8, 4, 3, 2))
# Gráfico de barras (solo sin la fila Total)
barplot(TDF_punteco,
        main = "Gráfica No.2:
        Distribución del Fuel Economy Score",
        xlab = "",
        ylab = "Frecuencia Absoluta",
        col = "darkgreen",
        las = 3,               # Rotar etiquetas en eje x
        cex.names = 0.8,
        cex.axis = 0.9,
        cex.main = 1.2,
        ylim = c(0, max(TDF_punteco) * 1.2),
        border = "black")

# Convertir Puntaje a factor con orden correcto
Tabla <- Tabla[Tabla$Puntaje != "Total", ]  # Eliminar fila "Total" para graficar
Tabla$Puntaje <- factor(Tabla$Puntaje, levels = Tabla$Puntaje)  # asegurar orden
# Gráfico de barras de frecuencia relativa (%)
barplot(Tabla$hi,
        names.arg = Tabla$Puntaje,
        main = "Gráfica No.2:
        Distribución Relativa del Fuel Economy Score",
        xlab = "Puntaje",
        ylab = "Frecuencia Relativa (%)",
        col = "steelblue",
        las = 3,
        cex.names = 0.8,
        cex.axis = 0.9,
        cex.main = 1.2,
        ylim = c(0, max(Tabla$hi) * 1.2),
        border = "black")

Modelo Binomial:

# Excluir fila Total y convertir a numérico
Tabla <- Tabla[Tabla$Puntaje != "Total", ]
Tabla$Puntaje <- as.numeric(Tabla$Puntaje)
# Parámetros estimados para la binomial
n <- max(Tabla$Puntaje)
media <- sum(Tabla$Puntaje * Tabla$ni) / sum(Tabla$ni)
p <- media / n
p
## [1] 0.5261601
# Frecuencias esperadas
Fe2 <- dbinom(Tabla$Puntaje, size = n, prob = p) * sum(Tabla$ni)
Fo2 <- Tabla$ni
Tabla$esperados <- Fe2
# Gráfico Experimental vs Teórica 
barplot(rbind(Fo2, Fe2),
        beside = TRUE,
        col = c("darkgreen", "orange"),
        legend.text = c("Experimental", "Teórica"),
        args.legend = list(x = "topright"),
        main = "Gráfica No.3:
        Distribución Experimental vs Teórica (Binomial)",
        names.arg = Tabla$Puntaje,
        ylab = "Frecuencia")

#Test Chi-cuadrado
x2_2 <- sum(((Fo2 - Fe2)^2) / Fe2)
k <- length(Fo2)              # número de clases
gl_2 <- k - 1 - 1             # grados de libertad: k - 1 - 1
vc_2 <- qchisq(0.95, df = gl_2)
cat("Chi-cuadrado calculado (x2_2):", x2_2, "\n")
## Chi-cuadrado calculado (x2_2): 2942.249
cat("Valor crítico (vc_2):", vc_2, "\n")
## Valor crítico (vc_2): 15.50731
if (x2_2 < vc_2) {
  cat("Resultado: No se rechaza H0 (la binomial se ajusta bien)\n")
} else {
  cat("Resultado: Se rechaza H0 (la binomial no se ajusta bien)\n")
}
## Resultado: Se rechaza H0 (la binomial no se ajusta bien)
#Correlación numérica
correlacion <- cor(Fo2, Fe2)
cat("Correlación Experimental vs Teórico:", correlacion, "\n")
## Correlación Experimental vs Teórico: 0.962122
#Gráfico de Correlación
plot(Fe2, Fo2,
     main = "Gráfica No.4:
     Correlación entre Frecuencias Experimental y Teórica",
     xlab = "Frecuencia Experimental(Fe2)",
     ylab = "Frecuencia Teórica (Fo2)",
     pch = 19,
     col = "blue",
     xlim = c(min(Fe2), max(Fe2)),
     ylim = c(min(Fo2), max(Fo2)))
abline(lm(Fo2 ~ Fe2), col = "red", lwd = 2)
grid()
# Mostrar r en el gráfico
text(x = max(Fe2)*0.7,
     y = max(Fo2)*0.9,
     labels = paste("r =", round(correlacion, 3)),
     col = "darkred", cex = 1.2)

Modelo de Poisson:

Tabla <- Tabla[Tabla$Puntaje != "Total", ]
Tabla$Puntaje <- as.numeric(Tabla$Puntaje)
Tabla$ni <- as.numeric(Tabla$ni)
lambda <- sum(Tabla$Puntaje * Tabla$ni) / sum(Tabla$ni)
cat("Lambda estimado para Poisson:", lambda, "\n")
## Lambda estimado para Poisson: 5.261601
# Rango de puntajes observados
x_vals <- Tabla$Puntaje
# Calcular probabilidades Poisson
probs_pois <- dpois(x_vals, lambda = lambda)
# Frecuencias esperadas
Fe_pois <- probs_pois * sum(Tabla$ni)
# Añadir a la tabla
Tabla$esperados_pois <- Fe_pois
#Gráfico Experimental vs Teórica 
barplot(rbind(Tabla$ni, Tabla$esperados_pois),
        beside = TRUE,
        col = c("darkgreen", "tomato"),
        legend.text = c("Experimental", "Teórico (Poisson)"),
        args.legend = list(x = "topright"),
        names.arg = Tabla$Puntaje,
        main = "Gráfica No.5: Distribución 
        Experimental vs Teórico (Poisson)",
        xlab = "Puntaje",
        ylab = "Frecuencia")

#Test de Chi-cuadrado (Poisson)
Fo_pois <- Tabla$ni
Fe_pois <- Tabla$esperados_pois
x2_pois <- sum((Fo_pois - Fe_pois)^2 / Fe_pois)
k <- length(Fo_pois)
gl_pois <- k - 1 - 1  # k - 1 - parámetros estimados (λ)
vc_pois <- qchisq(0.95, df = gl_pois)
cat("Chi-cuadrado Poisson:", x2_pois, "\n")
## Chi-cuadrado Poisson: 515.649
cat("Valor crítico (Poisson):", vc_pois, "\n")
## Valor crítico (Poisson): 15.50731
if (x2_pois < vc_pois) {
  cat("Resultado: No se rechaza H0 (la Poisson se ajusta bien)\n")
} else {
  cat("Resultado: Se rechaza H0 (la Poisson no se ajusta bien)\n")
}
## Resultado: Se rechaza H0 (la Poisson no se ajusta bien)
#Correlación Experimental vs Teórico (Poisson)
cor_pois <- cor(Fo_pois, Fe_pois)
cat("Correlación Experimental vs Teórico (Poisson):", round(cor_pois, 4), "\n")
## Correlación Experimental vs Teórico (Poisson): 0.9336
plot(Fe_pois, Fo_pois,
     main = "Gráfica No.6: Correlación de 
     Frecuencia Observada vs Esperada (Poisson)",
     xlab = "Frecuencia Teórico (Poisson)",
     ylab = "Frecuencia Experimental",
     pch = 19,
     col = "purple",
     xlim = c(min(Fe_pois), max(Fe_pois)),
     ylim = c(min(Fo_pois), max(Fo_pois)))
abline(lm(Fo_pois ~ Fe_pois), col = "red", lwd = 2)
grid()
# Agregar valor de la correlación r
text(x = max(Fe_pois)*0.7,
     y = max(Fo_pois)*0.9,
     labels = paste("r =", round(cor(Fo_pois, Fe_pois), 3)),
     col = "darkred", cex = 1.2)

Conclusion

La variable Fuel.Economy.Score es de tipo ordinal discreta, con puntajes que van del 1 al 10, representando niveles ordenados de eficiencia del combustible. Se analizaron diversos modelos de distribución probabilística para evaluar su capacidad de representar adecuadamente la distribución observada.

Se probaron las siguientes distribuciones:

Binomial: Presentó la mayor correlación con los datos observados (r = 0.962) y una forma de distribución visualmente similar, aunque no superó la prueba de Chi-cuadrado.

Poisson: También mostró una buena correlación (r = 0.934) y una distribución razonablemente parecida, pero igualmente fue rechazada por el test de ajuste.

A pesar de que ninguno de los modelos probabilísticos superó el test de Chi-cuadrado, los modelos binomial y Poisson demostraron un buen ajuste visual y alta correlación, lo que sugiere que pueden ser utilizados como aproximaciones razonables para describir el comportamiento de la variable.

3 GHG Score

Tabla de distribución de frecuencias

# Extraer y limpiar la variable
Puntuacion <- datos$GHG.Score
Puntuacion <- Puntuacion[!is.na(Puntuacion) & Puntuacion != -1 & Puntuacion != ""]
TDFpuntuacion <- table(Puntuacion)
Tabla <- as.data.frame(TDFpuntuacion)
colnames(Tabla) <- c("Puntaje", "ni")
Tabla$hi <- (Tabla$ni / sum(Tabla$ni)) * 100
Tabla$Puntaje <- as.character(Tabla$Puntaje)
# Fila total
fila_total <- data.frame(
  Puntaje = "Total", 
  ni = sum(Tabla$ni), 
  hi = sum(Tabla$hi),
  stringsAsFactors = FALSE
)
Tabla <- rbind(Tabla, fila_total)
# Mostrar tabla final
print(Tabla)
##    Puntaje   ni         hi
## 1        1  129   2.107843
## 2        2  294   4.803922
## 3        3  513   8.382353
## 4        4 1151  18.807190
## 5        5 1558  25.457516
## 6        6  953  15.571895
## 7        7  815  13.316993
## 8        8  435   7.107843
## 9        9   97   1.584967
## 10      10  175   2.859477
## 11   Total 6120 100.000000
# Ajustar márgenes para etiquetas largas
par(mar = c(8, 4, 3, 2))
# Gráfico de barras - Frecuencia Absoluta
barplot(
  height = Tabla$ni[-nrow(Tabla)],
  names.arg = Tabla$Puntaje[-nrow(Tabla)],
  main = "Gráfica No. 7: Distribución del GHG Score",
  xlab = "Puntuación",
  ylab = "Frecuencia Absoluta",
  col = "gold",
  las = 3,
  cex.names = 0.8,
  cex.axis = 0.9,
  cex.main = 1.2,
  border = "black"
)

# Gráfico de barras - Frecuencia Relativa
barplot(
  height = Tabla$hi[-nrow(Tabla)],
  names.arg = Tabla$Puntaje[-nrow(Tabla)],
  main = "Gráfica No. 8: Frecuencia Relativa (%) del GHG Score",
  xlab = "Puntuación",
  ylab = "Frecuencia Relativa (%)",
  col = "orange",
  las = 3,
  cex.names = 0.8,
  cex.axis = 0.9,
  cex.main = 1.2,
  ylim = c(0, max(Tabla$hi[-nrow(Tabla)]) * 1.2),
  border = "black"
)

Modelo Binomial:

ghg <- as.numeric(Puntuacion)  # ya está limpio
Fo <- table(ghg)
Fo_df <- as.data.frame(Fo)
colnames(Fo_df) <- c("X", "ni")
Fo_df$X <- as.numeric(as.character(Fo_df$X))

n_bin <- max(Fo_df$X)
p_bin <- mean(ghg) / n_bin
Fo_df$esperados <- dbinom(Fo_df$X, size = n_bin, prob = p_bin) * sum(Fo_df$ni)
# Gráfico de barras Experimental vs Teórico - Binomial
barplot(
  rbind(Fo_df$ni, Fo_df$esperados),
  beside = TRUE,
  col = c("darkblue", "tomato"),
  legend = c("Experimental", "Teórico"),
  names.arg = Fo_df$X,
  main = "Gráfica No. 9:Distribución 
  Binomial Ajustada al GHG Score",
  xlab = "Puntuación",
  ylab = "Frecuencia",
  ylim = c(0, max(c(Fo_df$ni, Fo_df$esperados)) * 1.2)
)

# Correlación binomial
correlacion_bin <- cor(Fo_df$ni, Fo_df$esperados)
cat("Correlación Experimental vs Teórico (Binomial):", round(correlacion_bin, 3), "\n")
## Correlación Experimental vs Teórico (Binomial): 0.961
# Gráfico de correlación - Binomial
plot(Fo_df$esperados, Fo_df$ni,
     main = "Gráfica No. 10: Correlación Binomial\nFrecuencia Teórica vs Experimental",
     xlab = "Teórica (Binomial)",
     ylab = "Experimental",
     pch = 19, col = "blue")
abline(lm(ni ~ esperados, data = Fo_df), col = "red", lwd = 2)
text(x = min(Fo_df$esperados), y = max(Fo_df$ni),
     labels = paste("r =", round(correlacion_bin, 3)),
     pos = 4, col = "darkblue", cex = 0.9)

# Chi-cuadrado
x2_bin <- sum(((Fo_df$ni - Fo_df$esperados)^2) / Fo_df$esperados)
gl_bin <- length(Fo_df$X) - 1
vc_bin <- qchisq(0.95, df = gl_bin)
cat("Chi-cuadrado Binomial:", round(x2_bin, 3), "\n")
## Chi-cuadrado Binomial: 3177.647
cat("Valor crítico (0.95):", round(vc_bin, 3), "\n")
## Valor crítico (0.95): 16.919
if (x2_bin < vc_bin) {
  cat("No se rechaza H0: El modelo binomial se ajusta bien a los datos.\n")
} else {
  cat("Se rechaza H0: El modelo binomial no se ajusta a los datos.\n")
}
## Se rechaza H0: El modelo binomial no se ajusta a los datos.

Modelo Poisson:

lambda <- mean(ghg)
Fo_df$esperados <- dpois(Fo_df$X, lambda) * sum(Fo_df$ni)
# Gráfico de barras Experimental vs Teórico - Poisson
barplot(
  rbind(Fo_df$ni, Fo_df$esperados),
  beside = TRUE,
  col = c("darkgreen", "orange"),
  legend = c("Experimental", "Teórico"),
  names.arg = Fo_df$X,
  main = "Gráfica No.11:
  Distribución Poisson Ajustada al GHG Score",
  xlab = "Puntuación",
  ylab = "Frecuencia",
  ylim = c(0, max(c(Fo_df$ni, Fo_df$esperados)) * 1.2)
)

# Correlación Poisson
correlacion_pois <- cor(Fo_df$ni, Fo_df$esperados)
cat("Correlación Experimental vs Teórico (Poisson):", round(correlacion_pois, 3), "\n")
## Correlación Experimental vs Teórico (Poisson): 0.933
# Gráfico de correlación - Poisson
plot(Fo_df$esperados, Fo_df$ni,
     main = "Gráfica No. 12: Correlación Poisson\nFrecuencia Teórica vs Experimental",
     xlab = "Teórica (Poisson)",
     ylab = "Experimental",
     pch = 19, col = "darkgreen")
abline(lm(ni ~ esperados, data = Fo_df), col = "red", lwd = 2)
text(x = min(Fo_df$esperados), y = max(Fo_df$ni),
     labels = paste("r =", round(correlacion_pois, 3)),
     pos = 4, col = "darkgreen", cex = 0.9)

# Chi-cuadrado
x2_pois <- sum(((Fo_df$ni - Fo_df$esperados)^2) / Fo_df$esperados)
gl_pois <- length(Fo_df$X) - 1
vc_pois <- qchisq(0.95, df = gl_pois)
cat("Chi-cuadrado Poisson:", round(x2_pois, 3), "\n")
## Chi-cuadrado Poisson: 527.05
cat("Valor crítico (0.95):", round(vc_pois, 3), "\n")
## Valor crítico (0.95): 16.919
if (x2_pois < vc_pois) {
  cat("No se rechaza H0: El modelo Poisson se ajusta bien a los datos.\n")
} else {
  cat("Se rechaza H0: El modelo Poisson no se ajusta a los datos.\n")
}
## Se rechaza H0: El modelo Poisson no se ajusta a los datos.

Conclusion

Se analizaron los datos de la variable GHG.Score aplicando dos modelos de distribución probabilística discreta: binomialy Poisson. En ambos casos, se observó una correlación visual y numérica relativamente alta entre las frecuencias observadas y las esperadas, lo cual sugiere que las formas de las distribuciones se asemejan. No obstante, al aplicar la prueba de Chi-cuadrado, los valores calculados fueron significativamente mayores al valor crítico en ambos modelos, lo que llevó a rechazar la hipótesis nula de buen ajuste. Esto indica que, estadísticamente, ninguno de los dos modelos describe adecuadamente el comportamiento de la variable. Este resultado podría deberse a que GHG.Score es una variable ordinal discreta, cuya distribución puede estar influenciada por múltiples factores externos que no se reflejan en un modelo binomial o Poisson puro. Por tanto, aunque gráficamente los modelos podrían parecer adecuados, desde el punto de vista estadístico, el ajuste es insuficiente en ambos casos.

4 GHG Score (Alt Fuel)

Tabla de distribución de frecuencias

# Extraer y limpiar la variable
Puntuacionalt <- datos$GHG.Score..Alt.Fuel.
Puntuacionalt <- Puntuacionalt[!is.na(Puntuacionalt) & Puntuacionalt != -1 & Puntuacionalt != ""]
TDFpuntuacionalt <- table(Puntuacionalt)
Tabla <- as.data.frame(TDFpuntuacionalt)
colnames(Tabla) <- c("Puntaje", "ni")
Tabla$hi <- (Tabla$ni / sum(Tabla$ni)) * 100
Tabla$Puntaje <- as.character(Tabla$Puntaje)
# Fila total
fila_total <- data.frame(
  Puntaje = "Total", 
  ni = sum(Tabla$ni), 
  hi = sum(Tabla$hi),
  stringsAsFactors = FALSE
)
Tabla <- rbind(Tabla, fila_total)
# Mostrar tabla final
print(Tabla)
##    Puntaje  ni         hi
## 1        0  11   2.029520
## 2        1  18   3.321033
## 3        2  66  12.177122
## 4        3  80  14.760148
## 5        4 135  24.907749
## 6        5 118  21.771218
## 7        6  85  15.682657
## 8        7  16   2.952030
## 9        8  13   2.398524
## 10   Total 542 100.000000
# Ajustar márgenes para etiquetas largas
par(mar = c(8, 4, 3, 2))
# Gráfico de barras - Frecuencia Absoluta
barplot(
  height = Tabla$ni[-nrow(Tabla)],
  names.arg = Tabla$Puntaje[-nrow(Tabla)],
  main = "Gráfica No. 13: Distribución 
  del GHG Score (Alt Fuel)",
  xlab = "Puntuación",
  ylab = "Frecuencia Absoluta",
  col = "burlywood1",
  las = 3,
  cex.names = 0.8,
  cex.axis = 0.9,
  cex.main = 1.2,
  border = "black"
)

# Gráfico de barras - Frecuencia Relativa
barplot(
  height = Tabla$hi[-nrow(Tabla)],
  names.arg = Tabla$Puntaje[-nrow(Tabla)],
  main = "Gráfica No. 14: Frecuencia Relativa (%) 
  del GHG Score (Alt Fuel)",
  xlab = "Puntuación",
  ylab = "Frecuencia Relativa (%)",
  col = "cadetblue2",
  las = 3,
  cex.names = 0.8,
  cex.axis = 0.9,
  cex.main = 1.2,
  ylim = c(0, max(Tabla$hi[-nrow(Tabla)]) * 1.2),
  border = "black"
)

Modelo Binomial:

# Extraer y limpiar la variable
ghg_alt <- datos$GHG.Score..Alt.Fuel.
ghg_alt <- ghg_alt[!is.na(ghg_alt) & ghg_alt != -1 & ghg_alt != ""]
Fo_alt <- table(ghg_alt)
Fo_df_alt <- as.data.frame(Fo_alt)
colnames(Fo_df_alt) <- c("X", "ni")
Fo_df_alt$X <- as.numeric(as.character(Fo_df_alt$X))
# Parámetros binomiales
n_bin_alt <- max(Fo_df_alt$X)
p_bin_alt <- mean(ghg_alt) / n_bin_alt
# Frecuencias esperadas
Fe_bin_alt <- dbinom(Fo_df_alt$X, size = n_bin_alt, prob = p_bin_alt) * sum(Fo_df_alt$ni)
Fo_df_alt$esperados_bin <- Fe_bin_alt
# Gráfico: Experimental vs Teórica
barplot(
  rbind(Fo_df_alt$ni, Fo_df_alt$esperados_bin),
  beside = TRUE,
  col = c("steelblue", "salmon"),
  legend = c("Experimental", "Teórica"),
  names.arg = Fo_df_alt$X,
  main = "Gráfica No. 15: Distribución Binomial 
  de GHG Score (Alt Fuel)",
  xlab = "Puntuación",
  ylab = "Frecuencia",
  ylim = c(0, max(c(Fo_df_alt$ni, Fo_df_alt$esperados_bin)) * 1.2)
)

# Correlación
correlacion_bin_alt <- cor(Fo_df_alt$ni, Fo_df_alt$esperados_bin)
cat("Correlación Experimental vs Teórica (Binomial):", round(correlacion_bin_alt, 3), "\n")
## Correlación Experimental vs Teórica (Binomial): 0.969
# Gráfico de correlación
plot(Fo_df_alt$esperados_bin, Fo_df_alt$ni,
     main = "Gráfica No.16: Correlación 
     Experimental vs Teórica (Binomial)",
     xlab = "Teórica (Binomial)",
     ylab = "Experimental",
     pch = 19, col = "steelblue")
abline(lm(Fo_df_alt$ni ~ Fo_df_alt$esperados_bin), col = "red", lwd = 2)
text(x = min(Fo_df_alt$esperados_bin), y = max(Fo_df_alt$ni),
     labels = paste("r =", round(correlacion_bin_alt, 3)),
     pos = 4, col = "darkblue", cex = 0.9)

# Prueba Chi-cuadrado
x2_bin_alt <- sum(((Fo_df_alt$ni - Fo_df_alt$esperados_bin)^2) / Fo_df_alt$esperados_bin)
gl_bin_alt <- length(Fo_df_alt$X) - 1
vc_bin_alt <- qchisq(0.95, df = gl_bin_alt)

cat("Chi-cuadrado calculado:", round(x2_bin_alt, 3), "\n")
## Chi-cuadrado calculado: 114.041
cat("Valor crítico (0.95):", round(vc_bin_alt, 3), "\n")
## Valor crítico (0.95): 15.507
# Decisión
if (x2_bin_alt < vc_bin_alt) {
  cat("No se rechaza H0: El modelo binomial se ajusta bien a los datos.\n")
} else {
  cat("Se rechaza H0: El modelo binomial no se ajusta a los datos.\n")
}
## Se rechaza H0: El modelo binomial no se ajusta a los datos.

Modelo Poisson:

# Usamos los datos ya limpiados:
ghg_alt <- datos$GHG.Score..Alt.Fuel.
ghg_alt <- ghg_alt[!is.na(ghg_alt) & ghg_alt != -1 & ghg_alt != ""]
# Tabla de frecuencia observada
Fo_alt <- table(ghg_alt)
Fo_df_alt <- as.data.frame(Fo_alt)
colnames(Fo_df_alt) <- c("X", "ni")
Fo_df_alt$X <- as.numeric(as.character(Fo_df_alt$X))
# Estimar parámetro lambda (λ) de Poisson
lambda_alt <- mean(ghg_alt)
lambda_alt
## [1] 4.143911
# Calcular frecuencias esperadas bajo Poisson
Fe_pois_alt <- dpois(Fo_df_alt$X, lambda = lambda_alt) * sum(Fo_df_alt$ni)
Fo_df_alt$esperados_pois <- Fe_pois_alt
# Gráfico: Experimental vs Teórica
barplot(
  rbind(Fo_df_alt$ni, Fo_df_alt$esperados_pois),
  beside = TRUE,
  col = c("olivedrab", "gold"),
  legend = c("Observada", "Esperada"),
  names.arg = Fo_df_alt$X,
  main = "Gráfica No.17: Distribución 
  Poisson de GHG Score (Alt Fuel)",
  xlab = "Puntuación",
  ylab = "Frecuencia",
  ylim = c(0, max(c(Fo_df_alt$ni, Fo_df_alt$esperados_pois)) * 1.2)
)

# Correlación
correlacion_pois_alt <- cor(Fo_df_alt$ni, Fo_df_alt$esperados_pois)
cat("Correlación Experimental vs Teórica (Poisson):", round(correlacion_pois_alt, 3), "\n")
## Correlación Experimental vs Teórica (Poisson): 0.909
# Gráfico de correlación
plot(Fo_df_alt$esperados_pois, Fo_df_alt$ni,
     main = "Gráfica No.18: Correlación 
     Experimental vs Teórica (Poisson)",
     xlab = "Teórica (Poisson)",
     ylab = "Experimental",
     pch = 19, col = "darkolivegreen")
abline(lm(Fo_df_alt$ni ~ Fo_df_alt$esperados_pois), col = "red", lwd = 2)
text(x = min(Fo_df_alt$esperados_pois), y = max(Fo_df_alt$ni),
     labels = paste("r =", round(correlacion_pois_alt, 3)),
     pos = 4, col = "darkgreen", cex = 0.9)

# Prueba Chi-cuadrado
x2_pois_alt <- sum(((Fo_df_alt$ni - Fo_df_alt$esperados_pois)^2) / Fo_df_alt$esperados_pois)
gl_pois_alt <- length(Fo_df_alt$X) - 1
vc_pois_alt <- qchisq(0.95, df = gl_pois_alt)
cat("Chi-cuadrado calculado:", round(x2_pois_alt, 3), "\n")
## Chi-cuadrado calculado: 56.277
cat("Valor crítico (0.95):", round(vc_pois_alt, 3), "\n")
## Valor crítico (0.95): 15.507
if (x2_pois_alt < vc_pois_alt) {
  cat("No se rechaza H0: El modelo Poisson se ajusta bien a los datos.\n")
} else {
  cat("Se rechaza H0: El modelo Poisson no se ajusta a los datos.\n")
}
## Se rechaza H0: El modelo Poisson no se ajusta a los datos.

Conclusion

Para la variable GHG Score (Alt Fuel), tanto el modelo binomial como el modelo de Poisson fueron evaluados. Sin embargo, ninguno logró un ajuste satisfactorio según la prueba de bondad de ajuste de chi-cuadrado, ya que en ambos casos se rechazó la hipótesis nula. Aunque el modelo binomial presentó una correlación ligeramente mayor entre frecuencias observadas y esperadas, los resultados indican que esta variable no se ajusta adecuadamente a ninguna de las dos distribuciones analizadas.