This report examines Vietnamese high school teachers’ readiness for digital transformation. The analysis focuses on three levels: descriptive characteristics of the sample, readiness patterns across domains and questionnaire items, and the predictive value of demographic and school-context variables for overall readiness.
Key outcome: The findings suggest that Vietnamese high school teachers generally demonstrate a relatively high level of readiness for digital transformation. However, this readiness is stronger in conceptual and attitudinal domains than in practical technological knowledge and actual implementation. Therefore, the most effective policy direction is not merely to promote awareness of digital transformation, but to strengthen teachers’ hands-on technological capacity and the school-level conditions that enable implementation. In particular, policies should prioritize practice-oriented professional development, stronger technical and institutional support within schools, and incentive mechanisms that encourage sustained classroom application. In this sense, improving readiness requires moving from policy advocacy to implementation support.
## $missing_in_data
## character(0)
##
## $coded_but_not_mapped
## character(0)
##
## $mapped_but_not_in_codebook
## character(0)
ft1 <- ft_table(sample_table, font_size = 9.5, fit_width = TRUE, page_width = 6.5) %>%
flextable::set_header_labels(
Characteristic = "Characteristic",
Category = "Category",
n = "n",
Percent = "%"
) %>%
flextable::merge_v(j = "Characteristic") %>%
flextable::valign(j = "Characteristic", valign = "top", part = "body") %>%
flextable::align(j = c("Characteristic", "Category"), align = "left", part = "body") %>%
flextable::align(j = c("n", "Percent"), align = "center", part = "body") %>%
flextable::width(j = "Characteristic", width = 1.45) %>%
flextable::width(j = "Category", width = 3.10) %>%
flextable::width(j = "n", width = 0.65) %>%
flextable::width(j = "Percent", width = 0.60)
ft1
Characteristic | Category | n | % |
|---|---|---|---|
Province | Bac Giang | 1,772 | 15.5 |
Hung Yen | 1,636 | 14.3 | |
Nghe An | 856 | 7.5 | |
Can Tho | 1,910 | 16.7 | |
Ho Chi Minh City | 5,274 | 46.1 | |
School location | Urban area | 6,629 | 57.9 |
Rural area | 4,461 | 39.0 | |
Remote/Island area | 358 | 3.1 | |
Gender | Male | 3,668 | 32.0 |
Female | 7,772 | 67.9 | |
Other | 8 | 0.1 | |
Age | Under 35 years | 2,306 | 20.1 |
35 to under 45 years | 5,706 | 49.8 | |
46 to under 55 years | 3,032 | 26.5 | |
55 years and above | 404 | 3.5 | |
Qualification | Bachelor's degree | 8,023 | 70.1 |
Master's degree | 3,407 | 29.8 | |
Doctorate degree | 18 | 0.2 | |
Teaching years | Less than 5 years | 1,064 | 9.3 |
5 to under 10 years | 1,473 | 12.9 | |
10 to under 20 years | 5,025 | 43.9 | |
20 years or more | 3,886 | 33.9 |
knitr::include_graphics(province_map_file)
p_school_loc <- ggplot2::ggplot(
school_plot_dat,
ggplot2::aes(x = n, y = School_located, fill = fill_col)
) +
ggplot2::geom_col(width = 0.7, show.legend = FALSE) +
ggplot2::geom_text(
ggplot2::aes(label = label),
nudge_x = 120,
hjust = 0,
size = 4,
colour = vinuni_cols["blue_dark"]
) +
ggplot2::scale_fill_identity() +
ggplot2::labs(
title = "School location",
x = "Number of teachers",
y = NULL
) +
ggplot2::expand_limits(x = max(school_plot_dat$n) * 1.18) +
theme_vinuni(base_size = 12)
p_school_loc
save_plot(p_school_loc, "fig_school_location.png", width = 8.5, height = 4.8)
## [1] "vinuni_outputs/figures/fig_school_location.png"
p_gender <- ggplot2::ggplot(
gender_plot_dat,
ggplot2::aes(ymax = ymax, ymin = ymin, xmax = 4, xmin = 2, fill = fill_col)
) +
ggplot2::geom_rect(colour = "white", linewidth = 0.6) +
ggplot2::geom_text(
ggplot2::aes(x = 3, y = label_pos, label = label),
size = 4,
colour = "white",
fontface = "bold"
) +
ggplot2::coord_polar(theta = "y") +
ggplot2::xlim(0, 4.5) +
ggplot2::scale_fill_identity() +
ggplot2::labs(
title = "Gender distribution"
) +
ggplot2::theme_void() +
ggplot2::theme(
plot.title = ggplot2::element_text(
hjust = 0.5, face = "bold", size = 16, colour = vinuni_cols["blue_dark"]
),
legend.position = "none"
)
p_gender
save_plot(p_gender, "fig_gender_donut.png", width = 6.2, height = 6.2)
## [1] "vinuni_outputs/figures/fig_gender_donut.png"
p_age <- ggplot2::ggplot(age_plot_dat, ggplot2::aes(x = pct, y = Age)) +
ggplot2::geom_segment(
ggplot2::aes(x = 0, xend = pct, yend = Age),
linewidth = 2.5,
colour = vinuni_cols["blue_soft"]
) +
ggplot2::geom_point(
size = 5,
colour = vinuni_cols["blue_dark"]
) +
ggplot2::geom_text(
ggplot2::aes(label = label),
nudge_x = 1.2,
hjust = 0,
size = 4,
colour = vinuni_cols["blue_dark"]
) +
ggplot2::labs(
title = "Age profile",
x = "Percentage of sample",
y = NULL
) +
ggplot2::expand_limits(x = max(age_plot_dat$pct) * 1.18) +
theme_vinuni(base_size = 12)
p_age
save_plot(p_age, "fig_age_lollipop.png", width = 8.5, height = 4.8)
## [1] "vinuni_outputs/figures/fig_age_lollipop.png"
p_teach <- ggplot2::ggplot(
teach_plot_dat,
ggplot2::aes(x = pct, y = Teaching_years, fill = fill_col)
) +
ggplot2::geom_col(width = 0.68, show.legend = FALSE) +
ggplot2::geom_text(
ggplot2::aes(label = label),
nudge_x = 1.1,
hjust = 0,
size = 4,
colour = vinuni_cols["blue_dark"]
) +
ggplot2::scale_fill_identity() +
ggplot2::labs(
title = "Teaching experience",
x = "Percentage of sample",
y = NULL
) +
ggplot2::expand_limits(x = max(teach_plot_dat$pct) * 1.18) +
theme_vinuni(base_size = 12)
p_teach
save_plot(p_teach, "fig_teaching_years.png", width = 8.5, height = 5)
## [1] "vinuni_outputs/figures/fig_teaching_years.png"
p_qual <- ggplot2::ggplot(
qual_plot_dat,
ggplot2::aes(x = Qualification, y = pct, fill = fill_col)
) +
ggplot2::geom_col(width = 0.62, show.legend = FALSE) +
ggplot2::geom_text(
ggplot2::aes(label = label),
vjust = -0.4,
size = 4,
colour = vinuni_cols["blue_dark"]
) +
ggplot2::scale_fill_identity() +
ggplot2::labs(
title = "Qualification",
x = NULL,
y = "Percentage of sample"
) +
ggplot2::expand_limits(y = max(qual_plot_dat$pct) * 1.12) +
theme_vinuni(base_size = 12)
p_qual
save_plot(p_qual, "fig_qualification.png", width = 7.5, height = 5)
## [1] "vinuni_outputs/figures/fig_qualification.png"
ft2 <- ft_table(domain_summary, font_size = 10, fit_width = TRUE, page_width = 6.5) %>%
flextable::set_header_labels(
Domain = "Domain",
n_items = "No. of items",
mean = "Mean",
sd = "SD",
median = "Median",
min = "Minimum",
max = "Maximum"
) %>%
flextable::colformat_double(j = c("mean", "sd", "median", "min", "max"), digits = 2) %>%
flextable::align(j = "Domain", align = "left", part = "body") %>%
flextable::align(j = c("n_items", "mean", "sd", "median", "min", "max"), align = "center", part = "all") %>%
flextable::width(j = "Domain", width = 3.20) %>%
flextable::width(j = "n_items", width = 0.85)
ft2
Domain | No. of items | Mean | SD | Median | Minimum | Maximum |
|---|---|---|---|---|---|---|
Content Knowledge (CK) | 4 | 4.11 | 0.87 | 4.00 | 1.00 | 5.00 |
Technological Knowledge (TK) | 8 | 3.79 | 0.88 | 4.00 | 1.00 | 5.00 |
Technological Pedagogical Knowledge (TPK) | 7 | 3.93 | 0.84 | 4.00 | 1.00 | 5.00 |
Perceived Value (NKV) | 8 | 4.07 | 0.88 | 4.00 | 1.00 | 5.00 |
Perceived Competence (NKL) | 5 | 3.92 | 0.85 | 4.00 | 1.00 | 5.00 |
Attitudinal Support (AS) | 4 | 4.01 | 0.85 | 4.00 | 1.00 | 5.00 |
Facilitating Conditions (DK) | 5 | 3.89 | 0.87 | 4.00 | 1.00 | 5.00 |
Intention to Use (YD) | 6 | 4.02 | 0.85 | 4.00 | 1.00 | 5.00 |
Actual Practice (HV) | 6 | 3.81 | 0.86 | 4.00 | 1.00 | 5.00 |
Overall Readiness | 53 | 3.94 | 0.79 | 4.00 | 1.00 | 5.00 |
p_domain_mean_only_clean
save_plot(p_domain_mean_only_clean, "fig_domain_mean_only_clean.png", width = 10, height = 6)
## [1] "vinuni_outputs/figures/fig_domain_mean_only_clean.png"
The domain-level results indicate a relatively high overall level of readiness. Content Knowledge achieved the highest mean score, while Technological Knowledge and Actual Practice were comparatively lower. This pattern suggests that teachers appear more confident in their subject-related and conceptual readiness than in their practical technological execution.
ft_insight <- ft_table(insight_table, font_size = 10, fit_width = TRUE, page_width = 5.8) %>%
flextable::align(j = c("Insight", "Value"), align = "left", part = "body")
ft_insight
Insight | Value |
|---|---|
Sample size | 11448 |
Highest-scoring domain | Content Knowledge (CK) (4.11) |
Lowest-scoring domain | Technological Knowledge (TK) (3.79) |
Overall readiness mean | 3.94 |
Overall readiness median | 4.00 |
p_ck <- plot_item_domain_box("CK", "Content Knowledge (CK)")
p_tk <- plot_item_domain_box("TK", "Technological Knowledge (TK)")
p_tpk <- plot_item_domain_box("TPK", "Technological Pedagogical Knowledge (TPK)")
p_nkv <- plot_item_domain_box("NKV", "Perceived Value (NKV)")
p_nkl <- plot_item_domain_violin("NKL", "Perceived Competence (NKL)")
p_as <- plot_item_domain_violin("AS", "Attitudinal Support (AS)")
p_dk <- plot_item_domain_violin("DK", "Facilitating Conditions (DK)")
p_yd <- plot_item_domain_box("YD", "Intention to Use (YD)")
p_hv <- plot_item_domain_box("HV", "Actual Practice (HV)")
p_ck
p_tk
p_tpk
p_nkv
p_nkl
p_as