下巻 第1章 練習問題#

ここでは、 本書の学習内容の定着 を目的とした練習問題を掲載します。 解答・解説は「解答例」ページを参照してください。 なお、問題の性質上、本書で取り上げた処理と重複することがあります。 ご了承ください。

前提#

以下のように、ライブラリのインポートと変数の定義が完了していることを前提とします。

Hide code cell content
# pathlibモジュールのインポート
# ファイルシステムのパスを扱う
from pathlib import Path

# typingモジュールからの型ヒント関連のインポート
# 関数やクラスの引数・返り値の型を注釈するためのツール
from typing import Any, Dict, List, Optional, Union

# numpy:数値計算ライブラリのインポート
# npという名前で参照可能
import numpy as np

# pandas:データ解析ライブラリのインポート
# pdという名前で参照可能
import pandas as pd

# plotly.expressのインポート
# インタラクティブなグラフ作成のライブラリ
# pxという名前で参照可能
import plotly.express as px

# plotly.graph_objectsからFigureクラスのインポート
# 型ヒントの利用を主目的とする
from plotly.graph_objects import Figure
Hide code cell content
# マンガデータ保存ディレクトリのパス
DIR_CM = Path("../../../data/cm/input")
# アニメデータ保存ディレクトリのパス
DIR_AN = Path("../../../data/an/input")
# ゲームデータ保存ディレクトリのパス
DIR_GM = Path("../../../data/gm/input")
Hide code cell content
# 読み込み対象ファイル名の定義

# Comic Episode関連のファイル名
FN_CE = "cm_ce.csv"

# Comic CollectionとCReaTor関連のファイル名
FN_CC_CRT = "cm_cc_crt.csv"

# Anime Episode関連のファイル名
FN_AE = "an_ae.csv"

# PacKaGeとPlatForm関連のファイル名
FN_PKG_PF = "gm_pkg_pf.csv"
Hide code cell content
# 国内主要ゲームメーカーのプラットフォームとメーカー名の対応辞書
# キー: プラットフォーム名、値: メーカー名の略称
PF2MK = {
    "プレイステーション": "ソニー",
    "プレイステーション2": "ソニー",
    "プレイステーション・ポータブル": "ソニー",
    "プレイステーション3": "ソニー",
    "プレイステーションVita": "ソニー",
    "プレイステーション4": "ソニー",
    "ゲームアーカイブス": "ソニー",
    "SG-1000": "セガ",
    "SC-3000": "セガ",
    "SEGAマーク3": "セガ",
    "セガ・マスターシステム": "セガ",
    "メガドライブ": "セガ",
    "ゲームギア": "セガ",
    "セガサターン": "セガ",
    "ドリームキャスト": "セガ",
    "ファミリーコンピュータ": "任天堂",
    "ゲームボーイ": "任天堂",
    "スーパーファミコン": "任天堂",
    "NINTENDO64": "任天堂",
    "ゲームボーイアドバンス": "任天堂",
    "ニンテンドーゲームキューブ": "任天堂",
    "ニンテンドーDS": "任天堂",
    "ニンテンドー3DS": "任天堂",
    "Wii": "任天堂",
    "WiiU": "任天堂",
    "NintendoSwitch": "任天堂",
}
Hide code cell content
# pandasのweekday関数で取得できる曜日の数値と実際の曜日名を対応させる辞書を定義
# 0:月曜日, 1:火曜日, ... , 6:日曜日
WEEKDAY2YOBI = {
    0: "月",
    1: "火",
    2: "水",
    3: "木",
    4: "金",
    5: "土",
    6: "日",
}
Hide code cell content
# plotlyの描画設定の定義

# plotlyのグラフ描画用レンダラーの定義
# Jupyter Notebook環境のグラフ表示に適切なものを選択
RENDERER = "plotly_mimetype+notebook"
Hide code cell content
# 質的変数の描画用のカラースケールの定義

# Okabe and Ito (2008)基準のカラーパレット
# 色の識別性が高く、多様な色覚の人々にも見やすい色組み合わせ
# 参考URL: https://jfly.uni-koeln.de/color/#pallet
OKABE_ITO = [
    "#000000",  # 黒 (Black)
    "#E69F00",  # 橙 (Orange)
    "#56B4E9",  # 薄青 (Sky Blue)
    "#009E73",  # 青緑 (Bluish Green)
    "#F0E442",  # 黄色 (Yellow)
    "#0072B2",  # 青 (Blue)
    "#D55E00",  # 赤紫 (Vermilion)
    "#CC79A7",  # 紫 (Reddish Purple)
]

また、以下の関数も利用可能とします。

Hide code cell source
def show_fig(fig: Figure) -> None:
    """
    所定のレンダラーを用いてplotlyの図を表示
    Jupyter Bookなどの環境での正確な表示を目的とする

    Parameters
    ----------
    fig : Figure
        表示対象のplotly図

    Returns
    -------
    None
    """

    # 図の周囲の余白を設定
    # t: 上余白
    # l: 左余白
    # r: 右余白
    # b: 下余白
    fig.update_layout(margin=dict(t=25, l=25, r=25, b=25))

    # 所定のレンダラーで図を表示
    fig.show(renderer=RENDERER)

