大学の学部/学科名が短いほど偏差値は高いのか,を検証してみた

私が修士課程にいた頃,ある先生が「伝統的な大学で伝統的な学問をやってる所は学部と学科の名前が短いよね。最近できたばかり大学の学部は,横文字が入ったりして学部名がやたらと長い。」と仰ってました。

たしかに,旧帝大などの偏差値が高く由緒ある大学には「医」学部や「経済」学部など1,2文字の学部が目立つ一方で,歴史が浅く偏差値が低めの大学では「〇〇コミュニュケーション」学部や「〇〇こども教育」学部のように文字数の多い学部が目立つ印象があります。

今回は東進のホームページから各大学の偏差値などの情報を勝手にスクレイピングし,「大学の学部/学科の文字数」と「偏差値」の関係について簡単に分析してみました。

検証方法

データセットの作成

東進のウェブサイトの情報を利用します。様々な予備校のサイトがある中で,東進を選んだのは (1)学部名が省略されていない (2)スクレイピングしやすいサイトの構造をしている,という理由からです。

東進のサイトでは入試別に,国公立前期,国公立後期,私立の3タイプで大学偏差値が分類されていますが,今回は国公立前期私立のみ用います。

f:id:shinmee:20200519203046p:plain
偏差値一覧の一部

Rのrvestパッケージを用いて,国公立前期と私立に属する全大学の各学科,各学科の名称と偏差値をスクレイピングしました(コードは末尾に掲載)。

データ数は国公立前期が1146私立が2745となりました。

得られたデータに対し,学部と学科の文字数をそれぞれ以下のルールでカウントしました:

  • 漢字は平仮名に直さず,そのままカウントする
  • 中黒「・」は1文字とカウントする(例:「化学・バイオ工」学科は7文字)
  • 学科が空欄の場合は,学科の文字数は0文字とする (全体の約3%)
  • スペースは文字列から除く

最終的に,学部名と学科名の文字数を足し合わせ,その数を「学部学科 文字数」として用いました。

できあがったデータセットからランダムに100サンプル抽出したものがこちらになります。

偏差値 タイプ 大学名 学部名 学科名 分野 文字数
74 国公立前期 東京大学 理科三類 医学・薬学・歯学系 4
73 国公立前期 東京大学 文科一類 法・経済・経営・商系 4
72 国公立前期 東京大学 文科二類 法・経済・経営・商系 4
72 国公立前期 東京大学 文科三類 文・人文・人間系 4
72 国公立前期 京都大学 医学・薬学・歯学系 2

分析方法

国公立前期と私立の偏差値を同列に扱うことができないので,別々に分析を行いました。

それぞれ国立大前期,私立に対し,学部学科文字数と偏差値の関係を可視化し,単回帰分析を行いました。

検証結果

国公立前期の結果

Plotlyを用いて描いたjitter plotが下図です。パソコンからの閲覧であれば,カーソルを各点に合わせるだけで大学の情報が見えます。

図から,「学部学科の文字数が短いほど,偏差値が高い」という相関関係が読み取れます。

単回帰分析の結果,決定係数は0.11で,回帰係数は-0.48でした。つまり「学部学科の文字数が1文字少ない,偏差値が0.48高い」と解釈できます。

f:id:shinmee:20200520003030p:plain

推定値 t値
相関係数 -0.33
単回帰:切片 61.57 212.82
単回帰:傾き -0.48 -11.97

私立の結果

下の図と表から,私立でも文字数と偏差値の負の相関が見られます。しかし,国公立と比較すると,私立の方は関連の大きさが小さく,また回帰の当てはまりも悪いです(決定係数0.02)。

学部学科の文字数にかかわらず,偏差値が散らばっていることに起因していると考えられます。つまり,最近できた偏差値の低い大学にも短い名称の学部があるし,偏差値の高い大学にも長い名称の学部があるということです。

f:id:shinmee:20200520003105p:plain

推定値 t値
相関係数 -0.12
単回帰:切片 57.11 228.7
単回帰:傾き -0.21 -6.50

終わりに

検証の結果,特に国公立の大学で「大学の学部/学科名が短いほど偏差値は高い」傾向が見られました。

本当にどうでもいいことを検証したような気がしてますが,おそらく誰も検証したことなかったことだと思うので満足してます。

