前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用R语言分析《我是歌手》出场顺序与名次的关系

用R语言分析《我是歌手》出场顺序与名次的关系

作者头像
机器学习AI算法工程
发布2018-03-13 11:58:55
7630
发布2018-03-13 11:58:55
举报
文章被收录于专栏:机器学习AI算法工程

《我是歌手》吵吵闹闹地落幕了,总决赛这一季是我最关注的一季,很认真的从头看到尾。当然,这篇文章的主旨不在此,我们要看的如题《我是歌手》节目中,出场顺序和名词的关系。关系肯定是有的,节目里自己都说到了,出场顺序很重要,这里我想用R来尝试分析这其中的细节关系。

数据是三季我是歌手除去突围赛半决赛总决赛的其余场次歌手们的出场顺序和名次,以及得票率(部分场次没有具体的得票率记为NA),一共31场,31*7=217行数据。基本数据结构如下:

数据可以查看到基本内容如下:

[plain] view plaincopy

  1. singerData <-read.table("clipboard",header=T)
  2. head(singerData,n=5)

1. 出场顺序与名次的数量关系

先把所有三季数据按出场顺序及排名做一个简单的统计:

[plain] view plaincopy

  1. table(data.frame(order=singerData$order,rank=singerData$rank))

都是数字,看起来很无感,试试用气泡图来看这个结果呢?

[plain] view plaincopy

  1. order.rank <-data.frame(a=c(rep(1,7),rep(2,7),rep(3,7),rep(4,7),rep(5,7),rep(6,7),rep(7,7)),b=c(rep(1:7,7)))
  2. for(i in 1:7){
  3. for (j in 1:7) {
  4. order.rank$c[(i-1)*7+j] <-table(data.frame(order=singerData$order,rank=singerData$rank))[i,j]
  5. }
  6. }
  7. symbols(order.rank$a,order.rank$b,order.rank$c,inches=0.40,bg="lavender",xlab="Singers'Order",ylab="Singers' Rank")

这个图好像也没有太多的很直观的信息,但是大概能看出来数据比较集中在从点(1,7)到点(7,1)这条线的周边。

2. 每一出场顺序下的平均名次

这里把算出每个出场次序的平均名次算出后,用折线图展示出来。

[plain] view plaincopy

  1. order.avgRank <- data.frame(order=1:7)
  2. for(i in1:7){
  3. order.avgRank$avgRank[i] <-mean(singerData$rank[singerData$order==i])
  4. }
  5. plot(order.avgRank$order,order.avgRank$avgRank,type="l",xlab="Singer'Order",ylab="Average Rank")

这个图就能很明显的看出来歌手最终的名次与其出场顺序存在近似负相关的关系。看看每一季的结果是不是都类似呢?

[plain] view plaincopy

  1. season.order.avgRank<- data.frame(s1=numeric(0),s2=numeric(0),s3=numeric(0))
  2. for(i in1:3){
  3. for(j in 1:7){
  4. season.order.avgRank[j,i]<-mean(singerData$rank[singerData$season==i&singerData$order==j],na.rm=TRUE)
  5. }
  6. }
  7. season.order.avgRank
  8. matplot(season.order.avgRank,type="o",col=1:3,lty=1:3)
  9. legend(5.5,5.5,c("第一季","第二季","第三季"),col=1:3,lty=1:3)

三季我是歌手,出场次序跟名次的关系,第一季第二季其实不是很明显,第三季有一个很明显的近似负相关的关系。

换个方式,查看得票率和出场次序的关系。

[plain] view plaincopy

  1. season.order.avgRate <-data.frame(s1=numeric(0),s2=numeric(0),s3=numeric(0))
  2. for(i in 1:3){
  3. for(j in 1:7){
  4. season.order.avgRate[j,i]<-mean(singerData$percentage[singerData$season==i&singerData$order==j],na.rm=TRUE)
  5. }
  6. }
  7. season.order.avgRate
  8. matplot(season.order.avgRate,type="o",col=1:3,lty=1:3)
  9. legend(1,19,c("第一季","第二季","第三季"),col=1:3,lty=1:3)

其实不用看就可以想象,跟名次与出场顺序的关系类似,肯定是第三季的特征会比较明显。这说明什么?第三季的观众比较不理智?第三季的歌手水平比较接近,所以观众才会屈从最直接的感受?请自行想象猜测!

3. 线性回归方式尝试找出其中关系

在第一部分气泡图的基础上做。

[plain] view plaincopy

  1. symbols(order.rank$a,order.rank$b,order.rank$c,inches=0.40,bg="lavender",xlab="Singers'Order",ylab="Singers' Rank")
  2. model=lm(rank~order,data=singerData)
  3. abline(model,lty=1,col=2)
  4. summary(model)

得到的回归方程式:rank = 4.74194-0.18799*order

Residuals:残差,上面给出了残差的最大值、最小值、中位数、上四分位数、下四分位数,可以看出符合正态分布。

Coefficients:系数,Estimate是预测的系数上面是截距,下面是斜率。

Residual standarderror:标准残差

Multiple R-squared :R^2值

Adjusted R-squared:调整R^2值,跟R^2值一样都是在0-1的范围内,越接近1表明这个模型可参考价值越大,越接近0表示可参考价值越小。

F-statistic:F统计量

p-value:p值

从模型的统计量能够看出,这个方程参考价值很低,不是一个很显著的线性模型。

4. 歌手的平均得票率

这里是把歌手的平均得票率计算出来,求其平均得票率,可以看出哪个歌手的整体表现比较好。与主题无关,只是一个小的统计。结果可以看到,林志炫稳居榜首,所以?你自己领会就好!

[plain] view plaincopy

  1. singers <-unique(singerData$singer)
  2. avgRate <- numeric(0)
  3. for(i in 1:length(singers)){
  4. avgRate[i] <-mean(singerData$percentage[singerData$singer==singers[i]],na.rm=TRUE)
  5. }
  6. singersAvgRate <-data.frame(singers=singers,avgRate=avgRate)
  7. singersAvgRate <- singersAvgRate[order(-singersAvgRate[,2]),]
  8. fix(singersAvgRate)
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2016-01-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大数据挖掘DT数据分析 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档