Pandas — построение пользовательского RFM

#python #pandas #plot #plotly #seaborn

#python #pandas #построение #plotly #сиборн

Вопрос:

Учитывая следующий DF активности пользовательского RFM:

    uid   R  F   M
0    1  10  1   5
1    1   2  2  10
2    1   4  3   1
3    1   5  4  10
4    2  10  1   3
5    2   1  2  10
6    2   1  3   4
 

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

Частота: время между покупками, представленное расстоянием между кругами на одной строке.

Денежный: сумма денег, потраченная на каждую покупку, представленная размером круга. Эта сумма может быть средней стоимостью заказа или количеством продуктов, которые заказал клиент.

Я хотел бы построить что-то вроде рисунка ниже: введите описание изображения здесь

Где размер круга — это M значение, а расстояние — R . Любая помощь будет оценена.

Обновление, как предложил Дизиет Асахи, я попробовал следующее:

 import matplotlib.pyplot as plt

def plot_users(df):
  fig, ax = plt.subplots()
  ax.axis('off')
  ax.scatter(x=df['M'],y=df['uid'],s=30*df['R'], marker='o', color='grey')
  ax.invert_xaxis()
  ax.axvline(0, ls='--', color='black', zorder=-1)
  for y in df['uid'].unique():
      ax.axhline(y, color='grey', zorder=-1)

tmp = pd.DataFrame({'uid':[1,1,1,1,2,2,2],'R':[10,2,4,5,10,1,1],'F':[1,2,3,4,1,3,4],'M':[5,10,1,10,3,10,4]})
plot_users(tmp)
 

И я получаю следующее:
введите описание изображения здесь

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

Ответ №1:

вы можете использовать matplotlib scatter() с s= аргументом для рисования маркеров с площадью, пропорциональной значению in M . Остальное — это просто настройка внешнего вида графика.

 c = 'xkcd:dark grey'
fig, ax = plt.subplots()
ax.axis('off')
ax.scatter(x=df['R'],y=df['uid'],s=60*df['M'], marker='o', color=c)
ax.invert_xaxis()
ax.axvline(0, ls='--', color=c, zorder=-1)
for y in df['uid'].unique():
    ax.axhline(y, color=c, zorder=-1)
ax.set_ymargin(1)
 

введите описание изображения здесь

Комментарии:

1. Спасибо за вашу помощь, пожалуйста, посмотрите мои комментарии

2. Извините, я перепутал между R и M . Теперь все должно быть в порядке. Обратите внимание, что uid = 2 имеет только 2 точки, потому что две строки имеют одинаковое значение ‘R’. Я не знаю, что вы хотите с ними делать.

3. Еще раз спасибо, обратите внимание, что значение R — это недавность последнего события, поэтому может иметь место то же значение. кроме этого, прекрасное решение.

4. В ваших объяснениях говорится, что R — это время между покупкой и сегодняшним днем, а не между покупками. Вы хотите сказать, что uid 1 должен иметь точки в координатах 10,12,16 и 21?

5. если у вас есть sequential uid , то они уже должны быть равномерно распределены, и вам просто нужно увеличить вертикальный размер фигуры (см. figsize ). Если ваши uid данные не являются последовательными, вам следует создать новый столбец с порядковыми номерами для использования в качестве значений y