1 Variables Continuas

En esta sección, se analizan las variables continuas del estudio a través de la estadística descriptiva. El objetivo es explorar su distribución, tendencia central y dispersión para comprender mejor su comportamiento.

Cargamos datos:

setwd("/cloud/project")
datos <- read.csv("MPG_consumo.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 continuas:

2 Engine Displacement

variable <- na.omit(datos$Engine.Displacement)
n <- length(variable)
k <- ceiling(1 + 3.322 * log10(n))
R <- max(variable) - min(variable)
A <- ceiling(R / k)
lim_inf <- seq(from = floor(min(variable)), by = A, length.out = k)
lim_sup <- c(lim_inf[-1], max(variable) + 1e-6)   
MC <- (lim_inf + lim_sup) / 2
ni <- numeric(k)
for (i in 1:k) {
  if (i == k) {
    ni[i] <- sum(variable >= lim_inf[i] & variable <= lim_sup[i])
  } else {
    ni[i] <- sum(variable >= lim_inf[i] & variable < lim_sup[i])
  }
}
hi <- round(ni / sum(ni), 4)
Ni_asc <- cumsum(ni)
Fi_asc <- round(cumsum(hi), 4)

Ni_desc <- rev(cumsum(rev(ni)))
Fi_desc <- round(rev(cumsum(rev(hi))), 4)
tabla_frecuencia <- data.frame(
  Intervalo = paste0(round(lim_inf, 2), " - ", round(lim_sup, 2)),
  MC = round(MC, 2),
  ni = ni,
  hi = hi,
  Ni_desc = Ni_desc,
  Fi_desc = Fi_desc,
  Ni_asc = Ni_asc,
  Fi_asc = Fi_asc
)
print(tabla_frecuencia, row.names = FALSE)
##  Intervalo   MC    ni     hi Ni_desc Fi_desc Ni_asc Fi_asc
##      0 - 1  0.5    11 0.0003   37979  1.0000     11 0.0003
##      1 - 2  1.5  4949 0.1303   37968  0.9997   4960 0.1306
##      2 - 3  2.5 12517 0.3296   33019  0.8694  17477 0.4602
##      3 - 4  3.5  8880 0.2338   20502  0.5398  26357 0.6940
##      4 - 5  4.5  4962 0.1307   11622  0.3060  31319 0.8247
##      5 - 6  5.5  5086 0.1339    6660  0.1753  36405 0.9586
##      6 - 7  6.5  1517 0.0399    1574  0.0414  37922 0.9985
##      7 - 8  7.5    14 0.0004      57  0.0015  37936 0.9989
##      8 - 9  8.5    43 0.0011      43  0.0011  37979 1.0000
##     9 - 10  9.5     0 0.0000       0  0.0000  37979 1.0000
##    10 - 11 10.5     0 0.0000       0  0.0000  37979 1.0000
##    11 - 12 11.5     0 0.0000       0  0.0000  37979 1.0000
##    12 - 13 12.5     0 0.0000       0  0.0000  37979 1.0000
##    13 - 14 13.5     0 0.0000       0  0.0000  37979 1.0000
##    14 - 15 14.5     0 0.0000       0  0.0000  37979 1.0000
##    15 - 16 15.5     0 0.0000       0  0.0000  37979 1.0000
##   16 - 8.4 12.2     0 0.0000       0  0.0000  37979 1.0000
barplot(tabla_frecuencia$ni,
        main = "Histograma: Distribución de Engine Displacement",
        xlab = "Intervalos de Cilindrada",
        ylab = "Frecuencia absoluta",
        col = "skyblue",
        names.arg = tabla_frecuencia$Intervalo,
        las = 2,
        cex.names = 0.7,
        ylim = c(0, max(tabla_frecuencia$ni) + 5))

plot(tabla_frecuencia$MC, tabla_frecuencia$Ni_asc,
     type = "o", col = "green", pch = 16,
     main = "Ojivas: Frecuencias Acumuladas de Engine Displacement",
     xlab = "Cilindrada del motor (litros)",
     ylab = "Frecuencia acumulada",
     ylim = c(0, max(tabla_frecuencia$Ni_asc) + 5))

lines(tabla_frecuencia$MC, tabla_frecuencia$Ni_desc,
      type = "o", col = "red", pch = 17)

legend("bottomright",
       legend = c("Ojiva Ascendente", "Ojiva Descendente"),
       col = c("green", "red"),
       pch = c(16, 17),
       lty = 1)

boxplot(variable,
        horizontal = TRUE,
        col = "orange",
        main = "Diagrama de Caja: Engine Displacement",
        xlab = "Cilindrada del Motor (litros)")

3 City MPG FT1

variable <- na.omit(datos$City.MPG..FT1.)
n <- length(variable)
k <- ceiling(1 + 3.322 * log10(n))
R <- max(variable) - min(variable)
A <- ceiling(R / k)

# Límites inferiores y superiores
lim_inf <- seq(from = min(variable), by = A, length.out = k)
lim_sup <- lim_inf + A - 1  
MC <- (lim_inf + lim_sup) / 2
ni <- numeric(k)
for (i in 1:k) {
  if (i == k) {
    ni[i] <- sum(variable >= lim_inf[i] & variable <= lim_sup[i])
  } else {
    ni[i] <- sum(variable >= lim_inf[i] & variable < lim_sup[i])
  }
}
hi <- round(ni / sum(ni), 4)
Ni_asc <- cumsum(ni)
Fi_asc <- round(cumsum(hi), 4)
Ni_desc <- rev(cumsum(rev(ni)))
Fi_desc <- round(rev(cumsum(rev(hi))), 4)
tabla_frecuencia <- data.frame(
  Intervalo = paste0(round(lim_inf, 2), " - ", round(lim_sup, 2)),
  MC = round(MC, 2),
  ni = ni,
  hi = hi,
  Ni_desc = Ni_desc,
  Fi_desc = Fi_desc,
  Ni_asc = Ni_asc,
  Fi_asc = Fi_asc
)
print(tabla_frecuencia, row.names = FALSE)
##  Intervalo  MC    ni     hi Ni_desc Fi_desc Ni_asc Fi_asc
##     6 - 14  10  5897 0.1741   33880  1.0000   5897 0.1741
##    15 - 23  19 24319 0.7178   27983  0.8259  30216 0.8919
##    24 - 32  28  3128 0.0923    3664  0.1081  33344 0.9842
##    33 - 41  37   327 0.0097     536  0.0158  33671 0.9939
##    42 - 50  46    84 0.0025     209  0.0061  33755 0.9964
##    51 - 59  55    20 0.0006     125  0.0036  33775 0.9970
##    60 - 68  64     8 0.0002     105  0.0030  33783 0.9972
##    69 - 77  73     2 0.0001      97  0.0028  33785 0.9973
##    78 - 86  82    14 0.0004      95  0.0027  33799 0.9977
##    87 - 95  91    31 0.0009      81  0.0023  33830 0.9986
##   96 - 104 100    10 0.0003      50  0.0014  33840 0.9989
##  105 - 113 109     8 0.0002      40  0.0011  33848 0.9991
##  114 - 122 118     7 0.0002      32  0.0009  33855 0.9993
##  123 - 131 127    17 0.0005      25  0.0007  33872 0.9998
##  132 - 140 136     7 0.0002       8  0.0002  33879 1.0000
##  141 - 149 145     0 0.0000       1  0.0000  33879 1.0000
##  150 - 158 154     1 0.0000       1  0.0000  33880 1.0000
barplot(tabla_frecuencia$ni,
        main = "Histograma: City MPG (FT1)",
        xlab = "Intervalos de MPG",
        ylab = "Frecuencia absoluta",
        col = "skyblue",
        names.arg = tabla_frecuencia$Intervalo,
        las = 2,
        cex.names = 0.7,
        ylim = c(0, max(tabla_frecuencia$ni) + 5))

plot(tabla_frecuencia$MC, tabla_frecuencia$Ni_asc,
     type = "o", col = "green",
     main = "OjivasFrecuencias acumuladas de City MPG FT1",
     xlab = "MPG en Ciudad FT1 ",
     ylab = "Frecuencia acumulada",
     ylim = c(0, max(tabla_frecuencia$Ni_asc) + 5),
     pch = 16)

lines(tabla_frecuencia$MC, tabla_frecuencia$Ni_desc,
      type = "o", col = "red", pch = 17)

legend("bottomright",
       legend = c("Ojiva Ascendente", "Ojiva Descendente"),
       col = c("green", "red"),
       pch = c(16, 17),
       lty = 1)

boxplot(variable,
        horizontal = TRUE,
        col = "orange",
        main = "Diagrama de Caja: City MPG FT1",
        xlab = "MPG en Ciudad FT1")

4 Unrounded City MPG FT1

variable <- na.omit(datos$Unrounded.City.MPG..FT1.)
n <- length(variable)
k <- ceiling(1 + 3.322 * log10(n))
R <- max(variable) - min(variable)
A <- ceiling(R / k)
lim_inf <- seq(from = min(variable), by = A, length.out = k)
lim_sup <- lim_inf + A - 1 
MC <- (lim_inf + lim_sup) / 2
ni <- numeric(k)
for (i in 1:k) {
  if (i == k) {
    ni[i] <- sum(variable >= lim_inf[i] & variable <= lim_sup[i])
  } else {
    ni[i] <- sum(variable >= lim_inf[i] & variable < lim_sup[i])
  }
}
hi <- round(ni / sum(ni), 4)
Ni_asc <- cumsum(ni)
Fi_asc <- round(cumsum(hi), 4)
Ni_desc <- rev(cumsum(rev(ni)))
Fi_desc <- round(rev(cumsum(rev(hi))), 4)
tabla_frecuencia <- data.frame(
  Intervalo = paste0(round(lim_inf, 2), " - ", round(lim_sup, 2)),
  MC = round(MC, 2),
  ni = ni,
  hi = hi,
  Ni_desc = Ni_desc,
  Fi_desc = Fi_desc,
  Ni_asc = Ni_asc,
  Fi_asc = Fi_asc
)
print(tabla_frecuencia, row.names = FALSE)
##  Intervalo  MC    ni     hi Ni_desc Fi_desc Ni_asc Fi_asc
##      0 - 8   4 29662 0.7991   37119  0.9999  29662 0.7991
##     9 - 17  13  2803 0.0755    7457  0.2008  32465 0.8746
##    18 - 26  22  3870 0.1043    4654  0.1253  36335 0.9789
##    27 - 35  31   551 0.0148     784  0.0210  36886 0.9937
##    36 - 44  40   103 0.0028     233  0.0062  36989 0.9965
##    45 - 53  49    24 0.0006     130  0.0034  37013 0.9971
##    54 - 62  58    10 0.0003     106  0.0028  37023 0.9974
##    63 - 71  67     0 0.0000      96  0.0025  37023 0.9974
##    72 - 80  76     6 0.0002      96  0.0025  37029 0.9976
##    81 - 89  85    17 0.0005      90  0.0023  37046 0.9981
##    90 - 98  94    19 0.0005      73  0.0018  37065 0.9986
##   99 - 107 103     8 0.0002      54  0.0013  37073 0.9988
##  108 - 116 112     5 0.0001      46  0.0011  37078 0.9989
##  117 - 125 121    20 0.0005      41  0.0010  37098 0.9994
##  126 - 134 130    15 0.0004      21  0.0005  37113 0.9998
##  135 - 143 139     5 0.0001       6  0.0001  37118 0.9999
##  144 - 152 148     1 0.0000       1  0.0000  37119 0.9999
barplot(tabla_frecuencia$ni,
        main = "Histograma: Unrounded City MPG FT1",
        xlab = "Intervalos de MPG",
        ylab = "Frecuencia absoluta",
        col = "skyblue",
        names.arg = tabla_frecuencia$Intervalo,
        las = 2,
        cex.names = 0.7,
        ylim = c(0, max(tabla_frecuencia$ni) + 5))

plot(tabla_frecuencia$MC, tabla_frecuencia$Ni_asc,
     type = "o", col = "green",
     main = "OjivasFrecuencias acumuladas de Unrounded City MPG FT1",
     xlab = "MPG en ciudad sin redondear FT1 ",
     ylab = "Frecuencia acumulada",
     ylim = c(0, max(tabla_frecuencia$Ni_asc) + 5),
     pch = 16)

lines(tabla_frecuencia$MC, tabla_frecuencia$Ni_desc,
      type = "o", col = "red", pch = 17)

legend("bottomright",
       legend = c("Ojiva Ascendente", "Ojiva Descendente"),
       col = c("green", "red"),
       pch = c(16, 17),
       lty = 1)

boxplot(variable,
        horizontal = TRUE,
        col = "orange",
        main = "Diagrama de Caja: Unrounded City MPG FT1",
        xlab = "MPG en ciudad sin redondear FT1")

5 City MPG FT2

variable <- na.omit(datos$City.MPG..FT2.)
n <- length(variable)
k <- ceiling(1 + 3.322 * log10(n))
R <- max(variable) - min(variable)
A <- ceiling(R / k)
lim_inf <- seq(from = min(variable), by = A, length.out = k)
lim_sup <- lim_inf + A - 1  
MC <- (lim_inf + lim_sup) / 2
ni <- numeric(k)
for (i in 1:k) {
  if (i == k) {
    ni[i] <- sum(variable >= lim_inf[i] & variable <= lim_sup[i])
  } else {
    ni[i] <- sum(variable >= lim_inf[i] & variable < lim_sup[i])
  }
}
hi <- round(ni / sum(ni), 4)

# Frecuencias acumuladas
Ni_asc <- cumsum(ni)
Fi_asc <- round(cumsum(hi), 4)
Ni_desc <- rev(cumsum(rev(ni)))
Fi_desc <- round(rev(cumsum(rev(hi))), 4)
tabla_frecuencia <- data.frame(
  Intervalo = paste0(round(lim_inf, 2), " - ", round(lim_sup, 2)),
  MC = round(MC, 2),
  ni = ni,
  hi = hi,
  Ni_desc = Ni_desc,
  Fi_desc = Fi_desc,
  Ni_asc = Ni_asc,
  Fi_asc = Fi_asc
)
print(tabla_frecuencia, row.names = FALSE)
##  Intervalo  MC    ni     hi Ni_desc Fi_desc Ni_asc Fi_asc
##      0 - 8   4 36677 0.9646   38022  1.0001  36677 0.9646
##     9 - 17  13  1263 0.0332    1345  0.0355  37940 0.9978
##    18 - 26  22    27 0.0007      82  0.0023  37967 0.9985
##    27 - 35  31     0 0.0000      55  0.0016  37967 0.9985
##    36 - 44  40     5 0.0001      55  0.0016  37972 0.9986
##    45 - 53  49     4 0.0001      50  0.0015  37976 0.9987
##    54 - 62  58     7 0.0002      46  0.0014  37983 0.9989
##    63 - 71  67     3 0.0001      39  0.0012  37986 0.9990
##    72 - 80  76     0 0.0000      36  0.0011  37986 0.9990
##    81 - 89  85     6 0.0002      36  0.0011  37992 0.9992
##    90 - 98  94    14 0.0004      30  0.0009  38006 0.9996
##   99 - 107 103     8 0.0002      16  0.0005  38014 0.9998
##  108 - 116 112     2 0.0001       8  0.0003  38016 0.9999
##  117 - 125 121     2 0.0001       6  0.0002  38018 1.0000
##  126 - 134 130     3 0.0001       4  0.0001  38021 1.0001
##  135 - 143 139     0 0.0000       1  0.0000  38021 1.0001
##  144 - 152 148     1 0.0000       1  0.0000  38022 1.0001
barplot(tabla_frecuencia$ni,
        main = "Histograma: City MPG FT2",
        xlab = "Intervalos de MPG",
        ylab = "Frecuencia absoluta",
        col = "skyblue",
        names.arg = tabla_frecuencia$Intervalo,
        las = 2,
        cex.names = 0.7,
        ylim = c(0, max(tabla_frecuencia$ni) + 5))

plot(tabla_frecuencia$MC, tabla_frecuencia$Ni_asc,
     type = "o", col = "green",
     main = "OjivasFrecuencias acumuladas de City MPG FT2",
     xlab = "MPG en Ciudad FT2 ",
     ylab = "Frecuencia acumulada",
     ylim = c(0, max(tabla_frecuencia$Ni_asc) + 5),
     pch = 16)

lines(tabla_frecuencia$MC, tabla_frecuencia$Ni_desc,
      type = "o", col = "red", pch = 17)

legend("bottomright",
       legend = c("Ojiva Ascendente", "Ojiva Descendente"),
       col = c("green", "red"),
       pch = c(16, 17),
       lty = 1)

boxplot(variable,
        horizontal = TRUE,
        col = "orange",
        main = "Diagrama de Caja: City MPG FT2",
        xlab = "MPG en Ciudad FT2")

6 Unrounded City MPG FT2

variable <- na.omit(datos$Unrounded.City.MPG..FT2.)
n <- length(variable)
k <- ceiling(1 + 3.322 * log10(n))
R <- max(variable) - min(variable)
A <- ceiling(R / k)
lim_inf <- seq(from = min(variable), by = A, length.out = k)
lim_sup <- lim_inf + A - 1 
MC <- (lim_inf + lim_sup) / 2
ni <- numeric(k)
for (i in 1:k) {
  if (i == k) {
    ni[i] <- sum(variable >= lim_inf[i] & variable <= lim_sup[i])
  } else {
    ni[i] <- sum(variable >= lim_inf[i] & variable < lim_sup[i])
  }
}
hi <- round(ni / sum(ni), 4)
Ni_asc <- cumsum(ni)
Fi_asc <- round(cumsum(hi), 4)
Ni_desc <- rev(cumsum(rev(ni)))
Fi_desc <- round(rev(cumsum(rev(hi))), 4)
tabla_frecuencia <- data.frame(
  Intervalo = paste0(round(lim_inf, 2), " - ", round(lim_sup, 2)),
  MC = round(MC, 2),
  ni = ni,
  hi = hi,
  Ni_desc = Ni_desc,
  Fi_desc = Fi_desc,
  Ni_asc = Ni_asc,
  Fi_asc = Fi_asc
)
print(tabla_frecuencia, row.names = FALSE)
##  Intervalo  MC    ni     hi Ni_desc Fi_desc Ni_asc Fi_asc
##      0 - 8   4 37269 0.9793   38057  1.0002  37269 0.9793
##     9 - 17  13   710 0.0187     788  0.0209  37979 0.9980
##    18 - 26  22    21 0.0006      78  0.0022  38000 0.9986
##    27 - 35  31     0 0.0000      57  0.0016  38000 0.9986
##    36 - 44  40     6 0.0002      57  0.0016  38006 0.9988
##    45 - 53  49     4 0.0001      51  0.0014  38010 0.9989
##    54 - 62  58     6 0.0002      47  0.0013  38016 0.9991
##    63 - 71  67     3 0.0001      41  0.0011  38019 0.9992
##    72 - 80  76     4 0.0001      38  0.0010  38023 0.9993
##    81 - 89  85     5 0.0001      34  0.0009  38028 0.9994
##    90 - 98  94    13 0.0003      29  0.0008  38041 0.9997
##   99 - 107 103     8 0.0002      16  0.0005  38049 0.9999
##  108 - 116 112     2 0.0001       8  0.0003  38051 1.0000
##  117 - 125 121     2 0.0001       6  0.0002  38053 1.0001
##  126 - 134 130     3 0.0001       4  0.0001  38056 1.0002
##  135 - 143 139     0 0.0000       1  0.0000  38056 1.0002
##  144 - 152 148     1 0.0000       1  0.0000  38057 1.0002
barplot(tabla_frecuencia$ni,
        main = "Histograma: Unrounded City MPG FT1",
        xlab = "Intervalos de MPG",
        ylab = "Frecuencia absoluta",
        col = "skyblue",
        names.arg = tabla_frecuencia$Intervalo,
        las = 2,
        cex.names = 0.7,
        ylim = c(0, max(tabla_frecuencia$ni) + 5))

plot(tabla_frecuencia$MC, tabla_frecuencia$Ni_asc,
     type = "o", col = "green",
     main = "OjivasFrecuencias acumuladas de Unrounded City MPG FT2",
     xlab = "MPG en ciudad sin redondear FT2",
     ylab = "Frecuencia acumulada",
     ylim = c(0, max(tabla_frecuencia$Ni_asc) + 5),
     pch = 16)

lines(tabla_frecuencia$MC, tabla_frecuencia$Ni_desc,
      type = "o", col = "red", pch = 17)

legend("bottomright",
       legend = c("Ojiva Ascendente", "Ojiva Descendente"),
       col = c("green", "red"),
       pch = c(16, 17),
       lty = 1)

boxplot(variable,
        horizontal = TRUE,
        col = "orange",
        main = "Diagrama de Caja: Unrounded City MPG FT2",
        xlab = "MPG en ciudad sin redondear FT2")

7 City Gasoline Consumption (CD)

variable <- na.omit(datos$City.Gasoline.Consumption..CD.)
n <- length(variable)
k <- ceiling(1 + 3.322 * log10(n))
R <- max(variable) - min(variable)
A <- ceiling(R / k)
lim_inf <- seq(from = min(variable), by = A, length.out = k)
lim_sup <- c(lim_inf[-1] - 0.0001, max(variable))
MC <- (lim_inf + lim_sup) / 2
ni <- numeric(k)
for (i in 1:k) {
  if (i == k) {
    ni[i] <- sum(variable >= lim_inf[i] & variable <= lim_sup[i])  
  } else {
    ni[i] <- sum(variable >= lim_inf[i] & variable < lim_sup[i])
  }
}
hi <- round(ni / sum(ni), 4)
Ni_asc <- cumsum(ni)
Fi_asc <- round(cumsum(hi), 4)
Ni_desc <- rev(cumsum(rev(ni)))
Fi_desc <- round(rev(cumsum(rev(hi))), 4)
tabla_frecuencia <- data.frame(
  Intervalo = paste0(round(lim_inf, 2), " - ", round(lim_sup, 2)),
  MC = round(MC, 2),
  ni = ni,
  hi = hi,
  Ni_desc = Ni_desc,
  Fi_desc = Fi_desc,
  Ni_asc = Ni_asc,
  Fi_asc = Fi_asc
)
print(tabla_frecuencia, row.names = FALSE)
##  Intervalo    MC    ni     hi Ni_desc Fi_desc Ni_asc Fi_asc
##      0 - 1  0.50 38111 0.9999   38113   1e+00  38111 0.9999
##      1 - 2  1.50     0 0.0000       2   1e-04  38111 0.9999
##      2 - 3  2.50     0 0.0000       2   1e-04  38111 0.9999
##      3 - 4  3.50     0 0.0000       2   1e-04  38111 0.9999
##      4 - 5  4.50     0 0.0000       2   1e-04  38111 0.9999
##      5 - 6  5.50     2 0.0001       2   1e-04  38113 1.0000
##      6 - 7  6.50     0 0.0000       0   0e+00  38113 1.0000
##      7 - 8  7.50     0 0.0000       0   0e+00  38113 1.0000
##      8 - 9  8.50     0 0.0000       0   0e+00  38113 1.0000
##     9 - 10  9.50     0 0.0000       0   0e+00  38113 1.0000
##    10 - 11 10.50     0 0.0000       0   0e+00  38113 1.0000
##    11 - 12 11.50     0 0.0000       0   0e+00  38113 1.0000
##    12 - 13 12.50     0 0.0000       0   0e+00  38113 1.0000
##    13 - 14 13.50     0 0.0000       0   0e+00  38113 1.0000
##    14 - 15 14.50     0 0.0000       0   0e+00  38113 1.0000
##    15 - 16 15.50     0 0.0000       0   0e+00  38113 1.0000
##  16 - 5.35 10.68     0 0.0000       0   0e+00  38113 1.0000
barplot(tabla_frecuencia$ni,
        main = "Histograma: City Gasoline Consumption CD",
        xlab = "Intervalos de Combustion CD",
        ylab = "Frecuencia absoluta",
        col = "skyblue",
        names.arg = tabla_frecuencia$Intervalo,
        las = 2,
        ylim = c(0, max(tabla_frecuencia$ni) + 5),
        cex.names = 0.7)

plot(tabla_frecuencia$MC, tabla_frecuencia$Ni_asc,
     type = "o", col = "green",
     main = "Ojivas: Frecuencias acumuladas de City Gasoline Consumption CD",
     xlab = "Combustion de Gasolina en Ciudad (CD)",
     ylab = "Frecuencia acumulada",
     ylim = c(0, max(tabla_frecuencia$Ni_asc) + 5),
     pch = 16)

lines(tabla_frecuencia$MC, tabla_frecuencia$Ni_desc,
      type = "o", col = "red", pch = 17)

legend("bottomright",
       legend = c("Ojiva Ascendente", "Ojiva Descendente"),
       col = c("green", "red"),
       pch = c(16, 17),
       lty = 1)

boxplot(variable,
        horizontal = TRUE,
        col = "orange",
        main = "Diagrama de Caja: City Gasoline Consumption CD",
        xlab = "Combustion de Gasolina en ciudad CD")

8 City Electricity Consumption

variable <- na.omit(datos$City.Electricity.Consumption)
n <- length(variable)
k <- ceiling(1 + 3.322 * log10(n))
R <- max(variable) - min(variable)
A <- ceiling(R / k)
lim_inf <- seq(from = min(variable), by = A, length.out = k)
lim_sup <- lim_inf + A - 1 
MC <- (lim_inf + lim_sup) / 2
ni <- numeric(k)
for (i in 1:k) {
  if (i == k) {
    ni[i] <- sum(variable >= lim_inf[i] & variable <= lim_sup[i])
  } else {
    ni[i] <- sum(variable >= lim_inf[i] & variable < lim_sup[i])
  }
}
hi <- round(ni / sum(ni), 4)
Ni_asc <- cumsum(ni)
Fi_asc <- round(cumsum(hi), 4)
Ni_desc <- rev(cumsum(rev(ni)))
Fi_desc <- round(rev(cumsum(rev(hi))), 4)
tabla_frecuencia <- data.frame(
  Intervalo = paste0(round(lim_inf, 2), " - ", round(lim_sup, 2)),
  MC = round(MC, 2),
  ni = ni,
  hi = hi,
  Ni_desc = Ni_desc,
  Fi_desc = Fi_desc,
  Ni_asc = Ni_asc,
  Fi_asc = Fi_asc
)
print(tabla_frecuencia, row.names = FALSE)
##  Intervalo    MC    ni     hi Ni_desc Fi_desc Ni_asc Fi_asc
##      0 - 7   3.5 37915 0.9954   38090  1.0000  37915 0.9954
##     8 - 15  11.5     0 0.0000     175  0.0046  37915 0.9954
##    16 - 23  19.5     1 0.0000     175  0.0046  37916 0.9954
##    24 - 31  27.5    55 0.0014     174  0.0046  37971 0.9968
##    32 - 39  35.5    65 0.0017     119  0.0032  38036 0.9985
##    40 - 47  43.5    22 0.0006      54  0.0015  38058 0.9991
##    48 - 55  51.5    10 0.0003      32  0.0009  38068 0.9994
##    56 - 63  59.5     8 0.0002      22  0.0006  38076 0.9996
##    64 - 71  67.5     8 0.0002      14  0.0004  38084 0.9998
##    72 - 79  75.5     2 0.0001       6  0.0002  38086 0.9999
##    80 - 87  83.5     0 0.0000       4  0.0001  38086 0.9999
##    88 - 95  91.5     2 0.0001       4  0.0001  38088 1.0000
##   96 - 103  99.5     1 0.0000       2  0.0000  38089 1.0000
##  104 - 111 107.5     0 0.0000       1  0.0000  38089 1.0000
##  112 - 119 115.5     0 0.0000       1  0.0000  38089 1.0000
##  120 - 127 123.5     1 0.0000       1  0.0000  38090 1.0000
##  128 - 135 131.5     0 0.0000       0  0.0000  38090 1.0000
barplot(tabla_frecuencia$ni,
        main = "Histograma: City Electricity Consumption",
        xlab = "Intervalos de Consumo",
        ylab = "Frecuencia absoluta",
        col = "skyblue",
        names.arg = tabla_frecuencia$Intervalo,
        las = 2,
        cex.names = 0.7,
        ylim = c(0, max(tabla_frecuencia$ni) + 5))

plot(tabla_frecuencia$MC, tabla_frecuencia$Ni_asc,
     type = "o", col = "green",
     main = "Ojivas Frecuencias acumuladas de City Electricity Consumption",
     xlab = "Marca de clase (Consumo)",
     ylab = "Frecuencia acumulada",
     ylim = c(0, max(tabla_frecuencia$Ni_asc) + 5),
     pch = 16)

lines(tabla_frecuencia$MC, tabla_frecuencia$Ni_desc,
      type = "o", col = "red", pch = 17)

legend("bottomright",
       legend = c("Ojiva Ascendente", "Ojiva Descendente"),
       col = c("green", "red"),
       pch = c(16, 17),
       lty = 1)

boxplot(variable,
        horizontal = TRUE,
        col = "orange",
        main = "Diagrama de Caja: City Electricity Consumption",
        xlab = "Consumo de electricidad de la ciudad")

9 City Utility Factor

variable <- na.omit(datos$City.Utility.Factor)

# Número de intervalos fijo
n <- length(variable)
k <- ceiling(1 + 3.322 * log10(n))

# Calcular rango y amplitud
R <- max(variable) - min(variable)
A <- ceiling(R / k)

# Límites inferiores y superiores
lim_inf <- seq(from = min(variable), by = A, length.out = k)
lim_sup <- lim_inf + A - 1 

# Marcas de clase
MC <- (lim_inf + lim_sup) / 2

# Frecuencias absolutas
ni <- numeric(k)
for (i in 1:k) {
  if (i == k) {
    ni[i] <- sum(variable >= lim_inf[i] & variable <= lim_sup[i])
  } else {
    ni[i] <- sum(variable >= lim_inf[i] & variable < lim_sup[i])
  }
}

# Frecuencia relativa
hi <- round(ni / sum(ni), 4)

# Frecuencias acumuladas
Ni_asc <- cumsum(ni)
Fi_asc <- round(cumsum(hi), 4)
Ni_desc <- rev(cumsum(rev(ni)))
Fi_desc <- round(rev(cumsum(rev(hi))), 4)

# Crear tabla
tabla_frecuencia <- data.frame(
  Intervalo = paste0(round(lim_inf, 2), " - ", round(lim_sup, 2)),
  MC = round(MC, 2),
  ni = ni,
  hi = hi,
  Ni_desc = Ni_desc,
  Fi_desc = Fi_desc,
  Ni_asc = Ni_asc,
  Fi_asc = Fi_asc
)
print(tabla_frecuencia, row.names = FALSE)
##  Intervalo MC ni  hi Ni_desc Fi_desc Ni_asc Fi_asc
##      0 - 0  0  0 NaN       0     NaN      0    NaN
##      1 - 1  1  0 NaN       0     NaN      0    NaN
##      2 - 2  2  0 NaN       0     NaN      0    NaN
##      3 - 3  3  0 NaN       0     NaN      0    NaN
##      4 - 4  4  0 NaN       0     NaN      0    NaN
##      5 - 5  5  0 NaN       0     NaN      0    NaN
##      6 - 6  6  0 NaN       0     NaN      0    NaN
##      7 - 7  7  0 NaN       0     NaN      0    NaN
##      8 - 8  8  0 NaN       0     NaN      0    NaN
##      9 - 9  9  0 NaN       0     NaN      0    NaN
##    10 - 10 10  0 NaN       0     NaN      0    NaN
##    11 - 11 11  0 NaN       0     NaN      0    NaN
##    12 - 12 12  0 NaN       0     NaN      0    NaN
##    13 - 13 13  0 NaN       0     NaN      0    NaN
##    14 - 14 14  0 NaN       0     NaN      0    NaN
##    15 - 15 15  0 NaN       0     NaN      0    NaN
##    16 - 16 16  0 NaN       0     NaN      0    NaN
barplot(tabla_frecuencia$ni,
        main = "Histograma: City Utility Factor",
        xlab = "Utilidad Urbana",
        ylab = "Frecuencia absoluta",
        col = "skyblue",
        names.arg = tabla_frecuencia$Intervalo,
        las = 2,
        cex.names = 0.7,
        ylim = c(0, max(tabla_frecuencia$ni) + 5))

plot(tabla_frecuencia$MC, tabla_frecuencia$Ni_asc,
     type = "o", col = "green",
     main = "Ojivas Frecuencias acumuladas de City Utility Factor",
     xlab = "Marca de clase (Consumo)",
     ylab = "Frecuencia acumulada",
     ylim = c(0, max(tabla_frecuencia$Ni_asc) + 5),
     pch = 16)

lines(tabla_frecuencia$MC, tabla_frecuencia$Ni_desc,
      type = "o", col = "red", pch = 17)

legend("bottomright",
       legend = c("Ojiva Ascendente", "Ojiva Descendente"),
       col = c("green", "red"),
       pch = c(16, 17),
       lty = 1)

boxplot(variable,
        horizontal = TRUE,
        col = "orange",
        main = "Diagrama de Caja: City Utility Factor",
        xlab = "Utilidad Urbana")

10 Highway MPG FT1

# Seleccionar la variable continua
variable <- na.omit(datos$Highway.MPG..FT1.)

# Número de intervalos fijo
n <- length(variable)
k <- ceiling(1 + 3.322 * log10(n))

# Calcular rango y amplitud
R <- max(variable) - min(variable)
A <- ceiling(R / k)

# Límites inferiores y superiores
lim_inf <- seq(from = min(variable), by = A, length.out = k)
lim_sup <- lim_inf + A - 1  # corregido para evitar superposición

# Marcas de clase
MC <- (lim_inf + lim_sup) / 2

# Frecuencias absolutas
ni <- numeric(k)
for (i in 1:k) {
  if (i == k) {
    ni[i] <- sum(variable >= lim_inf[i] & variable <= lim_sup[i])
  } else {
    ni[i] <- sum(variable >= lim_inf[i] & variable < lim_sup[i])
  }
}

# Frecuencia relativa
hi <- round(ni / sum(ni), 4)

# Frecuencias acumuladas
Ni_asc <- cumsum(ni)
Fi_asc <- round(cumsum(hi), 4)
Ni_desc <- rev(cumsum(rev(ni)))
Fi_desc <- round(rev(cumsum(rev(hi))), 4)

# Crear tabla
tabla_frecuencia <- data.frame(
  Intervalo = paste0(round(lim_inf, 2), " - ", round(lim_sup, 2)),
  MC = round(MC, 2),
  ni = ni,
  hi = hi,
  Ni_desc = Ni_desc,
  Fi_desc = Fi_desc,
  Ni_asc = Ni_asc,
  Fi_asc = Fi_asc
)

# Mostrar tabla
print(tabla_frecuencia, row.names = FALSE)
##  Intervalo  MC    ni     hi Ni_desc Fi_desc Ni_asc Fi_asc
##     9 - 15  12  1192 0.0370   32251  0.9998   1192 0.0370
##    16 - 22  19 10920 0.3386   31059  0.9628  12112 0.3756
##    23 - 29  26 14733 0.4568   20139  0.6242  26845 0.8324
##    30 - 36  33  4384 0.1359    5406  0.1674  31229 0.9683
##    37 - 43  40   740 0.0229    1022  0.0315  31969 0.9912
##    44 - 50  47   159 0.0049     282  0.0086  32128 0.9961
##    51 - 57  54    19 0.0006     123  0.0037  32147 0.9967
##    58 - 64  61    12 0.0004     104  0.0031  32159 0.9971
##    65 - 71  68     7 0.0002      92  0.0027  32166 0.9973
##    72 - 78  75     3 0.0001      85  0.0025  32169 0.9974
##    79 - 85  82     6 0.0002      82  0.0024  32175 0.9976
##    86 - 92  89    11 0.0003      76  0.0022  32186 0.9979
##    93 - 99  96    26 0.0008      65  0.0019  32212 0.9987
##  100 - 106 103    24 0.0007      39  0.0011  32236 0.9994
##  107 - 113 110    14 0.0004      15  0.0004  32250 0.9998
##  114 - 120 117     0 0.0000       1  0.0000  32250 0.9998
##  121 - 127 124     1 0.0000       1  0.0000  32251 0.9998
barplot(tabla_frecuencia$ni,
        main = "Histograma: Highway MPG FT1",
        xlab = "MPG en Carretera",
        ylab = "Frecuencia absoluta",
        col = "skyblue",
        names.arg = tabla_frecuencia$Intervalo,
        las = 2,
        cex.names = 0.7,
        ylim = c(0, max(tabla_frecuencia$ni) + 5))

plot(tabla_frecuencia$MC, tabla_frecuencia$Ni_asc,
     type = "o", col = "green",
     main = "OjivasFrecuencias acumuladas de Highway MPG FT1",
     xlab = "MPG en Carretera",
     ylab = "Frecuencia acumulada",
     ylim = c(0, max(tabla_frecuencia$Ni_asc) + 5),
     pch = 16)

lines(tabla_frecuencia$MC, tabla_frecuencia$Ni_desc,
      type = "o", col = "red", pch = 17)

legend("bottomright",
       legend = c("Ojiva Ascendente", "Ojiva Descendente"),
       col = c("green", "red"),
       pch = c(16, 17),
       lty = 1)

boxplot(variable,
        horizontal = TRUE,
        col = "orange",
        main = "Diagrama de Caja: Highway MPG FT1",
        xlab = "MPG en Carretera")

11 Unrounded Highway MPG FT1

# Seleccionar la variable continua
variable <- na.omit(datos$Unrounded.Highway.MPG..FT1.)

# Número de intervalos fijo
n <- length(variable)
k <- ceiling(1 + 3.322 * log10(n))

# Calcular rango y amplitud
R <- max(variable) - min(variable)
A <- ceiling(R / k)

# Límites inferiores y superiores
lim_inf <- seq(from = min(variable), by = A, length.out = k)
lim_sup <- lim_inf + A - 1  # corregido para evitar superposición

# Marcas de clase
MC <- (lim_inf + lim_sup) / 2

# Frecuencias absolutas
ni <- numeric(k)
for (i in 1:k) {
  if (i == k) {
    ni[i] <- sum(variable >= lim_inf[i] & variable <= lim_sup[i])
  } else {
    ni[i] <- sum(variable >= lim_inf[i] & variable < lim_sup[i])
  }
}

# Frecuencia relativa
hi <- round(ni / sum(ni), 4)

# Frecuencias acumuladas
Ni_asc <- cumsum(ni)
Fi_asc <- round(cumsum(hi), 4)
Ni_desc <- rev(cumsum(rev(ni)))
Fi_desc <- round(rev(cumsum(rev(hi))), 4)

# Crear tabla
tabla_frecuencia <- data.frame(
  Intervalo = paste0(round(lim_inf, 2), " - ", round(lim_sup, 2)),
  MC = round(MC, 2),
  ni = ni,
  hi = hi,
  Ni_desc = Ni_desc,
  Fi_desc = Fi_desc,
  Ni_asc = Ni_asc,
  Fi_asc = Fi_asc
)

# Mostrar tabla
print(tabla_frecuencia, row.names = FALSE)
##  Intervalo    MC    ni     hi Ni_desc Fi_desc Ni_asc Fi_asc
##      0 - 7   3.5 29662 0.7992   37114  1.0000  29662 0.7992
##     8 - 15  11.5    42 0.0011    7452  0.2008  29704 0.8003
##    16 - 23  19.5  2107 0.0568    7410  0.1997  31811 0.8571
##    24 - 31  27.5  3675 0.0990    5303  0.1429  35486 0.9561
##    32 - 39  35.5  1399 0.0377    1628  0.0439  36885 0.9938
##    40 - 47  43.5   118 0.0032     229  0.0062  37003 0.9970
##    48 - 55  51.5    15 0.0004     111  0.0030  37018 0.9974
##    56 - 63  59.5     3 0.0001      96  0.0026  37021 0.9975
##    64 - 71  67.5     5 0.0001      93  0.0025  37026 0.9976
##    72 - 79  75.5     3 0.0001      88  0.0024  37029 0.9977
##    80 - 87  83.5     4 0.0001      85  0.0023  37033 0.9978
##    88 - 95  91.5    28 0.0008      81  0.0022  37061 0.9986
##   96 - 103  99.5    29 0.0008      53  0.0014  37090 0.9994
##  104 - 111 107.5    23 0.0006      24  0.0006  37113 1.0000
##  112 - 119 115.5     0 0.0000       1  0.0000  37113 1.0000
##  120 - 127 123.5     1 0.0000       1  0.0000  37114 1.0000
##  128 - 135 131.5     0 0.0000       0  0.0000  37114 1.0000
# Histograma manual con las frecuencias absolutas
barplot(tabla_frecuencia$ni,
        main = "Histograma: Unrounded Highway MPG FT1",
        xlab = "MPG en Carretera",
        ylab = "Frecuencia absoluta",
        col = "skyblue",
        names.arg = tabla_frecuencia$Intervalo,
        las = 2,
        cex.names = 0.7,
        ylim = c(0, max(tabla_frecuencia$ni) + 5))

# Ojivas (ascendente y descendente) con líneas conectadas
plot(tabla_frecuencia$MC, tabla_frecuencia$Ni_asc,
     type = "o", col = "green",
     main = "OjivasFrecuencias acumuladas de Unrounded Highway MPG FT1",
     xlab = "MPG en Carretera",
     ylab = "Frecuencia acumulada",
     ylim = c(0, max(tabla_frecuencia$Ni_asc) + 5),
     pch = 16)

lines(tabla_frecuencia$MC, tabla_frecuencia$Ni_desc,
      type = "o", col = "red", pch = 17)

legend("bottomright",
       legend = c("Ojiva Ascendente", "Ojiva Descendente"),
       col = c("green", "red"),
       pch = c(16, 17),
       lty = 1)

# Diagrama de caja (boxplot)
boxplot(variable,
        horizontal = TRUE,
        col = "orange",
        main = "Diagrama de Caja: Unrounded Highway MPG FT1",
        xlab = "MPG en Carretera")

12 Highway MPG FT2

# Seleccionar la variable continua
variable <- na.omit(datos$Highway.MPG..FT2.)

# Número de intervalos fijo
n <- length(variable)
k <- ceiling(1 + 3.322 * log10(n))

# Calcular rango y amplitud
R <- max(variable) - min(variable)
A <- ceiling(R / k)

# Límites inferiores y superiores
lim_inf <- seq(from = min(variable), by = A, length.out = k)
lim_sup <- lim_inf + A - 1  # corregido para evitar superposición

# Marcas de clase
MC <- (lim_inf + lim_sup) / 2

# Frecuencias absolutas
ni <- numeric(k)
for (i in 1:k) {
  if (i == k) {
    ni[i] <- sum(variable >= lim_inf[i] & variable <= lim_sup[i])
  } else {
    ni[i] <- sum(variable >= lim_inf[i] & variable < lim_sup[i])
  }
}

# Frecuencia relativa
hi <- round(ni / sum(ni), 4)

# Frecuencias acumuladas
Ni_asc <- cumsum(ni)
Fi_asc <- round(cumsum(hi), 4)
Ni_desc <- rev(cumsum(rev(ni)))
Fi_desc <- round(rev(cumsum(rev(hi))), 4)

# Crear tabla
tabla_frecuencia <- data.frame(
  Intervalo = paste0(round(lim_inf, 2), " - ", round(lim_sup, 2)),
  MC = round(MC, 2),
  ni = ni,
  hi = hi,
  Ni_desc = Ni_desc,
  Fi_desc = Fi_desc,
  Ni_asc = Ni_asc,
  Fi_asc = Fi_asc
)

# Mostrar tabla
print(tabla_frecuencia, row.names = FALSE)
##  Intervalo    MC    ni     hi Ni_desc Fi_desc Ni_asc Fi_asc
##      0 - 7   3.5 36675 0.9660   37967  0.9999  36675 0.9660
##     8 - 15  11.5   575 0.0151    1292  0.0339  37250 0.9811
##    16 - 23  19.5   626 0.0165     717  0.0188  37876 0.9976
##    24 - 31  27.5    35 0.0009      91  0.0023  37911 0.9985
##    32 - 39  35.5     0 0.0000      56  0.0014  37911 0.9985
##    40 - 47  43.5     3 0.0001      56  0.0014  37914 0.9986
##    48 - 55  51.5     4 0.0001      53  0.0013  37918 0.9987
##    56 - 63  59.5     4 0.0001      49  0.0012  37922 0.9988
##    64 - 71  67.5     5 0.0001      45  0.0011  37927 0.9989
##    72 - 79  75.5     7 0.0002      40  0.0010  37934 0.9991
##    80 - 87  83.5    13 0.0003      33  0.0008  37947 0.9994
##    88 - 95  91.5     6 0.0002      20  0.0005  37953 0.9996
##   96 - 103  99.5     8 0.0002      14  0.0003  37961 0.9998
##  104 - 111 107.5     5 0.0001       6  0.0001  37966 0.9999
##  112 - 119 115.5     0 0.0000       1  0.0000  37966 0.9999
##  120 - 127 123.5     1 0.0000       1  0.0000  37967 0.9999
##  128 - 135 131.5     0 0.0000       0  0.0000  37967 0.9999
# Histograma manual con las frecuencias absolutas
barplot(tabla_frecuencia$ni,
        main = "Histograma: Highway MPG FT2",
        xlab = "MPG en Carretera FT2",
        ylab = "Frecuencia absoluta",
        col = "skyblue",
        names.arg = tabla_frecuencia$Intervalo,
        las = 2,
        cex.names = 0.7,
        ylim = c(0, max(tabla_frecuencia$ni) + 5))

# Ojivas (ascendente y descendente) con líneas conectadas
plot(tabla_frecuencia$MC, tabla_frecuencia$Ni_asc,
     type = "o", col = "green",
     main = "OjivasFrecuencias acumuladas de Highway MPG FT2",
     xlab = "MPG en Carretera FT2",
     ylab = "Frecuencia acumulada",
     ylim = c(0, max(tabla_frecuencia$Ni_asc) + 5),
     pch = 16)

lines(tabla_frecuencia$MC, tabla_frecuencia$Ni_desc,
      type = "o", col = "red", pch = 17)

legend("bottomright",
       legend = c("Ojiva Ascendente", "Ojiva Descendente"),
       col = c("green", "red"),
       pch = c(16, 17),
       lty = 1)

# Diagrama de caja (boxplot)
boxplot(variable,
        horizontal = TRUE,
        col = "orange",
        main = "Diagrama de Caja: Highway MPG FT2",
        xlab = "MPG en Carretera FT2")

13 Unrounded Highway MPG FT2

# Seleccionar la variable continua
variable <- na.omit(datos$Unrounded.Highway.MPG..FT2.)

# Número de intervalos (regla de Sturges)
n <- length(variable)
k <- ceiling(1 + 3.322 * log10(n))

# Calcular rango y amplitud
R <- max(variable) - min(variable)
A <- ceiling(R / k)

# Límites de clase (asegura no solapamiento)
lim_inf <- seq(from = min(variable), by = A, length.out = k)
lim_sup <- c(lim_inf[-1], max(variable) + 1e-4)

# Marcas de clase
MC <- (lim_inf + lim_sup) / 2

# Frecuencias absolutas por intervalo
ni <- numeric(k)
for (i in 1:k) {
  if (i == k) {
    ni[i] <- sum(variable >= lim_inf[i] & variable <= lim_sup[i])
  } else {
    ni[i] <- sum(variable >= lim_inf[i] & variable < lim_sup[i])
  }
}

# Frecuencia relativa
hi <- round(ni / sum(ni), 4)

# Frecuencias acumuladas
Ni_asc <- cumsum(ni)
Fi_asc <- round(cumsum(hi), 4)
Ni_desc <- rev(cumsum(rev(ni)))
Fi_desc <- round(rev(cumsum(rev(hi))), 4)

# Crear tabla de frecuencia
tabla_frecuencia <- data.frame(
  Intervalo = paste0(round(lim_inf, 2), " - ", round(lim_sup, 2)),
  MC = round(MC, 2),
  ni = ni,
  hi = hi,
  Ni_desc = Ni_desc,
  Fi_desc = Fi_desc,
  Ni_asc = Ni_asc,
  Fi_asc = Fi_asc
)

# Mostrar tabla
print(tabla_frecuencia, row.names = FALSE)
##    Intervalo    MC    ni     hi Ni_desc Fi_desc Ni_asc Fi_asc
##        0 - 8   4.0 37225 0.9767   38113  0.9999  37225 0.9767
##       8 - 16  12.0   393 0.0103     888  0.0232  37618 0.9870
##      16 - 24  20.0   407 0.0107     495  0.0129  38025 0.9977
##      24 - 32  28.0    26 0.0007      88  0.0022  38051 0.9984
##      32 - 40  36.0     0 0.0000      62  0.0015  38051 0.9984
##      40 - 48  44.0     4 0.0001      62  0.0015  38055 0.9985
##      48 - 56  52.0     4 0.0001      58  0.0014  38059 0.9986
##      56 - 64  60.0     7 0.0002      54  0.0013  38066 0.9988
##      64 - 72  68.0     5 0.0001      47  0.0011  38071 0.9989
##      72 - 80  76.0     6 0.0002      42  0.0010  38077 0.9991
##      80 - 88  84.0    16 0.0004      36  0.0008  38093 0.9995
##      88 - 96  92.0     5 0.0001      20  0.0004  38098 0.9996
##     96 - 104 100.0     9 0.0002      15  0.0003  38107 0.9998
##    104 - 112 108.0     5 0.0001       6  0.0001  38112 0.9999
##    112 - 120 116.0     0 0.0000       1  0.0000  38112 0.9999
##    120 - 128 124.0     1 0.0000       1  0.0000  38113 0.9999
##  128 - 121.2 124.6     0 0.0000       0  0.0000  38113 0.9999
# Histograma ajustado a los datos (manual)
barplot(height = ni,
        names.arg = paste0(round(lim_inf, 2), "-", round(lim_sup, 2)),
        main = "Histograma: Unrounded Highway MPG FT2",
        xlab = "MPG en Carretera FT2",
        ylab = "Frecuencia absoluta",
        col = "skyblue",
        las = 2,
        cex.names = 0.7,
        ylim = c(0, max(ni) + 5))

# Ojivas (ascendente y descendente)
plot(tabla_frecuencia$MC, tabla_frecuencia$Ni_asc,
     type = "o", col = "green",
     main = "Ojivas: Frecuencias acumuladas de Unrounded Highway MPG FT2",
     xlab = "Marca de clase (MPG)",
     ylab = "Frecuencia acumulada",
     ylim = c(0, max(tabla_frecuencia$Ni_asc) + 5),
     pch = 16)

lines(tabla_frecuencia$MC, tabla_frecuencia$Ni_desc,
      type = "o", col = "red", pch = 17)

legend("bottomright",
       legend = c("Ojiva Ascendente", "Ojiva Descendente"),
       col = c("green", "red"),
       pch = c(16, 17),
       lty = 1)

# Diagrama de caja
boxplot(variable,
        horizontal = TRUE,
        col = "orange",
        main = "Diagrama de Caja: Unrounded Highway MPG FT2",
        xlab = "MPG en Carretera FT2")

14 Highway Gasoline Consumption

# Seleccionar la variable continua y eliminar NAs
variable <- na.omit(datos$Highway.Gasoline.Consumption..CD.)

# Número de datos y número de intervalos (Regla de Sturges)
n <- length(variable)
k <- ceiling(1 + 3.322 * log10(n))

# Calcular rango y amplitud del intervalo
R <- max(variable) - min(variable)
A <- ceiling(R / k)

# Límites inferiores
lim_inf <- seq(from = min(variable), by = A, length.out = k)

# Límites superiores (el último incluye el máximo real)
lim_sup <- c(lim_inf[-1] - 0.0001, max(variable))

# Marcas de clase
MC <- (lim_inf + lim_sup) / 2

# Frecuencias absolutas
ni <- numeric(k)
for (i in 1:k) {
  if (i == k) {
    ni[i] <- sum(variable >= lim_inf[i] & variable <= lim_sup[i])  # incluye el último límite
  } else {
    ni[i] <- sum(variable >= lim_inf[i] & variable < lim_sup[i])
  }
}

# Frecuencia relativa
hi <- round(ni / sum(ni), 4)

# Frecuencias acumuladas
Ni_asc <- cumsum(ni)
Fi_asc <- round(cumsum(hi), 4)
Ni_desc <- rev(cumsum(rev(ni)))
Fi_desc <- round(rev(cumsum(rev(hi))), 4)

# Crear tabla de frecuencias
tabla_frecuencia <- data.frame(
  Intervalo = paste0(round(lim_inf, 2), " - ", round(lim_sup, 2)),
  MC = round(MC, 2),
  ni = ni,
  hi = hi,
  Ni_desc = Ni_desc,
  Fi_desc = Fi_desc,
  Ni_asc = Ni_asc,
  Fi_asc = Fi_asc
)

# Mostrar tabla
print(tabla_frecuencia, row.names = FALSE)
##  Intervalo    MC    ni     hi Ni_desc Fi_desc Ni_asc Fi_asc
##      0 - 1  0.50 38111 0.9999   38113   1e+00  38111 0.9999
##      1 - 2  1.50     0 0.0000       2   1e-04  38111 0.9999
##      2 - 3  2.50     0 0.0000       2   1e-04  38111 0.9999
##      3 - 4  3.50     0 0.0000       2   1e-04  38111 0.9999
##      4 - 5  4.50     2 0.0001       2   1e-04  38113 1.0000
##      5 - 6  5.50     0 0.0000       0   0e+00  38113 1.0000
##      6 - 7  6.50     0 0.0000       0   0e+00  38113 1.0000
##      7 - 8  7.50     0 0.0000       0   0e+00  38113 1.0000
##      8 - 9  8.50     0 0.0000       0   0e+00  38113 1.0000
##     9 - 10  9.50     0 0.0000       0   0e+00  38113 1.0000
##    10 - 11 10.50     0 0.0000       0   0e+00  38113 1.0000
##    11 - 12 11.50     0 0.0000       0   0e+00  38113 1.0000
##    12 - 13 12.50     0 0.0000       0   0e+00  38113 1.0000
##    13 - 14 13.50     0 0.0000       0   0e+00  38113 1.0000
##    14 - 15 14.50     0 0.0000       0   0e+00  38113 1.0000
##    15 - 16 15.50     0 0.0000       0   0e+00  38113 1.0000
##  16 - 4.06 10.03     0 0.0000       0   0e+00  38113 1.0000
# Histograma manual
barplot(tabla_frecuencia$ni,
        main = "Histograma: Highway Gasoline Consumption CD",
        xlab = "Intervalos de Combustion CD",
        ylab = "Frecuencia absoluta",
        col = "skyblue",
        names.arg = tabla_frecuencia$Intervalo,
        las = 2,
        ylim = c(0, max(tabla_frecuencia$ni) + 5),
        cex.names = 0.7)

# Ojivas ascendente y descendente
plot(tabla_frecuencia$MC, tabla_frecuencia$Ni_asc,
     type = "o", col = "green",
     main = "Ojivas: Frecuencias acumuladas de Highway Gasoline Consumption CD",
     xlab = "Consumo de Gasolina (gal)",
     ylab = "Frecuencia acumulada",
     ylim = c(0, max(tabla_frecuencia$Ni_asc) + 5),
     pch = 16)

lines(tabla_frecuencia$MC, tabla_frecuencia$Ni_desc,
      type = "o", col = "red", pch = 17)

legend("bottomright",
       legend = c("Ojiva Ascendente", "Ojiva Descendente"),
       col = c("green", "red"),
       pch = c(16, 17),
       lty = 1)

# Diagrama de caja
boxplot(variable,
        horizontal = TRUE,
        col = "orange",
        main = "Diagrama de Caja: Highway Gasoline Consumption CD",
        xlab = "Consumo de Combustible (gal)")

15 Highway Electricity Consumption

# Seleccionar la variable continua y eliminar NAs
variable <- na.omit(datos$Highway.Electricity.Consumption)

# Número de datos y número de intervalos (Regla de Sturges)
n <- length(variable)
k <- ceiling(1 + 3.322 * log10(n))

# Calcular rango y amplitud del intervalo
R <- max(variable) - min(variable)
A <- ceiling(R / k)

# Límites inferiores
lim_inf <- seq(from = min(variable), by = A, length.out = k)

# Límites superiores (el último incluye el máximo real)
lim_sup <- c(lim_inf[-1] - 0.0001, max(variable))

# Marcas de clase
MC <- (lim_inf + lim_sup) / 2

# Frecuencias absolutas
ni <- numeric(k)
for (i in 1:k) {
  if (i == k) {
    ni[i] <- sum(variable >= lim_inf[i] & variable <= lim_sup[i])  # incluye el último límite
  } else {
    ni[i] <- sum(variable >= lim_inf[i] & variable < lim_sup[i])
  }
}

# Frecuencia relativa
hi <- round(ni / sum(ni), 4)

# Frecuencias acumuladas
Ni_asc <- cumsum(ni)
Fi_asc <- round(cumsum(hi), 4)
Ni_desc <- rev(cumsum(rev(ni)))
Fi_desc <- round(rev(cumsum(rev(hi))), 4)

# Crear tabla de frecuencias
tabla_frecuencia <- data.frame(
  Intervalo = paste0(round(lim_inf, 2), " - ", round(lim_sup, 2)),
  MC = round(MC, 2),
  ni = ni,
  hi = hi,
  Ni_desc = Ni_desc,
  Fi_desc = Fi_desc,
  Ni_asc = Ni_asc,
  Fi_asc = Fi_asc
)

# Mostrar tabla
print(tabla_frecuencia, row.names = FALSE)
##  Intervalo  MC    ni     hi Ni_desc Fi_desc Ni_asc Fi_asc
##      0 - 8   4 37915 0.9948   38113  1.0001  37915 0.9948
##     8 - 16  12     0 0.0000     198  0.0053  37915 0.9948
##    16 - 24  20     0 0.0000     198  0.0053  37915 0.9948
##    24 - 32  28    15 0.0004     198  0.0053  37930 0.9952
##    32 - 40  36   108 0.0028     183  0.0049  38038 0.9980
##    40 - 48  44    29 0.0008      75  0.0021  38067 0.9988
##    48 - 56  52    21 0.0006      46  0.0013  38088 0.9994
##    56 - 64  60    10 0.0003      25  0.0007  38098 0.9997
##    64 - 72  68     6 0.0002      15  0.0004  38104 0.9999
##    72 - 80  76     3 0.0001       9  0.0002  38107 1.0000
##    80 - 88  84     1 0.0000       6  0.0001  38108 1.0000
##    88 - 96  92     0 0.0000       5  0.0001  38108 1.0000
##   96 - 104 100     4 0.0001       5  0.0001  38112 1.0001
##  104 - 112 108     0 0.0000       1  0.0000  38112 1.0001
##  112 - 120 116     0 0.0000       1  0.0000  38112 1.0001
##  120 - 128 124     1 0.0000       1  0.0000  38113 1.0001
##  128 - 120 124     0 0.0000       0  0.0000  38113 1.0001
# Histograma manual
barplot(tabla_frecuencia$ni,
        main = "Histograma: Highway Electricity Consumption CD",
        xlab = "Consumo Eléctrico (kWh)",
        ylab = "Frecuencia absoluta",
        col = "skyblue",
        names.arg = tabla_frecuencia$Intervalo,
        las = 2,
        ylim = c(0, max(tabla_frecuencia$ni) + 5),
        cex.names = 0.7)

# Ojivas ascendente y descendente
plot(tabla_frecuencia$MC, tabla_frecuencia$Ni_asc,
     type = "o", col = "green",
     main = "Ojivas: Frecuencias acumuladas de Highway Electricity Consumption CD",
     xlab = "Consumo Eléctrico (kWh)",
     ylab = "Frecuencia acumulada",
     ylim = c(0, max(tabla_frecuencia$Ni_asc) + 5),
     pch = 16)

lines(tabla_frecuencia$MC, tabla_frecuencia$Ni_desc,
      type = "o", col = "red", pch = 17)

legend("bottomright",
       legend = c("Ojiva Ascendente", "Ojiva Descendente"),
       col = c("green", "red"),
       pch = c(16, 17),
       lty = 1)

# Diagrama de caja
boxplot(variable,
        horizontal = TRUE,
        col = "orange",
        main = "Diagrama de Caja: Highway Electricity Consumption CD",
        xlab = "Consumo Eléctrico (kWh)")

16 Highway Utility Factor

# Seleccionar la variable continua
variable <- na.omit(datos$Highway.Utility.Factor)

# Número de intervalos fijo
n <- length(variable)
k <- ceiling(1 + 3.322 * log10(n))

# Calcular rango y amplitud
R <- max(variable) - min(variable)
A <- ceiling(R / k)

# Límites inferiores y superiores
lim_inf <- seq(from = min(variable), by = A, length.out = k)
lim_sup <- lim_inf + A - 1 

# Marcas de clase
MC <- (lim_inf + lim_sup) / 2

# Frecuencias absolutas
ni <- numeric(k)
for (i in 1:k) {
  if (i == k) {
    ni[i] <- sum(variable >= lim_inf[i] & variable <= lim_sup[i])
  } else {
    ni[i] <- sum(variable >= lim_inf[i] & variable < lim_sup[i])
  }
}

# Frecuencia relativa
hi <- round(ni / sum(ni), 4)

# Frecuencias acumuladas
Ni_asc <- cumsum(ni)
Fi_asc <- round(cumsum(hi), 4)
Ni_desc <- rev(cumsum(rev(ni)))
Fi_desc <- round(rev(cumsum(rev(hi))), 4)

# Crear tabla
tabla_frecuencia <- data.frame(
  Intervalo = paste0(round(lim_inf, 2), " - ", round(lim_sup, 2)),
  MC = round(MC, 2),
  ni = ni,
  hi = hi,
  Ni_desc = Ni_desc,
  Fi_desc = Fi_desc,
  Ni_asc = Ni_asc,
  Fi_asc = Fi_asc
)

# Mostrar tabla
print(tabla_frecuencia, row.names = FALSE)
##  Intervalo MC ni  hi Ni_desc Fi_desc Ni_asc Fi_asc
##      0 - 0  0  0 NaN       0     NaN      0    NaN
##      1 - 1  1  0 NaN       0     NaN      0    NaN
##      2 - 2  2  0 NaN       0     NaN      0    NaN
##      3 - 3  3  0 NaN       0     NaN      0    NaN
##      4 - 4  4  0 NaN       0     NaN      0    NaN
##      5 - 5  5  0 NaN       0     NaN      0    NaN
##      6 - 6  6  0 NaN       0     NaN      0    NaN
##      7 - 7  7  0 NaN       0     NaN      0    NaN
##      8 - 8  8  0 NaN       0     NaN      0    NaN
##      9 - 9  9  0 NaN       0     NaN      0    NaN
##    10 - 10 10  0 NaN       0     NaN      0    NaN
##    11 - 11 11  0 NaN       0     NaN      0    NaN
##    12 - 12 12  0 NaN       0     NaN      0    NaN
##    13 - 13 13  0 NaN       0     NaN      0    NaN
##    14 - 14 14  0 NaN       0     NaN      0    NaN
##    15 - 15 15  0 NaN       0     NaN      0    NaN
##    16 - 16 16  0 NaN       0     NaN      0    NaN
# Histograma manual con las frecuencias absolutas
barplot(tabla_frecuencia$ni,
        main = "Histograma: Highway Utility Factor",
        xlab = "Factor Utilidad en Carretera",
        ylab = "Frecuencia absoluta",
        col = "skyblue",
        names.arg = tabla_frecuencia$Intervalo,
        las = 2,
        cex.names = 0.7,
        ylim = c(0, max(tabla_frecuencia$ni) + 5))

# Ojivas (ascendente y descendente) con líneas conectadas
plot(tabla_frecuencia$MC, tabla_frecuencia$Ni_asc,
     type = "o", col = "green",
     main = "Ojivas Frecuencias acumuladas de Highway Utility Factor",
     xlab = "Factor Utilidad en Carretera",
     ylab = "Frecuencia acumulada",
     ylim = c(0, max(tabla_frecuencia$Ni_asc) + 5),
     pch = 16)

lines(tabla_frecuencia$MC, tabla_frecuencia$Ni_desc,
      type = "o", col = "red", pch = 17)

legend("bottomright",
       legend = c("Ojiva Ascendente", "Ojiva Descendente"),
       col = c("green", "red"),
       pch = c(16, 17),
       lty = 1)

# Diagrama de caja (boxplot)
boxplot(variable,
        horizontal = TRUE,
        col = "orange",
        main = "Diagrama de Caja: Highway Utility Factor",
        xlab = "Factor Utilidad en Carretera")

17 Unadjusted Highway MPG FT1

# Seleccionar la variable continua
variable <- na.omit(datos$Unadjusted.Highway.MPG..FT1.)

# Número de intervalos fijo
n <- length(variable)
k <- ceiling(1 + 3.322 * log10(n))

# Calcular rango y amplitud
R <- max(variable) - min(variable)
A <- ceiling(R / k)

# Límites inferiores y superiores
lim_inf <- seq(from = min(variable), by = A, length.out = k)
lim_sup <- lim_inf + A - 1  # corregido para evitar superposición

# Marcas de clase
MC <- (lim_inf + lim_sup) / 2

# Frecuencias absolutas
ni <- numeric(k)
for (i in 1:k) {
  if (i == k) {
    ni[i] <- sum(variable >= lim_inf[i] & variable <= lim_sup[i])
  } else {
    ni[i] <- sum(variable >= lim_inf[i] & variable < lim_sup[i])
  }
}

# Frecuencia relativa
hi <- round(ni / sum(ni), 4)

# Frecuencias acumuladas
Ni_asc <- cumsum(ni)
Fi_asc <- round(cumsum(hi), 4)
Ni_desc <- rev(cumsum(rev(ni)))
Fi_desc <- round(rev(cumsum(rev(hi))), 4)

# Crear tabla
tabla_frecuencia <- data.frame(
  Intervalo = paste0(round(lim_inf, 2), " - ", round(lim_sup, 2)),
  MC = round(MC, 2),
  ni = ni,
  hi = hi,
  Ni_desc = Ni_desc,
  Fi_desc = Fi_desc,
  Ni_asc = Ni_asc,
  Fi_asc = Fi_asc
)

# Mostrar tabla
print(tabla_frecuencia, row.names = FALSE)
##  Intervalo  MC    ni     hi Ni_desc Fi_desc Ni_asc Fi_asc
##     0 - 10   5    25 0.0007   34332  0.9999     25 0.0007
##    11 - 21  16  1658 0.0483   34307  0.9992   1683 0.0490
##    22 - 32  27 14262 0.4154   32649  0.9509  15945 0.4644
##    33 - 43  38 14430 0.4203   18387  0.5355  30375 0.8847
##    44 - 54  49  3148 0.0917    3957  0.1152  33523 0.9764
##    55 - 65  60   616 0.0179     809  0.0235  34139 0.9943
##    66 - 76  71    74 0.0022     193  0.0056  34213 0.9965
##    77 - 87  82     8 0.0002     119  0.0034  34221 0.9967
##    88 - 98  93    11 0.0003     111  0.0032  34232 0.9970
##   99 - 109 104     6 0.0002     100  0.0029  34238 0.9972
##  110 - 120 115    14 0.0004      94  0.0027  34252 0.9976
##  121 - 131 126    14 0.0004      80  0.0023  34266 0.9980
##  132 - 142 137    37 0.0011      66  0.0019  34303 0.9991
##  143 - 153 148    17 0.0005      29  0.0008  34320 0.9996
##  154 - 164 159    11 0.0003      12  0.0003  34331 0.9999
##  165 - 175 170     0 0.0000       1  0.0000  34331 0.9999
##  176 - 186 181     1 0.0000       1  0.0000  34332 0.9999
# Histograma manual con las frecuencias absolutas
barplot(tabla_frecuencia$ni,
        main = "Histograma: Unadjusted Highway MPG (FT1)",
        xlab = "MPG sin ajustar FT1",
        ylab = "Frecuencia absoluta",
        col = "skyblue",
        names.arg = tabla_frecuencia$Intervalo,
        las = 2,
        cex.names = 0.7,
        ylim = c(0, max(tabla_frecuencia$ni) + 5))

# Ojivas (ascendente y descendente) con líneas conectadas
plot(tabla_frecuencia$MC, tabla_frecuencia$Ni_asc,
     type = "o", col = "green",
     main = "OjivasFrecuencias acumuladas de Unadajusted Highway MPG FT1",
     xlab = "MPG sin ajustar en Carretera FT1 ",
     ylab = "Frecuencia acumulada",
     ylim = c(0, max(tabla_frecuencia$Ni_asc) + 5),
     pch = 16)

lines(tabla_frecuencia$MC, tabla_frecuencia$Ni_desc,
      type = "o", col = "red", pch = 17)

legend("bottomright",
       legend = c("Ojiva Ascendente", "Ojiva Descendente"),
       col = c("green", "red"),
       pch = c(16, 17),
       lty = 1)

# Diagrama de caja (boxplot)
boxplot(variable,
        horizontal = TRUE,
        col = "orange",
        main = "Diagrama de Caja:Unadjusted Highway MPG FT1",
        xlab = "MPG sin ajustar en Carretera FT1")

18 Unadjusted City MPG FT2

# Seleccionar la variable continua
variable <- na.omit(datos$Unadjusted.City.MPG..FT2.)

# Número de intervalos fijo
n <- length(variable)
k <- ceiling(1 + 3.322 * log10(n))

# Calcular rango y amplitud
R <- max(variable) - min(variable)
A <- ceiling(R / k)

# Límites inferiores y superiores
lim_inf <- seq(from = min(variable), by = A, length.out = k)
lim_sup <- lim_inf + A - 1  # corregido para evitar superposición

# Marcas de clase
MC <- (lim_inf + lim_sup) / 2

# Frecuencias absolutas
ni <- numeric(k)
for (i in 1:k) {
  if (i == k) {
    ni[i] <- sum(variable >= lim_inf[i] & variable <= lim_sup[i])
  } else {
    ni[i] <- sum(variable >= lim_inf[i] & variable < lim_sup[i])
  }
}

# Frecuencia relativa
hi <- round(ni / sum(ni), 4)

# Frecuencias acumuladas
Ni_asc <- cumsum(ni)
Fi_asc <- round(cumsum(hi), 4)
Ni_desc <- rev(cumsum(rev(ni)))
Fi_desc <- round(rev(cumsum(rev(hi))), 4)

# Crear tabla
tabla_frecuencia <- data.frame(
  Intervalo = paste0(round(lim_inf, 2), " - ", round(lim_sup, 2)),
  MC = round(MC, 2),
  ni = ni,
  hi = hi,
  Ni_desc = Ni_desc,
  Fi_desc = Fi_desc,
  Ni_asc = Ni_asc,
  Fi_asc = Fi_asc
)

# Mostrar tabla
print(tabla_frecuencia, row.names = FALSE)
##  Intervalo  MC    ni     hi Ni_desc Fi_desc Ni_asc Fi_asc
##     0 - 12   6 37121 0.9793   37906  1.0001  37121 0.9793
##    13 - 25  19   727 0.0192     785  0.0208  37848 0.9985
##    26 - 38  32     0 0.0000      58  0.0016  37848 0.9985
##    39 - 51  45     1 0.0000      58  0.0016  37849 0.9985
##    52 - 64  58     6 0.0002      57  0.0016  37855 0.9987
##    65 - 77  71     5 0.0001      51  0.0014  37860 0.9988
##    78 - 90  84     6 0.0002      46  0.0013  37866 0.9990
##   91 - 103  97     3 0.0001      40  0.0011  37869 0.9991
##  104 - 116 110     6 0.0002      37  0.0010  37875 0.9993
##  117 - 129 123     8 0.0002      31  0.0008  37883 0.9995
##  130 - 142 136    12 0.0003      23  0.0006  37895 0.9998
##  143 - 155 149     8 0.0002      11  0.0003  37903 1.0000
##  156 - 168 162     2 0.0001       3  0.0001  37905 1.0001
##  169 - 181 175     1 0.0000       1  0.0000  37906 1.0001
##  182 - 194 188     0 0.0000       0  0.0000  37906 1.0001
##  195 - 207 201     0 0.0000       0  0.0000  37906 1.0001
##  208 - 220 214     0 0.0000       0  0.0000  37906 1.0001
# Histograma manual con las frecuencias absolutas
barplot(tabla_frecuencia$ni,
        main = "Histograma: Unadjusted City MPG (FT2)",
        xlab = "MPG sin ajustar FT2",
        ylab = "Frecuencia absoluta",
        col = "skyblue",
        names.arg = tabla_frecuencia$Intervalo,
        las = 2,
        cex.names = 0.7,
        ylim = c(0, max(tabla_frecuencia$ni) + 5))

# Ojivas (ascendente y descendente) con líneas conectadas
plot(tabla_frecuencia$MC, tabla_frecuencia$Ni_asc,
     type = "o", col = "green",
     main = "OjivasFrecuencias acumuladas de Unadjusted City MPG FT2",
     xlab = "MPG sin ajustar en Ciudad FT2 ",
     ylab = "Frecuencia acumulada",
     ylim = c(0, max(tabla_frecuencia$Ni_asc) + 5),
     pch = 16)

lines(tabla_frecuencia$MC, tabla_frecuencia$Ni_desc,
      type = "o", col = "red", pch = 17)

legend("bottomright",
       legend = c("Ojiva Ascendente", "Ojiva Descendente"),
       col = c("green", "red"),
       pch = c(16, 17),
       lty = 1)

# Diagrama de caja (boxplot)
boxplot(variable,
        horizontal = TRUE,
        col = "orange",
        main = "Diagrama de Caja:Unadjusted City MPG FT2",
        xlab = "MPG sin ajustar en Ciudad FT2")

19 Unadjusted Highway MPG FT2

# Seleccionar la variable continua
variable <- na.omit(datos$Unadjusted.Highway.MPG..FT2.)

# Número de intervalos fijo
n <- length(variable)
k <- ceiling(1 + 3.322 * log10(n))

# Calcular rango y amplitud
R <- max(variable) - min(variable)
A <- ceiling(R / k)

# Límites inferiores y superiores
lim_inf <- seq(from = min(variable), by = A, length.out = k)
lim_sup <- lim_inf + A - 1  # corregido para evitar superposición

# Marcas de clase
MC <- (lim_inf + lim_sup) / 2

# Frecuencias absolutas
ni <- numeric(k)
for (i in 1:k) {
  if (i == k) {
    ni[i] <- sum(variable >= lim_inf[i] & variable <= lim_sup[i])
  } else {
    ni[i] <- sum(variable >= lim_inf[i] & variable < lim_sup[i])
  }
}

# Frecuencia relativa
hi <- round(ni / sum(ni), 4)

# Frecuencias acumuladas
Ni_asc <- cumsum(ni)
Fi_asc <- round(cumsum(hi), 4)
Ni_desc <- rev(cumsum(rev(ni)))
Fi_desc <- round(rev(cumsum(rev(hi))), 4)

# Crear tabla
tabla_frecuencia <- data.frame(
  Intervalo = paste0(round(lim_inf, 2), " - ", round(lim_sup, 2)),
  MC = round(MC, 2),
  ni = ni,
  hi = hi,
  Ni_desc = Ni_desc,
  Fi_desc = Fi_desc,
  Ni_asc = Ni_asc,
  Fi_asc = Fi_asc
)

# Mostrar tabla
print(tabla_frecuencia, row.names = FALSE)
##  Intervalo  MC    ni     hi Ni_desc Fi_desc Ni_asc Fi_asc
##     0 - 10   5 36721 0.9661   38008  0.9998  36721 0.9661
##    11 - 21  16   621 0.0163    1287  0.0337  37342 0.9824
##    22 - 32  27   561 0.0148     666  0.0174  37903 0.9972
##    33 - 43  38    43 0.0011     105  0.0026  37946 0.9983
##    44 - 54  49     1 0.0000      62  0.0015  37947 0.9983
##    55 - 65  60     0 0.0000      61  0.0015  37947 0.9983
##    66 - 76  71     4 0.0001      61  0.0015  37951 0.9984
##    77 - 87  82     5 0.0001      57  0.0014  37956 0.9985
##    88 - 98  93     8 0.0002      52  0.0013  37964 0.9987
##   99 - 109 104     4 0.0001      44  0.0011  37968 0.9988
##  110 - 120 115    13 0.0003      40  0.0010  37981 0.9991
##  121 - 131 126     5 0.0001      27  0.0007  37986 0.9992
##  132 - 142 137    11 0.0003      22  0.0006  37997 0.9995
##  143 - 153 148    10 0.0003      11  0.0003  38007 0.9998
##  154 - 164 159     0 0.0000       1  0.0000  38007 0.9998
##  165 - 175 170     1 0.0000       1  0.0000  38008 0.9998
##  176 - 186 181     0 0.0000       0  0.0000  38008 0.9998
# Histograma manual con las frecuencias absolutas
barplot(tabla_frecuencia$ni,
        main = "Histograma: Unadjusted Highway MPG (FT2)",
        xlab = "MPG sin ajustar FT2",
        ylab = "Frecuencia absoluta",
        col = "skyblue",
        names.arg = tabla_frecuencia$Intervalo,
        las = 2,
        cex.names = 0.7,
        ylim = c(0, max(tabla_frecuencia$ni) + 5))

# Ojivas (ascendente y descendente) con líneas conectadas
plot(tabla_frecuencia$MC, tabla_frecuencia$Ni_asc,
     type = "o", col = "green",
     main = "OjivasFrecuencias acumuladas de Unadajusted Highway MPG FT2",
     xlab = "MPG sin ajustar en Carretera FT2 ",
     ylab = "Frecuencia acumulada",
     ylim = c(0, max(tabla_frecuencia$Ni_asc) + 5),
     pch = 16)

lines(tabla_frecuencia$MC, tabla_frecuencia$Ni_desc,
      type = "o", col = "red", pch = 17)

legend("bottomright",
       legend = c("Ojiva Ascendente", "Ojiva Descendente"),
       col = c("green", "red"),
       pch = c(16, 17),
       lty = 1)

# Diagrama de caja (boxplot)
boxplot(variable,
        horizontal = TRUE,
        col = "orange",
        main = "Diagrama de Caja:Unadjusted Highway MPG FT2",
        xlab = "MPG sin ajustar en Carretera FT2")

20 Combined MPG FT1

# Seleccionar la variable continua
variable <- na.omit(datos$Combined.MPG..FT1.)

# Número de intervalos fijo
n <- length(variable)
k <- ceiling(1 + 3.322 * log10(n))

# Calcular rango y amplitud
R <- max(variable) - min(variable)
A <- ceiling(R / k)

# Límites inferiores y superiores
lim_inf <- seq(from = min(variable), by = A, length.out = k)
lim_sup <- lim_inf + A - 1  # corregido para evitar superposición

# Marcas de clase
MC <- (lim_inf + lim_sup) / 2

# Frecuencias absolutas
ni <- numeric(k)
for (i in 1:k) {
  if (i == k) {
    ni[i] <- sum(variable >= lim_inf[i] & variable <= lim_sup[i])
  } else {
    ni[i] <- sum(variable >= lim_inf[i] & variable < lim_sup[i])
  }
}

# Frecuencia relativa
hi <- round(ni / sum(ni), 4)

# Frecuencias acumuladas
Ni_asc <- cumsum(ni)
Fi_asc <- round(cumsum(hi), 4)
Ni_desc <- rev(cumsum(rev(ni)))
Fi_desc <- round(rev(cumsum(rev(hi))), 4)

# Crear tabla
tabla_frecuencia <- data.frame(
  Intervalo = paste0(round(lim_inf, 2), " - ", round(lim_sup, 2)),
  MC = round(MC, 2),
  ni = ni,
  hi = hi,
  Ni_desc = Ni_desc,
  Fi_desc = Fi_desc,
  Ni_asc = Ni_asc,
  Fi_asc = Fi_asc
)

# Mostrar tabla
print(tabla_frecuencia, row.names = FALSE)
##  Intervalo    MC    ni     hi Ni_desc Fi_desc Ni_asc Fi_asc
##     7 - 14  10.5  2742 0.0824   33291  1.0002   2742 0.0824
##    15 - 22  18.5 21203 0.6369   30549  0.9178  23945 0.7193
##    23 - 30  26.5  8079 0.2427    9346  0.2809  32024 0.9620
##    31 - 38  34.5   914 0.0275    1267  0.0382  32938 0.9895
##    39 - 46  42.5   189 0.0057     353  0.0107  33127 0.9952
##    47 - 54  50.5    48 0.0014     164  0.0050  33175 0.9966
##    55 - 62  58.5     9 0.0003     116  0.0036  33184 0.9969
##    63 - 70  66.5     3 0.0001     107  0.0033  33187 0.9970
##    71 - 78  74.5     9 0.0003     104  0.0032  33196 0.9973
##    79 - 86  82.5     6 0.0002      95  0.0029  33202 0.9975
##    87 - 94  90.5    22 0.0007      89  0.0027  33224 0.9982
##   95 - 102  98.5    17 0.0005      67  0.0020  33241 0.9987
##  103 - 110 106.5    22 0.0007      50  0.0015  33263 0.9994
##  111 - 118 114.5    18 0.0005      28  0.0008  33281 0.9999
##  119 - 126 122.5     9 0.0003      10  0.0003  33290 1.0002
##  127 - 134 130.5     0 0.0000       1  0.0000  33290 1.0002
##  135 - 142 138.5     1 0.0000       1  0.0000  33291 1.0002
# Histograma manual con las frecuencias absolutas
barplot(tabla_frecuencia$ni,
        main = "Histograma: Combined MPG (FT1)",
        xlab = "MPG Combinado FT1",
        ylab = "Frecuencia absoluta",
        col = "skyblue",
        names.arg = tabla_frecuencia$Intervalo,
        las = 2,
        cex.names = 0.7,
        ylim = c(0, max(tabla_frecuencia$ni) + 5))

# Ojivas (ascendente y descendente) con líneas conectadas
plot(tabla_frecuencia$MC, tabla_frecuencia$Ni_asc,
     type = "o", col = "green",
     main = "OjivasFrecuencias acumuladas de Combined MPG FT1",
     xlab = "MPG Combinado FT1 ",
     ylab = "Frecuencia acumulada",
     ylim = c(0, max(tabla_frecuencia$Ni_asc) + 5),
     pch = 16)

lines(tabla_frecuencia$MC, tabla_frecuencia$Ni_desc,
      type = "o", col = "red", pch = 17)

legend("bottomright",
       legend = c("Ojiva Ascendente", "Ojiva Descendente"),
       col = c("green", "red"),
       pch = c(16, 17),
       lty = 1)

# Diagrama de caja (boxplot)
boxplot(variable,
        horizontal = TRUE,
        col = "orange",
        main = "Diagrama de Caja: Combined MPG FT1",
        xlab = "MPG Combinado FT1")

21 Unrounded Combined MPG FT1

# Seleccionar la variable continua
variable <- na.omit(datos$Unrounded.Combined.MPG..FT1.)

# Número de intervalos fijo
n <- length(variable)
k <- ceiling(1 + 3.322 * log10(n))

# Calcular rango y amplitud
R <- max(variable) - min(variable)
A <- ceiling(R / k)

# Límites inferiores y superiores
lim_inf <- seq(from = min(variable), by = A, length.out = k)
lim_sup <- lim_inf + A - 1  # corregido para evitar superposición

# Marcas de clase
MC <- (lim_inf + lim_sup) / 2

# Frecuencias absolutas
ni <- numeric(k)
for (i in 1:k) {
  if (i == k) {
    ni[i] <- sum(variable >= lim_inf[i] & variable <= lim_sup[i])
  } else {
    ni[i] <- sum(variable >= lim_inf[i] & variable < lim_sup[i])
  }
}

# Frecuencia relativa
hi <- round(ni / sum(ni), 4)

# Frecuencias acumuladas
Ni_asc <- cumsum(ni)
Fi_asc <- round(cumsum(hi), 4)
Ni_desc <- rev(cumsum(rev(ni)))
Fi_desc <- round(rev(cumsum(rev(hi))), 4)

# Crear tabla
tabla_frecuencia <- data.frame(
  Intervalo = paste0(round(lim_inf, 2), " - ", round(lim_sup, 2)),
  MC = round(MC, 2),
  ni = ni,
  hi = hi,
  Ni_desc = Ni_desc,
  Fi_desc = Fi_desc,
  Ni_asc = Ni_asc,
  Fi_asc = Fi_asc
)

# Mostrar tabla
print(tabla_frecuencia, row.names = FALSE)
##  Intervalo    MC    ni     hi Ni_desc Fi_desc Ni_asc Fi_asc
##      0 - 7   3.5 29662 0.7998   37085  1.0001  29662 0.7998
##     8 - 15  11.5   628 0.0169    7423  0.2003  30290 0.8167
##    16 - 23  19.5  4089 0.1103    6795  0.1834  34379 0.9270
##    24 - 31  27.5  2235 0.0603    2706  0.0731  36614 0.9873
##    32 - 39  35.5   302 0.0081     471  0.0128  36916 0.9954
##    40 - 47  43.5    59 0.0016     169  0.0047  36975 0.9970
##    48 - 55  51.5    15 0.0004     110  0.0031  36990 0.9974
##    56 - 63  59.5     6 0.0002      95  0.0027  36996 0.9976
##    64 - 71  67.5     0 0.0000      89  0.0025  36996 0.9976
##    72 - 79  75.5     6 0.0002      89  0.0025  37002 0.9978
##    80 - 87  83.5     6 0.0002      83  0.0023  37008 0.9980
##    88 - 95  91.5    22 0.0006      77  0.0021  37030 0.9986
##   96 - 103  99.5    10 0.0003      55  0.0015  37040 0.9989
##  104 - 111 107.5    17 0.0005      45  0.0012  37057 0.9994
##  112 - 119 115.5    23 0.0006      28  0.0007  37080 1.0000
##  120 - 127 123.5     5 0.0001       5  0.0001  37085 1.0001
##  128 - 135 131.5     0 0.0000       0  0.0000  37085 1.0001
# Histograma manual con las frecuencias absolutas
barplot(tabla_frecuencia$ni,
        main = "Histograma: Unrounded Combined MPG FT1",
        xlab = "MPG Combinado sin ajustar FT1",
        ylab = "Frecuencia absoluta",
        col = "skyblue",
        names.arg = tabla_frecuencia$Intervalo,
        las = 2,
        cex.names = 0.7,
        ylim = c(0, max(tabla_frecuencia$ni) + 5))

# Ojivas (ascendente y descendente) con líneas conectadas
plot(tabla_frecuencia$MC, tabla_frecuencia$Ni_asc,
     type = "o", col = "green",
     main = "OjivasFrecuencias acumuladas de Unrounded Combined MPG FT1",
     xlab = "MPG Combinado sin ajustar FT1",
     ylab = "Frecuencia acumulada",
     ylim = c(0, max(tabla_frecuencia$Ni_asc) + 5),
     pch = 16)

lines(tabla_frecuencia$MC, tabla_frecuencia$Ni_desc,
      type = "o", col = "red", pch = 17)

legend("bottomright",
       legend = c("Ojiva Ascendente", "Ojiva Descendente"),
       col = c("green", "red"),
       pch = c(16, 17),
       lty = 1)

# Diagrama de caja (boxplot)
boxplot(variable,
        horizontal = TRUE,
        col = "orange",
        main = "Diagrama de Caja: Unrounded Combined MPG FT1",
        xlab = "MPG Combinado sin ajustar FT1")

22 Combined MPG FT2

# Seleccionar la variable continua
variable <- na.omit(datos$Combined.MPG..FT2.)

# Número de intervalos fijo
n <- length(variable)
k <- ceiling(1 + 3.322 * log10(n))

# Calcular rango y amplitud
R <- max(variable) - min(variable)
A <- ceiling(R / k)

# Límites inferiores y superiores
lim_inf <- seq(from = min(variable), by = A, length.out = k)
lim_sup <- lim_inf + A - 1  # corregido para evitar superposición

# Marcas de clase
MC <- (lim_inf + lim_sup) / 2

# Frecuencias absolutas
ni <- numeric(k)
for (i in 1:k) {
  if (i == k) {
    ni[i] <- sum(variable >= lim_inf[i] & variable <= lim_sup[i])
  } else {
    ni[i] <- sum(variable >= lim_inf[i] & variable < lim_sup[i])
  }
}

# Frecuencia relativa
hi <- round(ni / sum(ni), 4)

# Frecuencias acumuladas
Ni_asc <- cumsum(ni)
Fi_asc <- round(cumsum(hi), 4)
Ni_desc <- rev(cumsum(rev(ni)))
Fi_desc <- round(rev(cumsum(rev(hi))), 4)

# Crear tabla
tabla_frecuencia <- data.frame(
  Intervalo = paste0(round(lim_inf, 2), " - ", round(lim_sup, 2)),
  MC = round(MC, 2),
  ni = ni,
  hi = hi,
  Ni_desc = Ni_desc,
  Fi_desc = Fi_desc,
  Ni_asc = Ni_asc,
  Fi_asc = Fi_asc
)

# Mostrar tabla
print(tabla_frecuencia, row.names = FALSE)
##  Intervalo    MC    ni     hi Ni_desc Fi_desc Ni_asc Fi_asc
##      0 - 7   3.5 36675 0.9648   38015  1.0001  36675 0.9648
##     8 - 15  11.5  1001 0.0263    1340  0.0353  37676 0.9911
##    16 - 23  19.5   286 0.0075     339  0.0090  37962 0.9986
##    24 - 31  27.5     0 0.0000      53  0.0015  37962 0.9986
##    32 - 39  35.5     0 0.0000      53  0.0015  37962 0.9986
##    40 - 47  43.5     3 0.0001      53  0.0015  37965 0.9987
##    48 - 55  51.5     7 0.0002      50  0.0014  37972 0.9989
##    56 - 63  59.5     5 0.0001      43  0.0012  37977 0.9990
##    64 - 71  67.5     2 0.0001      38  0.0011  37979 0.9991
##    72 - 79  75.5     5 0.0001      36  0.0010  37984 0.9992
##    80 - 87  83.5     8 0.0002      31  0.0009  37992 0.9994
##    88 - 95  91.5    10 0.0003      23  0.0007  38002 0.9997
##   96 - 103  99.5     6 0.0002      13  0.0004  38008 0.9999
##  104 - 111 107.5     2 0.0001       7  0.0002  38010 1.0000
##  112 - 119 115.5     4 0.0001       5  0.0001  38014 1.0001
##  120 - 127 123.5     0 0.0000       1  0.0000  38014 1.0001
##  128 - 135 131.5     1 0.0000       1  0.0000  38015 1.0001
# Histograma manual con las frecuencias absolutas
barplot(tabla_frecuencia$ni,
        main = "Histograma: Combined MPG (FT2)",
        xlab = "MPG Combinado FT2",
        ylab = "Frecuencia absoluta",
        col = "skyblue",
        names.arg = tabla_frecuencia$Intervalo,
        las = 2,
        cex.names = 0.7,
        ylim = c(0, max(tabla_frecuencia$ni) + 5))

# Ojivas (ascendente y descendente) con líneas conectadas
plot(tabla_frecuencia$MC, tabla_frecuencia$Ni_asc,
     type = "o", col = "green",
     main = "OjivasFrecuencias acumuladas de Combined MPG FT2",
     xlab = "MPG Combinado FT2",
     ylab = "Frecuencia acumulada",
     ylim = c(0, max(tabla_frecuencia$Ni_asc) + 5),
     pch = 16)

lines(tabla_frecuencia$MC, tabla_frecuencia$Ni_desc,
      type = "o", col = "red", pch = 17)

legend("bottomright",
       legend = c("Ojiva Ascendente", "Ojiva Descendente"),
       col = c("green", "red"),
       pch = c(16, 17),
       lty = 1)

# Diagrama de caja (boxplot)
boxplot(variable,
        horizontal = TRUE,
        col = "orange",
        main = "Diagrama de Caja: Combined MPG FT2",
        xlab = "MPG Combinado FT2")

23 Unrounded Combined MPG FT2

# Seleccionar la variable continua
variable <- na.omit(datos$Unrounded.Combined.MPG..FT2.)

# Número de intervalos fijo
n <- length(variable)
k <- ceiling(1 + 3.322 * log10(n))

# Calcular rango y amplitud
R <- max(variable) - min(variable)
A <- ceiling(R / k)

# Límites inferiores y superiores
lim_inf <- seq(from = min(variable), by = A, length.out = k)
lim_sup <- lim_inf + A - 1  # corregido para evitar superposición

# Marcas de clase
MC <- (lim_inf + lim_sup) / 2

# Frecuencias absolutas
ni <- numeric(k)
for (i in 1:k) {
  if (i == k) {
    ni[i] <- sum(variable >= lim_inf[i] & variable <= lim_sup[i])
  } else {
    ni[i] <- sum(variable >= lim_inf[i] & variable < lim_sup[i])
  }
}

# Frecuencia relativa
hi <- round(ni / sum(ni), 4)

# Frecuencias acumuladas
Ni_asc <- cumsum(ni)
Fi_asc <- round(cumsum(hi), 4)
Ni_desc <- rev(cumsum(rev(ni)))
Fi_desc <- round(rev(cumsum(rev(hi))), 4)

# Crear tabla
tabla_frecuencia <- data.frame(
  Intervalo = paste0(round(lim_inf, 2), " - ", round(lim_sup, 2)),
  MC = round(MC, 2),
  ni = ni,
  hi = hi,
  Ni_desc = Ni_desc,
  Fi_desc = Fi_desc,
  Ni_asc = Ni_asc,
  Fi_asc = Fi_asc
)

# Mostrar tabla
print(tabla_frecuencia, row.names = FALSE)
##  Intervalo    MC    ni     hi Ni_desc Fi_desc Ni_asc Fi_asc
##      0 - 7   3.5 37225 0.9783   38050  1.0001  37225 0.9783
##     8 - 15  11.5   595 0.0156     825  0.0218  37820 0.9939
##    16 - 23  19.5   185 0.0049     230  0.0062  38005 0.9988
##    24 - 31  27.5     0 0.0000      45  0.0013  38005 0.9988
##    32 - 39  35.5     0 0.0000      45  0.0013  38005 0.9988
##    40 - 47  43.5     4 0.0001      45  0.0013  38009 0.9989
##    48 - 55  51.5     6 0.0002      41  0.0012  38015 0.9991
##    56 - 63  59.5     6 0.0002      35  0.0010  38021 0.9993
##    64 - 71  67.5     3 0.0001      29  0.0008  38024 0.9994
##    72 - 79  75.5     4 0.0001      26  0.0007  38028 0.9995
##    80 - 87  83.5     7 0.0002      22  0.0006  38035 0.9997
##    88 - 95  91.5     1 0.0000      15  0.0004  38036 0.9997
##   96 - 103  99.5     6 0.0002      14  0.0004  38042 0.9999
##  104 - 111 107.5     3 0.0001       8  0.0002  38045 1.0000
##  112 - 119 115.5     4 0.0001       5  0.0001  38049 1.0001
##  120 - 127 123.5     0 0.0000       1  0.0000  38049 1.0001
##  128 - 135 131.5     1 0.0000       1  0.0000  38050 1.0001
# Histograma manual con las frecuencias absolutas
barplot(tabla_frecuencia$ni,
        main = "Histograma: Unrounded Combined MPG FT2",
        xlab = "MPG Combinado sin ajustar FT2",
        ylab = "Frecuencia absoluta",
        col = "skyblue",
        names.arg = tabla_frecuencia$Intervalo,
        las = 2,
        cex.names = 0.7,
        ylim = c(0, max(tabla_frecuencia$ni) + 5))

# Ojivas (ascendente y descendente) con líneas conectadas
plot(tabla_frecuencia$MC, tabla_frecuencia$Ni_asc,
     type = "o", col = "green",
     main = "OjivasFrecuencias acumuladas de Unrounded Combined MPG FT2",
     xlab = "MPG Combinado sin ajustar FT2",
     ylab = "Frecuencia acumulada",
     ylim = c(0, max(tabla_frecuencia$Ni_asc) + 5),
     pch = 16)

lines(tabla_frecuencia$MC, tabla_frecuencia$Ni_desc,
      type = "o", col = "red", pch = 17)

legend("bottomright",
       legend = c("Ojiva Ascendente", "Ojiva Descendente"),
       col = c("green", "red"),
       pch = c(16, 17),
       lty = 1)

# Diagrama de caja (boxplot)
boxplot(variable,
        horizontal = TRUE,
        col = "orange",
        main = "Diagrama de Caja: Unrounded Combined MPG FT2",
        xlab = "MPG Combinado sin ajustar FT2")

24 Combined Electricity Combustion

# Seleccionar la variable continua
variable <- na.omit(datos$Combined.Electricity.Consumption)

# Número de intervalos fijo
n <- length(variable)
k <- ceiling(1 + 3.322 * log10(n))

# Calcular rango y amplitud
R <- max(variable) - min(variable)
A <- ceiling(R / k)

# Límites inferiores y superiores
lim_inf <- seq(from = min(variable), by = A, length.out = k)
lim_sup <- lim_inf + A - 1  # corregido para evitar superposición

# Marcas de clase
MC <- (lim_inf + lim_sup) / 2

# Frecuencias absolutas
ni <- numeric(k)
for (i in 1:k) {
  if (i == k) {
    ni[i] <- sum(variable >= lim_inf[i] & variable <= lim_sup[i])
  } else {
    ni[i] <- sum(variable >= lim_inf[i] & variable < lim_sup[i])
  }
}

# Frecuencia relativa
hi <- round(ni / sum(ni), 4)

# Frecuencias acumuladas
Ni_asc <- cumsum(ni)
Fi_asc <- round(cumsum(hi), 4)
Ni_desc <- rev(cumsum(rev(ni)))
Fi_desc <- round(rev(cumsum(rev(hi))), 4)

# Crear tabla
tabla_frecuencia <- data.frame(
  Intervalo = paste0(round(lim_inf, 2), " - ", round(lim_sup, 2)),
  MC = round(MC, 2),
  ni = ni,
  hi = hi,
  Ni_desc = Ni_desc,
  Fi_desc = Fi_desc,
  Ni_asc = Ni_asc,
  Fi_asc = Fi_asc
)

# Mostrar tabla
print(tabla_frecuencia, row.names = FALSE)
##  Intervalo    MC    ni     hi Ni_desc Fi_desc Ni_asc Fi_asc
##      0 - 7   3.5 37915 0.9955   38088  1.0000  37915 0.9955
##     8 - 15  11.5     0 0.0000     173  0.0045  37915 0.9955
##    16 - 23  19.5     0 0.0000     173  0.0045  37915 0.9955
##    24 - 31  27.5    43 0.0011     173  0.0045  37958 0.9966
##    32 - 39  35.5    72 0.0019     130  0.0034  38030 0.9985
##    40 - 47  43.5    24 0.0006      58  0.0015  38054 0.9991
##    48 - 55  51.5    11 0.0003      34  0.0009  38065 0.9994
##    56 - 63  59.5    14 0.0004      23  0.0006  38079 0.9998
##    64 - 71  67.5     4 0.0001       9  0.0002  38083 0.9999
##    72 - 79  75.5     1 0.0000       5  0.0001  38084 0.9999
##    80 - 87  83.5     0 0.0000       4  0.0001  38084 0.9999
##    88 - 95  91.5     1 0.0000       4  0.0001  38085 0.9999
##   96 - 103  99.5     2 0.0001       3  0.0001  38087 1.0000
##  104 - 111 107.5     0 0.0000       1  0.0000  38087 1.0000
##  112 - 119 115.5     0 0.0000       1  0.0000  38087 1.0000
##  120 - 127 123.5     1 0.0000       1  0.0000  38088 1.0000
##  128 - 135 131.5     0 0.0000       0  0.0000  38088 1.0000
# Histograma manual con las frecuencias absolutas
barplot(tabla_frecuencia$ni,
        main = "Histograma: Combined Electricity Combustion",
        xlab = "Combustion Elecrica Combinada",
        ylab = "Frecuencia absoluta",
        col = "skyblue",
        names.arg = tabla_frecuencia$Intervalo,
        las = 2,
        cex.names = 0.7,
        ylim = c(0, max(tabla_frecuencia$ni) + 5))

# Ojivas (ascendente y descendente) con líneas conectadas
plot(tabla_frecuencia$MC, tabla_frecuencia$Ni_asc,
     type = "o", col = "green",
     main = "OjivasFrecuencias acumuladas de Combined Electricity Combustion",
     xlab = "Combustion Elecrica Combinada",
     ylab = "Frecuencia acumulada",
     ylim = c(0, max(tabla_frecuencia$Ni_asc) + 5),
     pch = 16)

lines(tabla_frecuencia$MC, tabla_frecuencia$Ni_desc,
      type = "o", col = "red", pch = 17)

legend("bottomright",
       legend = c("Ojiva Ascendente", "Ojiva Descendente"),
       col = c("green", "red"),
       pch = c(16, 17),
       lty = 1)

# Diagrama de caja (boxplot)
boxplot(variable,
        horizontal = TRUE,
        col = "orange",
        main = "Diagrama de Caja: Combined Electricity Combustion",
        xlab = "Combustion Elecrica Combinada")

25 Combined Gasoline Combustion

# Seleccionar la variable continua
variable <- na.omit(datos$Combined.Gasoline.Consumption..CD.)

# Número de intervalos fijo
n <- length(variable)
k <- ceiling(1 + 3.322 * log10(n))

# Calcular rango y amplitud
R <- max(variable) - min(variable)
A <- ceiling(R / k)

# Límites inferiores y superiores
lim_inf <- seq(from = min(variable), by = A, length.out = k)
lim_sup <- lim_inf + A - 1  # corregido para evitar superposición

# Marcas de clase
MC <- (lim_inf + lim_sup) / 2

# Frecuencias absolutas
ni <- numeric(k)
for (i in 1:k) {
  if (i == k) {
    ni[i] <- sum(variable >= lim_inf[i] & variable <= lim_sup[i])
  } else {
    ni[i] <- sum(variable >= lim_inf[i] & variable < lim_sup[i])
  }
}

# Frecuencia relativa
hi <- round(ni / sum(ni), 4)

# Frecuencias acumuladas
Ni_asc <- cumsum(ni)
Fi_asc <- round(cumsum(hi), 4)
Ni_desc <- rev(cumsum(rev(ni)))
Fi_desc <- round(rev(cumsum(rev(hi))), 4)

# Crear tabla
tabla_frecuencia <- data.frame(
  Intervalo = paste0(round(lim_inf, 2), " - ", round(lim_sup, 2)),
  MC = round(MC, 2),
  ni = ni,
  hi = hi,
  Ni_desc = Ni_desc,
  Fi_desc = Fi_desc,
  Ni_asc = Ni_asc,
  Fi_asc = Fi_asc
)

# Mostrar tabla
print(tabla_frecuencia, row.names = FALSE)
##  Intervalo MC ni  hi Ni_desc Fi_desc Ni_asc Fi_asc
##      0 - 0  0  0 NaN       0     NaN      0    NaN
##      1 - 1  1  0 NaN       0     NaN      0    NaN
##      2 - 2  2  0 NaN       0     NaN      0    NaN
##      3 - 3  3  0 NaN       0     NaN      0    NaN
##      4 - 4  4  0 NaN       0     NaN      0    NaN
##      5 - 5  5  0 NaN       0     NaN      0    NaN
##      6 - 6  6  0 NaN       0     NaN      0    NaN
##      7 - 7  7  0 NaN       0     NaN      0    NaN
##      8 - 8  8  0 NaN       0     NaN      0    NaN
##      9 - 9  9  0 NaN       0     NaN      0    NaN
##    10 - 10 10  0 NaN       0     NaN      0    NaN
##    11 - 11 11  0 NaN       0     NaN      0    NaN
##    12 - 12 12  0 NaN       0     NaN      0    NaN
##    13 - 13 13  0 NaN       0     NaN      0    NaN
##    14 - 14 14  0 NaN       0     NaN      0    NaN
##    15 - 15 15  0 NaN       0     NaN      0    NaN
##    16 - 16 16  0 NaN       0     NaN      0    NaN
# Histograma manual con las frecuencias absolutas
barplot(tabla_frecuencia$ni,
        main = "Histograma: Combined Gasoline Combustion",
        xlab = "Combustion de Gasolina Combinada",
        ylab = "Frecuencia absoluta",
        col = "skyblue",
        names.arg = tabla_frecuencia$Intervalo,
        las = 2,
        cex.names = 0.7,
        ylim = c(0, max(tabla_frecuencia$ni) + 5))

# Ojivas (ascendente y descendente) con líneas conectadas
plot(tabla_frecuencia$MC, tabla_frecuencia$Ni_asc,
     type = "o", col = "green",
     main = "OjivasFrecuencias acumuladas de Combined Gasoline Combustion",
     xlab = "Combustion de Gasolina Combinada",
     ylab = "Frecuencia acumulada",
     ylim = c(0, max(tabla_frecuencia$Ni_asc) + 5),
     pch = 16)

lines(tabla_frecuencia$MC, tabla_frecuencia$Ni_desc,
      type = "o", col = "red", pch = 17)

legend("bottomright",
       legend = c("Ojiva Ascendente", "Ojiva Descendente"),
       col = c("green", "red"),
       pch = c(16, 17),
       lty = 1)

# Diagrama de caja (boxplot)
boxplot(variable,
        horizontal = TRUE,
        col = "orange",
        main = "Diagrama de Caja: Combined Gasoline Combustion",
        xlab = "Combustion de Gasolina Combinada")

26 Combined Utility Factor

# Seleccionar la variable continua
variable <- na.omit(datos$Combined.Utility.Factor)

# Número de datos y número de intervalos (regla de Sturges)
n <- length(variable)
k <- ceiling(1 + 3.322 * log10(n))

# Calcular rango y amplitud del intervalo
R <- max(variable) - min(variable)
A <- ceiling(R / k)

# Límites inferiores
lim_inf <- seq(from = min(variable), by = A, length.out = k)

# Límites superiores (el último se ajusta al máximo real)
lim_sup <- c(lim_inf[-1], max(variable) + 1e-4)

# Marcas de clase (punto medio)
MC <- (lim_inf + lim_sup) / 2

# Frecuencias absolutas
ni <- numeric(k)
for (i in 1:k) {
  if (i == k) {
    ni[i] <- sum(variable >= lim_inf[i] & variable <= lim_sup[i])  # Incluye el último valor
  } else {
    ni[i] <- sum(variable >= lim_inf[i] & variable < lim_sup[i])
  }
}

# Frecuencia relativa
hi <- round(ni / sum(ni), 4)

# Frecuencias acumuladas
Ni_asc <- cumsum(ni)
Fi_asc <- round(cumsum(hi), 4)
Ni_desc <- rev(cumsum(rev(ni)))
Fi_desc <- round(rev(cumsum(rev(hi))), 4)

# Crear tabla de frecuencia
tabla_frecuencia <- data.frame(
  Intervalo = paste0(round(lim_inf, 2), " - ", round(lim_sup, 2)),
  MC = round(MC, 2),
  ni = ni,
  hi = hi,
  Ni_desc = Ni_desc,
  Fi_desc = Fi_desc,
  Ni_asc = Ni_asc,
  Fi_asc = Fi_asc
)

# Mostrar tabla
print(tabla_frecuencia, row.names = FALSE)
##  Intervalo    MC    ni hi Ni_desc Fi_desc Ni_asc Fi_asc
##      0 - 1  0.50 38113  1   38113       1  38113      1
##      1 - 2  1.50     0  0       0       0  38113      1
##      2 - 3  2.50     0  0       0       0  38113      1
##      3 - 4  3.50     0  0       0       0  38113      1
##      4 - 5  4.50     0  0       0       0  38113      1
##      5 - 6  5.50     0  0       0       0  38113      1
##      6 - 7  6.50     0  0       0       0  38113      1
##      7 - 8  7.50     0  0       0       0  38113      1
##      8 - 9  8.50     0  0       0       0  38113      1
##     9 - 10  9.50     0  0       0       0  38113      1
##    10 - 11 10.50     0  0       0       0  38113      1
##    11 - 12 11.50     0  0       0       0  38113      1
##    12 - 13 12.50     0  0       0       0  38113      1
##    13 - 14 13.50     0  0       0       0  38113      1
##    14 - 15 14.50     0  0       0       0  38113      1
##    15 - 16 15.50     0  0       0       0  38113      1
##  16 - 0.89  8.44     0  0       0       0  38113      1
# Histograma manual con las frecuencias absolutas
barplot(height = ni,
        names.arg = tabla_frecuencia$Intervalo,
        main = "Histograma: Combined Utility Factor",
        xlab = "Factor Utilidad Combinada",
        ylab = "Frecuencia absoluta",
        col = "skyblue",
        las = 2,
        cex.names = 0.7,
        ylim = c(0, max(ni) + 5))

# Ojivas (ascendente y descendente)
plot(tabla_frecuencia$MC, tabla_frecuencia$Ni_asc,
     type = "o", col = "green",
     main = "Ojivas: Frecuencias acumuladas de Combined Utility Factor",
     xlab = "Factor Utilidad Combinada",
     ylab = "Frecuencia acumulada",
     ylim = c(0, max(tabla_frecuencia$Ni_asc) + 5),
     pch = 16)

lines(tabla_frecuencia$MC, tabla_frecuencia$Ni_desc,
      type = "o", col = "red", pch = 17)

legend("bottomright",
       legend = c("Ojiva Ascendente", "Ojiva Descendente"),
       col = c("green", "red"),
       pch = c(16, 17),
       lty = 1)

# Diagrama de caja (boxplot)
boxplot(variable,
        horizontal = TRUE,
        col = "orange",
        main = "Diagrama de Caja: Combined Utility Factor",
        xlab = "Factor Utilidad Combinada")

27 Annual Fuel Cost FT1

# Seleccionar la variable continua
variable <- na.omit(datos$Annual.Fuel.Cost..FT1.)

# Número de datos y número de intervalos (regla de Sturges)
n <- length(variable)
k <- ceiling(1 + 3.322 * log10(n))

# Calcular rango y amplitud del intervalo
R <- max(variable) - min(variable)
A <- ceiling(R / k)

# Límites inferiores
lim_inf <- seq(from = min(variable), by = A, length.out = k)

# Límites superiores (el último se ajusta al máximo real)
lim_sup <- c(lim_inf[-1], max(variable) + 1e-4)

# Marcas de clase (punto medio)
MC <- (lim_inf + lim_sup) / 2

# Frecuencias absolutas
ni <- numeric(k)
for (i in 1:k) {
  if (i == k) {
    ni[i] <- sum(variable >= lim_inf[i] & variable <= lim_sup[i])  # Incluye el último valor
  } else {
    ni[i] <- sum(variable >= lim_inf[i] & variable < lim_sup[i])
  }
}

# Frecuencia relativa
hi <- round(ni / sum(ni), 4)

# Frecuencias acumuladas
Ni_asc <- cumsum(ni)
Fi_asc <- round(cumsum(hi), 4)
Ni_desc <- rev(cumsum(rev(ni)))
Fi_desc <- round(rev(cumsum(rev(hi))), 4)

# Crear tabla de frecuencia
tabla_frecuencia <- data.frame(
  Intervalo = paste0(round(lim_inf, 2), " - ", round(lim_sup, 2)),
  MC = round(MC, 2),
  ni = ni,
  hi = hi,
  Ni_desc = Ni_desc,
  Fi_desc = Fi_desc,
  Ni_asc = Ni_asc,
  Fi_asc = Fi_asc
)

# Mostrar tabla
print(tabla_frecuencia, row.names = FALSE)
##    Intervalo     MC   ni     hi Ni_desc Fi_desc Ni_asc Fi_asc
##    500 - 827  663.5  178 0.0047   38113  1.0001    178 0.0047
##   827 - 1154  990.5 1361 0.0357   37935  0.9954   1539 0.0404
##  1154 - 1481 1317.5 5137 0.1348   36574  0.9597   6676 0.1752
##  1481 - 1808 1644.5 8655 0.2271   31437  0.8249  15331 0.4023
##  1808 - 2135 1971.5 9834 0.2580   22782  0.5978  25165 0.6603
##  2135 - 2462 2298.5 6604 0.1733   12948  0.3398  31769 0.8336
##  2462 - 2789 2625.5 3700 0.0971    6344  0.1665  35469 0.9307
##  2789 - 3116 2952.5 1379 0.0362    2644  0.0694  36848 0.9669
##  3116 - 3443 3279.5  658 0.0173    1265  0.0332  37506 0.9842
##  3443 - 3770 3606.5  318 0.0083     607  0.0159  37824 0.9925
##  3770 - 4097 3933.5  189 0.0050     289  0.0076  38013 0.9975
##  4097 - 4424 4260.5   85 0.0022     100  0.0026  38098 0.9997
##  4424 - 4751 4587.5    6 0.0002      15  0.0004  38104 0.9999
##  4751 - 5078 4914.5    0 0.0000       9  0.0002  38104 0.9999
##  5078 - 5405 5241.5    4 0.0001       9  0.0002  38108 1.0000
##  5405 - 5732 5568.5    0 0.0000       5  0.0001  38108 1.0000
##  5732 - 6050 5891.0    5 0.0001       5  0.0001  38113 1.0001
# Histograma manual con las frecuencias absolutas
barplot(height = ni,
        names.arg = tabla_frecuencia$Intervalo,
        main = "Histograma: Annual Fuel Cost FT1",
        xlab = "Costo Anual del Combustible FT1",
        ylab = "Frecuencia absoluta",
        col = "skyblue",
        las = 2,
        cex.names = 0.7,
        ylim = c(0, max(ni) + 5))

# Ojivas (ascendente y descendente)
plot(tabla_frecuencia$MC, tabla_frecuencia$Ni_asc,
     type = "o", col = "green",
     main = "Ojivas: Frecuencias acumuladas de Annual Fuel Cost FT1",
     xlab = "Costo Anual del Combustible FT1",
     ylab = "Frecuencia acumulada",
     ylim = c(0, max(tabla_frecuencia$Ni_asc) + 5),
     pch = 16)

lines(tabla_frecuencia$MC, tabla_frecuencia$Ni_desc,
      type = "o", col = "red", pch = 17)

legend("bottomright",
       legend = c("Ojiva Ascendente", "Ojiva Descendente"),
       col = c("green", "red"),
       pch = c(16, 17),
       lty = 1)

# Diagrama de caja (boxplot)
boxplot(variable,
        horizontal = TRUE,
        col = "orange",
        main = "Diagrama de Caja: Annual Fuel Cost FT1",
        xlab = "Costo Anual del Combustible FT1")

28 Annual Fuel Cost FT2

# Seleccionar la variable continua
variable <- na.omit(datos$Annual.Fuel.Cost..FT2.)

# Número de datos y número de intervalos (regla de Sturges)
n <- length(variable)
k <- ceiling(1 + 3.322 * log10(n))

# Calcular rango y amplitud del intervalo
R <- max(variable) - min(variable)
A <- ceiling(R / k)

# Límites inferiores
lim_inf <- seq(from = min(variable), by = A, length.out = k)

# Límites superiores (el último se ajusta al máximo real)
lim_sup <- c(lim_inf[-1], max(variable) + 1e-4)

# Marcas de clase (punto medio)
MC <- (lim_inf + lim_sup) / 2

# Frecuencias absolutas
ni <- numeric(k)
for (i in 1:k) {
  if (i == k) {
    ni[i] <- sum(variable >= lim_inf[i] & variable <= lim_sup[i])  # Incluye el último valor
  } else {
    ni[i] <- sum(variable >= lim_inf[i] & variable < lim_sup[i])
  }
}

# Frecuencia relativa
hi <- round(ni / sum(ni), 4)

# Frecuencias acumuladas
Ni_asc <- cumsum(ni)
Fi_asc <- round(cumsum(hi), 4)
Ni_desc <- rev(cumsum(rev(ni)))
Fi_desc <- round(rev(cumsum(rev(hi))), 4)

# Crear tabla de frecuencia
tabla_frecuencia <- data.frame(
  Intervalo = paste0(round(lim_inf, 2), " - ", round(lim_sup, 2)),
  MC = round(MC, 2),
  ni = ni,
  hi = hi,
  Ni_desc = Ni_desc,
  Fi_desc = Fi_desc,
  Ni_asc = Ni_asc,
  Fi_asc = Fi_asc
)

# Mostrar tabla
print(tabla_frecuencia, row.names = FALSE)
##    Intervalo     MC    ni     hi Ni_desc Fi_desc Ni_asc Fi_asc
##      0 - 215  107.5 36720 0.9635   38113  1.0000  36720 0.9635
##    215 - 430  322.5     0 0.0000    1393  0.0365  36720 0.9635
##    430 - 645  537.5     6 0.0002    1393  0.0365  36726 0.9637
##    645 - 860  752.5     9 0.0002    1387  0.0363  36735 0.9639
##   860 - 1075  967.5     1 0.0000    1378  0.0361  36736 0.9639
##  1075 - 1290 1182.5     6 0.0002    1377  0.0361  36742 0.9641
##  1290 - 1505 1397.5    51 0.0013    1371  0.0359  36793 0.9654
##  1505 - 1720 1612.5   116 0.0030    1320  0.0346  36909 0.9684
##  1720 - 1935 1827.5   122 0.0032    1204  0.0316  37031 0.9716
##  1935 - 2150 2042.5   240 0.0063    1082  0.0284  37271 0.9779
##  2150 - 2365 2257.5   187 0.0049     842  0.0221  37458 0.9828
##  2365 - 2580 2472.5   144 0.0038     655  0.0172  37602 0.9866
##  2580 - 2795 2687.5   265 0.0070     511  0.0134  37867 0.9936
##  2795 - 3010 2902.5   187 0.0049     246  0.0064  38054 0.9985
##  3010 - 3225 3117.5    51 0.0013      59  0.0015  38105 0.9998
##  3225 - 3440 3332.5     0 0.0000       8  0.0002  38105 0.9998
##  3440 - 3650 3545.0     8 0.0002       8  0.0002  38113 1.0000
# Histograma manual con las frecuencias absolutas
barplot(height = ni,
        names.arg = tabla_frecuencia$Intervalo,
        main = "Histograma: Annual Fuel Cost FT2",
        xlab = "Costo Anual del Combustible FT2",
        ylab = "Frecuencia absoluta",
        col = "skyblue",
        las = 2,
        cex.names = 0.7,
        ylim = c(0, max(ni) + 5))

# Ojivas (ascendente y descendente)
plot(tabla_frecuencia$MC, tabla_frecuencia$Ni_asc,
     type = "o", col = "green",
     main = "Ojivas: Frecuencias acumuladas de Annual Fuel Cost FT2",
     xlab = "Costo Anual del Combustible FT2",
     ylab = "Frecuencia acumulada",
     ylim = c(0, max(tabla_frecuencia$Ni_asc) + 5),
     pch = 16)

lines(tabla_frecuencia$MC, tabla_frecuencia$Ni_desc,
      type = "o", col = "red", pch = 17)

legend("bottomright",
       legend = c("Ojiva Ascendente", "Ojiva Descendente"),
       col = c("green", "red"),
       pch = c(16, 17),
       lty = 1)

# Diagrama de caja (boxplot)
boxplot(variable,
        horizontal = TRUE,
        col = "orange",
        main = "Diagrama de Caja: Annual Fuel Cost FT2",
        xlab = "Costo Anual del Combustible FT2")

#Save or Spend 5 Year

# Seleccionar la variable continua
variable <- na.omit(datos$Save.or.Spend..5.Year.)

# Número de datos y número de intervalos (regla de Sturges)
n <- length(variable)
k <- ceiling(1 + 3.322 * log10(n))

# Calcular rango y amplitud del intervalo
R <- max(variable) - min(variable)
A <- ceiling(R / k)

# Límites inferiores
lim_inf <- seq(from = min(variable), by = A, length.out = k)

# Límites superiores (el último se ajusta al máximo real)
lim_sup <- c(lim_inf[-1], max(variable) + 1e-4)

# Marcas de clase (punto medio)
MC <- (lim_inf + lim_sup) / 2

# Frecuencias absolutas
ni <- numeric(k)
for (i in 1:k) {
  if (i == k) {
    ni[i] <- sum(variable >= lim_inf[i] & variable <= lim_sup[i])  # Incluye el último valor
  } else {
    ni[i] <- sum(variable >= lim_inf[i] & variable < lim_sup[i])
  }
}

# Frecuencia relativa
hi <- round(ni / sum(ni), 4)

# Frecuencias acumuladas
Ni_asc <- cumsum(ni)
Fi_asc <- round(cumsum(hi), 4)
Ni_desc <- rev(cumsum(rev(ni)))
Fi_desc <- round(rev(cumsum(rev(hi))), 4)

# Crear tabla de frecuencia
tabla_frecuencia <- data.frame(
  Intervalo = paste0(round(lim_inf, 2), " - ", round(lim_sup, 2)),
  MC = round(MC, 2),
  ni = ni,
  hi = hi,
  Ni_desc = Ni_desc,
  Fi_desc = Fi_desc,
  Ni_asc = Ni_asc,
  Fi_asc = Fi_asc
)

# Mostrar tabla
print(tabla_frecuencia, row.names = FALSE)
##        Intervalo       MC   ni     hi Ni_desc Fi_desc Ni_asc Fi_asc
##  -23500 - -21867 -22683.5    5 0.0001   38113  1.0000      5 0.0001
##  -21867 - -20234 -21050.5    0 0.0000   38108  0.9999      5 0.0001
##  -20234 - -18601 -19417.5    4 0.0001   38108  0.9999      9 0.0002
##  -18601 - -16968 -17784.5    0 0.0000   38104  0.9998      9 0.0002
##  -16968 - -15335 -16151.5    6 0.0002   38104  0.9998     15 0.0004
##  -15335 - -13702 -14518.5   85 0.0022   38098  0.9996    100 0.0026
##  -13702 - -12069 -12885.5  189 0.0050   38013  0.9974    289 0.0076
##  -12069 - -10436 -11252.5  318 0.0083   37824  0.9924    607 0.0159
##   -10436 - -8803  -9619.5  658 0.0173   37506  0.9841   1265 0.0332
##    -8803 - -7170  -7986.5 1379 0.0362   36848  0.9668   2644 0.0694
##    -7170 - -5537  -6353.5 3698 0.0970   35469  0.9306   6342 0.1664
##    -5537 - -3904  -4720.5 6606 0.1733   31771  0.8336  12948 0.3397
##    -3904 - -2271  -3087.5 9829 0.2579   25165  0.6603  22777 0.5976
##     -2271 - -638  -1454.5 8652 0.2270   15336  0.4024  31429 0.8246
##       -638 - 995    178.5 5137 0.1348    6684  0.1754  36566 0.9594
##       995 - 2628   1811.5 1358 0.0356    1547  0.0406  37924 0.9950
##      2628 - 4250   3439.0  189 0.0050     189  0.0050  38113 1.0000
# Histograma manual con las frecuencias absolutas
barplot(height = ni,
        names.arg = tabla_frecuencia$Intervalo,
        main = "Histograma: Save or Spend 5 Year",
        xlab = "Ahorrar o gastar 5 años",
        ylab = "Frecuencia absoluta",
        col = "skyblue",
        las = 2,
        cex.names = 0.7,
        ylim = c(0, max(ni) + 5))

# Ojivas (ascendente y descendente)
plot(tabla_frecuencia$MC, tabla_frecuencia$Ni_asc,
     type = "o", col = "green",
     main = "Ojivas: Frecuencias acumuladas de Save or Spend 5 Year",
     xlab = "Ahorrar o gastar 5 años",
     ylab = "Frecuencia acumulada",
     ylim = c(0, max(tabla_frecuencia$Ni_asc) + 5),
     pch = 16)

lines(tabla_frecuencia$MC, tabla_frecuencia$Ni_desc,
      type = "o", col = "red", pch = 17)

legend("bottomright",
       legend = c("Ojiva Ascendente", "Ojiva Descendente"),
       col = c("green", "red"),
       pch = c(16, 17),
       lty = 1)

# Diagrama de caja (boxplot)
boxplot(variable,
        horizontal = TRUE,
        col = "orange",
        main = "Diagrama de Caja: Save or Spend 5 Year",
        xlab = "Ahorrar o gastar 5 años")

29 Annual Consumption in Barrels FT1

# Seleccionar la variable continua
variable <- na.omit(datos$Annual.Consumption.in.Barrels..FT1.)

# Número de datos y número de intervalos (regla de Sturges)
n <- length(variable)
k <- ceiling(1 + 3.322 * log10(n))

# Calcular rango y amplitud del intervalo
R <- max(variable) - min(variable)
A <- ceiling(R / k)

# Límites inferiores
lim_inf <- seq(from = min(variable), by = A, length.out = k)

# Límites superiores (el último se ajusta al máximo real)
lim_sup <- c(lim_inf[-1], max(variable) + 1e-4)

# Marcas de clase (punto medio)
MC <- (lim_inf + lim_sup) / 2

# Frecuencias absolutas
ni <- numeric(k)
for (i in 1:k) {
  if (i == k) {
    ni[i] <- sum(variable >= lim_inf[i] & variable <= lim_sup[i])  # Incluye el último valor
  } else {
    ni[i] <- sum(variable >= lim_inf[i] & variable < lim_sup[i])
  }
}

# Frecuencia relativa
hi <- round(ni / sum(ni), 4)

# Frecuencias acumuladas
Ni_asc <- cumsum(ni)
Fi_asc <- round(cumsum(hi), 4)
Ni_desc <- rev(cumsum(rev(ni)))
Fi_desc <- round(rev(cumsum(rev(hi))), 4)

# Crear tabla de frecuencia
tabla_frecuencia <- data.frame(
  Intervalo = paste0(round(lim_inf, 2), " - ", round(lim_sup, 2)),
  MC = round(MC, 2),
  ni = ni,
  hi = hi,
  Ni_desc = Ni_desc,
  Fi_desc = Fi_desc,
  Ni_asc = Ni_asc,
  Fi_asc = Fi_asc
)

# Mostrar tabla
print(tabla_frecuencia, row.names = FALSE)
##      Intervalo    MC    ni     hi Ni_desc Fi_desc Ni_asc Fi_asc
##    0.06 - 3.06  1.56   200 0.0052   38113  0.9997    200 0.0052
##    3.06 - 6.06  4.56    36 0.0009   37913  0.9945    236 0.0061
##    6.06 - 9.06  7.56   268 0.0070   37877  0.9936    504 0.0131
##   9.06 - 12.06 10.56  2417 0.0634   37609  0.9866   2921 0.0765
##  12.06 - 15.06 13.56  9167 0.2405   35192  0.9232  12088 0.3170
##  15.06 - 18.06 16.56 10129 0.2658   26025  0.6827  22217 0.5828
##  18.06 - 21.06 19.56  8591 0.2254   15896  0.4169  30808 0.8082
##  21.06 - 24.06 22.56  4556 0.1195    7305  0.1915  35364 0.9277
##  24.06 - 27.06 25.56  1308 0.0343    2749  0.0720  36672 0.9620
##  27.06 - 30.06 28.56  1219 0.0320    1441  0.0377  37891 0.9940
##  30.06 - 33.06 31.56   135 0.0035     222  0.0057  38026 0.9975
##  33.06 - 36.06 34.56     0 0.0000      87  0.0022  38026 0.9975
##  36.06 - 39.06 37.56    47 0.0012      87  0.0022  38073 0.9987
##  39.06 - 42.06 40.56    35 0.0009      40  0.0010  38108 0.9996
##  42.06 - 45.06 43.56     0 0.0000       5  0.0001  38108 0.9996
##  45.06 - 48.06 46.56     5 0.0001       5  0.0001  38113 0.9997
##  48.06 - 47.09 47.57     0 0.0000       0  0.0000  38113 0.9997
# Histograma manual con las frecuencias absolutas
barplot(height = ni,
        names.arg = tabla_frecuencia$Intervalo,
        main = "Histograma: Annual Consumption in Barrels FT1",
        xlab = "Consumo anual en barriles FT1",
        ylab = "Frecuencia absoluta",
        col = "skyblue",
        las = 2,
        cex.names = 0.7,
        ylim = c(0, max(ni) + 5))

# Ojivas (ascendente y descendente)
plot(tabla_frecuencia$MC, tabla_frecuencia$Ni_asc,
     type = "o", col = "green",
     main = "Ojivas: Frecuencias acumuladas de Annual Consumption in Barrels FT1",
     xlab = "Consumo anual en barriles FT1",
     ylab = "Frecuencia acumulada",
     ylim = c(0, max(tabla_frecuencia$Ni_asc) + 5),
     pch = 16)

lines(tabla_frecuencia$MC, tabla_frecuencia$Ni_desc,
      type = "o", col = "red", pch = 17)

legend("bottomright",
       legend = c("Ojiva Ascendente", "Ojiva Descendente"),
       col = c("green", "red"),
       pch = c(16, 17),
       lty = 1)

# Diagrama de caja (boxplot)
boxplot(variable,
        horizontal = TRUE,
        col = "orange",
        main = "Diagrama de Caja: Annual Consumption in Barrels FT1",
        xlab = "Consumo anual en barriles FT1")

30 Annual Consumption in Barrels FT2

# Seleccionar la variable continua
variable <- na.omit(datos$Annual.Consumption.in.Barrels..FT2.)

# Número de datos y número de intervalos (regla de Sturges)
n <- length(variable)
k <- ceiling(1 + 3.322 * log10(n))

# Calcular rango y amplitud del intervalo
R <- max(variable) - min(variable)
A <- ceiling(R / k)

# Límites inferiores
lim_inf <- seq(from = min(variable), by = A, length.out = k)

# Límites superiores (el último se ajusta al máximo real)
lim_sup <- c(lim_inf[-1], max(variable) + 1e-4)

# Marcas de clase (punto medio)
MC <- (lim_inf + lim_sup) / 2

# Frecuencias absolutas
ni <- numeric(k)
for (i in 1:k) {
  if (i == k) {
    ni[i] <- sum(variable >= lim_inf[i] & variable <= lim_sup[i])  # Incluye el último valor
  } else {
    ni[i] <- sum(variable >= lim_inf[i] & variable < lim_sup[i])
  }
}

# Frecuencia relativa
hi <- round(ni / sum(ni), 4)

# Frecuencias acumuladas
Ni_asc <- cumsum(ni)
Fi_asc <- round(cumsum(hi), 4)
Ni_desc <- rev(cumsum(rev(ni)))
Fi_desc <- round(rev(cumsum(rev(hi))), 4)

# Crear tabla de frecuencia
tabla_frecuencia <- data.frame(
  Intervalo = paste0(round(lim_inf, 2), " - ", round(lim_sup, 2)),
  MC = round(MC, 2),
  ni = ni,
  hi = hi,
  Ni_desc = Ni_desc,
  Fi_desc = Fi_desc,
  Ni_asc = Ni_asc,
  Fi_asc = Fi_asc
)

# Mostrar tabla
print(tabla_frecuencia, row.names = FALSE)
##   Intervalo    MC    ni     hi Ni_desc Fi_desc Ni_asc Fi_asc
##       0 - 2  1.00 36715 0.9633   38113  1.0000  36715 0.9633
##       2 - 4  3.00    72 0.0019    1398  0.0367  36787 0.9652
##       4 - 6  5.00   674 0.0177    1326  0.0348  37461 0.9829
##       6 - 8  7.00   592 0.0155     652  0.0171  38053 0.9984
##      8 - 10  9.00    58 0.0015      60  0.0016  38111 0.9999
##     10 - 12 11.00     0 0.0000       2  0.0001  38111 0.9999
##     12 - 14 13.00     0 0.0000       2  0.0001  38111 0.9999
##     14 - 16 15.00     0 0.0000       2  0.0001  38111 0.9999
##     16 - 18 17.00     0 0.0000       2  0.0001  38111 0.9999
##     18 - 20 19.00     2 0.0001       2  0.0001  38113 1.0000
##     20 - 22 21.00     0 0.0000       0  0.0000  38113 1.0000
##     22 - 24 23.00     0 0.0000       0  0.0000  38113 1.0000
##     24 - 26 25.00     0 0.0000       0  0.0000  38113 1.0000
##     26 - 28 27.00     0 0.0000       0  0.0000  38113 1.0000
##     28 - 30 29.00     0 0.0000       0  0.0000  38113 1.0000
##     30 - 32 31.00     0 0.0000       0  0.0000  38113 1.0000
##  32 - 18.31 25.16     0 0.0000       0  0.0000  38113 1.0000
# Histograma manual con las frecuencias absolutas
barplot(height = ni,
        names.arg = tabla_frecuencia$Intervalo,
        main = "Histograma: Annual Consumption in Barrels FT2",
        xlab = "Consumo anual en barriles FT2",
        ylab = "Frecuencia absoluta",
        col = "skyblue",
        las = 2,
        cex.names = 0.7,
        ylim = c(0, max(ni) + 5))

# Ojivas (ascendente y descendente)
plot(tabla_frecuencia$MC, tabla_frecuencia$Ni_asc,
     type = "o", col = "green",
     main = "Ojivas: Frecuencias acumuladas de Annual Consumption in Barrels FT2",
     xlab = "Consumo anual en barriles FT2",
     ylab = "Frecuencia acumulada",
     ylim = c(0, max(tabla_frecuencia$Ni_asc) + 5),
     pch = 16)

lines(tabla_frecuencia$MC, tabla_frecuencia$Ni_desc,
      type = "o", col = "red", pch = 17)

legend("bottomright",
       legend = c("Ojiva Ascendente", "Ojiva Descendente"),
       col = c("green", "red"),
       pch = c(16, 17),
       lty = 1)

# Diagrama de caja (boxplot)
boxplot(variable,
        horizontal = TRUE,
        col = "orange",
        main = "Diagrama de Caja: Annual Consumption in Barrels FT2",
        xlab = "Consumo anual en barriles FT2")

31 Tailpipe CO2 FT1

# Seleccionar la variable continua
variable <- na.omit(datos$Tailpipe.CO2..FT1.)

# Número de datos y número de intervalos (regla de Sturges)
n <- length(variable)
k <- ceiling(1 + 3.322 * log10(n))

# Calcular rango y amplitud del intervalo
R <- max(variable) - min(variable)
A <- ceiling(R / k)

# Límites inferiores
lim_inf <- seq(from = min(variable), by = A, length.out = k)

# Límites superiores (el último se ajusta al máximo real)
lim_sup <- c(lim_inf[-1], max(variable) + 1e-4)

# Marcas de clase (punto medio)
MC <- (lim_inf + lim_sup) / 2

# Frecuencias absolutas
ni <- numeric(k)
for (i in 1:k) {
  if (i == k) {
    ni[i] <- sum(variable >= lim_inf[i] & variable <= lim_sup[i])  # Incluye el último valor
  } else {
    ni[i] <- sum(variable >= lim_inf[i] & variable < lim_sup[i])
  }
}

# Frecuencia relativa
hi <- round(ni / sum(ni), 4)

# Frecuencias acumuladas
Ni_asc <- cumsum(ni)
Fi_asc <- round(cumsum(hi), 4)
Ni_desc <- rev(cumsum(rev(ni)))
Fi_desc <- round(rev(cumsum(rev(hi))), 4)

# Crear tabla de frecuencia
tabla_frecuencia <- data.frame(
  Intervalo = paste0(round(lim_inf, 2), " - ", round(lim_sup, 2)),
  MC = round(MC, 2),
  ni = ni,
  hi = hi,
  Ni_desc = Ni_desc,
  Fi_desc = Fi_desc,
  Ni_asc = Ni_asc,
  Fi_asc = Fi_asc
)

# Mostrar tabla
print(tabla_frecuencia, row.names = FALSE)
##  Intervalo  MC    ni     hi Ni_desc Fi_desc Ni_asc Fi_asc
##    -1 - 49  24 32090 0.8420   38113  1.0000  32090 0.8420
##    49 - 99  74    12 0.0003    6023  0.1580  32102 0.8423
##   99 - 149 124    20 0.0005    6011  0.1577  32122 0.8428
##  149 - 199 174    30 0.0008    5991  0.1572  32152 0.8436
##  199 - 249 224   118 0.0031    5961  0.1564  32270 0.8467
##  249 - 299 274   470 0.0123    5843  0.1533  32740 0.8590
##  299 - 349 324  1119 0.0294    5373  0.1410  33859 0.8884
##  349 - 399 374  1159 0.0304    4254  0.1116  35018 0.9188
##  399 - 449 424  1131 0.0297    3095  0.0812  36149 0.9485
##  449 - 499 474   894 0.0235    1964  0.0515  37043 0.9720
##  499 - 549 524   439 0.0115    1070  0.0280  37482 0.9835
##  549 - 599 574   290 0.0076     631  0.0165  37772 0.9911
##  599 - 649 624   206 0.0054     341  0.0089  37978 0.9965
##  649 - 699 674    76 0.0020     135  0.0035  38054 0.9985
##  699 - 749 724    46 0.0012      59  0.0015  38100 0.9997
##  749 - 799 774     9 0.0002      13  0.0003  38109 0.9999
##  799 - 847 823     4 0.0001       4  0.0001  38113 1.0000
# Histograma manual con las frecuencias absolutas
barplot(height = ni,
        names.arg = tabla_frecuencia$Intervalo,
        main = "Histograma: Tailpipe CO2 FT1",
        xlab = "Tubo de escape CO2 FT1",
        ylab = "Frecuencia absoluta",
        col = "skyblue",
        las = 2,
        cex.names = 0.7,
        ylim = c(0, max(ni) + 5))

# Ojivas (ascendente y descendente)
plot(tabla_frecuencia$MC, tabla_frecuencia$Ni_asc,
     type = "o", col = "green",
     main = "Ojivas: Frecuencias acumuladas de Tailpipe CO2 FT1",
     xlab = "Tubo de escape CO2 FT1",
     ylab = "Frecuencia acumulada",
     ylim = c(0, max(tabla_frecuencia$Ni_asc) + 5),
     pch = 16)

lines(tabla_frecuencia$MC, tabla_frecuencia$Ni_desc,
      type = "o", col = "red", pch = 17)

legend("bottomright",
       legend = c("Ojiva Ascendente", "Ojiva Descendente"),
       col = c("green", "red"),
       pch = c(16, 17),
       lty = 1)

# Diagrama de caja (boxplot)
boxplot(variable,
        horizontal = TRUE,
        col = "orange",
        main = "Diagrama de Caja:Tailpipe CO2 FT1",
        xlab = "Tubo de escape CO2 FT1")

32 Tailpipe CO2 in Grams Mile FT1

# Seleccionar la variable continua
variable <- na.omit(datos$Tailpipe.CO2.in.Grams.Mile..FT1.)

# Número de intervalos fijo
n <- length(variable)
k <- ceiling(1 + 3.322 * log10(n))

# Calcular rango y amplitud
R <- max(variable) - min(variable)
A <- ceiling(R / k)

# Límites inferiores y superiores
lim_inf <- seq(from = min(variable), by = A, length.out = k)
lim_sup <- lim_inf + A - 1  # corregido para evitar superposición

# Marcas de clase
MC <- (lim_inf + lim_sup) / 2

# Frecuencias absolutas
ni <- numeric(k)
for (i in 1:k) {
  if (i == k) {
    ni[i] <- sum(variable >= lim_inf[i] & variable <= lim_sup[i])
  } else {
    ni[i] <- sum(variable >= lim_inf[i] & variable < lim_sup[i])
  }
}

# Frecuencia relativa
hi <- round(ni / sum(ni), 4)

# Frecuencias acumuladas
Ni_asc <- cumsum(ni)
Fi_asc <- round(cumsum(hi), 4)
Ni_desc <- rev(cumsum(rev(ni)))
Fi_desc <- round(rev(cumsum(rev(hi))), 4)

# Crear tabla
tabla_frecuencia <- data.frame(
  Intervalo = paste0(round(lim_inf, 2), " - ", round(lim_sup, 2)),
  MC = round(MC, 2),
  ni = ni,
  hi = hi,
  Ni_desc = Ni_desc,
  Fi_desc = Fi_desc,
  Ni_asc = Ni_asc,
  Fi_asc = Fi_asc
)

# Mostrar tabla
print(tabla_frecuencia, row.names = FALSE)
##    Intervalo   MC    ni     hi Ni_desc Fi_desc Ni_asc Fi_asc
##       0 - 74   37   139 0.0037   37984  1.0001    139 0.0037
##     75 - 149  112    30 0.0008   37845  0.9964    169 0.0045
##    150 - 224  187   208 0.0055   37815  0.9956    377 0.0100
##    225 - 299  262  1242 0.0327   37607  0.9901   1619 0.0427
##    300 - 374  337  5928 0.1561   36365  0.9574   7547 0.1988
##    375 - 449  412 10961 0.2886   30437  0.8013  18508 0.4874
##    450 - 524  487  9623 0.2533   19476  0.5127  28131 0.7407
##    525 - 599  562  4983 0.1312    9853  0.2594  33114 0.8719
##    600 - 674  637  2152 0.0567    4870  0.1282  35266 0.9286
##    675 - 749  712  2025 0.0533    2718  0.0715  37291 0.9819
##    750 - 824  787   470 0.0124     693  0.0182  37761 0.9943
##    825 - 899  862   136 0.0036     223  0.0058  37897 0.9979
##    900 - 974  937     0 0.0000      87  0.0022  37897 0.9979
##   975 - 1049 1012    47 0.0012      87  0.0022  37944 0.9991
##  1050 - 1124 1087    35 0.0009      40  0.0010  37979 1.0000
##  1125 - 1199 1162     0 0.0000       5  0.0001  37979 1.0000
##  1200 - 1274 1237     5 0.0001       5  0.0001  37984 1.0001
# Histograma manual con las frecuencias absolutas
barplot(height = ni,
        names.arg = tabla_frecuencia$Intervalo,
        main = "Histograma: Tailpipe CO2 (g/mi) FT1",
        xlab = "Emisión de CO2 (g/mi)FT1",
        ylab = "Frecuencia absoluta",
        col = "skyblue",
        las = 2,
        cex.names = 0.7,
        ylim = c(0, max(ni) + 5))

# Ojivas (ascendente y descendente) con líneas conectadas
plot(tabla_frecuencia$MC, tabla_frecuencia$Ni_asc,
     type = "o", col = "green",
     main = "OjivasFrecuencias acumuladas de Tailpipe CO2 (g/mi) FT1",
     xlab = "Emisión de CO2 (g/mi)FT1",
     ylab = "Frecuencia acumulada",
     ylim = c(0, max(tabla_frecuencia$Ni_asc) + 5),
     pch = 16)

lines(tabla_frecuencia$MC, tabla_frecuencia$Ni_desc,
      type = "o", col = "red", pch = 17)

legend("bottomright",
       legend = c("Ojiva Ascendente", "Ojiva Descendente"),
       col = c("green", "red"),
       pch = c(16, 17),
       lty = 1)

# Diagrama de caja (boxplot)
boxplot(variable,
        horizontal = TRUE,
        col = "orange",
        main = "Diagrama de Caja: Tailpipe CO2 (g/mi) FT1",
        xlab = "Emisión de CO2 (g/mi)FT1")

33 Tailpipe CO2 FT2

# Seleccionar la variable continua
variable <- na.omit(datos$Tailpipe.CO2..FT2.)

# Número de datos y número de intervalos (regla de Sturges)
n <- length(variable)
k <- ceiling(1 + 3.322 * log10(n))

# Calcular rango y amplitud del intervalo
R <- max(variable) - min(variable)
A <- ceiling(R / k)

# Límites inferiores
lim_inf <- seq(from = min(variable), by = A, length.out = k)

# Límites superiores (el último se ajusta al máximo real)
lim_sup <- c(lim_inf[-1], max(variable) + 1e-4)

# Marcas de clase (punto medio)
MC <- (lim_inf + lim_sup) / 2

# Frecuencias absolutas
ni <- numeric(k)
for (i in 1:k) {
  if (i == k) {
    ni[i] <- sum(variable >= lim_inf[i] & variable <= lim_sup[i])  # Incluye el último valor
  } else {
    ni[i] <- sum(variable >= lim_inf[i] & variable < lim_sup[i])
  }
}

# Frecuencia relativa
hi <- round(ni / sum(ni), 4)

# Frecuencias acumuladas
Ni_asc <- cumsum(ni)
Fi_asc <- round(cumsum(hi), 4)
Ni_desc <- rev(cumsum(rev(ni)))
Fi_desc <- round(rev(cumsum(rev(hi))), 4)

# Crear tabla de frecuencia
tabla_frecuencia <- data.frame(
  Intervalo = paste0(round(lim_inf, 2), " - ", round(lim_sup, 2)),
  MC = round(MC, 2),
  ni = ni,
  hi = hi,
  Ni_desc = Ni_desc,
  Fi_desc = Fi_desc,
  Ni_asc = Ni_asc,
  Fi_asc = Fi_asc
)

# Mostrar tabla
print(tabla_frecuencia, row.names = FALSE)
##  Intervalo  MC    ni     hi Ni_desc Fi_desc Ni_asc Fi_asc
##    -1 - 41  20 37601 0.9866   38113  1.0001  37601 0.9866
##    41 - 83  62     0 0.0000     512  0.0135  37601 0.9866
##   83 - 125 104     0 0.0000     512  0.0135  37601 0.9866
##  125 - 167 146     0 0.0000     512  0.0135  37601 0.9866
##  167 - 209 188     0 0.0000     512  0.0135  37601 0.9866
##  209 - 251 230     0 0.0000     512  0.0135  37601 0.9866
##  251 - 293 272    16 0.0004     512  0.0135  37617 0.9870
##  293 - 335 314    17 0.0004     496  0.0131  37634 0.9874
##  335 - 377 356    60 0.0016     479  0.0127  37694 0.9890
##  377 - 419 398    84 0.0022     419  0.0111  37778 0.9912
##  419 - 461 440    97 0.0025     335  0.0089  37875 0.9937
##  461 - 503 482    87 0.0023     238  0.0064  37962 0.9960
##  503 - 545 524    31 0.0008     151  0.0041  37993 0.9968
##  545 - 587 566    48 0.0013     120  0.0033  38041 0.9981
##  587 - 629 608    44 0.0012      72  0.0020  38085 0.9993
##  629 - 671 650    10 0.0003      28  0.0008  38095 0.9996
##  671 - 713 692    18 0.0005      18  0.0005  38113 1.0001
# Histograma manual con las frecuencias absolutas
barplot(height = ni,
        names.arg = tabla_frecuencia$Intervalo,
        main = "Histograma: Tailpipe CO2 FT2",
        xlab = "Tubo de escape CO2 FT2",
        ylab = "Frecuencia absoluta",
        col = "skyblue",
        las = 2,
        cex.names = 0.7,
        ylim = c(0, max(ni) + 5))

# Ojivas (ascendente y descendente)
plot(tabla_frecuencia$MC, tabla_frecuencia$Ni_asc,
     type = "o", col = "green",
     main = "Ojivas: Frecuencias acumuladas de Tailpipe CO2 FT2",
     xlab = "Tubo de escape CO2 FT2",
     ylab = "Frecuencia acumulada",
     ylim = c(0, max(tabla_frecuencia$Ni_asc) + 5),
     pch = 16)

lines(tabla_frecuencia$MC, tabla_frecuencia$Ni_desc,
      type = "o", col = "red", pch = 17)

legend("bottomright",
       legend = c("Ojiva Ascendente", "Ojiva Descendente"),
       col = c("green", "red"),
       pch = c(16, 17),
       lty = 1)

# Diagrama de caja (boxplot)
boxplot(variable,
        horizontal = TRUE,
        col = "orange",
        main = "Diagrama de Caja:Tailpipe CO2 FT2",
        xlab = "Tubo de escape CO2 FT2")

34 Tailpipe CO2 in Grams Mile FT2

# Seleccionar la variable continua
variable <- na.omit(datos$Tailpipe.CO2.in.Grams.Mile..FT2.)

# Número de intervalos fijo
n <- length(variable)
k <- ceiling(1 + 3.322 * log10(n))

# Calcular rango y amplitud
R <- max(variable) - min(variable)
A <- ceiling(R / k)

# Límites inferiores y superiores
lim_inf <- seq(from = min(variable), by = A, length.out = k)
lim_sup <- lim_inf + A - 1  # corregido para evitar superposición

# Marcas de clase
MC <- (lim_inf + lim_sup) / 2

# Frecuencias absolutas
ni <- numeric(k)
for (i in 1:k) {
  if (i == k) {
    ni[i] <- sum(variable >= lim_inf[i] & variable <= lim_sup[i])
  } else {
    ni[i] <- sum(variable >= lim_inf[i] & variable < lim_sup[i])
  }
}

# Frecuencia relativa
hi <- round(ni / sum(ni), 4)

# Frecuencias acumuladas
Ni_asc <- cumsum(ni)
Fi_asc <- round(cumsum(hi), 4)
Ni_desc <- rev(cumsum(rev(ni)))
Fi_desc <- round(rev(cumsum(rev(hi))), 4)

# Crear tabla
tabla_frecuencia <- data.frame(
  Intervalo = paste0(round(lim_inf, 2), " - ", round(lim_sup, 2)),
  MC = round(MC, 2),
  ni = ni,
  hi = hi,
  Ni_desc = Ni_desc,
  Fi_desc = Fi_desc,
  Ni_asc = Ni_asc,
  Fi_asc = Fi_asc
)

# Mostrar tabla
print(tabla_frecuencia, row.names = FALSE)
##  Intervalo    MC    ni     hi Ni_desc Fi_desc Ni_asc Fi_asc
##     0 - 41  20.5 36740 0.9643   38099  0.9999  36740 0.9643
##    42 - 83  62.5     0 0.0000    1359  0.0356  36740 0.9643
##   84 - 125 104.5     0 0.0000    1359  0.0356  36740 0.9643
##  126 - 167 146.5     0 0.0000    1359  0.0356  36740 0.9643
##  168 - 209 188.5     0 0.0000    1359  0.0356  36740 0.9643
##  210 - 251 230.5     0 0.0000    1359  0.0356  36740 0.9643
##  252 - 293 272.5    20 0.0005    1359  0.0356  36760 0.9648
##  294 - 335 314.5    31 0.0008    1339  0.0351  36791 0.9656
##  336 - 377 356.5   113 0.0030    1308  0.0343  36904 0.9686
##  378 - 419 398.5   183 0.0048    1195  0.0313  37087 0.9734
##  420 - 461 440.5   172 0.0045    1012  0.0265  37259 0.9779
##  462 - 503 482.5   183 0.0048     840  0.0220  37442 0.9827
##  504 - 545 524.5   154 0.0040     657  0.0172  37596 0.9867
##  546 - 587 566.5   242 0.0064     503  0.0132  37838 0.9931
##  588 - 629 608.5   194 0.0051     261  0.0068  38032 0.9982
##  630 - 671 650.5    16 0.0004      67  0.0017  38048 0.9986
##  672 - 713 692.5    51 0.0013      51  0.0013  38099 0.9999
# Histograma manual con las frecuencias absolutas
barplot(height = ni,
        names.arg = tabla_frecuencia$Intervalo,
        main = "Histograma: Tailpipe CO2 (g/mi) FT2",
        xlab = "Emisión de CO2 (g/mi)FT2",
        ylab = "Frecuencia absoluta",
        col = "skyblue",
        las = 2,
        cex.names = 0.7,
        ylim = c(0, max(ni) + 5))

# Ojivas (ascendente y descendente) con líneas conectadas
plot(tabla_frecuencia$MC, tabla_frecuencia$Ni_asc,
     type = "o", col = "green",
     main = "OjivasFrecuencias acumuladas de Tailpipe CO2 (g/mi) FT2",
     xlab = "Emisión de CO2 (g/mi)FT2",
     ylab = "Frecuencia acumulada",
     ylim = c(0, max(tabla_frecuencia$Ni_asc) + 5),
     pch = 16)

lines(tabla_frecuencia$MC, tabla_frecuencia$Ni_desc,
      type = "o", col = "red", pch = 17)

legend("bottomright",
       legend = c("Ojiva Ascendente", "Ojiva Descendente"),
       col = c("green", "red"),
       pch = c(16, 17),
       lty = 1)

# Diagrama de caja (boxplot)
boxplot(variable,
        horizontal = TRUE,
        col = "orange",
        main = "Diagrama de Caja: Tailpipe CO2 (g/mi) FT2",
        xlab = "Emisión de CO2 (g/mi)FT2")

35 2D Passenger Volumen

# Seleccionar la variable continua
variable <- na.omit(datos$X2D.Passenger.Volume)

# Número de datos y número de intervalos (regla de Sturges)
n <- length(variable)
k <- ceiling(1 + 3.322 * log10(n))

# Calcular rango y amplitud del intervalo
R <- max(variable) - min(variable)
A <- ceiling(R / k)

# Límites inferiores
lim_inf <- seq(from = min(variable), by = A, length.out = k)

# Límites superiores (el último se ajusta al máximo real)
lim_sup <- c(lim_inf[-1], max(variable) + 1e-4)

# Marcas de clase (punto medio)
MC <- (lim_inf + lim_sup) / 2

# Frecuencias absolutas
ni <- numeric(k)
for (i in 1:k) {
  if (i == k) {
    ni[i] <- sum(variable >= lim_inf[i] & variable <= lim_sup[i])  # Incluye el último valor
  } else {
    ni[i] <- sum(variable >= lim_inf[i] & variable < lim_sup[i])
  }
}

# Frecuencia relativa
hi <- round(ni / sum(ni), 4)

# Frecuencias acumuladas
Ni_asc <- cumsum(ni)
Fi_asc <- round(cumsum(hi), 4)
Ni_desc <- rev(cumsum(rev(ni)))
Fi_desc <- round(rev(cumsum(rev(hi))), 4)

# Crear tabla de frecuencia
tabla_frecuencia <- data.frame(
  Intervalo = paste0(round(lim_inf, 2), " - ", round(lim_sup, 2)),
  MC = round(MC, 2),
  ni = ni,
  hi = hi,
  Ni_desc = Ni_desc,
  Fi_desc = Fi_desc,
  Ni_asc = Ni_asc,
  Fi_asc = Fi_asc
)

# Mostrar tabla
print(tabla_frecuencia, row.names = FALSE)
##  Intervalo  MC    ni     hi Ni_desc Fi_desc Ni_asc Fi_asc
##     0 - 12   6 31881 0.8365   38113  1.0000  31881 0.8365
##    12 - 24  18     0 0.0000    6232  0.1635  31881 0.8365
##    24 - 36  30     1 0.0000    6232  0.1635  31882 0.8365
##    36 - 48  42    22 0.0006    6231  0.1635  31904 0.8371
##    48 - 60  54   183 0.0048    6209  0.1629  32087 0.8419
##    60 - 72  66   552 0.0145    6026  0.1581  32639 0.8564
##    72 - 84  78  2048 0.0537    5474  0.1436  34687 0.9101
##    84 - 96  90  2714 0.0712    3426  0.0899  37401 0.9813
##   96 - 108 102   668 0.0175     712  0.0187  38069 0.9988
##  108 - 120 114    37 0.0010      44  0.0012  38106 0.9998
##  120 - 132 126     0 0.0000       7  0.0002  38106 0.9998
##  132 - 144 138     0 0.0000       7  0.0002  38106 0.9998
##  144 - 156 150     0 0.0000       7  0.0002  38106 0.9998
##  156 - 168 162     0 0.0000       7  0.0002  38106 0.9998
##  168 - 180 174     0 0.0000       7  0.0002  38106 0.9998
##  180 - 192 186     0 0.0000       7  0.0002  38106 0.9998
##  192 - 194 193     7 0.0002       7  0.0002  38113 1.0000
# Histograma manual con las frecuencias absolutas
barplot(height = ni,
        names.arg = tabla_frecuencia$Intervalo,
        main = "Histograma: 2D Passenger Volumen",
        xlab = "Volumen de pasajeros 2D",
        ylab = "Frecuencia absoluta",
        col = "skyblue",
        las = 2,
        cex.names = 0.7,
        ylim = c(0, max(ni) + 5))

# Ojivas (ascendente y descendente)
plot(tabla_frecuencia$MC, tabla_frecuencia$Ni_asc,
     type = "o", col = "green",
     main = "Ojivas: Frecuencias acumuladas de 2D Passenger Volumen",
     xlab = "Volumen de pasajeros 2D",
     ylab = "Frecuencia acumulada",
     ylim = c(0, max(tabla_frecuencia$Ni_asc) + 5),
     pch = 16)

lines(tabla_frecuencia$MC, tabla_frecuencia$Ni_desc,
      type = "o", col = "red", pch = 17)

legend("bottomright",
       legend = c("Ojiva Ascendente", "Ojiva Descendente"),
       col = c("green", "red"),
       pch = c(16, 17),
       lty = 1)

# Diagrama de caja (boxplot)
boxplot(variable,
        horizontal = TRUE,
        col = "orange",
        main = "Diagrama de Caja:2D Passenger Volumen",
        xlab = "Volumen de pasajeros 2D")

36 2D Luggage Volumen

# Seleccionar la variable continua
variable <- na.omit(datos$X2D.Luggage.Volume)

# Número de datos y número de intervalos (regla de Sturges)
n <- length(variable)
k <- ceiling(1 + 3.322 * log10(n))

# Calcular rango y amplitud del intervalo
R <- max(variable) - min(variable)
A <- ceiling(R / k)

# Límites inferiores
lim_inf <- seq(from = min(variable), by = A, length.out = k)

# Límites superiores (el último se ajusta al máximo real)
lim_sup <- c(lim_inf[-1], max(variable) + 1e-4)

# Marcas de clase (punto medio)
MC <- (lim_inf + lim_sup) / 2

# Frecuencias absolutas
ni <- numeric(k)
for (i in 1:k) {
  if (i == k) {
    ni[i] <- sum(variable >= lim_inf[i] & variable <= lim_sup[i])  # Incluye el último valor
  } else {
    ni[i] <- sum(variable >= lim_inf[i] & variable < lim_sup[i])
  }
}

# Frecuencia relativa
hi <- round(ni / sum(ni), 4)

# Frecuencias acumuladas
Ni_asc <- cumsum(ni)
Fi_asc <- round(cumsum(hi), 4)
Ni_desc <- rev(cumsum(rev(ni)))
Fi_desc <- round(rev(cumsum(rev(hi))), 4)

# Crear tabla de frecuencia
tabla_frecuencia <- data.frame(
  Intervalo = paste0(round(lim_inf, 2), " - ", round(lim_sup, 2)),
  MC = round(MC, 2),
  ni = ni,
  hi = hi,
  Ni_desc = Ni_desc,
  Fi_desc = Fi_desc,
  Ni_asc = Ni_asc,
  Fi_asc = Fi_asc
)

# Mostrar tabla
print(tabla_frecuencia, row.names = FALSE)
##  Intervalo   MC    ni     hi Ni_desc Fi_desc Ni_asc Fi_asc
##      0 - 3  1.5 31851 0.8357   38113  1.0001  31851 0.8357
##      3 - 6  4.5   678 0.0178    6262  0.1644  32529 0.8535
##      6 - 9  7.5   698 0.0183    5584  0.1466  33227 0.8718
##     9 - 12 10.5  1745 0.0458    4886  0.1283  34972 0.9176
##    12 - 15 13.5  2064 0.0542    3141  0.0825  37036 0.9718
##    15 - 18 16.5   955 0.0251    1077  0.0283  37991 0.9969
##    18 - 21 19.5    23 0.0006     122  0.0032  38014 0.9975
##    21 - 24 22.5    78 0.0020      99  0.0026  38092 0.9995
##    24 - 27 25.5     3 0.0001      21  0.0006  38095 0.9996
##    27 - 30 28.5     0 0.0000      18  0.0005  38095 0.9996
##    30 - 33 31.5    11 0.0003      18  0.0005  38106 0.9999
##    33 - 36 34.5     4 0.0001       7  0.0002  38110 1.0000
##    36 - 39 37.5     2 0.0001       3  0.0001  38112 1.0001
##    39 - 42 40.5     1 0.0000       1  0.0000  38113 1.0001
##    42 - 45 43.5     0 0.0000       0  0.0000  38113 1.0001
##    45 - 48 46.5     0 0.0000       0  0.0000  38113 1.0001
##    48 - 41 44.5     0 0.0000       0  0.0000  38113 1.0001
# Histograma manual con las frecuencias absolutas
barplot(height = ni,
        names.arg = tabla_frecuencia$Intervalo,
        main = "Histograma:2D Luggage Volumen",
        xlab = "Volumen de equipaje 2D",
        ylab = "Frecuencia absoluta",
        col = "skyblue",
        las = 2,
        cex.names = 0.7,
        ylim = c(0, max(ni) + 5))

# Ojivas (ascendente y descendente)
plot(tabla_frecuencia$MC, tabla_frecuencia$Ni_asc,
     type = "o", col = "green",
     main = "Ojivas: Frecuencias acumuladas de 2D Luggage Volumen",
     xlab = "Volumen de equipaje 2D",
     ylab = "Frecuencia acumulada",
     ylim = c(0, max(tabla_frecuencia$Ni_asc) + 5),
     pch = 16)

lines(tabla_frecuencia$MC, tabla_frecuencia$Ni_desc,
      type = "o", col = "red", pch = 17)

legend("bottomright",
       legend = c("Ojiva Ascendente", "Ojiva Descendente"),
       col = c("green", "red"),
       pch = c(16, 17),
       lty = 1)

# Diagrama de caja (boxplot)
boxplot(variable,
        horizontal = TRUE,
        col = "orange",
        main = "Diagrama de Caja:2D Luggage Volumen",
        xlab = "Volumen de equipaje 2D")

37 4D Passenger Volumen

# Seleccionar la variable continua
variable <- na.omit(datos$X4D.Passenger.Volume)

# Número de datos y número de intervalos (regla de Sturges)
n <- length(variable)
k <- ceiling(1 + 3.322 * log10(n))

# Calcular rango y amplitud del intervalo
R <- max(variable) - min(variable)
A <- ceiling(R / k)

# Límites inferiores
lim_inf <- seq(from = min(variable), by = A, length.out = k)

# Límites superiores (el último se ajusta al máximo real)
lim_sup <- c(lim_inf[-1], max(variable) + 1e-4)

# Marcas de clase (punto medio)
MC <- (lim_inf + lim_sup) / 2

# Frecuencias absolutas
ni <- numeric(k)
for (i in 1:k) {
  if (i == k) {
    ni[i] <- sum(variable >= lim_inf[i] & variable <= lim_sup[i])  # Incluye el último valor
  } else {
    ni[i] <- sum(variable >= lim_inf[i] & variable < lim_sup[i])
  }
}

# Frecuencia relativa
hi <- round(ni / sum(ni), 4)

# Frecuencias acumuladas
Ni_asc <- cumsum(ni)
Fi_asc <- round(cumsum(hi), 4)
Ni_desc <- rev(cumsum(rev(ni)))
Fi_desc <- round(rev(cumsum(rev(hi))), 4)

# Crear tabla de frecuencia
tabla_frecuencia <- data.frame(
  Intervalo = paste0(round(lim_inf, 2), " - ", round(lim_sup, 2)),
  MC = round(MC, 2),
  ni = ni,
  hi = hi,
  Ni_desc = Ni_desc,
  Fi_desc = Fi_desc,
  Ni_asc = Ni_asc,
  Fi_asc = Fi_asc
)

# Mostrar tabla
print(tabla_frecuencia, row.names = FALSE)
##  Intervalo  MC    ni     hi Ni_desc Fi_desc Ni_asc Fi_asc
##     0 - 12   6 24632 0.6463   38113  1.0000  24632 0.6463
##    12 - 24  18     0 0.0000   13481  0.3537  24632 0.6463
##    24 - 36  30     0 0.0000   13481  0.3537  24632 0.6463
##    36 - 48  42     0 0.0000   13481  0.3537  24632 0.6463
##    48 - 60  54    18 0.0005   13481  0.3537  24650 0.6468
##    60 - 72  66    16 0.0004   13463  0.3532  24666 0.6472
##    72 - 84  78   522 0.0137   13447  0.3528  25188 0.6609
##    84 - 96  90  6555 0.1720   12925  0.3391  31743 0.8329
##   96 - 108 102  5348 0.1403    6370  0.1671  37091 0.9732
##  108 - 120 114   922 0.0242    1022  0.0268  38013 0.9974
##  120 - 132 126    58 0.0015     100  0.0026  38071 0.9989
##  132 - 144 138    19 0.0005      42  0.0011  38090 0.9994
##  144 - 156 150    17 0.0004      23  0.0006  38107 0.9998
##  156 - 168 162     2 0.0001       6  0.0002  38109 0.9999
##  168 - 180 174     1 0.0000       4  0.0001  38110 0.9999
##  180 - 192 186     2 0.0001       3  0.0001  38112 1.0000
##  192 - 192 192     1 0.0000       1  0.0000  38113 1.0000
# Histograma manual con las frecuencias absolutas
barplot(height = ni,
        names.arg = tabla_frecuencia$Intervalo,
        main = "Histograma: 4D Passenger Volumen",
        xlab = "Volumen de pasajeros 4D",
        ylab = "Frecuencia absoluta",
        col = "skyblue",
        las = 2,
        cex.names = 0.7,
        ylim = c(0, max(ni) + 5))

# Ojivas (ascendente y descendente)
plot(tabla_frecuencia$MC, tabla_frecuencia$Ni_asc,
     type = "o", col = "green",
     main = "Ojivas: Frecuencias acumuladas de 4D Passenger Volumen",
     xlab = "Volumen de pasajeros 4D",
     ylab = "Frecuencia acumulada",
     ylim = c(0, max(tabla_frecuencia$Ni_asc) + 5),
     pch = 16)

lines(tabla_frecuencia$MC, tabla_frecuencia$Ni_desc,
      type = "o", col = "red", pch = 17)

legend("bottomright",
       legend = c("Ojiva Ascendente", "Ojiva Descendente"),
       col = c("green", "red"),
       pch = c(16, 17),
       lty = 1)

# Diagrama de caja (boxplot)
boxplot(variable,
        horizontal = TRUE,
        col = "orange",
        main = "Diagrama de Caja:4D Passenger Volumen",
        xlab = "Volumen de pasajeros 4D")

38 4D Luggage Volumen

# Filtrar los NA desde el origen: solo filas con dato válido en la variable
datos_limpios <- datos[!is.na(datos$X4D.Luggage.Volume), ]

# Seleccionar la variable continua limpia
variable <- datos_limpios$X4D.Luggage.Volume

# Número de datos y número de intervalos (regla de Sturges)
n <- length(variable)
k <- ceiling(1 + 3.322 * log10(n))

# Calcular rango y amplitud del intervalo
R <- max(variable) - min(variable)
A <- ceiling(R / k)

# Límites inferiores
lim_inf <- seq(from = min(variable), by = A, length.out = k)

# Límites superiores
lim_sup <- c(lim_inf[-1], max(variable) + 1e-4)

# Marcas de clase
MC <- (lim_inf + lim_sup) / 2

# Frecuencias absolutas
ni <- numeric(k)
for (i in 1:k) {
  if (i == k) {
    ni[i] <- sum(variable >= lim_inf[i] & variable <= lim_sup[i])
  } else {
    ni[i] <- sum(variable >= lim_inf[i] & variable < lim_sup[i])
  }
}

# Frecuencia relativa
hi <- round(ni / sum(ni), 4)

# Frecuencias acumuladas
Ni_asc <- cumsum(ni)
Fi_asc <- round(cumsum(hi), 4)
Ni_desc <- rev(cumsum(rev(ni)))
Fi_desc <- round(rev(cumsum(rev(hi))), 4)

# Crear tabla de frecuencia SIN NA
tabla_frecuencia <- data.frame(
  Intervalo = paste0(round(lim_inf, 2), " - ", round(lim_sup, 2)),
  MC = round(MC, 2),
  ni = ni,
  hi = hi,
  Ni_desc = Ni_desc,
  Fi_desc = Fi_desc,
  Ni_asc = Ni_asc,
  Fi_asc = Fi_asc,
  stringsAsFactors = FALSE
)

# Mostrar tabla
print(tabla_frecuencia, row.names = FALSE)
##  Intervalo   MC    ni     hi Ni_desc Fi_desc Ni_asc Fi_asc
##      0 - 4  2.0 24645 0.6466   38113  1.0002  24645 0.6466
##      4 - 8  6.0    79 0.0021   13468  0.3536  24724 0.6487
##     8 - 12 10.0  1670 0.0438   13389  0.3515  26394 0.6925
##    12 - 16 14.0  6333 0.1662   11719  0.3077  32727 0.8587
##    16 - 20 18.0  2716 0.0713    5386  0.1415  35443 0.9300
##    20 - 24 22.0   576 0.0151    2670  0.0702  36019 0.9451
##    24 - 28 26.0   258 0.0068    2094  0.0551  36277 0.9519
##    28 - 32 30.0   448 0.0118    1836  0.0483  36725 0.9637
##    32 - 36 34.0   508 0.0133    1388  0.0365  37233 0.9770
##    36 - 40 38.0   392 0.0103     880  0.0232  37625 0.9873
##    40 - 44 42.0   296 0.0078     488  0.0129  37921 0.9951
##    44 - 48 46.0    68 0.0018     192  0.0051  37989 0.9969
##    48 - 52 50.0    57 0.0015     124  0.0033  38046 0.9984
##    52 - 56 54.0    67 0.0018      67  0.0018  38113 1.0002
##    56 - 60 58.0     0 0.0000       0  0.0000  38113 1.0002
##    60 - 64 62.0     0 0.0000       0  0.0000  38113 1.0002
##    64 - 55 59.5     0 0.0000       0  0.0000  38113 1.0002
# Histograma manual con las frecuencias absolutas
barplot(height = ni,
        names.arg = tabla_frecuencia$Intervalo,
        main = "Histograma: 4D Luggage Volume",
        xlab = "Volumen de equipaje 4D",
        ylab = "Frecuencia absoluta",
        col = "skyblue",
        las = 2,
        cex.names = 0.7,
        ylim = c(0, max(ni) + 5))

# Ojivas (ascendente y descendente)
plot(tabla_frecuencia$MC, tabla_frecuencia$Ni_asc,
     type = "o", col = "green",
     main = "Ojivas: Frecuencias acumuladas de 4D Luggage Volume",
     xlab = "Volumen de equipaje 4D",
     ylab = "Frecuencia acumulada",
     ylim = c(0, max(tabla_frecuencia$Ni_asc) + 5),
     pch = 16)

lines(tabla_frecuencia$MC, tabla_frecuencia$Ni_desc,
      type = "o", col = "red", pch = 17)

legend("bottomright",
       legend = c("Ojiva Ascendente", "Ojiva Descendente"),
       col = c("green", "red"),
       pch = c(16, 17),
       lty = 1)

# Diagrama de caja (boxplot)
boxplot(variable,
        horizontal = TRUE,
        col = "orange",
        main = "Diagrama de Caja: 4D Luggage Volume",
        xlab = "Volumen de equipaje 4D")

39 Hatchback Passenger Volumen

# Seleccionar la variable continua
variable <- na.omit(datos$Hatchback.Passenger.Volume)

# Número de datos y número de intervalos (regla de Sturges)
n <- length(variable)
k <- ceiling(1 + 3.322 * log10(n))

# Calcular rango y amplitud del intervalo
R <- max(variable) - min(variable)
A <- ceiling(R / k)

# Límites inferiores
lim_inf <- seq(from = min(variable), by = A, length.out = k)

# Límites superiores (el último se ajusta al máximo real)
lim_sup <- c(lim_inf[-1], max(variable) + 1e-4)

# Marcas de clase (punto medio)
MC <- (lim_inf + lim_sup) / 2

# Frecuencias absolutas
ni <- numeric(k)
for (i in 1:k) {
  if (i == k) {
    ni[i] <- sum(variable >= lim_inf[i] & variable <= lim_sup[i])  # Incluye el último valor
  } else {
    ni[i] <- sum(variable >= lim_inf[i] & variable < lim_sup[i])
  }
}

# Frecuencia relativa
hi <- round(ni / sum(ni), 4)

# Frecuencias acumuladas
Ni_asc <- cumsum(ni)
Fi_asc <- round(cumsum(hi), 4)
Ni_desc <- rev(cumsum(rev(ni)))
Fi_desc <- round(rev(cumsum(rev(hi))), 4)

# Crear tabla de frecuencia
tabla_frecuencia <- data.frame(
  Intervalo = paste0(round(lim_inf, 2), " - ", round(lim_sup, 2)),
  MC = round(MC, 2),
  ni = ni,
  hi = hi,
  Ni_desc = Ni_desc,
  Fi_desc = Fi_desc,
  Ni_asc = Ni_asc,
  Fi_asc = Fi_asc
)

# Mostrar tabla
print(tabla_frecuencia, row.names = FALSE)
##  Intervalo    MC    ni     hi Ni_desc Fi_desc Ni_asc Fi_asc
##     0 - 12   6.0 33473 0.8783   38113  1.0001  33473 0.8783
##    12 - 24  18.0     0 0.0000    4640  0.1218  33473 0.8783
##    24 - 36  30.0     0 0.0000    4640  0.1218  33473 0.8783
##    36 - 48  42.0     0 0.0000    4640  0.1218  33473 0.8783
##    48 - 60  54.0    48 0.0013    4640  0.1218  33521 0.8796
##    60 - 72  66.0   100 0.0026    4592  0.1205  33621 0.8822
##    72 - 84  78.0  1608 0.0422    4492  0.1179  35229 0.9244
##    84 - 96  90.0  2347 0.0616    2884  0.0757  37576 0.9860
##   96 - 108 102.0   515 0.0135     537  0.0141  38091 0.9995
##  108 - 120 114.0    14 0.0004      22  0.0006  38105 0.9999
##  120 - 132 126.0     4 0.0001       8  0.0002  38109 1.0000
##  132 - 144 138.0     0 0.0000       4  0.0001  38109 1.0000
##  144 - 156 150.0     0 0.0000       4  0.0001  38109 1.0000
##  156 - 168 162.0     0 0.0000       4  0.0001  38109 1.0000
##  168 - 180 174.0     0 0.0000       4  0.0001  38109 1.0000
##  180 - 192 186.0     0 0.0000       4  0.0001  38109 1.0000
##  192 - 195 193.5     4 0.0001       4  0.0001  38113 1.0001
# Histograma manual con las frecuencias absolutas
barplot(height = ni,
        names.arg = tabla_frecuencia$Intervalo,
        main = "Histograma:Hatchback Passenger Volumen",
        xlab = "Volumen de pasajeros del hatchback",
        ylab = "Frecuencia absoluta",
        col = "skyblue",
        las = 2,
        cex.names = 0.7,
        ylim = c(0, max(ni) + 5))

# Ojivas (ascendente y descendente)
plot(tabla_frecuencia$MC, tabla_frecuencia$Ni_asc,
     type = "o", col = "green",
     main = "Ojivas: Frecuencias acumuladas de Hatchback Passenger Volumen",
     xlab = "Volumen de pasajeros del hatchback",
     ylab = "Frecuencia acumulada",
     ylim = c(0, max(tabla_frecuencia$Ni_asc) + 5),
     pch = 16)

lines(tabla_frecuencia$MC, tabla_frecuencia$Ni_desc,
      type = "o", col = "red", pch = 17)

legend("bottomright",
       legend = c("Ojiva Ascendente", "Ojiva Descendente"),
       col = c("green", "red"),
       pch = c(16, 17),
       lty = 1)

# Diagrama de caja (boxplot)
boxplot(variable,
        horizontal = TRUE,
        col = "orange",
        main = "Diagrama de Caja:Hatchback Passenger Volumen",
        xlab = "Volumen de pasajeros del hatchback")

40 Hatchback Luggage Volumen

# Seleccionar la variable continua
variable <- na.omit(datos$Hatchback.Luggage.Volume)

# Número de datos y número de intervalos (regla de Sturges)
n <- length(variable)
k <- ceiling(1 + 3.322 * log10(n))

# Calcular rango y amplitud del intervalo
R <- max(variable) - min(variable)
A <- ceiling(R / k)

# Límites inferiores
lim_inf <- seq(from = min(variable), by = A, length.out = k)

# Límites superiores (el último se ajusta al máximo real)
lim_sup <- c(lim_inf[-1], max(variable) + 1e-4)

# Marcas de clase (punto medio)
MC <- (lim_inf + lim_sup) / 2

# Frecuencias absolutas
ni <- numeric(k)
for (i in 1:k) {
  if (i == k) {
    ni[i] <- sum(variable >= lim_inf[i] & variable <= lim_sup[i])  # Incluye el último valor
  } else {
    ni[i] <- sum(variable >= lim_inf[i] & variable < lim_sup[i])
  }
}

# Frecuencia relativa
hi <- round(ni / sum(ni), 4)

# Frecuencias acumuladas
Ni_asc <- cumsum(ni)
Fi_asc <- round(cumsum(hi), 4)
Ni_desc <- rev(cumsum(rev(ni)))
Fi_desc <- round(rev(cumsum(rev(hi))), 4)

# Crear tabla de frecuencia
tabla_frecuencia <- data.frame(
  Intervalo = paste0(round(lim_inf, 2), " - ", round(lim_sup, 2)),
  MC = round(MC, 2),
  ni = ni,
  hi = hi,
  Ni_desc = Ni_desc,
  Fi_desc = Fi_desc,
  Ni_asc = Ni_asc,
  Fi_asc = Fi_asc
)

# Mostrar tabla
print(tabla_frecuencia, row.names = FALSE)
##  Intervalo   MC    ni     hi Ni_desc Fi_desc Ni_asc Fi_asc
##      0 - 3  1.5 33472 0.8782   38113  1.0000  33472 0.8782
##      3 - 6  4.5    30 0.0008    4641  0.1218  33502 0.8790
##      6 - 9  7.5   226 0.0059    4611  0.1210  33728 0.8849
##     9 - 12 10.5   537 0.0141    4385  0.1151  34265 0.8990
##    12 - 15 13.5  1086 0.0285    3848  0.1010  35351 0.9275
##    15 - 18 16.5  1350 0.0354    2762  0.0725  36701 0.9629
##    18 - 21 19.5   549 0.0144    1412  0.0371  37250 0.9773
##    21 - 24 22.5   339 0.0089     863  0.0227  37589 0.9862
##    24 - 27 25.5   183 0.0048     524  0.0138  37772 0.9910
##    27 - 30 28.5    10 0.0003     341  0.0090  37782 0.9913
##    30 - 33 31.5    54 0.0014     331  0.0087  37836 0.9927
##    33 - 36 34.5   109 0.0029     277  0.0073  37945 0.9956
##    36 - 39 37.5    76 0.0020     168  0.0044  38021 0.9976
##    39 - 42 40.5    54 0.0014      92  0.0024  38075 0.9990
##    42 - 45 43.5    28 0.0007      38  0.0010  38103 0.9997
##    45 - 48 46.5     8 0.0002      10  0.0003  38111 0.9999
##    48 - 49 48.5     2 0.0001       2  0.0001  38113 1.0000
# Histograma manual con las frecuencias absolutas
barplot(height = ni,
        names.arg = tabla_frecuencia$Intervalo,
        main = "Histograma:Hatchback Luggage Volumen",
        xlab = "Volumen de equipaje del hatchback",
        ylab = "Frecuencia absoluta",
        col = "skyblue",
        las = 2,
        cex.names = 0.7,
        ylim = c(0, max(ni) + 5))

# Ojivas (ascendente y descendente)
plot(tabla_frecuencia$MC, tabla_frecuencia$Ni_asc,
     type = "o", col = "green",
     main = "Ojivas: Frecuencias acumuladas de Hatchback Luggage Volumen",
     xlab = "Volumen de equipaje del hatchback",
     ylab = "Frecuencia acumulada",
     ylim = c(0, max(tabla_frecuencia$Ni_asc) + 5),
     pch = 16)

lines(tabla_frecuencia$MC, tabla_frecuencia$Ni_desc,
      type = "o", col = "red", pch = 17)

legend("bottomright",
       legend = c("Ojiva Ascendente", "Ojiva Descendente"),
       col = c("green", "red"),
       pch = c(16, 17),
       lty = 1)

# Diagrama de caja (boxplot)
boxplot(variable,
        horizontal = TRUE,
        col = "orange",
        main = "Diagrama de Caja:Hatchback Luggage Volumen",
        xlab = "Volumen de equipaje del hatchback")

41 Composite City MPG

# Seleccionar la variable continua
variable <- na.omit(datos$Composite.City.MPG)

# Número de intervalos fijo
n <- length(variable)
k <- ceiling(1 + 3.322 * log10(n))

# Calcular rango y amplitud
R <- max(variable) - min(variable)
A <- ceiling(R / k)

# Límites inferiores y superiores
lim_inf <- seq(from = min(variable), by = A, length.out = k)
lim_sup <- lim_inf + A - 1  # corregido para evitar superposición

# Marcas de clase
MC <- (lim_inf + lim_sup) / 2

# Frecuencias absolutas
ni <- numeric(k)
for (i in 1:k) {
  if (i == k) {
    ni[i] <- sum(variable >= lim_inf[i] & variable <= lim_sup[i])
  } else {
    ni[i] <- sum(variable >= lim_inf[i] & variable < lim_sup[i])
  }
}

# Frecuencia relativa
hi <- round(ni / sum(ni), 4)

# Frecuencias acumuladas
Ni_asc <- cumsum(ni)
Fi_asc <- round(cumsum(hi), 4)
Ni_desc <- rev(cumsum(rev(ni)))
Fi_desc <- round(rev(cumsum(rev(hi))), 4)

# Crear tabla
tabla_frecuencia <- data.frame(
  Intervalo = paste0(round(lim_inf, 2), " - ", round(lim_sup, 2)),
  MC = round(MC, 2),
  ni = ni,
  hi = hi,
  Ni_desc = Ni_desc,
  Fi_desc = Fi_desc,
  Ni_asc = Ni_asc,
  Fi_asc = Fi_asc
)

# Mostrar tabla
print(tabla_frecuencia, row.names = FALSE)
##  Intervalo   MC    ni     hi Ni_desc Fi_desc Ni_asc Fi_asc
##      0 - 5  2.5 38048 0.9985   38104  1.0002  38048 0.9985
##     6 - 11  8.5     0 0.0000      56  0.0017  38048 0.9985
##    12 - 17 14.5     2 0.0001      56  0.0017  38050 0.9986
##    18 - 23 20.5     0 0.0000      54  0.0016  38050 0.9986
##    24 - 29 26.5    15 0.0004      54  0.0016  38065 0.9990
##    30 - 35 32.5     4 0.0001      39  0.0012  38069 0.9991
##    36 - 41 38.5     4 0.0001      35  0.0011  38073 0.9992
##    42 - 47 44.5     2 0.0001      31  0.0010  38075 0.9993
##    48 - 53 50.5     2 0.0001      29  0.0009  38077 0.9994
##    54 - 59 56.5    18 0.0005      27  0.0008  38095 0.9999
##    60 - 65 62.5     4 0.0001       9  0.0003  38099 1.0000
##    66 - 71 68.5     0 0.0000       5  0.0002  38099 1.0000
##    72 - 77 74.5     0 0.0000       5  0.0002  38099 1.0000
##    78 - 83 80.5     2 0.0001       5  0.0002  38101 1.0001
##    84 - 89 86.5     0 0.0000       3  0.0001  38101 1.0001
##    90 - 95 92.5     0 0.0000       3  0.0001  38101 1.0001
##   96 - 101 98.5     3 0.0001       3  0.0001  38104 1.0002
# Histograma manual con las frecuencias absolutas
barplot(tabla_frecuencia$ni,
        main = "Histograma: Composite City MPG",
        xlab = "MPG urbano compuesto",
        ylab = "Frecuencia absoluta",
        col = "skyblue",
        names.arg = tabla_frecuencia$Intervalo,
        las = 2,
        cex.names = 0.7,
        ylim = c(0, max(tabla_frecuencia$ni) + 5))

# Ojivas (ascendente y descendente) con líneas conectadas
plot(tabla_frecuencia$MC, tabla_frecuencia$Ni_asc,
     type = "o", col = "green",
     main = "OjivasFrecuencias acumuladas de Composite City MPG",
     xlab = "MPG urbano compuesto ",
     ylab = "Frecuencia acumulada",
     ylim = c(0, max(tabla_frecuencia$Ni_asc) + 5),
     pch = 16)

lines(tabla_frecuencia$MC, tabla_frecuencia$Ni_desc,
      type = "o", col = "red", pch = 17)

legend("bottomright",
       legend = c("Ojiva Ascendente", "Ojiva Descendente"),
       col = c("green", "red"),
       pch = c(16, 17),
       lty = 1)

# Diagrama de caja (boxplot)
boxplot(variable,
        horizontal = TRUE,
        col = "orange",
        main = "Diagrama de Caja:Composite City MPG",
        xlab = "MPG urbano compuesto")

42 Composite Highway MPG

# Seleccionar la variable continua
variable <- na.omit(datos$Composite.Highway.MPG)

# Número de intervalos fijo
n <- length(variable)
k <- ceiling(1 + 3.322 * log10(n))

# Calcular rango y amplitud
R <- max(variable) - min(variable)
A <- ceiling(R / k)

# Límites inferiores y superiores
lim_inf <- seq(from = min(variable), by = A, length.out = k)
lim_sup <- lim_inf + A - 1  # corregido para evitar superposición

# Marcas de clase
MC <- (lim_inf + lim_sup) / 2

# Frecuencias absolutas
ni <- numeric(k)
for (i in 1:k) {
  if (i == k) {
    ni[i] <- sum(variable >= lim_inf[i] & variable <= lim_sup[i])
  } else {
    ni[i] <- sum(variable >= lim_inf[i] & variable < lim_sup[i])
  }
}

# Frecuencia relativa
hi <- round(ni / sum(ni), 4)

# Frecuencias acumuladas
Ni_asc <- cumsum(ni)
Fi_asc <- round(cumsum(hi), 4)
Ni_desc <- rev(cumsum(rev(ni)))
Fi_desc <- round(rev(cumsum(rev(hi))), 4)

# Crear tabla
tabla_frecuencia <- data.frame(
  Intervalo = paste0(round(lim_inf, 2), " - ", round(lim_sup, 2)),
  MC = round(MC, 2),
  ni = ni,
  hi = hi,
  Ni_desc = Ni_desc,
  Fi_desc = Fi_desc,
  Ni_asc = Ni_asc,
  Fi_asc = Fi_asc
)

# Mostrar tabla
print(tabla_frecuencia, row.names = FALSE)
##  Intervalo MC    ni     hi Ni_desc Fi_desc Ni_asc Fi_asc
##      0 - 4  2 38048 0.9986   38102  1.0001  38048 0.9986
##      5 - 9  7     0 0.0000      54  0.0015  38048 0.9986
##    10 - 14 12     0 0.0000      54  0.0015  38048 0.9986
##    15 - 19 17     0 0.0000      54  0.0015  38048 0.9986
##    20 - 24 22     2 0.0001      54  0.0015  38050 0.9987
##    25 - 29 27     4 0.0001      52  0.0014  38054 0.9988
##    30 - 34 32     4 0.0001      48  0.0013  38058 0.9989
##    35 - 39 37    12 0.0003      44  0.0012  38070 0.9992
##    40 - 44 42     1 0.0000      32  0.0009  38071 0.9992
##    45 - 49 47    10 0.0003      31  0.0009  38081 0.9995
##    50 - 54 52     3 0.0001      21  0.0006  38084 0.9996
##    55 - 59 57     7 0.0002      18  0.0005  38091 0.9998
##    60 - 64 62     6 0.0002      11  0.0003  38097 1.0000
##    65 - 69 67     1 0.0000       5  0.0001  38098 1.0000
##    70 - 74 72     3 0.0001       4  0.0001  38101 1.0001
##    75 - 79 77     0 0.0000       1  0.0000  38101 1.0001
##    80 - 84 82     1 0.0000       1  0.0000  38102 1.0001
# Histograma manual con las frecuencias absolutas
barplot(tabla_frecuencia$ni,
        main = "Histograma: Composite Highway MPG",
        xlab = "MPG compuesto en carretera",
        ylab = "Frecuencia absoluta",
        col = "skyblue",
        names.arg = tabla_frecuencia$Intervalo,
        las = 2,
        cex.names = 0.7,
        ylim = c(0, max(tabla_frecuencia$ni) + 5))

# Ojivas (ascendente y descendente) con líneas conectadas
plot(tabla_frecuencia$MC, tabla_frecuencia$Ni_asc,
     type = "o", col = "green",
     main = "OjivasFrecuencias acumuladas de Composite Highway MPG",
     xlab = "MPG compuesto en carretera",
     ylab = "Frecuencia acumulada",
     ylim = c(0, max(tabla_frecuencia$Ni_asc) + 5),
     pch = 16)


lines(tabla_frecuencia$MC, tabla_frecuencia$Ni_desc,
      type = "o", col = "red", pch = 17)

legend("bottomright",
       legend = c("Ojiva Ascendente", "Ojiva Descendente"),
       col = c("green", "red"),
       pch = c(16, 17),
       lty = 1)

# Diagrama de caja (boxplot)
boxplot(variable,
        horizontal = TRUE,
        col = "orange",
        main = "Diagrama de Caja:Composite Highway MPG",
        xlab = "MPG compuesto en carretera")

43 Composite Combined MPG

# Seleccionar la variable continua
variable <- na.omit(datos$Composite.Combined.MPG)

# Número de intervalos fijo
n <- length(variable)
k <- ceiling(1 + 3.322 * log10(n))

# Calcular rango y amplitud
R <- max(variable) - min(variable)
A <- ceiling(R / k)

# Límites inferiores y superiores
lim_inf <- seq(from = min(variable), by = A, length.out = k)
lim_sup <- lim_inf + A - 1  # corregido para evitar superposición

# Marcas de clase
MC <- (lim_inf + lim_sup) / 2

# Frecuencias absolutas
ni <- numeric(k)
for (i in 1:k) {
  if (i == k) {
    ni[i] <- sum(variable >= lim_inf[i] & variable <= lim_sup[i])
  } else {
    ni[i] <- sum(variable >= lim_inf[i] & variable < lim_sup[i])
  }
}

# Frecuencia relativa
hi <- round(ni / sum(ni), 4)

# Frecuencias acumuladas
Ni_asc <- cumsum(ni)
Fi_asc <- round(cumsum(hi), 4)
Ni_desc <- rev(cumsum(rev(ni)))
Fi_desc <- round(rev(cumsum(rev(hi))), 4)

# Crear tabla
tabla_frecuencia <- data.frame(
  Intervalo = paste0(round(lim_inf, 2), " - ", round(lim_sup, 2)),
  MC = round(MC, 2),
  ni = ni,
  hi = hi,
  Ni_desc = Ni_desc,
  Fi_desc = Fi_desc,
  Ni_asc = Ni_asc,
  Fi_asc = Fi_asc
)

# Mostrar tabla
print(tabla_frecuencia, row.names = FALSE)
##  Intervalo   MC    ni     hi Ni_desc Fi_desc Ni_asc Fi_asc
##      0 - 5  2.5 38048 0.9985   38106  1.0002  38048 0.9985
##     6 - 11  8.5     0 0.0000      58  0.0017  38048 0.9985
##    12 - 17 14.5     0 0.0000      58  0.0017  38048 0.9985
##    18 - 23 20.5     0 0.0000      58  0.0017  38048 0.9985
##    24 - 29 26.5     6 0.0002      58  0.0017  38054 0.9987
##    30 - 35 32.5    11 0.0003      52  0.0015  38065 0.9990
##    36 - 41 38.5     6 0.0002      41  0.0012  38071 0.9992
##    42 - 47 44.5     2 0.0001      35  0.0010  38073 0.9993
##    48 - 53 50.5    11 0.0003      33  0.0009  38084 0.9996
##    54 - 59 56.5    11 0.0003      22  0.0006  38095 0.9999
##    60 - 65 62.5     6 0.0002      11  0.0003  38101 1.0001
##    66 - 71 68.5     0 0.0000       5  0.0001  38101 1.0001
##    72 - 77 74.5     0 0.0000       5  0.0001  38101 1.0001
##    78 - 83 80.5     1 0.0000       5  0.0001  38102 1.0001
##    84 - 89 86.5     4 0.0001       4  0.0001  38106 1.0002
##    90 - 95 92.5     0 0.0000       0  0.0000  38106 1.0002
##   96 - 101 98.5     0 0.0000       0  0.0000  38106 1.0002
# Histograma manual con las frecuencias absolutas
barplot(tabla_frecuencia$ni,
        main = "Histograma:Composite Combined MPG",
        xlab = "MPG combinado compuesto",
        ylab = "Frecuencia absoluta",
        col = "skyblue",
        names.arg = tabla_frecuencia$Intervalo,
        las = 2,
        cex.names = 0.7,
        ylim = c(0, max(tabla_frecuencia$ni) + 5))

# Ojivas (ascendente y descendente) con líneas conectadas
plot(tabla_frecuencia$MC, tabla_frecuencia$Ni_asc,
     type = "o", col = "green",
     main = "OjivasFrecuencias acumuladas de Composite Combined MPG",
     xlab = "MPG combinado compuesto",
     ylab = "Frecuencia acumulada",
     ylim = c(0, max(tabla_frecuencia$Ni_asc) + 5),
     pch = 16)


lines(tabla_frecuencia$MC, tabla_frecuencia$Ni_desc,
      type = "o", col = "red", pch = 17)

legend("bottomright",
       legend = c("Ojiva Ascendente", "Ojiva Descendente"),
       col = c("green", "red"),
       pch = c(16, 17),
       lty = 1)

# Diagrama de caja (boxplot)
boxplot(variable,
        horizontal = TRUE,
        col = "orange",
        main = "Diagrama de Caja:Composite Combined MPG",
        xlab = "MPG combinado compuesto")

44 Range FT1

# Seleccionar la variable continua
variable <- na.omit(datos$Range..FT1.)

# Número de intervalos fijo
n <- length(variable)
k <- ceiling(1 + 3.322 * log10(n))

# Calcular rango y amplitud
R <- max(variable) - min(variable)
A <- ceiling(R / k)

# Límites inferiores y superiores
lim_inf <- seq(from = min(variable), by = A, length.out = k)
lim_sup <- lim_inf + A - 1  # corregido para evitar superposición

# Marcas de clase
MC <- (lim_inf + lim_sup) / 2

# Frecuencias absolutas
ni <- numeric(k)
for (i in 1:k) {
  if (i == k) {
    ni[i] <- sum(variable >= lim_inf[i] & variable <= lim_sup[i])
  } else {
    ni[i] <- sum(variable >= lim_inf[i] & variable < lim_sup[i])
  }
}

# Frecuencia relativa
hi <- round(ni / sum(ni), 4)

# Frecuencias acumuladas
Ni_asc <- cumsum(ni)
Fi_asc <- round(cumsum(hi), 4)
Ni_desc <- rev(cumsum(rev(ni)))
Fi_desc <- round(rev(cumsum(rev(hi))), 4)

# Crear tabla
tabla_frecuencia <- data.frame(
  Intervalo = paste0(round(lim_inf, 2), " - ", round(lim_sup, 2)),
  MC = round(MC, 2),
  ni = ni,
  hi = hi,
  Ni_desc = Ni_desc,
  Fi_desc = Fi_desc,
  Ni_asc = Ni_asc,
  Fi_asc = Fi_asc
)

# Mostrar tabla
print(tabla_frecuencia, row.names = FALSE)
##  Intervalo  MC    ni     hi Ni_desc Fi_desc Ni_asc Fi_asc
##     0 - 18   9 37980 0.9969   38099  1.0002  37980 0.9969
##    19 - 37  28     3 0.0001     119  0.0033  37983 0.9970
##    38 - 56  47     8 0.0002     116  0.0032  37991 0.9972
##    57 - 75  66    21 0.0006     108  0.0030  38012 0.9978
##    76 - 94  85    38 0.0010      87  0.0024  38050 0.9988
##   95 - 113 104     9 0.0002      49  0.0014  38059 0.9990
##  114 - 132 123     6 0.0002      40  0.0012  38065 0.9992
##  133 - 151 142     1 0.0000      34  0.0010  38066 0.9992
##  152 - 170 161     0 0.0000      33  0.0010  38066 0.9992
##  171 - 189 180     1 0.0000      33  0.0010  38067 0.9992
##  190 - 208 199     2 0.0001      32  0.0010  38069 0.9993
##  209 - 227 218     3 0.0001      30  0.0009  38072 0.9994
##  228 - 246 237     7 0.0002      27  0.0008  38079 0.9996
##  247 - 265 256    10 0.0003      20  0.0006  38089 0.9999
##  266 - 284 275     5 0.0001      10  0.0003  38094 1.0000
##  285 - 303 294     3 0.0001       5  0.0002  38097 1.0001
##  304 - 322 313     2 0.0001       2  0.0001  38099 1.0002
# Histograma manual con las frecuencias absolutas
barplot(tabla_frecuencia$ni,
        main = "Histograma: Range FT1",
        xlab = "Rango FT1",
        ylab = "Frecuencia absoluta",
        col = "skyblue",
        names.arg = tabla_frecuencia$Intervalo,
        las = 2,
        cex.names = 0.7,
        ylim = c(0, max(tabla_frecuencia$ni) + 5))

# Ojivas (ascendente y descendente) con líneas conectadas
plot(tabla_frecuencia$MC, tabla_frecuencia$Ni_asc,
     type = "o", col = "green",
     main = "OjivasFrecuencias acumuladas de Range FT1",
     xlab = "Rango FT1 ",
     ylab = "Frecuencia acumulada",
     ylim = c(0, max(tabla_frecuencia$Ni_asc) + 5),
     pch = 16)

lines(tabla_frecuencia$MC, tabla_frecuencia$Ni_desc,
      type = "o", col = "red", pch = 17)

legend("bottomright",
       legend = c("Ojiva Ascendente", "Ojiva Descendente"),
       col = c("green", "red"),
       pch = c(16, 17),
       lty = 1)

# Diagrama de caja (boxplot)
boxplot(variable,
        horizontal = TRUE,
        col = "orange",
        main = "Diagrama de Caja: Range FT1",
        xlab = "Rango FT1")

45 City Range FT1

# Seleccionar la variable continua
variable <- na.omit(datos$City.Range..FT1.)

# Número de intervalos fijo
n <- length(variable)
k <- ceiling(1 + 3.322 * log10(n))

# Calcular rango y amplitud
R <- max(variable) - min(variable)
A <- ceiling(R / k)

# Límites inferiores y superiores
lim_inf <- seq(from = min(variable), by = A, length.out = k)
lim_sup <- lim_inf + A - 1  # corregido para evitar superposición

# Marcas de clase
MC <- (lim_inf + lim_sup) / 2

# Frecuencias absolutas
ni <- numeric(k)
for (i in 1:k) {
  if (i == k) {
    ni[i] <- sum(variable >= lim_inf[i] & variable <= lim_sup[i])
  } else {
    ni[i] <- sum(variable >= lim_inf[i] & variable < lim_sup[i])
  }
}

# Frecuencia relativa
hi <- round(ni / sum(ni), 4)

# Frecuencias acumuladas
Ni_asc <- cumsum(ni)
Fi_asc <- round(cumsum(hi), 4)
Ni_desc <- rev(cumsum(rev(ni)))
Fi_desc <- round(rev(cumsum(rev(hi))), 4)

# Crear tabla
tabla_frecuencia <- data.frame(
  Intervalo = paste0(round(lim_inf, 2), " - ", round(lim_sup, 2)),
  MC = round(MC, 2),
  ni = ni,
  hi = hi,
  Ni_desc = Ni_desc,
  Fi_desc = Fi_desc,
  Ni_asc = Ni_asc,
  Fi_asc = Fi_asc
)

# Mostrar tabla
print(tabla_frecuencia, row.names = FALSE)
##  Intervalo    MC    ni     hi Ni_desc Fi_desc Ni_asc Fi_asc
##     0 - 17   8.5 38007 0.9977   38095  1.0001  38007 0.9977
##    18 - 35  26.5     0 0.0000      88  0.0024  38007 0.9977
##    36 - 53  44.5     1 0.0000      88  0.0024  38008 0.9977
##    54 - 71  62.5     7 0.0002      87  0.0024  38015 0.9979
##    72 - 89  80.5    21 0.0006      80  0.0022  38036 0.9985
##   90 - 107  98.5    13 0.0003      59  0.0016  38049 0.9988
##  108 - 125 116.5     6 0.0002      46  0.0013  38055 0.9990
##  126 - 143 134.5     2 0.0001      40  0.0011  38057 0.9991
##  144 - 161 152.5     0 0.0000      38  0.0010  38057 0.9991
##  162 - 179 170.5     0 0.0000      38  0.0010  38057 0.9991
##  180 - 197 188.5     3 0.0001      38  0.0010  38060 0.9992
##  198 - 215 206.5     4 0.0001      35  0.0009  38064 0.9993
##  216 - 233 224.5     2 0.0001      31  0.0008  38066 0.9994
##  234 - 251 242.5     9 0.0002      29  0.0007  38075 0.9996
##  252 - 269 260.5    17 0.0004      20  0.0005  38092 1.0000
##  270 - 287 278.5     3 0.0001       3  0.0001  38095 1.0001
##  288 - 305 296.5     0 0.0000       0  0.0000  38095 1.0001
# Histograma manual con las frecuencias absolutas
barplot(tabla_frecuencia$ni,
        main = "Histograma: City Range FT1",
        xlab = "Rango de la ciudad FT1",
        ylab = "Frecuencia absoluta",
        col = "skyblue",
        names.arg = tabla_frecuencia$Intervalo,
        las = 2,
        cex.names = 0.7,
        ylim = c(0, max(tabla_frecuencia$ni) + 5))

# Ojivas (ascendente y descendente) con líneas conectadas
plot(tabla_frecuencia$MC, tabla_frecuencia$Ni_asc,
     type = "o", col = "green",
     main = "OjivasFrecuencias acumuladas de City Range FT1",
     xlab = "Rango de ciudad FT1 ",
     ylab = "Frecuencia acumulada",
     ylim = c(0, max(tabla_frecuencia$Ni_asc) + 5),
     pch = 16)

lines(tabla_frecuencia$MC, tabla_frecuencia$Ni_desc,
      type = "o", col = "red", pch = 17)

legend("bottomright",
       legend = c("Ojiva Ascendente", "Ojiva Descendente"),
       col = c("green", "red"),
       pch = c(16, 17),
       lty = 1)

# Diagrama de caja (boxplot)
boxplot(variable,
        horizontal = TRUE,
        col = "orange",
        main = "Diagrama de Caja:City Range FT1",
        xlab = "Rango de ciudad FT1")

46 Highway Range FT1

# Seleccionar la variable continua
variable <- na.omit(datos$Highway.Range..FT1.)

# Número de intervalos fijo
n <- length(variable)
k <- ceiling(1 + 3.322 * log10(n))

# Calcular rango y amplitud
R <- max(variable) - min(variable)
A <- ceiling(R / k)

# Límites inferiores y superiores
lim_inf <- seq(from = min(variable), by = A, length.out = k)
lim_sup <- lim_inf + A - 1  # corregido para evitar superposición

# Marcas de clase
MC <- (lim_inf + lim_sup) / 2

# Frecuencias absolutas
ni <- numeric(k)
for (i in 1:k) {
  if (i == k) {
    ni[i] <- sum(variable >= lim_inf[i] & variable <= lim_sup[i])
  } else {
    ni[i] <- sum(variable >= lim_inf[i] & variable < lim_sup[i])
  }
}

# Frecuencia relativa
hi <- round(ni / sum(ni), 4)

# Frecuencias acumuladas
Ni_asc <- cumsum(ni)
Fi_asc <- round(cumsum(hi), 4)
Ni_desc <- rev(cumsum(rev(ni)))
Fi_desc <- round(rev(cumsum(rev(hi))), 4)

# Crear tabla
tabla_frecuencia <- data.frame(
  Intervalo = paste0(round(lim_inf, 2), " - ", round(lim_sup, 2)),
  MC = round(MC, 2),
  ni = ni,
  hi = hi,
  Ni_desc = Ni_desc,
  Fi_desc = Fi_desc,
  Ni_asc = Ni_asc,
  Fi_asc = Fi_asc
)

# Mostrar tabla
print(tabla_frecuencia, row.names = FALSE)
##  Intervalo  MC    ni     hi Ni_desc Fi_desc Ni_asc Fi_asc
##     0 - 20  10 38007 0.9972   38113  1.0001  38007 0.9972
##    21 - 41  31     1 0.0000     106  0.0029  38008 0.9972
##    42 - 62  52    15 0.0004     105  0.0029  38023 0.9976
##    63 - 83  73    30 0.0008      90  0.0025  38053 0.9984
##   84 - 104  94    12 0.0003      60  0.0017  38065 0.9987
##  105 - 125 115     2 0.0001      48  0.0014  38067 0.9988
##  126 - 146 136     3 0.0001      46  0.0013  38070 0.9989
##  147 - 167 157     0 0.0000      43  0.0012  38070 0.9989
##  168 - 188 178     1 0.0000      43  0.0012  38071 0.9989
##  189 - 209 199     2 0.0001      42  0.0012  38073 0.9990
##  210 - 230 220     7 0.0002      40  0.0011  38080 0.9992
##  231 - 251 241     5 0.0001      33  0.0009  38085 0.9993
##  252 - 272 262    18 0.0005      28  0.0008  38103 0.9998
##  273 - 293 283     5 0.0001      10  0.0003  38108 0.9999
##  294 - 314 304     3 0.0001       5  0.0002  38111 1.0000
##  315 - 335 325     0 0.0000       2  0.0001  38111 1.0000
##  336 - 356 346     2 0.0001       2  0.0001  38113 1.0001
# Histograma manual con las frecuencias absolutas
barplot(tabla_frecuencia$ni,
        main = "Histograma: Highway Range FT1",
        xlab = "Rango de carretera FT1",
        ylab = "Frecuencia absoluta",
        col = "skyblue",
        names.arg = tabla_frecuencia$Intervalo,
        las = 2,
        cex.names = 0.7,
        ylim = c(0, max(tabla_frecuencia$ni) + 5))

# Ojivas (ascendente y descendente) con líneas conectadas
plot(tabla_frecuencia$MC, tabla_frecuencia$Ni_asc,
     type = "o", col = "green",
     main = "OjivasFrecuencias acumuladas de Highway Range FT1",
     xlab = "Rango de carretera FT1 ",
     ylab = "Frecuencia acumulada",
     ylim = c(0, max(tabla_frecuencia$Ni_asc) + 5),
     pch = 16)

lines(tabla_frecuencia$MC, tabla_frecuencia$Ni_desc,
      type = "o", col = "red", pch = 17)

legend("bottomright",
       legend = c("Ojiva Ascendente", "Ojiva Descendente"),
       col = c("green", "red"),
       pch = c(16, 17),
       lty = 1)

# Diagrama de caja (boxplot)
boxplot(variable,
        horizontal = TRUE,
        col = "orange",
        main = "Diagrama de Caja:Highway Range FT1",
        xlab = "Rango de carretera FT1")

47 City Range FT2

# Seleccionar la variable continua
variable <- na.omit(datos$City.Range..FT2.)

# Número de intervalos fijo
n <- length(variable)
k <- ceiling(1 + 3.322 * log10(n))

# Calcular rango y amplitud
R <- max(variable) - min(variable)
A <- ceiling(R / k)

# Límites inferiores y superiores
lim_inf <- seq(from = min(variable), by = A, length.out = k)
lim_sup <- lim_inf + A - 1  # corregido para evitar superposición

# Marcas de clase
MC <- (lim_inf + lim_sup) / 2

# Frecuencias absolutas
ni <- numeric(k)
for (i in 1:k) {
  if (i == k) {
    ni[i] <- sum(variable >= lim_inf[i] & variable <= lim_sup[i])
  } else {
    ni[i] <- sum(variable >= lim_inf[i] & variable < lim_sup[i])
  }
}

# Frecuencia relativa
hi <- round(ni / sum(ni), 4)

# Frecuencias acumuladas
Ni_asc <- cumsum(ni)
Fi_asc <- round(cumsum(hi), 4)
Ni_desc <- rev(cumsum(rev(ni)))
Fi_desc <- round(rev(cumsum(rev(hi))), 4)

# Crear tabla
tabla_frecuencia <- data.frame(
  Intervalo = paste0(round(lim_inf, 2), " - ", round(lim_sup, 2)),
  MC = round(MC, 2),
  ni = ni,
  hi = hi,
  Ni_desc = Ni_desc,
  Fi_desc = Fi_desc,
  Ni_asc = Ni_asc,
  Fi_asc = Fi_asc
)

# Mostrar tabla
print(tabla_frecuencia, row.names = FALSE)
##  Intervalo  MC    ni     hi Ni_desc Fi_desc Ni_asc Fi_asc
##      0 - 6   3 38048 0.9987   38099  1.0001  38048 0.9987
##     7 - 13  10     8 0.0002      51  0.0014  38056 0.9989
##    14 - 20  17    16 0.0004      43  0.0012  38072 0.9993
##    21 - 27  24    10 0.0003      27  0.0008  38082 0.9996
##    28 - 34  31     2 0.0001      17  0.0005  38084 0.9997
##    35 - 41  38     9 0.0002      15  0.0004  38093 0.9999
##    42 - 48  45     0 0.0000       6  0.0002  38093 0.9999
##    49 - 55  52     0 0.0000       6  0.0002  38093 0.9999
##    56 - 62  59     2 0.0001       6  0.0002  38095 1.0000
##    63 - 69  66     0 0.0000       4  0.0001  38095 1.0000
##    70 - 76  73     0 0.0000       4  0.0001  38095 1.0000
##    77 - 83  80     3 0.0001       4  0.0001  38098 1.0001
##    84 - 90  87     0 0.0000       1  0.0000  38098 1.0001
##    91 - 97  94     0 0.0000       1  0.0000  38098 1.0001
##   98 - 104 101     1 0.0000       1  0.0000  38099 1.0001
##  105 - 111 108     0 0.0000       0  0.0000  38099 1.0001
##  112 - 118 115     0 0.0000       0  0.0000  38099 1.0001
# Histograma manual con las frecuencias absolutas
barplot(tabla_frecuencia$ni,
        main = "Histograma: City Range FT2",
        xlab = "Rango de la ciudad FT2",
        ylab = "Frecuencia absoluta",
        col = "skyblue",
        names.arg = tabla_frecuencia$Intervalo,
        las = 2,
        cex.names = 0.7,
        ylim = c(0, max(tabla_frecuencia$ni) + 5))

# Ojivas (ascendente y descendente) con líneas conectadas
plot(tabla_frecuencia$MC, tabla_frecuencia$Ni_asc,
     type = "o", col = "green",
     main = "OjivasFrecuencias acumuladas de City Range FT2",
     xlab = "Rango de ciudad FT2",
     ylab = "Frecuencia acumulada",
     ylim = c(0, max(tabla_frecuencia$Ni_asc) + 5),
     pch = 16)

lines(tabla_frecuencia$MC, tabla_frecuencia$Ni_desc,
      type = "o", col = "red", pch = 17)

legend("bottomright",
       legend = c("Ojiva Ascendente", "Ojiva Descendente"),
       col = c("green", "red"),
       pch = c(16, 17),
       lty = 1)

# Diagrama de caja (boxplot)
boxplot(variable,
        horizontal = TRUE,
        col = "orange",
        main = "Diagrama de Caja:City Range FT2",
        xlab = "Rango de ciudad FT2")

48 Highway Range FT2

# Seleccionar la variable continua
variable <- na.omit(datos$Highway.Range..FT2.)

# Número de intervalos fijo
n <- length(variable)
k <- ceiling(1 + 3.322 * log10(n))

# Calcular rango y amplitud
R <- max(variable) - min(variable)
A <- ceiling(R / k)

# Límites inferiores y superiores
lim_inf <- seq(from = min(variable), by = A, length.out = k)
lim_sup <- lim_inf + A - 1  # corregido para evitar superposición

# Marcas de clase
MC <- (lim_inf + lim_sup) / 2

# Frecuencias absolutas
ni <- numeric(k)
for (i in 1:k) {
  if (i == k) {
    ni[i] <- sum(variable >= lim_inf[i] & variable <= lim_sup[i])
  } else {
    ni[i] <- sum(variable >= lim_inf[i] & variable < lim_sup[i])
  }
}

# Frecuencia relativa
hi <- round(ni / sum(ni), 4)

# Frecuencias acumuladas
Ni_asc <- cumsum(ni)
Fi_asc <- round(cumsum(hi), 4)
Ni_desc <- rev(cumsum(rev(ni)))
Fi_desc <- round(rev(cumsum(rev(hi))), 4)

# Crear tabla
tabla_frecuencia <- data.frame(
  Intervalo = paste0(round(lim_inf, 2), " - ", round(lim_sup, 2)),
  MC = round(MC, 2),
  ni = ni,
  hi = hi,
  Ni_desc = Ni_desc,
  Fi_desc = Fi_desc,
  Ni_asc = Ni_asc,
  Fi_asc = Fi_asc
)

# Mostrar tabla
print(tabla_frecuencia, row.names = FALSE)
##  Intervalo   MC    ni     hi Ni_desc Fi_desc Ni_asc Fi_asc
##      0 - 5  2.5 38048 0.9989   38091  1.0001  38048 0.9989
##     6 - 11  8.5     4 0.0001      43  0.0012  38052 0.9990
##    12 - 17 14.5    23 0.0006      39  0.0011  38075 0.9996
##    18 - 23 20.5     5 0.0001      16  0.0005  38080 0.9997
##    24 - 29 26.5     2 0.0001      11  0.0004  38082 0.9998
##    30 - 35 32.5     2 0.0001       9  0.0003  38084 0.9999
##    36 - 41 38.5     4 0.0001       7  0.0002  38088 1.0000
##    42 - 47 44.5     0 0.0000       3  0.0001  38088 1.0000
##    48 - 53 50.5     2 0.0001       3  0.0001  38090 1.0001
##    54 - 59 56.5     0 0.0000       1  0.0000  38090 1.0001
##    60 - 65 62.5     0 0.0000       1  0.0000  38090 1.0001
##    66 - 71 68.5     0 0.0000       1  0.0000  38090 1.0001
##    72 - 77 74.5     0 0.0000       1  0.0000  38090 1.0001
##    78 - 83 80.5     0 0.0000       1  0.0000  38090 1.0001
##    84 - 89 86.5     0 0.0000       1  0.0000  38090 1.0001
##    90 - 95 92.5     1 0.0000       1  0.0000  38091 1.0001
##   96 - 101 98.5     0 0.0000       0  0.0000  38091 1.0001
# Histograma manual con las frecuencias absolutas
barplot(tabla_frecuencia$ni,
        main = "Histograma: Highway Range FT2",
        xlab = "Rango de carretera FT2",
        ylab = "Frecuencia absoluta",
        col = "skyblue",
        names.arg = tabla_frecuencia$Intervalo,
        las = 2,
        cex.names = 0.7,
        ylim = c(0, max(tabla_frecuencia$ni) + 5))

# Ojivas (ascendente y descendente) con líneas conectadas
plot(tabla_frecuencia$MC, tabla_frecuencia$Ni_asc,
     type = "o", col = "green",
     main = "OjivasFrecuencias acumuladas de Highway Range FT2",
     xlab = "Rango de carretera FT2",
     ylab = "Frecuencia acumulada",
     ylim = c(0, max(tabla_frecuencia$Ni_asc) + 5),
     pch = 16)

lines(tabla_frecuencia$MC, tabla_frecuencia$Ni_desc,
      type = "o", col = "red", pch = 17)

legend("bottomright",
       legend = c("Ojiva Ascendente", "Ojiva Descendente"),
       col = c("green", "red"),
       pch = c(16, 17),
       lty = 1)

# Diagrama de caja (boxplot)
boxplot(variable,
        horizontal = TRUE,
        col = "orange",
        main = "Diagrama de Caja:Highway Range FT2",
        xlab = "Rango de carretera FT2")