La estadística es una rama de las matemáticas que se enfoca en el estudio de los métodos para recoger, organizar, analizar e interpretar datos con el objetivo de sacar conclusiones válidas y tomar decisiones fundamentadas. Dentro de este campo, la probabilidad juega un papel crucial al proporcionar un marco teórico para la inferencia estadística. Este trabajo científico explora diversos conceptos fundamentales en estadística, como la organización de datos, tipos de variables, y medidas estadísticas esenciales, utilizando fórmulas y ejemplos prácticos.
1. Variables Cualitativas o Categóricas:
Nominales: No tienen orden o jerarquía. Ejemplos: color de ojos, género.
Ordinales: Tienen un orden específico. Ejemplos: nivel educativo, clasificación socioeconómica.
2. Variables Cuantitativas o Numéricas:
Discretas: Toman valores contables (números enteros). Ejemplos: número de estudiantes, cantidad de productos vendidos.
Continuas: Pueden tomar cualquier valor dentro de un rango. Ejemplos: altura, temperatura, ingresos anuales.
ORGANIZACIÓN DE LOS DATOS CASO CONTINUO FÓRMULA DE STURGES
\[ m = 1 + \log_2(n) = 1 + \frac{\log_{10}(n)}{\log_{10}(2)} \]
n = “Tamaño de la Muestra” m = “Número de intervalos de Clase
El resultado de m se aproxima al entero mas cercano por arriba.
\[ c = \frac{\text{rango}}{m} \]
RANGO
\[ \text{nuevo rango} = c \times m \]
\[ \text{nuevo mínimo} = X_{\text{min}} - \frac{\text{nuevo rango} - \text{rango original}}{2} \]
\[ \text{nuevo máximo} = X_{\text{max}} + \frac{\text{nuevo rango} - \text{rango original}}{2} \]
Para iniciar el proceso debemos tener instalado Rstudio. Si no lo tienes instalado puedes acceder a este enlace (Créditos al Autor):
# Lista de paquetes que vamos a usar
paquetes <- c(
'data.table', # Para leer y escribir datos de forma rápida
'dplyr', # Para manipulación de datos
'tidyr', # Para manipulación de datos
'ggplot2', # Para gráficos
'purrr', # Para usar la función map que aplica la misma función a varios componentes de un dataframe
'smbinning', # Para calcular la importancia de las variables
'psych', # Para análisis psicométrico y estadística descriptiva
'MASS', # Para modelos estadísticos y análisis de datos
'knitr', # Convierte un data.frame en una tabla en Markdown o HTML
'gt', # Ofrece más opciones de formato y estilo para las tablas en R
'flextable', # Permite crear tablas flexibles y estilizadas que pueden ser exportadas a documentos Word o HTML
'formattable' # Permite crear tablas con formato atractivo
)
# Verificar si los paquetes están instalados
paquetes_no_instalados <- paquetes[!(paquetes %in% installed.packages()[,"Package"])]
# Instalar los paquetes que faltan
if(length(paquetes_no_instalados) > 0) {
install.packages(paquetes_no_instalados, dependencies = TRUE)
}
# Cargar los paquetes
lapply(paquetes, function(p) {
if (!require(p, character.only = TRUE)) {
install.packages(p, dependencies = TRUE)
library(p, character.only = TRUE)
}
})
Ejemplo El precio de cierre, en dólares, del barril de petróleo en la bolsa de valores de cierta ciudad en las últimas 50 jornadas ha sido:
Precio_Barril <- c(83.25, 85.72, 84.11, 90.48, 87.68, 82.15, 107.64, 96.33, 83.72, 88.65, 86.94, 95.80, 93.51, 93.01, 89.33, 98.26, 92.58, 98.14, 94.81, 85.53, 97.66, 107.28, 103.02, 85.16, 85.33, 108.02, 89.02, 109.44, 94.57, 89.37, 83.35, 83.15, 94.44, 96.00, 84.66, 87.48, 83.20, 104.29, 108.60, 107.17, 107.12, 84.68, 92.40, 86.86, 91.48, 95.11, 94.36, 92.64, 87.75, 108.54)
length(Precio_Barril)
## [1] 50
Precio_Barril_ordenado <- sort(Precio_Barril)
Precio_Barril_ordenado
## [1] 82.15 83.15 83.20 83.25 83.35 83.72 84.11 84.66 84.68 85.16
## [11] 85.33 85.53 85.72 86.86 86.94 87.48 87.68 87.75 88.65 89.02
## [21] 89.33 89.37 90.48 91.48 92.40 92.58 92.64 93.01 93.51 94.36
## [31] 94.44 94.57 94.81 95.11 95.80 96.00 96.33 97.66 98.14 98.26
## [41] 103.02 104.29 107.12 107.17 107.28 107.64 108.02 108.54 108.60 109.44
m <- ceiling(1 + log10(length(Precio_Barril)) / log10(2))
m
## [1] 7
# Cálculo del rango
X_min <- min(Precio_Barril_ordenado)
X_max <- max(Precio_Barril_ordenado)
X_min
## [1] 82.15
X_max
## [1] 109.44
rango <- X_max - X_min
rango
## [1] 27.29
# Intervalo de clase
c <- ceiling(rango / m)
c
## [1] 4
nuevo_rango <- ceiling(c * m)
nuevo_rango
## [1] 28
# Ajuste de los límites mínimo y máximo
nuevo_minimo <- X_min - (nuevo_rango - rango) / 2
nuevo_maximo <- X_max + (nuevo_rango - rango) / 2
nuevo_minimo
## [1] 81.795
nuevo_maximo
## [1] 109.795
Paso 3: Creación de los intervalos de clase y cálculo de las frecuencias
# Creación de los intervalos de clase
breaks <- seq(nuevo_minimo, nuevo_maximo, by = c)
intervalo <- cut(Precio_Barril_ordenado, breaks, right = FALSE)
# Frecuencia absoluta
frecuencia_absoluta <- table(intervalo)
# Frecuencia relativa
frecuencia_relativa <- prop.table(frecuencia_absoluta)
# Frecuencia acumulada
frecuencia_absoluta_acumulada <- cumsum(frecuencia_absoluta)
# Frecuencia relativa acumulada
frecuencia_relativa_acumulada <- cumsum(frecuencia_relativa)
# Marcas de clase
marcas_de_clase <- (head(breaks, -1) + tail(breaks, -1)) / 2
# Crear un dataframe con los resultados
distribucion_frecuencias <- data.frame(
Intervalo = names(frecuencia_absoluta),
Marca_de_Clase = marcas_de_clase,
Frecuencia_Absoluta = as.vector(frecuencia_absoluta),
Frecuencia_Relativa = as.vector(frecuencia_relativa),
Frecuencia_Absoluta_Acumulada = as.vector(frecuencia_absoluta_acumulada),
Frecuencia_Relativa_Acumulada = as.vector(frecuencia_relativa_acumulada)
)
distribucion_frecuencias
colnames(distribucion_frecuencias)
## [1] "Intervalo" "Marca_de_Clase"
## [3] "Frecuencia_Absoluta" "Frecuencia_Relativa"
## [5] "Frecuencia_Absoluta_Acumulada" "Frecuencia_Relativa_Acumulada"
df_dist_fr <- data.frame(
longitud = c("[81.8, 85.8)", "[85.8, 89.8)", "[89.8, 93.8)", "[93.8, 97.8)", "[97.8, 102)", "[102, 106)", "[106, 110)"),
Marca_Clase = c(83.795, 87.795, 91.795, 95.795, 99.795, 103.795, 107.795),
fr_Abs = c(13, 9, 7, 9, 2, 2, 8),
fr_Rel = c(0.26, 0.18, 0.14, 0.18, 0.04, 0.04, 0.16),
Fr_Abs_Acum = c(13, 22, 29, 38, 40, 42, 50),
Fr_Rel_Acum = c(0.26, 0.44, 0.58, 0.76, 0.80, 0.84, 1.00)
)
# Ver el dataframe
df_dist_fr
Conclusiones:
Frecuencia Absoluta (fr_Abs):
El intervalo [81.8,85.8) contiene la mayor frecuencia absoluta de barriles de petróleo con 13 observaciones, lo que indica que esta gama de valores es la más frecuente en el conjunto de datos.
Los intervalos [97.8,102) y [102,106) tienen la menor frecuencia absoluta con solo 2 barriles de petróleo cada uno. Esto insinua que hay menos ocurrencias de barriles de petróleo en estos rangos específicos.
Frecuencia Absoluta (fr_Abs) muestra una variabilidad en la producción de barriles de petróleo a lo largo de los diferentes intervalos de longitud, con frecuencias que van desde 2 hasta 13 barriles, lo que refleja la diversidad en la producción de petróleo en diferentes rangos.
Frecuencia Relativa (fr_Rel): El intervalo [81.8,85.8) representa el 26% del total de barriles de petróleo observados, siendo el intervalo con mayor frecuencia relativa y presenta la producción de barriles de petróleo más significativa. Estos intervalos pueden ser cruciales para identificar áreas prioritarias en la extracción de barriles de petróleo.
La distribución de las frecuencias relativas (fr_Rel) muestra cómo se distribuyen proporcionalmente los datos de producción de barriles de petróleo en los diferentes intervalos. Esta información es esencial para comprender la estructura de la producción de petróleo.
Frecuencia Absoluta Acumulada (Fr_Abs_Acum):
la frecuencia relativa acumulada muestra que el 58% de los barriles de petróleo en la muestra se encuentran en este intervalo o en los intervalos anteriores. Es decir, más de la mitad de los barriles de petróleo analizados tienen precios que caen en este intervalo o por debajo de él.
Para Fr_Rel_Acum (Frecuencia Relativa Acumulada):
Muestra cómo se acumula la proporción de barriles de petróleo en relación con el total observado. Por ejemplo, después del último intervalo, la proporción acumulada es del 100%, indicando que se ha acumulado toda la producción de petróleo.
La acumulación de las frecuencias relativas proporciona una visión global de cómo se distribuyen proporcionalmente los barriles de petróleo en el tabla de distribución de frecuencia. Esto es crucial para entender la contribución de cada intervalo a la producción total.
Identificación de Intervalos Significativos: Los intervalos con altas frecuencias relativas acumuladas destacan áreas críticas donde la producción de barriles de petróleo es más concentrada. Estos intervalos pueden ser fundamentales para decisiones estratégicas en la industria petrolera.
# Crear el diagrama de caja y bigotes
ggplot(df_dist_fr, aes(x = Marca_Clase, y = fr_Rel)) +
geom_boxplot(fill = "lightblue", color = "blue", coef = 1.5, width = 0.5) + # Ancho del diagrama de caja
labs(y = "Frecuencia Relativa", fill = "Marca de Clase") +
ggtitle("Diagrama de Caja y Bigotes para Barriles de Petróleo") +
theme_bw(base_size = 14)
#Creación de otro Diagrama de Caja y Bigote
boxplot(df_dist_fr$Marca_Clase ~ df_dist_fr$fr_Rel,
horizontal = FALSE, # Gráfico vertical
lwd = 3, # Ancho de los bordes de la caja
col = "red", # Color de la caja
xlab = "Frecuencia Relativa", # Etiqueta eje X
ylab = "Marca de Clase", # Etiqueta eje Y
main = "Boxplot de Marca de Clase vs Frecuencia Relativa", # Título
notch = TRUE, # Añade intervalos de confianza para la mediana
border = "black", # Color del borde del boxplot
outpch = 25, # Símbolo para los outliers
outbg = "green", # Color de los datos atípicos
whiskcol = "blue", # Color de los bigotes
whisklty = 2, # Tipo de línea para los bigotes
lty = 1) # Tipo de línea (1 normal, 2 cortada para caja y mediana)
Realización de Histograma con el poligono de frecuencia:
# Crear el gráfico
ggplot(df_dist_fr, aes(x = df_dist_fr$Marca_Clase, y = df_dist_fr$fr_Rel, fill = as.factor(df_dist_fr$fr_Rel))) + geom_bar(stat = "identity", color = "black") + # Histograma de barras
geom_line(aes(group = 1), color = "blue", size = 1.5) + # Polígono de frecuencia
labs(x = "Marca de Clase", y = "Frecuencia Relativa", fill = "Marca deClase") +
ggtitle("Histograma con Polígono de Frecuencia") +
theme_bw(base_size = 14) +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
Diagrama de cajas y Bigotes:
# Crear el diagrama de caja y bigotes
ggplot(df_dist_fr, aes(x = df_dist_fr$Marca_Clase, y = df_dist_fr$fr_Rel)) +
geom_boxplot(fill = "green", color = "black", coef = 1.5) + # Diagrama de caja y bigotes
labs(x = "Marca de Clase", y = "Frecuencia Relativa", fill = "Marca de Clase") +
ggtitle("Diagrama de Caja y Bigotes con Frecuencia Relativa") +
theme_bw(base_size = 14) +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
mean(Precio_Barril_ordenado)
## [1] 93.1958
mean
## function (x, ...)
## UseMethod("mean")
## <bytecode: 0x000002ad5a2b3f40>
## <environment: namespace:base>
# Calcular la media
media <- sum(df_dist_fr$Marca_Clase * df_dist_fr$fr_Abs) / sum(df_dist_fr$fr_Abs)
media
## [1] 93.075
mediana <- median(Precio_Barril_ordenado)
mediana
## [1] 92.49
# Paso 1: Calcular la posición de la mediana
Li <- 89.8
Ls <- 93.8
A <- Ls - Li
Precio_Barril_medio <- (length(Precio_Barril)/ 2)
fi_1 <- 22
fmed <- 29
# Paso 2: Calcular la mediana
Mediana = Li + A*((Precio_Barril_medio-fi_1)/fmed)
Mediana
## [1] 90.21379
# Definir la función para calcular la moda
calcular_moda <- function(datos) {
tabla_frecuencias <- table(datos) # Crear tabla de frecuencias
moda <- as.numeric(names(tabla_frecuencias)[which.max(tabla_frecuencias)]) # Encontrar la moda
return(moda)
}
# Ejemplo de uso con datos de precios de barril ordenados
moda <- calcular_moda(Precio_Barril_ordenado)
# Mostrar resultados
cat("La moda para datos no agrupados es:", moda, "\n")
## La moda para datos no agrupados es: 82.15
Li <- 89.8
Ls <- 93.8
A <- Ls - Li
Precio_Barril_medio <- (length(Precio_Barril)/ 2)
fabs_i <- 7
fabs_i_me_1 <- 9
fabs_i_Ma_1 <- 9
(fabs_i - fabs_i_me_1)
## [1] -2
(fabs_i - fabs_i_me_1) + (fabs_i - fabs_i_Ma_1)
## [1] -4
mode <- 89.8 + 4 * (0.5)
mode
## [1] 91.8
cat("La moda para datos agrupados es:", mode, "\n")
## La moda para datos agrupados es: 91.8
Medidas de tendencia central:
La media para datos no agrupados es ligeramente mayor (93.1958) que la media para datos agrupados (93.075). Esto puede indicar una distribución de datos donde la agrupación puede afectar ligeramente la medida central.
La mediana para datos no agrupados es 92.49, mientras que para datos agrupados es 90.21379. Esto sugiere que la agrupación puede influir en la precisión de la mediana, ya que los datos agrupados pueden perder precisión.
La moda para datos no agrupados es 82.15, y para datos agrupados es 91.8. Esto muestra una diferencia significativa, posiblemente debido a la agrupación que puede sesgar la moda hacia los intervalos con mayor frecuencia.
# Calcular varianza y desviación estándar
varianza <- var(Precio_Barril_ordenado)
desviacion_estandar <- sd(Precio_Barril_ordenado)
# Mostrar resultados
cat("Varianza:", varianza, "\n")
## Varianza: 69.52406
cat("Desviación estándar:", desviacion_estandar, "\n")
## Desviación estándar: 8.338109
Medidas de dispersión:
La varianza y la desviación estándar indican la dispersión de los datos alrededor de la media. Con una varianza de 69.52406 y una desviación estándar de 8.338109, se puede decir que los datos tienen una dispersión moderada.
Los cuartiles (Q1 = 82.15, Q2 = 86.005, Q3 = 92.49) muestran la distribución de los datos en cuatro partes iguales. La mediana (Q2) está en 86.005, lo que indica que la mitad de los datos son menores o iguales a este valor.
# Calcular cuartiles
cuartiles <- quantile(Precio_Barril_ordenado)
# Mostrar resultados
cat("Primer cuartil (Q1):", cuartiles[1], "\n")
## Primer cuartil (Q1): 82.15
cat("Segundo cuartil (Q2 o mediana):", cuartiles[2], "\n")
## Segundo cuartil (Q2 o mediana): 86.005
cat("Tercer cuartil (Q3):", cuartiles[3], "\n")
## Tercer cuartil (Q3): 92.49
#Coeficientes de asimetría y apuntamiento de Pearson
#install.packages("e1071")
library(e1071)
# Calcular coeficiente de asimetría (skewness) y apuntamiento (kurtosis)
coef_asimetria <- skewness(Precio_Barril_ordenado)
coef_fisher <- skewness(Precio_Barril_ordenado, type = 3)
coef_apuntamiento <- kurtosis(Precio_Barril_ordenado)
# Mostrar resultados
cat("Coeficiente de asimetría:", coef_asimetria, "\n")
## Coeficiente de asimetría: 0.6022011
cat("Coeficiente de asimetria de Fisher:", coef_fisher, "\n")
## Coeficiente de asimetria de Fisher: 0.6022011
cat("Coeficiente de apuntamiento:", coef_apuntamiento, "\n")
## Coeficiente de apuntamiento: -0.8644605
# Histograma de tus datos
hist(Precio_Barril_ordenado, col = "lightblue", main = "Histograma con Coeficiente de Asimetría")
# Añadir línea vertical para el coeficiente de asimetría de Fisher
abline(v = coef_fisher, col = "red", lwd = 2)
Conclusiones
Medidas de forma de la distribución:
El coeficiente de asimetría es positivo (0.6022011), lo que indica una ligera asimetría hacia la derecha en la distribución de los datos. El coeficiente de asimetría de Fisher también es 0.6022011, lo cual es consistente con el coeficiente de asimetría tradicional. El coeficiente de apuntamiento es negativo (-0.8644605), lo que sugiere que la distribución es platicúrtica (menos puntiaguda) en comparación con una distribución normal.