Pandas использует классический случай

искусственный интеллект анализ данных pandas
Pandas использует классический случай

Небольшой, но полный кейс для анализа данных Pandas

Я написал много статей о пандах, Эта статья имеет простое комплексное использование, которое в основном делится на:

  • Как моделировать данные самостоятельно
  • Различные методы обработки данных
  • Статистика данных и визуализация
  • Пользовательская RFM-модель
  • Цикл повторной покупки пользователя

построить данные

Данные, используемые в этом случае, моделируются редактором, в основном включая два данных: данные заказа и данные о фруктах, и эти два данных будут объединены.

import pandas as pd
import numpy as np
import random
from datetime import *
import time

import plotly.express as px
import plotly.graph_objects as go
import plotly as py

# 绘制子图
from plotly.subplots import make_subplots

1. Поле времени

2. Фрукты и пользователи

3. Генерация данных заказа

order = pd.DataFrame({
    "time":time_range,  # 下单时间
    "fruit":fruit_list,  # 水果名称
    "name":name_list,  # 顾客名
    # 购买量
    "kilogram":np.random.choice(list(range(50,100)), size=len(time_range),replace=True) 
})

order

4. Генерация данных о фруктах

infortmation = pd.DataFrame({
    "fruit":fruits,
    "price":[3.8, 8.9, 12.8, 6.8, 15.8, 4.9, 5.8, 7],
    "region":["华南","华北","西北","华中","西北","华南","华北","华中"]
})

infortmation

5. Объединение данных

Объедините информацию о заказе и информацию о фруктах непосредственно в полный DataFrame, этот df является данными, которые будут обрабатываться дальше.

6. Создайте новое поле: сумма заказа

Здесь вы можете узнать:

  • Как генерировать данные, зависящие от времени
  • Как генерировать случайные данные из списка (итерируемые)
  • DataFrame Pandas создается сам по себе, включая создание новых полей
  • Объединение данных Pandas

Аналитический параметр 1: время

Ежемесячная динамика продаж 2019-2021 гг.

1. Сначала извлеките год и месяц:

df["year"] = df["time"].dt.year
df["month"] = df["time"].dt.month
# 同时提取年份和月份
df["year_month"] = df["time"].dt.strftime('%Y%m')

df

2. Просмотрите тип поля:

3. Статистика и отображение по годам и месяцам:

# 分年月统计销量
df1 = df.groupby(["year_month"])["kilogram"].sum().reset_index()

fig = px.bar(df1,x="year_month",y="kilogram",color="kilogram")
fig.update_layout(xaxis_tickangle=45)   # 倾斜角度

fig.show()

Тенденция продаж 2019-2021 гг.

df2 = df.groupby(["year_month"])["amount"].sum().reset_index()

df2["amount"] = df2["amount"].apply(lambda x:round(x,2))

fig = go.Figure()
fig.add_trace(go.Scatter(  #
    x=df2["year_month"],
    y=df2["amount"],
    mode='lines+markers', # mode模式选择
    name='lines')) # 名字

fig.update_layout(xaxis_tickangle=45)   # 倾斜角度

fig.show()

Годовой объем продаж, объем продаж и средний объем продаж

Параметр анализа 2: товары

Доля годовых продаж фруктов

df4 = df.groupby(["year","fruit"]).agg({"kilogram":"sum","amount":"sum"}).reset_index()
df4["year"] = df4["year"].astype(str)
df4["amount"] = df4["amount"].apply(lambda x: round(x,2))

from plotly.subplots import make_subplots
import plotly.graph_objects as go

fig = make_subplots(
    rows=1, 
    cols=3,
    subplot_titles=["2019年","2020年","2021年"],
    specs=[[{"type": "domain"},   # 通过type来指定类型
           {"type": "domain"},
           {"type": "domain"}]]
)  

years = df4["year"].unique().tolist()

for i, year in enumerate(years):
    name = df4[df4["year"] == year].fruit
    value = df4[df4["year"] == year].kilogram
    
    fig.add_traces(go.Pie(labels=name,
                        values=value
                       ),
                 rows=1,cols=i+1
                )

fig.update_traces(
    textposition='inside',   # 'inside','outside','auto','none'
    textinfo='percent+label',
    insidetextorientation='radial',   # horizontal、radial、tangential
    hole=.3,
    hoverinfo="label+percent+name"
)

# fig.update_layout(title_text="多行多列子图制作")

fig.show()

Сравнение годового объема продаж каждого фрукта

