マンガデータの基礎分析#

準備#

Import#

Hide code cell content
# warningsモジュールのインポート
import warnings

# データ解析や機械学習のライブラリ使用時の警告を非表示にする目的で警告を無視
# 本書の文脈では、可視化の学習に議論を集中させるために選択した
# ただし、学習以外の場面で、警告を無視する設定は推奨しない
warnings.filterwarnings("ignore")
Hide code cell content
# osモジュールのインポート
# オペレーティングシステムとのインターフェースを提供
import os

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

# numpy:数値計算ライブラリのインポート
# npという名前で参照可能
import numpy as np

# pandas:データ解析ライブラリのインポート
# pdという名前で参照可能
import pandas as pd

# tqdm_notebookのインポート
# Jupyter Notebook環境でのプログレスバー表示に使用
# tqdmという名前で参照可能
from tqdm import tqdm_notebook as tqdm

変数#

Hide code cell content
# 読み込み対象ディレクトリの定義

# マンガデータ保存ディレクトリのパス
DIR_IN = Path("../../../data/cm/input")
Hide code cell content
# 読み込み対象ファイル名の定義

# Comic Episode関連のファイル名
FN_CE = "cm_ce.csv"

# Comic CollectionとCReaTor関連のファイル名
FN_CC_CRT = "cm_cc_crt.csv"

cm_ce.csvの基礎分析#

Hide code cell content
# pandasのread_csv関数でCSVファイルの読み込み
df_ce = pd.read_csv(DIR_IN / FN_CE)

全体像の把握#

Hide code cell content
# df_ceデータフレームの先頭5行を表示し、Tで転置
df_ce.head().T
0 1 2 3 4
ceid CE00000 CE00001 CE00002 CE00003 CE00004
cename 第238話/この世代 #134 話の続き 第5話 チア・ザ・マシンガン! 第233話 妖精の輝き -BOUT 71- From Dark Zone
ccid C90829 C90482 C90297 C89978 C89929
miid M535428 M535428 M535428 M535428 M535428
page_start 10.0 33.0 51.0 69.0 89.0
page_end 31.0 50.0 68.0 88.0 108.0
pages 22.0 18.0 18.0 20.0 20.0
page_start_position 0.021368 0.070513 0.108974 0.147436 0.190171
two_colored False False False False False
four_colored True False False False False
miname 週刊少年マガジン 2011年 表示号数24 週刊少年マガジン 2011年 表示号数24 週刊少年マガジン 2011年 表示号数24 週刊少年マガジン 2011年 表示号数24 週刊少年マガジン 2011年 表示号数24
mcid C119033 C119033 C119033 C119033 C119033
mcname 週刊少年マガジン 週刊少年マガジン 週刊少年マガジン 週刊少年マガジン 週刊少年マガジン
date 2011-05-25 2011-05-25 2011-05-25 2011-05-25 2011-05-25
price 248.0 248.0 248.0 248.0 248.0
ccname ダイヤのA 君のいる町 アゲイン!! FAIRY TAIL A-BOUT!
Hide code cell content
# df_ceデータフレームの形状(行数・列数)を取得
# shape属性を使用すると、(行数, 列数)の形で結果が返される
df_ce.shape
(180076, 16)
Hide code cell content
# df_ceデータフレーム内の欠損値(NaN)の情報を集計
# isna()メソッドを使用して欠損値の場所をTrueとして特定
# agg()メソッドを使用して、各列における欠損値の合計と平均を計算し、Tで転置して表示
df_ce.isna().agg([sum, "mean"]).T
sum mean
ceid 0.0 0.000000
cename 26815.0 0.148909
ccid 9.0 0.000050
miid 0.0 0.000000
page_start 0.0 0.000000
page_end 0.0 0.000000
pages 0.0 0.000000
page_start_position 0.0 0.000000
two_colored 0.0 0.000000
four_colored 0.0 0.000000
miname 0.0 0.000000
mcid 0.0 0.000000
mcname 0.0 0.000000
date 0.0 0.000000
price 38.0 0.000211
ccname 9.0 0.000050
Hide code cell content
# df_ceデータフレームの記述統計情報を取得
# describe()メソッドを使用して、各列の中央値、平均、標準偏差などの基本的な統計量を表示
df_ce.describe()
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
Hide code cell content
# df_ceデータフレームの各列に対してユニークな値の数をカウント
# nunique()メソッドを使用して、各列のユニークな値の数を計算
# その後、結果を新しいデータフレームとして整形し、列名を"nunique"とする
df_ce.nunique().reset_index(name="nunique")
index nunique
0 ceid 180076
1 cename 150446
2 ccid 6953
3 miid 9242
4 page_start 550
5 page_end 568
6 pages 121
7 page_start_position 45279
8 two_colored 2
9 four_colored 2
10 miname 9226
11 mcid 4
12 mcname 4
13 date 6380
14 price 32
15 ccname 6845

date列の深掘り#

Hide code cell content
# df_ceデータフレームの"date"列から最も古い日付と最も新しい日付を取得
# min()メソッドを使用して、最も古い日付を抽出
# max()メソッドを使用して、最も新しい日付を抽出
df_ce["date"].min(), df_ce["date"].max()
('1970-07-27', '2017-07-31')
Hide code cell content
# "date"列を日付型に変換
# pd.to_datetime()メソッドを使用して、文字列型の日付を日付型(datetime)に変換
df_ce["date"] = pd.to_datetime(df_ce["date"])

# 年に関する情報を新しい"year"列として追加
# dt.yearを使用して、日付から年のみを取得
df_ce["year"] = df_ce["date"].dt.year

# 月に関する情報を新しい"month"列として追加
# dt.monthを使用して、日付から月のみを取得
df_ce["month"] = df_ce["date"].dt.month

# 曜日に関する情報を新しい"weekday"列として追加
# dt.weekdayを使用して、日付から曜日の情報を数値(0:月曜日, 6:日曜日)として取得
df_ce["weekday"] = df_ce["date"].dt.weekday
Hide code cell content
# "year"(年)ごとに各カラムのユニークな値の数を集計
# groupbyメソッドで"year"を基準にグループ化し、nuniqueメソッドを使用して各カラムのユニークな値の数を計算
# その後、reset_indexメソッドでインデックスをリセットし、データフレームとして結果を返す
df_ce.groupby("year")[["month", "mcid", "miid", "ccid", "ceid"]].nunique().reset_index()
year month mcid miid ccid ceid
0 1970 6 4 86 182 1201
1 1971 12 4 204 295 2746
2 1972 12 4 204 245 2740
3 1973 12 4 205 262 2828
4 1974 12 4 199 188 2387
5 1975 12 4 202 164 2477
6 1976 12 4 200 190 2765
7 1977 12 4 202 194 2839
8 1978 12 4 202 180 2843
9 1979 12 4 200 197 3007
10 1980 12 4 201 234 3123
11 1981 12 4 205 221 3207
12 1982 12 4 201 223 3228
13 1983 12 4 202 218 3284
14 1984 12 4 201 178 3266
15 1985 12 4 201 179 3193
16 1986 12 4 200 196 3168
17 1987 12 4 199 215 3468
18 1988 12 4 204 231 3849
19 1989 12 4 198 243 3979
20 1990 12 4 199 230 4016
21 1991 12 4 192 205 3932
22 1992 12 4 193 193 3833
23 1993 12 4 192 221 3805
24 1994 12 4 192 227 3992
25 1995 12 4 192 208 4075
26 1996 12 4 192 198 4053
27 1997 12 4 192 214 4202
28 1998 12 4 193 212 4217
29 1999 12 4 192 209 4307
30 2000 12 4 194 229 4342
31 2001 12 4 192 220 4389
32 2002 12 4 193 239 4337
33 2003 12 4 194 243 4270
34 2004 12 4 193 268 4358
35 2005 12 4 193 245 4350
36 2006 12 4 192 248 4608
37 2007 12 4 191 229 4634
38 2008 12 4 192 258 4653
39 2009 12 4 200 269 4851
40 2010 12 4 194 281 4704
41 2011 12 4 190 249 4507
42 2012 12 4 196 278 4687
43 2013 12 4 192 324 4670
44 2014 12 4 192 355 4755
45 2015 12 4 194 323 4708
46 2016 12 4 194 298 4602
47 2017 7 4 111 253 2621
Hide code cell content
# "weekday"(曜日)ごとに各カラムのユニークな値の数を集計
# groupbyメソッドで"weekday"を基準にグループ化し、nuniqueメソッドを使用して各カラムのユニークな値の数を計算
# その後、reset_indexメソッドでインデックスをリセットし、データフレームとして結果を返す
df_ce.groupby("weekday")[["mcid", "miid", "ccid", "ceid"]].nunique().reset_index()
weekday mcid miid ccid ceid
0 0 4 2751 2777 48901
1 1 4 56 570 1148
2 2 4 3409 2467 74516
3 3 4 1368 1572 30737
4 4 4 508 888 8954
5 5 4 55 530 1110
6 6 4 1095 1306 14710

mcidmcname列の深掘り#

