#WaterCellTechNightで話をするためにAtCoderの使用言語ランキングを作成したので、方法と結果を紹介します。
(ちなみにAtCoderの話は特にしていません > Project Eulerの話)
データソース
kenkoooo/AtCoderProblems: Problem manager for AtCoder usersで公開されているAPIからAccepted Count for each languageを読み込みました。
Rパッケージ
データの読み込みにrlist
、加工にdplyr
、可視化にggplot2
を使いました。
library(rlist)
library(dplyr)
library(ggplot2)
データの読み込み
list.load()
で読み込み、list.stack()
でデータフレームにしました。
list.load("https://kenkoooo.com/atcoder/resources/lang.json") %>%
list.stack() -> ac_lang
JSONの構造が簡単だったので、実際のところrlist
の機能を使う必要はありませんでした。次のように、jsonlite::read_json()
をsimplifyVector = TRUE
で使用しても良いと思います。
jsonlite::read_json("https://kenkoooo.com/atcoder/resources/lang.json", simplifyVector = TRUE)
集計
各言語について、使用者数、AC合計、AC平均(AC合計/使用者数)を求めました。
ac_summary <- ac_lang %>%
group_by(language) %>%
summarise(
使用者数 = n(),
AC合計 = sum(count),
AC平均 = round(AC合計 / 使用者数, 2)
)
可視化
plot_ac <- function(target){
target <- rlang::enquo(target)
ac_summary %>%
ggplot(aes(x = reorder(language, !!target), y = !!target)) +
geom_col() +
coord_flip() +
xlab("Language") +
ylab(target) +
theme_classic(base_family = "IPAexGothic")
}
まず使用者数をカウントしてみました。
plot_ac(使用者数)
やはりC++が強いですね。その他も上位はメジャーな言語が占めているようです。
ところでTextの高順位がちょっと気になります。おそらく提出テストに使っている人がそこそこ居るのでしょう。
そこで、少し工夫してメインの使用言語を集計して、同じように可視化してみました。
ac_lang %>%
group_by(user_id) %>%
summarise(language = language[which.max(count)]) %>%
ungroup() %>%
count(language, sort = TRUE) %>%
ggplot(aes(x = reorder(language, n), y = n)) +
geom_bar(stat = "identity") +
coord_flip() +
xlab("Language") +
ylab("使用者数(メイン言語)") +
theme_classic(base_family = "IPAexGothic")
Textの順位が落ち着きました。おそらくこちらのほうが実情に近いのではないでしょうか。
次に、ACの平均をプロットしてみました。
plot_ac(AC平均)
ユーザーあたりのAC数平均を求めると、意外な言語が上位に来たりして面白いですね。
AtCoderの他に、Project Eulerについても同様に可視化を行ったのですが、以前実施したときとほとんど同じだったので、Project Eulerについては前回の記事をご覧ください。