【初級】matplotlibを使ってゲームの売り上げを可視化してみた

こんにちは!

今回は、Pythonライブラリのmatplotlibを使って、データの可視化をしていきたいと思います。

今回使用するデータは、「歴代ゲームソフトの売り上げデータ」です!

可視化して、ゲームの売り上げの詳細を紐解いていきましょう^^

データは売上順で、全件で16598件あります。ちなみに上位20件は以下の通り

やや懐かしめのソフトが並んでいる感じでしょうか?

Wii Sportsが1位ということに正直驚きました(笑)

でも確かに、Wiiが出たときは結構衝撃ありましたからねー^^

みなさんがお世話になったゲームはありますか?

私は17位のグラセフに熱中していました(今でもオンラインで人気ですね^^)

ちなみにこれは4年前に作られたデータセットなので、現在では多少ランキングに変化があるかもしれません。

では、話を戻しましょう。ここで、右側のSales項目について補足で説明を加えておきます。

  • NA_Sales:北米での売り上げ
  • EU_Sales:ヨーロッパでの売り上げ
  • JP_Sales:日本での売り上げ
  • Other_Sales:上記以外の国での売り上げ
  • Global_Sales:世界全体での売り上げ

*単位は100万

データは、以下のサイトから取ってきました。

https://www.kaggle.com/gregorut/videogamesales

可視化ツールはmatplotlib

今回は、Pythonのmatplotlibというライブラリを用いて可視化をしていきます。matplotlibを使えば、大抵のグラフは描画することができます。

それでは、matplotlibを使って、ゲームの売り上げデータを可視化していきましょう^^

地域ごとの売り上げの相関を調べる

人気のゲームはどこの国も同じなのでしょうか?

それとも、地域によってゲームの嗜好が変わってくるのでしょうか?

これを簡単に調べるために、売り上げの相関を見てみます。手っ取り早く相関を見るには、散布図が有効です。

ということで、散布図を描いてみましょう!

*データの件数が多いので、売り上げの多かった上位200件を対象とします。

日本と北米の相関

日本と北米では、売れるゲームに相関性はあるのでしょうか?

散布図を描くまでのプログラムは以下の通りです。

import pandas as pd
import matplotlib.pyplot as plt

#保存したcsvファイルを読み込む
df = pd.read_csv("data/vgsales.csv")

#データフレームの頭から200件に絞る
df200 = df.head(200)

#散布図描画
plt.scatter(df200["NA_Sales"], df200["JP_Sales"])

#軸ラベルの設定。日本語を入力する場合はfontnameを"MS Gothic"にするとうまくいく
plt.xlabel("北米の売り上げ (million)", fontsize=13, fontname="MS Gothic")
plt.ylabel("日本の売り上げ (million)", fontsize=13, fontname="MS Gothic")

うーん

これを見る限り、日本で売れてるソフトが北米で同じように人気だというわけではなさそうですね(逆もまた然り)。

日本で人気はあるけど、北米ではそこまでといったソフトが多い印象を受けます。

もっとも、市場規模の違いは考慮すべきだとは思いますが、、

日本とヨーロッパ

今度は、日本とヨーロッパでの売り上げの関係性を見ていきます。

コードはこちら

#散布図描画
plt.scatter(df200["EU_Sales"], df200["JP_Sales"])

#軸ラベルの設定。日本語を入力する場合はfontnameを"MS Gothic"にするとうまくいく
plt.xlabel("ヨーロッパの売り上げ (million)", fontsize=13, fontname="MS Gothic")
plt.ylabel("日本の売り上げ (million)", fontsize=13, fontname="MS Gothic")

なんだかさっきと似たような結果になりました^^;

ヨーロッパではあまり売れていないソフトが、日本ではそれなりに売れているようです。

ここである気づきが。

似たような結果になったということは、北米とヨーロッパには相関性があるのでは??」

ということでさっそくグラフを描いてみましょう。

北米とヨーロッパ

#散布図描画
plt.scatter(df200["EU_Sales"], df200["NA_Sales"])