Hide code cell content
# "mcid"(マンガ雑誌ID)ごとにユニークな"mcname"(マンガ雑誌名)の数を集計
# groupbyメソッドで"mcid"を基準にグループ化し、nuniqueメソッドを使用して"mcname"のユニークな値の数を計算
df_ce.groupby("mcid")["mcname"].nunique().reset_index()
mcid mcname
0 C117607 1
1 C119033 1
2 C119459 1
3 C120282 1
Hide code cell content
# "mcname"(マンガ雑誌名)ごとにユニークな"miid"(マンガ巻号ID)と"ceid"(マンガ各話ID)の数を集計
# groupbyメソッドで"mcname"を基準にグループ化し、nuniqueメソッドを使用してそれぞれのユニークな値の数を計算
# sort_valuesメソッドを用いて"ceid"の数で降順にソート
df_ce.groupby("mcname")[["miid", "ceid"]].nunique().sort_values(
    by="ceid", ascending=False
).reset_index()
mcname miid ceid
0 週刊少年サンデー 2307 46172
1 週刊少年チャンピオン 2321 45444
2 週刊少年マガジン 2308 45364
3 週刊少年ジャンプ 2306 43096
Hide code cell content
# "mcname"と"weekday"でグループ化し、ユニークな"miid"の数を集計
df_grouped = df_ce.groupby(["mcname", "weekday"])["miid"].nunique().reset_index()

# 集計結果をマンガ雑誌名x曜日の形式のデータフレームに変形
df_grouped.pivot(index="mcname", columns="weekday", values="miid")
weekday 0 1 2 3 4 5 6
mcname
週刊少年サンデー 9 9 1706 22 16 15 530
週刊少年ジャンプ 2177 25 25 22 22 15 20
週刊少年チャンピオン 554 9 5 1298 444 5 6
週刊少年マガジン 11 13 1673 26 26 20 539

miidminame列の深掘り#

Hide code cell content
# "miid"ごとにユニークな"miname"の数を集計し、その統計情報を取得
df_ce.groupby("miid")["miname"].nunique().describe().reset_index()
index miname
0 count 9242.0
1 mean 1.0
2 std 0.0
3 min 1.0
4 25% 1.0
5 50% 1.0
6 75% 1.0
7 max 1.0
Hide code cell content
# "miname"ごとにユニークな"miid"の数を集計し、その統計情報を取得
df_ce.groupby("miname")["miid"].nunique().describe().reset_index()
index miid
0 count 9226.000000
1 mean 1.001734
2 std 0.041610
3 min 1.000000
4 25% 1.000000
5 50% 1.000000
6 75% 1.000000
7 max 2.000000
Hide code cell content
# "miname"ごとにユニークな"miid"の数を集計
df_tmp = df_ce.groupby("miname")["miid"].nunique().reset_index()

# "miid"が複数ある"miname"を抽出
df_tmp[df_tmp["miid"] > 1]
miname miid
1556 週刊少年サンデー 2002年 表示号数1 2
1614 週刊少年サンデー 2003年 表示号数2 2
1929 週刊少年サンデー 2009年 表示号数48 2
4346 週刊少年ジャンプ 2012年 表示号数18 2
4365 週刊少年ジャンプ 2012年 表示号数36 2
5496 週刊少年チャンピオン 1988年 表示号数1 2
5982 週刊少年チャンピオン 1998年 表示号数1 2
6270 週刊少年チャンピオン 2004年 表示号数1 2
6510 週刊少年チャンピオン 2009年 表示号数1 2
6672 週刊少年チャンピオン 2012年 表示号数28 2
6798 週刊少年チャンピオン 2015年 表示号数1 2
7046 週刊少年マガジン 1973年 表示号数1 2
7399 週刊少年マガジン 1980年 表示号数13 2
7551 週刊少年マガジン 1983年 表示号数14 2
8378 週刊少年マガジン 2000年 表示号数1 2
8523 週刊少年マガジン 2003年 表示号数1 2
Hide code cell content
# "miid"が複数ある"miname"の一覧を取得
df_multi_miid = df_tmp[df_tmp["miid"] > 1]

# 上記で取得した"miname"に関するデータをフィルタリングし、
# "miid"と"miname"ごとのユニークな"ceid"の数を集計
df_ce[df_ce["miname"].isin(df_multi_miid["miname"].unique())].groupby(
    ["miid", "miname"]
)["ceid"].nunique().reset_index()
miid miname ceid
0 M535787 週刊少年マガジン 2003年 表示号数1 20
1 M535835 週刊少年マガジン 2003年 表示号数1 23
2 M535936 週刊少年マガジン 2000年 表示号数1 22
3 M535984 週刊少年マガジン 2000年 表示号数1 24
4 M536625 週刊少年マガジン 1983年 表示号数14 15
5 M536830 週刊少年マガジン 1983年 表示号数14 14
6 M536985 週刊少年マガジン 1980年 表示号数13 16
7 M536986 週刊少年マガジン 1980年 表示号数13 16
8 M537298 週刊少年マガジン 1973年 表示号数1 11
9 M537349 週刊少年マガジン 1973年 表示号数1 11
10 M556298 週刊少年チャンピオン 2009年 表示号数1 24
11 M556346 週刊少年チャンピオン 2009年 表示号数1 26
12 M556543 週刊少年チャンピオン 2004年 表示号数1 24
13 M556589 週刊少年チャンピオン 2004年 表示号数1 22
14 M556831 週刊少年チャンピオン 1998年 表示号数1 24
15 M556879 週刊少年チャンピオン 1998年 表示号数1 22
16 M557327 週刊少年チャンピオン 1988年 表示号数1 19
17 M557377 週刊少年チャンピオン 1988年 表示号数1 19
18 M577312 週刊少年サンデー 2009年 表示号数48 24
19 M577313 週刊少年サンデー 2009年 表示号数48 24
20 M577599 週刊少年サンデー 2003年 表示号数2 21
21 M577647 週刊少年サンデー 2003年 表示号数2 21
22 M577648 週刊少年サンデー 2002年 表示号数1 22
23 M577695 週刊少年サンデー 2002年 表示号数1 22
24 M616417 週刊少年ジャンプ 2012年 表示号数18 14
25 M616418 週刊少年ジャンプ 2012年 表示号数18 9
26 M616435 週刊少年ジャンプ 2012年 表示号数36 22
27 M616436 週刊少年ジャンプ 2012年 表示号数36 1
28 M616963 週刊少年チャンピオン 2012年 表示号数28 23
29 M616964 週刊少年チャンピオン 2012年 表示号数28 2
30 M675843 週刊少年チャンピオン 2015年 表示号数1 22
31 M675891 週刊少年チャンピオン 2015年 表示号数1 22
Hide code cell content
# "miname"が"週刊少年ジャンプ 2012年 表示号数18"である行をフィルタリングして取得
df_ce[df_ce["miname"] == "週刊少年ジャンプ 2012年 表示号数18"][
    ["cename", "ccname", "miid", "page_start", "page_end"]
]
cename ccname miid page_start page_end
151607 第140箱 「生きることは劇的だ」 めだかボックス M616417 3.0 37.0
151608 486. The Crimson Cremation BLEACH M616417 39.0 55.0
151609 第662話 七武海ローVS.スモーカー中将 ONE PIECE M616417 57.0 75.0
151610 第227話 トラブル・トラベル-1 SKET DANCE M616417 77.0 95.0
151611 173ページ 瞬間と最終巻 バクマン。 M616417 97.0 115.0
151612 グルメ 181 食林寺!! トリコ M616417 117.0 135.0
151613 Vol.6 泊まりだけど パジャマな彼女。 M616417 139.0 157.0
151614 第7話 “持たざる者”のことば ハイキュー!! M616417 161.0 179.0
151615 第172回 「インフル園児」 いぬまるだしっ M616417 183.0 191.0
151616 第53話 突撃プロポーズ!!! magico M616417 193.0 211.0
151617 標的 379 ダメージ 家庭教師ヒットマンREBORN! M616417 213.0 229.0
151618 29本目 はじまりの先へ クロガネ M616417 231.0 249.0
151619 第19紀 満開!ストレス地獄お花見 / ・アイツが入学 / ・アイツの部活 現存!古代生物史パッキー M616417 251.0 265.0
151620 第37歩 帰還 ST&RS -スターズ- M616417 267.0 285.0
151621 第159Q どこいった!? 黒子のバスケ M616418 3.0 31.0
151622 580:兄弟の時間 NARUTO-ナルト- M616418 33.0 49.0
151623 第394訓 呉越同舟 銀魂 M616418 51.0 69.0
151624 第20話 ドンカン ニセコイ M616418 71.0 89.0
151625 レイコ変身の巻 こちら葛飾区亀有公園前派出所 M616418 91.0 109.0
151626 NaN 恋するエジソン M616418 111.0 135.0
151627 バブ 150 ちゅらい べるぜバブ M616418 137.0 155.0
151628 第196幕 土蜘蛛の過去 ぬらりひょんの孫 M616418 157.0 175.0
151629 #435 アニ基地 ジャンプアニメ情報基地 M616418 177.0 180.0
Hide code cell content
# 各"miname"(雑誌巻号名)におけるユニークな"ceid"(各話ID)をカウント
# そして、その掲載話数で昇順にソートする
df_ce.groupby(["miname"])["ceid"].nunique().sort_values().reset_index()
miname ceid
0 週刊少年マガジン 1975年 表示号数1 8
1 週刊少年マガジン 1971年 表示号数1 8
2 週刊少年マガジン 1974年 表示号数44 9
3 週刊少年マガジン 1974年 表示号数33 9
4 週刊少年マガジン 1974年 表示号数34 9
... ... ...
9221 週刊少年チャンピオン 2004年 表示号数1 46
9222 週刊少年サンデー 2009年 表示号数48 48
9223 週刊少年チャンピオン 2009年 表示号数1 50
9224 週刊少年サンデー 2013年 表示号数6 50
9225 週刊少年ジャンプ 2014年 表示号数4 57

