1 Giriş

Tapşırıq bankının keyfiyyəti CAT sisteminin effektivliyi, etibarlılığı və ədalətliliyi üçün kritik əhəmiyyət daşıyır. Bu bölmədə bank keyfiyyətini çoxöçlülü perspektivdən qiymətləndirəcək və optimallaşdırma strategiyalarını öyrənəcəksiniz.

Bank keyfiyyəti sadəcə statistik göstəricilərlə məhdudlaşmır - bu, psixometrik nəzəriyyə, təcrübi tətbiq və pedaqoji məqsədlərin kəsişməsidir.

2 Keyfiyyət Qiymətləndirilməsinin Çoxöçlülü Çərçivəsi

2.1 Keyfiyyət Ölçülərinin Taksonomiyası

# Keyfiyyət ölçülərinin təriflənməsi
define_quality_dimensions <- function() {
    cat("=== BANK KEYFİYYƏTİ ÖLÇÜLƏRİ ===\n\n")
    
    quality_dimensions <- data.frame(
        Ölçü = c(
            "Psixometrik Keyfiyyət",
            "Məzmun Keyfiyyəti", 
            "Təkmlifləşdirmə Keyfiyyəti",
            "Operativ Keyfiyyət",
            "Təhlükəsizlik Keyfiyyəti",
            "Adaptiv Keyfiyyət"
        ),
        Alt_Ölçülər = c(
            "Diskriminasiya, Etibarlılık, Uyğunluq",
            "Əhatə, Balans, Relevantlıq",
            "Clarity, Accuracy, Fairness", 
            "Effektivlik, Istifadə, Yeniləmə",
            "Exposure, Məxfilik, Bütövlük",
            "Informativlik, Dəqiqlik, Effekt"
        ),
        Prioritet = c("Yüksək", "Yüksək", "Orta", "Orta", "Yüksək", "Yüksək"),
        stringsAsFactors = FALSE
    )
    
    print(quality_dimensions)
    
    return(quality_dimensions)
}

quality_framework <- define_quality_dimensions()
## === BANK KEYFİYYƏTİ ÖLÇÜLƏRİ ===
## 
##                         Ölçü                           Alt_Ölçülər Prioritet
## 1      Psixometrik Keyfiyyət Diskriminasiya, Etibarlılık, Uyğunluq    Yüksək
## 2          Məzmun Keyfiyyəti            Əhatə, Balans, Relevantlıq    Yüksək
## 3 Təkmlifləşdirmə Keyfiyyəti           Clarity, Accuracy, Fairness      Orta
## 4         Operativ Keyfiyyət       Effektivlik, Istifadə, Yeniləmə      Orta
## 5   Təhlükəsizlik Keyfiyyəti          Exposure, Məxfilik, Bütövlük    Yüksək
## 6          Adaptiv Keyfiyyət       Informativlik, Dəqiqlik, Effekt    Yüksək

2.2 Əsas Keyfiyyət Analiz Funksiyası

# Əvvəlki bölmədən item_bank yaradılması (əgər mövcud deyilsə)
if(!exists("item_bank")) {
    set.seed(12345)
    item_bank <- data.frame(
        item_id = 1:100,
        a = runif(100, 0.8, 2.5),
        b = c(rep(-2.5, 10), rep(-1.5, 15), rep(-0.5, 20), rep(0.0, 20), 
              rep(0.5, 20), rep(1.5, 10), rep(2.5, 5)) + rnorm(100, 0, 0.2),
        c = runif(100, 0.1, 0.25),
        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)
    )
}

# Tapşırıq bankının keyfiyyət analizi
analyze_item_bank <- function(item_bank) {
    cat("=== TAPŞIRIQ BANKININ KEYFİYYƏT ANALİZİ ===\n\n")
    
    # 1. ƏSAS STATİSTİKALAR
    cat("1. ƏSAS STATİSTİKALAR:\n")
    cat("   Ümumi tapşırıq sayı:", nrow(item_bank), "\n")
    cat("   Çətinlik aralığı: [", round(min(item_bank$b), 2), ", ", 
        round(max(item_bank$b), 2), "]\n")
    cat("   Orta çətinlik:", round(mean(item_bank$b), 3), 
        "(SD =", round(sd(item_bank$b), 3), ")\n")
    cat("   Orta ayrıd edicilik:", round(mean(item_bank$a), 3), 
        "(SD =", round(sd(item_bank$a), 3), ")\n")
    cat("   Orta təsadüfi cavab:", round(mean(item_bank$c), 3), 
        "(SD =", round(sd(item_bank$c), 3), ")\n\n")
    
    # 2. PSİXOMETRİK KEYFİYYƏT GÖSTƏRİCİLƏRİ
    cat("2. PSİXOMETRİK KEYFİYYƏT:\n")
    
    # Ayrıd edicilik keyfiyyəti
    excellent_disc <- sum(item_bank$a >= 2.0)
    high_disc <- sum(item_bank$a >= 1.5 & item_bank$a < 2.0)
    moderate_disc <- sum(item_bank$a >= 1.0 & item_bank$a < 1.5)
    low_disc <- sum(item_bank$a >= 0.8 & item_bank$a < 1.0)
    poor_disc <- sum(item_bank$a < 0.8)
    
    cat("   Əla ayrıd edicilik (a ≥ 2.0):", excellent_disc, 
        "(", round(excellent_disc/nrow(item_bank)*100, 1), "%)\n")
    cat("   Yüksək ayrıd edicilik (1.5 ≤ a < 2.0):", high_disc, 
        "(", round(high_disc/nrow(item_bank)*100, 1), "%)\n")
    cat("   Orta ayrıd edicilik (1.0 ≤ a < 1.5):", moderate_disc, 
        "(", round(moderate_disc/nrow(item_bank)*100, 1), "%)\n")
    cat("   Aşağı ayrıd edicilik (0.8 ≤ a < 1.0):", low_disc, 
        "(", round(low_disc/nrow(item_bank)*100, 1), "%)\n")
    cat("   Zəif ayrıd edicilik (a < 0.8):", poor_disc, 
        "(", round(poor_disc/nrow(item_bank)*100, 1), "%)\n\n")
    
    # Təsadüfi cavab keyfiyyəti
    low_guessing <- sum(item_bank$c <= 0.15)
    moderate_guessing <- sum(item_bank$c > 0.15 & item_bank$c <= 0.25)
    high_guessing <- sum(item_bank$c > 0.25)
    
    cat("   Aşağı təsadüfi cavab (c ≤ 0.15):", low_guessing, 
        "(", round(low_guessing/nrow(item_bank)*100, 1), "%)\n")
    cat("   Orta təsadüfi cavab (0.15 < c ≤ 0.25):", moderate_guessing, 
        "(", round(moderate_guessing/nrow(item_bank)*100, 1), "%)\n")
    cat("   Yüksək təsadüfi cavab (c > 0.25):", high_guessing, 
        "(", round(high_guessing/nrow(item_bank)*100, 1), "%)\n\n")
    
    # 3. MƏZMUN BALANSLAŞDIRMASI
    cat("3. MƏZMUN BALANSLAŞDIRMASI:\n")
    content_table <- table(item_bank$content_area)
    content_percentages <- round(prop.table(content_table) * 100, 1)
    
    for(i in 1:length(content_table)) {
        cat("   ", names(content_table)[i], ":", content_table[i], 
            "tapşırıq (", content_percentages[i], "%)\n")
    }
    
    # Məzmun balansı CV
    content_cv <- sd(content_table) / mean(content_table)
    cat("   Məzmun balansı CV:", round(content_cv, 3), "\n")
    
    if(content_cv < 0.3) {
        cat("   ✅ Yaxşı məzmun balansı\n")
    } else if(content_cv < 0.5) {
        cat("   ⚡ Orta məzmun balansı\n") 
    } else {
        cat("   ⚠️ Zəif məzmun balansı\n")
    }
    
    # 4. İDRAK SƏVİYYƏLƏRİ
    if("cognitive_level" %in% names(item_bank)) {
        cat("\n4. İDRAK SƏVİYYƏLƏRİ PAYLANMASI:\n")
        cognitive_table <- table(item_bank$cognitive_level)
        cognitive_percentages <- round(prop.table(cognitive_table) * 100, 1)
        
        for(i in 1:length(cognitive_table)) {
            cat("   ", names(cognitive_table)[i], ":", cognitive_table[i], 
                "tapşırıq (", cognitive_percentages[i], "%)\n")
        }
    }
    
    return(invisible(item_bank))
}

