下巻 第1章 練習問題#
ここでは、 本書の学習内容の定着 を目的とした練習問題を掲載します。 解答・解説は「解答例」ページを参照してください。 なお、問題の性質上、本書で取り上げた処理と重複することがあります。 ご了承ください。
前提#
以下のように、ライブラリのインポートと変数の定義が完了していることを前提とします。
Show 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
Show code cell content
# マンガデータ保存ディレクトリのパス
DIR_CM = Path("../../../data/cm/input")
# アニメデータ保存ディレクトリのパス
DIR_AN = Path("../../../data/an/input")
# ゲームデータ保存ディレクトリのパス
DIR_GM = Path("../../../data/gm/input")
Show 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"
Show code cell content
# 国内主要ゲームメーカーのプラットフォームとメーカー名の対応辞書
# キー: プラットフォーム名、値: メーカー名の略称
PF2MK = {
"プレイステーション": "ソニー",
"プレイステーション2": "ソニー",
"プレイステーション・ポータブル": "ソニー",
"プレイステーション3": "ソニー",
"プレイステーションVita": "ソニー",
"プレイステーション4": "ソニー",
"ゲームアーカイブス": "ソニー",
"SG-1000": "セガ",
"SC-3000": "セガ",
"SEGAマーク3": "セガ",
"セガ・マスターシステム": "セガ",
"メガドライブ": "セガ",
"ゲームギア": "セガ",
"セガサターン": "セガ",
"ドリームキャスト": "セガ",
"ファミリーコンピュータ": "任天堂",
"ゲームボーイ": "任天堂",
"スーパーファミコン": "任天堂",
"NINTENDO64": "任天堂",
"ゲームボーイアドバンス": "任天堂",
"ニンテンドーゲームキューブ": "任天堂",
"ニンテンドーDS": "任天堂",
"ニンテンドー3DS": "任天堂",
"Wii": "任天堂",
"WiiU": "任天堂",
"NintendoSwitch": "任天堂",
}
Show code cell content
# pandasのweekday関数で取得できる曜日の数値と実際の曜日名を対応させる辞書を定義
# 0:月曜日, 1:火曜日, ... , 6:日曜日
WEEKDAY2YOBI = {
0: "月",
1: "火",
2: "水",
3: "木",
4: "金",
5: "土",
6: "日",
}
Show code cell content
# plotlyの描画設定の定義
# plotlyのグラフ描画用レンダラーの定義
# Jupyter Notebook環境のグラフ表示に適切なものを選択
RENDERER = "plotly_mimetype+notebook"
Show 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)
]
また、以下の関数も利用可能とします。
Show 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)
以下のようにデータを読み込み済みとします。
Show 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作品 を対象に横棒グラフを作成してください
ヒント
groupby()とnunique()で各話数を集計できます横棒グラフは
px.bar()でorientation="h"を指定します本書では上位20作品を対象としていました
基礎 問題2:プラットフォーム別のパッケージ数#
関連セクション: 棒グラフ
ゲーム市場では、プラットフォームごとにリリースされるゲームパッケージ数に大きな差があります。 どのプラットフォームが最も多くのゲームをリリースしているか確認してみましょう。
df_pkg_pfを用いて、プラットフォーム(pfname)ごとの合計パッケージ数を集計してください合計パッケージ数の 上位10 プラットフォームを対象に横棒グラフを作成してください
ヒント
groupby()とnunique()でパッケージ数を集計できます横棒グラフは
px.bar()でorientation="h"を指定します本書では上位20プラットフォームを対象としていました
標準 問題3:ソニー製プラットフォームのパッケージ数#
関連セクション: 棒グラフ
問題2ではプレイステーションシリーズが上位を占めていました。 では、ソニー製のプラットフォームに絞って、より詳細に比較してみましょう。
PF2MK辞書を用いて、df_pkg_pfにメーカー名を付与してくださいソニー製のプラットフォームのみに絞り込んでください
プラットフォームごとの合計パッケージ数を横棒グラフで可視化してください
ヒント
.map()メソッドで辞書を使った変換ができますブールインデックスでデータを絞り込めます
例:
df[df["列名"] == "値"]
標準 問題4:2000年代のマンガ作者別合計話数#
関連セクション: 積上げ棒グラフ
本書ではマンガ作者別の合計話数を年代別に可視化しました。 ここでは、2000年代(2000〜2009年)に絞って、どの作者が最も多くの話数を持っていたか確認してみましょう。
df_ceに年代情報を付与し、2000年代のデータのみに絞り込んでくださいdf_cc_crtとマージして、マンガ作者名を取得してくださいマンガ作者ごとの合計話数を集計し、上位10名を横棒グラフで可視化してください
ヒント
年は
pd.to_datetime()と.dt.yearで取得できます2000年代は
(year >= 2000) & (year < 2010)で絞り込めますマージには
pd.merge()を使用します
発展 問題5:メーカー別ゲームパッケージ数#
関連セクション: 棒グラフ
本書ではプラットフォームごとのパッケージ数を確認しました。 では、プラットフォームを「メーカー」という新しい切り口で再集計すると、結果はどう変わるでしょうか?
gm_pkg_pf.csvを読み込み、プラットフォーム名からメーカー名へのマッピング(PF2MK)を適用してくださいメーカー別の合計パッケージ数を集計してください
横棒グラフで可視化してください
ヒント
辞書を使った列の変換には
.map()メソッドを使用します横棒グラフは
px.bar()でorientation="h"を指定します
発展 問題6:アニメシリーズの放送枠#
関連セクション: 積上げ棒グラフ
長寿アニメ作品は、その歴史の中で決まった曜日に放送される「放送枠」を持っていることがあります。 この様子を積上げ棒グラフで可視化してみましょう。
an_ae.csvを読み込み、放送曜日を抽出してくださいアニメシリーズごとの合計放送日数を「放送曜日(月〜日)」で色分けした積上げ横棒グラフを作成してください
合計放送日数が多い上位10シリーズを対象とし、放送日数の多い順に並べてください
ヒント
放送曜日は
.dt.weekdayで取得できます(0:月曜日〜6:日曜日)WEEKDAY2YOBI辞書で曜日名に変換できます積上げ棒グラフは
px.bar()でbarmode="stack"を指定しますcategory_ordersで表示順序を制御できます
発展 問題7:ゲーム発売曜日の変遷#
関連セクション: ヒートマップ
ゲーム業界には「新作は〇曜日に出るもの」という商習慣があると言われています。 時代とともに「発売曜日の定番」がどのように変化してきたか、ヒートマップで全体像を俯瞰しましょう。
gm_pkg_pf.csvを利用して、発売年と発売曜日を抽出してください発売年と発売曜日(月〜日)の組み合わせにおけるパッケージ数をヒートマップで可視化してください
ヒント
発売年は
.dt.year、発売曜日は.dt.weekdayで取得できますpx.density_heatmap()でヒートマップを作成できますcategory_ordersで曜日の表示順序を制御できます
応用 問題8:アニメ放送枠の年代別推移#
関連セクション: ヒートマップ
問題7ではゲームの発売曜日の変遷を確認しました。 同様に、アニメの「放送枠」が年代とともにどのように変化してきたか、ヒートマップで俯瞰してみましょう。
ただし、アニメ各話(aeid)の振り方には作品によって違いがあります。
例えば、30分枠で2話を放送する場合、1つのaeidでまとめて表現される作品と、2つのaeidで別々に表現される作品があります。
そこで、同一日・同一作品の放送を「1枠」として統一的に扱うことにします。
df_aeを用いて、1990年以降のデータに絞り込んでください放送年と放送曜日を抽出してください
同一日(
date)・同一作品(acid)の組み合わせを「1枠」として、放送年×放送曜日ごとの放送枠数を集計してくださいヒートマップで可視化してください
ヒント
1990年以降は
year >= 1990で絞り込めます放送枠数は
dateとacidの組み合わせでユニークなものを数えますdrop_duplicates()で重複を除去してから集計する方法もありますpx.density_heatmap()でヒートマップを作成できます