色々と考察ができそうですが,皆さんの想像におまかせします。

Plotly楽しい。

Rコード

東進のウェブサイトからのスクレイピング

library(rvest)
library(dplyr)
library(stringr)
library(tidyr)
library(magrittr)
library(readr)
library(purrr)
library(ggridges)
library(ggplot2)
library(plotly)
# url <- read_html("https://www.toshin-hensachi.com/?line=2&university_type=3")

result <- NULL
for(UNIV_TYPE in 1:3){
  for(i in  1:100){
    
    cat(UNIV_TYPE, i, "\n")
    url <- paste0("https://www.toshin-hensachi.com/?line=2&university_type=", 
              UNIV_TYPE, 
              "&sort=deviation&direction=desc&page=",
              i)
    
    url_html <- tryCatch(read_html(url), 
                     error = function(e){"error"})
    
    if(url_html == "error"){
      break
    }
    
    url_html %>% 
      html_table() %>%
      tibble() %>%
      unnest() %>%
      rename(deviation = "偏差値",
             univ_info = "大学情報") %>% 
      separate(univ_info, into = c("field", "empty1", "empty2", "univ_faculty_dept"), sep = "\n") %>%
      mutate(univ_faculty_dept = ifelse(str_detect(univ_faculty_dept, "偏差値"), empty2, univ_faculty_dept), 
             univ_faculty_dept = str_replace_all(univ_faculty_dept, "  ", "")) %>%
      separate(univ_faculty_dept, into = c("univ", "faculty_dept"), sep = " ") %>%
      separate(faculty_dept, into = c("faculty", "dept"), sep = "/") %>%
      select(univ, faculty, deviation, dept, field) %>%
      mutate(univ_type = case_when(UNIV_TYPE == 1 ~ "国公立前期",
                                   UNIV_TYPE == 2 ~ "国公立後期",
                                   UNIV_TYPE == 3 ~ "私立")) %>%
      bind_rows(result, .) -> result
  }
}

result %<>%
  mutate(dept = ifelse(is.na(dept), "", dept),
         fac_letter = str_length(faculty),
         fac_dept_letter = str_length(faculty) + str_length(dept)) %>%
  select(univ_type, univ, faculty, dept, fac_dept_letter, deviation, field) %>%
  rename(`偏差値` = deviation,
         `タイプ` = univ_type,
         `大学名` = univ,
         `学部名` = faculty,
         `学科名` = dept,
         `分野` = field,
         `学部学科 文字数` = fac_dept_letter) %>%
  filter(`タイプ` != "国公立後期")

Plotlyを用いたjitter plot


result %>%
  filter(`タイプ` == "国公立前期") %>%
  mutate(`大学` = paste(`大学名`, `学部名`, `学科名`, sep = " ")) %>%
  ggplot(aes(x = `学部学科 文字数`, y = `偏差値`)) +
  geom_jitter(aes(group = `大学`, color = `分野`), size = 0.9, alpha = 0.5, height = 0, width = 0.25) +
  # geom_violin(aes(group = `学部学科 文字数`)) +
  geom_smooth(aes(group = 1), method = "lm") +
  facet_wrap(~`タイプ`, scales = "free") +
  scale_x_continuous(breaks = seq(0, 25, 2)) +
  scale_y_continuous(breaks = seq(40, 80, 4)) +
  theme_bw(base_family = "HiraKakuPro-W3") +
  theme(panel.border = element_blank(),
        axis.line = element_line(color = "grey50", size = 0.2),
        axis.text.x = element_text(size = 8),
        axis.text.y = element_text(size = 8),
        axis.title.y = element_text(size = 9, margin = margin(t = 0, r = 10, b = 0, l = 0)),
        axis.title.x = element_text(size = 9),
        strip.background = element_blank(),
        strip.text = element_text(size = 9, face = "bold"),
        axis.ticks = element_blank(),
        panel.grid.major = element_blank(), 
        panel.grid.minor = element_blank(),
        legend.title = element_blank(),
        legend.position = "bottom",
        legend.text = element_text(size = 8),
        legend.spacing.x = unit(0.05, "cm"),
        legend.key.size = unit(0.2, "cm")) +
  labs(x = "学部学科 文字数",
       y = "偏差値") -> public
public <- ggplotly(public, originalData = FALSE)