GitHubの地図
(github.com/anvaka)- Map of GitHubは、69万件以上のGitHubプロジェクトを点として配置した地図で、共通のstargazerが多いプロジェクトほど互いに近く配置されます
- 地図作成にはGoogle BigQueryのGitHubアクティビティイベント公開データセットが使われ、2011年2月から2025年5月までのイベントから約5億件のstarデータを使用しています
- リポジトリ間の関係計算には正確なJaccard Similarityが使われ、24GB RAMの家庭用コンピューターでは足りず、512GB RAMのAWS EC2インスタンスで数時間かけて処理しました
- クラスタリングでは複数のアルゴリズムを試した後、Leiden clusteringを採用し、結果として約69万件のプロジェクトが1,500以上のクラスターに分けられました
- レンダリングは独自のレイアウトツールとmaplibre、GeoJSON、tippecanoeを組み合わせて実装され、国名ラベルの多くはChatGPTの助けで生成されています
プロジェクト概要
- Map of GitHubは、69万件以上のGitHubプロジェクトを可視化した地図です
- 各点は1つのプロジェクトを表します
- 共通してstarを付けたユーザーが多いプロジェクト同士ほど、地図上でより近くに配置されます
公開バージョン
- Current release, May 10, 2025: 69万件のプロジェクト、1,500クラスター
- Initial release, May 8, 2023: 40万件のプロジェクト、1,000クラスター
データ収集と類似度計算
- 第1段階では、どのユーザーがどのリポジトリにstarを付けたかを取得します
- Google BigQueryのGitHubアクティビティイベント公開データセットを使用しています
- 対象期間は2011年2月から2025年5月までです
- この過程で約5億件のstarデータを取得しました
- 第2段階では、各リポジトリ間の正確なJaccard Similarityを計算します
- 24GB RAMの家庭用コンピューターには計算量が大きすぎました
- 512GB RAMを備えたAWS EC2インスタンスでは数時間以内に処理できました
- 他の類似度方式も試しましたが、Jaccardが最も信頼できる結果を出しました
クラスタリングと地図レイアウト
- 第3段階では、リポジトリをまとめるために複数のクラスタリングアルゴリズムを試しました
- 最終的にLeiden clusteringを最も好ましいものとして採用し、約69万件前後のプロジェクトが1,500以上のクラスターに分けられました
- 第4段階では、クラスター内部のノード配置に独自のngraph.forcelayoutを使用しています
- クラスター全体のグローバル配置には別の設定を使用しています
レンダリング方式
- 第5段階は地図をレンダリングするプロセスです
- 以前のプロジェクトとは異なり、車輪の再発明を避けるためmaplibreを使用しています
- データはGeoJSON形式に変換されます
- タイル生成にはtippecanoeが使用されています
- その後、地図探索の体験を構成します
国名ラベル生成
- 地図に表示される多くの国ラベルはChatGPTの助けで生成されています
- 誤ったラベルを見つけた場合は、右クリックで修正し、pull requestを送ることができます
- ラベル生成用のシステムプロンプトは、GitHubリポジトリのまとまりを特定のプログラミングコミュニティにおける「国」と見なし、ユニークで覚えやすい名前を作るよう求めています
- 名前は1〜3語で簡潔である必要があります
- そのリポジトリ群に共通するテーマ、技術、目的を捉える必要があります
- 「JSWorld」「UI」「Web」「Forge」「Archipelago」「Hub」「Republic」「Nexus」のような一般的な表現は避ける必要があります
- 似たリポジトリ名を単純に結合してはいけません
- 地図上で即座に識別できるほど、他の国名と区別できる必要があります
- ユーザー入力には
repoListとrepoNamesOnlyが含まれ、それらのリポジトリの具体的なテーマや技術を分析して名前を作るよう求めます - LLMが以前の名前と似すぎた名前を返した場合は再試行させ、temperatureを上げてより創造的な結果を促します
検索とデザイン
- 検索ボックスは、すべてのリポジトリの単純なダンプを先頭文字または作者を基準にインデックス化して実装しています
- 検索欄に
aを入力すると、aで始まるリポジトリを探し、クライアント側でファジーマッチャーにより表示します - 現在のデータ表現は気に入っていますが、地図のビジュアルデザインについてはまだ適したスタイルを探しています
- 地図デザインの経験やビジュアル面のアイデアがあれば共有してほしいと依頼しています
ライセンス
- リポジトリはMITライセンスで公開されています
- データを他の作業に使用する場合は、このプロジェクトへのattributionを検討してほしいと依頼しています
1件のコメント
Hacker News のコメント
なぜか torvalds/linux が、JS プロジェクトや awesome-X リスト、フロントエンドのチェックリストの隣にある Fronterra にある
カーネルハッカーたちが突然フロントエンドを愛するようになったのか、よりありそうなのは、コードを書く人たちと GitHub プロジェクトにスターを付ける人たちがあまり重なっていないということだろう
意味的な関係があって似ているのではなく、単にどちらも人気があるから似て見える
reddit の地図でも同じ問題があった: https://anvaka.github.io/map-of-reddit/ — 人気のあるサブレディットは全部互いに「似ている」ことになってしまう
それでも小さくてあまり有名でないプロジェクトには、まだうまく機能する :D
ただ、各ファイルをダウンロードして埋め込みを計算するのに必要なリソースを考えると、おそらく現実的には難しそう
https://xkcd.com/1138/
実際のリンク: https://anvaka.github.io/map-of-github/
Among Us の区域名が Sussex なのを見て笑った
Rustland がこんなに小さいことに驚いた。Clouderra の中の一州くらいしかない
Bevy と Veloren がどちらも Rustland にあるのも興味深い。おそらくスターはゲーム開発コミュニティより Rust コミュニティから多く来ているのだろう
Rust エコシステムはまだ比較的小さく、「X を Rust でやる人たち」が多く見えるという点では納得できる
みんな自分のバブルの大きさを過大評価しているようだ
すると「X but in Rust」は「RustLand」ではなく「X」側に入ることもあるのだろう
自分のプロジェクト mapbox-gl-utils をここで見つけられて、とても面白い
https://anvaka.github.io/map-of-github/#12/24.78947/18.85186
検索機能なしで、地図だけを使って特定のプロジェクトを探すのが楽しいミニゲームになる :-)
Julia ファンとして、julialang/julia につながりがこんなに少ないのは驚き
ニッチな言語ではあるけれど、この地図でこれほど孤立して見えることが、ユーザーや開発者の体験とかけ離れているわけでもなさそう
julialang/julia 自体は tensorflow や opencv の近くにあり、実際の Julia パッケージは別の場所に集まっているのは、「期待ユーザー」と「実際のユーザー」の違いを示しているようだ
Julia プロジェクト自体にスターを付けた多くの人は、新しい Python を探していた数値計算系の Python ユーザーだったが、大半は Python に残ったため、ほかのスターも数値計算 Python 側にある
一方で JuliaLand のパッケージにスターを付けた人たちは実際の Julia ユーザーなので、もっともらしくも Moleculandia、AstroSpace、Quantumia の近くに集まっている
とてもすっきりした創造的なアプローチだが、国/地図のメタファーが最善かどうかは正直悩ましい
多くの場合、名前だけでは明確でなく、何を表しているのか理解するには拡大する必要がある
むしろ階層的クラスタリングを行い、より説明的で忠実な LLM 生成ラベルを付けたうえで、上位クラスタ間の平均的なつながりを線で示すような形のほうが面白かったかもしれない
90年代にそういう図を初めて作り、ほとんどすぐに限界を学んだ立場としては、これは過剰な主張をしていないのがよい。論文ではなく、一つの見方にすぎない
軸に意味のある図が好きだ。線、形、ボックス/グループ、距離、X 対 Y、色、太さ、質感、背景、前景といったものだ
シンプルなものもよい。あまりにも頻繁に、何の意味もなく見栄えのためだけに線を引くが、これはただ少しグループがある図で、個性がある。いいのでは?
もちろん線は今でも好きだが、いつでもどこでも必要というわけではない
データのまとめ方が複数あって、それぞれ筋が通ることがよくあり、だからどの最終クラスタリングを選んでも完璧ではない
うーん……もしかすると量子クラスタリングのようなものをやると面白いプロジェクトになるかもしれない
今では少し記憶が曖昧だが、hdbscan アルゴリズム、つまり階層的クラスタリングを試した覚えがある。GitHub 規模のグラフではメモリに載せられなかった
結局、階層的クラスタリングに似たもの、louvain/leiden/自作の手法を混ぜたものを使い、最終的な地図に見えているものがその結果だ
Quitlessia と NeoQuitlessia とは……名前が邪悪だ
Doom Emacs が Emacsia ではなく NeoQuitlessia にあるが、驚くほど納得できる :)
我々は終了しない
リポジトリ間のつながりがどう決まるのか気になる
自分のリポジトリをいくつか確認したが、一部のつながりはどちらの方向にも参照が見えない
基本的にはほかの人たちが推測したように、線は「スターを付けた人たち」に基づく最も高い類似度スコアを表し、地図全体もその基準で形成されている
紛らわしいかもしれないが、線は特定の国をクリックしたときにだけ表示される
辺を作るかどうかを決めるハードコードされたしきい値がありそうだ。例えば A と B の間のジャカード類似度が 0.2 より大きければ辺を作る、という具合だ