In [1]:
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

pd.options.display.mpl_style = 'default'
font = {'family':'TakaoGothic'}
matplotlib.rc('font', **font)

データの読み込み

In [2]:
df_temp = []
for year in range(2003, 2016):
    _df = pd.read_csv('data/{0}.csv'.format(year))
    _df.ix[:, 'year'] = year
    df_temp.append(_df)

df = pd.concat(df_temp)
one = df[['ONE PIECE']]
df = df.replace({'休': np.nan, '落': np.nan})
df = df.astype(float)
df.ix[:, 'gou'] = df.index.astype(int)
df = df.groupby(['year', 'gou']).sum()

drop_list = ['新連載作品(10週未満)', '新連載作品(10週未満)', 'Unnamed: 0']
for l in drop_list:
    df = df.drop(l, axis=1)

df.head()
Out[2]:
AKABOSHI -異聞水滸伝- BLACK CAT BLEACH BLUE DRAGON ラルΩグラド CLAYMORE D. Gray-man DEATH NOTE DOIS SOL E-ROBOT HACHI ... 重機人間ユンボル 銀河パトロール ジャコ 銀魂 鍵人 -カギジン- 鏡の国の針栖川 闇神コウ 〜暗闇にドッキリ!〜 食戟のソーマ 魔人探偵 脳噛ネウロ 黒子のバスケ A・O・N
year gou
2003 0 NaN 6 13 NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN 18
1 NaN 9 13 NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2 NaN 14 10 NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
3 NaN 15 8 NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
4 NaN 21 5 NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN

5 rows × 164 columns

軽く可視化する

このデータセットに含まれる漫画のタイトルは以下の通り.

ピューと吹く! ジャガーピューと吹く!ジャガー のように,若干の表記ゆれが見受けられる.

In [3]:
', '.join(df.columns)
Out[3]:
"AKABOSHI -異聞水滸伝-, BLACK CAT, BLEACH, BLUE DRAGON ラルΩグラド, CLAYMORE, D. Gray-man, DEATH NOTE, DOIS SOL, E-ROBOT, HACHI, HAND'S, HUNGRY JOKER, HUNTER×HUNTER, ILLEGAL RARE, K.O.SEN, LIGHT WING, LIVE, LOCKON!, MUDDY, Mr. FULLSWING, NARUTO −ナルト−, ONE PIECE, OVER TIME, P2!, PSYREN −サイレン−, REBORN!, ROOKIES, SKET DANCE, SOUL CATCHER(S), ST&RS -スターズ-, SWOT, Sporting Salt, TATOO HEARTS, TOKYO WONDER BOYS, To LOVEる, Ultra Battle Satellite, Ultra Red, Waqwaq, enígme 【エニグマ】, i・ショウジョ, magico, ★SANTA!★, あねどきっ, いちご100%, いちご100%, いぬまるだしっ, こちら葛飾区亀有公園前派出所, ごっちゃんです!!, どがしかでん!, ぬらりひょんの孫, ねこわっぱ!, ひめドル!!, ぷーやん, べしゃり暮らし, べるぜバブ, ぼくのわたしの勇者学, ぼっけさん, みえるひと, めだかボックス, わっしょい! わじマニア, アイアンナイト, アイシールド21, アスクレピオス, エム×ゼロ, カイン, カガミガミ, キックス メガミックス, クロガネ, クロクロク, クロス・マネジ, グラナダ, グラナダ −究極科学探検隊−, サムライうさぎ, サラブレッドと呼ばないで, シャーマンキング, ジュウドウズ, ジョジョの奇妙な冒険, スティール・ボール・ラン, ステルス交境曲, スモーキーB.B., タカマガハラ, タカヤ, ダブルアーツ, チャゲチャ, ツギハギ漂流作家, テニスの王子様, トリコ, ニセコイ, ハイキュー!!, ハイファイクラスタ, バクマン。, バリハケン, バレーボール使い 郷田豪, パジャマな彼女。, ヒカルの碁, ピューと吹く! ジャガー, ピューと吹く!ジャガー, フープメン, ブラッククローバー, プリティ フェイス, ベルモンド Le VisiteuR, ボボボーボ・ボーボボ, マイスター, ムヒョとロージーの魔法律相談事務所, メゾン・ド・ペンギン, メタリカメタルカ, メルヘン王子グリム, モロモノの事情, ユート, ヨアケモノ, ワールドトリガー, 三ツ首コンドル, 保健室の死神, 僕のヒーローアカデミア, 切法師, 初恋限定。, 卓上のアゲハ, 大泥棒ポルタ, 太臓もて王サーガ, 奇怪噺 花咲一休, 学糾法廷, 少年守護神, 少年疾駆, 恋するエジソン, 恋のキューピッド 焼野原塵, 恋染紅葉, 戦国ARMORS, 戦国乱破伝 サソリ, 戦星のバルジ, 改造人間ロギイ, 斉木楠雄のψ難, 斬, 新世紀アイドル伝説 彼方セブンチェンジ, 新米婦警キルコさん, 暗殺教室, 未確認少年 ゲドー, 武装錬金, 火ノ丸相撲, 烈!!! 伊達先パイ, 無刀ブラック, 無敵鉄姫 スピンちゃん, 現存! 古代生物史 パッキー, 真説ボボボーボ・ボーボボ, 瞳のカトブレパス, 磯部磯兵衛物語 〜浮世はつらいよ〜, 神力契約者 M&Y, 神奈川磯南風天組, 神撫手, 私立ポセイドン学園高等部, 詭弁学派、四ッ谷先輩の怪談。, 謎の村雨くん, 賢い犬リリエンタール, 逢魔ヶ刻動物園, 遊☆戯☆王, 重機人間ユンボル, 銀河パトロール\u3000ジャコ, 銀魂, 鍵人 -カギジン-, 鏡の国の針栖川, 闇神コウ 〜暗闇にドッキリ!〜, 食戟のソーマ, 魔人探偵 脳噛ネウロ, 黒子のバスケ, A・O・N"
In [4]:
def plot_manga(df, xlim=None, ylim=None, title=None):
    df[col].plot(xlim=xlim, ylim=ylim, rot=45)
    plt.legend(loc='center left', bbox_to_anchor=(1, 0.5))
    plt.xlabel('(年, 号)')
    plt.ylabel('掲載順位')
    if title:
        plt.title(title)

