频道 900 条视频我按播放量排序,头部效应把我骗了

起因是想给一个 900 条视频的老频道做一次重新归档:哪些值得放进合集,哪些可以沉底。环境是本地 Windows + Python 3.11,用 yt-dlp 拉到一份 JSON,字段里带 view_count、like_count、upload_date、duration。数据量不大,900 条,一次就能拉完。

第一版我直接按 view_count 降序排,取前 10% 当“头部”。结果发现前 30 条几乎全是三四年前的视频,最近一年的内容一条都没进。这个结论明显不对——频道还在更新,播放量不该这么断崖。

于是我不再只看单条数字,而是先算每条视频的“日均播放”:

import json, datetime

items = json.load(open("videos.json", encoding="utf-8"))
for v in items:
    d = datetime.datetime.strptime(v["upload_date"], "%Y%m%d")
    age = max((datetime.datetime.now() - d).days, 1)
    v["per_day"] = v["view_count"] / age

再按 per_day 排序,头部结构立刻变了:榜单里出现了大量最近三个月的内容,老视频只有少数几个还在持续涨。这一步的代价是要接受“老视频的存量优势被抹掉”,per_day 会偏向新内容,所以我又补了一列原始 view_count,排序时两个都看。

接着我把数据按 30 天分桶,看每个桶的 per_day 中位数:

from collections import defaultdict
buckets = defaultdict(list)
for v in items:
    d = datetime.datetime.strptime(v["upload_date"], "%Y%m%d")
    key = d.strftime("%Y-%m")
    buckets[key].append(v["per_day"])
for k in sorted(buckets):
    vals = sorted(buckets[k])
    print(k, len(vals), vals[len(vals)//2])

这才看出真正的形状:频道在某个时间点之后,中位数明显下移,但个别视频还是能冲高。也就是说不是“内容整体变差”,而是“命中率变低了”。

这里会失效的地方:per_day 对刚发布几天的视频极不稳定,一条 2 天 5000 播放能算出 2500/天,直接排到第一;我最后把发布不足 14 天的视频单独标出来,不参与头部判断。另一个坑是 view_count 可能是 None,除法会直接报错,得先过滤。还有播放量本身受平台推荐影响,同一时期不同题材不可比,分桶只能看趋势,不能拿来横向排名。

我现在只把 per_day 当筛选器,不当结论。你们做频道归档时,是看累计播放还是看单位时间的播放?有没有更稳的归一化方式?

0
赞同度 100% · 0 条评论 · 1 阅读

0 条评论

支持 Markdown · 回复会实时推送给对方

还没有评论,写下第一条。