上巻 第3章 解答例#

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

前提#

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

Hide code cell content
# 必要なライブラリのインポート
import pandas as pd
from pathlib import Path

# データ格納ディレクトリのパス
DIR_IN = Path("../../../data/cm/input")

# ファイル名の定義
FN_CE = "cm_ce.csv"
FN_CC_CRT = "cm_cc_crt.csv"

# データの読み込み
df_ce = pd.read_csv(DIR_IN / FN_CE)

基礎 問題1:データの先頭行の確認#

関連セクション: マンガデータの基礎分析

データ分析では、まずデータの中身を目で見て確認することが大切です。 df_ceの先頭10行を表示し、どのような列が含まれているかを確認してください。

Hide code cell content
# df_ceの先頭10行を表示
df_ce.head(10)
ceid cename ccid miid page_start page_end pages page_start_position two_colored four_colored miname mcid mcname date price ccname
0 CE00000 第238話/この世代 C90829 M535428 10.0 31.0 22.0 0.021368 False True 週刊少年マガジン 2011年 表示号数24 C119033 週刊少年マガジン 2011-05-25 248.0 ダイヤのA
1 CE00001 #134 話の続き C90482 M535428 33.0 50.0 18.0 0.070513 False False 週刊少年マガジン 2011年 表示号数24 C119033 週刊少年マガジン 2011-05-25 248.0 君のいる町
2 CE00002 第5話 チア・ザ・マシンガン! C90297 M535428 51.0 68.0 18.0 0.108974 False False 週刊少年マガジン 2011年 表示号数24 C119033 週刊少年マガジン 2011-05-25 248.0 アゲイン!!
3 CE00003 第233話 妖精の輝き C89978 M535428 69.0 88.0 20.0 0.147436 False False 週刊少年マガジン 2011年 表示号数24 C119033 週刊少年マガジン 2011-05-25 248.0 FAIRY TAIL
4 CE00004 -BOUT 71- From Dark Zone C89929 M535428 89.0 108.0 20.0 0.190171 False False 週刊少年マガジン 2011年 表示号数24 C119033 週刊少年マガジン 2011-05-25 248.0 A-BOUT!
5 CE00005 第94話 C90168 M535428 109.0 130.0 22.0 0.232906 False True 週刊少年マガジン 2011年 表示号数24 C119033 週刊少年マガジン 2011-05-25 248.0 我間乱 ~GAMARAN~
6 CE00006 第36話 星 C89936 M535428 131.0 150.0 20.0 0.279915 False False 週刊少年マガジン 2011年 表示号数24 C119033 週刊少年マガジン 2011-05-25 248.0 AKB49 ~恋愛禁止条例~
7 CE00007 #164 どうやって C89939 M535428 151.0 168.0 18.0 0.322650 False False 週刊少年マガジン 2011年 表示号数24 C119033 週刊少年マガジン 2011-05-25 248.0 Baby Steps ベイビーステップ
8 CE00008 code:133 覚悟の証 C89961 M535428 169.0 188.0 20.0 0.361111 False False 週刊少年マガジン 2011年 表示号数24 C119033 週刊少年マガジン 2011-05-25 248.0 CODE:BREAKER コード:ブレイカー
9 CE00009 324時間目 明かされた秘密!! C91386 M535428 189.0 206.0 18.0 0.403846 False False 週刊少年マガジン 2011年 表示号数24 C119033 週刊少年マガジン 2011-05-25 248.0 魔法先生 ネギま! MAGISTER NEGI MAGI

解説

head() メソッドは、データフレームの先頭から指定した行数を取得するメソッドです。 引数を省略すると5行、引数に数値を指定するとその行数分を取得します。

データ分析の最初のステップとして、head() でデータの中身を確認することで、列名やデータの形式を把握することができます。 各列の値を見ることで、数値データか文字列データか、欠損値がありそうかなどの見当をつけることができます。

関連セクション: 詳しくはマンガデータの基礎分析を参照してください。

基礎 問題2:データの形状と記述統計量の確認#

