アニメの人気ランキングを Python でグラフ化

2023年春アニメの人気ランキングを、Python と Anilist API を使ってグラフ化する方法を紹介します。

AniList とは

AniList は、アニメやマンガの情報を含む大規模なデータベースで、アニメの概要や放送情報、キャラクターや声優情報などを提供しています。

AniList の主な機能と特徴

  • データベース
    • アニメやマンガの情報を包括的に提供しています。作品のあらすじ、放送日、制作スタジオ、声優、スタッフ、および評価など、多くの詳細が検索可能です。
  • AniList API
    • API を利用して、アニメやマンガの情報を取得したり、ユーザーのリストを管理するアプリケーションを作成することができます。API のドキュメントや利用方法については、以下のリンクを参照してください。https://anilist.gitbook.io/anilist-apiv2-docs/

AniList の人気度について

AniList では、ユーザーの関心や作品へのエンゲージメントを基に「人気度」が定義されています。具体的には、以下の要素が人気度の指標として考慮されています。

  1. リスト登録数: 作品がユーザーのリスト(視聴中、計画、完了など)に登録されている数
  2. 評価数: 作品に対してユーザーが評価(スコア)を付けた回数
  3. フォーラムのアクティビティ: 作品に関連するフォーラムスレッドやコメントの数
  4. ページビュー: 作品の AniList ページが閲覧された回数

これらの要素が組み合わされて、総合的な人気度が算出されます。[1] … Continue reading

AniList API 活用例

実行例

次の Python スクリプトは、AniList APIを使用して、2023年春アニメの人気度が高い作品上位 5 つを抽出し、matplotlib を使ってグラフ化します。

# ----------------------------------------------------------------------------
# Author: tomo
# Creation Date: 2023-03-21
#
# This script is free to use and modify at your own discretion.
# No warranty is provided for the script's functionality.
# Use this script at your own risk.
# ----------------------------------------------------------------------------
import requests
import json
import matplotlib.pyplot as plt

# AniList API URL
url = "https://graphql.anilist.co"

# クエリの定義
query = '''
query ($season: MediaSeason, $seasonYear: Int, $page: Int, $perPage: Int, $sort: [MediaSort]) {
  Page (page: $page, perPage: $perPage) {
    pageInfo {
      total
      perPage
      currentPage
      lastPage
      hasNextPage
    }
    media (season: $season, seasonYear: $seasonYear, sort: $sort, type: ANIME) {
      id
      title {
        romaji
      }
      popularity
    }
  }
}
'''

# クエリ変数の定義
variables = {
  "season": "SPRING",
  "seasonYear": 2023,
  "page": 1,
  "perPage": 5,
  "sort": "POPULARITY_DESC"
}

# API リクエスト
response = requests.post(url, json={"query": query, "variables": variables})
data = json.loads(response.text)

# データの取得
animes = data["data"]["Page"]["media"]

# グラフの準備
titles = [anime["title"]["romaji"] for anime in animes]
popularity = [anime["popularity"] for anime in animes]

# グラフサイズを調整
plt.figure(figsize=(10, len(titles) * 0.8))

# グラフの作成
plt.barh(titles, popularity)
plt.xlabel("Popularity")
plt.ylabel("Anime Titles")
plt.title("Top 5 Popular Spring 2023 Anime")

# y軸のフォントサイズを調整
plt.yticks(fontsize=10)

# グラフの表示
plt.gca().invert_yaxis()
plt.tight_layout()  # ラベルがはみ出さないように調整
plt.show()

出力結果は次のとおりです。
作品名(日本語)は、棒グラフに手書きしています。

解説

AniList API の URL 定義

リクエストを送信する先の URL を設定します。

# AniList API URL
url = "https://graphql.anilist.co"
GraphQL クエリを定義

このクエリでは、シーズン、年、ページ数、1ページあたりのアニメ数、およびソート順を変数として定義しています。また、media フィールドを使って、アニメの ID、タイトル(ローマ字)、および人気度を取得しています。

# クエリの定義
query = '''
query ($season: MediaSeason, $seasonYear: Int, $page: Int, $perPage: Int, $sort: [MediaSort]) {
  Page (page: $page, perPage: $perPage) {
    pageInfo {
      total
      perPage
      currentPage
      lastPage
      hasNextPage
    }
    media (season: $season, seasonYear: $seasonYear, sort: $sort, type: ANIME) {
      id
      title {
        romaji
      }
      popularity
    }
  }
}
'''
クエリ変数を定義

これらの変数は、GraphQL クエリの中で使われており、API リクエストを送信するときに辞書形式で渡されます。この例では、シーズン(春)、年(2023)、ページ数(1)、1ページあたりのアニメ数(5)、およびソート順(人気度降順)を指定しています。

# クエリ変数の定義
variables = {
  "season": "SPRING",
  "seasonYear": 2023,
  "page": 1,
  "perPage": 5,
  "sort": "POPULARITY_DESC"
}
API リクエスト
  1. requests.post メソッドを使って、API リクエストを送信しています。第 1 引数に URL、第 2 引数に json キーワード引数でクエリと変数を渡しています。API から返された JSON 形式のテキストデータは、response.text でアクセスできます。
  2. json.loads メソッドを使って、JSON 形式のテキストデータを Python の辞書オブジェクトに変換しています。その後、辞書オブジェクトからアニメのリストを抽出しています。
# API リクエスト
response = requests.post(url, json={"query": query, "variables": variables})
data = json.loads(response.text)

以上

脚注

脚注
1人気度は、作品のクオリティや評価とは異なり、どれだけ多くの人々がその作品に関心を持っているか、またはその作品に対してアクティブにエンゲージしているかを示す指標です。そのため、人気度が高い作品は、必ずしも高評価であるとは限りません。