Bu deneyde şu duruma bakacağım:
Elimizde bir yalan makinesi var. Birisi yalan söylediğinde bu yalanı yüzde doksanbeş ihtimalle anlıyor. Birisinin doğru söyledğini de yüzde doksan ihtimalle anlıyor. Yani doğru söyleyen birinde yüzde on ihtimalle yalan söylediğini iddia ediyor. Yüz kişilik bir grubumuz var ve bu grupta bir kişi yalancı, geri kalan herkes doğruyu söylüyor. Gruptan rasgele seçilen birini bu yalan makinesine bağlıyoruz ve kendisine yalan söyleyip söylemediğini soruyoruz. Bu kişi hayır yalan söylemiyorum diyor ve yalan makinesi bu kişinin yalan söylediğini iddia ediyor. Yüzde kaç ihtimalle bu kişi yalancıdır?
Yukarıda da belirttiğim gibi bu soruyu bir deney olarak işleyeceğim. Yani soruyu matematiksel olarak çözmeyi denemeyeceğim. Deneyde 100 kişi alacağım. Rasgele birini yalancı diye işaretleyeceğim, geri kalan hepsi doğrucu olacak. Sonra her kişiyi tek tek yalan makinesine sokacağım ve yalan makinesini sorudaki olasılıklar dahilinde tahminlerde bulunacak. Bu tahminleri de her kişi için işaretleyeceğim. Sonra da gerçek yalancıların sayısının yalancı olarak tahmin edilen kişilerin sayısına oranına bakacağım.
Bu deneyi bir kaç kere yapıp çıkan grafiklere bakalım.
Aşağıdaki grafikler için önce biraz açıklama yapayım. Mavi noktalar, ürettiğim gerçek popülasyon olmaktadır. 1.0 değerine karşılık gelen noktalar, yani kişiler, o kişinin doğruyu söylediğini, 0.0 değerine karşılık gelen noktalar ise o kişinin yalancı olduğunu gösteriyor. Grafikler daha kolay görülsün diye yalan makinesinin çıktılarını kırmızı yaptım 2.0 ve 0.0 değerleriyle eşleştirdim. Yani 2.0 değerine karşılık gelen bireyler yalan makinesinin doğru söylediğine inandığı kişiler ve 0.0 değerine karşılık gelen kişiler ise yalan makinesi tarafından yalancı olduğu tespit edilen kişiler.

Bu deneyde görüldüğü gibi, 100 kişiden sadece 1 tanesi gerçekten yalancı ama yalan makinesi 14 kişiyi daha yalancı olarak tespit etmiş. Bu durumda bir yalancı olduğu tahmin edilen bir kişinin gerçekten yalancı olma ihtimali 1/15 olmakta.

Bu deneyde ise gerçek yalancı dışında 7 tane daha yalancı tespit edilmiş. O zaman yalancı olduğu iddia edilen rasgele birinin gerçekten yalancı olma şansı 1/8 olmakta.
Bu deneyleri yeterince tekrarlayıp ortalamalarını aldığımız zaman teorik sonuçlara oldukça yaklaşabiliriz. İsteyen yazının sonunda vereceğim programı biraz daha geliştirerek bu sonucu da elde edebilir.
Yalan makinesinin tahmin başarısı aslında tek tek bakıldığında yüksek oranlar gibi gözükse de eğer aradığımız özellik popülasyonda çok az bulunan bir özellik ise hiç beklemediğimiz kadar zayıf sonuçlar veriyor. Yani yüzde doksanlarda tahmin başarısı beklediğimiz bir testte başarı yüzde onun altına düşüyor. Bunun nedenlerinden biri tabii ki bir sürü yanlış pozitif tahmin olması. Gerçek pozitif sonuç çok nadir ise bu yalancı pozitifler başarı oranını çok düşürüyor. Popülasyondaki yalancı sayısını artırarak bir iki deney yapayım ve bunun etkilerine bakalım.
Aşağıdaki deneylerde yüz kişilik popülasyonumuzun 10 kişisi yalancıdır.

Yalan makinesi 16 kişinin yalancı olduğunu tespit etmiş. Gerçekte ise 10 yalancı vardı. Demek ki yalancı olduğu iddia edilen birisinin gerçekten yalancı olma şansı 10/16. Başarı oranı birden yüzde onlardan yüzde ellilere geldi.

