1 Giriş

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.

2 Əsas Tapşırıq Bankının Yaradılması

# 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

3 Univariat Paylanma Vizuallaşdırmaları

3.1 Çətinlik Parametrinin Paylanması

# Çə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)

3.2 Ayrıd Edicilik Parametrinin Paylanması

# 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)

3.3 Təsadüfi Cavab Parametrinin Paylanması

# 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)

4 Bivariate Əlaqələr Vizuallaşdırmaları

4.1 Ayrıd Edicilik vs Çətinlik

# 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)

4.2 Parametr Korrelyasiya Matrisi

# 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)

4.3 Çoxöçlülü Scatter Plot Matrisi

# Ç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)

5 Məzmun Əsaslı Vizuallaşdırmalar

5.1 Məzmun Sahələrinə Görə Parametr Paylanmaları

# 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)

5.2 Məzmun-Çətinlik Heatmap

# 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)

6 Test Məlumat Funksiyası Vizuallaşdırması

6.1 TIF və Komponent Məlumat Funksiyaları

# 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)

7 İnteraktiv və Təkmilləşdirilmiş Vizuallaşdırmalar

7.1 3D Parametr Scatter Plot

# 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)

7.2 Bank Keyfiyyəti Dashboard

# 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)

8 Dinamik və İnteraktiv Qrafiklər

8.1 Məzmun Sahələri üçün Interactive Boxplot

# İ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)

8.2 Çətinlik Spektrumu Gap Analysis

# Çə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ı.

9 Müqayisəli Vizuallaşdırmalar

9.1 Məzmun Sahələri Müqayisəsi

# 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

10 Keyfiyyət Qiymətləndirilməsi Vizuallaşdırmaları

10.1 Bank Keyfiyyəti Scorecard

# 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

11 Nəticə və Best Practices

11.1 Vizuallaşdırma Best Practices

# 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.

11.2 Əsas Nəticələr

  1. Univariat analiz hər parametrin ayrıca paylanmasını göstərir
  2. Bivariate əlaqələr parametr arası korrelyasiyaları aşkar edir
  3. Məzmun əsaslı vizuallaşdırma balans problemlərini müəyyən edir
  4. TIF vizuallaşdırması bank informativliyini qiymətləndirir
  5. İnteraktiv qrafiklər dərin keşfiyyat imkanı verir
  6. Keyfiyyət dashboard-u ümumi bank vəziyyətini göstərir

11.3 Praktiki Tövsiyələr

  • 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

11.4 Növbəti Addımlar

  • 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.