マンガデータの基礎分析#
準備#
Import#
Show code cell content
# warningsモジュールのインポート
import warnings
# データ解析や機械学習のライブラリ使用時の警告を非表示にする目的で警告を無視
# 本書の文脈では、可視化の学習に議論を集中させるために選択した
# ただし、学習以外の場面で、警告を無視する設定は推奨しない
warnings.filterwarnings("ignore")
Show 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
変数#
Show code cell content
# 読み込み対象ディレクトリの定義
# マンガデータ保存ディレクトリのパス
DIR_IN = Path("../../../data/cm/input")
Show code cell content
# 読み込み対象ファイル名の定義
# Comic Episode関連のファイル名
FN_CE = "cm_ce.csv"
# Comic CollectionとCReaTor関連のファイル名
FN_CC_CRT = "cm_cc_crt.csv"
cm_ce.csvの基礎分析#
Show code cell content
# pandasのread_csv関数でCSVファイルの読み込み
df_ce = pd.read_csv(DIR_IN / FN_CE)
全体像の把握#
Show 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! |
Show code cell content
# df_ceデータフレームの形状(行数・列数)を取得
# shape属性を使用すると、(行数, 列数)の形で結果が返される
df_ce.shape
(180076, 16)
Show 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 |
Show 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 |
Show 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列の深掘り#
Show code cell content
# df_ceデータフレームの"date"列から最も古い日付と最も新しい日付を取得
# min()メソッドを使用して、最も古い日付を抽出
# max()メソッドを使用して、最も新しい日付を抽出
df_ce["date"].min(), df_ce["date"].max()
('1970-07-27', '2017-07-31')
Show 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
Show 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 |
Show 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 |
mcid、mcname列の深掘り#
Show 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 |
Show 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 |
Show 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 |
miid、miname列の深掘り#
Show 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 |
Show 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 |
Show 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 |
Show 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 |
Show 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 |
Show 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
Show 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 |
Show 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 |
Show 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 |
ccid、ccname列の深掘り#
Show 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 |
Show 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 |
Show 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
Show 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 |
Show 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 |
Show 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 |
Show 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()
Show 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 |
Show 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 |
Show 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 |
ceid、cename列の深掘り#
Show 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 |
Show 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 |
Show 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 |
Show code cell content
# cenameがプロ野球編と一致するccnameのレコード数を集計
df_ce[df_ce["cename"] == "プロ野球編"].value_counts("ccname").reset_index()
| ccname | count | |
|---|---|---|
| 0 | ドカベン | 186 |
Show 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 |
Show 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 |
Show 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_start、page_end、pages、page_start_position列の深掘り#
Show 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 |
Show 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_colored、four_colored列の深掘り#
Show 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 |
Show 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 |
Show 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 |
Show 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 |
Show 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列の深掘り#
Show 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 |
Show 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
Show 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の基礎分析#
Show code cell content
# pandasのread_csv関数でCSVファイルの読み込み
df_cc_crt = pd.read_csv(DIR_IN / FN_CC_CRT)
全体像の把握#
Show 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 | 山止たつひこ | 柳田東一郎 | 門脇正法 | 富沢順 | 本宮ひろ志 |
Show code cell content
# df_cc_crtデータフレームの形状(行数・列数)を取得
# shape属性を使用すると、(行数, 列数)の形で結果が返される
df_cc_crt.shape
(7909, 11)
Show 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 |
Show 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 |
Show 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 |
Show code cell content
# `ccid`と`crtid`の組み合わせで重複する行の数をカウント
df_cc_crt.duplicated(subset=["ccid", "crtid"]).sum()
0
Show 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
ccid、ccname列の深掘り#
Show 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 |
Show 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
Show 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 |
Show 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殺人事件 | 週刊少年マガジン | 矢口高雄 |
crtid、crtname列の深掘り#
Show 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 |
Show 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 |
Show 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 |
Show 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 |
Show 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 |
Show 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列の深掘り#
Show 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 |
Show 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_2c、n_4c列の深掘り#
Show 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 |
Show 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 |
Show 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_date、last_date列の深掘り#
Show 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"])
Show 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 |
mcid、mcname列の深掘り#
Show 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 |
Show 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
Show code cell content
# 四大少年誌全てに掲載経験のあるマンガ作者一覧
crtnames
array(['ジョージ秋山', 'ビッグ錠', '小林よしのり', '手塚治虫', '望月三起也', '本宮ひろ志', '村生ミオ',
'村野守美', '松本零士', '柳沢きみお', '梅本さちお', '梶原一騎', '水木しげる', '永井豪', '池内誠一',
'滝沢解', '牛次郎', '真樹日佐夫', '石森章太郎', '篠原とおる', '芳谷圭児', '貝塚ひろし', '赤塚不二夫',
'鈴木央'], dtype=object)
Show 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 |