9226 rows × 2 columns

Hide code cell content
# "miname"(雑誌巻号名)ごとに"ceid"(各話ID)のユニーク数と最初の発行年を集計
df_mid = (
    df_ce.groupby("miname")[["ceid", "year"]]
    .agg({"ceid": "nunique", "year": "first"})
    .reset_index()
)

# 発行年("year")ごとに、巻号名("miname")単位の各話数("ceid")の統計情報を集計
df_mid.groupby("year")["ceid"].describe().reset_index()
year count mean std min 25% 50% 75% max
0 1970 86.0 13.965116 2.826129 9.0 12.00 14.0 16.00 23.0
1 1971 204.0 13.460784 2.047089 8.0 12.00 13.0 15.00 26.0
2 1972 204.0 13.431373 1.505391 10.0 12.00 14.0 15.00 16.0
3 1973 204.0 13.862745 1.899127 9.0 13.00 14.0 15.00 22.0
4 1974 199.0 11.994975 1.876213 9.0 10.00 12.0 13.00 17.0
5 1975 202.0 12.262376 1.494757 8.0 11.00 12.0 13.00 19.0
6 1976 200.0 13.825000 1.058289 12.0 13.00 14.0 15.00 16.0
7 1977 202.0 14.054455 0.957819 11.0 13.00 14.0 15.00 17.0
8 1978 202.0 14.074257 1.007154 11.0 13.00 14.0 15.00 18.0
9 1979 200.0 15.035000 1.126999 12.0 14.00 15.0 16.00 19.0
10 1980 200.0 15.615000 1.448192 14.0 15.00 15.0 16.00 32.0
11 1981 205.0 15.643902 0.957440 14.0 15.00 16.0 16.00 19.0
12 1982 201.0 16.059701 1.177462 14.0 15.00 16.0 17.00 19.0
13 1983 201.0 16.338308 1.440477 14.0 15.00 16.0 17.00 29.0
14 1984 201.0 16.248756 0.786010 14.0 16.00 16.0 17.00 19.0
15 1985 201.0 15.885572 0.884218 14.0 15.00 16.0 16.00 19.0
16 1986 200.0 15.840000 1.405088 13.0 15.00 16.0 16.00 32.0
17 1987 199.0 17.427136 1.443714 15.0 16.00 17.0 18.00 21.0
18 1988 203.0 18.960591 1.613195 17.0 18.00 19.0 19.00 38.0
19 1989 198.0 20.095960 1.412735 16.0 19.00 20.0 21.00 28.0
20 1990 199.0 20.180905 1.183829 18.0 19.00 20.0 21.00 24.0
21 1991 192.0 20.479167 1.493295 18.0 19.00 20.0 21.00 25.0
22 1992 193.0 19.860104 1.474122 17.0 19.00 19.0 21.00 27.0
23 1993 192.0 19.817708 1.370252 17.0 19.00 20.0 21.00 26.0
24 1994 192.0 20.791667 1.671546 18.0 20.00 20.0 22.00 29.0
25 1995 192.0 21.223958 1.284971 18.0 20.00 21.0 22.00 26.0
26 1996 192.0 21.109375 1.469949 18.0 20.00 21.0 22.00 24.0
27 1997 192.0 21.885417 1.924599 18.0 20.00 22.0 23.00 27.0
28 1998 192.0 21.963542 2.617645 17.0 20.75 22.0 23.00 46.0
29 1999 192.0 22.432292 1.940367 18.0 21.00 23.0 24.00 26.0
30 2000 193.0 22.497409 2.549764 18.0 21.00 23.0 24.00 46.0
31 2001 192.0 22.859375 1.623136 19.0 21.00 23.0 24.00 26.0
32 2002 192.0 22.588542 2.309206 18.0 21.00 23.0 24.00 44.0
33 2003 192.0 22.239583 3.045019 18.0 21.00 22.0 23.00 43.0
34 2004 192.0 22.697917 2.955587 18.0 21.00 23.0 24.00 46.0
35 2005 193.0 22.538860 2.056441 18.0 21.00 22.0 24.00 30.0
36 2006 192.0 24.000000 2.326717 19.0 22.00 24.0 26.00 29.0
37 2007 191.0 24.261780 2.336114 19.0 23.00 24.0 26.00 30.0
38 2008 192.0 24.234375 2.057362 19.0 23.00 25.0 26.00 30.0
39 2009 198.0 24.500000 4.037577 19.0 22.25 24.0 26.00 50.0
40 2010 194.0 24.247423 2.761808 19.0 23.00 24.0 26.00 38.0
41 2011 190.0 23.721053 2.323353 19.0 22.00 24.0 26.00 29.0
42 2012 193.0 24.284974 2.656876 20.0 23.00 24.0 26.00 46.0
43 2013 192.0 24.322917 2.822849 21.0 22.00 24.0 26.00 50.0
44 2014 192.0 24.880208 3.867061 19.0 23.00 24.0 26.25 57.0
45 2015 193.0 24.279793 3.569905 18.0 22.00 23.0 27.00 36.0
46 2016 194.0 23.721649 2.812785 19.0 22.00 23.0 25.00 36.0
47 2017 111.0 23.612613 2.997487 19.0 22.00 24.0 25.00 44.0
Hide code cell content
# 最も`ceid`数が少ない`mcname`("週刊少年マガジン 1975年 表示号数1")
# のデータを抽出し、特定のカラムを表示
df_ce[df_ce["miname"] == "週刊少年マガジン 1975年 表示号数1"][
    ["cename", "ccname", "miname", "pages"]
]
cename ccname miname pages
35089 NaN うしろの百太郎 週刊少年マガジン 1975年 表示号数1 15.0
35090 〈第三部〉 愛と誠 週刊少年マガジン 1975年 表示号数1 20.0
35091 ☆なつかしのスターアルバム その1 天才バカボン 週刊少年マガジン 1975年 表示号数1 12.0
35092 NaN おれは鉄兵 週刊少年マガジン 1975年 表示号数1 21.0
35093 NaN イヤハヤ南友 週刊少年マガジン 1975年 表示号数1 18.0
35094 第5章 毛バリの神サマ 釣りキチ三平 週刊少年マガジン 1975年 表示号数1 18.0
35095 第3部-炎の男のバラード 紅の挑戦者 週刊少年マガジン 1975年 表示号数1 19.0
35096 NaN 花の鉄砲松 週刊少年マガジン 1975年 表示号数1 62.0
Hide code cell content
# 最も`ceid`数が多い`mcname`("週刊少年ジャンプ 2014年 表示号数4")
# のデータを抽出し、特定のカラムを表示
df_ce[df_ce["miname"] == "週刊少年ジャンプ 2014年 表示号数4"][
    ["cename", "ccname", "miname", "pages"]
]
cename ccname miname pages
153472 第73話 大人の時間・二時間目 暗殺教室 週刊少年ジャンプ 2014年 表示号数4 42.0
153473 659:輪墓・辺獄…!! NARUTO-ナルト- 週刊少年ジャンプ 2014年 表示号数4 17.0
153474 第732話 地下の世界 ONE PIECE 週刊少年ジャンプ 2014年 表示号数4 19.0
153475 グルメ 262 三虎の食卓!! トリコ 週刊少年ジャンプ 2014年 表示号数4 19.0
153476 第243Q 私の勝ちね 黒子のバスケ 週刊少年ジャンプ 2014年 表示号数4 19.0
153477 第81χ Ψキック・サンタクロース 斉木楠雄のΨ難 週刊少年ジャンプ 2014年 表示号数4 15.0
153478 番外編 夏休みのエリナ 食戟のソーマ 週刊少年ジャンプ 2014年 表示号数4 31.0
153479 第44話 「大規模侵攻」 ワールドトリガー 週刊少年ジャンプ 2014年 表示号数4 19.0
153480 第91話 VS“傘” ハイキュー!! 週刊少年ジャンプ 2014年 表示号数4 19.0
153481 第4話 VSアシッドルーラー アイアンナイト 週刊少年ジャンプ 2014年 表示号数4 19.0
153482 クリスマス捜査の巻 こちら葛飾区亀有公園前派出所 週刊少年ジャンプ 2014年 表示号数4 1.0
153483 バギークリスマス ONE PIECE 週刊少年ジャンプ 2014年 表示号数4 1.0
153484 信じてたのに… NARUTO-ナルト- 週刊少年ジャンプ 2014年 表示号数4 1.0
153485 父の想い BLEACH 週刊少年ジャンプ 2014年 表示号数4 1.0
153486 ホワイトクリスマス 銀魂 週刊少年ジャンプ 2014年 表示号数4 1.0
153487 クリスマスケーキハウス トリコ 週刊少年ジャンプ 2014年 表示号数4 1.0
153488 あか○やサンタ 黒子のバスケ 週刊少年ジャンプ 2014年 表示号数4 1.0
153489 ターキー ニセコイ 週刊少年ジャンプ 2014年 表示号数4 1.0
153490 クリスマスプレゼント べるぜバブ 週刊少年ジャンプ 2014年 表示号数4 1.0
153491 烏野高校排球部のクリスマス ハイキュー!! 週刊少年ジャンプ 2014年 表示号数4 1.0
153492 幼少期のクリスマス 斉木楠雄のΨ難 週刊少年ジャンプ 2014年 表示号数4 1.0
153493 聖夜の夢 暗殺教室 週刊少年ジャンプ 2014年 表示号数4 1.0
153494 質問:サンタクロースはいるかい? 食戟のソーマ 週刊少年ジャンプ 2014年 表示号数4 1.0
153495 異文化交流 ワールドトリガー 週刊少年ジャンプ 2014年 表示号数4 1.0
153496 サンタクロース SOUL CATCHER(S) 週刊少年ジャンプ 2014年 表示号数4 1.0
153497 最高のプレゼント 恋のキューピッド 焼野原塵 週刊少年ジャンプ 2014年 表示号数4 1.0
153498 レニ本部長のチキン HACHI -東京23宮- 週刊少年ジャンプ 2014年 表示号数4 1.0
153499 1話読んだ後でどうぞ アイアンナイト 週刊少年ジャンプ 2014年 表示号数4 1.0
153500 クリスマス暇だね 磯部磯兵衛物語~浮世はつらいよ~ 週刊少年ジャンプ 2014年 表示号数4 1.0
153501 #519 アニ基地 ジャンプアニメ情報基地 週刊少年ジャンプ 2014年 表示号数4 3.0
153502 NaN 前夜祭 週刊少年ジャンプ 2014年 表示号数4 1.0
153503 出張版 / おやすみ!猫田さん / おあずけ!猫田さん / やっぱり!猫田さん はしやすめに猫田さん 週刊少年ジャンプ 2014年 表示号数4 2.0
153504 NaN オンオフ 週刊少年ジャンプ 2014年 表示号数4 2.0
153505 NaN もしジャンプの編集長がドラッカーの『マネジメント』を読んだら 週刊少年ジャンプ 2014年 表示号数4 2.0
153506 じゃんけん / 金太郎 奥間セイのツボ 週刊少年ジャンプ 2014年 表示号数4 2.0
153507 NaN 善代官 週刊少年ジャンプ 2014年 表示号数4 2.0
153508 NaN 微塵虎兄さん 週刊少年ジャンプ 2014年 表示号数4 2.0
153509 NaN バンバレカンチャン!! 週刊少年ジャンプ 2014年 表示号数4 2.0
153510 NaN 半見開き漫画 週刊少年ジャンプ 2014年 表示号数4 2.0
153511 NaN 全力マジシャン 週刊少年ジャンプ 2014年 表示号数4 2.0
153512 肋 / 汁 / 診察 / 胸 週刊少年伊原 週刊少年ジャンプ 2014年 表示号数4 2.0
153513 NaN Ohじゅけん! 週刊少年ジャンプ 2014年 表示号数4 2.0
153514 NaN フリーメイソン小林 週刊少年ジャンプ 2014年 表示号数4 2.0
153515 NaN ドッグ&ボーイの巻 週刊少年ジャンプ 2014年 表示号数4 2.0
153516 NaN 異議あり!! 週刊少年ジャンプ 2014年 表示号数4 2.0
153517 NaN 後夜祭 週刊少年ジャンプ 2014年 表示号数4 1.0
153518 op.32 異端児 SOUL CATCHER(S) 週刊少年ジャンプ 2014年 表示号数4 19.0
153519 第104話 ラクサマ ニセコイ 週刊少年ジャンプ 2014年 表示号数4 19.0
153520 第475訓 おれがリーダーでおまえもリーダーで 銀魂 週刊少年ジャンプ 2014年 表示号数4 17.0
153521 第19話 拙者の骨が折れまして…候 磯部磯兵衛物語~浮世はつらいよ~ 週刊少年ジャンプ 2014年 表示号数4 7.0
153522 第15話 新・中野宮 HACHI -東京23宮- 週刊少年ジャンプ 2014年 表示号数4 19.0
153523 562. THE VILLAIN 2 BLEACH 週刊少年ジャンプ 2014年 表示号数4 17.0
153524 年末大阪の巻 こちら葛飾区亀有公園前派出所 週刊少年ジャンプ 2014年 表示号数4 19.0
153525 バブ 233 石矢魔石だらけ べるぜバブ 週刊少年ジャンプ 2014年 表示号数4 19.0
153526 第14話 キューピッド心の交流をする 恋のキューピッド 焼野原塵 週刊少年ジャンプ 2014年 表示号数4 19.0
153527 第20話 犬のキモチで候 磯部磯兵衛物語~浮世はつらいよ~ 週刊少年ジャンプ 2014年 表示号数4 7.0
153528 [作]平野稜二 J連作 1コマギャグ 週刊少年ジャンプ 2014年 表示号数4 1.0

