上巻 第5章 練習問題#
ここでは、 本書の学習内容の定着 を目的とした練習問題を掲載します。 解答・解説は「解答例」ページを参照してください。 なお、問題の性質上、本書で取り上げた処理と重複することがあります。 ご了承ください。
前提#
以下のように、ライブラリのインポートと変数の定義が完了していることを前提とします。
Show code cell content
# pathlibモジュールのインポート
# ファイルシステムのパスを扱う
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_IN = Path("../../../data/cm/input")
# ファイル名の定義
FN_CE = "cm_ce.csv"
# plotlyの描画設定の定義
# Jupyter Notebook環境のグラフ表示に適切なものを選択
RENDERER = "plotly_mimetype+notebook"
また、本書中で取り上げた以下の関数も、同様に利用可能とします。
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
# マンガ各話データを格納するcm_ce.csvを読み出し、df_ceとして格納
df_ce = pd.read_csv("../../../data/cm/input/cm_ce.csv")
基礎 問題1:DataFrameの冒頭行の確認#
関連セクション: Pandasの基礎
データ分析の第一歩は、データの中身を確認することです。
本文では head() メソッドでデフォルトの5行を表示しましたが、もう少し多くの行を確認してみましょう。
df_ce の先頭10行を表示してください。
ヒント
head()メソッドに引数を渡すことで、表示する行数を指定できます例えば
df.head(3)とすると先頭3行が表示されます
基礎 問題2:記述統計量の確認#
関連セクション: Pandasの基礎
数値データの全体像を把握するには、平均値や標準偏差などの記述統計量を確認することが有効です。
df_ce の pages(ページ数)列と page_start_position(掲載位置)列に対して describe() メソッドを適用し、記述統計量を確認してください。
ヒント
複数の列を選択するには
df[["列名1", "列名2"]]のようにリストで指定しますdescribe()メソッドは、件数・平均・標準偏差・最小値・四分位数・最大値を一括で算出します
標準 問題3:特定の雑誌に絞った基礎統計#
関連セクション: Pandasの基礎
全体の統計量だけでなく、特定のカテゴリに絞った統計量を確認することで、より詳細な傾向が見えてきます。
df_ce から週刊少年チャンピオン(mcname が「週刊少年チャンピオン」)のデータのみを抽出し、pages 列の記述統計量を describe() で確認してください。
ヒント
特定の条件に合致する行を抽出するには、ブールインデックス
df[df["列名"] == "値"]を使用します例えば
df[df["mcname"] == "週刊少年サンデー"]とすると、週刊少年サンデーのデータのみが抽出されます
標準 問題4:特定の条件で絞ったソート#
関連セクション: Pandasの基礎
データをソートすることで、特定の傾向を持つデータを見つけやすくなります。 フィルタリングとソートを組み合わせて、特定の条件を満たすデータを確認してみましょう。
df_ce からページ数(pages)が10以上のデータのみを抽出し、掲載位置(page_start_position)で昇順にソートして先頭5行を表示してください。
ヒント
条件による抽出は
df[df["列名"] >= 値]のようにブールインデックスを使用しますソートには
sort_values("列名")を使用します(デフォルトは昇順)先頭5行の表示は
head()を使用します
標準 問題5:短ページ作品の除外と基礎統計#
関連セクション: Pandasの基礎
データセットの中には、数ページのみの告知や短編掲載が含まれていることがあります。 一般的なマンガ作品を分析する際は、これらを除外した方が良いでしょう。
pages(ページ数)列を利用して、ページ数が3ページより大きい(pages > 3)データのみを抽出してください抽出後のデータの平均ページ数を算出し、全体像を確認しましょう
ヒント
条件による行の抽出にはブールインデックスを使用します(例:
df[df["col"] > 3])平均値の算出には
.mean()メソッドを使用します
発展 問題6:雑誌1冊あたりのマンガ作品数#
関連セクション: Pandasの基礎
マンガ雑誌を「物理的な1冊」として捉えたとき、そこに何作品が詰め込まれているかは、雑誌の個性や読み応えを決定づける重要な要素です。
雑誌名(
mcname)と雑誌巻号ID(miid)をキーにグループ化してください1冊ごとの作品数(
ccidのユニーク数)を算出し、新しいデータフレームdf_countsを作成してください各雑誌(
mcname)ごとの「1冊あたりの平均作品数」を算出して比較しましょう
ヒント
複数のカラムでグループ化するには
.groupby(["col1", "col2"])とリスト形式で指定しますユニークな要素数は
.nunique()でカウントできます集計後の列名は
.rename(columns={...})で変更できます
発展 問題7:作品数分布#
関連セクション: Plotlyの基礎
問題6で算出した「平均値」だけでは、合併号や増刊号などで作品数が大きく変動している可能性(分布の広がり)が見えません。
df_counts を利用して、1冊あたりの作品数の分布を雑誌ごとに可視化しましょう。
px.histogram()を使用して、1冊あたりの作品数(ccid_per_miid)のヒストグラムを作成してくださいfacet_colにmcnameを指定して、雑誌ごとに分布の形状を比較してください
ヒント
px.histogram()でヒストグラムを作成しますfacet_col引数でカテゴリごとにグラフを分割できますfacet_col_wrapで折り返しの列数を指定できます