LoginSignup
52
48

More than 5 years have passed since last update.

週間少年ジャンプの掲載順位データを作る(Rで)

Last updated at Posted at 2015-07-26

週間少年ジャンプの掲載順位データを作る(Rで)

はじめに

ジャンプの掲載順位データを可視化するという素敵な記事がありました。

ジャンプの掲載順位データという大変素敵なHPから、pythonのbeautifulsoupでスクレイプしてデータを可視化する、といった内容でした。

同じことを、Rでやってみます。

作成されたデータはGistにあります。

データの取得

スクレイプはrvestで、文字列処理はstringiでゴリゴリやりましょう。

まずはパッケージの準備。

library(dplyr)
library(stringi)
library(rvest)
library(data.table)
## 結果を入れるデータテーブル
jump_data = data.table(NULL)

## データがあるのは、1999年から2015年まででした。
for(year in 1999:2015) {
  ## リンクがまとまっているページのurl
  link_page =
    paste("http://hamada.tsukaeru.info/jump/", year, "/jump", year, ".html", sep="")
  link_page_html = html(link_page)

  ## アドレスを整形
  page_htmls = 
    link_page_html %>% 
    html_nodes(xpath="/html/body/ul/li/a") %>%
    html_attr("href") %>%
    stri_replace_all_regex("^./", paste("http://hamada.tsukaeru.info/jump/", year, "/", sep=""))

  ## ページの取得を行う
  for (page_html in page_htmls){
    ## 取得するページ
    print(page_html)
    jump_html = html(page_html) 

    ## 順位表を取得
    jump_table = 
      jump_html %>% 
      html_node(xpath="/html/body/table") %>% 
      html_table

    ## 年、号を取得
    jump_title_year_num = 
      jump_html %>% 
      html_node(xpath="/html/body/h2[1]")%>%
      html_text() %>% 
      stri_extract_all_regex(pattern = "\\d+") %>%
      unlist

    ## データの整形
    ## 掲載場所が書いてある列を知るために、表のサイズを取得
    jump_table_colnum = dim(jump_table)[2]
    jump_name_place = 
      jump_table %>%
      select(3, jump_table_colnum-1)
    ## 列名を英語で
    jump_name_place %>% setnames(c("name", "place"))
    ## 年、号、作品名、掲載順位というデータテーブルにします。
    jump_name_place_data = 
      jump_name_place %>%
      mutate(year = jump_title_year_num[1], 
             volume  = jump_title_year_num[2]) %>%
      select(year, volume, name, place)
    ## 結合
    jump_data = rbind(jump_data, jump_name_place_data)
    ## 今の年、号
    print(jump_title_year_num)
  }
}
## write.csv(jump_data, "jump_data.csv")

最後にちょっとだけゴミ掃除と調整。

ジャンプには合併号があるので、注意が必要です。

年間の通し番号を、新しく作っておきます。号数の歯抜けがなくすためです。

## 出来たデータ使います 
jump_data = fread("jump_data.csv")
jump_data = 
  jump_data %>% 
  mutate(year = as.integer(year), volume = as.integer(volume)) %>%
  filter(!stri_detect_regex(name, pattern ="新連載作品")) 

## 合併号のところで、volumeが歯抜けになっていますので、
## volumeを、年ごとの通し番号にします。
jump_volume_data = 
  jump_data %>% 
  select(year, volume) %>%
  distinct(year, volume) %>% 
  group_by(year, add=FALSE) %>% 
  arrange(volume) %>% 
  mutate(volume_modified = row_number(.)) %>%
  ungroup()

## volumeを修正したものを反映させます
jump_data_modified = 
  jump_data %>%   merge(jump_volume_data, by = c("year", "volume")) %>% 
  select(year, volume_modified, name, place)

## 保存しておきます
jump_data_modified %>%
  write.csv("jump_data_modified.csv", 
            quote=FALSE, row.names=FALSE)

