GitHubのスター機能からプログラミング言語のトレンドを見てみよう

### 1. はじめに
どんな言語が人気なんだろうと思ったことはありませんか？
人気なプログラミング言語はたくさんの指標で決めることはできると思いますが、
今回はGitHubのスター数を使って、
人気のプログラミング言語のトレンドを可視化してみました。
以下のPythonコードを使って、異なるプログラミング言語のリポジトリデータを取得し、
スター数を集計してグラフ化する方法をご紹介します。

具体的には2000件のリポジトリデータを取得し、
スター数を集計してグラフ化しています。

### 2. 準備

まず、以下のライブラリが必要です：

- `requests`: GitHub APIからデータを取得するために使用します。
- `csv`: データをCSVファイルに保存するために使用します。
- `pandas`: CSVファイルからデータを読み込み、データの処理や集計を行います。
- `matplotlib.pyplot`: データをグラフ化するために使用します。

これらは、Pythonの標準ライブラリ以外のライブラリなので、最初にインストールしておく必要があります。以下のコマンドでインストールできます：

```bash
pip install requests pandas matplotlib
```

### 3. GitHubデータの取得と保存

次に、GitHubのリポジトリデータを取得し、CSVファイルに保存するための関数を作成します。

#### コード

```python
import requests
import csv

def fetch_github_data(languages):
    url = "https://api.github.com/search/repositories"
    all_repos = []

    for language in languages:
        params = {
            'q': f'language:{language}',
            'sort': 'stars',
            'order': 'desc',
            'per_page': 2000
        }
        
        response = requests.get(url, params=params)
        data = response.json()
        
        for repo in data['items']:
            all_repos.append({
                'name': repo['name'],
                'language': repo['language'],
                'stars': repo['stargazers_count'],
                'forks': repo['forks_count'],
                'created_at': repo['created_at']
            })
    
    with open('github_trends_multi_lang.csv', 'w', newline='', encoding='utf-8') as csvfile:
        fieldnames = ['name', 'language', 'stars', 'forks', 'created_at']
        writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
        writer.writeheader()
        writer.writerows(all_repos)

    print("Data fetching and saving completed.")
```

#### 解説

- **APIリクエスト**: `requests.get(url, params=params)`でGitHub APIにリクエストを送信します。`params`には言語やソート順、表示件数などのパラメータを設定しています。
- **データの保存**: 取得したデータをCSV形式で保存します。`csv.DictWriter`を使ってリストをCSVファイルに書き込みます。

### 4. データの可視化

取得したデータを使って、プログラミング言語ごとのスター数をグラフ化します。

#### コード

```python
import pandas as pd
import matplotlib.pyplot as plt

def visualize_data():
    # CSVデータの読み込み
    df = pd.read_csv('github_trends_multi_lang.csv')

    # 言語ごとのスター数を集計
    df_grouped = df.groupby('language')['stars'].sum().reset_index()
    df_grouped.sort_values(by='stars', ascending=False, inplace=True)

    # 色のリストを定義（言語の数に応じて調整）
    colors = ['skyblue', 'lightgreen', 'lightcoral', 'lightpink', 'lightgoldenrodyellow', 'lightsteelblue']
    
    # データのプロット
    plt.figure(figsize=(12, 8))
    bars = plt.bar(df_grouped['language'], df_grouped['stars'], color=colors[:len(df_grouped)])
    plt.title('GitHub Repository Stars by Language')
    plt.ylabel('Number of Stars')
    plt.xlabel('Programming Language')
    plt.xticks(rotation=45)
    
    # グラフに凡例を追加
    plt.legend(bars, df_grouped['language'], title='Programming Language', bbox_to_anchor=(1.05, 1), loc='upper left')
    
    plt.tight_layout()
    plt.show()
```

#### 解説

- **データの読み込み**: `pandas`を使ってCSVファイルからデータを読み込みます。
- **データの集計**: 言語ごとのスター数を合計し、スター数でソートします。
- **グラフの作成**: `matplotlib`を使って棒グラフを作成します。色やラベル、凡例の設定を行い、見やすいグラフにします。

### 5.メイン処理

最後に、これらの関数を実行するメイン処理を作成します。

#### コード

```python
if __name__ == "__main__":
    languages = ['python', 'javascript', 'java', 'ruby', 'go', 'c']
    fetch_github_data(languages)
    visualize_data()
```

#### 解説

- **関数の実行**: プログラムを実行すると、指定したプログラミング言語のデータを取得し、そのデータを基にグラフを表示します。

### 6.実行結果
このスクリプトを実行すると、以下のようにGitHub上の人気プログラミング言語のトレンドを把握するためのグラフが表示されます。
![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2921163/8cae4317-4648-bde4-0555-c7c74d25a968.png)

### 7.実際のコード
https://github.com/Sakaaaaai/Github_language_trends

興味のある言語を追加したり、グラフのスタイルを変更したりして、自分だけのトレンド分析をしてみてください。