迷走ブログ

迷走している全ての人に役立つ情報を送るブログです

【python】Mr.Childrenのアルバムとシングル曲のオリコンチャートを可視化してみた

はじめに

今回は、Mr.Childrenのこれまでのアルバムとシングル曲に関しての情報を可視化してみました。

本当であれば、歌詞の形態素解析をしていきたかったのですが、iPad上でMeCabを動かす方法がわからないため、諦めました。

結論

デビューしてから、3作目にはオリコン3位にランクインしており、4作目には1位を取っています。1作目、2作目から3作目には一気に人気を獲得しており、さすがミスチル!
年間チャートについては、1位を獲得している作品は1作のみであるものの、半分以上の作品が年間チャートでトップ10位に入っており、人気があるといえそう。

長年のファンの方からしたら意外性のある結論でもなんでもないと思いますが、個人的には意外と年間チャートレベルでは1位を獲得していないことは発見でした。
もしかしたら、その年の流行の曲やアルバムが1位を取る傾向とかがあって、堅実な人気を持つミスチルはその年の代表曲的なものには負けてしまっているがトップ10位には入るくらいの一定の人気作品をリリースし続けている、等ありそうだなと思いましたまる

f:id:yktmmrmtoosa03:20210930211308j:plain
f:id:yktmmrmtoosa03:20210930223740j:plain

コード

データの読み込みと確認

import pandas as pd
df = pd.read_excel('ミスチル.xlsx',encoding="utf-8")
df.head(5)

f:id:yktmmrmtoosa03:20210930193912j:plain
まず、wikiから引っ張ってきたデータをエクセルファイルに保存しました。
そのため、列名がわかりません。あとは欠損値もありそうです。
次に、それらに対処していきます。

ヘッダーに値を設定する処理

df.columns = df.loc[0]
df.head(5)

f:id:yktmmrmtoosa03:20210930194457j:plain
とりあえずは、0行目書かれた位置に属する要素をそのまま列名として設定しました。

df.drop(index=0).head(5)

f:id:yktmmrmtoosa03:20210930194758j:plain
drop()を用いて、いらなくなった0行目を削除する処理をしました。

発売年の抽出と結合

var_data = df['発売日'].str.split('年',expand=True)
var_data.head(5)

f:id:yktmmrmtoosa03:20210930195410j:plain
ここでは、年だけを取り出したいのですが、ただ数字だけを残すのではなく、月日も残して置くことにしました。月日を使う可能性を捨て切れなかったためです。
そのため、str.split()を用いることで、「年」部分を境にして、要素を別々の列へと分割しました。

var_data.columns = ['発売年','発売月']
df = pd.concat([var_data,df],axis=1)
df.drop(['発売日'],axis=1,inplace=True)
df.head(5)

f:id:yktmmrmtoosa03:20210930195914j:plain
ここでは、前回取り出した年の部分と月日の部分を元のデータに結合しています。
そこでまず1行目では、カラム名をそれぞれ発売年と発売日に設定しています。
その上で、元のデータと結合させています。

いらない列を削除・欠損値を穴埋め

df.drop(df.columns[[-1,-4,-5]],axis=1).head(5)

f:id:yktmmrmtoosa03:20210930195852j:plain

df.fillna(method='ffill')

f:id:yktmmrmtoosa03:20210930203511j:plain
ここでは、欠損値の穴埋めをしました。欠損値部分は、どれも「オリコン最高位」部分に該当しました。そこで、欠損値の傾向をみると、順位が前のデータと同じ場合は省略されてしまっているようでしたので、同じ値で埋めることができそうです。そのため、ffillを用いて、初めの1位と出現している値と用いて、後の値にも1位を穴埋めしています。

グラフによる可視化

rdf = df.fillna(method='ffill').drop(df.columns[0],axis=1)
fig = px.line(rdf, x="発売年", y=rdf["オリコン\n最高位"], title="ミスチルのアルバム最高位",markers=True)
fig.update_layout(yaxis={'categoryorder':'total ascending'})
fig.show()

f:id:yktmmrmtoosa03:20210930211308j:plain
オリコンの最高位は、デビューして以来3作目で三位にランクインでしており、4作目で一位を見事に獲得していることがわかります。
そして、それ以降の作品は、2000年にリリースしたアルバム「Q」以来、全て一位を獲得しています。さすが、ミスチル!

個人的には、アルバム「Q」の中の「ロードムービー」が好きです。
オートバイに「君」を乗せて、走り出しているだけのことを歌っているわけではないと思いました。最後の歌詞に「もう1つ次の未来へ」という言葉で終わります。そのため、「僕らにつきまとういくつかの問題」を乗り越えたら、オートバイに乗せている「君」との関係性が変わっていくことを暗示しているのかなと思いました。
つまり、問題が解決するかどうかは「時の流れに身を委ねて」みることなんだけど、もしも時間が解決してくれたのならば、関係性が「もう一つ次の未来へ」=「どこかにあるはずのゴールライン」=結婚?になることを暗示しているのかなと思いました。
興味深いな暗示だなと勝手に解釈しています。(笑)

*「」は歌詞の引用部分となります。

Q

Q

Amazon

#都合上、一度データを読み込み直しているため、変数名が代わっていますが、特別な意味はありません。
df1 = pd.read_excel('ミスチル1.xlsx',encoding='utf-8')

rdf1 = df1.fillna(method='ffill')

fig = px.line(rdf1, x="発売年", y=rdf1["年間チャート[注 7]"], title="ミスチルのアルバム年間チャート",markers=True)
fig.update_layout(yaxis={'categoryorder':'category descending'})
fig.show()

f:id:yktmmrmtoosa03:20210930223740j:plain
こちらは、年間チャートの順位を可視化しました。
意外と、年間で1位を取ったことがあるのは、1作品のみであることがわかりました。
どんな作品なのかを次に確認してみましょう。

fig = px.bar(df, x="タイトル", y=rdf1["年間チャート[注 7]"], title="ミスチル")
fig.update_layout(yaxis={'categoryorder':'category ascending'})
fig.show()

f:id:yktmmrmtoosa03:20210930224102j:plain
はい、「HOME」というアルバムです。
ちょっと、可視化の仕方がどうすれば良いのかわからなかったため、y軸に順位をとり、x軸に作品名という形にしてみました。

本来であれば、円グラフとかにしたほうが見やすいのでしょうか。その辺りがどうすれば良いのか判然としませんでしたが、練習ですから、細かいことは気にしない。

ちなみに、「HOME」の中で個人的に好きな曲は、「箒星」と「通り雨」「もっと」「彩り」という曲です。「箒星」は28枚目のシングル曲、「彩り」はアルバムの表題曲です。

「通り雨」は、通り雨程度の天気が変化することくらいの些細なことであっても、心境の変化や心情の変化が起きるんだよーということを歌っている曲なのだと思います。個人的な解釈ですが、天気ほどの些細なことを意識するだけでも、気持ちが軽くなったり、気分転換につながるような効果があるんだ、と誰も普段は気にもしないようなことをさらっと実は重要なんじゃない?と歌っているところがめっちゃ好きです。

「もっと」という曲についても語りたいですが、需要がなさそうなので割愛。

HOME(通常盤)

HOME(通常盤)

Amazon

おわりに

ミスチルを聞いて、pythonの勉強を頑張るしかない!
俺(たち)の戦いはこれからだ!(笑)