0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

遊戯王のデータの属性・種族・レベルの分布分析をやってみた

0
Posted at

どうもデュエリストです。

最近遊戯王やってて思ったんですよね。
種族とかレベルって偏りあるなって。(闇属性・レベル4とか光属性・レベル8とか)
気になったので、今回は属性・レベルの分布分析をしていくことにします。

🛠️ 仕様と環境

今回の検証を行うにあたり、遊戯王のデータは非公式のYGOPRODeckというAPIを使用しました。
言語はPythonで、検証環境はGoogle Colabで行いました。

実行するソースコード

import requests
import pandas as pd

# 属性の日本語マッピング
attr_mapping = {
    "DARK": "闇",
    "EARTH": "地",
    "FIRE": "炎",
    "LIGHT": "光",
    "WATER": "水",
    "WIND": "風"
}

# 属性一覧(APIの検索用キー)
attributes = list(attr_mapping.keys())
# レベル一覧(1〜12に限定)
levels = [str(i) for i in range(1, 13)]

def get_data(keyword, search_word):
    base_url = "https://db.ygoprodeck.com/api/v7/cardinfo.php"
    if keyword in ["name", "attribute", "race"]:
        url = f"{base_url}?{keyword}={search_word}"
    else:
        return None

    try:
        response = requests.get(url)
        if response.status_code == 200:
            return response.json()
    except Exception:
        pass
    return None

def create_cross_table():
    all_cards = []
    
    # 属性ごとにデータを取得
    for attr in attributes:
        card_data = get_data("attribute", attr)
        if card_data and 'data' in card_data:
            for card in card_data['data']:
                lvl = card.get('level')
                lvl_str = str(lvl)
                
                # レベルが 1〜12 の範囲に収まるものだけを抽出
                if lvl_str in levels:
                    # 属性名を日本語に変換して格納
                    all_cards.append({
                        "属性": attr_mapping[attr],
                        "Level": lvl_str
                    })
                
    df = pd.DataFrame(all_cards)
    if df.empty:
        print("データが取得できませんでした。")
        return

    # クロス集計表を作成
    cross_tab = pd.crosstab(df['属性'], df['Level'], margins=True, margins_name='合計')
    
    # 行と列の順序をきれいに並び替える(日本語の並び順を設定)
    japanese_attr_order = [attr_mapping[a] for a in attributes] + ['合計']
    columns_order = levels + ['合計']
    cross_tab = cross_tab.reindex(index=japanese_attr_order, columns=columns_order, fill_value=0)
    
    # Markdown(|区切り)形式のテキストに変換して出力
    markdown_text = cross_tab.to_markdown()
    print(markdown_text)

# 実行
create_cross_table()

ソースコードの説明です。

1. データの仕入れ(API通信部分)

 APIでデータを取得します。「闇属性のカードを全部ください」といった形で、属性ごとにまとめてごっそりデータをダウンロードします。

2. データの選別・仕分け(ループ処理部分)

 「レベル1〜12を持つモンスターカード」だけを抽出し、日本語に翻訳して扱いやすいリストに詰め込みます。

3. 表の作成と出力(Pandasのクロス集計)

 pandasとcrosstab(クロス集計)という機能を使って表形式で出力します。

実行結果

