はじめに
GitHubのプロフィールページにも草(Contribution Graph)はありますが、詳細なコミット数やリポジトリの傾向など活動内容までは分かりませんよね。
R言語の勉強も兼ねて、R言語とGitHub APIを使用しGitHub活動内容を可視化してみました。
毎月1日にGitHub Actionsで自動更新される仕組みも作ったので、その実装もあわせて紹介しようと思います。
開発環境セットアップ(Windows環境)
以下の環境で動作確認しています。
- R: 4.4.0
- RStudio
リポジトリのクローンと依存パッケージのインストール
git clone git@github.com:ishi720/GithubDashboard.git
cd GithubDashboard
このプロジェクトでは renv でパッケージ管理をしています。Rコンソールで以下を実行するだけで、必要なパッケージが一括インストールされます。
renv::restore()
使用している主なパッケージは以下のとおりです。
| パッケージ | 用途 |
|---|---|
gh |
GitHub API の呼び出し |
ggplot2 |
グラフの描画 |
dplyr / tidyr
|
データの集計・整形 |
RColorBrewer |
カラーパレット |
lubridate |
日付・タイムゾーンの操作 |
ggwordcloud |
ワードクラウドの生成 |
jsonlite |
JSON出力 |
GitHub認証の設定
GitHub APIを呼び出すために、Personal Access Token(PAT)が必要です。.Renviron ファイルに以下のように記載します(このファイルは .gitignore に含まれているので誤ってコミットする心配はありません)。
GITHUB_PAT=ghp_xxxxxxxxxxxxxxxxxx
config.R の設定
config.R で分析対象ユーザー名と出力先を設定します。
TARGET_USERを書き換えるだけで使えます。
また、グラフで公開されると困る場合はプライベートリポジトリを含めないように設定できます。
# 分析対象のGitHubユーザー名
TARGET_USER <- "ishi720"
# 出力ディレクトリ
OUTPUT_DIR <- file.path(getwd(), "Documents")
# プライベートリポジトリを含めるかどうか
INCLUDE_PRIVATE_REPOS <- FALSE
コード
いくつかのRスクリプトを作成しました。
各スクリプトを実行することで、集計結果をアウトプットできます。
| スクリプト | 内容 |
|---|---|
LanguageAnalysis.R |
言語別コード量(バイト数)の集計 |
CommitAnalysis.R |
月別・曜日別・時間帯別コミット数の集計 |
Repoanalysis.R |
リポジトリ作成数の年月別推移 |
RepoListExport.R |
リポジトリ一覧のJSON出力 |
TagAnalysis.R |
リポジトリトピックのワードクラウド |
IssuesAnalysis.R |
Issue作成数・解決数の集計 |
出力部分
各スクリプトで共通している出力のパターンは以下のような感じです。
# config.R を読み込んで OUTPUT_DIR を取得
source("config.R")
# グラフ作成
p <- ggplot(df, aes(x = month, y = commits)) +
geom_bar(stat = "identity", fill = "#4A90D9") +
theme_minimal()
# 保存
ggsave(file.path(OUTPUT_DIR, "commits_by_month.png"), p,
width = 12, height = 6, dpi = 150)
ggsave() で PNG に書き出し、Documents/ フォルダにまとめて保存します。
コミット取得時のポイント:タイムゾーン変換
GitHub API はコミット日時を UTC で返しますが、活動パターンを分析するなら日本時間(JST)に変換しておく必要があります。
commit_date_utc <- as.POSIXct(
commit$commit$author$date,
format = "%Y-%m-%dT%H:%M:%SZ",
tz = "UTC"
)
# UTCからJSTへ変換
commit_date <- with_tz(commit_date_utc, tzone = "Asia/Tokyo")
GitHub Actionsで定期実行する際に、深夜帯のコミットが翌日にカウントされたりして、曜日・時間帯分析がズレてしまいます。
READMEに直接出力した画像のリンクを貼る
保存した画像をREADMEに表示するには、GitHubのrawコンテンツのURLを使います。
<img src="https://raw.githubusercontent.com/ishi720/GithubDashboard/refs/heads/main/Documents/commits_heatmap.png" />
Documents/ に保存された画像をそのままREADMEに貼ることで、リポジトリのトップページがダッシュボードとして機能します。
GitHub Actionsで自動化
毎月1日 09:00(JST)に全スクリプトを自動実行し、結果を自動コミット・プッシュする仕組みを .github/workflows/monthly-update.yml に定義しています。
on:
schedule:
- cron: '0 0 1 * *' # 毎月1日 UTC 0:00 = JST 9:00
workflow_dispatch: # 手動実行も可能
jobs:
update-dashboard:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: r-lib/actions/setup-r@v2
with:
r-version: '4.4.0'
- name: Install R packages
run: |
Rscript --vanilla -e 'install.packages(c("gh", "ggplot2", "dplyr", "scales", "RColorBrewer", "lubridate", "tidyr", "ggwordcloud"), repos = "https://cran.r-project.org")'
- name: Create output directory
run: mkdir -p Documents
- name: Run Language Analysis
run: Rscript --vanilla LanguageAnalysis.R
- name: Run Commit Analysis
run: Rscript --vanilla CommitAnalysis.R
- name: Run Repository Analysis
run: Rscript --vanilla Repoanalysis.R
- name: Run RepoListExport Analysis
run: Rscript --vanilla RepoListExport.R
- name: Run Tag Analysis
run: Rscript --vanilla TagAnalysis.R
- name: Run Issues Analysis
run: Rscript --vanilla IssuesAnalysis.R
- name: Commit and push
run: |
git config user.name "github-actions[bot]"
git add Documents/
git diff --staged --quiet || git commit -m "Monthly dashboard update - $(date +'%Y-%m-%d')"
git push
グラフの分析
実際に出力されたグラフをいくつか紹介します。
言語別コード量
書いた言語ごとのバイト数を集計しています。書いた量の多さというのも指標にはなりますが、きれいに書けばバイト数は少なくなるはずなので無駄なコードをリファクタリングしてバイト数を減らす楽しみも増えました。
月別・言語別コミット数
月ごとにどの言語を触っていたかが積み上げ棒グラフで確認できます。自分自身の開発言語の興味が可視化されました。
コミット時間帯ヒートマップ
曜日×時間帯のヒートマップです。平日だと週初めのせいか、月曜火曜のコミット量の多くなる傾向がありそうです。
年別リポジトリ作成数
年ごとのリポジトリ作成数の推移です。年々増えてきているのでアイディアを形にする力が上がってきていると読み取れますね。
トピック ワードクラウド
リポジトリに設定したトピック(タグ)の出現頻度をワードクラウドで表示します。 ワードクラウドを育てていく感じでモチベーションが上がります。
おわりに
R言語とGitHub APIを利用して自分のGitHub活動内容を可視化できました。
また、GitHub ActionsでREADMEに自動反映されるので、1度セットアップすれば放っておいても最新状態を保てて便利です。
自分のGitHub活動を可視化したい方はぜひ試してみてください!
ここまで読んで頂きありがとうございました。