以下のようにデータを読み込み済みとします。

Hide code cell content
# マンガデータの読み込み
df_ce = pd.read_csv(DIR_CM / FN_CE)
df_cc_crt = pd.read_csv(DIR_CM / FN_CC_CRT)
# アニメデータの読み込み
df_ae = pd.read_csv(DIR_AN / FN_AE)
# ゲームデータの読み込み
df_pkg_pf = pd.read_csv(DIR_GM / FN_PKG_PF)

基礎 問題1:アニメ作品別の合計話数#

関連セクション: 棒グラフ

本書では長寿アニメ作品の合計話数を確認しました。 ここでは、アニメ作品ごとの合計話数を横棒グラフで可視化してみましょう。

  • df_aeを用いて、アニメ作品(acname)ごとの合計話数を集計してください

  • 合計話数の 上位10作品 を対象に横棒グラフを作成してください

基礎 問題2:プラットフォーム別のパッケージ数#

関連セクション: 棒グラフ

ゲーム市場では、プラットフォームごとにリリースされるゲームパッケージ数に大きな差があります。 どのプラットフォームが最も多くのゲームをリリースしているか確認してみましょう。

  • df_pkg_pfを用いて、プラットフォーム(pfname)ごとの合計パッケージ数を集計してください

  • 合計パッケージ数の 上位10 プラットフォームを対象に横棒グラフを作成してください

標準 問題3:ソニー製プラットフォームのパッケージ数#

関連セクション: 棒グラフ

問題2ではプレイステーションシリーズが上位を占めていました。 では、ソニー製のプラットフォームに絞って、より詳細に比較してみましょう。

  • PF2MK辞書を用いて、df_pkg_pfにメーカー名を付与してください

  • ソニー製のプラットフォームのみに絞り込んでください

  • プラットフォームごとの合計パッケージ数を横棒グラフで可視化してください

標準 問題4:2000年代のマンガ作者別合計話数#

関連セクション: 積上げ棒グラフ

本書ではマンガ作者別の合計話数を年代別に可視化しました。 ここでは、2000年代(2000〜2009年)に絞って、どの作者が最も多くの話数を持っていたか確認してみましょう。

  • df_ceに年代情報を付与し、2000年代のデータのみに絞り込んでください

  • df_cc_crtとマージして、マンガ作者名を取得してください

  • マンガ作者ごとの合計話数を集計し、上位10名を横棒グラフで可視化してください

発展 問題5:メーカー別ゲームパッケージ数#

関連セクション: 棒グラフ

本書ではプラットフォームごとのパッケージ数を確認しました。 では、プラットフォームを「メーカー」という新しい切り口で再集計すると、結果はどう変わるでしょうか?

  • gm_pkg_pf.csv を読み込み、プラットフォーム名からメーカー名へのマッピング(PF2MK)を適用してください

  • メーカー別の合計パッケージ数を集計してください

  • 横棒グラフで可視化してください

発展 問題6:アニメシリーズの放送枠#

関連セクション: 積上げ棒グラフ

長寿アニメ作品は、その歴史の中で決まった曜日に放送される「放送枠」を持っていることがあります。 この様子を積上げ棒グラフで可視化してみましょう。

  • an_ae.csv を読み込み、放送曜日を抽出してください

  • アニメシリーズごとの合計放送日数を「放送曜日(月〜日)」で色分けした積上げ横棒グラフを作成してください

  • 合計放送日数が多い上位10シリーズを対象とし、放送日数の多い順に並べてください

発展 問題7:ゲーム発売曜日の変遷#

関連セクション: ヒートマップ

ゲーム業界には「新作は〇曜日に出るもの」という商習慣があると言われています。 時代とともに「発売曜日の定番」がどのように変化してきたか、ヒートマップで全体像を俯瞰しましょう。

  • gm_pkg_pf.csv を利用して、発売年と発売曜日を抽出してください

  • 発売年と発売曜日(月〜日)の組み合わせにおけるパッケージ数をヒートマップで可視化してください

応用 問題8:アニメ放送枠の年代別推移#

関連セクション: ヒートマップ

問題7ではゲームの発売曜日の変遷を確認しました。 同様に、アニメの「放送枠」が年代とともにどのように変化してきたか、ヒートマップで俯瞰してみましょう。

ただし、アニメ各話(aeid)の振り方には作品によって違いがあります。 例えば、30分枠で2話を放送する場合、1つのaeidでまとめて表現される作品と、2つのaeidで別々に表現される作品があります。 そこで、同一日・同一作品の放送を「1枠」として統一的に扱うことにします。

  • df_aeを用いて、1990年以降のデータに絞り込んでください

  • 放送年と放送曜日を抽出してください

  • 同一日(date)・同一作品(acid)の組み合わせを「1枠」として、放送年×放送曜日ごとの放送枠数を集計してください

  • ヒートマップで可視化してください