# Bank analizi
analyze_item_bank(item_bank)
## === TAPŞIRIQ BANKININ KEYFİYYƏT ANALİZİ ===
## 
## 1. ƏSAS STATİSTİKALAR:
##    Ümumi tapşırıq sayı: 100 
##    Çətinlik aralığı: [ -2.97 ,  2.68 ]
##    Orta çətinlik: -0.17 (SD = 1.25 )
##    Orta ayrıd edicilik: 1.666 (SD = 0.511 )
##    Orta təsadüfi cavab: 0.181 (SD = 0.04 )
## 
## 2. PSİXOMETRİK KEYFİYYƏT:
##    Əla ayrıd edicilik (a ≥ 2.0): 35 ( 35 %)
##    Yüksək ayrıd edicilik (1.5 ≤ a < 2.0): 24 ( 24 %)
##    Orta ayrıd edicilik (1.0 ≤ a < 1.5): 28 ( 28 %)
##    Aşağı ayrıd edicilik (0.8 ≤ a < 1.0): 13 ( 13 %)
##    Zəif ayrıd edicilik (a < 0.8): 0 ( 0 %)
## 
##    Aşağı təsadüfi cavab (c ≤ 0.15): 27 ( 27 %)
##    Orta təsadüfi cavab (0.15 < c ≤ 0.25): 73 ( 73 %)
##    Yüksək təsadüfi cavab (c > 0.25): 0 ( 0 %)
## 
## 3. MƏZMUN BALANSLAŞDIRMASI:
##     Biologiya : 13 tapşırıq ( 13 %)
##     Fizika : 17 tapşırıq ( 17 %)
##     Kimya : 23 tapşırıq ( 23 %)
##     Riyaziyyat : 28 tapşırıq ( 28 %)
##     Tarix : 19 tapşırıq ( 19 %)
##    Məzmun balansı CV: 0.287 
##    ✅ Yaxşı məzmun balansı
## 
## 4. İDRAK SƏVİYYƏLƏRİ PAYLANMASI:
##     Analiz : 20 tapşırıq ( 20 %)
##     Anlayış : 23 tapşırıq ( 23 %)
##     Bilgi : 24 tapşırıq ( 24 %)
##     Sintez : 19 tapşırıq ( 19 %)
##     Tətbiq : 14 tapşırıq ( 14 %)

3 Çətinlik Paylanması və Məruz Qalma Təhlili

3.1 Çətinlik Spektrumunun Qiymətləndirilməsi

# Çətinlik paylanmasının ətraflı təhlili
analyze_difficulty_distribution <- function(item_bank, target_theta_range = c(-3, 3)) {
    
    cat("=== ÇƏTİNLİK PAYLANMASI TƏHLİLİ ===\n\n")
    
    # Çətinlik kateqoriyaları
    item_bank$difficulty_category <- cut(
        item_bank$b,
        breaks = c(-Inf, -2, -1, 0, 1, 2, Inf),
        labels = c("Çox asan (-∞, -2)", "Asan [-2, -1)", "Orta-asan [-1, 0)", 
                  "Orta-çətin [0, 1)", "Çətin [1, 2)", "Çox çətin [2, +∞)")
    )
    
    # İdeal paylanma (hədəf)
    ideal_distribution <- c(5, 15, 25, 30, 20, 5)  # faizlə
    names(ideal_distribution) <- levels(item_bank$difficulty_category)
    
    # Cari paylanma
    actual_counts <- table(item_bank$difficulty_category)
    actual_percentages <- round(prop.table(actual_counts) * 100, 1)
    
    # Müqayisə cədvəli
    comparison <- data.frame(
        Kateqoriya = names(ideal_distribution),
        İdeal_Faiz = ideal_distribution,
        Cari_Say = as.numeric(actual_counts),
        Cari_Faiz = as.numeric(actual_percentages),
        Fərq = as.numeric(actual_percentages) - ideal_distribution
    )
    
    cat("ÇƏTİNLİK PAYLANMASI MÜQAYİSƏSİ:\n")
    print(comparison)
    
    # Paylanma keyfiyyəti qiymətləndirilməsi
    chi_square_stat <- sum((comparison$Cari_Faiz - comparison$İdeal_Faiz)^2 / comparison$İdeal_Faiz)
    cat("\nPaylanma uyğunluğu (Chi-square):", round(chi_square_stat, 3), "\n")
    
    if(chi_square_stat < 5) {
        cat("✅ Əla çətinlik paylanması\n")
    } else if(chi_square_stat < 15) {
        cat("⚡ Yaxşı çətinlik paylanması\n")
    } else {
        cat("⚠️ Təkmilləşdirməyə ehtiyac\n")
    }
    
    # Əhatə təhlili
    coverage_analysis <- analyze_theta_coverage(item_bank, target_theta_range)
    
    return(list(distribution = comparison, coverage = coverage_analysis))
}

# Theta əhatəsinin təhlili
analyze_theta_coverage <- function(item_bank, theta_range = c(-3, 3)) {
    
    cat("\n=== THETA ƏHATƏ TƏHLİLİ ===\n")
    
    # Hər theta intervalı üçün tapşırıq sayını hesablayın
    theta_intervals <- seq(theta_range[1], theta_range[2], by = 0.5)
    coverage_counts <- numeric(length(theta_intervals) - 1)
    
    for(i in 1:(length(theta_intervals) - 1)) {
        interval_start <- theta_intervals[i]
        interval_end <- theta_intervals[i + 1]
        
        # Bu intervalda olan tapşırıqları say
        items_in_interval <- sum(item_bank$b >= interval_start & item_bank$b < interval_end)
        coverage_counts[i] <- items_in_interval
    }
    
    # Əhatə cədvəli
    coverage_table <- data.frame(
        Interval = paste0("[", theta_intervals[-length(theta_intervals)], 
                         ", ", theta_intervals[-1], ")"),
        Tapşırıq_Sayı = coverage_counts,
        Faiz = round(coverage_counts / sum(coverage_counts) * 100, 1)
    )
    
    cat("THETA İNTERVALLARI ƏHATƏSI:\n")
    print(coverage_table)
    
    # Boş intervalları tap
    empty_intervals <- coverage_table[coverage_table$Tapşırıq_Sayı == 0, ]
    if(nrow(empty_intervals) > 0) {
        cat("\n⚠️ BOŞ İNTERVALLAR:\n")
        print(empty_intervals$Interval)
    } else {
        cat("\n✅ Bütün theta intervalları əhatə olunub\n")
    }
    
    return(coverage_table)
}

# Çətinlik paylanması təhlili
difficulty_analysis <- analyze_difficulty_distribution(item_bank)
## === ÇƏTİNLİK PAYLANMASI TƏHLİLİ ===
## 
## ÇƏTİNLİK PAYLANMASI MÜQAYİSƏSİ:
##                          Kateqoriya İdeal_Faiz Cari_Say Cari_Faiz Fərq
## Çox asan (-∞, -2) Çox asan (-∞, -2)          5       10        10    5
## Asan [-2, -1)         Asan [-2, -1)         15       15        15    0
## Orta-asan [-1, 0) Orta-asan [-1, 0)         25       31        31    6
## Orta-çətin [0, 1) Orta-çətin [0, 1)         30       28        28   -2
## Çətin [1, 2)           Çətin [1, 2)         20       11        11   -9
## Çox çətin [2, +∞) Çox çətin [2, +∞)          5        5         5    0
## 
## Paylanma uyğunluğu (Chi-square): 10.623 
## ⚡ Yaxşı çətinlik paylanması
## 
## === THETA ƏHATƏ TƏHLİLİ ===
## THETA İNTERVALLARI ƏHATƏSI:
##      Interval Tapşırıq_Sayı Faiz
## 1  [-3, -2.5)             3    3
## 2  [-2.5, -2)             7    7
## 3  [-2, -1.5)             6    6
## 4  [-1.5, -1)             9    9
## 5  [-1, -0.5)             7    7
## 6   [-0.5, 0)            24   24
## 7    [0, 0.5)            18   18
## 8    [0.5, 1)            10   10
## 9    [1, 1.5)             8    8
## 10   [1.5, 2)             3    3
## 11   [2, 2.5)             1    1
## 12   [2.5, 3)             4    4
## 
## ✅ Bütün theta intervalları əhatə olunub

4 Test Məlumat Funksiyası və Dəqiqlik Təhlili

4.1 TIF Əsaslı Keyfiyyət Qiymətləndirilməsi

