Всем привет. Тема этой недели — проблемы измерения. Мы рассмотрим вопросы, связанные с ранжированием, скорингом и ценообразованием, которые обычно связаны с электронной коммерцией. Мы рассмотрим такие темы, как сортировка продукта.

Что заставляет продукт продаваться?

Когда пользователь хочет купить онлайн-продукт, он переходит на сайт и выполняет поиск, и появляется множество результатов. При выборе этого продукта он обычно ориентируется на производительность. Некоторые факторы заставляют покупать продукт. Рейтинги, обзоры, тесты и т. д. Общее название таких понятий — социальное доказательство. Социальное доказательство — один из важнейших факторов, влияющих на покупку пользователя. Другими словами, мы смотрим на мнение сообщества. Почему мнение других людей так важно? Нам нужно рассмотреть концепцию, называемую мудростью толпы. В мире цифрового маркетинга, что заставляет покупать продукт, как правило, отзывы пользователей.

Клиенты стремятся получить лучший продукт с точки зрения цены и производительности. Цель маркетплейсов в электронной коммерции — доставлять товары пользователям наиболее объективным образом. Есть серьезные проблемы с скорингом продуктов. Одна из самых больших проблем заключается в том, как правильно подсчитывать очки, поскольку это ситуация, открытая для манипуляций.

Проблемы, связанные с этими вопросами, заключаются в следующем;

  1. Расчет баллов продукта
  2. Сортировка продуктов
  3. Сортировка комментариев пользователей на страницах сведений о продукте
  4. Дизайны страниц, процессов, зон взаимодействия (A/B-тестирование)
  5. Пробные версии функций
  6. Тестирование возможных действий и реакций

Задача специалиста по данным в этих процессах состоит в том, чтобы решить эти проблемы.

Рейтинг продуктов

В этой статье я поделюсь заметками о том, как рейтинговые продукты делаются в python. В рамках этой темы мы сделаем следующее:
- Среднее
- Средневзвешенное значение по времени
- Средневзвешенное значение по пользователям
- Взвешенный рейтинг

Прежде всего, мы импортируем эти библиотеки, какую бы библиотеку мы ни использовали.

import pandas as pd
import math
import scipy.stats as st
from sklearn.preprocessing import MinMaxScaler

Точно так же мы импортируем наш набор данных.

df = pd.read_csv("datasets/course_reviews.csv")
df.head()

Ниже вы можете увидеть вывод нашего набора данных. Переменными для нашего набора данных являются рейтинг, временная метка, зачисление, прогресс, заданные вопросы и ответы на вопросы.

Наш набор данных — это рейтинги курсов на онлайн-сайте. Сначала посмотрим на распределение рейтингов.

df["Rating"].value_counts()
5.00000 3267
4.50000 475
4.00000 383
3.50000 96
3.00000 62
1.00000 15
2.00000 12
2.50000 11
1.50000 2

Распределение заданных вопросов приведено ниже.

df["Questions Asked"].value_counts()
0.00000     3867
1.00000      276
2.00000       80
3.00000       43
4.00000       15
5.00000       13
6.00000        9
8.00000        5
9.00000        3
14.00000       2
11.00000       2
7.00000        2
10.00000       2
15.00000       2
22.00000       1
12.00000       1

В этом выводе мы показываем оценку, данную в разбивке заданных вопросов.

df.groupby("Questions Asked").agg({"Questions Asked": "count", "Rating": "mean"})
                 Questions Asked  Rating
Questions Asked                         
0.00000                     3867 4.76519
1.00000                      276 4.74094
2.00000                       80 4.80625
3.00000                       43 4.74419
4.00000                       15 4.83333
5.00000                       13 4.65385
6.00000                        9 5.00000
7.00000                        2 4.75000
8.00000                        5 4.90000
9.00000                        3 5.00000
10.00000                       2 5.00000
11.00000                       2 5.00000
12.00000                       1 5.00000
14.00000                       2 4.50000
15.00000                       2 3.00000
22.00000                       1 5.00000