関連セクション: マンガデータの基礎分析

データの全体像を把握するために、データの行数・列数や、数値列の記述統計量を確認することが重要です。 df_ceの行数と列数を確認し、さらに数値列の記述統計量(平均、標準偏差、最小値、最大値など)を表示してください。

Hide code cell content
# df_ceの行数・列数を確認
print(df_ce.shape)

# 数値列の記述統計量を表示
df_ce.describe()
(180076, 16)
page_start page_end pages page_start_position price
count 180076.000000 180076.000000 180076.000000 180076.000000 180038.000000
mean 210.867847 228.392754 18.524906 0.514882 203.907742
std 123.865626 122.043463 7.713260 0.283149 41.958118
min 1.000000 1.000000 1.000000 0.002045 80.000000
25% 107.000000 126.000000 17.000000 0.274943 180.000000
50% 205.000000 222.000000 19.000000 0.520642 210.000000
75% 305.000000 322.000000 20.000000 0.759642 236.000000
max 581.000000 600.000000 487.000000 1.000000 371.000000

解説

shape 属性は (行数, 列数) の形式でデータフレームのサイズを返します。 describe() メソッドは、数値列に対して count(件数)、mean(平均)、std(標準偏差)、min(最小値)、25%/50%/75%(四分位数)、max(最大値)を一覧表示します。

このデータセットには約20万行のマンガ各話データが含まれており、pages(ページ数)やprice(価格)などの数値列の分布を把握することができます。

関連セクション: 詳しくはマンガデータの基礎分析を参照してください。

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

関連セクション: マンガデータの基礎分析

データ全体の統計量を確認した後は、特定の条件で絞り込んだデータの特徴を確認してみましょう。 df_ceから「週刊少年マガジン」(mcname列が"週刊少年マガジン")のデータのみを抽出し、その記述統計量を表示してください。

Hide code cell content
# 週刊少年マガジンのデータのみを抽出
df_magazine = df_ce[df_ce["mcname"] == "週刊少年マガジン"]

# 記述統計量を表示
df_magazine.describe()
page_start page_end pages page_start_position price
count 45364.000000 45364.000000 45364.000000 45364.000000 45364.000000
mean 219.464553 237.264108 18.799555 0.524187 208.958227
std 127.908644 125.607398 8.623362 0.282786 39.512700
min 1.000000 1.000000 1.000000 0.002137 80.000000
25% 113.000000 132.000000 18.000000 0.285429 180.000000
50% 211.000000 230.000000 19.000000 0.531250 219.000000
75% 317.000000 334.000000 20.000000 0.767584 241.000000
max 581.000000 587.000000 392.000000 1.000000 280.000000

解説

ブールインデックスを使うことで、特定の条件に合致するデータのみを抽出できます。 df[df["列名"] == "値"] という形式で、指定した列が特定の値と一致する行のみを取得します。

週刊少年マガジンのデータに絞ることで、この雑誌特有のページ数の傾向や掲載位置の分布を確認できます。 他の雑誌と比較することで、雑誌ごとの編集方針の違いが見えてくるかもしれません。

関連セクション: 詳しくはマンガデータの基礎分析を参照してください。

標準 問題4:特定の列に絞ったユニーク値の確認#

関連セクション: マンガデータの基礎分析

データに含まれるカテゴリの種類を把握することも、基礎分析の重要なステップです。 df_ceからmcname(雑誌名)とccname(作品名)の2列を選択し、それぞれのユニーク値の数を確認してください。

Hide code cell content
# mcnameとccnameの2列を選択し、ユニーク値の数を確認
df_ce[["mcname", "ccname"]].nunique()
mcname       4
ccname    6845
dtype: int64

解説

nunique() メソッドは、各列に含まれるユニーク値(重複を除いた値)の数を返します。 複数の列を選択してから nunique() を適用することで、選択した列のみの情報を確認できます。

