IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    豆瓣阅读统计及可视化(上)

    qxde01发表于 2013-12-22 12:14:53
    love 0
    许多阅读过的书籍早已抛掷九霄云外了,毫无印象。后来在豆瓣上断断续续做了些记录,直至2012年后半年开始做不间断的记录。即使记录书名,也可以帮助自己回忆阅读内容,建立不同书籍之间的关系,进而形成系统化的知识。久而久之,理解能力和思考能力都能得到非常大的提高,进入一个全新的领域的学习曲线也会越来越短。正所谓,阅读越多,越感觉知之甚少,促使自己多读书多思考,使自己不懈怠。为了梳理阅读过的书籍,使用可视化的方法更直观,在这里做一些简单的尝试。记录的东西越多,帮助越大,可分析的内容也就越多。
    • 数据获取
    对数据可视化的第一步当然是获取原始数据,然后才能做数据结构化、数据分析、可视化等一系列的工作。为此,编写了一个简单的获取豆瓣数据的 R 包:Rdouban,仍然在逐步完善中。
    其中user_book_status函数是根据豆瓣用户的昵称获取自己的读书列表、标签、评论、读书笔记等信息。后面所使用的数据主要基于此函数获取的。比如获取本人的读书信息如下:
    qxde<-user_book_status(userid='qxde01',verbose=TRUE)

    返回的结果:

      • collect_tags:data.frame,已读书籍的标签
      • collect_df:data.frame,已读书籍的信息
      • do_tags:data.frame,在读书籍的标签
      • do_df:data.frame,在读书籍的信息
      • wish_tags:data.frame,想读书籍的标签
      • wish_df:data.frame,想读书籍的信息
      • reviews:data.frame,发表的书评
      • notes:data.frame,发表的读书笔记
      • collect_images:list,已读书籍的封面图片,分辨率为60x80

    函数user_book_viz是对user_book_status产生的数据的统计分析和可视化,包括下面的统计(不完全):
    • 阅读统计

    包括阅读概要统计、按月统计、按页数统计,概要统计如下图:

    豆瓣读书可视化尝试(上) - qxde01 - 平行宇宙

    • 书籍价格统计

    根据书籍定价,统计每年的价格总和。此处使用饼图显示。在collect_df中包含了作者、出版社、定价等信息,将其中的价格提取出来。不过有的书籍并没有价格,比如开源社区的免费书籍,需要做特殊处理。处理过程及饼图绘制如下:

    01 collect_df<-qxde$collect_df
    02 price<-as.numeric(collect_df$price)
    03 p_df<-data.frame(price=price,year=substr(collect_df$reading_date,1,4))
    04 py<-tapply(p_df$price,p_df$year,sum,na.rm = T)
    05 price_df<-data.frame(money=py,year=factor(names(py)))
    06 price_df<-price_df[price_df$money>0,]
    07 ##所读书籍定价饼图
    08 pie <- ggplot(price_df, aes(x = "",y=money, fill = year)) +
    09 geom_bar(stat="identity",width = 1) +
    10 geom_text(aes(y = money/2 + c(0, cumsum(money)[-length(money)]),
    11 label =paste0(money,'¥')),size=10)
    12 pie + coord_polar(theta = "y")+
    13 labs(x='',y='',title = paste0('总价值(>=)',sum(price,na.rm=T),'元')
    豆瓣读书可视化 - qxde01 - 平行宇宙
    • 标签云
    一般情况下,每阅读一本书,都会设定一些标签,代表这本书的类型。在获取到的数据list(上述数据名称qxde)中有一个元素名称为个collect_tags 的data.frame,它是所有阅读过书籍的标签及其使用频率。此处使用包 wordcloud 绘制标签云图,从下图可以看出,我阅读比较多的是科幻、数据分析、计算机、历史类。代码如下:
    1 library(wordcloud)
    2 collect_tags<-qxde$collect_tags
    3 par(bg='gray90')
    4 wordcloud(words=collect_tags$tag_label,
    5 freq=collect_tags$tag_freq, min.freq=1,
    6 random.order=F,scale=c(5,1.5), ordered.colors=F,
    7 colors=rainbow(length(table(collect_tags$tag_label))))
    8 title(main=paste0('所读书籍的标签'))
    豆瓣读书可视化 - qxde01 - 平行宇宙
    • 封面缩略图拼接
    豆瓣上大多数书籍都有一个封面图,其中collect_images是60X80的缩略图,然使用EBImage的combine函数合并图像,代码如下:
    1 library(EBImage)
    2 img<-combine(qxde$collect_images)
    3 display(img,method="raster",all=T)

    豆瓣读书可视化 - qxde01 - 平行宇宙
    • 书籍之间的图关系
    从collect_df中提取出书籍名称与对应的标签,并将之转化为两列“书名->标签”的data.frame. 使用igraph包绘制书籍、标签之间的关系图。上图为利用随机漫步社区发现方法walktrap.community绘制,下图利用力学导向的fruchterman.reingold算法绘制。两个图形中,节点大的为书籍名称,小的为标签。其中科幻类书籍比较集中,主要为大刘的作品,一类为政治经济类,一类历史类,其中数据分析、计算机及周边的学科这一类是重点,因为和所学专业和从事的工作相关。
    01 .todf<-function(x){
    02 x<-as.character(x)
    03 x<-gsub(taggg,'',c(x[1],x[2]))
    04 left=x[1]
    05 right<-unlist(strsplit(x[2],' '))
    06 right<-right[nchar(right)>0]
    07 right<-right[right!=left]
    08 left<-rep(left,length(right))
    09 cbind(left,right)
    10 }
    11 tag_list<-apply(collect_df[,c("title","user_tags")],1,.todf)
    12 n=length(tag_list)
    13 tag<-c()
    14 for(i in 1:n){
    15 tag<-rbind(tag,tag_list[[i]])
    16 }
    17 require(igraph)
    18 g<-graph.data.frame(tag,directed=F)
    19 title<-unique(collect_df$title)
    20 col=rep(2,length(V(g)$name))
    21 col[match(V(g)$name,title)]<-4
    22 vcex=col;vcex[vcex==4]=1.2;vcex[vcex==2]=1
    23 wc=walktrap.community(g)
    24 par(mar=rep(2,4))
    25 plot(wc,g,vertex.label=V(g)$name,vertex.size=col,edge.arrow.size=0.5)
    26 ### 力学导向的fruchterman.reingold关系图
    27 plot(g, layout=layout.fruchterman.reingold, vertex.size=col,
    28 vertex.label.dist=0, vertex.color=col+1,
    29 edge.arrow.size=0.5,vertex.label=V(g)$name,vertex.label.cex=vcex,
    30 vertex.label.color=col+2)

    豆瓣读书可视化 - qxde01 - 平行宇宙
    豆瓣读书可视化 - qxde01 - 平行宇宙
    还可以做一些其他方面的展示,比如平均每天阅读多少页、多少字等有趣的分析。前不久发现一个网站(DNA阅读)针对豆瓣读书有类似的分析和展示。在Rdouban中的函数主要获取的是电影、音乐、书籍的评论、笔记数据,比较适合做文本分析。



沪ICP备19023445号-2号
友情链接