ccidccname列の深掘り#

Hide code cell content
# 各`ccid`に関連付けられたユニークな`ccname`の数を集計
# その結果の統計情報(平均、最小値、最大値など)を取得
df_ce.groupby("ccid")["ccname"].nunique().describe().reset_index()
index ccname
0 count 6953.0
1 mean 1.0
2 std 0.0
3 min 1.0
4 25% 1.0
5 50% 1.0
6 75% 1.0
7 max 1.0
Hide code cell content
# 各`ccname`に関連付けられたユニークな`ccid`の数を集計
# その結果の統計情報(平均、最小値、最大値など)を取得
df_ce.groupby("ccname")["ccid"].nunique().describe().reset_index()
index ccid
0 count 6845.000000
1 mean 1.015778
2 std 0.179411
3 min 1.000000
4 25% 1.000000
5 50% 1.000000
6 75% 1.000000
7 max 9.000000
Hide code cell content
# 各`ccname`ごとに関連付けられたユニークな`ccid`の数を集計
df_tmp = (
    df_ce.groupby("ccname")["ccid"].nunique().sort_values(ascending=False).reset_index()
)

# `ccid`数が1より多い`ccname`をリストとして取得
ccnames = df_tmp[df_tmp["ccid"] > 1]["ccname"].unique()

# 上記で取得した`ccname`リストを基に、各`ccname`と`ccid`の組み合わせごとに
# ユニークな`ceid`の数と`pages`の合計を集計
df_ce[df_ce["ccname"].isin(ccnames)].groupby(["ccname", "ccid"])[["ceid", "pages"]].agg(
    {"ceid": "nunique", "pages": sum}
).reset_index()
ccname ccid ceid pages
0 DEATH NOTE C87653 111 2433.0
1 DEATH NOTE C87654 1 1.0
2 FAIRY TAIL C89977 1 8.0
3 FAIRY TAIL C89978 547 11617.0
4 MAJOR C91652 292 5912.0
... ... ... ... ...
190 青い鳥の伝説 C94258 35 728.0
191 C94019 13 292.0
192 C94020 2 81.0
193 食戟のソーマ C110965 1 7.0
194 食戟のソーマ C88489 229 4649.0

195 rows × 4 columns

Hide code cell content
# 上記で取得した`ccname`リストを基に、各`ccname`と`ccid`の組み合わせごとに
# ユニークな`ceid`の数と`pages`の合計を集計し、その結果の先頭20件を表示
df_ce[df_ce["ccname"].isin(ccnames)].groupby(["ccname", "ccid"])[["ceid", "pages"]].agg(
    {"ceid": "nunique", "pages": sum}
).reset_index().head(20)
ccname ccid ceid pages
0 DEATH NOTE C87653 111 2433.0
1 DEATH NOTE C87654 1 1.0
2 FAIRY TAIL C89977 1 8.0
3 FAIRY TAIL C89978 547 11617.0
4 MAJOR C91652 292 5912.0
5 MAJOR C91653 456 8413.0
6 STAR WARS C90231 1 19.0
7 STAR WARS C90232 5 91.0
8 [イラスト] C88078 1 1.0
9 [イラスト] C90385 1 1.0
10 [インタビュー/対談/座談会] C92288 1 1.0
11 [インタビュー/対談/座談会] C94363 1 1.0
12 [グラビア/写真] C90551 1 5.0
13 [グラビア/写真] C92243 1 5.0
14 [プレゼント当選者発表] C90880 2 2.0
15 [プレゼント当選者発表] C93832 1 1.0
16 [懸賞] C110884 2 2.0
17 [懸賞] C94047 4 4.0
18 [掲載に関するお知らせ] C110880 1 1.0
19 [掲載に関するお知らせ] C92024 3 3.0
Hide code cell content
# `ccname`が"MAJOR"であるデータに絞り込み、
# 各`ccid`における`year`の統計情報(count, mean, stdなど)を集計
df_ce[df_ce["ccname"] == "MAJOR"].groupby("ccid")["year"].describe().reset_index()
ccid count mean std min 25% 50% 75% max
0 C91652 292.0 1997.150685 1.808124 1994.0 1996.0 1997.0 1999.0 2000.0
1 C91653 456.0 2005.157895 2.908355 2000.0 2003.0 2005.0 2008.0 2013.0
Hide code cell content
# `ccname`と`mcname`の組み合わせごとに、それぞれの`ceid`のユニーク数(掲載数)を集計
# 結果を`ceid`の数で降順ソートして上位20件を表示
df_ce.groupby(["ccname", "mcname"])["ceid"].nunique().sort_values(
    ascending=False
).reset_index().head(20)
ccname mcname ceid
0 こちら葛飾区亀有公園前派出所 週刊少年ジャンプ 1968
1 はじめの一歩 週刊少年マガジン 1186
2 名探偵コナン 週刊少年サンデー 1009
3 ONE PIECE 週刊少年ジャンプ 893
4 MAJOR 週刊少年サンデー 748
5 NARUTO-ナルト- 週刊少年ジャンプ 722
6 BLEACH 週刊少年ジャンプ 715
7 銀魂 週刊少年ジャンプ 655
8 ドカベン 週刊少年チャンピオン 635
9 ジョジョの奇妙な冒険 週刊少年ジャンプ 594
10 ダメおやじ 週刊少年サンデー 585
11 史上最強の弟子ケンイチ 週刊少年サンデー 582
12 あひるの空 週刊少年マガジン 571
13 ハヤテのごとく! 週刊少年サンデー 566
14 コータローまかりとおる! 週刊少年マガジン 558
15 犬夜叉 週刊少年サンデー 558
16 FAIRY TAIL 週刊少年マガジン 548
17 DRAGON BALL 週刊少年ジャンプ 519
18 金田一少年の事件簿 週刊少年マガジン 513
19 エリアの騎士 週刊少年マガジン 503
Hide code cell content
# 各`ccid`に対して、その`ccid`を持つ`ccname`、`mcname`、およびユニークな`ceid`の数を取得
df_tmp = (
    df_ce.groupby("ccid")[["ccname", "mcname", "ceid"]]
    .agg(
        {
            "ccname": "first",
            "mcname": "first",
            "ceid": "nunique",
        }
    )
    .reset_index()
)