これで準備が整いました。

内容を確認してみます.

食戟のソーマの掲載順位を見てみます.

## 食戟のソーマの掲載順位推移
jump_data_modified %>%
  filter(name == "食戟のソーマ")
## Source: local data table [115 x 4]
## 
##    year volume_modified         name place
## 1  2012              48 食戟のソーマ     1
## 2  2013               1 食戟のソーマ    13
## 3  2013               2 食戟のソーマ    12
## 4  2013               3 食戟のソーマ     8
## 5  2013               4 食戟のソーマ    13
## 6  2013               5 食戟のソーマ    14
## 7  2013               6 食戟のソーマ     6
## 8  2013               7 食戟のソーマ     4
## 9  2013               8 食戟のソーマ     9
## 10 2013               9 食戟のソーマ    11
## ..  ...             ...          ...   ...

最初の方は調子が悪かったみたいですね.

掲載順位の可視化

掲載順位の可視化をやってみます.

食戟のソーマの、掲載順位の推移を見てみましょう。

library(ggplot2)
jump_data_modified %>% 
  filter(name == "食戟のソーマ") %>% 
  as.data.frame() %>%
  mutate(num = row_number()) %>%
  ggplot() +  
  geom_line(aes(x=num, y = as.integer(place))) + 
  scale_y_reverse() + 
  theme_bw(base_family = "HiraKakuProN-W3") + 
  ggtitle("食戟のソーマ 掲載順位の推移") + 
  ylab("掲載順位") + xlab("話数")

unnamed-chunk-5-1.png

ちゃんとできているみたいですね。

順位が落ちた回

急に順位が落ち込んだ箇所が気になります.

第何回で順位が落ちているか、調べてみましょう。

jump_data_modified %>% 
  filter(name == "食戟のソーマ") %>% 
  as.data.frame() %>%
  mutate(num = row_number()) %>%
  mutate(place = as.integer(place)) %>% 
  arrange(desc(place)) %>% 
  head(10)
##    year volume_modified         name place num
## 1  2013               5 食戟のソーマ    14   6
## 2  2013               1 食戟のソーマ    13   2
## 3  2013               4 食戟のソーマ    13   5
## 4  2013               2 食戟のソーマ    12   3
## 5  2013              43 食戟のソーマ    12  44
## 6  2014              16 食戟のソーマ    12  65
## 7  2015               5 食戟のソーマ    12 102
## 8  2013               9 食戟のソーマ    11  10
## 9  2013              11 食戟のソーマ    11  12
## 10 2013              13 食戟のソーマ    11  14

最近だと、第102回で順位が落ちています。

手元の単行本で確認してみると、101回は秋の選抜決勝、創真が「ぬかさんまの炊き込みご飯」をサーブする回でした。

どうせ最後に汁をぶっかけるんだろ早くしろよ、って感じでしたね。

HUNTERxHUNTERの掲載順位

最後に、最近の100号分のジャンプで、HUNTERxHUNTERの掲載順位の推移を見てみましょう.

jump_data_modified %>% 
  filter(name == "HUNTER×HUNTER") %>% 
  mutate(place_mod = as.integer(place)) %>% 
  tail(100) %>% 
  mutate(num = row_number()) %>% 
  as.data.frame() %>%
  ggplot() +  
  geom_line(aes(x=num, y = as.integer(place_mod))) + 
  scale_y_reverse() + 
  theme_bw(base_family = "HiraKakuProN-W3") + 
  xlab("最近100号のジャンプ") + 
  ylab("掲載順位") + 
ggtitle("HUNTERxHUNTERの掲載順位") + 
ylim(1,20) + 
scale_y_reverse() 

unnamed-chunk-7-1.png

仕事しろ

まとめ

ジャンプの掲載順位データを整形してみました。

生存時間解析とかやってみたいですね。

以上です。


この投稿はGithub :point_right: Qiitaから投稿されました。

52
48
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
52
48