当前位置: 首页 > news >正文

Pandas 1.5 数据分析实战:电影评分数据集 3 大统计维度与 2 种分组聚合

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()
http://www.jsqmd.com/news/1138381/

相关文章:

  • STM32 裸机 Blink 的坑 你确定你的向量表能跑起来
  • Claude Sonnet 5发布、Claude Code隐写术争议、零英伟达万亿模型 | 06.29-07.05 AI周报
  • 不教简笔画套路的创意美育,家长如何筛选班级
  • Agent 帮我写 CUDA(续):当 Self-Attention 遇上 Causal Mask 和 Cross-Attention
  • 【Bug已解决】Claude Code CLAUDE.md 报错 @include 循环引用解决方案
  • 计算机毕业设计之基于大数据的抖音音乐播放数据分析可视化
  • 印尼出海ERP技术选型:千岛业态下全链路跨境进销存最佳实践
  • Product Hunt 每日热榜 | 2026-07-06
  • ClaudeCode Auto模式:可信边界内的智能代码补全决策
  • OpenSPARC T1 vs T2 架构对比:8核32线程与8核64线程的微架构演进分析
  • 【Bug已解决】Codex CLI 报错 conversation interrupted 解决方案
  • 【单片机毕业设计】基于 STM32 的老人智能跌倒监护预警装置设计,基于单片机的多传感人体安全监测系统设计(018001)
  • JavaScript 展开运算符(Spread Operator)完全指南
  • 地理语义内容网络:地图型站点从空间点位到搜索资产的架构拆解
  • 遥感图像增强实战:OpenCV 4.8 实现 5 种空间域算法对比与效果量化
  • Kazumi:如何用5行代码打造你的专属动漫资源库?
  • 多旋翼机架设计实战:3种布局(X型/十字型/环形)性能对比与选型指南
  • 教资资料2026上合集/教资科一科二科/教师资格备考合集(可打印 下载)
  • Uber 全球办公网络自动化实践:Ansible 如何把 5000 台设备拉回“期望状态”
  • 01|OceanBase发布“湖库一体”AI数据库:杨冰称中国有机会定义下一代数据库范式
  • 基于时间序列特征工程和随机森林算法的入釜矿浆成分预测模型
  • Qt信号槽的几种连接方式:AutoConnection/DirectConnection/QueuedConnection/BlockingQueuedConnection
  • 【HarmonyOS学习笔记】2026-07-06 | 页面与数据5:实现页面跳转
  • Spring Boot 3 + Vue 3 + MySQL MES生产制造执行系统源码前后端分离实战
  • Objective-C 之 Foundation框架 详解
  • 06-高级模式与实战项目——09. 单元测试 - Jest
  • 储能沙盘模型BMS功能模拟控制系统设计与实现:电压监测、均衡管理与故障保护的STM32方案
  • npx --yes localtunnel --port 3000不安装任何依赖的情况下将端口暴露在公开url上
  • Scikit-learn 1.5.0 实战:5行代码构建KNN分类器,准确率超95%(附数据集)
  • Ubuntu 22.04 + CUDA 12.1 深度学习环境配置:3步完成PyTorch 2.0与TensorFlow 2.10共存