# さらに、各`ccname`の文字数を`l_ccname`という新しい列に保存
df_tmp["l_ccname"] = df_tmp["ccname"].str.len()
Hide code cell content
# `mcname`(マンガ雑誌名)ごとに、`ccname`(マンガ作品名)の長さの統計情報を取得
df_tmp.groupby("mcname")["l_ccname"].describe()
count mean std min 25% 50% 75% max
mcname
週刊少年サンデー 1496.0 7.890374 4.334664 1.0 5.0 7.0 10.0 44.0
週刊少年ジャンプ 2129.0 9.114138 5.262260 1.0 6.0 8.0 11.0 52.0
週刊少年チャンピオン 1736.0 7.964286 4.409564 1.0 5.0 7.0 9.0 52.0
週刊少年マガジン 1592.0 8.615578 4.784136 1.0 6.0 8.0 10.0 41.0
Hide code cell content
# `l_ccname`(マンガ作品名の長さ)を降順にソートし、上位10作品を抽出
# 見やすいように特定の列のみ抽出
df_tmp.sort_values("l_ccname", ascending=False).head(10)[["ccname", "mcname", "ceid"]]
ccname mcname ceid
6169 3大パニックホラー特別コラボマンガ「ハカイジュウ」VS「魔法少女オブ・ジ・エンド」VS「バー... 週刊少年チャンピオン 1
257 「ONE PIECE」公式スピンオフコメディ!!「ワンピースパーティー」JC2巻発売記念SP... 週刊少年ジャンプ 1
6183 死にたくなるしょうもない日々が死にたくなるくらいしょうもなくて死にたくなるほど死にたくない日々 週刊少年チャンピオン 3
5303 映画公開記念!!『真救世主伝説 北斗の拳 ラオウ伝殉愛の章』 武論尊突撃インタビュー!! 週刊少年サンデー 1
4762 杉本ペロ新連載への軌跡 ~栄光のゴールをめざしてRoad to Shinrensai~ 週刊少年サンデー 1
1938 データカードダス NARUTO-ナルト-疾風伝 ナルティメットミッション で遊ぼう!! 週刊少年ジャンプ 1
569 パイレーツ・オブ・カリビアン 最後の海賊 ワールドプレミアレポート from 上海 週刊少年マガジン 1
5016 毎日がワイルドアームズ WILD ARMS the 4th Detonator 週刊少年サンデー 4
582 祝!ONE PIECE 20周年!!尾田さんとの思い出漫画! by しまぶー. 週刊少年ジャンプ 1
250 BORUTO-ボルト- -NARUTO NEXT GENERATIONS- 週刊少年ジャンプ 15
Hide code cell content
# `l_ccname`(マンガ作品名の長さ)を降順にソートし、上位10作品を抽出
# 見やすいように特定の列のみ抽出
df_tmp[df_tmp["ceid"] > 1].sort_values("l_ccname", ascending=False).head(10)[
    ["ccname", "mcname", "ceid"]
]
ccname mcname ceid
6183 死にたくなるしょうもない日々が死にたくなるくらいしょうもなくて死にたくなるほど死にたくない日々 週刊少年チャンピオン 3
5016 毎日がワイルドアームズ WILD ARMS the 4th Detonator 週刊少年サンデー 4
250 BORUTO-ボルト- -NARUTO NEXT GENERATIONS- 週刊少年ジャンプ 15
6516 Ping-Pong Panic Paradise 水原先輩がゆく!! 週刊少年チャンピオン 4
5471 3マッスルズコラボ漫画 囚人リク 真・餓狼伝 バチバチBURST 週刊少年チャンピオン 2
1544 攻・守 -KOSHU- MY FRIEND/OUR DREAM 週刊少年ジャンプ 2
164 漫画家志望必見!!先輩漫画家が極意を伝授!! 進め!漫画道!! 週刊少年サンデー 37
165 漫画家志望必見!!先輩漫画家が極意を伝授!! 進め!漫画道!! 週刊少年サンデー 6
990 青き波濤 -『がんばろうKOBE』'95ブルーウェーブの軌跡- 週刊少年ジャンプ 2
203 漫画家志望必見!!先輩漫画家が極意を伝授!! 進め!漫画道!! 週刊少年サンデー 6

ceidcename列の深掘り#

Hide code cell content
# 各`ceid`に関連付けられたユニークな`cename`の数を集計
# その結果の統計情報(平均、最小値、最大値など)を取得
df_ce.groupby("ceid")["cename"].nunique().describe().reset_index()
index cename
0 count 180076.000000
1 mean 0.851091
2 std 0.356000
3 min 0.000000
4 25% 1.000000
5 50% 1.000000
6 75% 1.000000
7 max 1.000000
Hide code cell content
# 各`cename`に関連付けられたユニークな`ceid`の数を集計
# その結果の統計情報(平均、最小値、最大値など)を取得
df_ce.groupby("cename")["ceid"].nunique().describe().reset_index()
index ceid
0 count 150446.000000
1 mean 1.018711
2 std 0.862405
3 min 1.000000
4 25% 1.000000
5 50% 1.000000
6 75% 1.000000
7 max 186.000000
Hide code cell content
# df_ceでcenameごとに異なるceidの数をカウントし、降順ソートした上で上位5つを表示
df_ce.groupby("cename")["ceid"].nunique().sort_values(
    ascending=False
).reset_index().head()
cename ceid
0 プロ野球編 186
1 後編 134
2 前編 118
3 最終回 82
4 第三部 孤狼青春編 81
Hide code cell content
# cenameがプロ野球編と一致するccnameのレコード数を集計
df_ce[df_ce["cename"] == "プロ野球編"].value_counts("ccname").reset_index()
ccname count
0 ドカベン 186
Hide code cell content
# df_ceでccnameごとに異なるceidの数をカウントし、要約統計量を算出
df_ce.groupby("ccname")["ceid"].nunique().describe().reset_index()
index ceid
0 count 6845.000000
1 mean 26.306355
2 std 71.718334
3 min 1.000000
4 25% 1.000000
5 50% 2.000000
6 75% 18.000000
7 max 1968.000000
Hide code cell content
# df_ceでccnameごとに異なるceidの数をカウントし、新しいDataFrameに格納
df_tmp = df_ce.groupby("ccname")["ceid"].nunique().reset_index(name="n_ce")

# 新しいDataFrameでn_ce(ユニークなceidの数)ごとに異なるccnameの数をカウントし、上位10の結果を表示
df_tmp.groupby("n_ce")["ccname"].nunique().reset_index().head(10)
n_ce ccname
0 1 3344
1 2 530
2 3 208
3 4 150
4 5 126
5 6 61
6 7 45
7 8 67
8 9 47
9 10 95
Hide code cell content
# 合計各話数が1のマンガ作品を抽出
df_tmp[df_tmp["n_ce"] == 1].reset_index(drop=True)
ccname n_ce
0 '80オリンピックに燃える日本のホープ!! 1
1 '83打ち上げ!!爆笑ギャグ・バトル 1
2 -SINS- 1
3 -豆次郎くん-MAMEJIR〔O^^〕 1
4 006 1
... ... ...
3339 GoGo!合成マン 1
3340 JSG杯 4コマ発表 1
3341 UFOが日本の空を飛ぶ日 1
3342 ~HWGP~ 東村山ウエスト・ゲート・パーク 1
3343 ~華麗なる晩餐会~ 1

3344 rows × 2 columns

page_startpage_endpagespage_start_position列の深掘り#

Hide code cell content
# `page_start`、`page_end`、`pages`、および`page_start_position`列の基礎統計情報を表示
df_ce[["page_start", "page_end", "pages", "page_start_position"]].describe()
page_start page_end pages page_start_position
count 180076.000000 180076.000000 180076.000000 180076.000000
mean 210.867847 228.392754 18.524906 0.514882
std 123.865626 122.043463 7.713260 0.283149
min 1.000000 1.000000 1.000000 0.002045
25% 107.000000 126.000000 17.000000 0.274943
50% 205.000000 222.000000 19.000000 0.520642
75% 305.000000 322.000000 20.000000 0.759642
max 581.000000 600.000000 487.000000 1.000000
Hide code cell content
# `pages`列の値を降順に並び替えて、上位5行を抽出
# 抽出する列は`cename`、`ccname`、`miname`、および`pages`
df_ce.sort_values("pages", ascending=False)[
    ["cename", "ccname", "miname", "pages"]
].head()
cename ccname miname pages
168891 第161話 御目出度いのに!で候 磯部磯兵衛物語~浮世はつらいよ~ 週刊少年ジャンプ 2015年 表示号数48 487.0
127239 CASE83.ナギの島2 アクシデンツ 週刊少年サンデー 1998年 表示号数14 455.0
19085 社長登場! / 面接 / サイン 宮田すすむと日本の社長! 週刊少年マガジン 1994年 表示号数24 392.0
171179 第9話 侵入者 アンペア 週刊少年サンデー 2015年 表示号数35 318.0
10386 RAVE:152 裸の英雄!? RAVE 週刊少年マガジン 2002年 表示号数36 234.0

