#1 - 2023-10-21 00:50
香风 (快乐荒废每一天)
当然,这个“最高分”“最低分”都只是虚指。
相对比较追求严谨的考试成绩、竞技分数、标书评分之类的,为避免因为极端值过于影响数据,都会去掉最高分、最低分。

比如:如果动画评分去掉前10%的分数和末10%的分数,评分的意义是不是更真实了,起码平衡党无论是打10分还是9分,亦或者2分还是1分,都影响不了分数。
正常的评分都有着正态分布的特点,对于一个作品的评分,去掉前后10%,几乎影响不了这个作品在班固米的位置,也是评分群体真实的反映。知道去掉10%,反而能促使大家少为了平衡刷偏离过高的分,除非能直接刷接近10%的高低分数,要不然个人行为根本影响不了评分。
#2 - 2023-10-21 01:00
也许吧,但很丑,多引入了一个参数,参数选择上也没法服众
#3 - 2023-10-21 02:00
用箱形图已经是个很常见的方式了。但我的统计学教材里提到过当你想要移除一些所谓的异常值时,你需要保证你能充分地正当化你的处理。

“正常的评分都有着正态分布的特点”
啥叫正常的评分。
#4 - 2023-10-21 03:07
你与其这样还不如直接展示中位数作为评分(至少作为一个平均分以外的选项),像批评空间那样。极端分数对中位数的影响是相对小的。
#4-1 - 2023-10-21 06:33
香风
中位数的差距就太小了
#4-2 - 2023-10-21 07:24
~~ꙮ⸝⸝ᐢ ᵕ ᐢ⸝⸝ꙮ~~
十分制就别学人家搞中位数啦
#4-3 - 2023-10-21 09:48
Hakula
Thor 说: 十分制就别学人家搞中位数啦
也是
#4-4 - 2023-10-21 15:39
星宫草莓
中位数更好刷分,把中位数85刷到90可比把平均分85刷到90简单多了。
#4-5 - 2023-10-21 16:54
Hakula
星宫草莓 说: 中位数更好刷分,把中位数85刷到90可比把平均分85刷到90简单多了。
假定一人一票的情况下,此处指个人的极端评分对整体的影响,刷分情况不考虑在内。
#4-6 - 2023-10-22 01:05
星宫草莓
Hakula 说: 假定一人一票的情况下,此处指个人的极端评分对整体的影响,刷分情况不考虑在内。
但个人的极端评分对网站影响并不大,刷分的影响很大。
#4-7 - 2023-10-22 01:29
Hakula
星宫草莓 说: 但个人的极端评分对网站影响并不大,刷分的影响很大。
我这不是顺着 lz 的意思往下说么... 去掉前后 10%,这件事本身试图达到的目的在我看来和取中位数是类似的。只不过 bgm 的 10 分制好像确实不太好搞中位数。
#5 - 2023-10-21 07:34
(待:天起凉风、日影飞去)
前段时间玩过这个,效果不理想。你可以自己操作看看。
https://jirehlov.com/sorted.csv
import csv
import numpy as np
import pandas as pd
left_weight = 5 # 低分权重
right_weight = 80 # 高分权重
threshold = 1.0 # 标准差阈值
header_line = ["subject", "类型", "标题", "中文标题", "VIB评分", "VIB标准差", "VIB评分数", "1.1", "2.1", "3.1", "4.1", "5.1", "6.1", "7.1", "8.1", "9.1", "10.1", "表面排名", "表面评分数", "表面评分", "1.2", "2.2", "3.2", "4.2", "5.2", "6.2", "7.2", "8.2", "9.2", "10.2", "是否被锁定", "发布发售放送时间", "NSFW", "子类型", "搁置", "抛弃", "想", "已", "在", "更新时间","VIB朴素排名","类型内VIB总平均分","类型内前250的最小VIB评分数","类型内加权VIB平均分","VIB加权排名(最终)","修正分数"]
df = pd.DataFrame(columns=header_line)
with open('sorted.csv', mode='r', encoding='utf-8') as input_file:
    csv_reader = csv.reader(input_file)
    next(csv_reader, None)
    for row in csv_reader:
        data_str = row[7:17]
        data = [int(item) for item in data_str]
        while True:
            scores = []
            for i, count in enumerate(data):
                scores.extend([i + 1] * count)
            if np.std(scores) < threshold:
                break
            left_idx = 0
            while data[left_idx] == 0:
                left_idx += 1
            right_idx = len(data) - 1
            while data[right_idx] == 0:
                right_idx -= 1
            data[left_idx] -= round(left_weight/(left_idx+1))
            if data[left_idx] < 0:
                data[left_idx] = 0
            data[right_idx] -= round(right_weight/(right_idx+1))
            if data[right_idx] < 0:
                data[right_idx] = 0
        average_score = np.mean(scores)
        row.append(average_score)
        df.loc[len(df)] = row
locked_items = df[df['是否被锁定'] == "True"].copy()
locked_items['修正排名'] = 0
unlocked_items = df[df['是否被锁定'] != "True"].copy()
unlocked_items.sort_values(by=['类型', '修正分数'], ascending=[True, False], inplace=True)
unlocked_items['修正排名'] = unlocked_items.groupby('类型').cumcount() + 1
result_df = pd.concat([locked_items, unlocked_items])
result_df.to_csv('output.csv', index=False, encoding='utf-8')
print("处理完成,结果已写入output.csv文件。")
#5-1 - 2023-10-22 18:12
稻森光香
没看明白低分权重和高分权重的意义,还有right_idx和left_idx表示什么呢?是表示数据从某个index开始为多少分吗?
#5-2 - 2023-10-22 18:21
Jirehlov
稻森光香 说: 没看明白低分权重和高分权重的意义,还有right_idx和left_idx表示什么呢?是表示数据从某个index开始为多少分吗?
同时减去各自权重个数的高分和低分。也可以改成按楼主说的百分比。不过效果都差不多
#6 - 2023-10-21 17:03
這個可以試看看
還挺有意思的