結果を見ると、mcname(雑誌名)は4種類、ccname(作品名)は数千種類あることがわかります。 これは、本データセットが四大少年誌を対象としており、約50年間に多数の作品が連載されてきたことを反映しています。

関連セクション: 詳しくはマンガデータの基礎分析を参照してください。

標準 問題5:欠損値の確認#

関連セクション: マンガデータの基礎分析

データ分析の重要なステップとして、欠損値の状態を把握することが挙げられます。 df_ceに含まれる欠損値の合計数を、列ごとに集計して表示してください。

Hide code cell content
# 欠損値の合計数を列ごとに集計
df_ce.isna().sum()
ceid                       0
cename                 26815
ccid                       9
miid                       0
page_start                 0
page_end                   0
pages                      0
page_start_position        0
two_colored                0
four_colored               0
miname                     0
mcid                       0
mcname                     0
date                       0
price                     38
ccname                     9
dtype: int64

解説

欠損値(NaN)は、後続の分析や可視化においてエラーの原因となったり、集計結果を歪める要因になります。

このデータセットでは cename(各話サブタイトル)に26,815件、price(価格)に38件の欠損が含まれていることがわかります。 分析を進める前に、欠損の発生パターンや原因を考察し、適切な対処法(除外、補完など)を検討することが重要です。

関連セクション: 詳しくはマンガデータの基礎分析を参照してください。

標準 問題6:雑誌ごとの平均ページ数#

関連セクション: マンガデータの基礎分析

「データの全体像の把握」から一歩踏み込み、カテゴリごとの特徴を深掘りしてみましょう。 df_ceを用いて、マンガ雑誌(mcname)ごとの1話あたりの平均ページ数(pages)を算出してください。 結果は数値が見やすいように、平均ページ数の多い順にソートして表示しましょう。

Hide code cell content
# mcnameごとにpagesの平均を算出し、降順にソート
df_ce.groupby("mcname")["pages"].mean().sort_values(ascending=False)
mcname
週刊少年ジャンプ      19.199578
週刊少年マガジン      18.799555
週刊少年チャンピオン    18.076886
週刊少年サンデー      18.066296
Name: pages, dtype: float64

解説

出力結果を見ると、雑誌によって1話あたりの平均ページ数に若干の違いがあることがわかります。 これは編集方針の違い違いが反映されている可能性があります。 ちなみに、雑誌別のページ数のヒストグラムは下巻2章を参照下さい[1]

このようにカテゴリごとの定量的な違いを把握しておくことは、後続の分析における仮説構築の土台となります。

関連セクション: 詳しくはマンガデータの基礎分析を参照してください。

発展 問題7:巻頭カラー作品の傾向分析#

関連セクション: マンガデータの基礎分析

マンガ雑誌において、巻頭(雑誌の最初の方)に掲載される作品ほど、人気や注目度が高い傾向があります。 本章で定義した page_start_position 列を活用して、この仮説を検証してみましょう。

  • 掲載位置が雑誌全体の先頭5%以内(page_start_position が0.05以下)にある各話データを抽出してください

  • 抽出したデータの中で4色カラー(four_coloredTrue)である各話の割合を算出してください

Hide code cell content
# 掲載位置が先頭5%以内のデータを抽出
df_top_position = df_ce[df_ce["page_start_position"] <= 0.05]

# その中で4色カラーである作品数をカウント
df_top_position["four_colored"].mean()
0.810580793559517

解説

page_start_position は0に近いほど巻頭、1に近いほど巻末を表す、本章で定義した独自指標です。

現在の週刊少年マンガ雑誌には、約20程度のマンガ作品掲載されています。 つまり先頭5%以内とは、ほとんどの場合巻頭(雑誌の一番最初)に掲載される作品です。 結果を見ると、該当作品の約81%が4色カラーであることがわかります。 これは「巻頭付近の作品はカラーページであることが多い」という仮説を裏付けているように見えます。

基礎分析では、このようにドメイン知識から導かれる仮説とデータを結びつけて検証することが重要です。

関連セクション: 詳しくはマンガデータの基礎分析を参照してください。