two_coloredfour_colored列の深掘り#

Hide code cell content
# two_colored・four_colored列がTrueとなっている各話の総数と、全体に対する比率を集計
df_ce[["two_colored", "four_colored"]].agg(["sum", "mean"]).T.reset_index()
index sum mean
0 two_colored 6776.0 0.037629
1 four_colored 12926.0 0.071781
Hide code cell content
# 年ごとにtwo_coloredとfour_coloredの各話数を集計
df_ce.groupby("year")[["two_colored", "four_colored"]].sum().reset_index()
year two_colored four_colored
0 1970 24 130
1 1971 40 280
2 1972 3 296
3 1973 50 232
4 1974 279 187
5 1975 363 172
6 1976 293 210
7 1977 352 185
8 1978 369 167
9 1979 380 183
10 1980 389 152
11 1981 389 137
12 1982 393 154
13 1983 410 118
14 1984 436 122
15 1985 373 125
16 1986 350 142
17 1987 250 143
18 1988 199 180
19 1989 183 167
20 1990 172 174
21 1991 122 168
22 1992 156 159
23 1993 134 136
24 1994 113 152
25 1995 119 172
26 1996 110 184
27 1997 80 225
28 1998 47 222
29 1999 43 202
30 2000 45 256
31 2001 16 266
32 2002 24 261
33 2003 13 311
34 2004 4 377
35 2005 4 363
36 2006 3 437
37 2007 2 457
38 2008 2 417
39 2009 2 472
40 2010 4 489
41 2011 5 494
42 2012 5 505
43 2013 11 553
44 2014 7 551
45 2015 2 566
46 2016 5 573
47 2017 1 302
Hide code cell content
# マンガ雑誌ごとにtwo_color列とfour_color列がTrueとなっている各話の総数を集計
df_ce.groupby("mcname")[["two_colored", "four_colored"]].sum().reset_index()
mcname two_colored four_colored
0 週刊少年サンデー 1753 2490
1 週刊少年ジャンプ 2361 4347
2 週刊少年チャンピオン 1467 3508
3 週刊少年マガジン 1195 2581
Hide code cell content
# マンガ雑誌ごとにtwo_colored/four_coloredcolor列のTrueの総数を集計しdf_tmpとして格納
df_tmp = df_ce.groupby("ccname")[["two_colored", "four_colored"]].sum().reset_index()
# df_tmpをtwo_colored列に関して降順ソートし、上位10作品を表示
df_tmp.sort_values("two_colored", ascending=False, ignore_index=True).head()
ccname two_colored four_colored
0 がきデカ 161 70
1 ドカベン 109 200
2 らんぽう 79 29
3 釣りキチ三平 74 17
4 キン肉マン 72 22
Hide code cell content
# df_tmpをfour_colored列に関して降順ソートし、上位10作品を表示
df_tmp.sort_values("four_colored", ascending=False, ignore_index=True).head()
ccname two_colored four_colored
0 ドカベン 109 200
1 ONE PIECE 10 158
2 弱虫ペダル 0 148
3 範馬刃牙 SON OF OGRE 0 135
4 こちら葛飾区亀有公園前派出所 71 124

price列の深掘り#

Hide code cell content
# `price`列に関する統計情報を取得
df_ce[["price"]].describe()
price
count 180038.000000
mean 203.907742
std 41.958118
min 80.000000
25% 180.000000
50% 210.000000
75% 236.000000
max 371.000000
Hide code cell content
# 各`miname`と`year`の組み合わせごとに最初の`price`を取得し、降順にソート
df_ce.groupby(["miname", "year"])["price"].first().reset_index().sort_values(
    "price", ascending=False
)
miname year price
1835 週刊少年サンデー 2007年 表示号数50 2007 371.0
2196 週刊少年サンデー 2015年 表示号数27 2015 280.0
2205 週刊少年サンデー 2015年 表示号数36 2015 280.0
2214 週刊少年サンデー 2015年 表示号数45 2015 280.0
2215 週刊少年サンデー 2015年 表示号数46 2015 280.0
... ... ... ...
6931 週刊少年マガジン 1970年 表示号数39 1970 80.0
6932 週刊少年マガジン 1970年 表示号数40 1970 80.0
4613 週刊少年チャンピオン 1970年 表示号数19 1970 80.0
2366 週刊少年ジャンプ 1971年 表示号数47 1971 NaN
5838 週刊少年チャンピオン 1995年 表示号数1 1995 NaN

9227 rows × 3 columns

Hide code cell content
# 各`miname`ごとに最初に出現する`year`と`price`を取得
df_tmp = df_ce.groupby("miname")[["year", "price"]].first().reset_index()

# 取得したデータを`year`単位で集計し、`price`に関する統計情報を取得
df_tmp.groupby(["year"])["price"].describe()
count mean std min 25% 50% 75% max
year
1970 86.0 83.023256 4.619592 80.0 80.0 80.0 90.0 90.0
1971 203.0 87.339901 5.341574 80.0 80.0 90.0 90.0 100.0
1972 204.0 95.392157 5.556972 90.0 90.0 100.0 100.0 120.0
1973 204.0 101.911765 6.715328 90.0 100.0 100.0 100.0 120.0
1974 199.0 128.592965 6.278885 100.0 130.0 130.0 130.0 150.0
1975 202.0 134.702970 8.473599 130.0 130.0 130.0 130.0 150.0
1976 200.0 149.100000 4.504604 130.0 150.0 150.0 150.0 170.0
1977 202.0 156.336634 9.327941 150.0 150.0 150.0 170.0 170.0
1978 202.0 156.732673 9.474649 150.0 150.0 150.0 170.0 170.0
1979 200.0 158.000000 9.822546 150.0 150.0 150.0 170.0 170.0
1980 200.0 167.200000 7.579396 150.0 170.0 170.0 170.0 180.0
1981 205.0 173.024390 5.389204 170.0 170.0 170.0 180.0 190.0
1982 201.0 174.477612 5.731557 170.0 170.0 170.0 180.0 190.0
1983 201.0 175.671642 5.888263 170.0 170.0 180.0 180.0 190.0
1984 201.0 178.457711 5.109741 170.0 180.0 180.0 180.0 200.0
1985 201.0 178.208955 4.977562 170.0 180.0 180.0 180.0 200.0
1986 200.0 178.400000 5.056465 170.0 180.0 180.0 180.0 200.0
1987 199.0 178.391960 5.067936 170.0 180.0 180.0 180.0 200.0
1988 203.0 178.472906 4.681225 170.0 180.0 180.0 180.0 190.0
1989 198.0 185.656566 5.816416 170.0 180.0 190.0 190.0 190.0
1990 199.0 192.713568 6.565395 180.0 190.0 190.0 200.0 200.0
1991 192.0 198.802083 4.920562 190.0 200.0 200.0 200.0 210.0
1992 193.0 199.222798 5.195862 190.0 200.0 200.0 200.0 210.0
1993 192.0 200.208333 5.784827 190.0 200.0 200.0 200.0 210.0
1994 192.0 201.770833 6.863637 190.0 200.0 200.0 210.0 220.0
1995 191.0 203.926702 7.453355 190.0 200.0 200.0 210.0 220.0
1996 192.0 207.552083 6.921202 200.0 200.0 210.0 210.0 220.0
1997 192.0 212.760417 7.249112 200.0 210.0 210.0 220.0 230.0
1998 192.0 223.229167 6.052959 210.0 220.0 220.0 230.0 240.0
1999 192.0 225.625000 6.276775 220.0 220.0 220.0 230.0 240.0
2000 193.0 225.595855 5.843656 220.0 220.0 230.0 230.0 240.0
2001 192.0 216.375000 6.831173 210.0 210.0 219.0 219.0 249.0
2002 192.0 216.250000 6.177988 210.0 210.0 219.0 219.0 229.0
2003 192.0 217.687500 6.740225 210.0 210.0 219.0 219.0 240.0
2004 192.0 222.744792 5.659859 210.0 219.0 219.0 229.0 240.0
2005 193.0 228.295337 5.907343 219.0 229.0 229.0 229.0 240.0
2006 192.0 229.255208 5.837456 219.0 229.0 229.0 229.0 238.0
2007 191.0 233.963351 12.146636 219.0 229.0 238.0 238.0 371.0
2008 192.0 238.848958 7.888165 219.0 238.0 238.0 248.0 257.0
2009 198.0 244.621212 8.170329 229.0 238.0 248.0 248.0 257.0
2010 194.0 245.804124 8.283374 229.0 248.0 248.0 248.0 257.0
2011 190.0 247.731579 9.706080 219.0 248.0 248.0 257.0 257.0
2012 193.0 249.388601 11.076875 228.0 248.0 257.0 257.0 267.0
2013 192.0 249.093750 11.344744 190.0 238.0 257.0 257.0 267.0
2014 192.0 246.927083 9.196226 229.0 241.0 250.0 250.0 280.0
2015 193.0 265.538860 7.493038 250.0 260.0 270.0 270.0 280.0
2016 194.0 249.365979 6.696614 236.0 250.0 250.0 250.0 259.0
2017 111.0 250.972973 6.794997 241.0 250.0 250.0 259.0 259.0

