查看原文
其他

卫视实时收视率对比 | R爬虫&可视化第1季

徐麟 R语言中文社区 2019-04-22

作者:徐麟,数据分析师,就职于上海唯品会。热爱数据挖掘和分析,喜欢用R、Python玩点不一样的数据。个人公众号:数据森麟(微信ID:shujusenlin) 


前言

几经思考,终于下定决心开设这个公众号,希望在这里与大家分享一些关于数据分析&数据挖掘有意思的事情,如果对于内容有任何的意见或建议,都希望大家在评论中不吝赐教。

言归正传,在今后的几期推送中,会与大家分享一些自己用R语言爬虫+可视化实现的案例,第一期就从本人最喜欢看的电视说起,分析各省级卫视收视率。


相关Package

  1. ## 爬虫相关包

  2. library(RCurl)

  3. library(XML)

  4. library(RSelenium)

  5. ## 数据读取相关包(表格和地图文件)

  6. library(data.table)

  7. library(maptools)

  8. ## R中实现sql代码处理表格

  9. library(sqldf)

  10. ## 数据可视化相关包

  11. library(ggplot2)    

  12. library(ggthemes)


数据爬取

实时数据可以在欢娱网(http://www.csm-huan.com)中获得,该网站数据的爬取需要借助RSelenium包获得动态页面,网站的界面如下:

爬取的核心代码:

  1. ele_str1 <- sprintf('//*[@id="tbody"]/tr[%d]/td[1]/a',i)

  2. elem_1 <- getNodeSet(htmlParse(remDr$findEleent(using = "xpath",ele_str1)

  3.          $getElementAttrbute("outerHTML")[[1]],ecoding='utf-8'),

  4.         '//a[@href="javascript:vid(0);"]')

  5. station <- sapply(elem_1,xmlValue)

剩下要做的就是循环得到每个电视台的数据,其中i为循环变量


地图数据读取、融合

地图数据的处理需要完成两部分工作,包括地图shp文件读取与收视率数据融合


数据读取:

  1. china_map <- readShapePoly("中国地图shp格式/china_basic_map/bou2_4p.shp")

  2. china_map1 <- china_map@data

  3. china_map1$id <- 0:(nrow(china_map1)-1)

  4. china_map1$id <- as.character(china_map1$id)

  5. china_map2 <- fortify(china_map)

  6. china_map3 <- left_join(china_map2, china_map1,by='id')

  7. colnames(province_rate)[2] <- 'NAME'

  8. china_map3$NAME <- as.character(china_map3$NAME)

收视率数据融合:

  1. province_rate <- sqldf('select b.*,a.*

  2.                        from tv_rate a

  3.                        inner join province b on a.station = b.station')

  4. province_rate$rate <- as.numeric(substr(as.character(province_rate$rate),1,6))

  5. china_map4 <- left_join(china_map3,province_rate,by = 'NAME')


数据可视化-全国地图展示数据

完成了前期数据准备,就要进入到了数据可视化的阶段,我们选取了ggplot包进行数据的可视化,并且结合ggthemes包提供的一些不错的配色方案,提高展示的可读性。


首先绘制的是全国地图数据,我们用颜色的深浅表示收视率的高低,分别选取了ggthems包中theme_economist,theme_wsj,theme_map三种配色方案作图进行对比




附作图代码:

  1. p <- ggplot() +

  2.     geom_polygon(data=china_map4,aes(x=long,y=lat,group=group,fill=收视率百分比),col='pink')+coord_map()+

  3.     scale_fill_gradient2(low='white',high='#DC143C',mid='orange',

  4.     midpoint=max(province_rate$rate,na.rm = TRUE)/2)+

  5.     xlim(73,137)+ylim(17,55)+

  6.     geom_text(data=province_rate,aes(x=longitude,y=latitude,label=province_name),size=2.8,alpha=0.7)+

  7.     ggtitle(label = sprintf('实时收视率%s',format(Sys.time(),format="%Y/%m/%d %H:%M")))+

  8.     theme_map()+theme(panel.grid.major = element_blank(),

  9.                       panel.grid.minor = element_blank(),

  10.                       axis.ticks = element_blank(),

  11.                       axis.line = element_blank(),

  12.                       axis.text = element_blank(),

  13.                       axis.title = element_blank(),

  14.                       legend.position = 'NONE',

  15.                       plot.title = element_text(hjust=0.5,size=25)

  16.                      )

  17. print(p)


数据可视化-分省市对比数据

与上一部分相比,加入了facet_wrap函数,实现了将各个省市轮廓进行切分,并且根据收视率的高低进行排序,提高可读性,以下分别是上午,下午,晚上三个时段的数据。



我们不难发现,不同收视段的排名靠前节目有明显不同,上午收看电视的观众更加关注股市和民生类节目,下午则更加注重养生,晚上则是娱乐节目的天下,我们可以针对于此进行更加深入的分析。


公众号后台回复关键字即可学习

回复 R               R语言快速入门免费视频 
回复 统计          统计方法及其在R中的实现
回复 用户画像   民生银行客户画像搭建与应用 
回复 大数据      大数据系列免费视频教程
回复 可视化      利用R语言做数据可视化
回复 数据挖掘   数据挖掘算法原理解释与应用
回复 机器学习   R&Python机器学习入门 

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存