col = ['NARUTO −ナルト−']
width = 5
plot_manga(pd.rolling_mean(df[col].interpolate(), width),
           ylim=(10, 0), title='rolling mean, width={0}'.format(width))

打ち切り漫画?の特徴

短期で終了した漫画をピックアップしてみる.

In [5]:
col = ['フープメン', 'メタリカメタルカ', 
       'AKABOSHI -異聞水滸伝-', 'ぼっけさん', '戦国ARMORS',
       '新米婦警キルコさん', 'アスクレピオス',
       'ねこわっぱ!', 'タカマガハラ']

plot_manga(df[col], xlim=(250,500), ylim=(21, 0))
In [6]:
col = ['チャゲチャ', '改造人間ロギイ', 'ブラッククローバー',
       '重機人間ユンボル', 'TOKYO WONDER BOYS', 'LIVE',
       'マイスター', '神力契約者 M&Y', 'カガミガミ',
       'HAND\'S', '少年守護神', '銀河パトロール ジャコ',
       'E-ROBOT', '無敵鉄姫 スピンちゃん', '戦国乱破伝 サソリ'
       ]

plot_manga(df[col], ylim=(21, 0))
In [7]:
col = ['BLACK CAT', 'BLEACH', 'ムヒョとロージーの魔法律相談事務所',
       '魔人探偵 脳噛ネウロ']

width = 5
plot_manga(pd.rolling_mean(df[col].interpolate(), width),
           ylim=(25, 0), title='rolling mean, width={0}'.format(width))

データセットの中でのそれぞれの漫画の出現数のトップ20とワースト20を見てみる

In [8]:
count = df.notnull().sum(axis=0)
count.sort()
count[:20:-1]
Out[8]:
こちら葛飾区亀有公園前派出所    595
BLEACH            572
NARUTO −ナルト−      552
銀魂                538
ONE PIECE         528
REBORN!           409
トリコ               319
アイシールド21          315
SKET DANCE        288
ピューと吹く! ジャガー      287
黒子のバスケ            275
べるぜバブ             240
テニスの王子様           221
ぬらりひょんの孫          207
魔人探偵 脳噛ネウロ        202
...
奇怪噺 花咲一休               15
大泥棒ポルタ                 15
スモーキーB.B.              15
TATOO HEARTS           14
キックス メガミックス            13
ぷーやん                   13
ねこわっぱ!                 13
どがしかでん!                13
神撫手                    13
新世紀アイドル伝説 彼方セブンチェンジ    13
サラブレッドと呼ばないで           13
グラナダ −究極科学探検隊−         13
MUDDY                  12
無刀ブラック                 12
K.O.SEN                12
Length: 143, dtype: int64
In [9]:
count[:20]
Out[9]:
A・O・N                      1
グラナダ                       1
モロモノの事情                    3
CLAYMORE                   4
Ultra Battle Satellite     7
チャゲチャ                      8
改造人間ロギイ                    8
ブラッククローバー                  9
重機人間ユンボル                  10
TOKYO WONDER BOYS         10
LIVE                      10
マイスター                     10
神力契約者 M&Y                 10
カガミガミ                     10
HAND'S                    10
少年守護神                     11
銀河パトロール ジャコ               11
E-ROBOT                   11
無敵鉄姫 スピンちゃん               11
戦国乱破伝 サソリ                 12
dtype: int64

ワンピースの休載について

In [10]:
not_published = ((one == '休') | (one == '落')).astype(int)
not_published.reset_index(drop=True)
not_published = not_published.set_index(df.index)
not_published.plot(rot=45)
Out[10]:
<matplotlib.axes._subplots.AxesSubplot at 0x7fe6c65304e0>
In [11]:
not_published = not_published.reset_index(drop=True)  # multiindex -> index に直す
not_published = not_published[not_published == 1].dropna()
not_published = list(not_published.index)
In [12]:
diff = pd.Series(not_published).diff(1)[1:]
diff = list(diff)
In [13]:
plt.hist(diff, bins=range(45))
plt.xlabel('休載の間隔')
plt.ylabel('回数')
Out[13]:
<matplotlib.text.Text at 0x7fe6c6561a20>
In [14]:
%load_ext version_information
%version_information numpy,pandas,matplotlib
Out[14]:
SoftwareVersion
Python3.4.2 64bit [GCC 4.8.2]
IPython2.4.1
OSLinux 3.13.0 49 generic x86_64 with debian jessie sid
numpy1.9.1
pandas0.15.2
matplotlib1.4.3
Thu Apr 30 00:24:02 2015 JST