標籤:

Python類圖書數據分析

在上一篇文章中,已經利用網路爬蟲從噹噹網自營圖書中爬取了Python類圖書的商品數據。在這篇文章中就這些商品數據進行分析。

在分析之前,有必要做而且必須做好的工作就是數據清洗,為了避免文章過於冗長,更好地突出重點,就不對數據清洗進行展開,如果需要數據清洗的代碼,可以給我留言。

分析所使用數據的簡要說明如下:

出版年份

數據清洗後,噹噹網自營圖書中,Python類圖書共179本(這個數會隨著商品調整而變化)。查看這些書的出版年份,近4年(2014年至2017年)出版的圖書佔到了現售圖書數量的80%。

抓取數據的時間正值2017年年中,姑且預計2017年下半年出版的圖書數量與上半年持平,那麼,到2017年年末,2017年出版的圖書數量將遙遙領先。

可見,Python類書籍新書數量逐年增加,增速迅猛。這與Python越來越受追捧,熱度逐年驟升有密切的關係。

查看2012年至2017年,每年年中那周的周平均百度指數,與相應年份的圖書出版量趨勢有較強的協同性。(由於一些早年出版的圖書已經停止售賣,所以數據中較早年份的出版數量比當年實際出版數量會少一些。)

代碼如下:

#載入包library(data.table)library(xlsx)library(sca)library(ggplot2)library(plotrix)library(reshape2)library(corrplot)library(rJava)library(jiebaR)library(jiebaRD)library(cidian)library(wordcloud2)library(RColorBrewer)#讀取整理好的數據data<-fread("D:/data.csv", select=c("bookname","pub_year","author_source","press", "price","comment","recommend"))#按出版年份統計書籍數量yearcount<-setorder(data[,.(count=length(bookname), prop=length(bookname)/nrow(data)), by=pub_year], -count)yearcount<-yearcount[,.(pub_year,count,prop, cum_prop=cumsum(prop), cum_pre=percent(cumsum(prop),d=2))]#條形圖yearcount_p<-yearcount[,"f":="actual"]yearcount_p<-rbind(yearcount_p, data.frame(pub_year=2017, count=yearcount$count[yearcount$pub_year==2017], prop=NA,cum_prop=NA,cum_pre=NA,f="forecast"))yearcount_p<-yearcount_p[,:=(year=paste0(pub_year,"年"), lable_y=cumsum(count)), by=pub_year]yearcount_p<-transform(yearcount_p, year=factor(year,ordered=T, levels=unique(yearcount_p$year)), f=factor(yearcount_p$f,ordered=T, levels=c("forecast","actual")))ggplot(yearcount_p,aes(x=year,y=count,fill=f,linetype=f))+ theme(panel.background=element_rect("white"))+ theme(panel.border=element_blank())+ theme(panel.grid.major.y=element_blank(),panel.grid.minor.y=element_blank())+ geom_bar(stat="identity",colour="steelblue2",width_=0.7)+ scale_fill_manual(values=c("white","steelblue2"),guide=F)+ scale_linetype_manual(values=c(2,1),guide=F)+ geom_text(aes(y=lable_y,label=lable_y),hjust=-0.5,colour="steelblue2")+ scale_x_discrete(limits=rev(levels(yearcount_p$year)))+ theme(axis.ticks=element_blank())+ geom_vline(xintercept=7.5,colour="red",size=1.5)+ geom_vline(xintercept=9.5,colour="red",size=1.5)+ annotate("text",x=7.8,y=95,label="80%",colour="red")+ annotate("text",x=9.8,y=95,label="60%",colour="red")+ coord_flip()#百度指數index<-read.xlsx2("index.xlsx",1, colClasses=c("numeric","numeric","character"))data_cor<-merge(yearcount[pub_year>=2012,.(pub_year,count)], index[,c("year","baidu_index")], by.x="pub_year",by.y="year") data_cor$count[data_cor$pub_year==2017]<-data_cor$count[data_cor$pub_year==2017]*2#書籍數量及百度指數趨勢圖twoord.plot(lx=data_cor$pub_year,ly=data_cor$count, rx=data_cor$pub_year,ry=data_cor$baidu_index, xlab="year",ylab="count",rylab="baidu_index", type="b",lwd=3,font.axis=2, axislab.cex=0.9, lcol="steelblue2",lpch=20,rcol="navy",rpch=19, xtickpos=data_cor$pub_year, xticklab=paste0(data_cor$pub_year,"年"), lylim=c(0,90),rylim=c(0,15000))legend("topleft",c("count","baidu_index"),pch=(19),col=c("steelblue2","navy"), bty="n",x.intersp=0.8,cex=0.8)