cm_cc_crt.csvの基礎分析#

Hide code cell content
# pandasのread_csv関数でCSVファイルの読み込み
df_cc_crt = pd.read_csv(DIR_IN / FN_CC_CRT)

全体像の把握#

Hide code cell content
# df_cc_crtデータフレームの先頭5行をTで転置して表示
df_cc_crt.head().T
0 1 2 3 4
ccid C87429 C87430 C87430 C87431 C87432
crtid CCRT01604 CCRT02117 CCRT03152 CCRT01415 CCRT01979
ccname 交通安全'76 好敵手 室伏広治物語 好敵手 室伏広治物語 鋼鉄の殺人者 硬派山崎銀次郎
n_ce 1 1 1 1 1
n_2c 0 0 0 0 0
n_4c 0 0 0 0 1
first_date 1976-09-06 2000-10-02 2000-10-02 1979-12-10 1974-04-29
last_date 1976-09-06 2000-10-02 2000-10-02 1979-12-10 1974-04-29
mcid C119459 C119459 C119459 C119459 C119459
mcname 週刊少年ジャンプ 週刊少年ジャンプ 週刊少年ジャンプ 週刊少年ジャンプ 週刊少年ジャンプ
crtname 山止たつひこ 柳田東一郎 門脇正法 富沢順 本宮ひろ志
Hide code cell content
# df_cc_crtデータフレームの形状(行数・列数)を取得
# shape属性を使用すると、(行数, 列数)の形で結果が返される
df_cc_crt.shape
(7909, 11)
Hide code cell content
# df_cc_crtデータフレーム内の欠損値(NaN)の情報を集計
# isna()メソッドを使用して欠損値の場所をTrueとして特定
# agg()メソッドを使用して、各列における欠損値の合計と平均を計算し、転置して表示
df_cc_crt.isna().agg([sum, "mean"]).T
sum mean
ccid 0.0 0.0
crtid 0.0 0.0
ccname 0.0 0.0
n_ce 0.0 0.0
n_2c 0.0 0.0
n_4c 0.0 0.0
first_date 0.0 0.0
last_date 0.0 0.0
mcid 0.0 0.0
mcname 0.0 0.0
crtname 0.0 0.0
Hide code cell content
# df_cc_crtデータフレームの記述統計情報を取得
# describe()メソッドを使用して、各列の中央値、平均、標準偏差などの基本的な統計量を表示
df_cc_crt.describe()
n_ce n_2c n_4c
count 7909.000000 7909.000000 7909.000000
mean 26.584524 1.001391 1.923631
std 69.735811 4.638895 6.850708
min 1.000000 0.000000 0.000000
25% 1.000000 0.000000 0.000000
50% 2.000000 0.000000 0.000000
75% 19.000000 0.000000 1.000000
max 1968.000000 161.000000 200.000000
Hide code cell content
# df_cc_crtデータフレームの各列に対してユニークな値の数をカウント
# nunique()メソッドを使用して、各列のユニークな値の数を計算
# その後、結果を新しいデータフレームとして整形し、列名を"nunique"とする
df_cc_crt.nunique().reset_index(name="nunique")
index nunique
0 ccid 6844
1 crtid 3146
2 ccname 6745
3 n_ce 340
4 n_2c 52
5 n_4c 65
6 first_date 4341
7 last_date 4115
8 mcid 4
9 mcname 4
10 crtname 3146
Hide code cell content
# `ccid`と`crtid`の組み合わせで重複する行の数をカウント
df_cc_crt.duplicated(subset=["ccid", "crtid"]).sum()
0
Hide code cell content
# `df_cc_crt`と`df_ce`で共通の`ccid`の数を取得
n_ccid_w_crt = len(set(df_cc_crt["ccid"].unique()) & set(df_ce["ccid"].unique()))

# `df_ce`内のユニークな`ccid`の数を取得
n_ccid = df_ce["ccid"].nunique()

# カバー率を計算して表示
print(f"{n_ccid_w_crt} / {n_ccid} = {n_ccid_w_crt / n_ccid}")
6844 / 6953 = 0.9843233136775492

ccidccname列の深掘り#

Hide code cell content
# `ccid`と`ccname`ごとにユニークな`crtid`の数を集計
# その後、結果の統計情報を取得
df_cc_crt.groupby(["ccid", "ccname"])["crtid"].nunique().describe().reset_index()
index crtid
0 count 6844.000000
1 mean 1.155611
2 std 0.449605
3 min 1.000000
4 25% 1.000000
5 50% 1.000000
6 75% 1.000000
7 max 13.000000
Hide code cell content
# `ccid`と`ccname`ごとにユニークな`crtid`の数を集計
# その後、降順にソートして、紐づいているマンガ作者が多いマンガ作品を上位に表示
df_cc_crt.groupby(["ccid", "ccname"])["crtid"].nunique().sort_values(
    ascending=False
).reset_index()
ccid ccname crtid
0 C90714 TheThreeWoodCreation殺人事件 13
1 C94429 オールスターギャグ祭り 笑いの力 12
2 C89927 '83打ち上げ!!爆笑ギャグ・バトル 7
3 C93156 ツンツンサワサワ春を待つ 6
4 C89830 両津VS首領パッチ!! Jギャグオールスターズ葛飾大騒動 5
... ... ... ...
6839 C89810 ライジングインパクト 1
6840 C89809 ライオンブックス 1
6841 C89808 ラーマゲドン拉麺最終戦争 1
6842 C89807 四丁目の怪人くん 1
6843 C95894 霊能バスター月読京介 1

6844 rows × 3 columns

Hide code cell content
# `ccid`が"C90714"であるレコードを抽出し、特定のカラムのみ表示
df_ce[df_ce["ccid"] == "C90714"][["ccname", "miname", "mcname", "date"]]
ccname miname mcname date
29872 TheThreeWoodCreation殺人事件 週刊少年マガジン 1982年 表示号数18 週刊少年マガジン 1982-04-21
Hide code cell content
# `ccid`が"C90714"であるレコードを`df_cc_crt`から抽出し、必要な列のみ表示
df_cc_crt[df_cc_crt["ccid"] == "C90714"][["ccname", "mcname", "crtname"]]
ccname mcname crtname
2837 TheThreeWoodCreation殺人事件 週刊少年マガジン しもさか保
2838 TheThreeWoodCreation殺人事件 週刊少年マガジン ちばてつや
2839 TheThreeWoodCreation殺人事件 週刊少年マガジン もとはしまさひで
2840 TheThreeWoodCreation殺人事件 週刊少年マガジン 三浦みつる
2841 TheThreeWoodCreation殺人事件 週刊少年マガジン 井上大助
2842 TheThreeWoodCreation殺人事件 週刊少年マガジン 大和田夏希
2843 TheThreeWoodCreation殺人事件 週刊少年マガジン 小林まこと
2844 TheThreeWoodCreation殺人事件 週刊少年マガジン 川三番地
2845 TheThreeWoodCreation殺人事件 週刊少年マガジン 服部かずみ
2846 TheThreeWoodCreation殺人事件 週刊少年マガジン 本山一城
2847 TheThreeWoodCreation殺人事件 週刊少年マガジン 村生ミオ
2848 TheThreeWoodCreation殺人事件 週刊少年マガジン 楠みちはる
2849 TheThreeWoodCreation殺人事件 週刊少年マガジン 矢口高雄

crtidcrtname列の深掘り#

Hide code cell content
# `crtid`単位で`crtname`のユニーク数を集計し、その統計情報を取得
df_cc_crt.groupby("crtid")["crtname"].nunique().describe().reset_index()
index crtname
0 count 3146.0
1 mean 1.0
2 std 0.0
3 min 1.0
4 25% 1.0
5 50% 1.0
6 75% 1.0
7 max 1.0
Hide code cell content
# `crtname`単位で`crtid`のユニーク数を集計し、その統計情報を取得
df_cc_crt.groupby("crtname")["crtid"].nunique().describe().reset_index()
index crtid
0 count 3146.0
1 mean 1.0
2 std 0.0
3 min 1.0
4 25% 1.0
5 50% 1.0
6 75% 1.0
7 max 1.0
Hide code cell content
# `crtid`および`crtname`単位で、紐付けられている`ccid`のユニーク数を集計
# その結果の基礎統計情報を取得
df_cc_crt.groupby(["crtid", "crtname"])["ccid"].nunique().describe().reset_index()
index ccid
0 count 3146.000000
1 mean 2.513986
2 std 3.246516
3 min 1.000000
4 25% 1.000000
5 50% 1.000000
6 75% 3.000000
7 max 54.000000
Hide code cell content
# `crtname`単位で、紐付けられている`ccid`のユニーク数を集計
# 結果を降順にソートし、上位10名のマンガ作者とその紐づくマンガ作品数を抽出
df_cc_crt.groupby("crtname")["ccid"].nunique().sort_values(
    ascending=False
).reset_index().head(10)
crtname ccid
0 水島新司 54
1 手塚治虫 47
2 松本零士 39
3 ジョージ秋山 37
4 石森章太郎 31
5 三枝義浩 27
6 鳥山明 26
7 本宮ひろ志 26
8 梶原一騎 25
9 小山田いく 25
Hide code cell content
# `crtname`単位で、紐づいている`ccid`のユニーク数を集計して中間テーブルを作成
df_tmp = df_cc_crt.groupby("crtname")["ccid"].nunique().reset_index()