Bu deneyde de yalan makinesi yanlış saymadıysam 19 kişinin yalancı olduğunu tahmin etmiş. Bu durumda tahminin doğru olma şansı 10/19 yani yine hemen hemen yüzde elli olmakta.
Peki yalancı pozitif ihtimalini düşürürsek nasıl bir başarı oranı bulabiliriz. Yalan makinemiz bu sefer doğrucu bir kişinin doğru söylediğini yüzde doksandokuz oranda tahmin etsin ve popülasyonumuzda yine sadece bir yalancı olsun. Bakalım başarı oranları nasıl değişecek.

Görüldüğü gibi yalancı pozitif sayısı çok daha azaldı ve böylece yalan makinesinin tahmin başarısı arttı ama yine de yüzde doksanlardan çok uzağız. Bu deneydeki başarı oranı 1/2 seviyesinde.
Buna benzer yanılsamalar popülasyonda çok ender görülen hastalıkların yüzde yüz olmayan testlerinde de meydana gelmektedir. Hastalar hastalığın yüzde doksandokuz oranında teşhis edildiğini bilip ve kendi testlerinin de pozitif olduğunu duyunca kesin hasta olduklarını düşünmekte ama gerçek ihtimal bu deneylerde de görüldüğü gibi çok daha düşük olabilmekte. Olasılıklar insan için sezgisel bir alan değil maalesef.
Deneylerde aşağıda verdiğim R kodunu kullandım.
generate_population istenilen popülasyonu yaratan fonksiyon. size parametresi popülasyonun büyüklüğünü, liars ise popülasyon içindeki yalancı bireylerin sayısını belirliyor.
detect_lie fonksiyonu ile yalan makinesini simüle ediyoruz. verilen person kişisi ile iltili tahmini doğru ve yalancı pozitif parametrelerine göre yapıyor.
do_the_experiment fonksiyonu ile bu deney bir popülasyon için yapılmakta ve sonuç grafik olarak gösterilmekte. İstenirse bu deney birçok kere tekrar edilir ve sonuçlar grafikte gösterilmeden sayılarak ortalama bulunabilir. Böylece terorik sonuca yakın bir sonuç elde edilebilir.
generate_population <- function(size, liars) {
population <- rep(1, size)
random_indices <- sample(1:size, liars)
population[random_indices] <- 0
return (population)
}
detect_lie <- function(person, true_positive, false_positive) {
estimation <- runif(1)
if(!is_liar(person) && estimation < false_positive) {
return (0)
} else if(is_liar(person) && estimation < true_positive) {
return (0)
}
return (1)
}
is_liar <- function(person) {
if(person == 1) {
return (FALSE)
} else {
return (TRUE)
}
}
do_the_experiment <- function() {
matches <- 0
detections = c()
population <- generate_population(100, 1)
print(population)
for (person in population) {
detection <- detect_lie(person, 0.95, 0.01)
detections <- c(detections, detection)
if(detection == is_liar(person)) {
matches <- matches + 1
}
}
x_axis <- 1:length(population)
processed_detections <- lapply(detections, function(x) {
# Check if the element is numeric before multiplying
if (is.numeric(x)) {
x * 2
} else {
# If not numeric, return the element unchanged
x
}
})
old_par <- par(mar = c(5, 4, 4, 8) + 0.1, xpd = TRUE)
plot(x_axis, population,
type = "l", # Plot as a line
col = "blue", # Color the first line blue
ylim = range(c(population, processed_detections)), # Set y-limits to cover the range of both datasets
xlab = "Kişi", # X-axis label
ylab = "Yalancı / Doğrucu"
)
points(x_axis, processed_detections,
type = "l", # Add as a line
col = "red")
legend("top", # Position of the legend
legend = c("Gerçek nüfus (1 doğrucu, 0 yalancı)", "Yalan makinesi tahminleri (2 doğrucu, 0 yalancı)"), # Labels for the legend
col = c("blue", "red"), # Colors matching the lines/points
lty = 1,
inset = c(0, -0.3))
par(old_par)
}