作者來源

不少國外的python書籍被翻譯並引入了中國,這些書籍成為中國Python學習者強有力的學習資料;同時,也有一些中國的Python高手出版了圖書。按作者劃分,中文原版、外國譯著成為了Python圖書的兩大來源。(在爬取的噹噹自營Python類圖書中不含外國原版圖書。)

從總體來看,這兩大來源的圖書所佔比例差異不大,外國譯著比例略高於中文原版。

分年份來看,近幾年(2014年及以後)雖然兩大來源圖書的數量都在增加,但中文原版的比例逐年上升,外國譯著的比例逐年下降。猜想,這也許和中國作者實力的增強和數量的增多有關係。(當然也不排除出版政策和經濟等多方面因素的影響。)

代碼如下:

#作者來源統計authordis<-setorder(data[,.(count=length(bookname), prop=length(bookname)/nrow(data), pre=percent(length(bookname)/nrow(data),d=2)), by=author_source], -count)#按出版年份統計作者來源authorcount<-setorder( data[,.(origin=sum(author_source=="中文原版"), translation=sum(author_source=="外國譯著"), origin_prop=sum(author_source=="中文原版")/length(bookname), translation_prop=sum(author_source=="外國譯著")/length(bookname), origin_pre=percent(sum(author_source=="中文原版")/length(bookname),d=2), translation_pre=percent(sum(author_source=="外國譯著")/length(bookname), d=2) ), by=pub_year], pub_year)#2014年及以後,作者來源比例百分比條形圖attach(authorcount)authorcount_p<-melt(authorcount[pub_year>=2014,], id.vars="pub_year", measure.vars=c("origin","translation"), variable.name="source",value.name="count")detach(authorcount)authorcount_p$source<-ifelse(authorcount_p$source=="origin","中文原版","外國譯著")authorcount_p<-authorcount_p[,:=(prop=count/sum(count), pre=percent(count/sum(count),d=2), lable_y=cumsum(count/sum(count))), by=pub_year]authorcount_p$source<-factor(authorcount_p$source, ordered=T, levels=c("外國譯著","中文原版"))ggplot(authorcount_p,aes(x=pub_year,y=prop,fill=source))+ theme(panel.background=element_rect("white"))+ theme(panel.border=element_blank())+ geom_bar(stat="identity",width_=0.7)+ scale_fill_manual(values=c("mediumturquoise","steelblue2"))+ scale_x_continuous(breaks=2014:2017,labels=paste0(2014:2017,"年"))+ scale_y_continuous(breaks=seq(0,1,0.1),labels=paste0(seq(0,100,10),"%"))+ geom_text(aes(y=lable_y,label=pre),hjust=1.1)+ theme(axis.ticks=element_blank())+ guides(fill=guide_legend(reverse=T))+ guides(fill=guide_legend(title=NULL))+ theme(legend.position="bottom")+ coord_flip()

出版社

查看出版社的分布,Python類圖書相對集中於幾家出版社,其他出版社只有少量分布。

人民郵電出版社、機械出工業版社、電子工業出版社、清華大學出版社、東南大學出版社這五家出版社大戶貢獻了現售圖書總量的九成。為了便於分析,將除這五家以外的出版社歸為其他出版社(創建press_class變數)。

代碼如下:

#出版社分布pressdis<-setorder(data[,.(count=length(bookname), prop=length(bookname)/nrow(data)), by=press], -count)pressdis<-pressdis[,.(press,count,prop, cum_prop=cumsum(prop), cum_pre=percent(cumsum(prop),d=2))]#將出版社歸為大類data$press_class<-ifelse(!(data$press %in% c("人民郵電出版社", "機械工業出版社", "電子工業出版社", "清華大學出版社", "東南大學出版社")), "其他出版社", data$press)press_classdis<-setorder(data[,.(count=length(bookname), prop=length(bookname)/nrow(data), pre=percent(length(bookname)/nrow(data),d=2)), by=press_class], -count)#出版社分布圖with(press_classdis,{ l<-c(which(press_class!="其他出版社"),which(press_class=="其他出版社")) pie(count[l], labels=paste(press_class[l],pre[l],sep="
"),,cex=0.8,clockwise=T,
col=c("steelblue4","steelblue","steelblue3", "steelblue2","steelblue1","gray"))})

圖書定價

圖書實際售價受營銷活動影響較大,經常發生變動,採用圖書的定價更穩定、也更能體現圖書本身的價值。

從圖書定價的分布特徵和直方圖中可以看到基本的分布特徵,最低定價22元,最高定價198元,價格中位數為65元(為了減少極端值的影響,用中位數來表徵定價的集中趨勢),有一半的圖書定價集中在49元至79元之間。