# Test Information Function əsaslı keyfiyyət təhlili
calculate_tif_quality_metrics <- function(item_bank, theta_range = c(-4, 4)) {
    
    cat("=== TIF ƏSASLI KEYFİYYƏT METRİKLƏRİ ===\n\n")
    
    # Theta nöqtələri
    theta <- seq(theta_range[1], theta_range[2], 0.1)
    total_information <- numeric(length(theta))
    
    # Hər tapşırıq üçün məlumat funksiyasını hesablayın
    for(i in 1:nrow(item_bank)) {
        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
        
        total_information <- total_information + item_info
    }
    
    # TIF datası
    tif_data <- data.frame(theta = theta, information = total_information)
    
    # TIF keyfiyyət metriklər
    max_info <- max(total_information)
    max_info_theta <- theta[which.max(total_information)]
    
    # Müxtəlif theta nöqtələrində məlumat
    info_at_zero <- total_information[theta == 0]
    if(length(info_at_zero) == 0) {
        info_at_zero <- approx(theta, total_information, 0)$y
    }
    
    # Aralıq məlumatları
    info_range_1 <- mean(total_information[theta >= -1 & theta <= 1])
    info_range_2 <- mean(total_information[theta >= -2 & theta <= 2])
    
    cat("1. TIF ƏSAS METRİKLƏR:\n")
    cat("   Maksimum məlumat:", round(max_info, 2), "\n")
    cat("   Maksimum məlumat θ-da:", round(max_info_theta, 2), "\n")
    cat("   θ = 0 nöqtəsində məlumat:", round(info_at_zero, 2), "\n")
    cat("   θ ∈ [-1, 1] orta məlumat:", round(info_range_1, 2), "\n")
    cat("   θ ∈ [-2, 2] orta məlumat:", round(info_range_2, 2), "\n\n")
    
    # Effektiv test uzunluğu (Marginal Reliability əsasında)
    # r = 1 - 1/I(θ) tənliyindən
    reliability_at_key_points <- 1 - 1/c(info_at_zero, info_range_1, max_info)
    reliability_at_key_points[reliability_at_key_points < 0] <- 0
    
    cat("2. ETİBARLILIQ QİYMƏTLƏRİ:\n")
    cat("   θ = 0 nöqtəsində etibarlılıq:", round(reliability_at_key_points[1], 3), "\n")
    cat("   θ ∈ [-1, 1] orta etibarlılıq:", round(reliability_at_key_points[2], 3), "\n")
    cat("   Maksimum etibarlılıq:", round(reliability_at_key_points[3], 3), "\n\n")
    
    # Standart xəta təhlili
    standard_errors <- 1 / sqrt(total_information)
    standard_errors[is.infinite(standard_errors)] <- NA
    
    se_at_zero <- 1 / sqrt(info_at_zero)
    se_range_1 <- 1 / sqrt(info_range_1)
    
    cat("3. STANDART XƏTA TƏHLİLİ:\n")
    cat("   θ = 0 nöqtəsində SE:", round(se_at_zero, 3), "\n")
    cat("   θ ∈ [-1, 1] orta SE:", round(se_range_1, 3), "\n")
    cat("   Minimum SE:", round(min(standard_errors, na.rm = TRUE), 3), "\n\n")
    
    # Keyfiyyət qiymətləndirilməsi
    assess_tif_quality(max_info, info_range_1, se_at_zero)
    
    return(list(
        tif_data = tif_data,
        metrics = list(
            max_info = max_info,
            max_info_theta = max_info_theta,
            info_at_zero = info_at_zero,
            reliability = reliability_at_key_points,
            se_at_zero = se_at_zero
        )
    ))
}

# TIF keyfiyyətinin qiymətləndirilməsi
assess_tif_quality <- function(max_info, avg_info, se_at_zero) {
    
    cat("4. TIF KEYFİYYƏT QİYMƏTLƏNDİRMƏSİ:\n")
    
    # Maksimum məlumat qiymətləndirilməsi
    if(max_info >= 20) {
        cat("   Maksimum məlumat: ✅ Əla (≥20)\n")
        info_grade <- "A"
    } else if(max_info >= 15) {
        cat("   Maksimum məlumat: ⚡ Yaxşı (15-19)\n")
        info_grade <- "B"
    } else if(max_info >= 10) {
        cat("   Maksimum məlumat: ⚠️ Orta (10-14)\n")
        info_grade <- "C"
    } else {
        cat("   Maksimum məlumat: ❌ Aşağı (<10)\n")
        info_grade <- "D"
    }
    
    # Orta məlumat qiymətləndirilməsi  
    if(avg_info >= 10) {
        cat("   Orta məlumat: ✅ Əla (≥10)\n")
        avg_grade <- "A"
    } else if(avg_info >= 7) {
        cat("   Orta məlumat: ⚡ Yaxşı (7-9)\n")
        avg_grade <- "B"
    } else if(avg_info >= 5) {
        cat("   Orta məlumat: ⚠️ Orta (5-6)\n")
        avg_grade <- "C"
    } else {
        cat("   Orta məlumat: ❌ Aşağı (<5)\n")
        avg_grade <- "D"
    }
    
    # SE qiymətləndirilməsi
    if(se_at_zero <= 0.25) {
        cat("   Standart xəta: ✅ Əla (≤0.25)\n")
        se_grade <- "A"
    } else if(se_at_zero <= 0.35) {
        cat("   Standart xəta: ⚡ Yaxşı (0.25-0.35)\n")
        se_grade <- "B"
    } else if(se_at_zero <= 0.45) {
        cat("   Standart xəta: ⚠️ Orta (0.35-0.45)\n")
        se_grade <- "C"
    } else {
        cat("   Standart xəta: ❌ Aşağı (>0.45)\n")
        se_grade <- "D"
    }
    
    return(list(info_grade = info_grade, avg_grade = avg_grade, se_grade = se_grade))
}

# TIF keyfiyyət təhlili
tif_quality <- calculate_tif_quality_metrics(item_bank)
## === TIF ƏSASLI KEYFİYYƏT METRİKLƏRİ ===
## 
## 1. TIF ƏSAS METRİKLƏR:
##    Maksimum məlumat: 372.2 
##    Maksimum məlumat θ-da: 4 
##    θ = 0 nöqtəsində məlumat: 282.21 
##    θ ∈ [-1, 1] orta məlumat: 275.68 
##    θ ∈ [-2, 2] orta məlumat: 262.9 
## 
## 2. ETİBARLILIQ QİYMƏTLƏRİ:
##    θ = 0 nöqtəsində etibarlılıq: 0.996 
##    θ ∈ [-1, 1] orta etibarlılıq: 0.996 
##    Maksimum etibarlılıq: 0.997 
## 
## 3. STANDART XƏTA TƏHLİLİ:
##    θ = 0 nöqtəsində SE: 0.06 
##    θ ∈ [-1, 1] orta SE: 0.06 
##    Minimum SE: 0.052 
## 
## 4. TIF KEYFİYYƏT QİYMƏTLƏNDİRMƏSİ:
##    Maksimum məlumat: ✅ Əla (≥20)
##    Orta məlumat: ✅ Əla (≥10)
##    Standart xəta: ✅ Əla (≤0.25)

5 Parametr Korrelyasiya və Mənasızlıq Təhlili

5.1 Parametr Əlaqələrinin Təhlili

# Parametr əlaqələrinin təhlili
analyze_parameter_relationships <- function(item_bank) {
    
    cat("=== PARAMETR ƏLAQƏLƏRİ TƏHLİLİ ===\n\n")
    
    # Korrelyasiya matrisi
    param_matrix <- item_bank[, c("a", "b", "c")]
    correlation_matrix <- cor(param_matrix, use = "complete.obs")
    
    cat("1. PARAMETR KORRELYASİYA MATRİSİ:\n")
    print(round(correlation_matrix, 3))
    
    # Korrelyasiya qiymətləndirilməsi
    cat("\n2. KORRELYASİYA QİYMƏTLƏNDİRMƏSİ:\n")
    
    # a-b korrelyasiyası
    ab_corr <- correlation_matrix["a", "b"]
    cat("   a-b korrelyasiyası:", round(ab_corr, 3))
    if(abs(ab_corr) < 0.3) {
        cat(" ✅ Yaxşı (müstəqil parametrlər)\n")
    } else if(abs(ab_corr) < 0.5) {
        cat(" ⚡ Orta (zəif asılılıq)\n")
    } else {
        cat(" ⚠️ Problemli (güçlü asılılıq)\n")
    }
    
    # a-c korrelyasiyası
    ac_corr <- correlation_matrix["a", "c"]
    cat("   a-c korrelyasiyası:", round(ac_corr, 3))
    if(abs(ac_corr) < 0.3) {
        cat(" ✅ Yaxşı (müstəqil parametrlər)\n")
    } else if(abs(ac_corr) < 0.5) {
        cat(" ⚡ Orta (zəif asılılıq)\n")
    } else {
        cat(" ⚠️ Problemli (güçlü asılılıq)\n")
    }
    
    # b-c korrelyasiyası  
    bc_corr <- correlation_matrix["b", "c"]
    cat("   b-c korrelyasiyası:", round(bc_corr, 3))
    if(abs(bc_corr) < 0.3) {
        cat(" ✅ Yaxşı (müstəqil parametrlər)\n")
    } else if(abs(bc_corr) < 0.5) {
        cat(" ⚡ Orta (zəif asılılıq)\n")
    } else {
        cat(" ⚠️ Problemli (güçlü asılılıq)\n")
    }
    
    return(correlation_matrix)
}

# Parametr variansiya təhlili
analyze_parameter_variance <- function(item_bank) {
    
    cat("\n=== PARAMETR VARİANSİYA TƏHLİLİ ===\n\n")
    
    # Parametr variansları
    a_var <- var(item_bank$a)
    b_var <- var(item_bank$b)
    c_var <- var(item_bank$c)
    
    # Variation coefficient
    a_cv <- sd(item_bank$a) / mean(item_bank$a)
    b_cv <- sd(item_bank$b) / mean(abs(item_bank$b) + 0.1)  # b-də sıfır problemi üçün
    c_cv <- sd(item_bank$c) / mean(item_bank$c)
    
    cat("1. PARAMETR VARİANS MƏLUMATLARI:\n")
    cat("   a parametri variansı:", round(a_var, 3), "(CV =", round(a_cv, 3), ")\n")
    cat("   b parametri variansı:", round(b_var, 3), "(CV =", round(b_cv, 3), ")\n")
    cat("   c parametri variansı:", round(c_var, 3), "(CV =", round(c_cv, 3), ")\n\n")
    
    # Variasiya qiymətləndirilməsi
    cat("2. VARİASİYA KEYFİYYƏTİ:\n")
    
    # a parametri variasiyası
    if(a_cv > 0.3 && a_cv < 0.8) {
        cat("   a parametri variasiyası: ✅ Optimal\n")
    } else if(a_cv <= 0.3) {
        cat("   a parametri variasiyası: ⚠️ Çox az variasiya\n")
    } else {
        cat("   a parametri variasiyası: ⚠️ Həddindən artıq variasiya\n")
    }
    
    # b parametri variasiyası
    if(b_cv > 0.5 && b_cv < 1.5) {
        cat("   b parametri variasiyası: ✅ Optimal\n")
    } else if(b_cv <= 0.5) {
        cat("   b parametri variasiyası: ⚠️ Çox az variasiya\n")
    } else {
        cat("   b parametri variasiyası: ⚠️ Həddindən artıq variasiya\n")
    }
    
    # c parametri variasiyası
    if(c_cv > 0.2 && c_cv < 0.6) {
        cat("   c parametri variasiyası: ✅ Optimal\n")
    } else if(c_cv <= 0.2) {
        cat("   c parametri variasiyası: ⚠️ Çox az variasiya\n")
    } else {
        cat("   c parametri variasiyası: ⚠️ Həddindən artıq variasiya\n")
    }
    
    return(list(variances = c(a_var, b_var, c_var), cvs = c(a_cv, b_cv, c_cv)))
}

