知乎高分電影

知乎高分電影

5 人贊了文章

分析目的:

模仿練習【乾貨】-- 帶你抓取並分析知乎高評分電影,非常感謝作者提供的數據集和腳本。感興趣的朋友可以關注公眾號「每天進步一點點2015「獲取!此次分析目的是複習數據預處理和繪圖分析電影特徵。

分析過程:

1、數據&導入&理解&預處理

(選擇子集、列名重命名、刪除缺失數據、處理日期、數據類型轉換、排序)

2、數據分析/計算

-參評人數:

評人數最多的Top10的電影

評分人數和評分之間的關係

-電影國家:

一部電影需要多少國家合拍

電影產量Top10是哪些國家?

-電影類型:

電影主要都是什麼類型?

-評分

評分前Top5的電影類型

-年代

哪些年代的電影好評度比較高

1、數據導入&理解&預處理

> movies <- read.csv("E:/zuoye/shujufenxi/movies/movies.csv")

#movies數據集一共有6列,428行。其中包括以下變數:

> str(movies)data.frame: 428 obs. of 6 variables: $ movie_name : Factor w/ 428 levels "2001太空漫遊 (豆瓣)",..: 354 25 220 405 9 364 309 160 293 79 ... $ movie_url : Factor w/ 428 levels "http://link.zhihu.com/?target=https%3A//movie.douban.com/subject/10437779/",..: 61 18 65 145 104 142 407 304 114 376 ... $ score : num 9.6 9.5 9.5 9.4 9.4 9.4 9.4 9.3 9.3 9.2 ... $ evalue_users: int 723709 506132 346179 695350 606133 321285 159182 438794 143441 667332 ... $ year : int 1994 1993 1997 1994 1994 1993 2012 2008 1957 2010 ... $ other : Factor w/ 338 levels " / 阿根廷 / 美國 / 智利 / 秘魯 / 巴西 / 英國 / 德國 / 法國 / 冒險 / 傳記 / 劇情",..: 108 334 287 39 118 145 124 173 117 197 ...

#查看數據集前5行,發現other變數包含電影拍攝國家和類型,同時以「/」分割。

> head(movies,3) movie_name movie_url score evalue_users year1 肖申克的救贖 (豆瓣) http://link.zhihu.com/?target=https%3A//movie.douban.com/subject/1292052/ 9.6 723709 19942 霸王別姬 (豆瓣) http://link.zhihu.com/?target=https%3A//movie.douban.com/subject/1291546/ 9.5 506132 19933 美麗人生 (豆瓣) http://link.zhihu.com/?target=https%3A//movie.douban.com/subject/1292063/ 9.5 346179 1997 other1 / 美國 / 犯罪 / 劇情2 / 中國大陸 / 香港 / 劇情 / 愛情 / 同性3 / 義大利 / 劇情 / 喜劇 / 愛情

#對數據集中的other切割為country和type,以斜杠「/」作為字元串的分隔符:

> library(stringr)#http://blog.fens.me/r-stringr/> cut_other <- str_split(movies$other,"/")> head(cut_other,3)[[1]][1] " " " 美國 " " 犯罪 " " 劇情" [[2]][1] " " " 中國大陸 " " 香港 " " 劇情 " " 愛情 " " 同性" [[3]][1] " " " 義大利 " " 劇情 " " 喜劇 " " 愛情"

# 刪除所有空字元串

>cut_other <- sapply(cut_other, function(x) x[x != " "])> head(cut_other,3)[[1]][1] " 美國 " " 犯罪 " " 劇情" [[2]][1] " 中國大陸 " " 香港 " " 劇情 " " 愛情 " " 同性" [[3]][1] " 義大利 " " 劇情 " " 喜劇 " " 愛情"

#切割後的每個詞前後都有空格,剔除字元串中的收尾空格

> cut_other <- sapply(cut_other,str_trim)> head(cut_other,3)[[1]][1] "美國" "犯罪" "劇情"[[2]][1] "中國大陸" "香港" "劇情" "愛情" "同性" [[3]][1] "義大利" "劇情" "喜劇" "愛情"

完成數據切割和清洗後,接下來是從詞中抽取出國家或地區名稱存儲到一個變數,抽取電影類型存儲到另一個變數。

首先,前往搜狗官網下載所有國家和地區名稱的字典,再利用「深藍詞庫轉換」工具,將scel格式轉換成txt:

#讀取下載的國家和地區數據

# 此處而不能用read.table(),因為其返回數據框結構;只能用readLines(),可返迴向量結構;> country <- read.table("E:/zuoye/shujufenxi/movies/country.txt")> head(country,3) V11 阿爾巴尼亞2 阿爾及利亞3 阿富汗> class(country)[1] "data.frame"#用readLines()返迴向量結構> countries <- readLines(file.choose())> head(countries,3)[1] "阿爾巴尼亞" "阿爾及利亞" "阿富汗" > class(countries)[1] "character" #提取出所有關於電影拍攝國家的信息,%in%一種邏輯判斷,x%in%y表示x中元素是否和y一樣> library(dplyr)>movies_country <- sapply(cut_other, function(x,y) x[x %in% y], countries)>head(movies_country,3)[[1]][1] "美國"[[2]][1] "中國大陸" "香港" [[3]][1] "義大利"

