Небольшой, но полный кейс для анализа данных 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
)
Чем уже прямоугольник на рисунке выше, тем меньше интервал, весь цикл выкупа каждого пользователя определяется длиной всего прямоугольника. Просмотрите сумму общего цикла выкупа и среднего цикла выкупа для каждого пользователя:
Делается вывод: общий цикл выкупа у пользователей Мишка и Майка относительно длительный, и в долгосрочной перспективе они являются лояльными пользователями, а с точки зрения среднего цикла выкупа – относительно низкий, что свидетельствует об активности выкупа в короткий период времени.
По скрипке внизу также видно, что у Михка и Майка самое концентрированное распределение циклов выкупа.