クラスタリングに基づくパーソナライズされたレコメンデーションのeコマースケースの分析と要約

記事を書く前に、まず、2人の先生に感謝します。彼らの指導の下で、プロジェクトは成功裏に完了することができます。
データの感度が低下してい
ますデータの信頼性については、論争しないでください:完全なコードリンク

1.目的

ユーザーの注文トランザクション動作と製品属性特性分析に基づいてさまざまな顧客グループを分割し、購入していない製品をユーザーに個人的に推奨する

第二に、分析のアイデア

1.商品のカテゴリ属性から始めて、クラスタリングモデルを通じて同じ好みの顧客グループを探索します。
2.次に、商品の単価を消費行動の定量的指標として使用し、同じ顧客グループに属するお気に入りの製品を見つけて、購入していない他のユーザーに推奨します

3.ユーザーデータに基づくクラスタリング

1.データを読み取る

df_order = pd.read_csv("orders.csv")                          #读取订单数据
df_item = pd.read_csv("Items_orders.csv")                     #读取商品交易数据
df_atrr = pd.read_csv("Items_attribute.csv",encoding='gbk')   #读取商品属性数据

2.データを探索する

2.1、最初に3つのテーブル間の相関関係を観察する

1.注文フォームおよび注文詳細テーブルで注文番号データを表示し、注文フォームが注文詳細テーブルの要約結果であることを分析し、2つのテーブルをマージしてユーザーの注文行動データを調査できます。

df_order.shape,np.unique(df_order.订单编号).shape  #可以看出没有重复数据
df_item.shape,np.unique(df_item.订单编号).shape  
#订单编号去重后与df_order的行数一致
#结合数据,我们可以肯定df_item是订单明细表,df_order是订单表,两个表需要合并成一张表

1.商品情報テーブルの赤ちゃんIDとタイトルデータを確認しますユーザーの商品行動関係データを調べるには、商品情報テーブルと注文詳細テーブルをマージする必要があります。

df_atrr.shape,np.unique(df_atrr.宝贝ID).shape   #可以看出没有重复数据
#和df_item表对照看,这张表是商品信息表。
#需要和df_item表合并,把商品属性信息补充到df_item表中
#应该用宝贝ID作为连接字段,因df_item表中无宝贝ID字段;只有标题是共同字段;所以我们考虑用标题作为连接字段

np.unique(df_atrr.标题).shape,np.unique(df_item.标题).shape 
#发现df_item表中有部分标题在df_atrr中没有

2.2。インポートされた列名に前処理が必要かどうかを確認する

この手順の目的は、データの取得を容易にするために列名のスペースを削除することです。

for df in [df_order,df_atrr,df_item]:
    df.columns=df.columns.map(lambda x:x.strip())
#把所有表列名中的空格去除

2.3。ビジネス評価に基づいてフィールドを選択する

具体的にどのように探索するのですか?詳しくは説明しませんが、詳細コードリンクには既に詳細な操作手順があります。このステップは最も面倒で重要です。トウモロコシの皮をむくようにレイヤーごとに分析し、最終的にユーザーの注文行動データ、ユーザーのトランザクション行動データ、ユーザーの商品カテゴリ行動データを取得します。次の手順を実行します。

2.3.1。ユーザー注文データに基づいて、ユーザー注文行動データをマイニングします。

1.平均()メソッドを使用して欠損値の割合をカウントし、欠損値が80%を超えるフィーチャを削除します

#把其余缺失值多余80%的数据删除
isna_columns=df_order_d1.isnull().mean()>0.8
df_order_d1.drop(columns=isna_columns[isna_columns].index.tolist(),axis=1,inplace=True)

2. describe()メソッドを使用して異常値があるかどうかを確認し、seabornツールを使用して、「購入者の実際の支払い金額」、「赤ちゃんの種類」、「赤ちゃんの総数」のヒストグラム(観測分布曲線)とボックスラインを描画しますグラフ分析の異常値処理スキーム。結局、「購入者が実際に支払う金額」と「宝物の総数」という2つの特性の外れ値のみを処理することを選択し、合計10レコードのみが削除されました。「赤ちゃんタイプ」機能の外れ値を削除してみませんか?データとグラフィックスのため、データ分布は比較的均一であり、外れ値が意味のあるものである場合、それらを削除することはできません。
ここでは「赤ちゃん種」の特徴のグラフィックのみが表示されます。

f,(ax1,ax2)=plt.subplots(1,2,figsize=(12,6))
sns.distplot(df_order_d2.宝贝种类,ax=ax1)
sns.boxplot(y='宝贝种类',data=df_order_d2,ax=ax2)
plt.show()

ここに画像の説明を挿入

2.3.2。ユーザートランザクションデータに基づくユーザートランザクション動作データのマイニング

このプロセスデータの探索は比較的単純で、注文リストの特徴は少なく、有用な情報は価格のみです。欠損値がないことを確認した後、前のプロセスでpd.mergeおよびdf_order_d3テーブルを使用して、ユーザートランザクション動作データをマージおよび要約します。

2.3.3。ユーザーが購入した商品の属性に基づいて、ユーザーの商品カテゴリ行動データをマイニングする

