上巻 第6章 練習問題#
ここでは、 本書の学習内容の定着 を目的とした練習問題を掲載します。 解答・解説は「解答例」ページを参照してください。 なお、問題の性質上、本書で取り上げた処理と重複することがあります。 ご了承ください。
前提#
以下のように、ライブラリのインポートと変数の定義が完了していることを前提とします。
Show code cell content
# pathlibモジュールのインポート
# ファイルシステムのパスを扱う
# 組み合わせを生成するためのitertoolsをインポート
from itertools import combinations
from pathlib import Path
# 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_AN_IN = Path("../../../data/an/input") # アニメデータ
DIR_GM_IN = Path("../../../data/gm/input") # ゲームデータ
# アニメ各話に関するファイル
FN_AE = "an_ae.csv"
# アニメ作品と声優の対応関係に関するファイル
FN_AC_ACT = "an_ac_act.csv"
# ゲームパッケージとプラットフォームの対応関係に関するファイル
FN_PKG_PF = "gm_pkg_pf.csv"
以下のファイルを読み込み済みと仮定します。
Show code cell content
df_ae = pd.read_csv(DIR_AN_IN / FN_AE) # アニメ各話データ
df_ac_act = pd.read_csv(DIR_AN_IN / FN_AC_ACT) # アニメ作品と声優
df_pkg_pf = pd.read_csv(DIR_GM_IN / FN_PKG_PF) # ゲームパッケージとプラットフォーム
Show code cell content
# 日付列をdatetime型に変換
df_ae["date"] = pd.to_datetime(df_ae["date"])
df_ac_act["first_date"] = pd.to_datetime(df_ac_act["first_date"])
df_ac_act["last_date"] = pd.to_datetime(df_ac_act["last_date"])
基礎 問題1:特定列のユニーク値数の確認#
関連セクション: ゲームデータの基礎分析
本書では df_pkg_pf.nunique() を用いて全列のユニーク値数を確認しました。
ここでは、特定の列(pfname と publisher)に絞ってユニーク値数を確認してみましょう。
df_pkg_pf から pfname 列と publisher 列を選択し、それぞれのユニーク値数を表示してください。
ヒント
DataFrameから複数列を選択するには
df[["列名1", "列名2"]]のようにリストで指定します例えば
pkgnameとdate列のユニーク値数を確認するにはdf_pkg_pf[["pkgname", "date"]].nunique()とします
基礎 問題2:声優データの活動期間の確認#
関連セクション: アニメデータの基礎分析
本書では df_ae["date"] 列の最小値と最大値を確認して、アニメ各話の放送期間を把握しました。
ここでは、声優データ(df_ac_act)の first_date 列と last_date 列の範囲を確認してみましょう。
df_ac_act の first_date 列と last_date 列それぞれについて、最小値と最大値を表示してください。
ヒント
日付列の最小値・最大値は
.min()と.max()で取得できます例えば
df_ae["date"].min()のように使用します
標準 問題3:特定プラットフォームに絞った価格統計#
関連セクション: ゲームデータの基礎分析
本文では df_pkg_pf.describe() を用いて全データの価格統計を確認しました。
ここでは、特定のプラットフォーム(プレイステーション2)に絞って価格の統計を確認してみましょう。
df_pkg_pf から pfname が「プレイステーション2」のデータのみを抽出し、price 列の記述統計量を表示してください。
ヒント
特定の条件でデータを絞り込むにはブールインデックスを使用します
例えば
pfnameが「プレイステーション」のデータを抽出するにはdf_pkg_pf[df_pkg_pf["pfname"] == "プレイステーション"]とします記述統計量は
.describe()で確認できます
標準 問題4:特定年代に絞ったアニメ作品数#
関連セクション: アニメデータの基礎分析
本文で確認したように、アニメデータは1990年以前に大きな欠損があります。 ここでは、十分余裕を持たせて2000年以降のデータに絞って分析を行ってみましょう。
df_ae から2000年以降のデータのみを抽出し、年ごとのユニークなアニメ作品数(acid)を集計して、作品数が多い順に上位10件を表示してください。
ヒント
日付から年を取得するには
.dt.yearを使用します2000年以降のデータを抽出するには
df_ae[df_ae["date"].dt.year >= 2000]とします.groupby()と.nunique()で年ごとのユニーク数を集計し、.sort_values(ascending=False)で降順ソートできます
発展 問題5:放送日データの空白期間の特定#
関連セクション: アニメデータの基礎分析
第6章で触れた通り、アニメデータには特定の期間に大規模な欠損が見られます。
単純に groupby で集計すると「データが0件の年」は結果から消えてしまい、欠損の深刻さを見落とす可能性があります。
データの最小年から最大年までの全ての年を含む「枠(レンジ)」を作成してください
それに対して
df_aeの作品数を紐付けてください完全にデータが欠損している年を列挙してください。
なお、ここでは簡単のため「当該年にそもそもアニメが放送されていたかどうか(つまり0が正解かどうか)」には深入りしません。 実態は別として、 データとして アニメ作品数が0の年を抽出しましょう。
ヒント
range(min_year, max_year + 1)で全年のリストを作成できますpd.merge()のhow="left"で欠損年も保持したまま結合できます欠損値は
.fillna(0)で0に置き換えられます
応用 問題6:年代別の声優カバー率#
関連セクション: アニメデータの基礎分析
本書で扱うアニメ作品データの中には、声優情報に欠損があるものも含まれます。 どの時代の分析にこのデータが適しているのか、その限界を明らかにしましょう。
first_dateを利用して作品を「年代(10年単位)」ごとに分類してください年代別に「総作品数」と「声優情報あり作品数」を集計してください
年代別の声優データカバー率を算出してください
ヒント
年代は
(year // 10) * 10で計算できます(例: 1995 → 1990)声優情報の有無は
df_ac_actにacidが存在するかでフラグ化できます.agg()で複数の集計を一度に実行できます
応用 問題7:マルチプラットフォーム展開のペア分析#
関連セクション: ゲームデータの基礎分析
ゲーム業界において、複数のプラットフォームで同一タイトルが展開されることは珍しくありません。 どのような組み合わせが多いのか、「プラットフォームのペア」を分析してみましょう。
df_pkg_pfにおいて、2つ以上のプラットフォームで発売されているタイトルを対象にしてくださいタイトルが3機種以上に展開されている場合、全ての2機種の組み合わせを個別にカウントしてください
最も頻出するプラットフォームのペアの上位10件を表示してください
ヒント
タイトル(
pkgname)ごとにプラットフォームのリストを.unique()で取得できますitertools.combinations()で2つの組み合わせを生成できます.value_counts()で出現回数をカウントできます