# Parametr əlaqələri təhlili
param_correlations <- analyze_parameter_relationships(item_bank)
## === PARAMETR ƏLAQƏLƏRİ TƏHLİLİ ===
## 
## 1. PARAMETR KORRELYASİYA MATRİSİ:
##        a      b     c
## a  1.000 -0.068 0.106
## b -0.068  1.000 0.033
## c  0.106  0.033 1.000
## 
## 2. KORRELYASİYA QİYMƏTLƏNDİRMƏSİ:
##    a-b korrelyasiyası: -0.068 ✅ Yaxşı (müstəqil parametrlər)
##    a-c korrelyasiyası: 0.106 ✅ Yaxşı (müstəqil parametrlər)
##    b-c korrelyasiyası: 0.033 ✅ Yaxşı (müstəqil parametrlər)
param_variance <- analyze_parameter_variance(item_bank)
## 
## === PARAMETR VARİANSİYA TƏHLİLİ ===
## 
## 1. PARAMETR VARİANS MƏLUMATLARI:
##    a parametri variansı: 0.261 (CV = 0.307 )
##    b parametri variansı: 1.563 (CV = 1.185 )
##    c parametri variansı: 0.002 (CV = 0.223 )
## 
## 2. VARİASİYA KEYFİYYƏTİ:
##    a parametri variasiyası: ✅ Optimal
##    b parametri variasiyası: ✅ Optimal
##    c parametri variasiyası: ✅ Optimal

6 Məzmun və Pedaqoji Keyfiyyət

6.1 Məzmun Əhatəsi və Balansının Qiymətləndirilməsi

# Məzmun keyfiyyətinin qiymətləndirilməsi
assess_content_quality <- function(item_bank) {
    
    cat("=== MƏZMUN KEYFİYYƏTİ QİYMƏTLƏNDİRMƏSİ ===\n\n")
    
    # 1. MƏZMUN SAHƏLƏRİ ANALİZİ
    cat("1. MƏZMUN SAHƏLƏRİ PAYLANMASI:\n")
    
    content_summary <- item_bank %>%
        group_by(content_area) %>%
        summarise(
            Tapşırıq_Sayı = n(),
            Faiz = round(n()/nrow(item_bank)*100, 1),
            Orta_Çətinlik = round(mean(b), 2),
            Orta_Diskriminasiya = round(mean(a), 2),
            .groups = 'drop'
        ) %>%
        arrange(desc(Tapşırıq_Sayı))
    
    print(content_summary)
    
    # Məzmun balansı değerlendirmesi
    content_balance_cv <- sd(content_summary$Tapşırıq_Sayı) / mean(content_summary$Tapşırıq_Sayı)
    cat("\nMəzmun balansı CV:", round(content_balance_cv, 3), "\n")
    
    if(content_balance_cv < 0.3) {
        cat("✅ Əla məzmun balansı\n")
        content_balance_grade <- "A"
    } else if(content_balance_cv < 0.5) {
        cat("⚡ Yaxşı məzmun balansı\n")
        content_balance_grade <- "B"
    } else if(content_balance_cv < 0.8) {
        cat("⚠️ Orta məzmun balansı\n")
        content_balance_grade <- "C"
    } else {
        cat("❌ Zəif məzmun balansı\n")
        content_balance_grade <- "D"
    }
    
    # 2. İDRAK SƏVİYYƏLƏRİ ANALİZİ
    if("cognitive_level" %in% names(item_bank)) {
        cat("\n2. İDRAK SƏVİYYƏLƏRİ PAYLANMASI:\n")
        
        cognitive_summary <- item_bank %>%
            group_by(cognitive_level) %>%
            summarise(
                Tapşırıq_Sayı = n(),
                Faiz = round(n()/nrow(item_bank)*100, 1),
                Orta_Çətinlik = round(mean(b), 2),
                .groups = 'drop'
            ) %>%
            arrange(desc(Tapşırıq_Sayı))
        
        print(cognitive_summary)
        
        # İdeal idrak paylanması (Bloom Taksonomiyasına əsasən)
        ideal_cognitive_dist <- c("Bilgi" = 20, "Anlayış" = 25, "Tətbiq" = 25, 
                                 "Analiz" = 20, "Sintez" = 10)
        
        # Cari paylanma ilə müqayisə
        current_cognitive <- table(item_bank$cognitive_level)
        current_cognitive_pct <- round(prop.table(current_cognitive) * 100, 1)
        
        cat("\nİdrak səviyyəsi balansı:\n")
        for(level in names(ideal_cognitive_dist)) {
            if(level %in% names(current_cognitive_pct)) {
                current_pct <- current_cognitive_pct[level]
                ideal_pct <- ideal_cognitive_dist[level]
                difference <- current_pct - ideal_pct
                cat("   ", level, ": Cari", current_pct, "% (İdeal", ideal_pct, "%, Fərq:", 
                    round(difference, 1), "%)\n")
            }
        }
    }
    
    return(list(content_summary = content_summary, balance_grade = content_balance_grade))
}

# Məzmun-Çətinlik Matrisi
create_content_difficulty_matrix <- function(item_bank) {
    
    cat("\n=== MƏZMUN-ÇƏTİNLİK MATRİSİ ===\n\n")
    
    # Çətinlik kateqoriyaları yaradın
    item_bank$diff_category <- cut(
        item_bank$b,
        breaks = c(-Inf, -1, 0, 1, Inf),
        labels = c("Asan", "Orta", "Çətin", "Çox çətin")
    )
    
    # Məzmun-çətinlik cross-table
    content_difficulty_matrix <- table(item_bank$content_area, item_bank$diff_category)
    
    cat("Məzmun sahələri üzrə çətinlik paylanması:\n")
    print(content_difficulty_matrix)
    
    # Hər məzmun sahəsi üçün çətinlik paylanması faizləri
    cat("\nFaizlə paylanma:\n")
    content_difficulty_pct <- round(prop.table(content_difficulty_matrix, 1) * 100, 1)
    print(content_difficulty_pct)
    
    # Balans qiymətləndirilməsi
    assess_content_difficulty_balance(content_difficulty_pct)
    
    return(content_difficulty_matrix)
}

# Məzmun-çətinlik balansının qiymətləndirilməsi
assess_content_difficulty_balance <- function(content_diff_pct) {
    
    cat("\nMəzmun-çətinlik balansı qiymətləndirilməsi:\n")
    
    # Hər məzmun sahəsi üçün çətinlik variasiyasını hesablayın
    balance_scores <- apply(content_diff_pct, 1, function(row) {
        # İdeal paylanma: 30% asan, 40% orta, 25% çətin, 5% çox çətin
        ideal_dist <- c(30, 40, 25, 5)
        if(length(row) == length(ideal_dist)) {
            # Chi-square deviation
            chi_sq <- sum((row - ideal_dist)^2 / ideal_dist)
            return(chi_sq)
        } else {
            return(NA)
        }
    })
    
    for(i in 1:length(balance_scores)) {
        content_area <- names(balance_scores)[i]
        score <- balance_scores[i]
        
        if(!is.na(score)) {
            if(score < 10) {
                cat("   ", content_area, ": ✅ Yaxşı balans (χ² =", round(score, 1), ")\n")
            } else if(score < 25) {
                cat("   ", content_area, ": ⚡ Orta balans (χ² =", round(score, 1), ")\n")
            } else {
                cat("   ", content_area, ": ⚠️ Zəif balans (χ² =", round(score, 1), ")\n")
            }
        }
    }
}