分別看一下不同作者來源的圖書的定價分布

中文原版和外國譯著的25%分位數、75%分位數均相同,但外國譯著的中位數價格高出中文原版圖書中位數將近10元。也就是說這兩種不同作者來源的圖書均有一半集中於49元至79元之間,但在這價格區間內,外國譯著圖書的價格要相對高一些。從它們的密度曲線中也能看到這一點。

這個結果是由多種因素(出版年份、出版社、製作成本、營銷策略、供求關係、政策等)及其交互作用決定的,現有信息不足以明確解釋。

代碼如下:

#價格的主要分布參數pricedis<-data[,.("min"=min(price), "qu_25%"=quantile(price,probs=0.25), "med"=median(price), "qu_75%"=quantile(price,probs=0.75), "max"=max(price), "mean"=mean(price), "sd"=sd(price))]#價格直方圖ggplot(data,aes(x=price))+ geom_histogram(fill="steelblue2",colour="navy", boundary=0,binwidth_=8,position="identity")+ scale_x_continuous(limits=c(0,200),breaks=seq(0,200,40), labels=paste0("¥",seq(0,200,40)))+ scale_y_continuous(limits=c(0,40),breaks=seq(0,40,10),labels=seq(0,40,10))+ theme(axis.ticks=element_blank())#按作者來源,查看價格g<-function(df,x,y){ d<-setorder(df[,.("min"=min(get(x)), "qu_25%"=quantile(get(x),probs=0.25), "med"=median(get(x)), "qu_75%"=quantile(get(x),probs=0.75), "max"=max(get(x)), "mean"=mean(get(x)), "sd"=sd(get(x))), by=get(y)], get) names(d)[1]<-y return(d)}pricecount_source<-g(data,"price","author_source")#分作者來源,價格箱線圖ggplot(data[data$pub_year>=2014,],aes(x=factor(author_source),y=price))+ geom_boxplot(fill="steelblue2")+ stat_summary(fun.y="mean",geom="point",shape=23,size=2,fill="yellow")+ scale_y_continuous(breaks=seq(0,200,50),labels=paste0("¥",seq(0,200,50)))+ theme(axis.ticks=element_blank())+ xlab("author_source")+ coord_flip()#分作者來源,價格密度曲線ggplot(data,aes(x=price,colour=author_source))+ geom_line(stat="density",adjust=2,size=1.5)+ scale_colour_manual(values=c("mediumturquoise","steelblue2"))+ scale_x_continuous(limits=c(0,200),breaks=seq(0,200,40), labels=paste0("¥",seq(0,200,40)))+ scale_y_continuous(breaks=seq(0,0.02,0.005), labels=percent(seq(0,0.02,0.005),d=2))+ theme(axis.ticks=element_blank())+ guides(fill=guide_legend(reverse=T))+ guides(colour=guide_legend(title=NULL))+ theme(legend.position=c(0.9,0.9))+ theme(legend.background=element_blank())+ theme(legend.key=element_blank())

數據分析——圖書文字簡介

對於多數圖書,網頁上會有一段介紹,使顧客在短時間內了解到該書的特點。將這些圖書簡介收集起來做成詞雲,看一下Python類圖書的關鍵詞有哪些,從一個側面了解一下Python類圖書的風格。

代碼如下:

#設置中文停止詞詞庫wk<-worker(stop_word=stop_word1893.txt)#提取文本recommend<-data$recommend#去除文本中的數字及英文字母recommend<-gsub("[0-9a-zA-Z]+","",recommend)#分詞h<-function(x){ return<-segment(x,wk)}words_all<-lapply(recommend,h)#所有評論的雲圖w<-function(x){ words<-unlist(x) words<-words[words!=" "&words!=""] words<-words[nchar(words)>1] word<-freq(words) word<-word[order(word$freq,decreasing=T),] rownames(word)<-1:nrow(word) return(word)}word_w<-w(words_all)#製作詞雲cloud_w<-word_w[1:floor(0.15*nrow(word_w)),]wordcloud2(cloud_w,size=1, color=gray((200:1)/200), backgroundColor="black", minRotation=0,maxRotation=0, ellipticity=0.95, figPath="pic.jpg")

需要說明的是,數據分析的結果很大程度上由所使用的數據決定的,這篇文章所使用的數據只是某日期某個平台上抓取得到的,有一定局限性。寫這篇文章也是本著學習和實踐的目的,其中的分析結果並不一定說明實際情況。


推薦閱讀:

學習數據分析的體會和收穫
雲課堂Excel課程數據可視化分析
數據可視化:打造高端的數據報表

TAG:数据分析 |