#提取所有電影類型的信息

> movies_type <- sapply(cut_other,function(x,y) x[!x %in% y],countries)> head(movies_type,3)[[1]][1] "犯罪" "劇情"[[2]][1] "劇情" "愛情" "同性"[[3]][1] "劇情" "喜劇" "愛情"

#movies數據集一共有6列,428行。原來變數有movie_name 、movie_url、score、evalue_users、year 、other。如今other分割為movies_country和 movies_type。

2、數據分析/計算

-評論人數:

評論人數最多的Top10的電影

評論人數和評分之間的關係

-年代

哪些年代的電影好評度比較高

-電影國家:

一部電影需要多少國家合拍

電影產量Top10是哪些國家?

-電影類型:

電影主要都是什麼類型?

-評論人數:

①評論人數最多的Top10的電影

> library(plyr)> library(ggplot2)http://blog.csdn.net/u014801157/article/details/24372505#配置畫圖的數據,arrange(df,(var1),(var2)……)數據排序函數,對應order by,默認值升序http://blog.csdn.net/q383700092/article/details/64171202?locationNum=1&fps=1>p <- ggplot(data=arrange(movies,desc(evalue_users))[1:10,],#aes(圖形屬性):橫縱坐標、點的大小、顏色等;條形圖默認排序按x順序,reorder()更改x屬性 mapping=aes(x=reorder(movie_name,-evalue_users), y=evalue_users))+# 限制y軸的顯示範圍 coord_cartesian(ylim = c(500000,750000))+# 格式化y軸標籤的數值,seq序列函數,(from,to,by)或者(下界,by=間隔數,length=個數) scale_y_continuous(breaks = seq(500000,750000,100000),#從50萬到75萬,每個間隔10萬。 labels = paste0(round(seq(500000,750000,100000)/10000,2),"w"))+# 繪製條形圖,條形圖的高度即可表示數據集中變數的頻數,又可表示變數取值本身(y軸)。#stat(統計轉換)參數設置為"identity",即對原始數據集不做任何統計變換,而該參數的默認值為"count",即觀測數量。 geom_bar(stat = "identity",fill="steelblue",colour="darkred")+ #換填充色fill,邊框色colour,# 添加軸標籤和標題 labs(x=NULL,y="評價人數",title="評價人數最多的top10電影")+# 添加軸標籤和標題element_text()參數angle傾斜度;vjust垂直距離;hjust水平距離;face=字體格式 theme(axis.text.x = element_text(angle = 60,vjust = 0.5), plot.title = element_text(hjust = 0.5,colour = "red",face = "plain"))

②評論人數和評分之間的關係

> p <- ggplot(data=movies,mapping = aes(x=evalue_users,y=score))+# 設置坐標軸標籤和標題 coord_cartesian(xlim = c(30000,750000))+ scale_x_continuous(breaks = seq(30000,750000,100000), labels = paste0(round(seq(30000,750000,100000)/10000,2),"W"))+ scale_y_continuous(breaks = seq(8,9.6,0.2))+ labs(x="評論人數",y="評分結果",title="評分人數與評分的關係")+#繪製散點圖 geom_point(colour="brown")+#添加一元線性回歸擬合線 geom_smooth(method = "lm",colour="black")+#主題設置 theme(plot.title = element_text(hjust = 0.5, colour = steelblue, face = bold))

評論人數與評分之間存在正相關的關係,即評論的人越多,評分傾向於更高。

-年代

哪些年代的電影好評度比較高?

> library(stringr)# 根據年份的倒數第二位,判讀所屬年代> movies$yearS <- paste0(str_sub(movies$year,3,3),0,S)#對年代聚合group_by()函數、summarise()函數出自dplyr包 http://www.cnblogs.com/big-face/p/4863001.html>groupby <- group_by(movies,yearS)> yearS_movies <- summarise(groupby,counts=n())#繪圖y <- ggplot(data=yearS_movies, mapping = aes(x=reorder(yearS,-counts), y=counts))+#繪製條形圖 geom_bar(stat = "identity",fill="green")+# 添加軸標籤和標題 labs(x="年代",y="電影數量",title="各年代的好評電影數量")+# 主題設置 theme(plot.title = element_text(hjust = 0.5,colour = "red",face="bold"), panel.background = element_blank())

-電影國家:

①電影產量Top10是哪些國家?

