ディレクトリ
08データ分析/データ解析統合プロジェクト - ユーザーの消費行動の分析
パートI:データ型の処理
積載
- フィールド意味:
- USER_ID:ユーザーID
- order_dt:購入日
- order_product:製品の数量
- ORDER_AMOUNT:購入価格
- フィールド意味:
観測データ
データのデータタイプをチェック
データが欠損値に格納されます
時の型に変換order_dt
データの統計的記述を見ます
- すべてのユーザーのための購入の平均数を計算します
- 商品のすべての購入者の平均コストを計算
月内のソースデータの追加:astype( 'datetime64 [M]')
コードの実装:
import pandas as pd import matplotlib.pyplot as plt
データのロード
df = pd.read_csv('./data/CDNOW_master.txt',header=None,sep='\s+',names=['user_id','order_dt','order_product','order_amount']) # \s+表示任意多个空串值 # names指定原数据的列索引
データのデータタイプをチェック
df.info() # 1.原数据中没有空值 # 2.order_dt不是时间类型 """ <class 'pandas.core.frame.DataFrame'> RangeIndex: 69659 entries, 0 to 69658 Data columns (total 4 columns): user_id 69659 non-null int64 order_dt 69659 non-null int64 order_product 69659 non-null int64 order_amount 69659 non-null float64 dtypes: float64(1), int64(3) memory usage: 2.1 MB """
時系列タイプがorder_dtターン
df['order_dt'] = pd.to_datetime(df['order_dt'],format='%Y%m%d') df.info()
元のデータを記述するビュー統計
df.describe()
月内のデータ・ソースを追加します
df['month'] = df['order_dt'].values.astype('datetime64[M]') df.head() # datetime64[M]表示的月份类型
パートII:月次データの分析
- 毎月のユーザー費やされた合計金額
- ショーは、グラフ化
- すべてのユーザーが毎月の製品購入
- すべてのユーザーの毎月の消費の合計数
毎月の消費統計の数
コードの実装:
毎月のユーザー費やされた合計金額
df.groupby(by='month')['order_amount'].sum() # 绘制线形图 df.groupby(by='month')['order_amount'].sum().plot() # 可以直接.plot生成线性图
すべてのユーザーが毎月の製品購入
df.groupby(by='month')['order_product'].sum() # 绘制线性图 df.groupby(by='month')['order_product'].sum().plot()
総数のすべてのユーザーが毎月の消費(ユーザーの消費が再び元のデータで表現表示されます)
df.groupby(by='month')['user_id'].count()
毎月の消費統計の数
# 方式一:通过nunique df.groupby(by='month')['user_id'].nunique() # nunique()统计去重之后的数量 # 方式2:分组的高级聚合 df.groupby(by='month')['user_id'].apply(lambda x:len(x.drop_duplicates()))
パートIII:個々のユーザーの消費データ解析
- ユーザーの消費量の統計は、合計金額と消費者の合計数を記述する
- 散布ユーザーの消費量と消費の頻度
- 各ユーザプロファイルヒストグラムの消費の総量の(消費量1000の分布)
各ユーザの消費ヒストグラム分布(第2の場所100における消費財の数分布)の総数
コードの実装:
合計購入・消費統計の合計額は、ユーザーの数を記述する
user_datas = df.groupby(by='user_id').sum() df.groupby(by='user_id').sum().describe()
散布ユーザーの消費量と消費の頻度
plt.scatter(user_datas['order_product'],user_datas['order_amount']) plt.xlabel('order_product') plt.ylabel('order_amount')
各ユーザプロファイルヒストグラムの消費の総量の(消費量1000の分布)
# 筛选各个用户消费总金额 df.groupby(by='user_id')['order_amount'].sum() # 筛选各个用户消费总金额在1000之内的 user_amount = df.groupby(by='user_id').sum().query('order_amount < 1000')['order_amount'] # 绘制直方分布图 plt.hist(user_amount,bins=20)
各ユーザの総消費量の数は、ヒストグラム分布(第2の場所100における消費財の数の分布)を購入します
user_product = df.groupby(by='user_id').sum().query('order_product < 100')['order_product'] plt.hist(user_product,bins=20)
パートIV:ユーザー、消費者の行動分析
- 数のユーザーの毎月分配・消費統計初めて
- 折れ線グラフを描きます
- 前回の時間と統計的分布の数のユーザーの消費量
- 折れ線グラフを描きます
- 古いものと新しい顧客の割合
- 新規ユーザーのための消費者
- 古いユーザーのための消費量は何倍
- 前回の各ユーザの消費と消費者の最初の分析
- AGG([ '関数func1'、 'func2の']):グループ化された結果、指定重合
- 古いものと新しい顧客の消費率の分析
- 前回の各ユーザの消費と消費者の最初の分析
- ユーザー層別
- 分析は、各ユーザの合計購入金額と消費の総量とテーブルRFMの消費最後の時間に到着します
- RFMモデルの設計
- Rは、クライアントに最終取引間隔を表します。
- /np.timedelta64(1,'D「):取り外し日
- Fが商品を購入する顧客の総数を表し、F値が大きいほど、より頻繁に顧客取引、及び逆もまた同様、顧客のトランザクションがアクティブでないと述べました。
- Mは、顧客取引の量を表しています。Mの値が大きいほど、より高い顧客価値、および下部顧客価値その逆。
- R、F、M演技RFMテーブル
- Rは、クライアントに最終取引間隔を表します。
- 値に応じて階層化、ユーザがに分かれています。
- 重要な価値を顧客に
- 顧客を維持することが重要
- 顧客を維持することが重要
- 重要顧客開拓
- 一般的な値のお客様
- 一般的な顧客維持
- 一般的な顧客維持
- 一般的な顧客開拓
- 既存の階層モデルを使用することができrfm_func
分析
- 最初の購入時期:最小時間、ユーザーの消費量を取得するためには、この値は、時間のユーザーの消費量は初めてです
- 最後の時間を過ごす:ユーザーの消費量を得るための最大時間は、この値は、前回の時間のユーザーの消費量であります
コードの実装:
数のユーザーの毎月分配・消費統計初めて
df.groupby(by='user_id')['month'].min() # 用户第一次消费的月份分布 df.groupby(by='user_id')['month'].min().value_counts() # 统计每个月第一次消费用的人数 # 将首购对应的月份分布绘图 df.groupby(by='user_id')['month'].min().value_counts().plot()
前回の時間と統計的分布の数のユーザーの消費量
df.groupby(by='user_id')['month'].max() df.groupby(by='user_id')['month'].max().value_counts() # 绘图 df.groupby(by='user_id')['month'].max().value_counts().plot()
古いものと新しいユーザーの割合を算出しました
# 求出新老用户的占比 # 新用户:一次消费的用户 # 老用户:多次消费的用户 # 核心思路:将每一个用户的首购时间和最后一次消费时间求出,判断这两个时间是否一致 # 一致:新用户 # 不一致:老用户 # agg分组后进行多种不同形式的聚合操作 user_left = df.groupby(by='user_id')['order_dt'].agg(['min','max']) user_left['min'] == user_left['max'] # true:新用户,False:老用户 user = (user_left['min'] == user_left['max']).value_counts() # 求出true和false的个数 old = user[0] new = user[1] new/old
分析は、各ユーザの合計購入金額と消費の総量とテーブルRFMの消費最後の時間に到着します
rfm = df.pivot_table(index='user_id',aggfunc={'order_product':'sum','order_amount':'sum','order_dt':'max'}) rfm.head()
RFMモデルの設計
import numpy as np # R表示客户最近一次交易时间的间隔 rfm['R'] = -(rfm['order_dt'] - rfm['order_dt'].max())/np.timedelta64(1,'D') rfm.head() # /np.timedelta64(1,'D')为了去除days # 修改order_amount、order_product的列索引 rfm.rename(columns={'order_amount':"M",'order_product':'F'},inplace=True)
階層的な値によると、
def rfm_func(x): # 存储的是三个字符串形式的0或者1 level = x.map(lambda x :'1' if x >= 0 else '0') label = level.R + level.F + level.M d = { '111':'重要价值客户', '011':'重要保持客户', '101':'重要挽留客户', '001':'重要发展客户', '110':'一般价值客户', '010':'一般保持客户', '100':'一般挽留客户', '000':'一般发展客户' } result = d[label] return result # df.apply(func):可以对df中的行或者列进行某种(func)形式的运算 rfm['label'] = rfm[['R','F','M']].apply(lambda x : x - x.mean()).apply(rfm_func,axis = 1) rfm.head()
統計のさまざまなレベルでのユーザー数
rfm.groupby(by='label').count()
パートV:ユーザーのライフサイクル
- アクティブユーザーと他のユーザーへのユーザー
- 月額ユーザーあたりの消費量の数を数えます
- 月額利用者ごとの統計、消費者、消費は1または0のレコードとして記録されている場合
- 知識ポイント:適用し、データフレームのapplymapの違い
- applymap:DFを返します
- この関数は(要素)のデータフレームのための要素のすべてを行います
- 適用:シリーズへの復帰を
- ()関数はデータフレームの行または列のそれぞれに適用します
- 知識ポイント:適用し、データフレームのapplymapの違い
- ユーザーによると、各月がに分かれています。
- UNREG:ユーザーを見ている(ユーザーがユーザーを見ている、その後二ヶ月前に、買うために初めて最初の2ヶ月間、最初の3ヶ月を購入していませんでした)
- 非有効:ユーザーの非アクティブなユーザーを購入しないようにするためにそれを購入しないように毎月毎月の後の最初の月の購入
- 新しい:現在の月は、新規ユーザーのために、現在の月の最初の消費者の購入になります
- アクティブ:アクティブなユーザーの購入のため、これらの数ヶ月のユーザーヶ月連続
- 購入間隔の後の最初の月のn月リピートの月のために再度購入戻ります
コードの実装:
月額ユーザーあたりの消費量の数を数えます
user_order_count_df = df.pivot_table(index='user_id',values='order_dt',aggfunc='count',columns='month').fillna(0)
月額利用者ごとの統計、消費者、消費は1または0のレコードとして記録されている場合
# 将上个需求返回的df中每一个元素(用户的消费次数)进行运算(如果元素值>=1说明消费记为1,否则记为0) df_purchase = user_order_count_df.applymap(lambda x:1 if x >= 1 else 0) df_purchase # 存储的就是用户每个月的是否消费的情况展示
1と0が新しい、非有効......、新しいDFがdf_purchase_new呼ばれる戻り変更元のデータdf_purchase
# 固定算法 def active_status(data): status = [] # 某个用户每一个月的活跃度 for i in range(18): # 若本月没有消费 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: status.append('new') else: if status[i-1] == 'unactive': status.append('return') elif status[i-1] == 'unreg': status.append('new') else: status.append('active') return status pivoted_status = df_purchase.apply(active_status,axis = 1) pivoted_status.head()
[さまざま]毎月のアクティブユーザー数
pivoted_status.apply(lambda x:pd.value_counts(x),axis=0).fillna(0)
最終結果は見るトランスポーズ
pivoted_status.apply(lambda x:pd.value_counts(x),axis=0).fillna(0).T