Tapşırıq bankının vizuallaşdırılması CAT sistemlərinin anlaşılması, qiymətləndirilməsi və optimallaşdırılması üçün əsas vasitədir. Bu bölmədə bank məlumatlarını effektiv şəkildə vizuallaşdırmaq üçün müxtəlif qrafik texnikalarını öyrənəcəksiniz.
Yaxşı vizuallaşdırma sadəcə gözəl qrafiklər yaratmaq deyil - məlumatların arxasındakı nümunələri, əlaqələri və problemləri aşkar etmək deməkdir.
# Nümunə tapşırıq bankını yaradaq (əgər yoxdursa)
if(!exists("item_bank")) {
set.seed(12345)
# Çətinlik parametrlərinin stratifikasiyası
difficulty_levels <- c(
rep(-2.5, 10), # Çox asan (10%)
rep(-1.5, 15), # Asan (15%)
rep(-0.5, 20), # Orta-asan (20%)
rep(0.0, 20), # Orta (20%)
rep(0.5, 20), # Orta-çətin (20%)
rep(1.5, 10), # Çətin (10%)
rep(2.5, 5) # Çox çətin (5%)
)
item_bank <- data.frame(
item_id = 1:100,
a = runif(100, 0.8, 2.5), # Ayrıd edicilik
b = difficulty_levels + rnorm(100, 0, 0.2), # Çətinlik
c = runif(100, 0.1, 0.25), # Təsadüfi doğru cavab
content_area = sample(c("Riyaziyyat", "Fizika", "Kimya",
"Biologiya", "Tarix"), 100, replace = TRUE),
cognitive_level = sample(c("Bilgi", "Anlayış", "Tətbiq",
"Analiz", "Sintez"), 100, replace = TRUE),
time_limit = sample(60:180, 100, replace = TRUE), # saniyə
stringsAsFactors = FALSE
)
}
cat("Tapşırıq bankı yaradıldı - Ümumi tapşırıq sayı:", nrow(item_bank), "\n")
## Tapşırıq bankı yaradıldı - Ümumi tapşırıq sayı: 100
# Çətinlik parametrinin histogramı
plot_difficulty_distribution <- function(item_bank) {
# Çətinlik statistikaları
mean_diff <- mean(item_bank$b)
sd_diff <- sd(item_bank$b)
p <- ggplot(item_bank, aes(x = b)) +
geom_histogram(bins = 25, fill = "skyblue", color = "black", alpha = 0.7) +
geom_density(aes(y = ..scaled.. * max(..count..)), color = "red", size = 1.2) +
labs(title = "Çətinlik Parametrinin Paylanması",
subtitle = paste("Orta =", round(mean_diff, 2), ", SD =", round(sd_diff, 2)),
x = "Çətinlik (b)", y = "Tezlik") +
theme_minimal() +
geom_vline(xintercept = 0, color = "red", linetype = "dashed", size = 1) +
geom_vline(xintercept = mean_diff, color = "blue", linetype = "dashed", size = 1) +
annotate("text", x = 0.5, y = max(table(cut(item_bank$b, 25))) * 0.8,
label = "Orta çətinlik", color = "red", size = 3.5) +
annotate("text", x = mean_diff + 0.5, y = max(table(cut(item_bank$b, 25))) * 0.6,
label = paste("Bank ortası =", round(mean_diff, 2)), color = "blue", size = 3.5)
return(p)
}
# Çətinlik paylanması qrafiki
difficulty_plot <- plot_difficulty_distribution(item_bank)
print(difficulty_plot)
# Ayrıd edicilik parametrinin təkmilləşdirilmiş histogramı
plot_discrimination_distribution <- function(item_bank) {
# Keyfiyyət kateqoriyaları
item_bank$disc_category <- cut(item_bank$a,
breaks = c(0, 0.8, 1.2, 1.8, Inf),
labels = c("Aşağı (<0.8)", "Orta (0.8-1.2)",
"Yüksək (1.2-1.8)", "Əla (>1.8)"))
p <- ggplot(item_bank, aes(x = a, fill = disc_category)) +
geom_histogram(bins = 20, color = "black", alpha = 0.8) +
scale_fill_viridis_d(name = "Keyfiyyət") +
labs(title = "Ayrıd Edicilik Parametrinin Paylanması",
subtitle = "Keyfiyyət kateqoriyalarına görə rənglənmiş",
x = "Ayrıd Edicilik (a)", y = "Tezlik") +
theme_minimal() +
geom_vline(xintercept = c(0.8, 1.2, 1.8), color = "red", linetype = "dashed") +
theme(legend.position = "bottom")
return(p)
}
# Ayrıd edicilik paylanması
discrimination_plot <- plot_discrimination_distribution(item_bank)
print(discrimination_plot)
# Təsadüfi cavab parametrinin boxplot və histogram kombinasiyası
plot_guessing_distribution <- function(item_bank) {
# Ana qrafik
p1 <- ggplot(item_bank, aes(x = c)) +
geom_histogram(bins = 15, fill = "lightyellow", color = "black", alpha = 0.8) +
geom_density(aes(y = ..scaled.. * max(..count..)), color = "darkred", size = 1.2) +
labs(title = "Təsadüfi Cavab Parametrinin Paylanması",
x = "Təsadüfi Cavab (c)", y = "Tezlik") +
theme_minimal() +
geom_vline(xintercept = c(0.15, 0.25), color = "red", linetype = "dashed") +
annotate("text", x = 0.15, y = max(table(cut(item_bank$c, 15))) * 0.9,
label = "İdeal alt hədd", color = "red", size = 3, angle = 90) +
annotate("text", x = 0.25, y = max(table(cut(item_bank$c, 15))) * 0.9,
label = "İdeal üst hədd", color = "red", size = 3, angle = 90)
# Boxplot
p2 <- ggplot(item_bank, aes(y = c)) +
geom_boxplot(fill = "lightyellow", color = "black", width = 0.5) +
labs(title = "c Parametri Boxplot", y = "Təsadüfi Cavab (c)") +
theme_minimal() +
theme(axis.text.x = element_blank(), axis.ticks.x = element_blank()) +
coord_flip()
# Kombinasiya
grid.arrange(p1, p2, ncol = 1, heights = c(3, 1))
}
# Təsadüfi cavab paylanması
plot_guessing_distribution(item_bank)
# Ayrıd edicilik vs Çətinlik scatter plot
plot_discrimination_difficulty <- function(item_bank) {
# Korrelyasiya hesablayın
correlation <- cor(item_bank$a, item_bank$b)
p <- ggplot(item_bank, aes(x = b, y = a, color = content_area)) +
geom_point(size = 3, alpha = 0.7) +
geom_smooth(method = "lm", se = FALSE, color = "black", linetype = "dashed") +
labs(title = "Ayrıd Edicilik vs Çətinlik",
subtitle = paste("Korrelyasiya r =", round(correlation, 3)),
x = "Çətinlik (b)", y = "Ayrıd Edicilik (a)",
color = "Məzmun Sahəsi") +
theme_minimal() +
geom_hline(yintercept = 1.0, color = "red", linetype = "dashed", size = 1) +
geom_vline(xintercept = 0, color = "red", linetype = "dashed", size = 1, alpha = 0.5) +
annotate("text", x = max(item_bank$b) * 0.8, y = 1.1,
label = "Minimum keyfiyyət həddi", color = "red", size = 3.5) +
scale_color_viridis_d() +
theme(legend.position = "bottom")
return(p)
}
# Scatter plot
scatter_plot <- plot_discrimination_difficulty(item_bank)
print(scatter_plot)
# Parametr korrelyasiya matrisi vizuallaşdırması
plot_parameter_correlations <- function(item_bank) {
# Parametr matrisi
param_matrix <- item_bank[, c("a", "b", "c")]
correlation_matrix <- cor(param_matrix)
# ggplot ilə korrelyasiya matrisi
cor_melted <- expand.grid(Var1 = rownames(correlation_matrix),
Var2 = colnames(correlation_matrix))
cor_melted$value <- as.vector(correlation_matrix)
p <- ggplot(cor_melted, aes(Var1, Var2, fill = value)) +
geom_tile(color = "white", size = 0.5) +
geom_text(aes(label = round(value, 3)), color = "black", size = 5, fontface = "bold") +
scale_fill_gradient2(low = "blue", high = "red", mid = "white",
midpoint = 0, limit = c(-1,1), space = "Lab",
name="Korrelyasiya") +
labs(title = "IRT Parametrləri Korrelyasiya Matrisi",
x = "Parametr", y = "Parametr") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1),
panel.grid = element_blank()) +
coord_fixed()
return(p)
}
# Korrelyasiya matrisi
correlation_plot <- plot_parameter_correlations(item_bank)
print(correlation_plot)
# Çoxöçlülü scatter plot matrisi
create_parameter_pairs_plot <- function(item_bank) {
# Parametr subset
param_data <- item_bank[, c("a", "b", "c", "content_area")]
# GGally ilə pairs plot (əgər mövcuddursa)
if(require(GGally, quietly = TRUE)) {
p <- ggpairs(param_data,
columns = 1:3,
aes(color = content_area, alpha = 0.7),
upper = list(continuous = "cor"),
lower = list(continuous = "points"),
diag = list(continuous = "densityDiag")) +
labs(title = "IRT Parametrləri Pairs Plot") +
theme_minimal()
return(p)
} else {
# Manuel pairs plot
p1 <- ggplot(param_data, aes(x = a, y = b, color = content_area)) +
geom_point(alpha = 0.7) + theme_minimal() +
labs(title = "a vs b")
p2 <- ggplot(param_data, aes(x = a, y = c, color = content_area)) +
geom_point(alpha = 0.7) + theme_minimal() +
labs(title = "a vs c")
p3 <- ggplot(param_data, aes(x = b, y = c, color = content_area)) +
geom_point(alpha = 0.7) + theme_minimal() +
labs(title = "b vs c")
combined_plot <- grid.arrange(p1, p2, p3, ncol = 3)
return(combined_plot)
}
}
# Pairs plot
pairs_plot <- create_parameter_pairs_plot(item_bank)
print(pairs_plot)
# Məzmun sahələrinə görə parametr paylanmaları
plot_content_area_distributions <- function(item_bank) {
# Çətinlik paylanması məzmun sahələrinə görə
p1 <- ggplot(item_bank, aes(x = content_area, y = b, fill = content_area)) +
geom_violin(alpha = 0.7, scale = "width") +
geom_boxplot(width = 0.2, fill = "white", alpha = 0.8) +
labs(title = "Məzmun Sahələrinə Görə Çətinlik Paylanması",
x = "Məzmun Sahəsi", y = "Çətinlik (b)") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1),
legend.position = "none") +
scale_fill_viridis_d()
# Ayrıd edicilik paylanması
p2 <- ggplot(item_bank, aes(x = content_area, y = a, fill = content_area)) +
geom_violin(alpha = 0.7, scale = "width") +
geom_boxplot(width = 0.2, fill = "white", alpha = 0.8) +
labs(title = "Məzmun Sahələrinə Görə Ayrıd Edicilik Paylanması",
x = "Məzmun Sahəsi", y = "Ayrıd Edicilik (a)") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1),
legend.position = "none") +
scale_fill_viridis_d()
# Kombinasiya
grid.arrange(p1, p2, ncol = 1)
}
# Məzmun sahələri paylanması
plot_content_area_distributions(item_bank)
# Məzmun sahələri və çətinlik kateqoriyaları heatmap
create_content_difficulty_heatmap <- function(item_bank) {
# Çətinlik kateqoriyaları yaradın
item_bank$difficulty_category <- cut(item_bank$b,
breaks = c(-Inf, -1.5, -0.5, 0.5, 1.5, Inf),
labels = c("Çox asan", "Asan", "Orta", "Çətin", "Çox çətin"))
# Kontinqens cədvəli
heatmap_data <- as.data.frame(table(item_bank$content_area, item_bank$difficulty_category))
names(heatmap_data) <- c("Content_Area", "Difficulty", "Count")
# Faizlə normalizasiya (hər məzmun sahəsi üçün)
heatmap_data <- heatmap_data %>%
group_by(Content_Area) %>%
mutate(Percentage = Count / sum(Count) * 100) %>%
ungroup()
p <- ggplot(heatmap_data, aes(x = Difficulty, y = Content_Area, fill = Percentage)) +
geom_tile(color = "white", size = 0.5) +
geom_text(aes(label = paste0(Count, "\n(", round(Percentage, 1), "%)")),
color = "black", size = 3, fontface = "bold") +
scale_fill_viridis_c(name = "Faiz") +
labs(title = "Məzmun Sahəsi - Çətinlik Kateqoriyası Heatmap",
subtitle = "Hər məzmun sahəsi üçün çətinlik paylanması",
x = "Çətinlik Kateqoriyası", y = "Məzmun Sahəsi") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
return(p)
}
# Content-difficulty heatmap
heatmap_plot <- create_content_difficulty_heatmap(item_bank)
print(heatmap_plot)
# Test Məlumat Funksiyası və komponent təhlili
plot_test_information_function <- function(item_bank, theta_range = c(-4, 4)) {
# Theta nöqtələri
theta <- seq(theta_range[1], theta_range[2], 0.05)
n_items <- nrow(item_bank)
# Hər tapşırıq üçün məlumat hesablayın
individual_info <- matrix(0, nrow = length(theta), ncol = n_items)
total_information <- numeric(length(theta))
for(i in 1:n_items) {
a <- item_bank$a[i]
b <- item_bank$b[i]
c <- item_bank$c[i]
# P(θ) və Q(θ)
P <- c + (1 - c) * plogis(a * (theta - b))
Q <- 1 - P
# P*(θ) və Q*(θ)
P_star <- (P - c) / (1 - c)
Q_star <- 1 - P_star
# Item information
item_info <- (a^2 * P_star * Q_star) / (P * Q)
item_info[is.nan(item_info) | is.infinite(item_info)] <- 0
individual_info[, i] <- item_info
total_information <- total_information + item_info
}
# TIF məlumatları
tif_data <- data.frame(
theta = theta,
information = total_information,
se = 1 / sqrt(total_information)
)
# Məzmun sahələrinə görə TIF komponentləri
content_areas <- unique(item_bank$content_area)
content_info <- data.frame(theta = theta)
for(area in content_areas) {
area_indices <- which(item_bank$content_area == area)
area_info <- rowSums(individual_info[, area_indices, drop = FALSE])
content_info[[area]] <- area_info
}
# TIF ana qrafik
p1 <- ggplot(tif_data, aes(x = theta, y = information)) +
geom_line(size = 1.5, color = "blue") +
geom_area(alpha = 0.3, fill = "lightblue") +
labs(title = "Test Məlumat Funksiyası (TIF)",
subtitle = paste("Ümumi", n_items, "tapşırıq"),
x = "Qabiliyyət Səviyyəsi (θ)", y = "Test Məlumatı") +
theme_minimal() +
geom_vline(xintercept = 0, linetype = "dashed", alpha = 0.5) +
annotate("text", x = 0.5, y = max(tif_data$information) * 0.9,
label = paste("Maks. məlumat:", round(max(tif_data$information), 1)))
# Standart xəta qrafiki
p2 <- ggplot(tif_data, aes(x = theta, y = se)) +
geom_line(size = 1.5, color = "red") +
geom_hline(yintercept = c(0.25, 0.35), linetype = "dashed", alpha = 0.7) +
labs(title = "Standart Xəta Funksiyası",
x = "Qabiliyyət Səviyyəsi (θ)", y = "Standart Xəta") +
theme_minimal() +
annotate("text", x = theta_range[2] * 0.7, y = 0.25,
label = "SE = 0.25", color = "blue", size = 3) +
annotate("text", x = theta_range[2] * 0.7, y = 0.35,
label = "SE = 0.35", color = "blue", size = 3)
# Məzmun sahələrinə görə TIF komponentləri
content_long <- content_info %>%
reshape2::melt(id.vars = "theta", variable.name = "Content_Area", value.name = "Information")
p3 <- ggplot(content_long, aes(x = theta, y = Information, color = Content_Area)) +
geom_line(size = 1.2) +
labs(title = "Məzmun Sahələrinə Görə TIF Komponentləri",
x = "Qabiliyyət Səviyyəsi (θ)", y = "Məlumat") +
theme_minimal() +
scale_color_viridis_d() +
theme(legend.position = "bottom")
# Bütün qrafiklari birləşdir
grid.arrange(p1, p2, p3, ncol = 1)
return(list(tif_data = tif_data, content_info = content_info))
}
# TIF vizuallaşdırması
tif_results <- plot_test_information_function(item_bank)
# 3D parametr scatter plot (plotly ilə)
create_3d_parameter_plot <- function(item_bank) {
if(require(plotly, quietly = TRUE)) {
# 3D scatter plot
p <- plot_ly(item_bank,
x = ~a, y = ~b, z = ~c,
color = ~content_area,
colors = viridis::viridis(5),
size = 3,
type = "scatter3d",
mode = "markers",
hovertemplate = paste(
"<b>Tapşırıq %{text}</b><br>",
"a: %{x:.3f}<br>",
"b: %{y:.3f}<br>",
"c: %{z:.3f}<br>",
"Məzmun: %{color}<br>",
"<extra></extra>"
),
text = ~item_id) %>%
layout(
title = "3D IRT Parametr Məkanı",
scene = list(
xaxis = list(title = "Ayrıd Edicilik (a)"),
yaxis = list(title = "Çətinlik (b)"),
zaxis = list(title = "Təsadüfi Cavab (c)")
)
)
return(p)
} else {
# Static alternative
cat("plotly paketi yoxdur. Static 2D projeksiyas yaradılır.\n")
# 2D projeksiyas
p1 <- ggplot(item_bank, aes(x = a, y = b, size = c, color = content_area)) +
geom_point(alpha = 0.7) +
labs(title = "2D Projeksiyas: a-b (ölçü = c)",
x = "Ayrıd Edicilik (a)", y = "Çətinlik (b)",
size = "c parametri") +
theme_minimal()
return(p1)
}
}
# 3D plot
parameter_3d <- create_3d_parameter_plot(item_bank)
print(parameter_3d)
# Comprehensive bank keyfiyyəti dashboard
create_comprehensive_dashboard <- function(item_bank) {
# 1. Parametr paylanma summary
p1 <- ggplot(item_bank, aes(x = a)) +
geom_histogram(bins = 15, fill = "lightblue", alpha = 0.7, color = "black") +
geom_vline(xintercept = c(0.8, 1.5), color = "red", linetype = "dashed") +
labs(title = "Ayrıd Edicilik", x = "a", y = "Tezlik") +
theme_minimal() + theme(plot.title = element_text(size = 10))
p2 <- ggplot(item_bank, aes(x = b)) +
geom_histogram(bins = 15, fill = "lightgreen", alpha = 0.7, color = "black") +
geom_vline(xintercept = 0, color = "red", linetype = "dashed") +
labs(title = "Çətinlik", x = "b", y = "Tezlik") +
theme_minimal() + theme(plot.title = element_text(size = 10))
p3 <- ggplot(item_bank, aes(x = c)) +
geom_histogram(bins = 10, fill = "lightyellow", alpha = 0.7, color = "black") +
geom_vline(xintercept = c(0.15, 0.25), color = "red", linetype = "dashed") +
labs(title = "Təsadüfi Cavab", x = "c", y = "Tezlik") +
theme_minimal() + theme(plot.title = element_text(size = 10))
# 2. Məzmun balansı
content_summary <- item_bank %>%
count(content_area) %>%
mutate(percentage = round(n/sum(n)*100, 1))
p4 <- ggplot(content_summary, aes(x = reorder(content_area, n), y = n, fill = content_area)) +
geom_col() +
geom_text(aes(label = paste0(n, " (", percentage, "%)")), hjust = -0.1, size = 3) +
coord_flip() +
labs(title = "Məzmun Sahələri Balansı", x = "Məzmun Sahəsi", y = "Tapşırıq Sayı") +
theme_minimal() +
theme(legend.position = "none", plot.title = element_text(size = 10))
# 3. Parametr scatter
p5 <- ggplot(item_bank, aes(x = b, y = a, color = content_area)) +
geom_point(alpha = 0.7, size = 2) +
geom_hline(yintercept = 1.0, color = "red", linetype = "dashed") +
labs(title = "Parametr Əlaqəsi", x = "Çətinlik (b)", y = "Ayrıd Edicilik (a)") +
theme_minimal() +
theme(legend.position = "none", plot.title = element_text(size = 10)) +
scale_color_viridis_d()
# 4. Keyfiyyət metriklər
quality_metrics <- data.frame(
Metric = c("Yüksək a (>1.5)", "Aşağı c (<0.25)", "Orta b (|b|<2)", "Ümumi keyfiyyət"),
Value = c(
round(sum(item_bank$a > 1.5) / nrow(item_bank) * 100, 1),
round(sum(item_bank$c < 0.25) / nrow(item_bank) * 100, 1),
round(sum(abs(item_bank$b) < 2) / nrow(item_bank) * 100, 1),
round(mean(c(sum(item_bank$a > 1.5), sum(item_bank$c < 0.25),
sum(abs(item_bank$b) < 2))) / nrow(item_bank) * 100, 1)
)
)
p6 <- ggplot(quality_metrics, aes(x = reorder(Metric, Value), y = Value, fill = Metric)) +
geom_col() +
geom_text(aes(label = paste0(Value, "%")), hjust = -0.1, size = 3) +
coord_flip() +
labs(title = "Keyfiyyət Göstəriciləri", x = "Metrik", y = "Faiz") +
theme_minimal() +
theme(legend.position = "none", plot.title = element_text(size = 10)) +
scale_fill_viridis_d()
# Dashboard layout
grid.arrange(p1, p2, p3, p4, p5, p6, ncol = 3, nrow = 2,
top = "Tapşırıq Bankı Keyfiyyət Dashboard-u")
}
# Comprehensive dashboard
create_comprehensive_dashboard(item_bank)
# İnteraktiv boxplot - məzmun sahələrinə görə parametr paylanmaları
create_interactive_parameter_boxplots <- function(item_bank) {
if(require(plotly, quietly = TRUE)) {
# Məlumatları uzun formata çevir
param_long <- item_bank %>%
select(item_id, content_area, a, b, c) %>%
reshape2::melt(id.vars = c("item_id", "content_area"),
variable.name = "Parameter", value.name = "Value")
# Parameter adlarını Azərbaycan dilinə çevir
param_long$Parameter <- factor(param_long$Parameter,
levels = c("a", "b", "c"),
labels = c("Ayrıd Edicilik", "Çətinlik", "Təsadüfi Cavab"))
# İnteraktiv boxplot
p <- plot_ly(param_long, x = ~content_area, y = ~Value, color = ~Parameter,
type = "box",
hovertemplate = paste(
"Məzmun: %{x}<br>",
"Parametr: %{color}<br>",
"Dəyər: %{y:.3f}<br>",
"<extra></extra>"
)) %>%
layout(
title = "Məzmun Sahələrinə Görə Parametr Paylanmaları",
xaxis = list(title = "Məzmun Sahəsi"),
yaxis = list(title = "Parametr Dəyəri"),
boxmode = "group"
)
return(p)
} else {
# Static alternative
param_long <- item_bank %>%
select(item_id, content_area, a, b, c) %>%
reshape2::melt(id.vars = c("item_id", "content_area"),
variable.name = "Parameter", value.name = "Value")
param_long$Parameter <- factor(param_long$Parameter,
levels = c("a", "b", "c"),
labels = c("Ayrıd Edicilik", "Çətinlik", "Təsadüfi Cavab"))
p <- ggplot(param_long, aes(x = content_area, y = Value, fill = Parameter)) +
geom_boxplot() +
facet_wrap(~ Parameter, scales = "free_y") +
labs(title = "Məzmun Sahələrinə Görə Parametr Paylanmaları",
x = "Məzmun Sahəsi", y = "Parametr Dəyəri") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1),
legend.position = "none")
return(p)
}
}
# İnteraktiv boxplot
interactive_boxplot <- create_interactive_parameter_boxplots(item_bank)
print(interactive_boxplot)
# Çətinlik spektrumunda boşluqları aşkar edən vizuallaşdırma
analyze_difficulty_spectrum <- function(item_bank, gap_threshold = 0.5) {
# Sıralanan çətinlik dəyərləri
sorted_difficulties <- sort(item_bank$b)
# Gap analizi
gaps <- data.frame(
position = 1:(length(sorted_difficulties) - 1),
lower = sorted_difficulties[1:(length(sorted_difficulties) - 1)],
upper = sorted_difficulties[2:length(sorted_difficulties)],
gap_size = diff(sorted_difficulties)
)
# Böyük boşluqları highlight et
gaps$is_large_gap <- gaps$gap_size > gap_threshold
# Spectrum plot
p1 <- ggplot(item_bank, aes(x = b)) +
geom_histogram(bins = 30, fill = "lightblue", alpha = 0.7, color = "black") +
geom_rug(alpha = 0.5) +
labs(title = "Çətinlik Spektrumu - Histogram və Rug Plot",
x = "Çətinlik (b)", y = "Tezlik") +
theme_minimal()
# Gap plot
p2 <- ggplot(gaps, aes(x = position, y = gap_size, color = is_large_gap)) +
geom_point(size = 2) +
geom_line(alpha = 0.5) +
geom_hline(yintercept = gap_threshold, linetype = "dashed", color = "red") +
scale_color_manual(values = c("FALSE" = "blue", "TRUE" = "red"),
labels = c("Normal", "Böyük boşluq")) +
labs(title = paste("Çətinlik Spektrumu Gap Analizi (threshold =", gap_threshold, ")"),
x = "Pozisiya", y = "Gap Ölçüsü", color = "Gap Növü") +
theme_minimal()
# Gap məlumatları cədvəli
large_gaps <- gaps[gaps$is_large_gap, ]
if(nrow(large_gaps) > 0) {
cat("Böyük boşluqlar aşkarlandı:\n")
print(large_gaps[, c("lower", "upper", "gap_size")])
} else {
cat("Böyük boşluq aşkarlanmadı.\n")
}
# Kombinasiya
grid.arrange(p1, p2, ncol = 1)
return(gaps)
}
# Çətinlik spektrumu analizi
difficulty_gaps <- analyze_difficulty_spectrum(item_bank, gap_threshold = 0.6)
## Böyük boşluq aşkarlanmadı.
# Məzmun sahələrinin ətraflı müqayisəsi
create_content_comparison_dashboard <- function(item_bank) {
# 1. Orta dəyərlərin müqayisəsi
content_summary <- item_bank %>%
group_by(content_area) %>%
summarise(
Count = n(),
Mean_a = round(mean(a), 3),
Mean_b = round(mean(b), 3),
Mean_c = round(mean(c), 3),
SD_a = round(sd(a), 3),
SD_b = round(sd(b), 3),
SD_c = round(sd(c), 3),
.groups = 'drop'
)
# Orta dəyərlər üçün radar chart məlumatları
radar_data <- content_summary %>%
select(content_area, Mean_a, Mean_b, Mean_c) %>%
rename(Area = content_area, a = Mean_a, b = Mean_b, c = Mean_c)
# Normalizasiya (0-1 aralığına)
radar_data$a_norm <- (radar_data$a - min(radar_data$a)) / (max(radar_data$a) - min(radar_data$a))
radar_data$b_norm <- (radar_data$b - min(radar_data$b)) / (max(radar_data$b) - min(radar_data$b))
radar_data$c_norm <- (radar_data$c - min(radar_data$c)) / (max(radar_data$c) - min(radar_data$c))
# Məzmun sahələri üçün violin plot
p1 <- ggplot(item_bank, aes(x = content_area, y = a, fill = content_area)) +
geom_violin(alpha = 0.7) +
geom_boxplot(width = 0.2, fill = "white", alpha = 0.8) +
stat_summary(fun = mean, geom = "point", size = 3, color = "red") +
labs(title = "Məzmun Sahələrinə Görə Ayrıd Edicilik",
x = "Məzmun Sahəsi", y = "Ayrıd Edicilik (a)") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1),
legend.position = "none") +
scale_fill_viridis_d()
# Statistik summary cədvəli (görsel)
p2 <- ggplot(content_summary, aes(x = reorder(content_area, Mean_a), y = Mean_a, fill = content_area)) +
geom_col() +
geom_text(aes(label = Mean_a), vjust = -0.5, size = 3) +
labs(title = "Orta Ayrıd Edicilik Müqayisəsi",
x = "Məzmun Sahəsi", y = "Orta a") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1),
legend.position = "none") +
scale_fill_viridis_d()
# Range müqayisəsi
range_data <- item_bank %>%
group_by(content_area) %>%
summarise(
Min_b = min(b),
Max_b = max(b),
Range_b = Max_b - Min_b,
.groups = 'drop'
)
p3 <- ggplot(range_data, aes(x = reorder(content_area, Range_b))) +
geom_errorbar(aes(ymin = Min_b, ymax = Max_b), width = 0.2, size = 1) +
geom_point(aes(y = (Min_b + Max_b)/2), size = 3, color = "red") +
coord_flip() +
labs(title = "Məzmun Sahələrində Çətinlik Aralığı",
x = "Məzmun Sahəsi", y = "Çətinlik Aralığı") +
theme_minimal()
# Kombinasiya
grid.arrange(p1, p2, p3, ncol = 1)
# Summary cədvəlini çap et
cat("\nMəzmun sahələri statistik xülasəsi:\n")
print(content_summary)
return(content_summary)
}
# Məzmun sahələri müqayisəsi
content_comparison <- create_content_comparison_dashboard(item_bank)
##
## Məzmun sahələri statistik xülasəsi:
## # A tibble: 5 × 8
## content_area Count Mean_a Mean_b Mean_c SD_a SD_b SD_c
## <chr> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 Biologiya 13 1.41 0.039 0.19 0.494 0.907 0.039
## 2 Fizika 17 1.72 -0.765 0.188 0.515 0.96 0.034
## 3 Kimya 23 1.60 -0.116 0.173 0.459 1.47 0.045
## 4 Riyaziyyat 28 1.72 -0.373 0.176 0.522 0.979 0.041
## 5 Tarix 19 1.79 0.451 0.188 0.545 1.52 0.041
# Bank keyfiyyəti scorecard vizuallaşdırması
create_quality_scorecard <- function(item_bank) {
# Keyfiyyət metriklər hesablayın
quality_metrics <- data.frame(
Category = c("Psixometrik", "Məzmun", "Spektrum", "Ümumi"),
Metric = c(
"Yüksək Ayrıd Edicilik",
"Məzmun Balansı",
"Çətinlik Əhatəsi",
"Ümumi Keyfiyyət"
),
Score = c(
# Psixometrik: yüksək a və aşağı c
round((sum(item_bank$a > 1.2) + sum(item_bank$c < 0.25)) / (2 * nrow(item_bank)) * 100, 1),
# Məzmun: CV əsasında balans
round(100 - min(100, sd(table(item_bank$content_area)) / mean(table(item_bank$content_area)) * 100), 1),
# Spektrum: çətinlik əhatəsi
round(sum(item_bank$b >= -2 & item_bank$b <= 2) / nrow(item_bank) * 100, 1),
# Ümumi
0 # sonra hesablanacaq
),
Target = c(80, 85, 90, 80),
Status = character(4),
stringsAsFactors = FALSE
)
# Ümumi keyfiyyəti hesablayın
quality_metrics$Score[4] <- round(mean(quality_metrics$Score[1:3]), 1)
# Status təyin edin
quality_metrics$Status <- ifelse(quality_metrics$Score >= quality_metrics$Target,
"✅ Məqsədə çatıb",
"⚠️ Təkmilləşdirmə lazım")
# Keyfiyyət radar chart
p1 <- ggplot(quality_metrics[1:3, ], aes(x = Metric, y = Score, fill = Metric)) +
geom_col() +
geom_hline(yintercept = 80, linetype = "dashed", color = "red") +
geom_text(aes(label = paste0(Score, "%")), vjust = -0.5, size = 4, fontface = "bold") +
coord_flip() +
labs(title = "Bank Keyfiyyəti Scorecard",
x = "Keyfiyyət Sahəsi", y = "Skor (%)") +
theme_minimal() +
theme(legend.position = "none") +
scale_fill_viridis_d() +
ylim(0, 100)
# Target vs actual
comparison_data <- quality_metrics[1:3, ] %>%
select(Metric, Score, Target) %>%
reshape2::melt(id.vars = "Metric", variable.name = "Type", value.name = "Value")
p2 <- ggplot(comparison_data, aes(x = Metric, y = Value, fill = Type)) +
geom_col(position = "dodge") +
geom_text(aes(label = paste0(Value, "%")), position = position_dodge(width = 0.9),
vjust = -0.5, size = 3) +
labs(title = "Hədəf vs Cari Performans",
x = "Metrik", y = "Dəyər (%)") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
scale_fill_manual(values = c("Score" = "lightblue", "Target" = "orange"))
# Progress indicator
progress_data <- quality_metrics[1:3, ] %>%
mutate(
Progress = pmin(100, Score / Target * 100),
Remaining = 100 - Progress
) %>%
select(Metric, Progress, Remaining) %>%
reshape2::melt(id.vars = "Metric", variable.name = "Status", value.name = "Percentage")
p3 <- ggplot(progress_data, aes(x = Metric, y = Percentage, fill = Status)) +
geom_col() +
coord_flip() +
labs(title = "Hədəfə Çatma Progress-i",
x = "Metrik", y = "Progress (%)") +
theme_minimal() +
scale_fill_manual(values = c("Progress" = "green", "Remaining" = "lightgray"))
# Layout
grid.arrange(p1, p2, p3, ncol = 1)
# Scorecard cədvəlini çap et
cat("\nBank Keyfiyyəti Scorecard:\n")
print(quality_metrics[, c("Metric", "Score", "Target", "Status")])
return(quality_metrics)
}
# Keyfiyyət scorecard
quality_scorecard <- create_quality_scorecard(item_bank)
##
## Bank Keyfiyyəti Scorecard:
## Metric Score Target Status
## 1 Yüksək Ayrıd Edicilik 88.0 80 ✅ Məqsədə çatıb
## 2 Məzmun Balansı 71.3 85 ⚠️ Təkmilləşdirmə lazım
## 3 Çətinlik Əhatəsi 85.0 90 ⚠️ Təkmilləşdirmə lazım
## 4 Ümumi Keyfiyyət 81.4 80 ✅ Məqsədə çatıb
# Vizuallaşdırma tövsiyələri və best practices
provide_visualization_guidelines <- function() {
cat("=== TAPŞIRIQ BANKI VİZUALLAŞDIRMA BEST PRACTICES ===\n\n")
guidelines <- data.frame(
Kateqoriya = c(
"Rəng Seçimi",
"Qrafik Növü",
"Annotasiya",
"İnteraktivlik",
"Məlumat Sıxlığı",
"Accessibility"
),
Tövsiyə = c(
"Colorblind-friendly palettlər istifadə edin (viridis, brewer)",
"Məlumat növünə uyğun qrafik seçin (continuous->line, categorical->bar)",
"Vacib threshold və reference xətləri əlavə edin",
"Böyük məlumat dəstləri üçün interaktiv qrafiklər hazırlayın",
"Overplotting-dən qaçının, alpha/jitter istifadə edin",
"Contrast nisbətlərinə diqqət edin, alt text əlavə edin"
),
Nümunə_Kod = c(
"scale_color_viridis_d()",
"geom_point() vs geom_col()",
"geom_hline(), annotate()",
"plotly::ggplotly()",
"alpha=0.7, position_jitter()",
"theme(text=element_text(size=12))"
),
stringsAsFactors = FALSE
)
print(guidelines)
cat("\nVizuallaşdırma kontrol siyahısı:\n")
checklist <- c(
"✓ Başlıq və altyazı informativdir",
"✓ Oxlar düzgün etiketlənib",
"✓ Rənglər məntiqlidir və accessible",
"✓ Qrafik növü məlumat tipinə uyğundur",
"✓ Reference xətləri/thresholdlar əlavə edilib",
"✓ Legend lazım olduqda əlavə edilib",
"✓ Qrafik outputu reproducible-dır"
)
for(item in checklist) {
cat(item, "\n")
}
return(guidelines)
}
# Best practices
viz_guidelines <- provide_visualization_guidelines()
## === TAPŞIRIQ BANKI VİZUALLAŞDIRMA BEST PRACTICES ===
##
## Kateqoriya
## 1 Rəng Seçimi
## 2 Qrafik Növü
## 3 Annotasiya
## 4 İnteraktivlik
## 5 Məlumat Sıxlığı
## 6 Accessibility
## Tövsiyə
## 1 Colorblind-friendly palettlər istifadə edin (viridis, brewer)
## 2 Məlumat növünə uyğun qrafik seçin (continuous->line, categorical->bar)
## 3 Vacib threshold və reference xətləri əlavə edin
## 4 Böyük məlumat dəstləri üçün interaktiv qrafiklər hazırlayın
## 5 Overplotting-dən qaçının, alpha/jitter istifadə edin
## 6 Contrast nisbətlərinə diqqət edin, alt text əlavə edin
## Nümunə_Kod
## 1 scale_color_viridis_d()
## 2 geom_point() vs geom_col()
## 3 geom_hline(), annotate()
## 4 plotly::ggplotly()
## 5 alpha=0.7, position_jitter()
## 6 theme(text=element_text(size=12))
##
## Vizuallaşdırma kontrol siyahısı:
## ✓ Başlıq və altyazı informativdir
## ✓ Oxlar düzgün etiketlənib
## ✓ Rənglər məntiqlidir və accessible
## ✓ Qrafik növü məlumat tipinə uyğundur
## ✓ Reference xətləri/thresholdlar əlavə edilib
## ✓ Legend lazım olduqda əlavə edilib
## ✓ Qrafik outputu reproducible-dır
Bu bölmədə tapşırıq bankının hərtərəfli vizuallaşdırılmasını öyrəndik. Vizuallaşdırma CAT sistemlərinin anlaşılması və optimallaşdırılması üçün güçlü vasitədir.
Müxtəlif qrafik növlərini məlumat tipinə uyğun istifadə edin
Colorblind-friendly rəng palettləri seçin
Vacib threshold və reference dəyərləri göstərin
İnteraktiv qrafiklər böyük məlumat dəstləri üçün faydalıdır
Regular vizuallaşdırma bank monitorinqi üçün vacibdir
Bölmə 9: CAT Simulyasiyaları və Adaptiv Alqoritmlər
Bölmə 10: CAT Performansının Optimallaşdırılması
Bölmə 11: Real Vaxtda CAT Sistemi İdarəetməsi
Qeyd: Bu vizuallaşdırma texnikalaları CAT sistemlərinin monitorinqi və optimallaşdırılması üçün əsas vasitələrdir. Regular olaraq istifadə edilməlidir.