# Məzmun keyfiyyət təhlili
content_quality <- assess_content_quality(item_bank)
## === MƏZMUN KEYFİYYƏTİ QİYMƏTLƏNDİRMƏSİ ===
## 
## 1. MƏZMUN SAHƏLƏRİ PAYLANMASI:
## # A tibble: 5 × 5
##   content_area Tapşırıq_Sayı  Faiz Orta_Çətinlik Orta_Diskriminasiya
##   <chr>                <int> <dbl>         <dbl>               <dbl>
## 1 Riyaziyyat              28    28         -0.37                1.72
## 2 Kimya                   23    23         -0.12                1.6 
## 3 Tarix                   19    19          0.45                1.79
## 4 Fizika                  17    17         -0.76                1.72
## 5 Biologiya               13    13          0.04                1.41
## 
## Məzmun balansı CV: 0.287 
## ✅ Əla məzmun balansı
## 
## 2. İDRAK SƏVİYYƏLƏRİ PAYLANMASI:
## # A tibble: 5 × 4
##   cognitive_level Tapşırıq_Sayı  Faiz Orta_Çətinlik
##   <chr>                   <int> <dbl>         <dbl>
## 1 Bilgi                      24    24         -0.16
## 2 Anlayış                    23    23         -0.08
## 3 Analiz                     20    20         -0.25
## 4 Sintez                     19    19         -0.45
## 5 Tətbiq                     14    14          0.16
## 
## İdrak səviyyəsi balansı:
##     Bilgi : Cari 24 % (İdeal 20 %, Fərq: 4 %)
##     Anlayış : Cari 23 % (İdeal 25 %, Fərq: -2 %)
##     Tətbiq : Cari 14 % (İdeal 25 %, Fərq: -11 %)
##     Analiz : Cari 20 % (İdeal 20 %, Fərq: 0 %)
##     Sintez : Cari 19 % (İdeal 10 %, Fərq: 9 %)
content_diff_matrix <- create_content_difficulty_matrix(item_bank)
## 
## === MƏZMUN-ÇƏTİNLİK MATRİSİ ===
## 
## Məzmun sahələri üzrə çətinlik paylanması:
##             
##              Asan Orta Çətin Çox çətin
##   Biologiya     3    1     8         1
##   Fizika        5   10     1         1
##   Kimya         7    6     4         6
##   Riyaziyyat    6   13     8         1
##   Tarix         4    1     7         7
## 
## Faizlə paylanma:
##             
##              Asan Orta Çətin Çox çətin
##   Biologiya  23.1  7.7  61.5       7.7
##   Fizika     29.4 58.8   5.9       5.9
##   Kimya      30.4 26.1  17.4      26.1
##   Riyaziyyat 21.4 46.4  28.6       3.6
##   Tarix      21.1  5.3  36.8      36.8
## 
## Məzmun-çətinlik balansı qiymətləndirilməsi:
##     Biologiya : ⚠️ Zəif balans (χ² = 82.4 )
##     Fizika : ⚡ Orta balans (χ² = 23.6 )
##     Kimya : ⚠️ Zəif balans (χ² = 96.2 )
##     Riyaziyyat : ✅ Yaxşı balans (χ² = 4.4 )
##     Tarix : ⚠️ Zəif balans (χ² = 240.6 )

7 Adaptiv Effektivlik Təhlili

7.1 CAT Performans Simulyasiyası

# CAT adaptiv effektivlik təhlili
analyze_adaptive_efficiency <- function(item_bank, n_simulees = 500) {
    
    cat("=== ADAPTİV EFFEKTİVLİK TƏHLİLİ ===\n\n")
    
    # Simulyasiya parametrləri
    set.seed(12345)
    true_thetas <- rnorm(n_simulees, 0, 1)
    
    # Sadə CAT simulyasiyası (Maximum Information seçimi)
    simulate_simple_cat <- function(bank, true_theta, max_items = 25, se_threshold = 0.3) {
        
        administered_items <- c()
        responses <- c()
        theta_estimates <- c()
        se_estimates <- c()
        
        current_theta <- 0  # Başlanğıc qiymətləndirmə
        
        for(item_num in 1:max_items) {
            # Əvvəllər istifadə olunmamış tapşırıqlardan seç
            available_items <- setdiff(1:nrow(bank), administered_items)
            
            if(length(available_items) == 0) break
            
            # Hər mövcud tapşırıq üçün məlumat hesablayın
            item_info <- numeric(length(available_items))
            
            for(i in 1:length(available_items)) {
                item_idx <- available_items[i]
                a <- bank$a[item_idx]
                b <- bank$b[item_idx]
                c <- bank$c[item_idx]
                
                # Fisher Information
                P <- c + (1 - c) * plogis(a * (current_theta - b))
                Q <- 1 - P
                P_star <- (P - c) / (1 - c)
                Q_star <- 1 - P_star
                
                info <- (a^2 * P_star * Q_star) / (P * Q)
                if(is.nan(info) || is.infinite(info)) info <- 0
                
                item_info[i] <- info
            }
            
            # Ən yüksək məlumat verən tapşırığı seç
            selected_idx <- available_items[which.max(item_info)]
            administered_items <- c(administered_items, selected_idx)
            
            # Cavabı simulyasiya et
            a <- bank$a[selected_idx]
            b <- bank$b[selected_idx]
            c <- bank$c[selected_idx]
            
            prob_correct <- c + (1 - c) * plogis(a * (true_theta - b))
            response <- rbinom(1, 1, prob_correct)
            responses <- c(responses, response)
            
            # Theta-nı yenidən qiymətləndir (sadə Bayes)
            if(length(responses) >= 2) {
                # Newton-Raphson ilə MLE
                current_theta <- estimate_theta_simple(administered_items, responses, bank)
            }
            
            theta_estimates <- c(theta_estimates, current_theta)
            
            # SE hesabla
            total_info <- 0
            for(j in 1:length(administered_items)) {
                item_idx <- administered_items[j]
                a <- bank$a[item_idx]
                b <- bank$b[item_idx]
                c <- bank$c[item_idx]
                
                P <- c + (1 - c) * plogis(a * (current_theta - b))
                Q <- 1 - P
                P_star <- (P - c) / (1 - c)
                Q_star <- 1 - P_star
                
                info <- (a^2 * P_star * Q_star) / (P * Q)
                if(!is.nan(info) && !is.infinite(info)) {
                    total_info <- total_info + info
                }
            }
            
            current_se <- ifelse(total_info > 0, 1/sqrt(total_info), 1)
            se_estimates <- c(se_estimates, current_se)
            
            # Dayanma kriteri
            if(current_se <= se_threshold && length(administered_items) >= 5) {
                break
            }
        }
        
        return(list(
            items_administered = administered_items,
            responses = responses,
            theta_estimates = theta_estimates,
            se_estimates = se_estimates,
            final_theta = tail(theta_estimates, 1),
            final_se = tail(se_estimates, 1),
            test_length = length(administered_items)
        ))
    }
    
    # Bütün simulees üçün CAT-ı çalışdır
    cat("CAT simulyasiyası başlayır (", n_simulees, "test alıcısı)...\n")
    
    simulation_results <- list()
    test_lengths <- numeric(n_simulees)
    final_ses <- numeric(n_simulees)
    theta_errors <- numeric(n_simulees)
    
    for(i in 1:n_simulees) {
        if(i %% 100 == 0) cat("İşlənilən:", i, "/", n_simulees, "\n")
        
        result <- simulate_simple_cat(item_bank, true_thetas[i])
        simulation_results[[i]] <- result
        
        test_lengths[i] <- result$test_length
        final_ses[i] <- result$final_se
        theta_errors[i] <- abs(result$final_theta - true_thetas[i])
    }
    
    # Nəticələri təhlil et
    cat("\n=== SİMULYASİYA NƏTİCƏLƏRİ ===\n")
    cat("Orta test uzunluğu:", round(mean(test_lengths), 1), "\n")
    cat("Test uzunluğu SD:", round(sd(test_lengths), 1), "\n")
    cat("Minimum test uzunluğu:", min(test_lengths), "\n")
    cat("Maksimum test uzunluğu:", max(test_lengths), "\n\n")
    
    cat("Orta final SE:", round(mean(final_ses), 3), "\n")
    cat("SE < 0.3 əldə edən faiz:", round(mean(final_ses < 0.3) * 100, 1), "%\n")
    cat("SE < 0.25 əldə edən faiz:", round(mean(final_ses < 0.25) * 100, 1), "%\n\n")
    
    cat("Orta |θ error|:", round(mean(theta_errors), 3), "\n")
    cat("RMSE:", round(sqrt(mean(theta_errors^2)), 3), "\n")
    
    # Effektivlik qiymətləndirilməsi
    assess_adaptive_efficiency(test_lengths, final_ses, theta_errors)
    
    return(list(
        test_lengths = test_lengths,
        final_ses = final_ses,
        theta_errors = theta_errors,
        true_thetas = true_thetas
    ))
}

# Sadə theta qiymətləndirmə funksiyası
estimate_theta_simple <- function(item_indices, responses, bank, max_iter = 10) {
    
    theta <- 0  # Başlanğıc dəyər
    
    for(iter in 1:max_iter) {
        first_deriv <- 0
        second_deriv <- 0
        
        for(i in 1:length(item_indices)) {
            item_idx <- item_indices[i]
            response <- responses[i]
            
            a <- bank$a[item_idx]
            b <- bank$b[item_idx]
            c <- bank$c[item_idx]
            
            P <- c + (1 - c) * plogis(a * (theta - b))
            Q <- 1 - P
            
            if(P > 0.001 && P < 0.999) {  # Numerical stability
                first_deriv <- first_deriv + a * (response - P) / (P * Q) * (P - c)
                second_deriv <- second_deriv - a^2 * (P - c)^2 / (P * Q) + 
                               a^2 * (response - P) * (P - c) * (Q - P) / (P^2 * Q^2)
            }
        }
        
        if(abs(second_deriv) > 0.001) {
            theta_new <- theta - first_deriv / second_deriv
            if(abs(theta_new - theta) < 0.001) break
            theta <- theta_new
        }
    }
    
    # Extreme dəyərləri məhdudlaşdır
    theta <- pmax(-4, pmin(4, theta))
    
    return(theta)
}