years = df4["year"].unique().tolist()

for _, year in enumerate(years):
    
    df5 = df4[df4["year"]==year]
    fig = go.Figure(go.Treemap( 
        labels = df5["fruit"].tolist(),
        parents = df5["year"].tolist(),
        values = df5["amount"].tolist(),
        textinfo = "label+value+percent root"
    ))
    
    fig.show()

Изменения ежемесячных продаж товаров

fig = px.bar(df5,x="year_month",y="amount",color="fruit")
fig.update_layout(xaxis_tickangle=45)   # 倾斜角度
fig.show()

Изменения, показанные на линейной диаграмме:

Параметр анализа 3: Регион

продажи по регионам

Среднегодовые продажи по регионам

df7 = df.groupby(["year","region"])["amount"].mean().reset_index()

Параметр анализа 4: Пользователи

Сравнение объема и суммы заказа пользователя

df8 = df.groupby(["name"]).agg({"time":"count","amount":"sum"}).reset_index().rename(columns={"time":"order_number"})

df8.style.background_gradient(cmap="Spectral_r")

Фруктовые предпочтения пользователя

Проанализировано в соответствии с объемом заказа каждого пользователя и суммой заказа для каждого фрукта:

df9 = df.groupby(["name","fruit"]).agg({"time":"count","amount":"sum"}).reset_index().rename(columns={"time":"number"})

df10 = df9.sort_values(["name","number","amount"],ascending=[True,False,False])

df10.style.bar(subset=["number","amount"],color="#a97fcf")

px.bar(df10,
       x="fruit",
       y="amount",
#            color="number",
       facet_col="name"
      )

Иерархия пользователей — модель RFM

Модель RFM является важным инструментом и средством измерения потребительской ценности и прибыльности.

С помощью этой модели могут быть отражены три показателя поведения пользователя при доставке, общая частота транзакций и общая сумма транзакций, а статус ценности клиента может быть описан тремя показателями; в то же время клиенты делятся на 8 типов клиентов в соответствии с к этим трем показателям.

  • Недавность (R) — это количество дней с даты последней покупки покупателем до настоящего времени Этот показатель связан с моментом времени анализа, поэтому он меняется. Теоретически, чем более поздние покупки совершил клиент, тем больше вероятность того, что он купит снова.

  • Частота (F) относится к тому, сколько раз клиент совершает покупку — потребители, которые покупают чаще всего, имеют более высокую лояльность. Увеличение количества покупок, совершаемых покупателем, означает увеличение доли времени.

  • Денежная стоимость (M) — это общая сумма, которую клиент тратит на покупки.网图

Следующие три показателя решаются отдельно с помощью нескольких методов Pandas, первый - F и M: количество заказов и общая сумма каждого клиента.

Как решить индекс R?

1. Сначала решите разницу между каждым заказом и текущим временем.

2. Упорядочить в порядке возрастания в соответствии с разницей R каждого пользователя.Первая часть данных — это его недавняя запись о покупке: возьмем в качестве примера пользователя Xiaomi, последний раз был 15 декабря, а разница между текущим временем и текущим временем время Значение 25 дней

3. По пользовательской дедупликации сохранить первые данные, чтобы можно было получить R-индекс каждого пользователя:

4. Данные объединяются для получения 3 показателей:

Когда объем данных достаточно велик и пользователей достаточно, для разделения пользователей на 8 типов можно использовать только модель RFM.

Анализ повторных покупок пользователей

Цикл повторной покупки — это временной интервал между каждыми двумя покупками пользователя: в качестве примера для пользователей xiaoming первые два цикла повторной покупки составляют 4 дня и 22 дня соответственно.

Ниже приведен процесс решения цикла выкупа каждого пользователя:

1. Время покупки каждого пользователя в порядке возрастания

2. Переместить время на одну единицу:

3. Суммарная разница:

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

Непосредственно выносим числовую часть количества дней:

5. Сравнение цикла выкупа

px.bar(df16,
       x="day",
       y="name",
       orientation="h",
       color="day",
       color_continuous_scale="spectral"   # purples
      )

Чем уже прямоугольник на рисунке выше, тем меньше интервал, весь цикл выкупа каждого пользователя определяется длиной всего прямоугольника. Просмотрите сумму общего цикла выкупа и среднего цикла выкупа для каждого пользователя:

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

По скрипке внизу также видно, что у Михка и Майка самое концентрированное распределение циклов выкупа.