ゲームデータの基礎分析#
準備#
Import#
Show code cell content
# warningsモジュールのインポート
import warnings
# データ解析や機械学習のライブラリ使用時の警告を非表示にする目的で警告を無視
# 本書の文脈では、可視化の学習に議論を集中させるために選択した
# ただし、学習以外の場面で、警告を無視する設定は推奨しない
warnings.filterwarnings("ignore")
Show code cell content
# 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/gm/input")
Show code cell content
# 読み込み対象ファイル名の定義
# ゲームパッケージとプラットフォームの対応関係に関するファイル
FN_PKG_PF = "gm_pkg_pf.csv"
gm_pkg_pf.csvの基礎分析#
Show code cell content
# pandasのread_csv関数でCSVファイルの読み込み
df_pkg_pf = pd.read_csv(DIR_IN / FN_PKG_PF)
全体像の把握#
Show code cell content
# df_pkg_pfデータフレームの先頭5行を転置して表示
df_pkg_pf.head().T
| 0 | 1 | 2 | 3 | 4 | |
|---|---|---|---|---|---|
| pkgid | M718871 | M718876 | M718877 | M718878 | M718879 |
| pfid | PF00026 | PF00028 | PF00028 | PF00028 | PF00000 |
| pkgname | くにおくん 熱血コレクション 1 | 野々村病院の人々 | アイドル雀士スーチーパイ Remix | 天地無用! 魎皇鬼 ごくらくCD-ROM for SEGA SATURN | Superリアル麻雀 P4 + 相性診断 |
| publisher | アトラス | エ・ル・フ | ジャレコ | アローマ | セタ |
| date | 2005-08-25 | 1996-04-26 | 1995-09-29 | 1995-09-29 | 1995-03-10 |
| price | 5040.0 | 6800.0 | 6900.0 | 7800.0 | 9500.0 |
| pfname | ゲームボーイアドバンス | セガサターン | セガサターン | セガサターン | 3DO |
Show code cell content
# df_pkg_pfデータフレームの形状(行数・列数)を取得
# shape属性を使用すると、(行数, 列数)の形で結果が返される
df_pkg_pf.shape
(35675, 7)
Show code cell content
# df_pkg_pfデータフレーム内の欠損値(NaN)の情報を集計
# isna()メソッドを使用して欠損値の場所をTrueとして特定
# その後、agg()メソッドを使用して、各列における欠損値の合計と平均を計算
df_pkg_pf.isna().agg([sum, "mean"])
| pkgid | pfid | pkgname | publisher | date | price | pfname | |
|---|---|---|---|---|---|---|---|
| sum | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 526.000000 | 0.0 |
| mean | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.014744 | 0.0 |
Show code cell content
# df_pkg_pfデータフレームの記述統計情報を取得
# describe()メソッドを使用して、各列の基本的な統計量を表示
df_pkg_pf.describe()
| price | |
|---|---|
| count | 35149.000000 |
| mean | 5117.557968 |
| std | 3619.123743 |
| min | 54.000000 |
| 25% | 2800.000000 |
| 50% | 5040.000000 |
| 75% | 6800.000000 |
| max | 58000.000000 |
Show code cell content
# df_pkg_pfデータフレームの各列に対してユニークな値の数をカウント
# nunique()メソッドを使用して、各列のユニークな値の数を計算
# その後、結果を新しいデータフレームとして整形し、列名を`nunique`とする
df_pkg_pf.nunique().reset_index(name="nunique")
| index | nunique | |
|---|---|---|
| 0 | pkgid | 35638 |
| 1 | pfid | 47 |
| 2 | pkgname | 30483 |
| 3 | publisher | 1952 |
| 4 | date | 4115 |
| 5 | price | 1208 |
| 6 | pfname | 47 |
Show code cell content
# `pkgid`と`pfid`の組み合わせで重複する行の数をカウント
df_pkg_pf.duplicated(subset=["pkgid", "pfid"]).sum()
0
date列の深掘り#
Show code cell content
# df_pkg_pfデータフレームの`date`列から最も古い日付と最も新しい日付を取得
# min()メソッドを使用して、最も古い日付を抽出
# max()メソッドを使用して、最も新しい日付を抽出
df_pkg_pf["date"].min(), df_pkg_pf["date"].max()
('1982-04-25', '2019-04-16')
Show code cell content
# `date`列を日付型に変換
# pd.to_datetime()メソッドを使用して、文字列型の日付を日付型(datetime)に変換
df_pkg_pf["date"] = pd.to_datetime(df_pkg_pf["date"])
# 年に関する情報を新しい`year`列として追加
# dt.yearを使用して、日付から年のみを取得
df_pkg_pf["year"] = df_pkg_pf["date"].dt.year
# 月に関する情報を新しい`month`列として追加
# dt.monthを使用して、日付から月のみを取得
df_pkg_pf["month"] = df_pkg_pf["date"].dt.month
# 曜日に関する情報を新しい`weekday`列として追加
# dt.weekdayを使用して、日付から曜日の情報を数値(0:月曜日, 6:日曜日)として取得
df_pkg_pf["weekday"] = df_pkg_pf["date"].dt.weekday
Show code cell content
# `year`(年)ごとに`pkgid`のユニークな値の数を集計
# 具体的には、groupbyメソッドで`year`を基準にグループ化し、
# nuniqueメソッドを使用して`pkgid`のユニークな値の数を計算
# その後、reset_indexメソッドでインデックスをリセットし、データフレームとして結果を返す
df_pkg_pf.groupby("year")["pkgid"].nunique().reset_index()
| year | pkgid | |
|---|---|---|
| 0 | 1982 | 12 |
| 1 | 1983 | 11 |
| 2 | 1984 | 30 |
| 3 | 1985 | 59 |
| 4 | 1986 | 57 |
| 5 | 1987 | 106 |
| 6 | 1988 | 79 |
| 7 | 1989 | 152 |
| 8 | 1990 | 300 |
| 9 | 1991 | 336 |
| 10 | 1992 | 398 |
| 11 | 1993 | 427 |
| 12 | 1994 | 613 |
| 13 | 1995 | 735 |
| 14 | 1996 | 841 |
| 15 | 1997 | 856 |
| 16 | 1998 | 985 |
| 17 | 1999 | 1173 |
| 18 | 2000 | 1259 |
| 19 | 2001 | 1070 |
| 20 | 2002 | 1156 |
| 21 | 2003 | 1065 |
| 22 | 2004 | 1037 |
| 23 | 2005 | 1103 |
| 24 | 2006 | 1244 |
| 25 | 2007 | 1641 |
| 26 | 2008 | 1681 |
| 27 | 2009 | 1968 |
| 28 | 2010 | 1930 |
| 29 | 2011 | 1575 |
| 30 | 2012 | 1700 |
| 31 | 2013 | 2033 |
| 32 | 2014 | 2106 |
| 33 | 2015 | 1964 |
| 34 | 2016 | 1852 |
| 35 | 2017 | 2074 |
| 36 | 2018 | 9 |
| 37 | 2019 | 1 |
Show code cell content
# `month`(月)ごとに`pkgid`のユニークな値の数を集計
# 具体的には、groupbyメソッドで`month`を基準にグループ化し、
# nuniqueメソッドを使用して`pkgid`のユニークな値の数を計算
# その後、reset_indexメソッドでインデックスをリセットし、データフレームとして結果を返す
df_pkg_pf.groupby("month")["pkgid"].nunique().reset_index()
| month | pkgid | |
|---|---|---|
| 0 | 1 | 1978 |
| 1 | 2 | 2629 |
| 2 | 3 | 3690 |
| 3 | 4 | 2728 |
| 4 | 5 | 1817 |
| 5 | 6 | 2503 |
| 6 | 7 | 3216 |
| 7 | 8 | 2755 |
| 8 | 9 | 3075 |
| 9 | 10 | 2911 |
| 10 | 11 | 3594 |
| 11 | 12 | 4742 |
Show code cell content
# `weekday`(曜日)ごとに`pkgid`のユニークな値の数を集計
# 具体的には、groupbyメソッドで`weekday`を基準にグループ化し、
# nuniqueメソッドを使用して`pkgid`のユニークな値の数を計算
# その後、reset_indexメソッドでインデックスをリセットし、データフレームとして結果を返す
df_pkg_pf.groupby("weekday")["pkgid"].nunique().reset_index()
| weekday | pkgid | |
|---|---|---|
| 0 | 0 | 281 |
| 1 | 1 | 1692 |
| 2 | 2 | 4515 |
| 3 | 3 | 22844 |
| 4 | 4 | 5331 |
| 5 | 5 | 810 |
| 6 | 6 | 165 |
Show code cell content
# 年ごとに各曜日に発売されたゲームパッケージのユニークな数を集計
# pivot_tableメソッドで`year`をインデックス、`weekday`をカラムとしてピボット
# `pkgid`のユニークな値の数を値として集計し、欠損値は0で補完
df_pkg_pf.pivot_table(
index="year", columns="weekday", values="pkgid", aggfunc="nunique"
).fillna(0)
| weekday | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
|---|---|---|---|---|---|---|---|
| year | |||||||
| 1982 | 0.0 | 1.0 | 1.0 | 0.0 | 2.0 | 0.0 | 8.0 |
| 1983 | 1.0 | 1.0 | 1.0 | 0.0 | 4.0 | 4.0 | 0.0 |
| 1984 | 0.0 | 2.0 | 3.0 | 5.0 | 12.0 | 8.0 | 0.0 |
| 1985 | 3.0 | 8.0 | 7.0 | 12.0 | 17.0 | 6.0 | 6.0 |
| 1986 | 1.0 | 5.0 | 13.0 | 9.0 | 21.0 | 6.0 | 2.0 |
| 1987 | 9.0 | 11.0 | 10.0 | 10.0 | 43.0 | 17.0 | 6.0 |
| 1988 | 2.0 | 6.0 | 5.0 | 10.0 | 46.0 | 6.0 | 4.0 |
| 1989 | 6.0 | 20.0 | 10.0 | 17.0 | 79.0 | 19.0 | 1.0 |
| 1990 | 1.0 | 17.0 | 16.0 | 15.0 | 197.0 | 47.0 | 7.0 |
| 1991 | 17.0 | 16.0 | 6.0 | 13.0 | 248.0 | 30.0 | 6.0 |
| 1992 | 4.0 | 24.0 | 10.0 | 18.0 | 311.0 | 23.0 | 8.0 |
| 1993 | 3.0 | 11.0 | 23.0 | 21.0 | 343.0 | 19.0 | 7.0 |
| 1994 | 9.0 | 13.0 | 11.0 | 55.0 | 460.0 | 55.0 | 10.0 |
| 1995 | 6.0 | 13.0 | 19.0 | 22.0 | 643.0 | 28.0 | 4.0 |
| 1996 | 4.0 | 10.0 | 3.0 | 13.0 | 776.0 | 27.0 | 8.0 |
| 1997 | 4.0 | 12.0 | 5.0 | 353.0 | 472.0 | 6.0 | 4.0 |
| 1998 | 4.0 | 3.0 | 89.0 | 746.0 | 118.0 | 18.0 | 7.0 |
| 1999 | 23.0 | 37.0 | 93.0 | 847.0 | 152.0 | 15.0 | 6.0 |
| 2000 | 10.0 | 28.0 | 46.0 | 985.0 | 142.0 | 42.0 | 6.0 |
| 2001 | 4.0 | 3.0 | 28.0 | 856.0 | 165.0 | 11.0 | 3.0 |
| 2002 | 3.0 | 15.0 | 34.0 | 903.0 | 182.0 | 18.0 | 1.0 |
| 2003 | 3.0 | 5.0 | 16.0 | 873.0 | 158.0 | 9.0 | 1.0 |
| 2004 | 3.0 | 24.0 | 88.0 | 811.0 | 84.0 | 20.0 | 7.0 |
| 2005 | 3.0 | 7.0 | 55.0 | 961.0 | 54.0 | 23.0 | 0.0 |
| 2006 | 5.0 | 11.0 | 49.0 | 1084.0 | 28.0 | 65.0 | 2.0 |
| 2007 | 4.0 | 203.0 | 99.0 | 1294.0 | 30.0 | 2.0 | 9.0 |
| 2008 | 8.0 | 180.0 | 219.0 | 1233.0 | 31.0 | 8.0 | 2.0 |
| 2009 | 23.0 | 252.0 | 347.0 | 1277.0 | 27.0 | 14.0 | 28.0 |
| 2010 | 9.0 | 139.0 | 540.0 | 1193.0 | 33.0 | 15.0 | 1.0 |
| 2011 | 4.0 | 97.0 | 355.0 | 1042.0 | 10.0 | 67.0 | 0.0 |
| 2012 | 16.0 | 81.0 | 273.0 | 1284.0 | 12.0 | 32.0 | 2.0 |
| 2013 | 3.0 | 67.0 | 442.0 | 1466.0 | 17.0 | 37.0 | 1.0 |
| 2014 | 5.0 | 41.0 | 504.0 | 1468.0 | 20.0 | 66.0 | 2.0 |
| 2015 | 8.0 | 65.0 | 448.0 | 1343.0 | 80.0 | 15.0 | 5.0 |
| 2016 | 49.0 | 132.0 | 402.0 | 1147.0 | 106.0 | 16.0 | 0.0 |
| 2017 | 24.0 | 130.0 | 245.0 | 1453.0 | 206.0 | 15.0 | 1.0 |
| 2018 | 0.0 | 1.0 | 0.0 | 5.0 | 2.0 | 1.0 | 0.0 |
| 2019 | 0.0 | 1.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
pkgid、pkgname列の深掘り#
Show code cell content
# `pkgid`ごとにユニークな`pkgname`の数を集計し、その統計情報を取得
df_pkg_pf.groupby("pkgid")["pkgname"].nunique().describe().reset_index()
| index | pkgname | |
|---|---|---|
| 0 | count | 35638.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
# `pkgname`ごとにユニークな`pkgid`の数を集計し、その統計情報を取得
df_pkg_pf.groupby("pkgname")["pkgid"].nunique().describe().reset_index()
| index | pkgid | |
|---|---|---|
| 0 | count | 30483.000000 |
| 1 | mean | 1.169111 |
| 2 | std | 0.527420 |
| 3 | min | 1.000000 |
| 4 | 25% | 1.000000 |
| 5 | 50% | 1.000000 |
| 6 | 75% | 1.000000 |
| 7 | max | 10.000000 |
Show code cell content
# ゲームパッケージ名(`pkgname`)ごとにユニークなパッケージID(`pkgid`)の数を集計
# groupbyメソッドで`pkgname`を基準にグループ化し、`pkgid`のユニークな値の数を計算
# その後、ソートしてユニークな`pkgid`の数が多い上位10件の`pkgname`とその数を表示
df_pkg_pf.groupby("pkgname")["pkgid"].nunique().sort_values(
ascending=False
).reset_index().head(10)
| pkgname | pkgid | |
|---|---|---|
| 0 | FIFA 15 | 10 |
| 1 | ぷよぷよテトリス スペシャルプライス | 9 |
| 2 | MotoGP™15 | 8 |
| 3 | サイコブレイク | 8 |
| 4 | ぷよぷよフィーバー | 8 |
| 5 | CHAOS;CHILD | 8 |
| 6 | ドラゴンボール ゼノバース | 8 |
| 7 | メタルスラッグ | 8 |
| 8 | LEGO®ジュラシック・ワールド | 8 |
| 9 | メタルスラッグ 3 | 8 |
Show code cell content
# `df_pkg_pf`から`pkgname`が`FIFA 15`である行を抽出
# 見やすさのため、特定の列のみ表示
df_pkg_pf[df_pkg_pf["pkgname"] == "FIFA 15"][["pkgname", "pfname", "date", "price"]]
| pkgname | pfname | date | price | |
|---|---|---|---|---|
| 11161 | FIFA 15 | プレイステーション4 | 2014-10-09 | 7300.0 |
| 11162 | FIFA 15 | プレイステーション3 | 2014-10-09 | 7300.0 |
| 11163 | FIFA 15 | XboxOne | 2014-10-09 | 7300.0 |
| 11164 | FIFA 15 | Xbox360 | 2014-10-09 | 7300.0 |
| 11165 | FIFA 15 | プレイステーション4 | 2014-10-09 | 5940.0 |
| 11166 | FIFA 15 | プレイステーション3 | 2014-10-09 | 5940.0 |
| 11167 | FIFA 15 | プレイステーションVita | 2014-10-09 | 5940.0 |
| 11168 | FIFA 15 | XboxOne | 2014-10-09 | 7300.0 |
| 11169 | FIFA 15 | Xbox360 | 2014-10-09 | 3024.0 |
| 11170 | FIFA 15 | プレイステーションVita | 2014-10-09 | 5500.0 |
Show code cell content
# ゲームパッケージ名(`pkgname`)ごとに、関連するプラットフォームID(`pfid`)のユニークな数を集計
# groupbyメソッドで`pkgname`を基準にグループ化し、`pfid`のユニークな値の数を計算
# それを基礎集計して、各`pkgname`に紐づく`pfid`の数の統計量を表示
df_pkg_pf.groupby("pkgname")["pfid"].nunique().describe().reset_index()
| index | pfid | |
|---|---|---|
| 0 | count | 30483.000000 |
| 1 | mean | 1.108388 |
| 2 | std | 0.398799 |
| 3 | min | 1.000000 |
| 4 | 25% | 1.000000 |
| 5 | 50% | 1.000000 |
| 6 | 75% | 1.000000 |
| 7 | max | 8.000000 |
Show code cell content
# ゲームパッケージ名(`pkgname`)ごとに、関連するプラットフォームID(`pfid`)のユニークな数を集計
# groupbyメソッドで`pkgname`を基準にグループ化し、`pfid`のユニークな値の数を計算
# その数を降順にソートし、上位10件の`pkgname`とそれに紐づく`pfid`の数を表示
df_pkg_pf.groupby("pkgname")["pfid"].nunique().sort_values(
ascending=False
).reset_index().head(10)
| pkgname | pfid | |
|---|---|---|
| 0 | メタルスラッグ 3 | 8 |
| 1 | ぷよぷよフィーバー | 8 |
| 2 | メタルスラッグ | 8 |
| 3 | 上海 | 6 |
| 4 | ぷよぷよテトリス スペシャルプライス | 6 |
| 5 | パックマン | 6 |
| 6 | レミングス | 6 |
| 7 | 悪魔城ドラキュラ | 6 |
| 8 | 炎の闘球児 ドッジ弾平 | 6 |
| 9 | カーズ | 6 |
Show code cell content
# `df_pkg_pf`から`pkgname`が`ぷよぷよフィーバー`である行を抽出
# 見やすさのため、特定の列のみ表示
df_pkg_pf[df_pkg_pf["pkgname"] == "ぷよぷよフィーバー"][["pkgname", "pfname", "date", "price"]]
| pkgname | pfname | date | price | |
|---|---|---|---|---|
| 1035 | ぷよぷよフィーバー | プレイステーション・ポータブル | 2004-12-24 | 5040.0 |
| 1093 | ぷよぷよフィーバー | ゲームボーイアドバンス | 2004-07-24 | 5040.0 |
| 1141 | ぷよぷよフィーバー | ニンテンドーゲームキューブ | 2004-03-24 | 5229.0 |
| 1172 | ぷよぷよフィーバー | プレイステーション2 | 2004-02-04 | 5229.0 |
| 2657 | ぷよぷよフィーバー | Xbox | 2004-04-24 | 4980.0 |
| 2861 | ぷよぷよフィーバー | ドリームキャスト | 2004-02-24 | 4980.0 |
| 25507 | ぷよぷよフィーバー | ニンテンドーDS | 2004-12-24 | 5040.0 |
| 25508 | ぷよぷよフィーバー | Xbox360 | 2007-12-04 | 1200.0 |
pfid、pfname列の深掘り#
Show code cell content
# `pfid`ごとにユニークな`pfname`の数を集計し、その統計情報を取得
df_pkg_pf.groupby("pfid")["pfname"].nunique().describe().reset_index()
| index | pfname | |
|---|---|---|
| 0 | count | 47.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
# `pfname`ごとにユニークな`pfid`の数を集計し、その統計情報を取得
df_pkg_pf.groupby("pfname")["pfid"].nunique().describe().reset_index()
| index | pfid | |
|---|---|---|
| 0 | count | 47.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
# プラットフォームID(`pfid`)ごとに、関連するゲームパッケージID(`pkgid`)のユニークな数を集計
# groupbyメソッドで`pfid`を基準にグループ化し、`pkgid`のユニークな値の数を計算
# その後、計算結果の基本統計量を表示
df_pkg_pf.groupby(["pfid"])["pkgid"].nunique().describe().reset_index()
| index | pkgid | |
|---|---|---|
| 0 | count | 47.000000 |
| 1 | mean | 759.042553 |
| 2 | std | 1068.235786 |
| 3 | min | 1.000000 |
| 4 | 25% | 16.000000 |
| 5 | 50% | 228.000000 |
| 6 | 75% | 943.500000 |
| 7 | max | 4216.000000 |
Show code cell content
# 各プラットフォーム(に紐づくゲームパッケージIDのユニークな数を集計
# groupbyメソッドで`pfid`と`pfname`を基準にグループ化し、`pkgid`のユニークな値の数を計算
# 計算結果を降順にソートして、上位10件のプラットフォームとその紐づくゲームパッケージ数を表示
df_pkg_pf.groupby(["pfid", "pfname"])["pkgid"].nunique().sort_values(
ascending=False
).reset_index().head(10)
| pfid | pfname | pkgid | |
|---|---|---|---|
| 0 | PF00040 | プレイステーション2 | 4216 |
| 1 | PF00039 | プレイステーション | 3750 |
| 2 | PF00044 | プレイステーション・ポータブル | 3417 |
| 3 | PF00041 | プレイステーション3 | 2501 |
| 4 | PF00043 | プレイステーションVita | 2348 |
| 5 | PF00031 | ニンテンドー3DS | 2263 |
| 6 | PF00032 | ニンテンドーDS | 2213 |
| 7 | PF00042 | プレイステーション4 | 1874 |
| 8 | PF00020 | Xbox360 | 1385 |
| 9 | PF00015 | Wii | 1356 |
Show code cell content
# ユニークな`pkgid`数が多い上位5のpfidを取得
# `pfid`を基準にグループ化し、各グループのユニークな`pkgid`の数を計算
# その後、降順にソートして上位10の`pfid`をリスト形式で取得
pfids = (
df_pkg_pf.groupby("pfid")["pkgid"]
.nunique()
.sort_values(ascending=False)
.head()
.index.tolist()
)
# 上位5のpfidに紐づきデータを抽出
# 発売年(`year`)ごと、プラットフォーム名(`pfname`)ごとに
# ゲームパッケージID(`pkgid`)のユニークな数を集計、NaNは0に置換し、int型にキャスト
df_pkg_pf[df_pkg_pf["pfid"].isin(pfids)].pivot_table(
index="year", columns="pfname", values="pkgid", aggfunc="nunique"
).fillna(0).astype(int)
| pfname | プレイステーション | プレイステーション2 | プレイステーション3 | プレイステーションVita | プレイステーション・ポータブル |
|---|---|---|---|---|---|
| year | |||||
| 1994 | 14 | 0 | 0 | 0 | 0 |
| 1995 | 119 | 0 | 0 | 0 | 0 |
| 1996 | 368 | 0 | 0 | 0 | 0 |
| 1997 | 434 | 0 | 0 | 0 | 0 |
| 1998 | 584 | 0 | 0 | 0 | 0 |
| 1999 | 714 | 0 | 0 | 0 | 0 |
| 2000 | 668 | 117 | 0 | 0 | 0 |
| 2001 | 428 | 241 | 0 | 0 | 0 |
| 2002 | 310 | 423 | 0 | 0 | 0 |
| 2003 | 96 | 547 | 0 | 0 | 0 |
| 2004 | 13 | 634 | 0 | 0 | 16 |
| 2005 | 0 | 667 | 0 | 0 | 103 |
| 2006 | 1 | 557 | 21 | 0 | 225 |
| 2007 | 0 | 425 | 79 | 0 | 160 |
| 2008 | 0 | 312 | 146 | 0 | 155 |
| 2009 | 0 | 182 | 152 | 0 | 488 |
| 2010 | 1 | 92 | 214 | 0 | 637 |
| 2011 | 0 | 18 | 291 | 43 | 505 |
| 2012 | 0 | 0 | 334 | 167 | 535 |
| 2013 | 0 | 1 | 473 | 305 | 378 |
| 2014 | 0 | 0 | 398 | 412 | 176 |
| 2015 | 0 | 0 | 244 | 529 | 33 |
| 2016 | 0 | 0 | 116 | 494 | 5 |
| 2017 | 0 | 0 | 33 | 398 | 0 |
| 2019 | 0 | 0 | 0 | 0 | 1 |
Show code cell content
# pkgidが多い上位五つのpfidについて、発売曜日ごとのゲームパッケージ数を集計
# 曜日(`weekday`)ごと、プラットフォーム名(`pfname`)ごとに
# ゲームパッケージID(`pkgid`)のユニークな数を集計、NaNは0に置換
df_pkg_pf[df_pkg_pf["pfid"].isin(pfids)].pivot_table(
index="weekday", columns="pfname", values="pkgid", aggfunc="nunique"
).fillna(0)
| pfname | プレイステーション | プレイステーション2 | プレイステーション3 | プレイステーションVita | プレイステーション・ポータブル |
|---|---|---|---|---|---|
| weekday | |||||
| 0 | 8.0 | 7.0 | 3.0 | 18.0 | 29.0 |
| 1 | 57.0 | 24.0 | 104.0 | 39.0 | 44.0 |
| 2 | 154.0 | 144.0 | 220.0 | 148.0 | 178.0 |
| 3 | 2826.0 | 3990.0 | 2124.0 | 2065.0 | 3098.0 |
| 4 | 664.0 | 14.0 | 26.0 | 29.0 | 24.0 |
| 5 | 33.0 | 32.0 | 17.0 | 49.0 | 11.0 |
| 6 | 8.0 | 5.0 | 7.0 | 0.0 | 33.0 |
publisher列の深掘り#
Show code cell content
# `acname`ごとにユニークな`acid`の数を集計し、その統計情報を取得
df_pkg_pf.groupby("publisher")["pkgid"].nunique().describe().reset_index()
| index | pkgid | |
|---|---|---|
| 0 | count | 1952.000000 |
| 1 | mean | 18.257172 |
| 2 | std | 78.522024 |
| 3 | min | 1.000000 |
| 4 | 25% | 1.000000 |
| 5 | 50% | 2.000000 |
| 6 | 75% | 6.000000 |
| 7 | max | 1425.000000 |
Show code cell content
# ゲーム販売会社名(`publisher`)ごとにユニークなパッケージID(`pkgid`)の数を集計
# groupbyメソッドで`publisher`を基準にグループ化し、`pkgid`のユニークな値の数を計算
# その後、ソートしてユニークな`pkgid`の数が多い上位10件の`publisher`とその数を表示
df_pkg_pf.groupby("publisher")["pkgid"].nunique().sort_values(
ascending=False
).reset_index().head(10)
| publisher | pkgid | |
|---|---|---|
| 0 | 任天堂株式会社 | 1425 |
| 1 | 株式会社バンダイナムコゲームス | 1216 |
| 2 | 株式会社カプコン | 984 |
| 3 | 株式会社ソニー・コンピュータエンタテインメント | 915 |
| 4 | エレクトロニック・アーツ株式会社 | 860 |
| 5 | 株式会社スクウェア・エニックス | 825 |
| 6 | 株式会社コーエーテクモゲームス | 698 |
| 7 | 株式会社セガ | 683 |
| 8 | アイディアファクトリー株式会社 | 669 |
| 9 | 株式会社ディースリー・パブリッシャー | 597 |
Show code cell content
# ユニークな`pkgid`数が多い上位5のpublisherを取得
# `publisher`を基準にグループ化し、各グループのユニークな`pkgid`の数を計算
# その後、降順にソートして上位10の`pubs`をリスト形式で取得
pubs = (
df_pkg_pf.groupby("publisher")["pkgid"]
.nunique()
.sort_values(ascending=False)
.head()
.index.tolist()
)
# 上位5のpubsに紐づきデータを抽出
# 発売年(`year`)ごと、プラットフォーム名(`publisher`)ごとに
# ゲームパッケージID(`pkgid`)のユニークな数を集計、NaNは0に置換し、int型にキャスト
df_pkg_pf[df_pkg_pf["publisher"].isin(pubs)].pivot_table(
index="year", columns="publisher", values="pkgid", aggfunc="nunique"
).fillna(0).astype(int)
| publisher | エレクトロニック・アーツ株式会社 | 任天堂株式会社 | 株式会社カプコン | 株式会社ソニー・コンピュータエンタテインメント | 株式会社バンダイナムコゲームス |
|---|---|---|---|---|---|
| year | |||||
| 1983 | 0 | 7 | 0 | 0 | 0 |
| 1984 | 0 | 5 | 0 | 0 | 0 |
| 1985 | 0 | 4 | 0 | 0 | 0 |
| 1986 | 0 | 5 | 0 | 0 | 0 |
| 1987 | 0 | 3 | 0 | 0 | 0 |
| 1988 | 0 | 2 | 0 | 0 | 0 |
| 1989 | 0 | 6 | 0 | 0 | 0 |
| 1990 | 0 | 10 | 3 | 0 | 0 |
| 1991 | 0 | 6 | 1 | 0 | 0 |
| 1992 | 0 | 11 | 4 | 0 | 0 |
| 1993 | 0 | 11 | 4 | 0 | 0 |
| 1994 | 0 | 11 | 8 | 0 | 0 |
| 1995 | 0 | 11 | 14 | 1 | 0 |
| 1996 | 0 | 13 | 17 | 6 | 0 |
| 1997 | 0 | 11 | 17 | 7 | 2 |
| 1998 | 5 | 28 | 24 | 7 | 1 |
| 1999 | 0 | 57 | 19 | 21 | 0 |
| 2000 | 0 | 31 | 24 | 9 | 0 |
| 2001 | 1 | 23 | 36 | 34 | 1 |
| 2002 | 0 | 20 | 22 | 20 | 2 |
| 2003 | 32 | 18 | 49 | 18 | 0 |
| 2004 | 59 | 56 | 26 | 31 | 0 |
| 2005 | 49 | 37 | 33 | 37 | 0 |
| 2006 | 48 | 73 | 34 | 62 | 57 |
| 2007 | 60 | 66 | 58 | 93 | 86 |
| 2008 | 93 | 61 | 45 | 63 | 96 |
| 2009 | 89 | 125 | 51 | 80 | 152 |
| 2010 | 76 | 54 | 49 | 81 | 96 |
| 2011 | 44 | 52 | 68 | 50 | 132 |
| 2012 | 43 | 79 | 61 | 79 | 144 |
| 2013 | 42 | 128 | 74 | 61 | 207 |
| 2014 | 66 | 91 | 86 | 91 | 187 |
| 2015 | 39 | 113 | 85 | 59 | 53 |
| 2016 | 59 | 136 | 72 | 5 | 0 |
| 2017 | 55 | 60 | 0 | 0 | 0 |
| 2018 | 0 | 1 | 0 | 0 | 0 |
Show code cell content
# 上位5のpublisherについて、発売曜日ごとのゲームパッケージ数を集計
# 曜日(`weekday`)ごと、ゲーム販売会社名(`publisher`)ごとに
# ゲームパッケージID(`pkgid`)のユニークな数を集計、NaNは0に置換
df_pkg_pf[df_pkg_pf["publisher"].isin(pubs)].pivot_table(
index="weekday", columns="publisher", values="pkgid", aggfunc="nunique"
).fillna(0)
| publisher | エレクトロニック・アーツ株式会社 | 任天堂株式会社 | 株式会社カプコン | 株式会社ソニー・コンピュータエンタテインメント | 株式会社バンダイナムコゲームス |
|---|---|---|---|---|---|
| weekday | |||||
| 0 | 6.0 | 54.0 | 9.0 | 0.0 | 1.0 |
| 1 | 48.0 | 151.0 | 73.0 | 16.0 | 95.0 |
| 2 | 55.0 | 434.0 | 209.0 | 104.0 | 141.0 |
| 3 | 680.0 | 460.0 | 569.0 | 730.0 | 958.0 |
| 4 | 51.0 | 163.0 | 96.0 | 28.0 | 3.0 |
| 5 | 19.0 | 145.0 | 27.0 | 26.0 | 14.0 |
| 6 | 1.0 | 18.0 | 1.0 | 11.0 | 4.0 |
price列の深掘り#
Show code cell content
# 各発売年(`year`)ごとにゲームパッケージの価格(`price`)の基本統計量を計算
df_pkg_pf.groupby("year")["price"].describe()
| count | mean | std | min | 25% | 50% | 75% | max | |
|---|---|---|---|---|---|---|---|---|
| year | ||||||||
| 1982 | 12.0 | 8833.333333 | 5804.909103 | 3500.0 | 3500.00 | 6500.0 | 16500.0 | 16500.0 |
| 1983 | 11.0 | 3909.090909 | 784.161393 | 2500.0 | 3400.00 | 4500.0 | 4500.0 | 4500.0 |
| 1984 | 31.0 | 5116.129032 | 1195.295437 | 3500.0 | 4400.00 | 4500.0 | 6250.0 | 7200.0 |
| 1985 | 61.0 | 6009.836066 | 2241.777934 | 4300.0 | 4500.00 | 4900.0 | 6800.0 | 14800.0 |
| 1986 | 57.0 | 4931.578947 | 1516.075513 | 2500.0 | 4500.00 | 4900.0 | 5300.0 | 10000.0 |
| 1987 | 108.0 | 5540.555556 | 1828.933520 | 2000.0 | 4500.00 | 5500.0 | 6800.0 | 9800.0 |
| 1988 | 80.0 | 5547.000000 | 1101.231072 | 3200.0 | 4900.00 | 5500.0 | 5800.0 | 9800.0 |
| 1989 | 152.0 | 5727.480263 | 1284.464853 | 2600.0 | 5500.00 | 5900.0 | 6300.0 | 9800.0 |
| 1990 | 300.0 | 5584.476667 | 2031.466372 | 2600.0 | 3500.00 | 5900.0 | 6780.0 | 14800.0 |
| 1991 | 336.0 | 7015.708333 | 4032.813111 | 1000.0 | 3960.00 | 6500.0 | 8252.0 | 23800.0 |
| 1992 | 398.0 | 7497.690955 | 3590.501653 | 1500.0 | 4825.00 | 7586.5 | 8800.0 | 28000.0 |
| 1993 | 427.0 | 8327.093677 | 3340.675027 | 2900.0 | 6800.00 | 8800.0 | 9700.0 | 29800.0 |
| 1994 | 613.0 | 8471.101142 | 3627.019740 | 1980.0 | 6800.00 | 8800.0 | 9800.0 | 29800.0 |
| 1995 | 735.0 | 8297.306122 | 4079.354925 | 1280.0 | 5800.00 | 7800.0 | 9800.0 | 34800.0 |
| 1996 | 840.0 | 6729.544048 | 3678.101536 | 1280.0 | 5800.00 | 5800.0 | 6800.0 | 34000.0 |
| 1997 | 855.0 | 6072.762573 | 2971.631541 | 500.0 | 5800.00 | 5800.0 | 6800.0 | 36800.0 |
| 1998 | 988.0 | 5495.774291 | 3066.746656 | 500.0 | 3980.00 | 5800.0 | 5825.0 | 58000.0 |
| 1999 | 1165.0 | 4828.793133 | 2729.871216 | 500.0 | 2800.00 | 4800.0 | 5800.0 | 38000.0 |
| 2000 | 1232.0 | 4519.135552 | 2615.820313 | 500.0 | 2800.00 | 4200.0 | 5800.0 | 38000.0 |
| 2001 | 1067.0 | 4793.573571 | 2692.631026 | 398.0 | 2800.00 | 4800.0 | 6090.0 | 38900.0 |
| 2002 | 1159.0 | 5177.123382 | 3036.948767 | 498.0 | 2940.00 | 5040.0 | 6800.0 | 39800.0 |
| 2003 | 1065.0 | 5628.345540 | 3169.873266 | 1000.0 | 3800.00 | 5800.0 | 7140.0 | 39800.0 |
| 2004 | 1036.0 | 5776.046332 | 3563.713279 | 404.0 | 3654.00 | 5659.5 | 7140.0 | 39800.0 |
| 2005 | 1104.0 | 5497.354167 | 2455.662403 | 400.0 | 3487.50 | 5040.0 | 7140.0 | 26040.0 |
| 2006 | 1239.0 | 5081.142857 | 3194.186034 | 340.0 | 2940.00 | 5040.0 | 7140.0 | 44800.0 |
| 2007 | 1641.0 | 4244.517977 | 3358.101973 | 300.0 | 1554.00 | 3990.0 | 6090.0 | 49980.0 |
| 2008 | 1676.0 | 4535.547136 | 3899.966591 | 200.0 | 2079.00 | 4410.0 | 6279.0 | 49800.0 |
| 2009 | 1965.0 | 4012.208651 | 3713.353797 | 100.0 | 823.00 | 3800.0 | 6090.0 | 48980.0 |
| 2010 | 1921.0 | 3812.234253 | 3239.902939 | 200.0 | 800.00 | 3500.0 | 6090.0 | 39800.0 |
| 2011 | 1572.0 | 4398.479644 | 3437.800788 | 200.0 | 1321.00 | 4712.5 | 6090.0 | 37905.0 |
| 2012 | 1687.0 | 4825.491998 | 4103.191562 | 190.0 | 2376.00 | 4800.0 | 6280.0 | 39800.0 |
| 2013 | 1976.0 | 4750.717105 | 3540.089675 | 100.0 | 2480.00 | 4847.0 | 6612.0 | 40000.0 |
| 2014 | 2033.0 | 4770.133792 | 4093.907411 | 100.0 | 1543.00 | 5119.0 | 6800.0 | 49980.0 |
| 2015 | 1926.0 | 5183.372793 | 4228.746421 | 185.0 | 2517.75 | 5500.0 | 6800.0 | 49980.0 |
| 2016 | 1697.0 | 5002.194461 | 3545.231779 | 93.0 | 1944.00 | 5184.0 | 6990.0 | 35980.0 |
| 2017 | 1974.0 | 4935.767984 | 3598.236800 | 54.0 | 1503.00 | 4980.0 | 7000.0 | 30000.0 |
| 2018 | 9.0 | 9693.333333 | 7692.242846 | 3700.0 | 7600.00 | 7800.0 | 7980.0 | 29800.0 |
| 2019 | 1.0 | 2980.000000 | NaN | 2980.0 | 2980.00 | 2980.0 | 2980.0 | 2980.0 |
Show code cell content
# 各プラットフォーム(`pfname`)ごとに価格(`price`)の統計を取得
# 結果は平均価格でソート
df_pkg_pf[df_pkg_pf["pfid"].isin(pfids)].groupby(["pfname"])[
"price"
].describe().sort_values("mean")
| count | mean | std | min | 25% | 50% | 75% | max | |
|---|---|---|---|---|---|---|---|---|
| pfname | ||||||||
| プレイステーション | 3715.0 | 4665.390040 | 2253.040373 | 800.0 | 2800.0 | 5800.0 | 5800.0 | 58000.0 |
| プレイステーション・ポータブル | 3411.0 | 4822.775432 | 2867.958954 | 200.0 | 2800.0 | 5040.0 | 5980.0 | 36729.0 |
| プレイステーション3 | 2435.0 | 5803.462423 | 4075.340210 | 100.0 | 3000.0 | 6000.0 | 7429.0 | 49980.0 |
| プレイステーションVita | 2215.0 | 5808.051467 | 2895.232131 | 190.0 | 4600.0 | 5800.0 | 6800.0 | 38076.0 |
| プレイステーション2 | 4211.0 | 5888.962954 | 2759.501278 | 1500.0 | 3129.0 | 6800.0 | 7140.0 | 38900.0 |
Show code cell content
# 販売会社(publisher)について、各出版社ごとの価格(price)の基本統計量を計算
# 結果は平均価格でソート
df_pkg_pf[df_pkg_pf["publisher"].isin(pubs)].groupby("publisher")[
"price"
].describe().sort_values("mean")
| count | mean | std | min | 25% | 50% | 75% | max | |
|---|---|---|---|---|---|---|---|---|
| publisher | ||||||||
| 任天堂株式会社 | 1385.0 | 3428.166787 | 3734.275082 | 200.0 | 800.0 | 2800.0 | 4800.0 | 40824.0 |
| 株式会社ソニー・コンピュータエンタテインメント | 899.0 | 4460.625139 | 6017.885150 | 100.0 | 1500.0 | 3048.0 | 5747.5 | 49800.0 |
| 株式会社カプコン | 971.0 | 4659.969104 | 4591.441594 | 93.0 | 2090.0 | 3990.0 | 5800.0 | 48980.0 |
| 株式会社バンダイナムコゲームス | 1205.0 | 5268.454772 | 3757.199341 | 200.0 | 2800.0 | 5122.0 | 7120.0 | 39800.0 |
| エレクトロニック・アーツ株式会社 | 843.0 | 5630.930012 | 2862.258948 | 200.0 | 3129.0 | 6090.0 | 7300.0 | 39980.0 |