Rating Systems and Sorting Reviews on Amazon Data

ANIL NEBİ ŞENTÜRK
4 min readDec 31, 2021

Merhabalar,bugün Amazon Şirketinin verilerini kullanarak,ürün puanı sıralama ve yorumların en sağlıklı şekilde sıralanması noktasında tatlı bir case yazıyor olacağım.

Sitesinde bulunan müşterilerinin deneyimlerine göre ürünlerinin derecelendirdiği bir çok ürün bulunan online alışveriş sitelerinin en büyük problemi ürün puanlamasını nasıl yapacağı konusundadır.

Derecelendirme bulmanın ve bu ürünleri derecelendirmenin bazı yolları vardır:
1)Genel ortalamaya göre derecelendirme
2)Olumlu olumsuz derecelendirme arasında ki anlamlı farklılık
3)Olumlu oyların veri seti üzerinde ki oranı

Ancak yukarıda saydığım maddeler pek de güvenilir sonuçlar veremeyebiliyor…

Bu nokta da imdadımıza “Wilson Lower Bound” methodu koşuyor.
Örnek kullanıcı puanlarına sahip mevcut bir puanımız olduğu göz önüne alındığında, kullanıcı topluluğunun bir ürünü %95 güvenle yükseltme konusunda ne düşüneceğidir.

Örnek bir popülasyonun ne düşündüğünü biliyorsak, yani bir ürün için kullanıcı incelemeleri yaparsak, bunu tüm topluluk için tercihleri tahmin etmek için kullanabilirsiniz.

Bir ürün için yararlı_evet(helpful_yes) ve yararlı_hayır(helpful_no) oyları varsa ve ürünün tüm toplulukta ne kadar popüler olacağını anlamak istiyorsak, burada %95 güven aralığı ile wilson_lower_bound ile tahminlemelerini kullanabiliriz.

Wilson Lower Bound Score:

Veri setimizin değişkenlerini tanıyalım.
#Değişkenler
#reviewerID — Kullanıcı ID’si Örn: A2SUAM1J3GNN3B
#asin — Ürün ID’si Örn: 0000013714
#reviewerName — Kullanıcı Adı
#helpful — Faydalı değerlendirme derecesi Örn: 2/3
#reviewText — Değerlendirme Kullanıcının yazdığı inceleme metni
#overall — Ürün rating’i
#summary — Değerlendirme özeti
#unixReviewTime — Değerlendirme zamanı
#reviewTime — Değerlendirme zamanı raw
#day_diff — Değerlendirmeden itibaren geçen gün sayısı
#helpful_yes — Değerlendirmenin faydalı bulunma sayısı
#total_vote — Değerlendirmeye verilen oy sayısı

#gerekli kütphaneleri import edelim..
import pandas as pd
import math
import scipy.stats as st
from sklearn.preprocessing import MinMaxScaler
pd.set_option('display.max_columns', None)
pd.set_option('display.max_rows', None)
pd.set_option('display.width', 500)
pd.set_option('display.expand_frame_repr', False)
pd.set_option('display.float_format', lambda x: '%.5f' % x)
#veri setimizi okutalım
df=pd.read_csv('C:/Users/Lenovo/OneDrive/Masaüstü/amazon_review.csv')
df.head(5)
#ürün ratingi olarak atanan overall değişkenin ortalamasına bakalım.
df['overall'].mean()
4.58
#Weighted Average point of product by date:

df['reviewTime']=pd.to_datetime(df['reviewTime'], dayfirst=True)
current_date=pd.to_datetime('2014-12-09')
df['days']=(current_date-df['reviewTime']).dt.days
df.head()
#days değikenin 25,50,75 çeyreklerine bakarak bize en yakın tarih de değerlendirme bırakan müşteriye en fazla ağırlığı ver.
a = df["days"].quantile(0.25) 2861.0
b = df["days"].quantile(0.50) 3011.0
c = df["days"].quantile(0.75) 3181.0

df.loc[df["days"] <= a, "overall"].mean() * 28 / 100 + \
df.loc[(df["days"] > a) & (df["days"] <= b), "overall"].mean() * 26 / 100 + \
df.loc[(df["days"] > b) & (df["days"] <= c), "overall"].mean() * 24 / 100 + \
df.loc[(df["days"] > c), "overall"].mean() * 22 / 100
#helpful_yes,heplful_no
#hepful_yes+helpful_no=total_vote
#toplam helpful frekansına bakalım
df['helpful'].value_counts()
new_features
= df["helpful"].str.split(",",expand=True)
new_features = new_features.astype("string")
helpful_yes = new_features[0].str.lstrip("[")
helpful_yes = helpful_yes.astype("int64")
total_vote = new_features[1].str.rstrip("]")
total_vote = total_vote.astype("int64")
#toplam oydan-yararlı bulunan oyları çıkardığımızda yararlı bulunmayanlara erişiriz.
helpful_no = total_vote - helpful_yes
helpful_no

df["helpful_yes"] = helpful_yes
df["helpful_no"] = helpful_no
df["total_vote"] = total_vote

#pozitif ve negatif yorumların score'nu farkını anlatan fonksiyonu tanımlayalım.

def score_pos_neg_diff(pos,neg):
return pos-neg
df["score_pos_neg_diff"] = df.apply(lambda x: score_pos_neg_diff(x["helpful_yes"],
x["helpful_no"]),
axis=1)
def score_average_rating(pos, neg):
if pos - neg == 0:
return 0
return pos / (pos + neg)


df["score_average_rating"] = df.apply(lambda x: score_average_rating(x["helpful_yes"],
x["helpful_no"]),
axis=1)

df.head(5)

df[“helpful”][df[“score_pos_neg_diff”].sort_values(ascending=False).head(10).index]

df[“helpful”][df[“score_average_rating”].sort_values(ascending=False).head(10).index]

df[“helpful”][df[“wilson_lower_bound”].sort_values(ascending=False).head(10).index]

df[“total_score”] = (df[“score_average_rating”] * 40 / 100 +
df[“wilson_lower_bound”] * 60 / 100)

--

--