Day 11: 电商数据分析实战
学习目标
完成今天的学习后,你将能够:
- 分析电商用户行为数据
- 进行销售数据分析
- 构建用户画像
- 了解推荐系统基础
技术原理
用户行为分析
关键指标
- PV(页面浏览量):页面被访问的次数
- UV(独立访客数):访问网站的独立用户数
- 转化率:完成目标行为的用户比例
- 留存率:在特定时间段内返回的用户比例
用户行为漏斗
- 浏览:用户访问页面
- 点击:用户点击商品
- 加购:用户将商品加入购物车
- 下单:用户提交订单
- 支付:用户完成支付
销售数据分析
关键指标
- GMV(商品交易总额):所有订单的总金额
- 客单价:平均每个订单的金额
- 复购率:重复购买的用户比例
- 退货率:退货订单的比例
用户画像
维度
- 人口统计:年龄、性别、地域
- 行为特征:浏览、购买、偏好
- 价值特征:消费金额、频率、最近购买时间
- 兴趣特征:品类偏好、品牌偏好
推荐系统基础
方法
- 基于内容:推荐相似内容
- 协同过滤:基于用户行为
- 混合推荐:结合多种方法
案例:电商数据分析
假设我们有一个电商数据集,需要:
- 分析用户行为
- 分析销售趋势
- 构建用户画像
- 实现简单的推荐
应用场景
- 运营优化:提高转化率、降低流失率
- 精准营销:个性化推荐、定向促销
- 库存管理:需求预测、库存优化
- 用户体验:个性化界面、优化流程
代码案例
用户行为分析
python
# 用户行为分析示例
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from datetime import datetime, timedelta
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 1. 创建模拟电商数据
np.random.seed(42)
n_users = 1000
n_events = 10000
# 生成用户数据
user_ids = np.random.randint(1, n_users + 1, n_events)
event_types = np.random.choice(['浏览', '点击', '加购', '下单', '支付'],
n_events, p=[0.5, 0.3, 0.1, 0.07, 0.03])
categories = np.random.choice(['电子产品', '服装', '食品', '家居', '美妆'], n_events)
dates = [datetime(2024, 1, 1) + timedelta(days=np.random.randint(0, 30))
for _ in range(n_events)]
# 创建DataFrame
df = pd.DataFrame({
'用户ID': user_ids,
'事件类型': event_types,
'商品类别': categories,
'日期': dates
})
print("用户行为数据:")
print(df.head())
print(f"\n数据形状: {df.shape}")
# 2. 用户行为统计
print("\n用户行为统计:")
print("=" * 50)
# 各事件类型统计
event_counts = df['事件类型'].value_counts()
print("\n各事件类型数量:")
print(event_counts)
# 可视化事件分布
plt.figure(figsize=(10, 6))
bars = plt.bar(event_counts.index, event_counts.values, color='skyblue', edgecolor='black')
plt.title('用户行为分布', fontsize=16, fontweight='bold')
plt.xlabel('事件类型')
plt.ylabel('数量')
# 添加数值标签
for bar in bars:
height = bar.get_height()
plt.text(bar.get_x() + bar.get_width()/2., height,
f'{height}',
ha='center', va='bottom')
plt.grid(True, alpha=0.3, axis='y')
plt.tight_layout()
plt.show()
# 3. 用户行为漏斗
print("\n用户行为漏斗:")
print("=" * 50)
# 计算各阶段用户数
funnel_data = {}
for event in ['浏览', '点击', '加购', '下单', '支付']:
funnel_data[event] = df[df['事件类型'] == event]['用户ID'].nunique()
# 计算转化率
funnel_df = pd.DataFrame({
'阶段': list(funnel_data.keys()),
'用户数': list(funnel_data.values())
})
funnel_df['转化率'] = funnel_df['用户数'] / funnel_df['用户数'].iloc[0] * 100
funnel_df['阶段转化率'] = funnel_df['用户数'] / funnel_df['用户数'].shift(1) * 100
print(funnel_df)
# 可视化漏斗
fig, axes = plt.subplots(1, 2, figsize=(14, 6))
# 漏斗图
axes[0].barh(funnel_df['阶段'][::-1], funnel_df['用户数'][::-1], color='skyblue', edgecolor='black')
axes[0].set_title('用户行为漏斗', fontsize=14, fontweight='bold')
axes[0].set_xlabel('用户数')
# 转化率图
axes[1].plot(funnel_df['阶段'], funnel_df['转化率'], 'ro-', linewidth=2, markersize=8)
axes[1].set_title('转化率趋势', fontsize=14, fontweight='bold')
axes[1].set_ylabel('转化率 (%)')
axes[1].grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
# 4. 按类别分析
print("\n按类别分析:")
print("=" * 50)
category_stats = df.groupby('商品类别').agg({
'用户ID': 'nunique',
'事件类型': 'count'
}).rename(columns={'用户ID': '独立用户数', '事件类型': '事件总数'})
print(category_stats)
# 可视化类别分布
fig, axes = plt.subplots(1, 2, figsize=(14, 6))
# 独立用户数
axes[0].bar(category_stats.index, category_stats['独立用户数'], color='skyblue', edgecolor='black')
axes[0].set_title('各类别独立用户数', fontsize=14, fontweight='bold')
axes[0].set_ylabel('用户数')
axes[0].tick_params(axis='x', rotation=45)
# 事件总数
axes[1].bar(category_stats.index, category_stats['事件总数'], color='lightcoral', edgecolor='black')
axes[1].set_title('各类别事件总数', fontsize=14, fontweight='bold')
axes[1].set_ylabel('事件数')
axes[1].tick_params(axis='x', rotation=45)
plt.tight_layout()
plt.show()
# 5. 时间趋势分析
print("\n时间趋势分析:")
print("=" * 50)
# 按日期统计
daily_stats = df.groupby('日期').agg({
'用户ID': 'nunique',
'事件类型': 'count'
}).rename(columns={'用户ID': '独立用户数', '事件类型': '事件总数'})
# 可视化时间趋势
fig, axes = plt.subplots(2, 1, figsize=(14, 10))
axes[0].plot(daily_stats.index, daily_stats['独立用户数'], 'b-', linewidth=2)
axes[0].set_title('每日独立用户数', fontsize=14, fontweight='bold')
axes[0].set_ylabel('用户数')
axes[0].grid(True, alpha=0.3)
axes[1].plot(daily_stats.index, daily_stats['事件总数'], 'r-', linewidth=2)
axes[1].set_title('每日事件总数', fontsize=14, fontweight='bold')
axes[1].set_ylabel('事件数')
axes[1].grid(True, alpha=0.3)
plt.tight_layout()
plt.show()销售数据分析
python
# 销售数据分析示例
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from datetime import datetime, timedelta
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 1. 创建模拟销售数据
np.random.seed(42)
n_orders = 5000
# 生成订单数据
order_ids = range(1, n_orders + 1)
user_ids = np.random.randint(1, 501, n_orders)
products = np.random.choice(['手机', '电脑', '平板', '耳机', '手表'], n_orders)
categories = np.random.choice(['电子产品', '配件'], n_prices = np.random.uniform(100, 5000, n_orders)
quantities = np.random.randint(1, 6, n_orders)
dates = [datetime(2024, 1, 1) + timedelta(days=np.random.randint(0, 365))
for _ in range(n_orders)]
df = pd.DataFrame({
'订单ID': order_ids,
'用户ID': user_ids,
'商品': products,
'类别': categories,
'单价': prices,
'数量': quantities,
'日期': dates
})
# 计算订单金额
df['订单金额'] = df['单价'] * df['数量']
print("销售数据:")
print(df.head())
print(f"\n数据形状: {df.shape}")
# 2. 销售概览
print("\n销售概览:")
print("=" * 50)
total_orders = len(df)
total_revenue = df['订单金额'].sum()
avg_order_value = df['订单金额'].mean()
unique_customers = df['用户ID'].nunique()
print(f"总订单数: {total_orders}")
print(f"总收入: {total_revenue:,.2f}")
printf"平均订单金额: {avg_order_value:,.2f}")
print(f"独立客户数: {unique_customers}")
# 3. 按产品分析
print("\n按产品分析:")
print("=" * 50)
product_stats = df.groupby('商品').agg({
'订单ID': 'count',
'订单金额': 'sum',
'数量': 'sum'
}).rename(columns={'订单ID': '订单数', '订单金额': '总收入', '数量': '总销量'})
product_stats['平均订单金额'] = product_stats['总收入'] / product_stats['订单数']
product_stats = product_stats.sort_values('总收入', ascending=False)
print(product_stats)
# 可视化产品销售
fig, axes = plt.subplots(2, 2, figsize=(14, 10))
# 订单数
axes[0, 0].bar(product_stats.index, product_stats['订单数'], color='skyblue', edgecolor='black')
axes[0, 0].set_title('各产品订单数', fontsize=14, fontweight='bold')
axes[0, 0].set_ylabel('订单数')
axes[0, 0].tick_params(axis='x', rotation=45)
# 总收入
axes[0, 1].bar(product_stats.index, product_stats['总收入'], color='lightcoral', edgecolor='black')
axes[0, 1].set_title('各产品总收入', fontsize=14, fontweight='bold')
axes[0, 1].set_ylabel('收入')
axes[0, 1].tick_params(axis='x', rotation=45)
# 总销量
axes[1, 0].bar(product_stats.index, product_stats['总销量'], color='lightgreen', edgecolor='black')
axes[1, 0].set_title('各产品总销量', fontsize=14, fontweight='bold')
axes[1, 0].set_ylabel('销量')
axes[1, 0].tick_params(axis='x', rotation=45)
# 平均订单金额
axes[1, 1].bar(product_stats.index, product_stats['平均订单金额'], color='gold', edgecolor='black')
axes[1, 1].set_title('各产品平均订单金额', fontsize=14, fontweight='bold')
axes[1, 1].set_ylabel('金额')
axes[1, 1].tick_params(axis='x', rotation=45)
plt.suptitle('产品销售分析', fontsize=16, fontweight='bold')
plt.tight_layout()
plt.show()
# 4. 按时间分析
print("\n按时间分析:")
print("=" * 50)
# 按月统计
df['月份'] = df['日期'].dt.to_period('M')
monthly_stats = df.groupby('月份').agg({
'订单ID': 'count',
'订单金额': 'sum',
'用户ID': 'nunique'
}).rename(columns={'订单ID': '订单数', '订单金额': '收入', '用户ID': '客户数'})
print(monthly_stats)
# 可视化月度趋势
fig, axes = plt.subplots(3, 1, figsize=(14, 12))
axes[0].plot(monthly_stats.index.astype(str), monthly_stats['订单数'], 'b-', linewidth=2)
axes[0].set_title('月度订单数', fontsize=14, fontweight='bold')
axes[0].set_ylabel('订单数')
axes[0].tick_params(axis='x', rotation=45)
axes[0].grid(True, alpha=0.3)
axes[1].plot(monthly_stats.index.astype(str), monthly_stats['收入'], 'r-', linewidth=2)
axes[1].set_title('月度收入', fontsize=14, fontweight='bold')
axes[1].set_ylabel('收入')
axes[1].tick_params(axis='x', rotation=45)
axes[1].grid(True, alpha=0.3)
axes[2].plot(monthly_stats.index.astype(str), monthly_stats['客户数'], 'g-', linewidth=2)
axes[2].set_title('月度客户数', fontsize=14, fontweight='bold')
axes[2].set_ylabel('客户数')
axes[2].tick_params(axis='x', rotation=45)
axes[2].grid(True, alpha=0.3)
plt.suptitle('月度销售趋势', fontsize=16, fontweight='bold')
plt.tight_layout()
plt.show()
# 5. 客户价值分析
print("\n客户价值分析:")
print("=" * 50)
# 计算RFM指标
current_date = df['日期'].max() + timedelta(days=1)
rfm = df.groupby('用户ID').agg({
'日期': lambda x: (current_date - x.max()).days, # 最近购买天数
'订单ID': 'count', # 购买次数
'订单金额': 'sum' # 总消费金额
}).rename(columns={
'日期': 'R',
'订单ID': 'F',
'订单金额': 'M'
})
print("RFM统计:")
print(rfm.describe())
# 可视化RFM分布
fig, axes = plt.subplots(1, 3, figsize=(15, 5))
axes[0].hist(rfm['R'], bins=20, color='skyblue', edgecolor='black')
axes[0].set_title('最近购买天数分布', fontsize=14, fontweight='bold')
axes[0].set_xlabel('天数')
axes[0].set_ylabel('客户数')
axes[1].hist(rfm['F'], bins=20, color='lightcoral', edgecolor='black')
axes[1].set_title('购买次数分布', fontsize=14, fontweight='bold')
axes[1].set_xlabel('次数')
axes[1].set_ylabel('客户数')
axes[2].hist(rfm['M'], bins=20, color='lightgreen', edgecolor='black')
axes[2].set_title('消费金额分布', fontsize=14, fontweight='bold')
axes[2].set_xlabel('金额')
axes[2].set_ylabel('客户数')
plt.suptitle('客户RFM分布', fontsize=16, fontweight='bold')
plt.tight_layout()
plt.show()用户画像构建
python
# 用户画像构建示例
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 1. 创建模拟用户数据
np.random.seed(42)
n_users = 500
# 生成用户数据
user_data = {
'用户ID': range(1, n_users + 1),
'年龄': np.random.randint(18, 65, n_users),
'性别': np.random.choice(['男', '女'], n_users),
'注册天数': np.random.randint(30, 1000, n_users),
'总消费': np.random.exponential(5000, n_users),
'购买次数': np.random.randint(1, 50, n_users),
'浏览时长': np.random.uniform(10, 300, n_users),
'收藏商品数': np.random.randint(0, 50, n_users)
}
df = pd.DataFrame(user_data)
# 计算衍生指标
df['平均订单金额'] = df['总消费'] / df['购买次数']
df['购买频率'] = df['购买次数'] / df['注册天数'] * 30 # 月均购买次数
print("用户数据:")
print(df.head())
print(f"\n数据形状: {df.shape}")
# 2. 用户分群
print("\n用户分群:")
print("=" * 50)
# 选择分群特征
features = ['总消费', '购买次数', '浏览时长', '收藏商品数']
X = df[features]
# 标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 使用K-means聚类
kmeans = KMeans(n_clusters=4, random_state=42, n_init=10)
df['用户分群'] = kmeans.fit_predict(X_scaled)
# 分析各分群特征
cluster_stats = df.groupby('用户分群')[features].mean()
print("\n各分群特征均值:")
print(cluster_stats)
# 可视化分群结果
fig, axes = plt.subplots(2, 2, figsize=(14, 10))
for i, feature in enumerate(features):
row = i // 2
col = i % 2
for cluster in range(4):
mask = df['用户分群'] == cluster
axes[row, col].hist(df.loc[mask, feature], bins=20, alpha=0.5, label=f'分群{cluster}')
axes[row, col].set_title(f'{feature}分布', fontsize=14, fontweight='bold')
axes[row, col].set_xlabel(feature)
axes[row, col].set_ylabel('用户数')
axes[row, col].legend()
plt.suptitle('用户分群特征分布', fontsize=16, fontweight='bold')
plt.tight_layout()
plt.show()
# 3. 用户价值分析
print("\n用户价值分析:")
print("=" * 50)
# 计算RFM指标
df['最近购买天数'] = np.random.randint(1, 90, n_users) # 模拟数据
df['R_score'] = pd.qcut(df['最近购买天数'], 4, labels=[4, 3, 2, 1])
df['F_score'] = pd.qcut(df['购买次数'].rank(method='first'), 4, labels=[1, 2, 3, 4])
df['M_score'] = pd.qcut(df['总消费'], 4, labels=[1, 2, 3, 4])
# 计算RFM总分
df['RFM_score'] = df['R_score'].astype(int) + df['F_score'].astype(int) + df['M_score'].astype(int)
# 用户价值分群
def rfm_segment(score):
if score >= 10:
return '高价值'
elif score >= 7:
return '中价值'
elif score >= 4:
return '低价值'
else:
return '流失风险'
df['价值分群'] = df['RFM_score'].apply(rfm_segment)
# 统计各价值分群
value_counts = df['价值分群'].value_counts()
print("\n用户价值分群:")
print(value_counts)
# 可视化价值分群
fig, axes = plt.subplots(1, 2, figsize=(14, 6))
# 饼图
axes[0].pie(value_counts, labels=value_counts.index, autopct='%1.1f%%',
colors=['#ff9999', '#66b3ff', '#99ff99', '#ffcc99'], startangle=90)
axes[0].set_title('用户价值分群占比', fontsize=14, fontweight='bold')
# 柱状图
axes[1].bar(value_counts.index, value_counts.values,
color=['#ff9999', '#66b3ff', '#99ff99', '#ffcc99'], edgecolor='black')
axes[1].set_title('用户价值分群数量', fontsize=14, fontweight='bold')
axes[1].set_ylabel('用户数')
plt.tight_layout()
plt.show()
# 4. 用户画像标签
print("\n用户画像标签:")
print("=" * 50)
# 年龄分段
df['年龄段'] = pd.cut(df['年龄'], bins=[0, 25, 35, 45, 55, 100],
labels=['18-25', '26-35', '36-45', '46-55', '55+'])
# 消费能力
df['消费能力'] = pd.cut(df['总消费'], bins=[0, 1000, 3000, 6000, 10000, float('inf')],
labels=['低', '中低', '中', '中高', '高'])
# 活跃度
df['活跃度'] = pd.cut(df['浏览时长'], bins=[0, 50, 100, 200, 300],
labels=['低', '中', '高', '非常高'])
print("\n用户画像示例:")
sample_users = df.head(10)[['用户ID', '年龄', '性别', '总消费', '购买次数',
'用户分群', '价值分群', '年龄段', '消费能力', '活跃度']]
print(sample_users)
# 5. 画像分析
print("\n画像分析:")
print("=" * 50)
# 按性别分析
gender_stats = df.groupby('性别').agg({
'总消费': 'mean',
'购买次数': 'mean',
'浏览时长': 'mean'
}).round(2)
print("\n按性别分析:")
print(gender_stats)
# 按年龄段分析
age_stats = df.groupby('年龄段').agg({
'总消费': 'mean',
'购买次数': 'mean',
'浏览时长': 'mean'
}).round(2)
print("\n按年龄段分析:")
print(age_stats)
# 可视化画像分析
fig, axes = plt.subplots(2, 2, figsize=(14, 10))
# 按性别消费
axes[0, 0].bar(gender_stats.index, gender_stats['总消费'], color=['skyblue', 'pink'], edgecolor='black')
axes[0, 0].set_title('不同性别平均消费', fontsize=14, fontweight='bold')
axes[0, 0].set_ylabel('平均消费')
# 按年龄段消费
axes[0, 1].bar(age_stats.index, age_stats['总消费'], color='lightcoral', edgecolor='black')
axes[0, 1].set_title('不同年龄段平均消费', fontsize=14, fontweight='bold')
axes[0, 1].set_ylabel('平均消费')
axes[0, 1].tick_params(axis='x', rotation=45)
# 消费能力分布
consumption_counts = df['消费能力'].value_counts()
axes[1, 0].bar(consumption_counts.index, consumption_counts.values, color='lightgreen', edgecolor='black')
axes[1, 0].set_title('消费能力分布', fontsize=14, fontweight='bold')
axes[1, 0].set_ylabel('用户数')
# 活跃度分布
activity_counts = df['活跃度'].value_counts()
axes[1, 1].bar(activity_counts.index, activity_counts.values, color='gold', edgecolor='black')
axes[1, 1].set_title('活跃度分布', fontsize=14, fontweight='bold')
axes[1, 1].set_ylabel('用户数')
plt.suptitle('用户画像分析', fontsize=16, fontweight='bold')
plt.tight_layout()
plt.show()推荐系统基础
python
# 推荐系统基础示例
import pandas as pd
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
from sklearn.model_selection import train_test_split
# 1. 创建模拟评分数据
np.random.seed(42)
n_users = 100
n_items = 50
# 生成用户-物品评分矩阵
ratings = np.random.randint(0, 6, (n_users, n_items))
# 设置一些缺失值(0表示未评分)
mask = np.random.random((n_users, n_items)) > 0.3
ratings = ratings * mask
# 创建DataFrame
user_ids = [f'用户{i+1}' for i in range(n_users)]
item_ids = [f'商品{i+1}' for i in range(n_items)]
df = pd.DataFrame(ratings, index=user_ids, columns=item_ids)
print("用户-物品评分矩阵:")
print(df.head())
print(f"\n矩阵形状: {df.shape}")
# 2. 基于用户的协同过滤
print("\n基于用户的协同过滤:")
print("=" * 50)
# 计算用户相似度
user_similarity = cosine_similarity(df)
user_similarity_df = pd.DataFrame(user_similarity, index=user_ids, columns=user_ids)
print("用户相似度矩阵(前5x5):")
print(user_similarity_df.iloc[:5, :5])
# 为用户推荐商品
def recommend_items(user_id, n_recommendations=5):
"""为用户推荐商品"""
# 获取用户相似度
similar_users = user_similarity_df[user_id].sort_values(ascending=False)[1:11]
# 获取用户未评分的商品
user_ratings = df.loc[user_id]
unrated_items = user_ratings[user_ratings == 0].index
# 计算预测评分
predictions = {}
for item in unrated_items:
# 加权平均
weighted_sum = 0
similarity_sum = 0
for similar_user, similarity in similar_users.items():
if df.loc[similar_user, item] > 0:
weighted_sum += similarity * df.loc[similar_user, item]
similarity_sum += abs(similarity)
if similarity_sum > 0:
predictions[item] = weighted_sum / similarity_sum
# 返回推荐结果
recommendations = sorted(predictions.items(), key=lambda x: x[1], reverse=True)
return recommendations[:n_recommendations]
# 测试推荐
test_user = '用户1'
recommendations = recommend_items(test_user)
print(f"\n为{test_user}推荐的商品:")
for item, score in recommendations:
print(f" {item}: 预测评分 {score:.2f}")
# 3. 基于物品的协同过滤
print("\n基于物品的协同过滤:")
print("=" * 50)
# 计算物品相似度
item_similarity = cosine_similarity(df.T)
item_similarity_df = pd.DataFrame(item_similarity, index=item_ids, columns=item_ids)
print("物品相似度矩阵(前5x5):")
print(item_similarity_df.iloc[:5, :5])
# 基于物品的推荐
def recommend_items_item_based(user_id, n_recommendations=5):
"""基于物品相似度推荐"""
user_ratings = df.loc[user_id]
rated_items = user_ratings[user_ratings > 0].index
unrated_items = user_ratings[user_ratings == 0].index
predictions = {}
for item in unrated_items:
weighted_sum = 0
similarity_sum = 0
for rated_item in rated_items:
similarity = item_similarity_df.loc[item, rated_item]
weighted_sum += similarity * user_ratings[rated_item]
similarity_sum += abs(similarity)
if similarity_sum > 0:
predictions[item] = weighted_sum / similarity_sum
recommendations = sorted(predictions.items(), key=lambda x: x[1], reverse=True)
return recommendations[:n_recommendations]
# 测试推荐
recommendations = recommend_items_item_based(test_user)
print(f"\n基于物品相似度为{test_user}推荐的商品:")
for item, score in recommendations:
print(f" {item}: 预测评分 {score:.2f}")
# 4. 推荐系统评估
print("\n推荐系统评估:")
print("=" * 50)
# 划分训练集和测试集
train_data = df.copy()
test_ratio = 0.2
# 随机选择一些评分作为测试集
test_mask = np.random.random(df.shape) < test_ratio
test_data = train_data * test_mask
train_data = train_data * (~test_mask)
print(f"训练集非零评分数量: {np.count_nonzero(train_data.values)}")
print(f"测试集非零评分数量: {np.count_nonzero(test_data.values)}")
# 计算均方根误差
def rmse(predictions, targets):
"""计算RMSE"""
non_zero_mask = targets > 0
return np.sqrt(np.mean((predictions[non_zero_mask] - targets[non_zero_mask]) ** 2))
# 简单预测(使用用户平均评分)
user_means = train_data.replace(0, np.nan).mean(axis=1)
predictions = np.tile(user_means.values.reshape(-1, 1), (1, n_items))
rmse_score = rmse(predictions, test_data.values)
print(f"\n基于用户平均评分的RMSE: {rmse_score:.4f}")课后练习
练习1:用户行为分析
- 分析用户行为漏斗
- 计算转化率
- 分析用户留存
- 可视化用户行为
练习2:销售数据分析
- 分析销售趋势
- 计算关键指标
- 进行产品分析
- 进行客户分析
练习3:用户画像构建
- 计算RFM指标
- 进行用户分群
- 创建用户标签
- 分析用户画像
练习4:推荐系统
- 实现基于用户的协同过滤
- 实现基于物品的协同过滤
- 评估推荐效果
- 优化推荐算法
常见问题
Q1: 如何提高用户转化率?
A: 可以尝试:
- 优化用户体验
- 个性化推荐
- 精准营销
- 优化流程
Q2: 如何处理冷启动问题?
A: 可以尝试:
- 基于内容的推荐
- 热门商品推荐
- 用户注册信息
- 探索与利用
Q3: 如何评估推荐系统效果?
A: 可以使用:
- 准确率、召回率
- RMSE、MAE
- 点击率、转化率
- A/B测试
Q4: 如何处理稀疏数据?
A: 可以尝试:
- 矩阵分解
- 深度学习
- 特征工程
- 降维技术
Q5: 如何保护用户隐私?
A: 可以尝试:
- 数据脱敏
- 差分隐私
- 联邦学习
- 匿名化处理
下一步学习
完成今天的学习后,建议你:
- 练习处理真实的电商数据
- 掌握用户行为分析方法
- 学习推荐系统技术
- 准备进入Day 12的学习:金融数据分析实战
明天我们将学习金融数据分析,这是数据分析的重要应用领域。