开发思路:结合用户画像(分群、年龄)和近期行为(浏览、加购、购买次数,浏览商品均价等)构建特征,汇总场景化营销和行为预测的分析结果

  1. 配置 (# --- 配置 ---):
    • 定义了模拟数据的规模 (NUM_USERSNUM_PRODUCTSNUM_INTERACTIONS)。
    • 设置了报告文件名前缀和随机种子以保证结果可复现。
  2. 数据生成 (generate_sample_data):
    • 创建了模拟的用户 (user_idsegmentage_groupgender)、商品 (product_idcategoryprice) 和用户-商品交互 (user_idproduct_idactiontimestamp) 数据。
    • 交互行为(浏览、加购、购买)的概率受到用户分群和商品属性的影响,使数据更贴近现实。
    • 生成的数据被保存为三个CSV文件,方便查看。
  3. 场景化营销 (scenario_based_marketing):
    • 定义了一个具体的营销场景:“对浏览/加购了某类商品但未购买的用户进行推荐”
    • 代码会识别出符合此场景的用户。
    • 为这些用户推荐同一类别下他们未交互过且价格相近的商品。
    • 生成的推荐示例被打印出来并保存到CSV文件。
  4. 用户行为预测 (predict_user_behavior):
    • 特征工程: 结合用户画像(分群、年龄)和近期行为(浏览、加购、购买次数,浏览商品均价等)构建特征。
    • 标签构建: 简化处理,将历史上有过购买行为的用户标记为正样本(会购买)。
    • 模型训练: 使用 scikit-learn 的 LogisticRegression 模型。
    • 模型评估: 计算准确率,并打印详细的分类报告 (classification_report) 和混淆矩阵 (confusion_matrix)。
    • 可视化: 使用 matplotlib 和 seaborn 绘制混淆矩阵热力图和特征重要性(逻辑回归系数)条形图。
    • 输出: 返回训练好的模型、预处理器和评估结果,用于后续应用。
  5. 报告生成 (generate_final_report):
    • 汇总场景化营销和行为预测的分析结果。
    • 描述了采用的方法、关键发现和模型性能。
    • 提出了基于分析结果的总结和业务建议。
    • 将所有内容整合到一个 .txt 文本报告中。
  6. 主函数 (main):
    • 按顺序调用数据生成、场景化营销、行为预测和报告生成函数,完成整个分析流程。

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
from sklearn.preprocessing import StandardScaler, LabelEncoder
import matplotlib.pyplot as plt
import seaborn as sns
import random
from datetime import datetime, timedelta

# --- 配置 ---
NUM_USERS = 2000
NUM_PRODUCTS = 100
NUM_INTERACTIONS = 10000
REPORT_PREFIX = '电商场景化营销与行为预测报告'
RANDOM_SEED = 42

# --- 数据生成 ---

def generate_sample_data(n_users, n_products, n_interactions):
    """生成模拟的用户-商品交互数据"""
    print("--- 正在生成模拟用户行为数据 ---")
    np.random.seed(RANDOM_SEED)
    random.seed(RANDOM_SEED)
    
    # 1. 生成基础用户和商品信息
    users = [f'user_{i}' for i in range(1, n_users + 1)]
    products = [f'prod_{i}' for i in range(1, n_products + 1)]
    categories = ['Electronics', 'Books', 'Clothing', 'Home', 'Toys']
    product_data = []
    for prod in products:
        cat = random.choice(categories)
        # 简化:价格与类别相关
        if cat == 'Electronics':
            price = np.random.lognormal(9, 0.5)
        elif cat == 'Books':
            price = np.random.lognormal(6, 0.3)
        else:
            price = np.random.lognormal(7, 0.4)
        product_data.append({'product_id': prod, 'category': cat, 'price': round(price, 2)})
    df_products = pd.DataFrame(product_data)
    
    # 2. 生成用户画像
    user_profiles = []
    for user in users:
        # 用户价值分群
        segment = np.random.choice(['Low Value', 'Medium Value', 'High Value'], p=[0.5, 0.3, 0.2])
        # 年龄 (简化为年龄段)
        age_group = np.random.choice(['18-25', '26-35', '36-45', '46+'], p=[0.3, 0.4, 0.2, 0.1])
        # 性别
        gender = np.random.choice(['M', 'F'], p=[0.5, 0.5])
        user_profiles.append({'user_id': user, 'segment': segment, 'age_group': age_group, 'gender': gender})
    df_users = pd.DataFrame(user_profiles)

    # 3. 生成交互数据 (浏览, 加购, 购买)
    interactions = []
    for _ in range(n_interactions):
        user = random.choice(users)
        product = random.choice(products)
        # 简单模拟:用户更可能与同类别或同价位商品交互
        user_segment = df_users[df_users['user_id'] == user]['segment'].iloc[0]
        user_age = df_users[df_users['user_id'] == user]['age_group'].iloc[0]
        prod_cat = df_products[df_products['product_id'] == product]['category'].iloc[0]
        prod_price = df_products[df_products['product_id'] == product]['price'].iloc[0]
        
        # 交互类型及概率 (受用户和商品属性影响)
        # 高价值用户购买概率更高
        base_prob_purchase = 0.05
        if user_segment == 'High Value': base_prob_purchase += 0.05
        elif user_segment == 'Low Value': base_prob_purchase -= 0.02
            
        # 价格影响 (价格适中购买率高)
        if 50 < prod_price < 500: base_prob_purchase += 0.02
        elif prod_price > 1000: base_prob_purchase -= 0.03
            
        prob_view = 0.7
        prob_cart = base_prob_purchase * 2 # 加购概率是购买的两倍
        
        rand = random.random()
        action = 'view'
        if rand < prob_cart:
            action = 'add_to_cart'
        if rand < base_prob_purchase:
            action = 'purchase'
            
        timestamp = datetime.now() - timedelta(days=random.randint(0, 365))
        
        interactions.append({
            'user_id': user,
            'product_id': product,
            'action': action,
            'timestamp': timestamp,
            'product_category': prod_cat,
            'product_price': prod_price,
            'user_segment': user_segment,
            'user_age_group': user_age
        })
    
    df_interactions = pd.DataFrame(interactions)
    
    # 保存原始数据
    df_users.to_csv(f'{REPORT_PREFIX}_用户数据.csv', index=False, encoding='utf-8-sig')
    df_products.to_csv(f'{REPORT_PREFIX}_商品数据.csv', index=False, encoding='utf-8-sig')
    df_interactions.to_csv(f'{REPORT_PREFIX}_交互数据.csv', index=False, encoding='utf-8-sig')
    print("模拟数据已生成并保存。")
    return df_users, df_products, df_interactions

# --- 场景化营销 ---

def scenario_based_marketing(df_interactions, df_products, target_category='Electronics'):
    """基于场景的简单营销推荐"""
    print(f"\n--- 场景化营销示例 (针对 {target_category} 类别) ---")
    
    # 场景:用户最近浏览/加购了电子产品但未购买
    # 1. 找出与目标类别相关的交互
    relevant_interactions = df_interactions[df_interactions['product_category'] == target_category].copy()
    
    # 2. 找出有'view'或'add_to_cart'但没有'purchase'的用户
    user_actions = relevant_interactions.groupby(['user_id', 'action']).size().unstack(fill_value=0)
    user_actions['has_viewed_or_carted'] = (user_actions['view'] > 0) | (user_actions['add_to_cart'] > 0)
    user_actions['has_purchased'] = user_actions['purchase'] > 0
    users_to_target = user_actions[
        (user_actions['has_viewed_or_carted']) & (~user_actions['has_purchased'])
    ].index.tolist()
    
    print(f"识别出 {len(users_to_target)} 名对 {target_category} 感兴趣但未购买的潜在用户。")
    
    if not users_to_target:
        print("当前数据中没有符合此场景的用户。")
        return pd.DataFrame() # 返回空DataFrame

    # 3. 为这些用户推荐同类别的其他商品 (简化:随机推荐同一类别且价格相近的商品)
    recommendations = []
    target_products = df_products[df_products['category'] == target_category]['product_id'].tolist()
    
    for user in users_to_target[:10]: # 仅为前10名用户生成示例推荐
        # 找到用户交互过的同类商品及其价格
        user_target_items = relevant_interactions[relevant_interactions['user_id'] == user]['product_id'].unique()
        if len(user_target_items) > 0:
            avg_price = df_products[df_products['product_id'].isin(user_target_items)]['price'].mean()
            # 推荐同一类别但用户未交互过的商品,且价格接近
            candidate_prods = df_products[
                (df_products['category'] == target_category) & 
                (~df_products['product_id'].isin(user_target_items)) &
                (df_products['price'].between(avg_price * 0.8, avg_price * 1.2))
            ]['product_id'].tolist()
            
            if candidate_prods:
                recommended_prod = random.choice(candidate_prods)
                recommendations.append({
                    'user_id': user,
                    'recommended_product': recommended_prod,
                    'reason': f'浏览/加购了{target_category}但未购买'
                })
            else:
                # 如果没有价格相近的,就随机推荐一个同类商品
                other_prods = [p for p in target_products if p not in user_target_items]
                if other_prods:
                     recommended_prod = random.choice(other_prods)
                     recommendations.append({
                        'user_id': user,
                        'recommended_product': recommended_prod,
                        'reason': f'浏览/加购了{target_category}但未购买 (无价格匹配项)'
                    })
    
    df_recommendations = pd.DataFrame(recommendations)
    if not df_recommendations.empty:
        print("生成的场景化营销推荐示例:")
        print(df_recommendations.to_string(index=False))
        df_recommendations.to_csv(f'{REPORT_PREFIX}_场景化推荐示例.csv', index=False, encoding='utf-8-sig')
    else:
        print("未能为用户生成推荐。")
        
    return df_recommendations

# --- 用户行为预测 ---

def predict_user_behavior(df_interactions, df_users, target_action='purchase'):
    """预测用户是否会进行特定行为 (如购买)"""
    print(f"\n--- 用户行为预测 ({target_action}) ---")
    
    # 1. 特征工程
    # 用户特征
    user_features = df_users.copy()
    le_segment = LabelEncoder()
    le_age = LabelEncoder()
    user_features['segment_encoded'] = le_segment.fit_transform(user_features['segment'])
    user_features['age_group_encoded'] = le_age.fit_transform(user_features['age_group'])
    user_features.drop(['segment', 'age_group'], axis=1, inplace=True)
    
    # 行为特征 (过去30天)
    recent_date = df_interactions['timestamp'].max()
    df_recent = df_interactions[df_interactions['timestamp'] > (recent_date - timedelta(days=30))]
    
    behavior_features = df_recent.groupby('user_id').agg(
        total_views=('action', lambda x: sum(x == 'view')),
        total_carts=('action', lambda x: sum(x == 'add_to_cart')),
        total_purchases=('action', lambda x: sum(x == 'purchase')),
        distinct_products_viewed=('product_id', 'nunique'),
        avg_product_price_viewed=('product_price', 'mean')
    ).reset_index()
    behavior_features['avg_product_price_viewed'].fillna(0, inplace=True)
    
    # 合并特征
    df_model = pd.merge(user_features, behavior_features, on='user_id', how='left')
    df_model.fillna(0, inplace=True) # 填充没有近期行为的用户
    
    # 2. 标签构建 (用户在未来一段时间是否购买)
    # 简化:如果用户在数据集中有任何购买记录,则标签为1
    # 在更真实的场景中,会划分训练/测试时间窗口
    user_purchase_counts = df_interactions[df_interactions['action'] == target_action].groupby('user_id').size()
    df_model['will_purchase'] = df_model['user_id'].isin(user_purchase_counts[user_purchase_counts > 0].index).astype(int)
    
    print(f"正样本 (会{target_action}) 数量: {df_model['will_purchase'].sum()}")
    print(f"负样本 (不会{target_action}) 数量: {(df_model['will_purchase'] == 0).sum()}")
    
    # 3. 准备模型数据
    feature_cols = [col for col in df_model.columns if col not in ['user_id', 'will_purchase', 'gender']]
    X = df_model[feature_cols]
    y = df_model['will_purchase']
    
    # 划分训练集和测试集
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=RANDOM_SEED, stratify=y)
    
    # 特征缩放
    scaler = StandardScaler()
    X_train_scaled = scaler.fit_transform(X_train)
    X_test_scaled = scaler.transform(X_test)
    
    # 4. 训练模型 (逻辑回归)
    model = LogisticRegression(random_state=RANDOM_SEED, max_iter=1000)
    model.fit(X_train_scaled, y_train)
    
    # 5. 预测与评估
    y_pred = model.predict(X_test_scaled)
    y_pred_proba = model.predict_proba(X_test_scaled)[:, 1] # 获取正类概率
    
    accuracy = accuracy_score(y_test, y_pred)
    print(f"模型准确率: {accuracy:.4f}")
    print("\n分类报告:")
    print(classification_report(y_test, y_pred, target_names=['Will Not Purchase', 'Will Purchase']))
    
    # 绘制混淆矩阵
    cm = confusion_matrix(y_test, y_pred)
    plt.figure(figsize=(8, 6))
    sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', 
                xticklabels=['Will Not Purchase', 'Will Purchase'], 
                yticklabels=['Will Not Purchase', 'Will Purchase'])
    plt.title('用户购买行为预测 - 混淆矩阵')
    plt.xlabel('预测标签')
    plt.ylabel('真实标签')
    cm_path = f'{REPORT_PREFIX}_混淆矩阵.png'
    plt.savefig(cm_path)
    plt.close()
    print(f"混淆矩阵图表已保存至: {cm_path}")
    
    # 6. 特征重要性 (逻辑回归系数)
    feature_importance = pd.DataFrame({
        'feature': feature_cols,
        'coefficient': model.coef_[0]
    }).sort_values(by='coefficient', key=abs, ascending=False)
    
    print("\n特征重要性 (逻辑回归系数):")
    print(feature_importance.to_string(index=False))
    
    plt.figure(figsize=(10, 6))
    sns.barplot(data=feature_importance.head(10), x='coefficient', y='feature', palette='viridis')
    plt.title('用户购买行为预测 - TOP 10 特征重要性 (逻辑回归系数)')
    plt.xlabel('系数值')
    plt.tight_layout()
    feat_imp_path = f'{REPORT_PREFIX}_特征重要性.png'
    plt.savefig(feat_imp_path)
    plt.close()
    print(f"特征重要性图表已保存至: {feat_imp_path}")
    
    return model, scaler, le_segment, le_age, feature_cols, accuracy, cm_path, feat_imp_path