# Adaptiv effektivliyin qiymətləndirilməsi
assess_adaptive_efficiency <- function(test_lengths, final_ses, theta_errors) {
    
    cat("\n=== ADAPTİV EFFEKTİVLİK QİYMƏTLƏNDİRMƏSİ ===\n")
    
    # Test uzunluğu effektivliği
    avg_length <- mean(test_lengths)
    if(avg_length <= 20) {
        cat("Test uzunluğu effektivliği: ✅ Əla (≤20)\n")
        length_grade <- "A"
    } else if(avg_length <= 25) {
        cat("Test uzunluğu effektivliği: ⚡ Yaxşı (21-25)\n")
        length_grade <- "B"
    } else if(avg_length <= 30) {
        cat("Test uzunluğu effektivliği: ⚠️ Orta (26-30)\n")
        length_grade <- "C"
    } else {
        cat("Test uzunluğu effektivliyi: ❌ Aşağı (>30)\n")
        length_grade <- "D"
    }
    
    # Dəqiqlik effektivliği
    avg_se <- mean(final_ses)
    if(avg_se <= 0.25) {
        cat("Dəqiqlik effektivliği: ✅ Əla (≤0.25)\n")
        precision_grade <- "A"
    } else if(avg_se <= 0.35) {
        cat("Dəqiqlik effektivliği: ⚡ Yaxşı (0.25-0.35)\n")
        precision_grade <- "B"
    } else if(avg_se <= 0.45) {
        cat("Dəqiqlik effektivliği: ⚠️ Orta (0.35-0.45)\n")
        precision_grade <- "C"
    } else {
        cat("Dəqiqlik effektivliyi: ❌ Aşağı (>0.45)\n")
        precision_grade <- "D"
    }
    
    # Accuracy effektivliği
    rmse <- sqrt(mean(theta_errors^2))
    if(rmse <= 0.3) {
        cat("Accuracy effektivliği: ✅ Əla (≤0.3)\n")
        accuracy_grade <- "A"
    } else if(rmse <= 0.4) {
        cat("Accuracy effektivliği: ⚡ Yaxşı (0.3-0.4)\n")
        accuracy_grade <- "B"
    } else if(rmse <= 0.5) {
        cat("Accuracy effektivliği: ⚠️ Orta (0.4-0.5)\n")
        accuracy_grade <- "C"
    } else {
        cat("Accuracy effektivliyi: ❌ Aşağı (>0.5)\n")
        accuracy_grade <- "D"
    }
    
    return(list(
        length_grade = length_grade,
        precision_grade = precision_grade,
        accuracy_grade = accuracy_grade
    ))
}

# Adaptiv effektivlik təhlili
cat("Adaptiv effektivlik simulyasiyası başlayır...\n")
## Adaptiv effektivlik simulyasiyası başlayır...
adaptive_results <- analyze_adaptive_efficiency(item_bank, n_simulees = 200)  # Kiçik nümunə test üçün
## === ADAPTİV EFFEKTİVLİK TƏHLİLİ ===
## 
## CAT simulyasiyası başlayır ( 200 test alıcısı)...
## İşlənilən: 100 / 200 
## İşlənilən: 200 / 200 
## 
## === SİMULYASİYA NƏTİCƏLƏRİ ===
## Orta test uzunluğu: 5 
## Test uzunluğu SD: 0 
## Minimum test uzunluğu: 5 
## Maksimum test uzunluğu: 5 
## 
## Orta final SE: 0.168 
## SE < 0.3 əldə edən faiz: 100 %
## SE < 0.25 əldə edən faiz: 100 %
## 
## Orta |θ error|: 0.877 
## RMSE: 1.072 
## 
## === ADAPTİV EFFEKTİVLİK QİYMƏTLƏNDİRMƏSİ ===
## Test uzunluğu effektivliği: ✅ Əla (≤20)
## Dəqiqlik effektivliği: ✅ Əla (≤0.25)
## Accuracy effektivliyi: ❌ Aşağı (>0.5)

8 Bank Keyfiyyəti Ümumiləşdirmə və Tövsiyələr

8.1 Ümumi Bank Skoru

# Ümumi bank skorunun hesablanması
calculate_overall_bank_score <- function(item_bank, 
                                       quality_assessment,
                                       tif_quality,
                                       content_quality,
                                       adaptive_results) {
    
    cat("=== ÜMUMİ BANK SKORu HESABLAMASI ===\n\n")
    
    # Skorları standardlaşdır (0-100 skala)
    scores <- list()
    
    # 1. Psixometrik keyfiyyət (40% ağırlık)
    psychometric_score <- quality_assessment$overall_score
    scores$psychometric <- psychometric_score
    
    # 2. TIF keyfiyyəti (25% ağırlık)
    # TIF keyfiyyətini təxmin et
    max_info <- tif_quality$metrics$max_info
    tif_score <- min(100, (max_info / 20) * 100)  # 20+ məlumat 100 bal
    scores$tif <- tif_score
    
    # 3. Məzmun keyfiyyəti (20% ağırlık)
    content_grade_map <- c("A" = 95, "B" = 85, "C" = 75, "D" = 60)
    content_score <- content_grade_map[content_quality$balance_grade]
    scores$content <- content_score
    
    # 4. Adaptiv effektivlik (15% ağırlık)
    # Orta test uzunluğu əsasında
    avg_length <- mean(adaptive_results$test_lengths)
    efficiency_score <- max(0, min(100, 120 - avg_length * 3))  # 20 item = 100 bal, 40 item = 0 bal
    scores$adaptive <- efficiency_score
    
    # Ağırlıqlı ümumi skor
    weights <- c(0.40, 0.25, 0.20, 0.15)
    overall_score <- sum(unlist(scores) * weights)
    
    cat("KOMPONET SKORLARI:\n")
    cat("1. Psixometrik keyfiyyət (40%):", round(scores$psychometric, 1), "\n")
    cat("2. TIF keyfiyyəti (25%):", round(scores$tif, 1), "\n")
    cat("3. Məzmun keyfiyyəti (20%):", round(scores$content, 1), "\n")
    cat("4. Adaptiv effektivlik (15%):", round(scores$adaptive, 1), "\n\n")
    
    cat("ÜMUMİ BANK SKORu:", round(overall_score, 1), "/100\n\n")
    
    # Ümumi qiymət
    if(overall_score >= 90) {
        cat("Bank qiyməti: 🏆 ƏLA (A+)\n")
        cat("Bank CAT üçün hazırdır və üstün performans gözlənilir.\n")
        overall_grade <- "A+"
    } else if(overall_score >= 85) {
        cat("Bank qiyməti: 🥇 ÇOX YAXŞI (A)\n")
        cat("Bank CAT üçün hazırdır və yaxşı performans gözlənilir.\n")
        overall_grade <- "A"
    } else if(overall_score >= 80) {
        cat("Bank qiyməti: 🥈 YAXŞI (B+)\n")
        cat("Bank CAT üçün uyğundur, kiçik təkmilləşdirmələr məsləhət görülür.\n")
        overall_grade <- "B+"
    } else if(overall_score >= 75) {
        cat("Bank qiyməti: 🥉 ORTA-YAXŞI (B)\n")
        cat("Bank işlək durumda, bəzi sahələrdə təkmilləşdirmə lazımdır.\n")
        overall_grade <- "B"
    } else if(overall_score >= 70) {
        cat("Bank qiyməti: ⚠️ ORTA (C+)\n")
        cat("Bank əsas funksiyaları yerinə yetirir, əhəmiyyətli təkmilləşdirmə lazımdır.\n")
        overall_grade <- "C+"
    } else if(overall_score >= 65) {
        cat("Bank qiyməti: ⚠️ AŞAĞI-ORTA (C)\n")
        cat("Bank problemlidir, geniş təkmilləşdirmə lazımdır.\n")
        overall_grade <- "C"
    } else {
        cat("Bank qiyməti: ❌ QEYRİ-MÜKƏMMƏl (D)\n")
        cat("Bank CAT üçün uyğun deyil, əsaslı yenidən işlənmə lazımdır.\n")
        overall_grade <- "D"
    }
    
    return(list(
        overall_score = overall_score,
        component_scores = scores,
        overall_grade = overall_grade
    ))
}

# Ümumi bank skoru (əvvəlki təhlillərin nəticələri lazımdır)
# Burada nümunə skor hesablayaq
sample_quality_assessment <- list(overall_score = 82)
sample_adaptive_results <- list(test_lengths = rep(22, 100))  # Orta 22 item

overall_bank_evaluation <- calculate_overall_bank_score(
    item_bank, 
    sample_quality_assessment,
    tif_quality,
    content_quality,
    sample_adaptive_results
)
## === ÜMUMİ BANK SKORu HESABLAMASI ===
## 
## KOMPONET SKORLARI:
## 1. Psixometrik keyfiyyət (40%): 82 
## 2. TIF keyfiyyəti (25%): 100 
## 3. Məzmun keyfiyyəti (20%): 95 
## 4. Adaptiv effektivlik (15%): 54 
## 
## ÜMUMİ BANK SKORu: 84.9 /100
## 
## Bank qiyməti: 🥈 YAXŞI (B+)
## Bank CAT üçün uyğundur, kiçik təkmilləşdirmələr məsləhət görülür.

