Measurement Problems #3: Sorting Reviews
💬Ürün ya da hizmet değerlendirmelerinde kullanıcı yorumları artık karar mekanizmamızın ayrılmaz bir parçası haline geldi. Peki bir yorumun…
Measurement Problems #3: Sorting Reviews
💬Ürün ya da hizmet değerlendirmelerinde kullanıcı yorumları artık karar mekanizmamızın ayrılmaz bir parçası haline geldi. Peki bir yorumun öne çıkmasını sağlayan şey nedir? Yüksek puan mı, en son tarih mi, yoksa yorumun topluluk tarafından faydalı bulunup bulunmaması mı?
👋Amazon, YouTube ve birçok büyük platform, yorumların faydalılığını belirlemek için sadece puanlara değil, topluluğun o yoruma verdiği etkileşime göre bir sıralama yapar. Bu yazıda, özellikle up/down (beğeni-beğenmeme) verileri üzerinden yorumları nasıl daha objektif bir şekilde sıralayabileceğimizi anlatacağım.

💡Öncelikle bazı temel skor hesaplamalarına bakalım:
🔸Upp-Down Diff Score
🔸Average Rating Score
🔸Wilson Lower Bound Score (WLB)
İlk önce kütüphanelerimizi import edelim.
import pandas as pd
import math
import scipy.stats as st
pd.set_option('display.max_columns', None)
pd.set_option('display.expand_frame_repr', False)
pd.set_option('display.float_format', lambda x: '%.5f' % x)
#Up-Down Diff Score (up ratings — down ratings)
#İki değerlendirme sistemi karşılaştırılıyor: thumbs up / thumbs down (beğeni - beğenmeme)
#Yorum 1: 600 beğeni, 400 beğenmeme — toplam 1000 oy
#Yorum 2: 5500 beğeni, 4500 beğenmeme — toplam 10000 oy
#Basit fark yöntemi: beğeni sayısından beğenmeme sayısını çıkarıyoruz.
def score_up_down_diff(up, down):
return up - down
#Yorum 1 için fark (net skor): 600 - 400 = 200
score_up_down_diff(600, 400)
#Yorum 2 için fark (net skor): 5500 - 4500 = 1000
score_up_down_diff(5500, 4500)
📊Net skorlara bakalım:
- 600 beğeni, 400 beğenmeme = 200
- 5500 beğeni, 4500 beğenmeme = 1000

İki yoruma ait net skorlar
🧐İkinci yorum ilkinden yüksek skora sahip gibi görünüyor. Ancak burada kritik bir sorun var: Oranlar.
- İlk yorumun beğenilme oranı %60 (600 / 1000)
- İkinci yorumun oranı %55 (5500 / 10000)
Bu da bizi daha adil bir yöntem olan oranlara götürüyor.
#Average Rating Score (up ratings / all ratings)
#Beğeni oranını (average rating) hesaplayan fonksiyon
def score_average_rating(up, down):
if up + down == 0:
return 0 #Hiç oy yoksa oran sıfır kabul edilir (bölme hatasını engeller)
return up / (up + down)
#Review 1: 600 beğeni, 400 beğenmeme
score_average_rating(600, 400)
#Review 2: 5500 beğeni, 4500 beğenmeme
score_average_rating(5500, 4500)
# Yeni örnek:
# Review 1: 2 beğeni, 0 beğenmeme → oran: %100
score_average_rating(2, 0)
# Review 2: 100 beğeni, 1 beğenmeme → oran: %99
score_average_rating(100, 1)

İlk örnekteki yorumlara ait average rating score çıktıları

