Ölçüm Problemleri — 1

Mar 20 2023
Bu yazı ile veri bilimi alanında önemli bir yere sahip olan ölçüm problemlerini konu alan yeni bir mini diziye başlayacağım. Bu seri üç ana başlıktan oluşacaktır: Diyelim ki bir ürün almaya karar verdik.

Bu yazı ile veri bilimi alanında önemli bir yere sahip olan ölçüm problemlerini konu alan yeni bir mini diziye başlayacağım.

Bu seri üç ana başlıktan oluşacaktır:

  • Derecelendirme Ürünleri
  • Ürünleri Sıralama
  • İncelemeleri Sıralama

Diyelim ki bir ürün almaya karar verdik. İnternette satın almak istediğimiz herhangi bir ürünü arattığımızda birçok seçeneğin olduğunu görebiliriz.

Peki böyle bir durumda karar vermemize yardımcı olacak şeyler nelerdir?

Sosyal kanıt

Sosyal kanıt, diğer insanların davranışlarını kopyalama eylemidir. Yani bir ürün almaya karar verdiğimizde hangisini seçeceğimizi düşünürken başkalarının yorumlarına ve değerlendirmelerine bakıyoruz ve bu da ürün alırken bizi etkiliyor.

Elbette bu tanımı psikolojik olarak açıklayamam ama temelde herkesin onayladığını almanın bizi rahatlık alanında hissettirdiğini söyleyebilirim sanırım.

Sosyal Kanıt terimi , Robert Cialdini tarafından 1984 yılında yayınlanan kitabında ortaya atılmıştır .

Bu bizi başka bir tanıma getiriyor:

Kalabalığın Bilgeliği

Bunca ürün arasından herkes o ürünü aldıysa ben de alayım duygusu. Çünkü neden olmasın ve çok fazla düşünmek istemiyorum!

İkna edin ve ikna olacaksınız!

Ölçüm Problemleri

Burada pazaryerinin yapması gereken ürünleri müşteriler için en doğru ve objektif şekilde sıralamaktır.

Bunu yaparken karşılaşılan bazı ölçüm sorunları vardır.

Serinin bu ilk bölümünde, ürünleri derecelendirme konusunu ele alacağız.

  • Derecelendirme Ürünleri

*Ortalama

*Zamana Dayalı Ağırlıklı Ortalama

*Kullanıcı Bazlı Ağırlıklı Ortalama

*Ağırlıklı Derecelendirme

Ürün derecelendirme için kullanacağımız yukarıda belirtilen yöntemleri bir örnekle açıklamaya çalışacağım.

Bu örnekte, çevrimiçi bir kursun derecelendirmelerini inceleyeceğiz.

Yükleme ve İçe Aktarma

import pandas as pd
import datetime as dt
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)

df = pd.read_csv(r'C:\course_reviews.csv')
df.head()
df.shape

df['Rating'].value_counts()

df['Questions Asked'].value_counts()

df.groupby('Questions Asked').agg({'Questions Asked': 'count',
                                   'Rating': 'mean'})

df['Rating'].mean()

Şu an puanlarda bir artış veya düşüş olabilir, bunun da değerlendirilmesi gerekiyor.

Bu durumda, diğer durumları da değerlendirmek için Zamana Dayalı Ağırlıklı Ortalamayı kullanmalıyız.

*Zamana Dayalı Ağırlıklı Ortalama

'Timestamp' değişkenini zaman değişkenine çevirelim

df['Timestamp'] = pd.to_datetime(df['Timestamp'])
current_date = pd.to_datetime('2021-02-10 0:0:0')

df['days'] = (current_date - df['Timestamp']).dt.days

df[df['days'] <= 30] .count()

df.loc[df['days'] <= 30, 'Rating'].mean()

df.loc[df['days'] <= 30, 'Rating'].mean() * 28/100 + \
df.loc[(df['days'] > 30) & (df['days'] <= 90), 'Rating'].mean() * 26/100 + \
df.loc[(df['days'] > 90) & (df['days'] <= 180), 'Rating'].mean() * 24/100 + \
df.loc[(df['days'] > 180), 'Rating'].mean() * 22/100

def time_based_weighted_average(dataframe, w1=28, w2=26, w3=24, w4=22):
    return  dataframe.loc[df['days'] <= 30, 'Rating'].mean() * w1/100 + \
            dataframe.loc[(df['days'] > 30) & (dataframe['days'] <= 90), 'Rating'].mean() * w2/100 + \
            dataframe.loc[(df['days'] > 90) & (dataframe['days'] <= 180), 'Rating'].mean() * w3/100 + \
            dataframe.loc[(df['days'] > 180), 'Rating'].mean() * w4/100

time_based_weighted_average(df)
time_based_weighted_average(df, 30, 26, 22, 22)

*Kullanıcı Bazlı Ağırlıklı Ortalama

Kursu farklı oranlarda izleyen kullanıcıların puanları farklı ağırlıklarla değerlendirilmelidir:

df.groupby('Progress').agg({'Rating': 'mean'})

Kursun görüntüleme durumuyla ağırlıklı puanı hesaplamak için:

df.loc[df['Progress'] <= 10, 'Rating'].mean() * 22/100 + \
    df.loc[(df['Progress'] > 10) & (df['Progress'] <= 45), 'Rating'].mean() * 24/100 + \
    df.loc[(df['Progress'] > 45) & (df['Progress'] <= 75), 'Rating'].mean() * 26/100 + \
    df.loc[(df['Progress'] > 75), 'Rating'].mean() * 28/100

def user_based_weighted_average(dataframe, w1=22, w2=24, w3=26, w4=28):
    return  dataframe.loc[df['Progress'] <= 10, 'Rating'].mean() * w1/100 + \
            dataframe.loc[(df['Progress'] > 10) & (dataframe['Progress'] <= 45), 'Rating'].mean() * w2/100 + \
            dataframe.loc[(df['Progress'] > 45) & (dataframe['Progress'] <= 75), 'Rating'].mean() * w3/100 + \
            dataframe.loc[(df['Progress'] > 75), 'Rating'].mean() * w4/100

user_based_weighted_average(df)
user_based_weighted_average(df, 20, 24, 26, 30)

*Ağırlıklı Derecelendirme

Zaman Bazlı Ağırlıklı Ortalama ve Kullanıcı Bazlı Ağırlıklı Ortalama hesaplamalarını tek bir fonksiyonda birleştireceğiz.

def course_weighted_rating(dataframe, time_w=50, user_w=50):
    return time_based_weighted_average(dataframe) * time_w/100 + user_based_weighted_average(dataframe) * user_w/100

course_weighted_rating(df)

Çözüm

Bu yazıda bir ürünü ne zaman almak istediğimize karar vermemize yardımcı olacak şeyleri anlattım ve ürünleri en doğru ve objektif şekilde sıralamak istediğimizde ortaya çıkabilecek ölçü problemlerini görmüş olduk.

Bir sonraki yazımızda ürünleri sıralama konusuna değineceğiz.

İkna edin ve ikna olacaksınız!

En iyi, Neslihan