8.2 Təkmilləşdirmə Tövsiyələri

# Bank təkmilləşdirmə tövsiyələri
generate_improvement_recommendations <- function(item_bank, overall_evaluation) {
    
    cat("=== BANK TƏKMİLLƏŞDİRMƏ TOVSİYƏLƏRİ ===\n\n")
    
    recommendations <- character(0)  # Boş character vector
    priority_levels <- character(0)
    
    # 1. Psixometrik təkmilləşdirmələr
    low_discrimination_items <- sum(item_bank$a < 1.0)
    if(low_discrimination_items > nrow(item_bank) * 0.15) {
        recommendations <- c(recommendations, 
            paste("❗ YÜKSƏk PRİORİTET: ", low_discrimination_items, 
                  "tapşırıq aşağı ayrıd ediciliyə malikdir (a < 1.0). Bu tapşırıqları yenidən nəzərdən keçirin və ya əvəz edin."))
        priority_levels <- c(priority_levels, "Yüksək")
    }
    
    high_guessing_items <- sum(item_bank$c > 0.3)
    if(high_guessing_items > nrow(item_bank) * 0.1) {
        recommendations <- c(recommendations,
            paste("⚠️ ORTA PRİORİTET: ", high_guessing_items,
                  "tapşırıq yüksək təsadüfi cavab parametrinə malikdir (c > 0.3). Bu tapşırıqların seçeneklərini yoxlayın."))
        priority_levels <- c(priority_levels, "Orta")
    }
    
    # 2. Məzmun təkmilləşdirmələr
    content_table <- table(item_bank$content_area)
    min_content_count <- min(content_table)
    max_content_count <- max(content_table)
    
    if(max_content_count / min_content_count > 2) {
        recommendations <- c(recommendations,
            paste("⚠️ ORTA PRİORİTET: Məzmun sahələrində balansızlıq var. Ən az təmsil olunan sahəyə daha çox tapşırıq əlavə edin:",
                  names(content_table)[which.min(content_table)]))
        priority_levels <- c(priority_levels, "Orta")
    }
    
    # 3. Çətinlik spektrumu təkmilləşdirmələri
    difficulty_gaps <- analyze_difficulty_gaps(item_bank)
    if(length(difficulty_gaps) > 0) {
        recommendations <- c(recommendations,
            paste("📊 AŞAĞI PRİORİTET: Çətinlik spektrumunda boşluqlar var. Bu aralıqlarda tapşırıq əlavə edin:",
                  paste(difficulty_gaps, collapse = ", ")))
        priority_levels <- c(priority_levels, "Aşağı")
    }
    
    # 4. TIF təkmilləşdirmələri
    max_info <- tif_quality$metrics$max_info
    if(max_info < 15) {
        recommendations <- c(recommendations,
            "❗ YÜKSƏk PRİORİTET: Test məlumat funksiyası zəifdir. Yüksək ayrıd edicilik parametrli tapşırıq əlavə edin.")
        priority_levels <- c(priority_levels, "Yüksək")
    }
    
    # 5. Exposure risk təkmilləşdirmələri
    if(nrow(item_bank) < 150) {
        recommendations <- c(recommendations,
            paste0("📈 ORTA PRİORİTET: Bank ölçüsü kifayət deyil (cari: ", nrow(item_bank), 
                   "). Exposure riskini azaltmaq üçün daha çox tapşırıq əlavə edin."))
        priority_levels <- c(priority_levels, "Orta")
    }
    
    # Tövsiyələri prioritetə görə çap et
    cat("PRİORİTET SIRALAMASI İLƏ TOVSİYƏLƏR:\n\n")
    
    high_priority <- recommendations[priority_levels == "Yüksək"]
    medium_priority <- recommendations[priority_levels == "Orta"]
    low_priority <- recommendations[priority_levels == "Aşağı"]
    
    if(length(high_priority) > 0) {
        cat("🔴 YÜKSƏK PRİORİTET:\n")
        for(i in 1:length(high_priority)) {
            cat(i, ".", as.character(high_priority[i]), "\n\n")
        }
    }
    
    if(length(medium_priority) > 0) {
        cat("🟡 ORTA PRİORİTET:\n")
        for(i in 1:length(medium_priority)) {
            cat(i, ".", as.character(medium_priority[i]), "\n\n")
        }
    }
    
    if(length(low_priority) > 0) {
        cat("🟢 AŞAĞI PRİORİTET:\n")
        for(i in 1:length(low_priority)) {
            cat(i, ".", as.character(low_priority[i]), "\n\n")
        }
    }
    
    if(length(recommendations) == 0) {
        cat("🎉 Bank yaxşı vəziyyətdədir! Heç bir kritik problem aşkarlanmadı.\n")
    }
    
    return(list(recommendations = recommendations, priorities = priority_levels))
}

# Çətinlik boşluqlarını aşkar et
analyze_difficulty_gaps <- function(item_bank, gap_threshold = 0.8) {
    
    sorted_difficulties <- sort(item_bank$b)
    gaps <- c()
    
    for(i in 1:(length(sorted_difficulties) - 1)) {
        gap_size <- sorted_difficulties[i + 1] - sorted_difficulties[i]
        if(gap_size > gap_threshold) {
            gap_range <- paste0("[", round(sorted_difficulties[i], 1), ", ", 
                               round(sorted_difficulties[i + 1], 1), "]")
            gaps <- c(gaps, gap_range)
        }
    }
    
    return(gaps)
}

# Təkmilləşdirmə tövsiyələri
improvement_recommendations <- generate_improvement_recommendations(item_bank, overall_bank_evaluation)
## === BANK TƏKMİLLƏŞDİRMƏ TOVSİYƏLƏRİ ===
## 
## PRİORİTET SIRALAMASI İLƏ TOVSİYƏLƏR:
## 
## 🟡 ORTA PRİORİTET:
## 1 . ⚠️ ORTA PRİORİTET: Məzmun sahələrində balansızlıq var. Ən az təmsil olunan sahəyə daha çox tapşırıq əlavə edin: Biologiya 
## 
## 2 . 📈 ORTA PRİORİTET: Bank ölçüsü kifayət deyil (cari: 100). Exposure riskini azaltmaq üçün daha çox tapşırıq əlavə edin.

9 Bank Keyfiyyəti Vizuallaşdırması

9.1 Keyfiyyət Dashboard-u