$\text{属性}$ $\text{1}$ $\text{2}$ $\text{3}$ $\text{4}$ $\text{5}$ $\text{6}$ $\text{7}$ $\text{8}$ $\text{9}$ $\text{10}$ $\text{11}$ $\text{12}$ $\text{合計}$
$\text{闇}$ $\text{209}$ $\text{190}$ $\text{311}$ $\text{603}$ $\text{190}$ $\text{230}$ $\text{197}$ $\text{309}$ $\text{43}$ $\text{120}$ $\text{13}$ $\text{41}$ $\text{2456}$
$\text{地}$ $\text{152}$ $\text{199}$ $\text{357}$ $\text{652}$ $\text{151}$ $\text{151}$ $\text{92}$ $\text{131}$ $\text{40}$ $\text{48}$ $\text{8}$ $\text{10}$ $\text{1991}$
$\text{炎}$ $\text{53}$ $\text{57}$ $\text{131}$ $\text{223}$ $\text{49}$ $\text{78}$ $\text{49}$ $\text{88}$ $\text{20}$ $\text{18}$ $\text{2}$ $\text{3}$ $\text{771}$
$\text{光}$ $\text{171}$ $\text{123}$ $\text{168}$ $\text{591}$ $\text{127}$ $\text{135}$ $\text{120}$ $\text{200}$ $\text{50}$ $\text{87}$ $\text{11}$ $\text{34}$ $\text{1817}$
$\text{水}$ $\text{60}$ $\text{90}$ $\text{151}$ $\text{287}$ $\text{103}$ $\text{58}$ $\text{54}$ $\text{50}$ $\text{15}$ $\text{23}$ $\text{1}$ $\text{1}$ $\text{893}$
$\text{風}$ $\text{67}$ $\text{80}$ $\text{145}$ $\text{236}$ $\text{67}$ $\text{77}$ $\text{54}$ $\text{50}$ $\text{19}$ $\text{25}$ $\text{5}$ $\text{4}$ $\text{829}$
$\text{合計}$ $\text{712}$ $\text{739}$ $\text{1263}$ $\text{2592}$ $\text{687}$ $\text{729}$ $\text{566}$ $\text{828}$ $\text{187}$ $\text{321}$ $\text{40}$ $\text{93}$ $\text{8757}$

以下、上記の結果で個人的に感じたことを書いていきます。

1. 「闇」と「地」の圧倒的なツートップ

全体のカード枚数のうち、闇属性と地属性だけで全体の半分以上を占めていますね。

闇属性: レベル1〜8まで隙間なく分厚い層があります。昔から強力なテーマ(BF、シャドール、オルフェゴール、幻影騎士団など)や、ボス級のエースモンスターに闇属性が選ばれやすかった歴史がそのまま数字に出てる気がします。

地属性: 遊戯王の黎明期から存在するオーソドックスな種族に地属性が多いため、この大所帯ジャンルが全体の数字を大きく底上げしていると考えられます。

2. 「レベル4」という絶対的な中心軸

どの属性を見ても、レベル4が圧倒的に突出して多いです(全体の約3割)。

これは遊戯王において「生け贄(リリース)なしで通常召喚できる最高レベル」だからですね。
下級アタッカーや、コンボの始点となるシステムモンスターの基準がレベル4であること。
さらにはランク4のエクシーズ召喚が全盛期だった時代の影響。

これらが綺麗に数字に反映されていてます。それに次いでレベル3(1,263枚)が多いのも、シンクロやエクシーズの素材としての扱いやすさを物語っています。

3. レベル9以降の「急激な崖」

レベル8(828枚)までは各属性にまとまった数が存在しますが、レベル9(187枚)になった瞬間に文字通り桁がひとつ変わります。

レベル9以上は「出すのが難しい特別な切り札」というゲームデザインの境界線が見えてきますね。

その中でもレベル10(321枚)がレベル9より多いのは、シンクロモンスターの最高到達点(フルルドリスやバロネスなど)や、「列車」テーマ、あるいは神のカードといった「キリの良い数字」として意図的にデザインされやすいからでしょうね。

4. 炎属性の圧倒的な「少数精鋭」感

4属性(地水火風)の中でも、炎属性の少なさが際立っています。
長年「不遇の属性」なんて言われることもありましたが、近年(スネークアイや咎姫など)の強化で一線級のパワーを得たものの、全体のプールとしてはまだまだこれから伸びる余地がある、非常に尖った属性であることが分かります。

今回のまとめ

デザインの黄金比

「下級はレベル4、上級はレベル8」という、ゲーム開始初期から続く偶数主体のデザイン骨格が25年経った今でも強固に維持されています。

属性の格差と役割

モンスター数が「闇・地・光」に偏っているのは、遊戯王のストーリー性(善VS悪)や、歴史ある王道テーマがこの3属性に集中しているためです。逆に「炎・水・風」は、数こそ少ないものの、それぞれが尖った強力なギミックを持つ「少数精鋭」のポジションを確立しています。

てことで、長年デュエリストだったらほぼ想像通りだったかと思います。

ではまた👋

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?