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.
# 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
# Ə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 %)
# Çə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
# 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)
# 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)
##
## === 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
# 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 %)
##
## === 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 )
# 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)
# Ü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.
# 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.
# 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)
# 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
## ================================================================================
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.
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.