上巻 第3章 解答例#
ここでは、 本書の学習内容の定着 を目的とした練習問題とその解答・解説を掲載します。 なお、問題の性質上、本書で取り上げた処理と重複することがあります。 ご了承ください。
前提#
以下のように、ライブラリのインポート、変数の定義、およびデータの読み込みが完了していることを前提とします。
Show 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行を表示し、どのような列が含まれているかを確認してください。
ヒント
データフレームの先頭行を表示するには
head()メソッドを使用します本文では引数なしで先頭5行を表示しましたが、引数に数値を指定すると表示行数を変更できます(例:
head(3)で3行)
Show 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の行数と列数を確認し、さらに数値列の記述統計量(平均、標準偏差、最小値、最大値など)を表示してください。
ヒント
データフレームの行数・列数は
shape属性で確認できます(例:df.shape)数値列の記述統計量は
describe()メソッドで取得できます
Show 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列が"週刊少年マガジン")のデータのみを抽出し、その記述統計量を表示してください。
ヒント
条件に合致する行を抽出するには、ブールインデックスを使用します(例:
df[df["列名"] == "値"])抽出したデータに対して
describe()メソッドを適用します他の雑誌名には「週刊少年マガジン」「週刊少年サンデー」「週刊少年チャンピオン」があります
Show 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列を選択し、それぞれのユニーク値の数を確認してください。
ヒント
複数の列を選択するには
df[["列名1", "列名2"]]の形式を使用しますユニーク値の数は
nunique()メソッドで確認できます他の列の組み合わせ(例:
["miname", "cename"])でも試してみましょう
Show 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に含まれる欠損値の合計数を、列ごとに集計して表示してください。
ヒント
欠損値の確認には
.isna()メソッドと.sum()メソッドを組み合わせます.isna()は各セルが欠損値かどうかをTrue/Falseで返し、.sum()で列ごとの合計を算出します
Show 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)を算出してください。
結果は数値が見やすいように、平均ページ数の多い順にソートして表示しましょう。
ヒント
カテゴリごとの集計には
.groupby()メソッドを使用します平均値の算出には
.mean()メソッドを使用しますソートには
.sort_values()メソッドを使用します
Show 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_coloredがTrue)である各話の割合を算出してください
ヒント
条件による行の抽出にはブールインデックスを使用します(例:
df[df["col"] <= 0.05])ブール値の列の平均を取ると、
Trueの割合が得られます
Show 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色カラーであることがわかります。 これは「巻頭付近の作品はカラーページであることが多い」という仮説を裏付けているように見えます。
基礎分析では、このようにドメイン知識から導かれる仮説とデータを結びつけて検証することが重要です。
関連セクション: 詳しくはマンガデータの基礎分析を参照してください。