# --- 报告生成 ---

def generate_final_report(target_category, df_recommendations, model_accuracy, cm_chart, feat_imp_chart):
    """生成最终分析报告"""
    print("\n--- 正在生成最终分析报告 ---")
    from datetime import datetime
    report_filename = f"{REPORT_PREFIX}_{datetime.now().strftime('%Y%m%d_%H%M%S')}.txt"
    
    with open(report_filename, 'w', encoding='utf-8') as f:
        f.write("=" * 50 + "\n")
        f.write("        电商平台场景化营销与用户行为预测报告\n")
        f.write(f"        生成时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")
        f.write("=" * 50 + "\n\n")

        f.write("--- 1. 场景化营销分析 ---\n")
        f.write(f"场景定义: 识别出对 '{target_category}' 类别感兴趣(通过浏览或加购)但尚未购买的用户。\n")
        f.write(f"识别结果: 共找到 {len(df_recommendations)} 名潜在目标用户 (示例展示了前10名)。\n")
        f.write("营销策略: 针对这些用户,推荐同一类别下他们未浏览/购买过且价格相近的商品,以促进转化。\n")
        f.write("示例推荐列表已保存至 CSV 文件。\n\n")

        f.write("--- 2. 用户行为预测模型 ---\n")
        f.write("模型目标: 预测用户在未来是否会进行购买行为。\n")
        f.write("模型算法: 逻辑回归 (Logistic Regression)。\n")
        f.write("模型输入特征: 用户分群、年龄、近期浏览/加购/购买次数、浏览商品的平均价格等。\n")
        f.write(f"模型在测试集上的准确率: {model_accuracy:.4f}\n")
        f.write("模型评估: 请结合分类报告和混淆矩阵进行详细分析。\n")
        f.write(f"混淆矩阵图表: {cm_chart}\n")
        f.write(f"特征重要性图表: {feat_imp_chart}\n")
        f.write("模型应用: 可以计算所有用户的购买概率,对高概率用户进行精准营销,对低概率用户分析原因或尝试激活。\n\n")

        f.write("--- 3. 总结与建议 ---\n")
        f.write("1. 场景化营销: 通过识别用户的具体行为场景(如浏览未购),可以提供更及时和相关的推荐,提高转化率。\n")
        f.write("2. 行为预测: 机器学习模型能够量化用户购买的可能性,为营销资源分配和用户分层运营提供数据支持。\n")
        f.write("3. 数据驱动: 持续收集和分析用户行为数据是优化营销策略和提升预测模型效果的关键。\n")
        f.write("4. 模型迭代: 随着业务发展和数据积累,应定期重新训练和评估预测模型,以保持其准确性。\n\n")

        f.write("=" * 50 + "\n")
        f.write("                    报告结束\n")
        f.write("=" * 50 + "\n")

    print(f"最终分析报告已生成: {report_filename}")

# --- 主函数 ---

def main():
    """主函数"""
    # 1. 生成数据
    df_users, df_products, df_interactions = generate_sample_data(NUM_USERS, NUM_PRODUCTS, NUM_INTERACTIONS)
    
    # 2. 场景化营销
    target_category = 'Electronics'
    df_recommendations = scenario_based_marketing(df_interactions, df_products, target_category)
    
    # 3. 用户行为预测
    model, scaler, le_segment, le_age, feature_cols, accuracy, cm_path, feat_imp_path = predict_user_behavior(df_interactions, df_users)
    
    # 4. 生成报告
    generate_final_report(target_category, df_recommendations, accuracy, cm_path, feat_imp_path)
    
    print("\n分析流程完成。")

if __name__ == "__main__":
    main()