Мы можем интерпретировать этот вывод следующим образом; Есть 1 человек, который задает 22 вопроса и дает 5 баллов. 2 человека задают 15 вопросов и дают 3 балла.

Как рассчитывается средний балл за этот курс? Применяя функцию «среднее» к переменной рейтинга в наборе данных, мы можем вычислить среднее значение оценщиков курса.

df["Rating"].mean()
4.764284061993986

Это можно использовать как индикатор. Нам нужно подумать о том, как мы можем более точно рассчитать этот вопрос ранжирования.

Когда функция «информация» применяется к набору данных, тип данных переменной «отметка времени» в наборе данных имеет тип объекта. Необходимо преобразовать этот тип данных в тип времени. Функция «to_datetime» применяется к переменной «timestamp».

df.info()
#   Column              Non-Null Count  Dtype         
---  ------              --------------  -----         
 0   Rating              4323 non-null   float64       
 1   Timestamp           4323 non-null   object
 2   Enrolled            4323 non-null   object        
 3   Progress            4323 non-null   float64       
 4   Questions Asked     4323 non-null   float64       
 5   Questions Answered  4323 non-null   float64
df['Timestamp'] = pd.to_datetime(df['Timestamp'])
df.info()
#   Column              Non-Null Count  Dtype         
---  ------              --------------  -----         
 0   Rating              4323 non-null   float64       
 1   Timestamp           4323 non-null   datetime64[ns]
 2   Enrolled            4323 non-null   object        
 3   Progress            4323 non-null   float64       
 4   Questions Asked     4323 non-null   float64       
 5   Questions Answered  4323 non-null   float64

Если мы хотим рассчитать средневзвешенное значение с течением времени, после этого необходимо определить дату анализа.

current_date = pd.to_datetime('2021-02-10 0:0:0')

Если вычесть дату «timestamp» из «current_date», можно узнать, сколько дней назад люди задавали вопрос или комментировали.

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

Мы попробуем применить, как распределяются веса по времени. Предполагая что-то подобное, у нас есть всего 100 единиц веса, которые мы можем распределить, и, допустим, мы делим их на 4 части. Какой вес мы хотим придать этим 4 частям, тогда мы можем увеличивать или уменьшать определенные стороны разделенных частей:

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
Out[ ]: 4.765025682267194

Теперь мы рассмотрим, к какому из комментариев, ориентированных на пользователя, стоит отнестись серьезно. Эту проблему можно рассмотреть с помощью «средневзвешенного значения на основе пользователей». Мы не знаем, есть ли у каждого оцениваемого пользователя правильное и достаточное мнение о контенте. Это вопрос, которому следует уделить внимание, следует ли серьезно относиться к комментариям людей, которые не просматривают контент и не ставят баллы. Необходимо определить средний вес в соответствии с качеством пользователя. Теперь необходимо определить метрику для этого сценария. Веса людей, которые знают более 75% контента и менее 10% контента, должны быть разными.

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
Out[ ]: 4.800257704672543

«средневзвешенное значение на основе времени» и «средневзвешенное значение на основе пользователя» могут быть усреднены. Это называется «взвешенный рейтинг». Когда мы возьмем оценки от пользователей и времени как 50 процентов и сложим их вместе, мы получим «взвешенный рейтинг».

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

Просто так я описал логику операций сортировки, надеюсь, вам понравится эта статья. Спасибо тем, кто прочитал и поделился моей статьей. Я хотел бы поблагодарить своего учителя Вахита Кескина, который помог мне изучить этот предмет. Наконец, я хотел бы поблагодарить Simge Erek, Serhat Yazıcıoğlu и Muhammed Akif Bıyıklı, которые помогли мне с наукой о данных и машинным обучением.

Спасибо Вери Билими Окулу и Миуул за то, что предоставили мне это содержимое.

Миуул Мустафа Вахит Кескин Симге Эрек Серхат Языджиоглу М. Акиф Бийыклы

Больше контента на plainenglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Получите эксклюзивный доступ к возможностям написания и советам в нашем сообществе Discord.