#軸ラベルの設定。日本語を入力する場合はfontnameを"MS Gothic"にするとうまくいく
plt.xlabel("ヨーロッパの売り上げ (million)", fontsize=13, fontname="MS Gothic")
plt.ylabel("北米の売り上げ (million)", fontsize=13, fontname="MS Gothic")

先ほどまでと比べ、相関性のありそうな結果が!

「欧米」と呼ばれるくらいなので、やはり好みとかにているのでしょうか。

ということで相関係数を見てみます。

df200.corr()

期待しましたが、北米とヨーロッパの相関係数は0.615なので、相関があるとは言えなさそうです^^;

ただし、「日本と比べると相関は強そう」ということは言えそうです。

ゲームソフトが売れまくっている企業は?

では、ゲームソフトが売れまくっている企業はどこでしょうか?

え?

そんなの冒頭のデータフレーム見ればだいたいわかるって?

そんなこと言わずにデータで見ていきましょう^^

ゲーム会社ごとに売り上げを集計する

それでは、会社ごとの売り上げの合計を出してみましょう。今回は、16000件のデータ全体を使います。

df.groupby("Publisher").sum().sort_values("Global_Sales", ascending=False).head(20)

続けて書いたので汚くなってしまいました^^;

groupby(“Publisher”).sum() で、発売元ごとの合計を算出しています。それ以降の部分では、世界全体の売り上げで降順に並び替え、上位20社に絞り込んでいます。

結果は以下の通り

やはり任天堂がぶっちぎってましたね!日本での売り上げがずば抜けているようです。

その他にも、ソニーやコナミ、セガやナムコといったおなじみのゲーム会社がランクインしていますね^^

ちなみに2位のElectronic Artsは米国のゲーム会社で、スポーツ系のゲームを主力としています。(EA Sportsと聞いてピンとくる方もいるのでは?)

3位のActivisonも米国の会社で、FPS好きなら知らない人はいない”CALL OF DUTY”シリーズを制作しています。

会社名を知らなくても、調べてみると知っているソフトがあったりして面白いです^^

会社ごとの売り上げを可視化する

では、得られた結果を使って、会社ごと地域ごとの売り上げを可視化していきましょう。

今回は、積み上げ棒グラフを描いていきます。

df_pub = df.groupby("Publisher").sum().sort_values("Global_Sales", ascending=False).head(20).drop(["Rank", "Year", "Global_Sales"], axis=1)

先ほどの結果をdf_pubという変数に入れます(最後の追加部分で不要な列を削除しています)

#データフレームを転置
df_pub_T = df_pub.T

#積み上げ棒グラフ描画
fig, ax = plt.subplots(figsize=(10, 8))
for i in range(len(df_pub_T)):
    ax.bar(df_pub_T.columns, df_pub_T.iloc[i], bottom=df_pub_T.iloc[:i].sum())
#凡例
ax.legend(df_pub_T.index)
#x軸のラベルを回転
labels = ax.get_xticklabels()
plt.setp(labels, rotation=90, fontsize=10)
plt.show()

結果はこのようになりました。縦軸は売上高を表しています。

任天堂は北米の売り上げだけで3位以下を抑えてしまっています。恐ろしい^^;

また、日本での任天堂の根強い人気も窺えます。

気になるのは、売り上げのほとんどが欧米と日本だけで占められているということ。

中国とか売れてそうな気もしますが、ゲームはまだまだ浸透していないのでしょうか?それともこのデータに含まれていないだけなのか?謎です。

グラフを描くと、上記のことが一発でなんとなくわかってしまいます。これが、可視化の魅力です。

まとめ

いかがでしょうか。

ゲームソフト業界は任天堂の一人勝ち状態でしたが、日本では馴染みのない会社が売り上げの上位に位置していたりと、結構面白いデータだったと思います^^

今回使っていないデータを組み合わせると、もっといろんな可視化ができるかもしれませんね。

Pythonでの可視化は、記事内のコードを写せば同様の結果が得られるので、是非試してみてくださいね^^

こんなデータを見ていると、ゲームがやりたくなってきました。

今はみんなでSwitchの桃鉄がやりたい気分ですねぇ。

ではでは👋