以第一场的数据为例为例,可以看到字段和数据的行数,其中得分有(31-27=4)行数据为空,进入第三步。
第三步:数据清洗竟然有空数据,先看看是怎么回事。
# 可以看到有四只乐队是没有得分和排名的,把他们列出来 data1[data1['总得分'].isnull()]
所以其实是有31只乐队表演的,但这四只乐队因为被剪掉了,所以没有具体成绩的数据,怎么办呢,只好把你们删了。
data1 = data1.dropna(axis = 0)
此外第六场的总票数还没有给出,也有一部分空值,但不影响分析这样就完成了,因为数据是自己手动录入的,所以其它没什么问题了,可以开始分析了。
第四步:数据分析整体的分析思路遵循从整体到局部的顺序,分为乐队和歌曲两个部分,再细分超级乐迷,专业乐迷和大众乐迷三个角度。同时会展示乐队在每期比赛的排名升降情况。
另外由于每场比赛的总票数不同,不同评委票数比例不同,为了使得不同场次之间的得票数据具备可比性,需要用到两种数据标准化的方法,分别是:
- Z_score 标准分
- 0-1 normalization 归一分
Z_score标准分的计算方法是用“(该乐队当场得分-当场所有乐队得分的平均数)/ 当场所有乐队得分的标准差”计算得到:
# 标准分函数定义def z_score_normalize(series): mean = series.mean() std_dv = series.std() return series.apply(lambda x:(x - mean) / std_dv) # 用循环的方式批量对每场比赛的得分做处理competition = [data1,data2,data3,data4,data5,data6]for period in competition: period['超级乐迷得分_标准分'] = z_score_normalize(period['超级乐迷得分']) period['专业乐迷得分_标准分'] = z_score_normalize(period['专业乐迷得分']) period['大众乐迷得分_标准分'] = z_score_normalize(period['大众乐迷得分']) period['总得分_标准分'] = z_score_normalize(period['总得分'])
0-1 normalization 归一分的计算方法是用“乐队得票数/总票数”计算得到,也等于常说的得票率:
# 定义归一化的函数def normalize(series,x_max): return series.apply(lambda x: x/x_max)# 对不同总分不同类别的得分应用归一化函数for data in [data1,data2,data5,data6]: data['超级乐迷_归一分'] = normalize(data['超级乐迷得分'],50)data3['超级乐迷_归一分'] = normalize(data3['超级乐迷得分'],60)data4['超级乐迷_归一分'] = normalize(data4['超级乐迷得分'],40)for data in [data1,data2,data3,data4,data5,data6]: data['专业乐迷_归一分'] = normalize(data['专业乐迷得分'],40) for data in [data1,data2]: data['大众乐迷_归一分'] = normalize(data['大众乐迷得分'],100)for data in [data3,data4,data5,data6]: data['大众乐迷_归一分'] = normalize(data['大众乐迷得分'],360)
做完上面两步,再把每场的数据拼成一个表,大功告成。(此处省略拼接代码)