This report provides a summary of experience profile and common attributes shared by Lloyds agents and their surveyors that declare an aviation capability. Of the 98 assessors across 54 countries common attributes are identified to deepen understanding of the role that agents have in claims process within the insurance industry.
# Load and preprocess the data
df <- read_csv(csv_file, show_col_types = FALSE)
# Clean and preprocess the data
df <- df %>%
mutate(
qualifications = ifelse(is.na(qualifications), "", qualifications),
years_of_experience = as.numeric(years_of_experience),
# Extract country from agent_location
country = str_extract(agent_location, "\\(([^)]+)\\)") %>%
str_remove_all("[\\(\\)]")
)
# Summary statistics
total_assessors <- nrow(df)
total_countries <- length(unique(df$country))
avg_experience <- round(mean(df$years_of_experience, na.rm = TRUE), 1)
median_experience <- round(median(df$years_of_experience, na.rm = TRUE), 1)
cat("Dataset Summary:")
## Dataset Summary:
cat("\n• Total Assessors:", total_assessors)
##
## • Total Assessors: 98
cat("\n• Countries Represented:", total_countries)
##
## • Countries Represented: 54
cat("\n• Average Experience:", avg_experience, "years")
##
## • Average Experience: 25.6 years
cat("\n• Median Experience:", median_experience, "years")
##
## • Median Experience: 26 years
The analysis identified six primary qualifications among aviation assessors, with the following distribution:
# Split qualifications by '/' and clean them
all_qualifications <- df %>%
filter(!is.na(qualifications), qualifications != "") %>%
pull(qualifications) %>%
str_split(" / ") %>%
unlist() %>%
str_trim() %>%
.[. != ""]
# Count qualifications
qual_counts <- table(all_qualifications) %>%
sort(decreasing = TRUE)
# Create qualifications data frame
qualifications_df <- data.frame(
Qualification = names(qual_counts),
Count = as.numeric(qual_counts),
Percentage = round((as.numeric(qual_counts) / nrow(df)) * 100, 1)
)
# Display table
qualifications_df %>%
kable(caption = "Qualification Distribution Among Aviation Assessors",
col.names = c("Qualification", "Count", "Percentage (%)")) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive")) %>%
row_spec(1, bold = TRUE, color = "white", background = "#2E8B57") %>%
row_spec(2, bold = TRUE, color = "white", background = "#4682B4") %>%
row_spec(3, bold = TRUE, color = "white", background = "#4682B4")
| Qualification | Count | Percentage (%) |
|---|---|---|
| Lloyd’s Agency Standards & Values | 71 | 72.4 |
| Technical Cargo Surveying | 40 | 40.8 |
| CCSP1 | 39 | 39.8 |
| CCSP2 | 29 | 29.6 |
| Claims & Recoveries | 14 | 14.3 |
| LLI eTutorial - NOT FOR PUBLIC VIEW | 1 | 1.0 |
# Create qualifications frequency chart
top_quals <- head(qual_counts, 10)
qual_plot_df <- data.frame(
Qualification = names(top_quals),
Count = as.numeric(top_quals)
)
ggplot(qual_plot_df, aes(x = reorder(Qualification, Count), y = Count)) +
geom_col(fill = "steelblue", alpha = 0.7) +
geom_text(aes(label = Count), hjust = -0.3, size = 4) +
coord_flip() +
labs(
title = "Top 10 Most Common Qualifications",
subtitle = "Distribution of qualifications among aviation assessors",
x = "Qualification",
y = "Number of Assessors"
) +
theme_minimal() +
theme(
plot.title = element_text(size = 16, face = "bold"),
plot.subtitle = element_text(size = 12),
axis.text = element_text(size = 10)
)
# Remove missing experience data
exp_data <- df %>%
filter(!is.na(years_of_experience)) %>%
pull(years_of_experience)
# Experience statistics
exp_stats <- data.frame(
Metric = c("Total Assessors with Data", "Average Experience", "Median Experience",
"Min Experience", "Max Experience"),
Value = c(length(exp_data),
paste0(round(mean(exp_data), 1), " years"),
paste0(round(median(exp_data), 1), " years"),
paste0(min(exp_data), " years"),
paste0(max(exp_data), " years"))
)
exp_stats %>%
kable(caption = "Experience Statistics",
col.names = c("Metric", "Value")) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"))
| Metric | Value |
|---|---|
| Total Assessors with Data | 96 |
| Average Experience | 25.6 years |
| Median Experience | 26 years |
| Min Experience | 1 years |
| Max Experience | 50 years |
# Define experience levels
df_with_levels <- df %>%
mutate(
experience_level = case_when(
is.na(years_of_experience) ~ "Unknown",
years_of_experience <= 5 ~ "Junior (0-5 years)",
years_of_experience <= 15 ~ "Mid-level (6-15 years)",
years_of_experience <= 30 ~ "Senior (16-30 years)",
TRUE ~ "Expert (30+ years)"
)
)
# Count by experience level
experience_levels <- df_with_levels %>%
count(experience_level, sort = TRUE) %>%
mutate(percentage = round((n / nrow(df)) * 100, 1))
# Create visualization
ggplot(experience_levels, aes(x = reorder(experience_level, n), y = n, fill = experience_level)) +
geom_col(alpha = 0.8) +
geom_text(aes(label = paste0(n, "\n(", percentage, "%)")),
hjust = 0.5, vjust = -0.5, size = 3.5) +
coord_flip() +
scale_fill_viridis_d(option = "plasma") +
labs(
title = "Experience Level Distribution",
subtitle = "Distribution of assessors by years of experience",
x = "Experience Level",
y = "Number of Assessors",
fill = "Experience Level"
) +
theme_minimal() +
theme(
legend.position = "none",
plot.title = element_text(size = 16, face = "bold"),
plot.subtitle = element_text(size = 12)
)
# Create experience distribution histogram
exp_df <- data.frame(years_of_experience = exp_data)
ggplot(exp_df, aes(x = years_of_experience)) +
geom_histogram(bins = 20, fill = "darkgreen", alpha = 0.7, color = "black") +
geom_vline(xintercept = mean(exp_data), color = "red", linestyle = "dashed", linewidth = 1) +
labs(
title = "Distribution of Years of Experience",
subtitle = paste("Mean:", round(mean(exp_data), 1), "years"),
x = "Years of Experience",
y = "Number of Assessors"
) +
theme_minimal() +
theme(
plot.title = element_text(size = 16, face = "bold"),
plot.subtitle = element_text(size = 12)
)
The data shows that aviation assessors typically have substantial experience, with 50% having 16+ years of experience.
# Count countries
country_counts <- df %>%
count(country, sort = TRUE)
# Display top countries
top_countries <- head(country_counts, 15)
ggplot(top_countries, aes(x = reorder(country, n), y = n)) +
geom_col(fill = "orange", alpha = 0.7) +
geom_text(aes(label = n), hjust = -0.3, size = 3.5) +
coord_flip() +
labs(
title = "Top 15 Countries by Number of Assessors",
subtitle = "Geographic distribution of aviation assessors",
x = "Country",
y = "Number of Assessors"
) +
theme_minimal() +
theme(
plot.title = element_text(size = 16, face = "bold"),
plot.subtitle = element_text(size = 12)
)
top_countries %>%
mutate(percentage = round((n / nrow(df)) * 100, 1)) %>%
head(10) %>%
kable(caption = "Top 10 Countries by Assessor Count",
col.names = c("Country", "Count", "Percentage (%)")) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"))
| Country | Count | Percentage (%) |
|---|---|---|
| China | 5 | 5.1 |
| Nigeria | 5 | 5.1 |
| Brazil | 4 | 4.1 |
| Italy | 4 | 4.1 |
| Panama | 4 | 4.1 |
| Tanzania, United Republic of | 4 | 4.1 |
| Australia | 3 | 3.1 |
| Peru | 3 | 3.1 |
| Philippines | 3 | 3.1 |
| United States of America | 3 | 3.1 |
# Create qualification combinations
combinations <- df %>%
filter(!is.na(qualifications), qualifications != "") %>%
mutate(
quals_list = str_split(qualifications, " / ") %>%
map(~ str_trim(.x) %>% .[. != ""]),
combination = map_chr(quals_list, ~ paste(sort(.x), collapse = " + "))
) %>%
filter(str_count(combination, " \\+ ") >= 1) %>% # At least 2 qualifications
pull(combination)
combination_counts <- table(combinations) %>%
sort(decreasing = TRUE)
# Create combinations data frame
combinations_df <- data.frame(
Combination = names(combination_counts),
Count = as.numeric(combination_counts),
Percentage = round((as.numeric(combination_counts) / nrow(df)) * 100, 1)
)
# Display top combinations
head(combinations_df, 10) %>%
kable(caption = "Top 10 Most Common Qualification Combinations",
col.names = c("Qualification Combination", "Count", "Percentage (%)")) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive")) %>%
row_spec(1, bold = TRUE, color = "white", background = "#2E8B57")
| Qualification Combination | Count | Percentage (%) |
|---|---|---|
| Lloyd’s Agency Standards & Values + Technical Cargo Surveying | 15 | 15.3 |
| CCSP1 + CCSP2 + Lloyd’s Agency Standards & Values | 13 | 13.3 |
| CCSP1 + CCSP2 + Claims & Recoveries + Lloyd’s Agency Standards & Values | 7 | 7.1 |
| CCSP1 + Lloyd’s Agency Standards & Values + Technical Cargo Surveying | 5 | 5.1 |
| CCSP1 + CCSP2 + Lloyd’s Agency Standards & Values + Technical Cargo Surveying | 4 | 4.1 |
| CCSP1 + Lloyd’s Agency Standards & Values | 4 | 4.1 |
| CCSP1 + CCSP2 + Claims & Recoveries + Lloyd’s Agency Standards & Values + Technical Cargo Surveying | 3 | 3.1 |
| Claims & Recoveries + Lloyd’s Agency Standards & Values + Technical Cargo Surveying | 3 | 3.1 |
| CCSP1 + CCSP2 + Technical Cargo Surveying | 1 | 1.0 |
| CCSP1 + Claims & Recoveries + Lloyd’s Agency Standards & Values + Technical Cargo Surveying | 1 | 1.0 |
# Create a comprehensive analysis of qualifications by experience level
experience_qual_analysis <- function() {
levels <- c("Junior (0-5 years)", "Mid-level (6-15 years)",
"Senior (16-30 years)", "Expert (30+ years)")
results <- list()
for (level in levels) {
level_data <- df_with_levels %>%
filter(experience_level == level)
if (nrow(level_data) > 0) {
# Get most common qualifications for this level
all_quals <- level_data %>%
filter(!is.na(qualifications), qualifications != "") %>%
pull(qualifications) %>%
str_split(" / ") %>%
unlist() %>%
str_trim() %>%
.[. != ""]
if (length(all_quals) > 0) {
qual_counts <- table(all_quals) %>%
sort(decreasing = TRUE)
results[[level]] <- data.frame(
Experience_Level = level,
Qualification = names(qual_counts),
Count = as.numeric(qual_counts),
Percentage = round((as.numeric(qual_counts) / nrow(level_data)) * 100, 1)
)
}
}
}
return(bind_rows(results))
}
# Get the analysis results
qual_by_exp <- experience_qual_analysis()
# Create heatmap visualization
ggplot(qual_by_exp, aes(x = Qualification, y = Experience_Level, fill = Percentage)) +
geom_tile(color = "white", size = 0.5) +
geom_text(aes(label = paste0(Percentage, "%")), color = "white", size = 3.5, fontface = "bold") +
scale_fill_gradient(low = "#E8F4FD", high = "#1E3A8A", name = "Percentage (%)") +
labs(
title = "Qualification Distribution by Experience Level",
subtitle = "Percentage of assessors with each qualification by experience level",
x = "Qualification",
y = "Experience Level"
) +
theme_minimal() +
theme(
axis.text.x = element_text(angle = 45, hjust = 1),
plot.title = element_text(size = 16, face = "bold"),
plot.subtitle = element_text(size = 12)
)
# Create interactive qualifications plot
qual_interactive <- plot_ly(
qualifications_df,
x = ~Count,
y = ~reorder(Qualification, Count),
type = 'bar',
text = ~paste("Count:", Count, "<br>Percentage:", Percentage, "%"),
hoverinfo = 'text',
marker = list(color = 'steelblue')
) %>%
layout(
title = "Top Qualifications - Interactive View",
xaxis = list(title = "Number of Assessors"),
yaxis = list(title = "Qualification")
)
qual_interactive
# Create an interactive data table
df %>%
select(assessor_name, agent_location, qualifications, years_of_experience) %>%
mutate(
qualifications = str_trunc(qualifications, 50),
agent_location = str_trunc(agent_location, 30)
) %>%
datatable(
caption = "Aviation Assessors Data Explorer",
options = list(
pageLength = 10,
scrollX = TRUE,
dom = 'Bfrtip'
),
colnames = c("Assessor Name", "Location", "Qualifications", "Experience (Years)")
)
# Create comprehensive summary
summary_stats <- data.frame(
Category = c("Total Assessors", "Countries Represented", "Average Experience",
"Median Experience", "Most Common Qualification", "Top Country"),
Value = c(
nrow(df),
length(unique(df$country)),
paste0(round(mean(df$years_of_experience, na.rm = TRUE), 1), " years"),
paste0(round(median(df$years_of_experience, na.rm = TRUE), 1), " years"),
names(qual_counts)[1],
country_counts$country[1]
)
)
summary_stats %>%
kable(caption = "Analysis Summary Statistics",
col.names = c("Category", "Value")) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"))
| Category | Value |
|---|---|
| Total Assessors | 98 |
| Countries Represented | 54 |
| Average Experience | 25.6 years |
| Median Experience | 26 years |
| Most Common Qualification | Lloyd’s Agency Standards & Values |
| Top Country | China |
The analysis reveals that aviation assessors share several common attributes:
Report generated on 2025-09-07 using R Markdown with inline data analysis