2023年春アニメの人気ランキングを、Python と Anilist API を使ってグラフ化する方法を紹介します。
AniList とは
AniList は、アニメやマンガの情報を含む大規模なデータベースで、アニメの概要や放送情報、キャラクターや声優情報などを提供しています。
AniList の主な機能と特徴
- データベース
- アニメやマンガの情報を包括的に提供しています。作品のあらすじ、放送日、制作スタジオ、声優、スタッフ、および評価など、多くの詳細が検索可能です。
- AniList API
- API を利用して、アニメやマンガの情報を取得したり、ユーザーのリストを管理するアプリケーションを作成することができます。API のドキュメントや利用方法については、以下のリンクを参照してください。https://anilist.gitbook.io/anilist-apiv2-docs/
AniList の人気度について
AniList では、ユーザーの関心や作品へのエンゲージメントを基に「人気度」が定義されています。具体的には、以下の要素が人気度の指標として考慮されています。
- リスト登録数: 作品がユーザーのリスト(視聴中、計画、完了など)に登録されている数
- 評価数: 作品に対してユーザーが評価(スコア)を付けた回数
- フォーラムのアクティビティ: 作品に関連するフォーラムスレッドやコメントの数
- ページビュー: 作品の 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 リクエスト
requests.post
メソッドを使って、API リクエストを送信しています。第 1 引数に URL、第 2 引数にjson
キーワード引数でクエリと変数を渡しています。API から返された JSON 形式のテキストデータは、response.text
でアクセスできます。json.loads
メソッドを使って、JSON 形式のテキストデータを Python の辞書オブジェクトに変換しています。その後、辞書オブジェクトからアニメのリストを抽出しています。
# API リクエスト
response = requests.post(url, json={"query": query, "variables": variables})
data = json.loads(response.text)
以上
脚注
↑1 | 人気度は、作品のクオリティや評価とは異なり、どれだけ多くの人々がその作品に関心を持っているか、またはその作品に対してアクティブにエンゲージしているかを示す指標です。そのため、人気度が高い作品は、必ずしも高評価であるとは限りません。 |
---|