こんにちは、みんな!レッサーパンダです❤
実際、これは長期的なアウトソーシングです
アイデアを共有させてください
答えられないpython関連のエラー回答がある場合、またはソースコード/モジュールのインストール/
婦人服の上司が熟練している場合は、ここに来ることができます: ( https://jq.qq.com/?_wv= 1027&k=2Q3YTfym )
1. プロジェクトの背景
小売店の電子販売時点管理で個々の製品のバーコードを「スキャン」することによって得られる、消費者向け製品の販売に関する詳細なデータ。このデータは、販売されたアイテムの数量、特性、価値、および価格に関する詳細な情報を提供します。
2. データソース
<リンク>
3. 質問する
- 消費分析とユーザー購買パターン分析
- RFM および CLV 分析
- 商品の異なるカテゴリーの関連規則のマイニング
4. データを理解する
- 日付: 購入日
- Customer_ID: ユーザー ID
- Transaction_ID: トランザクション ID
- SKU_Category: 商品カテゴリの SKU コード
- SKU: 商品固有の SKU コード
- 数量: 購入数量
- Sales_Amount: 購入金額
5. データクリーニング
1. データのインポート
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
import seaborn as sns
%matplotlib inline
# 更改设计风格
plt.style.use('ggplot')
plt.rcParams['font.sans-serif'] = ['SimHei']
np.__version__
pd.__version__
df = pd.read_csv('scanner_data.csv')
df.head()
df.info()
2. サブセットを選択する
第一列为数据编号,已有索引故删除
df.drop(columns='Unnamed: 0', inplace=True)
df.info()
### 3.删除重复值
```go
df.duplicated().sum()
データに重複値がない
### 4.缺失值处理
df.isnull().sum()
欠損値のないデータ
### 5.标准化处理
df.dtypes
Date为对象类型,需要标准化为日期类型格式
df.Date = pd.to_datetime(df.Date, format='%d/%m/%Y')
df.dtypes
6.外れ値の処理
df[['Quantity','Sales_Amount']].describe()
計量単位が 1 未満のため、購入数量が 1 未満であり、異常値ではありません
6. 分析内容
1. 毎月の消費分析
(1)月間総消費量のトレンド分析
df['Month'] = df.Date.astype('datetime64[M]')
df.head()
grouped_month = df.groupby('Month')
grouped_month.Sales_Amount.sum()
2018年1月数据可能统计不全,不纳入趋势分析
grouped_month.Sales_Amount.sum().head(12).plot()
- 上図からわかるように、消費量の変動が大きく、そのうち第1四半期は上昇を続け、その後も変動が大きく、全体的に増加傾向を示している
(2) 月間取引回数の傾向分析
grouped_month.Transaction_ID.nunique().head(12).plot()
上の図からわかるように、取引数は大きく変動し、前期は上昇傾向でしたが、5月以降は取引数が減少し始め、8月に最低値まで落ち込み、その後変動に転じ、反発し、12月にピークに戻る。
(3)月間商品購入数量のトレンド分析
grouped_month.Quantity.sum().head(12).plot()
- 上の図からわかるように、商品の購入数は大きく変動しており、全体的な傾向は取引数と一致しています。
(4) 月間消費数のトレンド分析
grouped_month.Customer_ID.nunique().head(12).plot()
上図からわかるように、月間購入者数は単純に3段階に分けられ、1月から5月までは上昇傾向が続き、6月から8月にかけては下降傾向が続き、9月から8月にかけては下降傾向が続いています。 12月は変動的な上昇傾向を示しています。
2. ユーザー分布分析
(1) 新規ユーザーの分布
grouped_customer = df.groupby('Customer_ID')
grouped_customer.Date.min().value_counts().plot()
- 上図からもわかるように、新規ユーザーの獲得は不安定で変動が大きく、全体的にやや減少傾向にある
grouped_customer.Month.min().value_counts().plot()
- 上記の図からわかるように、月間新規ユーザー数は大幅な減少傾向にあります。新規ユーザーの獲得が大幅な減少傾向にあることを示しており、新規ユーザーの獲得を改善するためのマーケティング活動を適切に増やすことに注意が必要です
(2) 1回消費と複数回消費の利用者割合の分析
#仅消费一次用户占比
(grouped_customer.Transaction_ID.nunique() == 1).sum()/df.Customer_ID.nunique()
- 計算方法: ユーザーの半数が 1 回だけ消費したことがある
grouped_month_customer = df.groupby(['Month', 'Customer_ID'])
#每个用户每月的第一次购买时间
data_month_min_date = grouped_month_customer.Date.min().reset_index()
#每个用户的第一次购买时间
data_min_date = grouped_customer.Date.min().reset_index()
#通过Customer_ID联立两表
merged_date = pd.merge(data_month_min_date, data_min_date, on='Customer_ID')
merged_date.head()
#Date_x等于Date_y则为每月新用户
((merged_date.query('Date_x == Date_y')).groupby('Month').Customer_ID.count() / merged_date.groupby('Month').Customer_ID.count()).plot()
上図からわかるように、月間新規利用者の割合は全体として減少傾向にあり、月間利用者数の推移と合わせると、第4四半期の利用者数は増加傾向にあることがわかり、そのため、期間中に再購入の数が増加しました。
3. ユーザー層別分析
(1) RFM階層分析
pivot_rfm = df.pivot_table(index='Customer_ID',
values=['Date', 'Transaction_ID', 'Sales_Amount'],
aggfunc={
'Date':'max', 'Transaction_ID':'nunique', 'Sales_Amount':'sum'})
pivot_rfm['R'] = (pivot_rfm.Date.max() - pivot_rfm.Date)/np.timedelta64(1, 'D')
pivot_rfm.rename(columns={
'Transaction_ID':'F', 'Sales_Amount':'M'}, inplace=True)
def label_func(data):
label = data.apply(lambda x:'1' if x > 0 else '0')
label = label.R + label.F + label.M
labels = {
'111':'重要价值客户',
'011':'重要保持客户',
'101':'重要发展客户',
'001':'重要挽留客户',
'110':'一般价值客户',
'010':'一般保持客户',
'100':'一般发展客户',
'000':'一般挽留客户'
}
return labels[label]
pivot_rfm['label'] = pivot_rfm[['R','F','M']].apply(lambda x:x-x.mean()).apply(label_func, axis=1)
pivot_rfm.label.value_counts().plot.barh()
pivot_rfm.groupby('label').M.sum().plot.pie(figsize=(6,6), autopct='%3.2f%%')
pivot_rfm.groupby('label').agg(['sum', 'count'])
上記の表と図から、次のことがわかります。
- 売上の主な源泉は維持顧客であり、一般開発顧客の割合が最も高い
- 顧客を維持することが重要です:主な販売源であり、最近消費があり、消費が多く、消費頻度が不十分であり、適切なマーケティング活動を実施して、この層の顧客の購入頻度を高めることができます
- 重要な価値のある顧客: 2 番目の販売源であり、最近の消費、大量消費、および高頻度で、この層の顧客を可能な限り最新の状態に保ちます。
- 重要な開発顧客: 消費と消費頻度が高く、最近消費がない場合、適切な戦略を使用してユーザーを呼び戻し、消費に参加できます
- 顧客を維持することが重要: 消費量は多いが、頻度が低く、最近はまったく消費されていない、損失の危機に瀕している場合は、損失を防ぐための適切な活動を通じて消費に参加できます
- 一般的な価値のある顧客:低消費、高消費頻度、および最近の消費。クーポンやその他の形式の活動を使用して、この層の顧客の消費を刺激し、消費を増やすことができます
- 一般開発顧客:顧客数が最も多く、最近消費はあるが、消費量と消費頻度は高くない 人数の割合が高いことを考慮して、適切な活動を行うことで消費頻度と消費頻度を増やすことができる消費量
- 一般的な顧客維持: 必要に応じて、コストとリソースの管理下で
- 一般的な顧客維持: コストとリソースの管理下で適切と見なされる
(2) 利用状況の階層分析
pivoted_status = df.pivot_table(index='Customer_ID', columns='Month', values='Date', aggfunc='count').fillna(0)
def active_status(data):
status = []
for i in range(len(data)):
#若本月没有消费
if data[i] == 0:
if len(status) > 0:
if status[i-1] == 'unreg':
status.append('unreg')
else:
status.append('unactive')
else:
status.append('unreg')
#若本月有消费
else:
if len(status) > 0:
if status[i-1] == 'unreg':
status.append('new')
elif status[i-1] == 'unactive':
status.append('return')
else:
status.append('active')
else:
status.append('new')
status = pd.Series(status, index = data.index)
return status
active_status = pivoted_status.apply(active_status, axis=1)
active_status.replace('unreg', np.nan).apply(lambda x:x.value_counts()).fillna(0).T.apply(lambda x: x/x.sum(),axis=1).plot.area()
上の図からわかるように:
- 新規ユーザー:新規ユーザー比率は大幅な低下傾向を示しており、新規ユーザー獲得の運用が不十分であることがうかがえる。
- アクティブユーザー:2月に最高値を記録し、その後緩やかな下降傾向にあり、消費オペレーションが低下傾向にあることを示しています
- 非アクティブなユーザー: 非アクティブなユーザーは明確な上昇傾向を示しており、顧客離れはより明白です
- リピーター:緩やかな上昇傾向にあり、リコールの稼働状況は良好
4. ユーザーのライフサイクル分析
(1) ユーザーのライフサイクル分布
#构成用户生命周期研究的数据样本需要消费次数>=2次的用户
clv = (grouped_customer[['Sales_Amount']].sum())[grouped_customer.Transaction_ID.nunique() > 1]
clv['lifetime'] = (grouped_customer.Date.max() - grouped_customer.Date.min())/np.timedelta64(1,'D')
clv.describe()
- 由上表可知:消费一次以上的用户平均生命周期为116天,用户生命周期内平均消费金额为121.47元
clv['lifetime'].plot.hist(bins = 50)
上の図からわかるように:
- ライフサイクルが0日~90日のユーザーが多く、ライフサイクルが短い顧客の割合が高く、90日以内の解約率が高いことから、これらのユーザーを運用の中心として活用し、これらのユーザーのライフサイクル。
- 90 歳から 250 歳までのライフ サイクルの分布は比較的均一であり、これはほとんどのユーザーのライフ サイクルでもあります。これらのユーザーの消費を刺激し、ライフ サイクル中の消費量を増やすことができます。
- ライフ サイクルが 250 日を超える人の数は非常に少なく、ライフ サイクルの長い忠実な顧客の割合が高くないことを示しています。
(2) ユーザーのライフサイクル価値の分布
clv['Sales_Amount'].plot.hist(bins = 50)
上の図からわかるように:
- ライフサイクルのほとんどのユーザーの値は 500 以内で、ほとんどが 100 以内です。平均値を引き上げる極端な値が大きく、データが右に偏っています。
(3) ユーザーのライフサイクルとその価値関係
plt.scatter(x='lifetime', y='Sales_Amount', data=clv)
上の図からわかるように:
- ユーザーのライフサイクルと期間中の顧客価値の間には直線的な関係はなく、ライフサイクルが300日以内の場合、ライフサイクルが長い一部のユーザーが貢献する価値は、ライフサイクルが短いユーザーよりも高くなります。
- ライフサイクルが 300 日を超えると、一部のユーザーは貢献度が低くなります. データ量の不足などの理由により、結果は参考値です.
5. 再購入率および再購入率の分析
(1) 再購入率の分析
grouped_month_customer
customer_month_again = grouped_month_customer.nunique()
customer_month_again
#每月消费次数大于1的用户数
customer_month_again = grouped_month_customer.nunique().query('Transaction_ID > 1').reset_index().groupby('Month').count().Customer_ID
# customer_month_again
#每月消费用户数
customer_month = grouped_month.Customer_ID.nunique()
# #每月复购率
(customer_month_again/customer_month).plot()
customer_month
(customer_month_again/customer_month)
- 上の図からわかるように、再購入率は 25% 前後で変動しており、25% のユーザーが毎月複数回購入することを示しており、最初の 3 か月の再購入率は減少し、その後回復しており、全体的な傾向は再購入率をさらに高めるか、新規ユーザーの獲得に注力するかは、独自のビジネスモデルと組み合わせて判断する必要があります。先月のデータが不足しているため、結果は主に実際のデータに基づいています。
(2) 再購入率の分析
# 1表示前90天消费且本月回购 0表示前90天消费本月未回购 nan表示前90天未消费
def buy_back(data):
status = [np.nan,np.nan,np.nan]
for i in range(3,len(data)):
#本月购买
if data[i] == 1:
#前90天购买
if (data[i-1] == 1 or data[i-2] ==1 or data[i-3] == 1):
status.append(1)
#前90天未购买
else:
status.append(np.nan)
#本月未购买
else:
#前90天购买
if (data[i-1] == 1 or data[i-2] ==1 or data[i-3] == 1):
status.append(0)
#前90天未购买
else:
status.append(np.nan)
status = pd.Series(status, index = data.index)
return status
back_status = pivoted_status.apply(buy_back, axis=1)
back_status.head()
(back_status.sum()/back_status.count()).plot()
上の図からもわかるように、90日以内の再購入率、つまり90日以内のリピート購入率は10%を下回っており、現在ユーザー獲得モードに入っていることが分かりますが、前回の分析から、新規ユーザーの獲得が減少傾向にあることがわかります 現店舗は健全ではなく、現段階では新規ユーザーの獲得に注力すべきですが、
6. 商品協会ルールマイニング
(1) 売れ筋商品の分析
#取出销量排名前10的商品类型
hot_category = df.groupby('SKU_Category').count().Sales_Amount.sort_values(ascending=False)[:10].reset_index()
plt.barh(hot_category.SKU_Category, hot_category.Sales_Amount)
#热销商品占比
hot_category['percent'] = hot_category.Sales_Amount.apply(lambda x:x/hot_category.Sales_Amount.sum())
plt.figure(figsize=(6,6))
plt.pie(hot_category.percent,labels=hot_category.SKU_Category,autopct='%1.2f%%')
plt.show()
category_list = df.groupby('Transaction_ID').SKU_Category.apply(list).values.tolist()
from apyori import apriori
min_support_value = 0.02
min_confidence_value = 0.3
result = list(apriori(transactions=category_list, min_support=min_support_value, min_confidence=min_confidence_value, min_left=0))
result
上記の結果から、次のことがわかります。
- 'FU5'–>'LPF': サポートは約 2.1%、信頼度は約 49.5% です。この 2 種類の商品を同時に購入する確率は約 2.1% であり、最初に FU5 タイプの商品を購入した後に、LPF タイプの商品を同時に購入する確率は 49.5% です。
- 'IEV'–>'LPF': サポートは約 3.1%、信頼度は約 48.9% です。この2種類の商品を同時に購入する確率は約3.1%、IEVタイプの商品を購入した後にLPFタイプの商品を同時に購入する確率は約48.9%であることがわかります。
- 'LPF'–>'IEV': サポートは約 3.1%、信頼度は約 43.3% です。この 2 種類の商品を同時に購入する確率は約 3.1% であり、LPF 型の商品を先に購入した後、IEV 型の商品を同時に購入する確率は約 43.3% です。
- 'OXH'–>'LPF': サポートは約 2.0%、信頼度は約 48.1% です。この 2 種類の商品を同時に購入する確率は約 2.0% であり、IEV 型の商品を購入した後に LPF 型の商品を同時に購入する確率は約 48.1% であることがわかります。
最後に入力を終えました、なんてこった
以上、本日の記事でした、参考になれば幸いです~