下巻 第5章 練習問題#

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

前提#

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

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

# pandas:データ解析ライブラリのインポート
# pdという名前で参照可能
import pandas as pd
Hide code cell content
# 読み込み対象ディレクトリの定義

# マンガデータの中間出力ファイルが格納されているディレクトリのパス
DIR_CM = Path("../../../data/cm/interim")

# アニメデータの中間出力ファイルが格納されているディレクトリのパス
DIR_AN = Path("../../../data/an/interim")

# 外部データソースから作成したファイルを格納しているディレクトリのパス
# (今回は、事前に作成したマンガ作品とアニメ作品の紐づけファイル)
DIR_EXTERNAL = Path("../../../data/mix/external")

# メディア展開データが保存されているディレクトリのパス
DIR_IN = Path("../../../data/mix/input")
Hide code cell content
# アニメ作品の結合用データのファイル名を定義
FN_AC_MERGE = "ac_merge.csv"

# マンガ作品の結合用データのファイル名を定義
FN_CC_MERGE = "cc_merge.csv"

# アニメ作品とマンガ作品の対応関係に関するデータのファイル名を定義
FN_AC_CC = "ac_cc.csv"

# アニメ各話と原作マンガの作者者の対応関係に関するファイル
FN_AE_CRT = "mix_ae_crt.csv"

# マンガ各話とアニメ作品の対応関係に関するファイル
FN_CE_AC = "mix_ce_ac.csv"

また、以下のようにファイルを読み込んでいると仮定します。

Hide code cell content
# フィルタリング前の「生」の対応表を読み込む
df_ac_cc = pd.read_csv(DIR_EXTERNAL / FN_AC_CC)

# アニメ作品データ(放送日の比較用)
df_ac_merge = pd.read_csv(DIR_AN / FN_AC_MERGE)
# マンガ作品データ(掲載日の比較用)
df_cc_merge = pd.read_csv(DIR_CM / FN_CC_MERGE)
# アニメ各話とマンガ作者の対応関係
df_mix_ae_crt = pd.read_csv(DIR_IN / FN_AE_CRT)
# マンガ各話とアニメ作品の対応関係
df_mix_ce_ac = pd.read_csv(DIR_IN / FN_CE_AC)

# 日付列をdatetime型に変換
df_ac_merge["first_date"] = pd.to_datetime(df_ac_merge["first_date"])
df_cc_merge["first_date"] = pd.to_datetime(df_cc_merge["first_date"])

基礎 問題1:対応表の件数確認#

関連セクション: メディア展開データの前処理

本章で使用する対応表df_ac_ccは、アニメ作品ID(acid)とマンガ作品ID(ccid)の紐づけを管理しています。 shape属性とnunique()メソッドを用いて、対応表の行数と各IDのユニーク数を確認してください。

行数とユニーク数の関係から、acidccidの対応関係にはどのような特徴があるかを考察しましょう。

基礎 問題2:メディア展開データの形状確認#

関連セクション: メディア展開データの基礎分析

本文ではdf_mix_ae_crtの形状をshapeで確認しました。ここでは、もう一つのメディア展開データdf_mix_ce_acについて同様の確認を行いましょう。

df_mix_ce_acshape属性を用いて行数と列数を確認し、head(10)で先頭10行を表示してください。

標準 問題3:特定雑誌に絞った統計#

関連セクション: メディア展開データの基礎分析

本書では、groupby("mcname")を用いて全雑誌を対象にアニメ化実績を集計しました。 今回は、週刊少年サンデーに絞り込んで、アニメ化された作品数と関わった作者数を集計してみましょう。

df_mix_ae_crtから週刊少年サンデー(mcname列が"週刊少年サンデー")のデータのみを抽出し、acid(アニメ作品)とcrtid(マンガ作者)のユニーク数を確認してください。

発展 問題4:マンガ作品のカバー率#

関連セクション: メディア展開データの基礎分析

問題7(後述)では、アニメ作品(acid)の観点から前処理による情報欠落を分析します。 ここでは、 マンガ作品(ccid の観点から同様の分析を行ってみましょう。

生の対応表(df_ac_cc)に含まれるマンガ作品数と、最終的な分析用データ(df_mix_ae_crt)に残ったマンガ作品数を比較し、マンガ作品の「残存率」を算出してください。 結果はpd.Seriesを用いて構造化されたサマリーとして出力しましょう。

発展 問題5:対応関係の仕様チェック#

関連セクション: メディア展開データの基礎分析

本書の仕様説明において、Aさんは「一つのアニメ作品に対して、複数の原作マンガ作品を紐づけない」というルールを定義しました。

つまり、アニメ作品ID(acid)に対してマンガ作品ID(ccid)は一意に定まる(N対1の関係)必要があります。 本書でも登場したassert文を活用して、df_ac_cc内の一つのacidに対して複数のccidが紐づいている 仕様違反 がないことを検証してください。

発展 問題6:時間的整合性の検証#

関連セクション: メディア展開データの基礎分析

アニメ作品の放送開始日は、必ず原作マンガの掲載開始日以降(同日を含む)となるよう対応表を作成しました。 もしアニメが先に始まっているデータが存在する場合、それは原作の紐づけ誤りや日付データの不備を示唆しています。 アニメとマンガの開始日(first_date)をマージし、全てのアニメ作品において「マンガ開始日 <= アニメ開始日」が成立していることを、assert文を用いて検証しましょう。

発展 問題7:マージによる情報欠落#

関連セクション: メディア展開データの基礎分析

前処理の過程で、放送日の欠損などを理由に除外されたアニメ作品が存在します。 生の対応表(df_ac_cc)に含まれる作品数と、最終的な分析用データ(mix_ae_crt.csv)に残った作品数を比較し、データの「残存率」を算出しましょう。 結果は単なる数値の表示ではなく、PandasのSeries型を用いて構造化されたサマリーとして出力してください。