# Bank keyfiyyəti dashboard-u
create_quality_dashboard <- function(item_bank, overall_evaluation) {
    
    # 1. Parametr paylanmaları
    p1 <- ggplot(item_bank, aes(x = a)) +
        geom_histogram(bins = 20, fill = "lightblue", alpha = 0.7, color = "black") +
        geom_vline(xintercept = c(0.8, 1.5), color = "red", linetype = "dashed") +
        labs(title = "Ayrıd Edicilik Paylanması", x = "a parametri", y = "Tezlik") +
        annotate("text", x = 0.8, y = Inf, label = "Min", vjust = 2, color = "red") +
        annotate("text", x = 1.5, y = Inf, label = "İdeal", vjust = 2, color = "red") +
        theme_minimal()
    
    p2 <- ggplot(item_bank, aes(x = b)) +
        geom_histogram(bins = 20, fill = "lightgreen", alpha = 0.7, color = "black") +
        geom_vline(xintercept = c(-2, 0, 2), color = "red", linetype = "dashed") +
        labs(title = "Çətinlik Paylanması", x = "b parametri", y = "Tezlik") +
        theme_minimal()
    
    p3 <- ggplot(item_bank, aes(x = c)) +
        geom_histogram(bins = 15, 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 Paylanması", x = "c parametri", y = "Tezlik") +
        theme_minimal()
    
    # 2. Keyfiyyət radar chart (məlumat data.frame-i)
    quality_scores <- data.frame(
        Metric = c("Psixometrik", "TIF", "Məzmun", "Adaptiv"),
        Score = c(
            overall_evaluation$component_scores$psychometric,
            overall_evaluation$component_scores$tif,
            overall_evaluation$component_scores$content,
            overall_evaluation$component_scores$adaptive
        )
    )
    
    p4 <- ggplot(quality_scores, aes(x = reorder(Metric, Score), y = Score, fill = Metric)) +
        geom_col() +
        coord_flip() +
        labs(title = "Komponent Keyfiyyət Skorları", x = "Komponent", y = "Skor (0-100)") +
        geom_hline(yintercept = c(70, 85), linetype = "dashed", alpha = 0.5) +
        theme_minimal() +
        theme(legend.position = "none")
    
    # 3. Məzmun-çətinlik heatmap
    item_bank$diff_category <- cut(item_bank$b, 
                                  breaks = c(-Inf, -1, 0, 1, Inf),
                                  labels = c("Asan", "Orta", "Çətin", "Çox çətin"))
    
    content_difficulty <- as.data.frame(table(item_bank$content_area, item_bank$diff_category))
    names(content_difficulty) <- c("Content", "Difficulty", "Count")
    
    p5 <- ggplot(content_difficulty, aes(x = Difficulty, y = Content, fill = Count)) +
        geom_tile() +
        geom_text(aes(label = Count), color = "white", fontface = "bold") +
        scale_fill_gradient(low = "lightblue", high = "darkblue") +
        labs(title = "Məzmun-Çətinlik Heatmap", x = "Çətinlik Kateqoriyası", y = "Məzmun Sahəsi") +
        theme_minimal()
    
    # 4. TIF qrafiki
    p6 <- ggplot(tif_quality$tif_data, aes(x = theta, y = information)) +
        geom_line(size = 1.2, color = "blue") +
        geom_area(alpha = 0.3, fill = "lightblue") +
        labs(title = "Test Məlumat Funksiyası", x = "θ (Qabiliyyət)", y = "Məlumat") +
        geom_vline(xintercept = 0, linetype = "dashed", alpha = 0.5) +
        theme_minimal()
    
    # Bütün qrafiklari birləşdir
    grid.arrange(p1, p2, p3, p4, p5, p6, ncol = 2)
}

# Dashboard yaradın
create_quality_dashboard(item_bank, overall_bank_evaluation)

10 Final Hesabat və Nəticə

10.1 Ümumi Keyfiyyət Hesabatı

# Final keyfiyyət hesabatı
generate_final_quality_report <- function(item_bank, overall_evaluation, improvement_recommendations) {
    
    cat("\n", paste(rep("=", 80), collapse=""), "\n")
    cat("                           FİNAL KEYFİYYƏT HESABATI\n")
    cat(paste(rep("=", 80), collapse=""), "\n\n")
    
    # Ümumi məlumatlar
    cat("BANK ƏSAS MƏLUMATLARı:\n")
    cat("📊 Ümumi tapşırıq sayı:", nrow(item_bank), "\n")
    cat("📅 Qiymətləndirmə tarixi:", as.character(Sys.Date()), "\n")
    cat("🎯 Ümumi keyfiyyət skoru:", round(overall_evaluation$overall_score, 1), "/100\n")
    cat("🏆 Bank qiyməti:", overall_evaluation$overall_grade, "\n\n")
    
    # Komponent təhlili
    cat("KOMPONENT TƏHLİLİ:\n")
    scores <- overall_evaluation$component_scores
    cat("🔬 Psixometrik keyfiyyət:", round(scores$psychometric, 1), "/100\n")
    cat("📈 TIF keyfiyyəti:", round(scores$tif, 1), "/100\n")
    cat("📚 Məzmun keyfiyyəti:", round(scores$content, 1), "/100\n")
    cat("⚡ Adaptiv effektivlik:", round(scores$adaptive, 1), "/100\n\n")
    
    # Güclü tərəflər və zəifliklər
    cat("GÜCLÜ TƏRƏFLƏR:\n")
    strong_points <- c()
    weak_points <- c()
    
    if(scores$psychometric >= 85) strong_points <- c(strong_points, "Psixometrik parametrlər")
    else if(scores$psychometric < 70) weak_points <- c(weak_points, "Psixometrik parametrlər")
    
    if(scores$tif >= 85) strong_points <- c(strong_points, "Test məlumat funksiyası")
    else if(scores$tif < 70) weak_points <- c(weak_points, "Test məlumat funksiyası")
    
    if(scores$content >= 85) strong_points <- c(strong_points, "Məzmun balansı")
    else if(scores$content < 70) weak_points <- c(weak_points, "Məzmun balansı")
    
    if(scores$adaptive >= 85) strong_points <- c(strong_points, "Adaptiv effektivlik")
    else if(scores$adaptive < 70) weak_points <- c(weak_points, "Adaptiv effektivlik")
    
    if(length(strong_points) > 0) {
        for(point in strong_points) {
            cat("✅", point, "\n")
        }
    } else {
        cat("⚠️ Güclü tərəf aşkarlanmadı\n")
    }
    
    cat("\nZƏİF TƏRƏFLƏR:\n")
    if(length(weak_points) > 0) {
        for(point in weak_points) {
            cat("❌", point, "\n")
        }
    } else {
        cat("🎉 Əhəmiyyətli zəiflik aşkarlanmadı\n")
    }
    
    # Tövsiyələr xülasəsi
    cat("\nTOVSİYƏLƏR XÜLASƏSI:\n")
    total_recommendations <- length(improvement_recommendations$recommendations)
    high_priority <- sum(improvement_recommendations$priorities == "Yüksək")
    medium_priority <- sum(improvement_recommendations$priorities == "Orta")
    low_priority <- sum(improvement_recommendations$priorities == "Aşağı")
    
    cat("📋 Ümumi tövsiyə sayı:", total_recommendations, "\n")
    cat("🔴 Yüksək prioritet:", high_priority, "\n")
    cat("🟡 Orta prioritet:", medium_priority, "\n")
    cat("🟢 Aşağı prioritet:", low_priority, "\n\n")
    
    # Növbəti addımlar
    cat("NÖVBƏTI ADDIMLAR:\n")
    if(high_priority > 0) {
        cat("1. 🚨 Yüksək prioritetli problemləri dərhal həll edin\n")
    }
    if(medium_priority > 0) {
        cat("2. ⏰ Orta prioritetli təkmilləşdirmələri 2-4 həftə ərzində həyata keçirin\n")
    }
    if(total_recommendations == 0) {
        cat("🎯 Bank keyfiyyəti yaxşıdır, rutin monitorinq davam etdirin\n")
    } else {
        cat("3. 📊 Təkmilləşdirmələrdən sonra yenidən qiymətləndirmə aparın\n")
    }
    
    cat("\n", paste(rep("=", 80), collapse=""), "\n")
    cat("                        HESABAT SONU\n")
    cat(paste(rep("=", 80), collapse=""), "\n")
    
    return(list(
        report_date = Sys.Date(),
        overall_score = overall_evaluation$overall_score,
        grade = overall_evaluation$overall_grade,
        recommendations_count = total_recommendations,
        priority_breakdown = c(high_priority, medium_priority, low_priority)
    ))
}

# Final hesabat
final_report <- generate_final_quality_report(item_bank, overall_bank_evaluation, improvement_recommendations)
## 
##  ================================================================================ 
##                            FİNAL KEYFİYYƏT HESABATI
## ================================================================================ 
## 
## BANK ƏSAS MƏLUMATLARı:
## 📊 Ümumi tapşırıq sayı: 100 
## 📅 Qiymətləndirmə tarixi: 2025-07-12 
## 🎯 Ümumi keyfiyyət skoru: 84.9 /100
## 🏆 Bank qiyməti: B+ 
## 
## KOMPONENT TƏHLİLİ:
## 🔬 Psixometrik keyfiyyət: 82 /100
## 📈 TIF keyfiyyəti: 100 /100
## 📚 Məzmun keyfiyyəti: 95 /100
## ⚡ Adaptiv effektivlik: 54 /100
## 
## GÜCLÜ TƏRƏFLƏR:
## ✅ Test məlumat funksiyası 
## ✅ Məzmun balansı 
## 
## ZƏİF TƏRƏFLƏR:
## ❌ Adaptiv effektivlik 
## 
## TOVSİYƏLƏR XÜLASƏSI:
## 📋 Ümumi tövsiyə sayı: 2 
## 🔴 Yüksək prioritet: 0 
## 🟡 Orta prioritet: 2 
## 🟢 Aşağı prioritet: 0 
## 
## NÖVBƏTI ADDIMLAR:
## 2. ⏰ Orta prioritetli təkmilləşdirmələri 2-4 həftə ərzində həyata keçirin
## 3. 📊 Təkmilləşdirmələrdən sonra yenidən qiymətləndirmə aparın
## 
##  ================================================================================ 
##                         HESABAT SONU
## ================================================================================

11 Nəticə

Bu bölmədə tapşırıq bankının keyfiyyətini çoxölçülü perspektivdən qiymətləndirməyin sistemli yollarını öyrəndik. Bank keyfiyyəti CAT sisteminin uğurlu işləməsi üçün əsasdır və müntəzəm monitorinq tələb edir.

11.1 Əsas Nəticələr

  1. Çoxölçülü qiymətləndirmə psixometrik, məzmun, və operativ aspektləri əhatə edir
  2. Keyfiyyət metriklər objektiv və ölçülə bilən göstəricilər təqdim edir
  3. TIF təhlili bank informativliyini və dəqiqliyini qiymətləndirir
  4. Adaptiv effektivlik real CAT performansını simulyasiya edir
  5. Systematik tövsiyələr konkret təkmilləşdirmə addımları verir

11.2 Praktiki Tövsiyələr

  • Bank keyfiyyətini ən azı 6 ayda bir qiymətləndirin
  • Yeni tapşırıqlar əlavə etdikdən sonra yenidən təhlil aparın
  • Exposure məlumatlarını mütəmadi izləyin və optimallaşdırın
  • Problemli tapşırıqları vaxtında aşkar edin və əvəz edin

11.3 Növbəti Addımlar

  • Bölmə 8: CAT Adaptiv Alqoritmləri və Item Seçim Strategiyaları
  • Bölmə 9: CAT Simulyasiyalarının Aparılması və Nəticələrin Təhlili
  • Bölmə 10: CAT Performansının Optimallaşdırılması

Qeyd: Bu bölmədə təqdim edilən keyfiyyət qiymətləndirmə sistemi CAT bank idarəetməsi üçün əsas çərçivə təşkil edir. Real tətbiqlər üçün organizasiyanın spesifik tələblərinə uyğunlaşdırılmalıdır.