> library(wordcloud2)# 羅列出所有電影的拍攝國家> top_countries <- unlist(movies_country)> head(top_countris,5)[1] "美國" "中國大陸" "香港" "義大利" "法國" # 頻數統計,並構造數據框> df <- as.data.frame(table(top_countries))> head(df,5) top_countries Freq1 阿根廷 42 阿聯酋 13 愛爾蘭 54 奧地利 55 澳大利亞 9# 降序排序> df <- arrange(df, desc(Freq))> head(df,10) top_countries Freq1 美國 2192 英國 573 日本 534 法國 465 香港 426 德國 387 中國大陸 288 韓國 239 義大利 1510 台灣 14# 運用文字雲對上面的數據進行可視化> wordcloud2(df,size=2,minRotation=-pi/6,maxRotation=-pi/6,color="random-light",rotateRatio = 1)

一部電影需要多少國家合拍

# 統計每一部電影合拍的國家數>movies_contain_country <- sapply(movies_country,length)>table(movies_contain_country)movies_contain_country 0 1 2 3 4 5 8 9 13 1 287 94 33 8 2 1 1 1#由於電影的製作包含5個國家及以上的分別只有1部電影,故將5個國家及以上的當做1組# 轉化為數據框> df <- as.data.frame(table(movies_contain_country))> df movies_contain_country Freq1 0 12 1 2873 2 944 3 335 4 86 5 27 8 18 9 19 13 1# 數據框變數的重命名names(df)[1] <- countries# 數據類型轉換df$countries <- as.numeric(as.character(df$countries))#數據分類df$countries <- ifelse(df$countries<=4, df$countries, 5+)# 聚合操作 > groupby_countries <- group_by(df,countries)> df <- summarise(groupby_countries, Freq = sum(Freq))# 數據類型轉換,便於後面可視化> df$countries <- factor(df$countries)> df# A tibble: 6 x 2 countries Freq <chr> <int>1 0 12 1 2873 2 944 3 335 4 86 5+ 5# 運用環形圖對上面的數據進行可視化# 定義數據,用於畫圖。cumsum()求累計和,返回一個向量,它的第i個元素是從想x[1]到x[i]的和> df$ymax <- cumsum(df$Freq)> df$ymin <- c(0,cumsum(df$Freq[-length(df$ymax)]))> labels <- paste0(df$countries,"(",round(df$Freq/sum(df$Freq)*100,2),"%",")")【不懂】> p<- ggplot(data = df, mapping = aes(xmin = 3, xmax = 4, ymin = ymin, ymax = ymax, fill = countries)) + # 繪製二維長方形 geom_rect(size = 5) + # 極坐標變換 coord_polar(theta = y) + # 環形圖 xlim(1,4) + # 添加標題 labs(x = NULL, y =NULL, title = 一部電影需要多少國家合作) + # 設置圖例 scale_fill_discrete(breaks = df$countries, labels = labels) + theme(legend.position = right, plot.title = element_text(hjust = 0.5, colour = brown, face = bold), axis.text = element_blank(), axis.ticks = element_blank(), panel.grid = element_blank(), panel.background = element_blank() )> p

-電影類型:

電影主要都是什麼類型?

#羅列出所有電影類型> top_type <- unlist(movies_type)#創建數據框> df <- as.data.frame(table(top_type))#降序> df <- arrange(df, desc(Freq))> df top_type Freq1 劇情 3412 愛情 963 喜劇 89……#去除第一行(劇情)類型> df <- df[-1,]> df$top_type <- as.character(df$top_type)#提取前15類型> df$top_type <- ifelse(df$top_type %in% df$top_type[1:15], df$top_type, 其他)> # 數據聚合> groupby_top_type <- group_by(df, top_type)> df <- summarise(groupby_top_type, Freq = sum(Freq))#降序> df <- arrange(df, desc(Freq))#創建數值標籤> labels <- paste(round(df$Freq/sum(df$Freq)*100,2),%)> q <- ggplot(data=df,mapping=aes(x=reorder(df$top_type,Freq),y=Freq))+#添加軸標籤 labs(x = 電影類型, y = 電影數量, title = top15的電影類型) + #重組x軸標籤 scale_x_discrete(limits = c(df$top_type[df$top_type!=其他],其他))+#繪製條形圖 geom_bar(stat = "identity",fill="grey")+#添加文字標籤 geom_text(aes(label=labels),size=3,colour="black", position = position_stack(vjust=0.5),angle=30)+ theme(plot.title = element_text(hjust = 0.5,colour = "steelblue",face="bold"),panel.background = element_blank())> q

-前三名的電影類型分別為愛情喜劇和犯罪.


推薦閱讀:

救救人到中年的約翰尼·德普?
2018上海迪士尼兩日游個人攻略 No.2
小李子將主演達芬奇傳記電影
《小偷家庭》:一個願拐一個願挨
擅自演播小說並製成音頻節目,並未侵犯改編權

TAG:數據分析 | 電影 |