# `ccid`の数が25以上のマンガ作者の名前リストを作成
crtnames = df_tmp[df_tmp["ccid"] >= 25]["crtname"].unique()

# 上記で取得したマンガ作者に関して、`n_ce`の基礎統計量を計算し、件数で降順ソート
df_cc_crt[df_cc_crt["crtname"].isin(crtnames)].groupby("crtname")[
    "n_ce"
].describe().sort_values(by="count", ascending=False)
count mean std min 25% 50% 75% max
crtname
水島新司 54.0 51.814815 118.527614 1.0 1.0 1.0 21.75 635.0
手塚治虫 47.0 21.021277 46.156864 1.0 1.0 2.0 19.50 257.0
松本零士 39.0 6.282051 19.740352 1.0 1.0 1.0 1.00 115.0
ジョージ秋山 37.0 23.648649 35.246920 1.0 1.0 12.0 33.00 198.0
石森章太郎 31.0 23.870968 25.699211 1.0 1.0 23.0 33.00 100.0
三枝義浩 27.0 3.037037 6.601174 1.0 2.0 2.0 2.00 36.0
本宮ひろ志 26.0 20.384615 30.415887 1.0 1.0 1.5 28.75 106.0
鳥山明 26.0 31.961538 109.568784 1.0 1.0 1.0 2.75 519.0
小山田いく 25.0 25.080000 34.264802 1.0 1.0 5.0 44.00 102.0
梶原一騎 25.0 74.920000 57.198427 1.0 32.0 54.0 112.00 205.0
Hide code cell content
# 一話完結を除き、`crtname`単位で紐づいている`ccid`のユニーク数を集計
# 上位10人のマンガ作者と、それに紐づくマンガ作品数を降順ソートで表示
df_cc_crt[df_cc_crt["n_ce"] > 1].groupby("crtname")["ccid"].nunique().sort_values(
    ascending=False
).reset_index().head(10)
crtname ccid
0 ジョージ秋山 25
1 手塚治虫 25
2 梶原一騎 24
3 石森章太郎 22
4 三枝義浩 21
5 水島新司 19
6 小山田いく 16
7 赤塚不二夫 15
8 牛次郎 15
9 高橋よしひろ 14

n_ce列の深掘り#

Hide code cell content
# `crtname`単位での`n_ce`の合計を集計
# その集計結果の基礎統計量を算出
df_cc_crt.groupby("crtname")["n_ce"].sum().describe().reset_index()
index n_ce
0 count 3146.000000
1 mean 66.833121
2 std 165.971265
3 min 1.000000
4 25% 1.000000
5 50% 8.000000
6 75% 41.750000
7 max 2798.000000
Hide code cell content
# `crtname`単位での`n_ce`の合計を集計し、降順にソート
# 上位10人のマンガ作者を抽出
df_cc_crt.groupby("crtname")["n_ce"].sum().sort_values(
    ascending=False
).reset_index().head(10)
crtname n_ce
0 水島新司 2798
1 秋本治 1979
2 梶原一騎 1873
3 高橋留美子 1736
4 浜岡賢次 1384
5 青山剛昌 1288
6 あだち充 1269
7 森川ジョージ 1226
8 満田拓也 1223
9 板垣恵介 1194

n_2cn_4c列の深掘り#

Hide code cell content
# `crtname`単位での`n_2c`および`n_4c`の合計を集計し、基礎統計量を算出
df_cc_crt.groupby("crtname")[["n_2c", "n_4c"]].sum().describe().reset_index()
index n_2c n_4c
0 count 3146.000000 3146.000000
1 mean 2.517483 4.835982
2 std 10.900118 16.289349
3 min 0.000000 0.000000
4 25% 0.000000 0.000000
5 50% 0.000000 1.000000
6 75% 0.000000 3.000000
7 max 281.000000 491.000000
Hide code cell content
# `crtname`単位での`n_2c`の合計を集計し、降順にソート
# 上位5人のマンガ作者を抽出
df_cc_crt.groupby("crtname")["n_2c"].sum().sort_values(
    ascending=False
).reset_index().head()
crtname n_2c
0 水島新司 281
1 山上たつひこ 206
2 柳沢きみお 113
3 鳥山明 98
4 石渡治 93
Hide code cell content
# `crtname`単位での`n_4c`の合計を集計し、降順にソート
# 上位5人のマンガ作者を抽出
df_cc_crt.groupby("crtname")["n_4c"].sum().sort_values(
    ascending=False
).reset_index().head()
crtname n_4c
0 水島新司 491
1 板垣恵介 281
2 尾田栄一郎 160
3 渡辺航 150
4 浜岡賢次 148

first_datelast_date列の深掘り#

Hide code cell content
# `first_date`列をdatetime型に変換
df_cc_crt["first_date"] = pd.to_datetime(df_cc_crt["first_date"])
# `last_date`列をdatetime型に変換
df_cc_crt["last_date"] = pd.to_datetime(df_cc_crt["last_date"])
Hide code cell content
# マンガ作者ごとに最初と最後の活動日を集計
df_tmp = (
    df_cc_crt.groupby("crtname")[["first_date", "last_date"]]
    .agg({"first_date": "min", "last_date": "max"})
    .reset_index()
)

# 各マンガ作者の活動期間を算出
df_tmp["duration"] = df_tmp["last_date"] - df_tmp["first_date"]

# 活動期間が長い上位10名のマンガ作者を取得
df_tmp.sort_values(by="duration", ascending=False).head(10)
crtname first_date last_date duration
2144 水島新司 1970-07-27 2017-07-13 17153 days
1701 手塚治虫 1970-07-27 2013-05-16 15634 days
2160 永井豪 1970-07-27 2012-09-27 15403 days
2025 梶原一騎 1970-07-27 2011-01-15 14782 days
589 三浦みつる 1972-12-18 2013-05-09 14752 days
225 つのだじろう 1971-02-22 2011-06-16 14724 days
2535 秋本治 1976-07-19 2016-10-03 14686 days
3061 高橋留美子 1978-07-09 2017-07-12 14248 days
2815 車田正美 1978-03-06 2017-02-02 14213 days
465 ジョージ秋山 1970-07-27 2009-06-18 14206 days

mcidmcname列の深掘り#

Hide code cell content
# マンガ作者ごとに活動したマンガ雑誌数を集計
df_cc_crt.groupby("crtname")["mcname"].nunique().describe().reset_index()
index mcname
0 count 3146.000000
1 mean 1.119517
2 std 0.426865
3 min 1.000000
4 25% 1.000000
5 50% 1.000000
6 75% 1.000000
7 max 4.000000
Hide code cell content
# マンガ作者ごとに活動したマンガ雑誌IDの数を集計
df_tmp = df_cc_crt.groupby("crtname")["mcid"].nunique().reset_index()
# 4つの主要な少年誌すべてに掲載経験があるマンガ作者を特定
crtnames = df_tmp[df_tmp["mcid"] == 4]["crtname"].unique()
# 特定したマンガ作者に関して、各マンガ雑誌での掲載回数を集計
df_crt_mcname = (
    df_cc_crt[df_cc_crt["crtname"].isin(crtnames)]
    .groupby(["crtname", "mcname"])["n_ce"]
    .sum()
    .reset_index()
)
df_crt_mcname
crtname mcname n_ce
0 ジョージ秋山 週刊少年サンデー 148
1 ジョージ秋山 週刊少年ジャンプ 147
2 ジョージ秋山 週刊少年チャンピオン 369
3 ジョージ秋山 週刊少年マガジン 211
4 ビッグ錠 週刊少年サンデー 22
... ... ... ...
91 赤塚不二夫 週刊少年マガジン 276
92 鈴木央 週刊少年サンデー 223
93 鈴木央 週刊少年ジャンプ 181
94 鈴木央 週刊少年チャンピオン 17
95 鈴木央 週刊少年マガジン 252

96 rows × 3 columns

Hide code cell content
# 四大少年誌全てに掲載経験のあるマンガ作者一覧
crtnames
array(['ジョージ秋山', 'ビッグ錠', '小林よしのり', '手塚治虫', '望月三起也', '本宮ひろ志', '村生ミオ',
       '村野守美', '松本零士', '柳沢きみお', '梅本さちお', '梶原一騎', '水木しげる', '永井豪', '池内誠一',
       '滝沢解', '牛次郎', '真樹日佐夫', '石森章太郎', '篠原とおる', '芳谷圭児', '貝塚ひろし', '赤塚不二夫',
       '鈴木央'], dtype=object)
Hide code cell content
# n_ceの総数に基づいて、上位5名のマンガ作者を特定
crtnames = (
    df_crt_mcname.groupby("crtname")["n_ce"]
    .sum()
    .sort_values(ascending=False)
    .index[:5]
)
# 上位5名のマンガ作者に関して、マンガ雑誌別の掲載回数をピボットテーブルとして表示
df_crt_mcname[df_crt_mcname["crtname"].isin(crtnames)].pivot_table(
    index="crtname", columns="mcname", values="n_ce"
)
mcname 週刊少年サンデー 週刊少年ジャンプ 週刊少年チャンピオン 週刊少年マガジン
crtname
ジョージ秋山 148.0 147.0 369.0 211.0
手塚治虫 43.0 27.0 725.0 193.0
柳沢きみお 21.0 109.0 463.0 223.0
梶原一騎 545.0 215.0 159.0 954.0
石森章太郎 400.0 4.0 120.0 216.0