İkinci örnekteki yorumlara ait average rating score çıktıları
✔️Bu yöntem önceki yönteme göre daha dengeli bir sonuç verir. Çünkü sadece farkı değil, oyların dağılımını da dikkate alır. Ancak bu yöntemde de toplam kaç kişinin oy verdiği göz ardı edilir. Örneğin, sadece 2 oy almış bir yorum %100 beğeni oranına sahip olabilirken, 101 oy almış bir yorum %99 oranında kalabilir. Bu da az oy alan yorumların gerçekte olduğundan daha iyi görünmesine neden olur.
Hem oranı hem de oy sayısını birlikte değerlendiren yöntemler kullanılmalıdır. Bu tür durumlar için Wilson puan aralığı gibi daha güvenilir hesaplama yöntemlerine başvurmak daha doğru olur.
#Wilson Lower Bound Score
🔍Like–dislike gibi ikili etkileşimler içeren içerikleri sıralarken, sadece beğeni oranına bakmak yanıltıcı olabilir. Çünkü az oyla yüksek oran yakalanabilir. Wilson Lower Bound (WLB) yöntemi, hem oranı hem de toplam oy sayısını dikkate alır. Teknik olarak, like oranı için bir güven aralığı hesaplar ve bu aralığın alt sınırını skor olarak kabul eder.
Örneğin 600 like, 400 dislike alan bir yorumun beğeni oranı %60’tır. WLB, bu oran için alt sınırı (örneğin %50) alır ve bu skora göre içerikleri sıralar. Bu yöntem, az etkileşimli içeriklerin haksız şekilde öne çıkmasını engeller. Sonuç olarak, WLB daha adil ve dengeli bir sıralama sağlar.
import math
import scipy.stats as st
def wilson_lower_bound(up, down, confidence=0.95):
"""
Wilson Lower Bound Score hesapla.
- Bernoulli parametresi p için güven aralığının alt sınırını hesaplar.
- Bu alt sınır, ürün veya yorumların sıralamasında kullanılabilecek güvenilir bir skor sağlar.
- Not: Eğer skorlar 1-5 arasında ise, 1-3 negatif, 4-5 pozitif kabul edilip bernoulli formuna uyarlanabilir.
Ancak bu durumda bazı sorunlar çıkabilir; bu yüzden bayesian average rating tercih edilebilir.
Parameters
----------
up : int
Beğeni sayısı (like)
down : int
Beğenmeme sayısı (dislike)
confidence : float, optional
Güven seviyesi (default 0.95)
Returns
-------
float
Wilson Lower Bound skoru (alt sınır)
"""
n = up + down #Toplam oy sayısı
if n == 0:
return 0 #Oy yoksa skor 0 olarak döner
#z değeri, verilen güven düzeyi için standart normal dağılımın kritik değeri
z = st.norm.ppf(1 - (1 - confidence) / 2)
phat = 1.0 * up / n # Beğeni oranı
#Wilson Lower Bound formülü uygulanıyor
return (phat + z * z / (2 * n) -
z * math.sqrt((phat * (1 - phat) + z * z / (4 * n)) / n)) / (1 + z * z / n)
#Örnek kullanımlar:
#600 like, 400 dislike alan yorum için skor hesapla
wilson_lower_bound(600, 400)
#5500 like, 4500 dislike alan yorum için skor hesapla
wilson_lower_bound(5500, 4500)
#İlk yorumun skoru daha yüksek, yani daha güvenilir daha iyi
#2 like, 0 dislike alan yorum için skor hesapla
wilson_lower_bound(2, 0)
#100 like, 1 dislike alan yorum için skor hesapla
wilson_lower_bound(100, 1)
#Burada ikinci yorumun skoru daha yüksek, yani daha güvenilir kabul edilir.


🔥Elimizdeki örnekleme dayanarak, up oranının (%95 güven düzeyi ve %5 hata payı ile) gerçek değerin hangi aralıkta yer alacağını istatistiksel olarak tahmin edebiliyoruz. Bu güven aralığını hesapladıktan sonra, özellikle bu aralığın alt sınırını baz alıyoruz. Yani, en düşük olası değeri referans noktası olarak kabul ederek, değerlendirmemizi bu temkinli tahmine göre yapıyoruz.
#Case Study
up = [15, 70, 14, 4, 2, 5, 8, 37, 21, 52, 28, 147, 61, 30, 23, 40, 37, 61, 54, 18, 12, 68]
down = [0, 2, 2, 2, 15, 2, 6, 5, 23, 8, 12, 2, 1, 1, 5, 1, 2, 6, 2, 0, 2, 2]
comments = pd.DataFrame({"up": up, "down": down})
# Her yorum için 'up' ve 'down' değerlerini kullanarak farklı skorlar hesaplanıyor.
#score_pos_neg_diff: Beğeni ve beğenmeme farkı (up - down)
comments["score_pos_neg_diff"] = comments.apply(
lambda x: score_up_down_diff(x["up"], x["down"]), axis=1
)
#score_average_rating: Beğeni oranı (up / (up + down))
comments["score_average_rating"] = comments.apply(
lambda x: score_average_rating(x["up"], x["down"]), axis=1
)
#wilson_lower_bound: Wilson Lower Bound yöntemi ile güvenli alt sınır skoru hesaplanıyor.
comments["wilson_lower_bound"] = comments.apply(
lambda x: wilson_lower_bound(x["up"], x["down"]), axis=1
)
#Son olarak, hesaplanan Wilson Lower Bound skorlarına göre yorumlar azalan şekilde sıralanıyor.
comments.sort_values("wilson_lower_bound", ascending=False)

👍Bu kod, kullanıcı yorumlarına ait beğeni (up) ve beğenmeme (down) sayıları üzerinden farklı skor hesaplama yöntemlerini uygular ve bu skorları kullanarak yorumları sıralar. Böylece hangi yorumların daha olumlu ve güvenilir olduğunu belirlemeye yardımcı olur.
Sonuç
🎯Negatif yorumları gizlemek ya da bastırmak doğru bir yaklaşım değildir. Asıl önemli olan, diğer kullanıcıların bir yorumu faydalı bulup bulmadığıdır. WLB, yorumun up/down etkileşimlerine dayalı olarak istatistiksel anlamda ne kadar güçlü olduğunu gösterir.
✅Bu nedenle sıralama yapılırken sadece basit puanlara ya da tarihe göre değil, Wilson Lower Bound Score gibi güvenilir metriklere göre değerlendirme yapılmalıdır.
👍Bir sonraki yazımda “A/B Testing” konusunu ele alacağım. Güncel paylaşımlar için takipte kalın!😊
메타데이터
- post_id
- 2eb93c507de3
- slug
- measurement-problems-2-sorting-reviews-2eb93c507de3
- url
- https://medium.com/@dilaanbb/measurement-problems-2-sorting-reviews-2eb93c507de3
- canonical_url
- https://medium.com/@dilaanbb/measurement-problems-2-sorting-reviews-2eb93c507de3
- author_url
- https://medium.com/@dilaanbb
- status
- ok
- fetched_at
- 2026-06-26 03:39:16