Pandas 1.5 数据分析实战:电影评分数据集 3 大统计维度与 2 种分组聚合
📅 2026/7/7 2:12:55
👁️ 阅读次数
📝 编程学习
Pandas 1.5 电影评分数据分析实战:从基础统计到智能洞察
1. 数据科学家的电影评分分析工具箱
在数据驱动的影视行业,掌握Pandas进行电影评分分析已成为数据科学家的核心技能。这个实战教程将带您从零开始,使用Pandas 1.5对电影评分数据进行全面剖析,揭示用户行为背后的秘密。
为什么选择电影评分数据?电影评分数据集是练习数据分析的绝佳素材,它包含了用户ID、电影ID、评分和时间戳四个核心维度,结构简单却蕴含丰富信息。通过分析这些数据,我们可以:
- 发现用户的评分偏好模式
- 识别高质量电影和潜在爆款
- 优化推荐系统算法
- 预测新上映电影的评分趋势
本教程将使用MovieLens数据集的一个子集,包含约10万条评分记录,涉及1000部电影和600个用户。以下是数据加载和初步观察的代码:
import pandas as pd # 加载数据集 ratings = pd.read_csv('movie_ratings.csv', names=['user_id', 'movie_id', 'rating', 'timestamp']) # 查看前5行数据 print(ratings.head()) # 查看数据基本信息 print(ratings.info())2. 三维度基础统计分析
2.1 用户维度分析
用户是评分系统的核心,了解用户行为是数据分析的第一步。我们可以计算以下关键指标:
# 用户数量统计 num_users = ratings['user_id'].nunique() print(f"总用户数: {num_users}") # 用户评分分布 user_stats = ratings.groupby('user_id')['rating'].agg(['count', 'mean', 'std']) print(user_stats.describe())用户评分行为洞察:
- 活跃用户与普通用户的评分数量差异
- 用户评分的均值分布(是否普遍偏高或偏低)
- 用户评分的一致性(标准差反映评分波动程度)
2.2 电影维度分析
电影质量直接影响用户评分,我们可以通过以下方式评估电影表现:
# 电影数量统计 num_movies = ratings['movie_id'].nunique() print(f"总电影数: {num_movies}") # 电影评分统计 movie_stats = ratings.groupby('movie_id')['rating'].agg(['count', 'mean', 'median']) top_movies = movie_stats.sort_values(by='mean', ascending=False).head(10) print(top_movies)电影评分关键发现:
- 评分数量与评分均值的相关性
- 高评分电影的共性特征
- 评分中位数与均值的差异分析
2.3 评分维度分析
评分本身包含丰富信息,深入分析可以揭示用户偏好:
# 整体评分分布 rating_dist = ratings['rating'].value_counts().sort_index() print(rating_dist) # 评分随时间变化趋势 ratings['date'] = pd.to_datetime(ratings['timestamp'], unit='s') monthly_avg = ratings.resample('M', on='date')['rating'].mean() print(monthly_avg.head())评分模式洞察:
- 用户是否倾向于给极端评分(1分或5分)
- 评分标准是否随时间变得宽松或严格
- 是否存在评分通货膨胀现象
3. 高级分组聚合技术
3.1 用户评分模式分析
通过分组聚合,我们可以识别不同类型的评分用户:
# 用户评分习惯分类 user_rating_habits = ratings.groupby('user_id')['rating'].agg( avg_rating='mean', rating_count='count', rating_std='std' ).reset_index() # 定义用户类型 user_rating_habits['user_type'] = pd.cut( user_rating_habits['avg_rating'], bins=[0, 2.5, 3.5, 5], labels=['苛刻型', '中立型', '宽容型'] ) print(user_rating_habits['user_type'].value_counts())用户类型特征:
- 苛刻型用户:平均评分<2.5,可能更专业或要求更高
- 中立型用户:2.5≤平均评分≤3.5,代表大众观点
- 宽容型用户:平均评分>3.5,可能更包容或偏好明确
3.2 电影质量评估
电影评分不仅反映质量,也反映受欢迎程度。我们可以使用加权评分公式平衡两者:
# 计算电影加权评分(IMDb公式) C = movie_stats['mean'].mean() m = movie_stats['count'].quantile(0.9) # 仅考虑评分数量前10%的电影 def weighted_rating(x): v = x['count'] R = x['mean'] return (v/(v+m) * R) + (m/(m+v) * C) movie_stats['weighted_score'] = movie_stats.apply(weighted_rating, axis=1) top_weighted = movie_stats.sort_values('weighted_score', ascending=False).head(10) print(top_weighted)加权评分优势:
- 避免少数极端评分影响
- 平衡评分数量和评分均值
- 更准确反映电影的实际质量
3.3 时间维度分析
评分随时间变化能揭示电影口碑演变:
# 电影评分随时间变化 movie_time = ratings.groupby(['movie_id', pd.Grouper(key='date', freq='M')])['rating'].mean().unstack() # 计算评分稳定性 movie_time['stability'] = movie_time.std(axis=1) stable_movies = movie_time.sort_values('stability').head(10) print(stable_movies[['stability']])时间分析价值:
- 识别口碑持续优秀的经典电影
- 发现评分波动大的争议性电影
- 分析电影评分衰减速度
4. 实战:构建电影推荐引擎
4.1 基于评分的简单推荐
# 获取高评分电影 high_rated = movie_stats[movie_stats['count'] > 100].sort_values('mean', ascending=False).head(20) # 获取热门电影 popular = movie_stats.sort_values(['count', 'mean'], ascending=[False, False]).head(20) # 混合推荐 recommendation = pd.concat([high_rated, popular]).drop_duplicates() print(recommendation)4.2 基于用户相似度的协同过滤
# 创建用户-电影评分矩阵 user_movie_matrix = ratings.pivot_table(index='user_id', columns='movie_id', values='rating') # 计算用户相似度 user_similarity = user_movie_matrix.T.corr() def get_similar_users(user_id, n=5): similar_users = user_similarity[user_id].sort_values(ascending=False)[1:n+1] return similar_users.index.tolist() # 示例:为用户1推荐电影 similar_users = get_similar_users(1) rec_movies = ratings[ratings['user_id'].isin(similar_users)] rec_movies = rec_movies.groupby('movie_id')['rating'].mean().sort_values(ascending=False).head(10) print(rec_movies)4.3 评估推荐效果
# 划分训练集和测试集 from sklearn.model_selection import train_test_split train, test = train_test_split(ratings, test_size=0.2, random_state=42) # 计算预测准确率 def evaluate(predictions, actual): correct = predictions[predictions.index.isin(actual.index)] return len(correct) / len(actual) # 示例评估 train_stats = train.groupby('movie_id')['rating'].mean() test_ratings = test.groupby('movie_id')['rating'].mean() top_train = train_stats.sort_values(ascending=False).head(100) accuracy = evaluate(top_train, test_ratings) print(f"推荐准确率: {accuracy:.2%}")5. 数据分析结果可视化
5.1 评分分布热力图
import seaborn as sns import matplotlib.pyplot as plt # 用户-电影评分热力图 plt.figure(figsize=(12, 8)) sample = ratings.sample(1000) # 抽样减少数据量 pivot_sample = sample.pivot_table(index='user_id', columns='movie_id', values='rating') sns.heatmap(pivot_sample, cmap='YlGnBu', cbar_kws={'label': '评分'}) plt.title('用户-电影评分分布热力图') plt.xlabel('电影ID') plt.ylabel('用户ID') plt.show()5.2 电影评分随时间变化
# 选取特定电影分析评分趋势 movie_id = 1 # 以电影ID 1为例 movie_ratings = ratings[ratings['movie_id'] == movie_id].copy() movie_ratings['month'] = movie_ratings['date'].dt.to_period('M') monthly_avg = movie_ratings.groupby('month')['rating'].mean() plt.figure(figsize=(12, 6)) monthly_avg.plot(kind='line', marker='o') plt.title(f'电影ID {movie_id} 评分随时间变化') plt.xlabel('月份') plt.ylabel('平均评分') plt.grid(True) plt.show()5.3 用户评分行为雷达图
from math import pi # 准备雷达图数据 def prepare_radar_data(user_id): user_data = ratings[ratings['user_id'] == user_id] rating_dist = user_data['rating'].value_counts().reindex([1, 2, 3, 4, 5], fill_value=0) return rating_dist.values # 绘制雷达图 labels = ['1星', '2星', '3星', '4星', '5星'] user1 = prepare_radar_data(1) user2 = prepare_radar_data(2) angles = np.linspace(0, 2 * np.pi, len(labels), endpoint=False).tolist() user1 = np.concatenate((user1,[user1[0]])) user2 = np.concatenate((user2,[user2[0]])) angles += angles[:1] fig, ax = plt.subplots(figsize=(8, 8), subplot_kw=dict(polar=True)) ax.plot(angles, user1, label='用户1') ax.plot(angles, user2, label='用户2') ax.fill(angles, user1, alpha=0.25) ax.fill(angles, user2, alpha=0.25) ax.set_xticks(angles[:-1]) ax.set_xticklabels(labels) ax.set_title('用户评分行为对比雷达图') ax.legend() plt.show()
编程学习
技术分享
实战经验