各機能の調査を通じて、最終的に該当する年齢機能のみを使用できることがわかり、この機能を使用して、新しいタグ機能を製品のカテゴリとして分類および生成できます。

#定义一个商品适用年龄的标签结构
#2岁以下不包含2岁,定义为婴儿,包含月
#2岁-4岁定义为幼儿
#5岁-7岁-定义儿童
#8岁以上定义为学生
def addTag(x):
    tag=''
    if '月' in x:
        tag+='婴儿'
    x=x.split(',')
    if '2岁' in x or '3岁' in x or '4岁' in x:
        tag+='幼儿|'
    if '5岁' in x or '6岁' in x or '7岁' in x:
        tag+='儿童|'
    if '8岁' in x or '9岁' in x or '10岁' in x or  '11岁' in x or '12岁' in x or '13岁'in x or '14岁' in x:
        tag+='学生|'
    if 'missing' in x:
        tag+='missing'
    return tag
    df_atrr['tag']=df_atrr.适用年龄.apply(addTag)
#通过适用年龄对于各玩具商品划分类别
df_atrr.head()

2.3.4。データの標準化

このステップの目的は、「購入者が実際に支払う金額」、「赤ちゃんの種類」、「赤ちゃんの総数」、「価格」などの特性によって引き起こされる寸法の影響を排除することです。

from sklearn.preprocessing import MinMaxScaler  #导入标准处理包
#获取分析数据
data_pre=user_info5.iloc[:,1:].values
mms=MinMaxScaler()
data_norm=mms.fit_transform(data_pre)   #标准化处理消除量纲影响
pd.DataFrame(data_norm).head()

3.モデリング

1.まず、等高線係数曲線を描いて、最適なK値を決定します。グラフィックの観点から見ると、K = 2モデルは最適に機能します。ビジネスの観点からは、k = 2カテゴリは十分に分割されていません。2を除外してから他のデータを観察します。最高点は8で、スコアも良好で、ビジネスニーズに適合しています。したがって、選択する最適なK値は8です。

from sklearn.metrics import silhouette_score  #导入轮廓系数计算包

#通过轮廓系数寻找最优的k
score=[]
for k in range(2,16):
    km=KMeans(n_clusters=k)
    res_km=km.fit(data_norm)
    score.append(silhouette_score(data_norm,res_km.labels_))

plt.plot(range(2,16),score,marker='o')

ここに画像の説明を挿入2.クラスタリングモデルを確立し、モデルフィッティングの結果をテーブルに追加します。

#把结果加入user_info5表中
user_info5['类别']=km.labels_
user_info5.head()

4.モデルに従ってユーザーグループを分割する

前の準備作業は非常に十分で、このステップは非常に簡単です。1つの文だけでターゲットデータを抽出できます。

cluster_result=user_info5.loc[:,['买家会员名','类别']]
cluster_result.head()

4.ユーザーのクラスタリング結果に基づくパーソナライズされた推奨事項

裏側にコードは付いていません。このケースの焦点は、データ探索と表側のクリーニングです。次に、次のアイデアを説明します
。1. 2つのテーブルdf_orderとdf_itemを組み合わせて、ユーザーが購入していない製品情報のリストを見つけます[user-product(notbuy)]
2.手順1で取得した[user-product(notbuy)]を使用します)]ユーザーグループテーブル(クラスターモデルに従って分割されたユーザーグループデータ)に一致するテーブルで、[user-commodity(notbuy)-group]データを取得
3.ユーザー設定(ユ​​ーザーの製品購入数の設定)を定義し、ユーザーを作成する製品の設定[user-commodity-preference]
4.手順3で取得した[user-commodity-preference]テーブルを使用して、ユーザーグループテーブルと照合し、[user-product-preference-group]データを取得し
ます。5.同じグループグループ内のユーザーは、同じ製品の設定を集計して、各製品のユーザーグループの設定[グループ商品平均設定]データを
取得します。6.手順2で取得した[user-product(notbuy)-group] 】ステップ5で取得した[group-commodity-average preference]テーブル(commodity-group)と組み合わせて、[user-commodity(notbuy)-group-group average preference]データを取得します
行グループのソート、TopN推奨リストの取得

5、最終結果をエクスポートする

忠実なコードスニペットを添付:

if not os.path.exists('save_result'):
    os.makedirs('save_result') #文件夹不存在,创建文件夹

topk.to_csv('save_result/Cluster_User_Item_Topn_data.csv',index=False,encoding='GBK')

6.まとめ

1.プロジェクト全体で最も重要な3つのプロセスは、データ探索、データクリーニング、およびデータ前処理です。これらは、合計時間の約80%を占めます。ある時点で、不明確な考え方や不適切な操作は、最終結果にエラーを引き起こしやすくなります。
2.クラスタリングは距離計算に基づくアルゴリズムであり、モデルを実行する前に、データを標準化して次元の影響を排除する必要があります。

12件のオリジナル記事を公開 Like9 訪問者20,000以上

おすすめ

転載: blog.csdn.net/sun91019718/article/details/101323930