3. Primary Dimensional Distributions
3.1 Height Distribution
# Calculate summary statistics
height_stats <- moai_numeric %>%
summarize(
n = sum(!is.na(height_m)),
mean = mean(height_m, na.rm = TRUE),
median = median(height_m, na.rm = TRUE),
sd = sd(height_m, na.rm = TRUE),
min = min(height_m, na.rm = TRUE),
max = max(height_m, na.rm = TRUE),
q1 = quantile(height_m, 0.25, na.rm = TRUE),
q3 = quantile(height_m, 0.75, na.rm = TRUE)
)
# Create annotation text
height_annotation <- paste0(
"n = ", height_stats$n, "\n",
"Mean = ", round(height_stats$mean, 1), " m\n",
"Median = ", round(height_stats$median, 1), " m\n",
"SD = ", round(height_stats$sd, 1), " m\n",
"IQR = ", round(height_stats$q1, 1), "-", round(height_stats$q3, 1), " m\n",
"Range = ", round(height_stats$min, 1), "-", round(height_stats$max, 1), " m"
)
# Create the histogram
ggplot(moai_numeric, aes(x = height_m)) +
geom_histogram(bins = 10, fill = "#4A6FE3", color = "white", alpha = 0.8) +
geom_vline(xintercept = height_stats$mean, linetype = "dashed", color = "red", size = 1) +
geom_vline(xintercept = height_stats$median, linetype = "dotted", color = "darkred", size = 1) +
annotate("text", x = max(moai_numeric$height_m, na.rm = TRUE) * 0.75,
y = 0.8 * max(hist(moai_numeric$height_m, breaks = 10, plot = FALSE)$counts),
label = height_annotation, hjust = 0, size = 4) +
labs(
title = "Distribution of Moai Height",
subtitle = "With mean (dashed red) and median (dotted red) lines",
x = "Height (m)",
y = "Frequency"
) +
scale_x_continuous(breaks = seq(0, round(max(moai_numeric$height_m, na.rm = TRUE)), by = 2)) +
theme_minimal() +
theme(
plot.title = element_text(size = 16, face = "bold"),
axis.title = element_text(size = 12),
axis.text = element_text(size = 10),
panel.grid.minor = element_blank()
)The height distribution demonstrates a positively skewed pattern with primary concentration in the 3-7 meter range. The majority of moai (62.2%) fall within this range, suggesting optimal production parameters that balanced cultural requirements with practical constraints. The long tail with isolated specimens at extreme values indicates exceptional resource investment in select monumental works.
3.2 Facial Dimensions Distribution
# Create plots for face length and width
p1 <- ggplot(moai_numeric, aes(x = face_length_cm)) +
geom_histogram(bins = 10, fill = "#E34A4A", color = "white", alpha = 0.8) +
geom_vline(xintercept = mean(moai_numeric$face_length_cm, na.rm = TRUE),
linetype = "dashed", color = "red", size = 1) +
labs(
title = "Face Length Distribution",
x = "Face Length (cm)",
y = "Frequency"
) +
theme_minimal() +
theme(
plot.title = element_text(size = 14, face = "bold"),
axis.title = element_text(size = 12),
panel.grid.minor = element_blank()
)
p2 <- ggplot(moai_numeric, aes(x = face_width_cm)) +
geom_histogram(bins = 10, fill = "#4AE37B", color = "white", alpha = 0.8) +
geom_vline(xintercept = mean(moai_numeric$face_width_cm, na.rm = TRUE),
linetype = "dashed", color = "red", size = 1) +
labs(
title = "Face Width Distribution",
x = "Face Width (cm)",
y = "Frequency"
) +
theme_minimal() +
theme(
plot.title = element_text(size = 14, face = "bold"),
axis.title = element_text(size = 12),
panel.grid.minor = element_blank()
)
# Calculate summary statistics for annotation
face_stats <- moai_numeric %>%
summarize(
length_n = sum(!is.na(face_length_cm)),
length_mean = mean(face_length_cm, na.rm = TRUE),
length_median = median(face_length_cm, na.rm = TRUE),
length_sd = sd(face_length_cm, na.rm = TRUE),
length_cv = length_sd / length_mean * 100,
width_n = sum(!is.na(face_width_cm)),
width_mean = mean(face_width_cm, na.rm = TRUE),
width_median = median(face_width_cm, na.rm = TRUE),
width_sd = sd(face_width_cm, na.rm = TRUE),
width_cv = width_sd / width_mean * 100
)
# Create a summary table
face_stats_table <- data.frame(
Dimension = c("Face Length", "Face Width"),
Count = c(face_stats$length_n, face_stats$width_n),
Mean = c(face_stats$length_mean, face_stats$width_mean),
Median = c(face_stats$length_median, face_stats$width_median),
SD = c(face_stats$length_sd, face_stats$width_sd),
CV = c(face_stats$length_cv, face_stats$width_cv)
)
# Display the combined plots
p1 / p2 +
plot_annotation(
title = "Facial Dimension Distributions",
theme = theme(plot.title = element_text(size = 16, face = "bold", hjust = 0.5))
)# Display the summary table
kable(face_stats_table,
col.names = c("Dimension", "Count", "Mean (cm)", "Median (cm)", "SD (cm)", "CV (%)"),
digits = c(0, 0, 1, 1, 1, 1),
caption = "Summary Statistics for Facial Dimensions") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"))| Dimension | Count | Mean (cm) | Median (cm) | SD (cm) | CV (%) |
|---|---|---|---|---|---|
| Face Length | 293 | 223.4 | 220 | 98.7 | 44.2 |
| Face Width | 207 | 129.2 | 129 | 39.7 | 30.8 |
The facial dimension distributions reveal distinct patterns:
Face Length exhibits a symmetrical distribution centered around the mean of 223.4 cm, with approximately equal frequencies in the adjacent central bins. The coefficient of variation (44.2%) indicates substantial variability that scales with total moai size.
Face Width demonstrates a more tightly clustered distribution with a pronounced peak around 129.2 cm. The lower coefficient of variation (30.8%) compared to face length suggests greater standardization in transverse facial dimensions.