Описание проекта
Из открытых источников доступны исторические данные о продажах игр, оценки пользователей и экспертов, жанры и платформы (например, Xbox или PlayStation). Вам нужно выявить определяющие успешность игры закономерности. Это позволит интернет-магазину «Стримчик» сделать ставку на потенциально популярный продукт и спланировать рекламные кампании.
Перед вами данные до 2016 года. Представим, что сейчас декабрь 2016 г., и вы планируете кампанию на 2017-й. Нужно отработать принцип работы с данными. Неважно, прогнозируете ли вы продажи на 2017 год по данным 2016-го или же 2027-й — по данным 2026 года.
Описание данных
Name
— название игрыPlatform
— платформаYear_of_Release
— год выпускаGenre
— жанр игрыNA_sales
— продажи в Северной Америке (миллионы проданных копий)EU_sales
— продажи в Европе (миллионы проданных копий)JP_sales
— продажи в Японии (миллионы проданных копий)Other_sales
— продажи в других странах (миллионы проданных копий)Critic_Score
— оценка критиков (максимум 100)User_Score
— оценка пользователей (максимум 10)Rating
— рейтинг от организации ESRB (англ. Entertainment Software Rating Board). Эта ассоциация определяет рейтинг компьютерных игр и присваивает им подходящую возрастную категорию.
Данные за 2016 год могут быть неполными.
Оглавление
- 1 Шаг 1. Открытие файла с данными и изучение общей информации
- 2 Шаг 2. Подготовка данных
- 3 Шаг 3. Исследовательский анализ данных
- 3.1 Количество игр, выпускаемых в разные годы
- 3.2 Изменения продаж по платформам.
- 3.3 Выбор данных за актуальный период
- 3.4 Какие платформы лидируют по продажам, растут или падают?
- 3.5 График «ящик с усами» по глобальным продажам игр в разбивке по платформам
- 3.6 Влияние отзывов критиков и пользователей на продажи отдельно взятых платформ всех вместе
- 3.7 Общее распределение игр по жанрам
- 3.8 Итоги исследовательского анализа данных
- 4 Шаг 4. Портрет пользователя каждого региона
- 5 Шаг 5. Проверка гипотез
- 6 Шаг 6. Общий вывод
Шаг 1. Открытие файла с данными и изучение общей информации¶
# Датафреймы
import pandas as pd
# Математика для массивов
import numpy as np
# Факториалы
from math import factorial
# Статистика
from scipy import stats as st
# Графика
import matplotlib
%matplotlib inline
from matplotlib import pyplot as plt
from matplotlib import rcParams, rcParamsDefault
import seaborn as sns
# Отображение всех столбцов таблицы
pd.set_option('display.max_columns', None)
# Обязательно для нормального отображения графиков plt
rcParams['figure.figsize'] = 10, 6
%config InlineBackend.figure_format = 'svg'
# Дополнительно и не обязательно для декорирования графиков
factor = .8
default_dpi = rcParamsDefault['figure.dpi']
rcParams['figure.dpi'] = default_dpi * factor
try:
games = pd.read_csv('/datasets/games.csv')
except:
games = pd.read_csv('datasets/games.csv')
games.head()
Name | Platform | Year_of_Release | Genre | NA_sales | EU_sales | JP_sales | Other_sales | Critic_Score | User_Score | Rating | |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | Wii Sports | Wii | 2006.0 | Sports | 41.36 | 28.96 | 3.77 | 8.45 | 76.0 | 8 | E |
1 | Super Mario Bros. | NES | 1985.0 | Platform | 29.08 | 3.58 | 6.81 | 0.77 | NaN | NaN | NaN |
2 | Mario Kart Wii | Wii | 2008.0 | Racing | 15.68 | 12.76 | 3.79 | 3.29 | 82.0 | 8.3 | E |
3 | Wii Sports Resort | Wii | 2009.0 | Sports | 15.61 | 10.93 | 3.28 | 2.95 | 80.0 | 8 | E |
4 | Pokemon Red/Pokemon Blue | GB | 1996.0 | Role-Playing | 11.27 | 8.89 | 10.22 | 1.00 | NaN | NaN | NaN |
Названия столбцов выполнены не в «змеином стиле». В данных наблюдаются пропуски.
games.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 16715 entries, 0 to 16714 Data columns (total 11 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Name 16713 non-null object 1 Platform 16715 non-null object 2 Year_of_Release 16446 non-null float64 3 Genre 16713 non-null object 4 NA_sales 16715 non-null float64 5 EU_sales 16715 non-null float64 6 JP_sales 16715 non-null float64 7 Other_sales 16715 non-null float64 8 Critic_Score 8137 non-null float64 9 User_Score 10014 non-null object 10 Rating 9949 non-null object dtypes: float64(6), object(5) memory usage: 1.4+ MB
В датафрейме всего 11 столбцов и 16715 строк. 7 столбцов содержат пропуски. Вес датафрейма 1.4 Мб. Возможно, использованы неоптимальные типы данных в столбцах.
games.describe()
Year_of_Release | NA_sales | EU_sales | JP_sales | Other_sales | Critic_Score | |
---|---|---|---|---|---|---|
count | 16446.000000 | 16715.000000 | 16715.000000 | 16715.000000 | 16715.000000 | 8137.000000 |
mean | 2006.484616 | 0.263377 | 0.145060 | 0.077617 | 0.047342 | 68.967679 |
std | 5.877050 | 0.813604 | 0.503339 | 0.308853 | 0.186731 | 13.938165 |
min | 1980.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 13.000000 |
25% | 2003.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 60.000000 |
50% | 2007.000000 | 0.080000 | 0.020000 | 0.000000 | 0.010000 | 71.000000 |
75% | 2010.000000 | 0.240000 | 0.110000 | 0.040000 | 0.030000 | 79.000000 |
max | 2016.000000 | 41.360000 | 28.960000 | 10.220000 | 10.570000 | 98.000000 |
Можно изменить типы данных столбцов:
Year_of_Release
наuint16
, т.к. года являются четырёхзначными натуральными числами;NA_sales
,EU_sales
,JP_sales
,Other_sales
,Critic_Score
иUser_Score
наfloat16
, т.к. в этих столбцах использованы рациональные числа небольшой размерности.
Анализ отдельных столбцов датафрейма¶
Одновременные дубликаты в Name
, Platform
и Year_of_Release
¶
# Поиск дубликатов по ключевым столбцам
# с названием игры, платформы и годом выпуска
games.loc[games.duplicated(['Name', 'Platform', 'Year_of_Release'])]
Name | Platform | Year_of_Release | Genre | NA_sales | EU_sales | JP_sales | Other_sales | Critic_Score | User_Score | Rating | |
---|---|---|---|---|---|---|---|---|---|---|---|
14244 | NaN | GEN | 1993.0 | NaN | 0.0 | 0.00 | 0.03 | 0.0 | NaN | NaN | NaN |
16230 | Madden NFL 13 | PS3 | 2012.0 | Sports | 0.0 | 0.01 | 0.00 | 0.0 | 83.0 | 5.5 | E |
Найдено два дубликата по столбцам с названием игры, платформы и годом выпуска. Требуется проверка повторяющихся строк.
games.loc[
((games['Name'].isna()) &
(games['Platform'] == 'GEN') &
(games['Year_of_Release'] == 1993)) |
((games['Name'] == 'Madden NFL 13') &
(games['Platform'] == 'PS3') &
(games['Year_of_Release'] == 2012))
]
Name | Platform | Year_of_Release | Genre | NA_sales | EU_sales | JP_sales | Other_sales | Critic_Score | User_Score | Rating | |
---|---|---|---|---|---|---|---|---|---|---|---|
604 | Madden NFL 13 | PS3 | 2012.0 | Sports | 2.11 | 0.22 | 0.00 | 0.23 | 83.0 | 5.5 | E |
659 | NaN | GEN | 1993.0 | NaN | 1.78 | 0.53 | 0.00 | 0.08 | NaN | NaN | NaN |
14244 | NaN | GEN | 1993.0 | NaN | 0.00 | 0.00 | 0.03 | 0.00 | NaN | NaN | NaN |
16230 | Madden NFL 13 | PS3 | 2012.0 | Sports | 0.00 | 0.01 | 0.00 | 0.00 | 83.0 | 5.5 | E |
Строки с пропуском в названии игры требуется удалить, т.к. во многих аттрибутах этих объектов пропуски. Строки с игрой Madden NFL 13
, выпущенной в 2012 году на платформе PS3
желательно объеденить.
Пропуски в ‘Rating’ с рейтингом ESRB¶
Для анализа столбца с рейтингом ESRB (Entertainment Software Rating Board) требуется выявиться существующие позиции этого рейтинга. (https://www.ph4.ru/pal_picto.php?p=ratings-esrb&titl=ESRB, 2023):
- EC — Early childhood (Для детей младшего возраста). Игра подходит для детей от 3 лет и старше и не содержит материалов, которые родители могли бы счесть неподходящими. Продукты, получившие данный рейтинг, изначально разрабатываются для детей и обычно представляют собой развивающие игры. Некоторые усложнённые развивающие игры могут иметь рейтинг Everyone».
- E — Everyone (Для всех). Содержание вполне подходит для возрастной категории от 6 лет и старше
- E10+ — Everyone 10 and older (Для всех старше 10 лет). Возрастная категория — от 10 лет. Проекты с данным рейтингом могут содержать немного больше мультипликационного или мягкого насилия, или несколько откровенные сцены или минимальное количество крови. Рейтинг был принят ESRB 2 марта 2005 года. Первой игрой, которая получила данный рейтинг, стала Donkey Kong: Jungle Beat.
- T — Teen (Подросткам). Игра подходит для лиц от 13 лет и старше. Проекты из данной категории могут содержать насилие, непристойные сцены, грубый юмор, в меру откровенное сексуальное содержимое, кровь или нечастое использование ненормативной лексики.
- M — Mature (От 17 лет). Материалы игры не подходят для подростков младше 17 лет. Проекты с данным рейтингом могут содержать достаточно жестокое насилие, большое количество крови с расчленением, непристойные сексуальные сцены или грубую ненормативную лексику, нежелательную для младшей аудитории. Некоторые торговые сети не продают игры с таким рейтингом несовершеннолетним без согласия родителей.
- AO — Adults Only 18+ (Только для взрослых). Содержание игры только для взрослых. Продукты из данной категории могут содержать длительные сцены жестокого насилия и/или очень откровенное сексуальное содержимое, а также сцены с обнажением. В 2006-м году данный рейтинг получили 22 продукта, большинство из которых предназначены для персональных компьютеров под управлением Windows и Apple Macintosh. Рейтинг Только для взрослых» является предметом
- RP — Rating Pending (Рейтинг ожидается). Продукт был отправлен в ESRB и ожидает присвоения рейтинга. Данный логотип используется только на рекламных презентациях и в демо-версиях игр до официального релиза.
- K-A — Kids to Adults (Для детей и взрослых). Содержание игры вполне подходит для возрастной категории от 6 лет и старше. Такие игры подходят для всех возрастов. Они могут содержать минимальное насилие или немного грубый разговорный язык. Этот рейтинг был заменён на Everyone.
Рейтинг ESRB (Википедия, 2023):
- «EC» («Early childhood») — «Для детей младшего возраста»: Игра подходит для детей от 3 лет и не содержит материалов, которые родители могли бы счесть неподходящими. Продукты, получившие данный рейтинг, изначально разрабатываются для детей и обычно представляют собой развивающие игры.
- «E» («Everyone») — «Для всех»: Содержание вполне подходит для всех возрастов. Такие игры могут понравиться и взрослым. Игры с этим рейтингом могут содержать минимальное насилие, в основном «мультяшного» характера. Первоначально «K-A» («Kids to Adults»).
- «E10+» («Everyone 10 and older») — «Для всех от 10 лет и старше»: Проекты с данным рейтингом могут содержать больше мультипликационного или мягкого насилия, или несколько откровенные сцены, или минимальное количество крови. Рейтинг был принят ESRB 2 марта 2005 года.
- «T» («Teen») — «Подросткам»: Игра подходит для лиц от 13 лет. Проекты из данной категории могут содержать насилие, непристойные сцены, грубый юмор, в меру откровенное сексуальное содержимое, кровь или нечастое использование ненормативной лексики.
- «M» («Mature») — «Для взрослых»: Материалы игры не подходят для лиц младше 17 лет. Проекты с данным рейтингом могут содержать жестокое насилие, большое количество крови с расчленением, непристойные сексуальные сцены или грубую ненормативную лексику.
- «AO» («Adults Only 18+») — «Только для взрослых»: Содержание игры только для взрослых старше 18 лет. Продукты из данной категории могут содержать длительные сцены жестокого насилия и/или очень откровенное сексуальное содержимое.
- «RP» («Rating Pending») — «Рейтинг ожидается»: Продукт был отправлен в ESRB и ожидает присвоения рейтинга. Данный логотип используется только на рекламных презентациях и в демо-версиях игр до официальной даты выпуска в продажу.
- «RP 17+» («Rating Pending») — «Рейтинг ожидается — примерно 17+»: Продукт отправлен ESRB на оценку, но примерное содержание близко к рейтингу «M». Данная маркировка была введена с 2021 г. и распространяется на демо или презентационный вариант.
print('Позиции рейтинга ESRB в датафрейме:')
print(games['Rating'].unique())
Позиции рейтинга ESRB в датафрейме: ['E' nan 'M' 'T' 'E10+' 'K-A' 'AO' 'EC' 'RP']
В рейтингах присутствуют пропуски и устаревшее значение K-A
, которое для актуализации требуется заменить на E
. Также есть пропуски, которые, возможно, относятся к RP
(Rating Pending — Рейтинг ожидается).
print('Количество значений "K-A" в столбце с рейтингом:', games.loc[games['Rating'] == 'K-A', 'Rating'].count())
Количество значений "K-A" в столбце с рейтингом: 3
print('Количество пропусков в столбце с рейтингом:', games['Rating'].isna().sum())
print(f"Эти пропуски составляют {round((games['Rating'].isna().sum() / (games['Rating'].count() + games['Rating'].isna().sum())) * 100, 2)}% от всего количества значений с рейтингом")
print('Примеры строк с пропусками в столбце с рейтингом:')
games.loc[games['Rating'].isna()].head(10)
Количество пропусков в столбце с рейтингом: 6766 Эти пропуски составляют 40.48% от всего количества значений с рейтингом Примеры строк с пропусками в столбце с рейтингом:
Name | Platform | Year_of_Release | Genre | NA_sales | EU_sales | JP_sales | Other_sales | Critic_Score | User_Score | Rating | |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | Super Mario Bros. | NES | 1985.0 | Platform | 29.08 | 3.58 | 6.81 | 0.77 | NaN | NaN | NaN |
4 | Pokemon Red/Pokemon Blue | GB | 1996.0 | Role-Playing | 11.27 | 8.89 | 10.22 | 1.00 | NaN | NaN | NaN |
5 | Tetris | GB | 1989.0 | Puzzle | 23.20 | 2.26 | 4.22 | 0.58 | NaN | NaN | NaN |
9 | Duck Hunt | NES | 1984.0 | Shooter | 26.93 | 0.63 | 0.28 | 0.47 | NaN | NaN | NaN |
10 | Nintendogs | DS | 2005.0 | Simulation | 9.05 | 10.95 | 1.93 | 2.74 | NaN | NaN | NaN |
12 | Pokemon Gold/Pokemon Silver | GB | 1999.0 | Role-Playing | 9.00 | 6.18 | 7.20 | 0.71 | NaN | NaN | NaN |
18 | Super Mario World | SNES | 1990.0 | Platform | 12.78 | 3.75 | 3.54 | 0.55 | NaN | NaN | NaN |
20 | Pokemon Diamond/Pokemon Pearl | DS | 2006.0 | Role-Playing | 6.38 | 4.46 | 6.04 | 1.36 | NaN | NaN | NaN |
21 | Super Mario Land | GB | 1989.0 | Platform | 10.83 | 2.71 | 4.18 | 0.42 | NaN | NaN | NaN |
22 | Super Mario Bros. 3 | NES | 1988.0 | Platform | 9.54 | 3.44 | 3.84 | 0.46 | NaN | NaN | NaN |
Всего наблюдается 6766 пропусков в столбце Rating
, что составляет 40.48% от всего количества значений. Вывод части датафрейма показал, что пропуски в столбце Critic_Score
иногда совпадают с пропусками в столбцах Critic_Score
и User_Score
.
# Датафрейс содержащий одновременные пропуски
# в столбцах 'Rating', 'Critic_Score' и 'User_Score'
rating_isna = games.loc[
(games['Rating'].isna()) &
(games['Critic_Score'].isna()) &
(games['User_Score'].isna())
]
rating_isna.head()
Name | Platform | Year_of_Release | Genre | NA_sales | EU_sales | JP_sales | Other_sales | Critic_Score | User_Score | Rating | |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | Super Mario Bros. | NES | 1985.0 | Platform | 29.08 | 3.58 | 6.81 | 0.77 | NaN | NaN | NaN |
4 | Pokemon Red/Pokemon Blue | GB | 1996.0 | Role-Playing | 11.27 | 8.89 | 10.22 | 1.00 | NaN | NaN | NaN |
5 | Tetris | GB | 1989.0 | Puzzle | 23.20 | 2.26 | 4.22 | 0.58 | NaN | NaN | NaN |
9 | Duck Hunt | NES | 1984.0 | Shooter | 26.93 | 0.63 | 0.28 | 0.47 | NaN | NaN | NaN |
10 | Nintendogs | DS | 2005.0 | Simulation | 9.05 | 10.95 | 1.93 | 2.74 | NaN | NaN | NaN |
print('Количество пропусков с стобцах с рейтингом и оценками:')
print(rating_isna.isna().sum())
Количество пропусков с стобцах с рейтингом и оценками: Name 2 Platform 0 Year_of_Release 85 Genre 2 NA_sales 0 EU_sales 0 JP_sales 0 Other_sales 0 Critic_Score 6621 User_Score 6621 Rating 6621 dtype: int64
В 85 строках пропуски в столбцах Rating
, Critic_Score
и User_Score
совпадают с пропусками в столбце Year_of_Release
. В двух строках из них они совпадают с пропусками в Name
.
print("Уникальные значения различных столбцов в строках с пропусками в 'Rating', 'Critic_Score' и 'User_Score'")
print()
print(f"Столбец 'Name' ({len(rating_isna['Name'].unique())} уникальных значений из {len(games['Name'].unique())}):")
print(rating_isna['Name'].unique())
print()
print(f"Столбец 'Platform' ({len(rating_isna['Platform'].unique())} уникальных значений из {len(games['Platform'].unique())}):")
print(rating_isna['Platform'].unique())
print()
print(f"Столбец 'Year_of_Release' ({len(rating_isna['Year_of_Release'].unique())} уникальных значений из {len(games['Year_of_Release'].unique())}):")
print(rating_isna['Year_of_Release'].unique())
print()
print(f"Столбец 'Genre' ({len(rating_isna['Genre'].unique())} уникальных значений из {len(games['Genre'].unique())}):")
print(rating_isna['Genre'].unique())
Уникальные значения различных столбцов в строках с пропусками в 'Rating', 'Critic_Score' и 'User_Score' Столбец 'Name' (5732 уникальных значений из 11560): ['Super Mario Bros.' 'Pokemon Red/Pokemon Blue' 'Tetris' ... 'Woody Woodpecker in Crazy Castle 5' 'LMA Manager 2007' 'Haitaka no Psychedelica'] Столбец 'Platform' (31 уникальных значений из 31): ['NES' 'GB' 'DS' 'SNES' 'GBA' 'PS4' '3DS' 'N64' 'X360' 'Wii' '2600' 'PS' 'XOne' 'GC' 'PS3' 'GEN' 'PC' 'PSP' 'WiiU' 'PS2' 'XB' 'DC' 'PSV' 'SAT' 'SCD' 'WS' 'NG' 'TG16' '3DO' 'GG' 'PCFX'] Столбец 'Year_of_Release' (38 уникальных значений из 38): [1985. 1996. 1989. 1984. 2005. 1999. 1990. 2006. 1988. 2002. 2010. 1998. 2015. 2013. 2009. 2014. 1992. 1993. 2004. 1994. 1997. 2012. 2007. 1982. 2016. 2003. 2011. 1986. 2000. 2001. 1995. 2008. 1991. 1981. 1987. 1980. 1983. nan] Столбец 'Genre' (13 уникальных значений из 13): ['Platform' 'Role-Playing' 'Puzzle' 'Shooter' 'Simulation' 'Action' 'Adventure' 'Racing' 'Misc' 'Sports' 'Fighting' 'Strategy' nan]
Не обнаружено какой-либо зависимости пропусков в Rating
, Critic_Score
и User_Score
от значений в столбцах Name
, Platform
, Year_of_Release
или Genre
. Согласно мнению пользователей (не экспертов) ресурса gaming.stackexchange.com отсутствие рейтинга может свидетельствовать о нежелании владельцев рейтинга ESRB устанавливать метки со своим рейтингом на играх, которые имеют очень разнообразное содержание для разных возрастных групп, которое зависит от определенных условий использования игры (https://gaming.stackexchange.com/questions/27940/why-doesnt-esrb-rate-online-games, 2023). Строки с подобными пропусками можно оставить в датафрейме для дальнейшего анализа. Отсутствие данных в них — это информация о том, что ни рейтинговое агентство ESRB, ни эксперты, ни пользователи, не захотели или не смогли охарактеризовать эти игры.
print("Медианные значения продаж в разных регионах при пропусках в 'Rating', 'Critic_Score', 'User_Score' и 'Year_of_Release'")
print()
print('Продажи в Северной Америке:', rating_isna.loc[rating_isna['Year_of_Release'].isna(), 'NA_sales'].median())
print('Продажи в Европе:', rating_isna.loc[rating_isna['Year_of_Release'].isna(), 'EU_sales'].median())
print('Продажи в Японии:', rating_isna.loc[rating_isna['Year_of_Release'].isna(), 'JP_sales'].median())
print('Продажи в других регионах:', rating_isna.loc[rating_isna['Year_of_Release'].isna(), 'Other_sales'].median())
Медианные значения продаж в разных регионах при пропусках в 'Rating', 'Critic_Score', 'User_Score' и 'Year_of_Release' Продажи в Северной Америке: 0.01 Продажи в Европе: 0.0 Продажи в Японии: 0.0 Продажи в других регионах: 0.0
В тех же случаях, где пропуски в Rating
, Critic_Score
и User_Score
совпадают с пропусками в Year_of_Release
, это может означать, что игра еще не выпущена в продажу. Это подтверждается нулевыми медианными продажами почти во всех регионах. Наличие медианных продаж в Северной Америке в размере 10 тыс. копий игр может означать их продажу с целью изучения рынка. Строкам с подобными данными можно дать рейтинг no_ESRB
, что даст возможность анализировать эти строки. Либо, удалить их из датафрейма, т.к. можно оспорить их полезность для дальнейшего анализа.
Итоги предварительного анализа данных¶
В датафрейме всего 11 столбцов и 16715 строк. 7 столбцов содержат пропуски. Вес датафрейма 1.4 Мб. В данных наблюдаются пропуски. Строки с пропуском в названии игры требуется удалить, т.к. во многих аттрибутах этих объектов пропуски. Строки с игрой Madden NFL 13
, выпущенной в 2012 году на платформе PS3
желательно объеденить, т.к. данные в них частично дополняют друг друга. Названия столбцов в датафрейме выполнены не в «змеином» стиле. Можно изменить типы данных столбцов:
Year_of_Release
наuint16
, т.к. года являются четырёхзначными натуральными числами;NA_sales
,EU_sales
,JP_sales
,Other_sales
,Critic_Score
иUser_Score
наfloat16
, т.к. в этих столбцах использованы рациональные числа небольшой размерности.
О столбце ‘Rating’
В рейтингах присутствуют пропуски и устаревшее значение K-A
, которое для актуализации требуется заменить на E
.
Всего наблюдается 6766 пропусков в столбце Rating
, что составляет 40.48% от всего количества значений. Вывод части датафрейма показал, что пропуски в столбце Critic_Score
иногда совпадают с пропусками в столбцах Critic_Score
и User_Score
.
Не обнаружено какой-либо зависимости пропусков в Rating
, Critic_Score
и User_Score
от значений в столбцах Name
, Platform
, Year_of_Release
или Genre
. Согласно мнению пользователей (не экспертов) ресурса gaming.stackexchange.com отсутствие рейтинга может свидетельствовать о нежелании владельцев рейтинга ESRB устанавливать метки со своим рейтингом на играх, которые имеют очень разнообразное содержание для разных возрастных групп, которое зависит от определенных условий использования игры (https://gaming.stackexchange.com/questions/27940/why-doesnt-esrb-rate-online-games, 2023). Строки с подобными пропусками можно оставить в датафрейме для дальнейшего анализа. Отсутствие данных в них — это информация о том, что ни рейтинговое агентство ESRB, ни эксперты, ни пользователи, не захотели или не смогли охарактеризовать эти игры.
В тех же случаях, где пропуски в Rating
, Critic_Score
и User_Score
совпадают с пропусками в Year_of_Release
, это может означать, что игра еще не выпущена в продажу. Это подтверждается нулевыми медианными продажами почти во всех регионах. Наличие медианных продаж в Северной Америке в размере 10 тыс. копий игр может означать их продажу с целью изучения рынка. Строкам с подобными данными можно дать рейтинг no_ESRB
, что даст возможность анализировать эти строки. Либо, удалить их из датафрейма, т.к. можно оспорить их полезность для дальнейшего анализа.
Шаг 2. Подготовка данных¶
Замените названия столбцов (приведите к нижнему регистру)¶
games.columns = games.columns.str.lower()
games.head()
name | platform | year_of_release | genre | na_sales | eu_sales | jp_sales | other_sales | critic_score | user_score | rating | |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | Wii Sports | Wii | 2006.0 | Sports | 41.36 | 28.96 | 3.77 | 8.45 | 76.0 | 8 | E |
1 | Super Mario Bros. | NES | 1985.0 | Platform | 29.08 | 3.58 | 6.81 | 0.77 | NaN | NaN | NaN |
2 | Mario Kart Wii | Wii | 2008.0 | Racing | 15.68 | 12.76 | 3.79 | 3.29 | 82.0 | 8.3 | E |
3 | Wii Sports Resort | Wii | 2009.0 | Sports | 15.61 | 10.93 | 3.28 | 2.95 | 80.0 | 8 | E |
4 | Pokemon Red/Pokemon Blue | GB | 1996.0 | Role-Playing | 11.27 | 8.89 | 10.22 | 1.00 | NaN | NaN | NaN |
Все названия столбцов привередны к нижнему регистру для соответствия «змеиному стилю».
Обработка пропусков¶
games['year_of_release'].unique()
array([2006., 1985., 2008., 2009., 1996., 1989., 1984., 2005., 1999., 2007., 2010., 2013., 2004., 1990., 1988., 2002., 2001., 2011., 1998., 2015., 2012., 2014., 1992., 1997., 1993., 1994., 1982., 2016., 2003., 1986., 2000., nan, 1995., 1991., 1981., 1987., 1980., 1983.])
В year_of_release
есть пропуски nan
, которые вызовут ошибку при конвертации в uint16
. Также строки с nan
в year_of_release
неинформативны для анализа. В том числе, это связано с тем, пропуски в столбце year_of_release
одновременно совпадают со строками, содеражщими пропуски в rating
, critic_score
и user_score
, в которых, вероятнее всего, содержаться данные об играх, которые еще не поступили в полномасштабную продражу. Подобные данные не требуются для дальнейшего анализа.
(games['year_of_release'].isna().count() - games['year_of_release'].dropna().count()) / games['year_of_release'].isna().count()
0.01609332934489979
Если удалить строки с пропусками в year_of_release
, то будет потерено всего 1.61% строк с данными. Это не является кричтиным для анализа и потому, эти строки будут удалены.
games = games.dropna(subset=['year_of_release'])
print(games['year_of_release'].unique())
print()
print(games.info())
[2006. 1985. 2008. 2009. 1996. 1989. 1984. 2005. 1999. 2007. 2010. 2013. 2004. 1990. 1988. 2002. 2001. 2011. 1998. 2015. 2012. 2014. 1992. 1997. 1993. 1994. 1982. 2016. 2003. 1986. 2000. 1995. 1991. 1981. 1987. 1980. 1983.] <class 'pandas.core.frame.DataFrame'> Int64Index: 16446 entries, 0 to 16714 Data columns (total 11 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 name 16444 non-null object 1 platform 16446 non-null object 2 year_of_release 16446 non-null float64 3 genre 16444 non-null object 4 na_sales 16446 non-null float64 5 eu_sales 16446 non-null float64 6 jp_sales 16446 non-null float64 7 other_sales 16446 non-null float64 8 critic_score 7983 non-null float64 9 user_score 9839 non-null object 10 rating 9768 non-null object dtypes: float64(6), object(5) memory usage: 1.5+ MB None
В столбце year_of_release
после удаления пропусков остались только информативные строки с указанием года релиза игр.
games['user_score'].unique()
array(['8', nan, '8.3', '8.5', '6.6', '8.4', '8.6', '7.7', '6.3', '7.4', '8.2', '9', '7.9', '8.1', '8.7', '7.1', '3.4', '5.3', '4.8', '3.2', '8.9', '6.4', '7.8', '7.5', '2.6', '7.2', '9.2', '7', '7.3', '4.3', '7.6', '5.7', '5', '9.1', '6.5', 'tbd', '8.8', '6.9', '9.4', '6.8', '6.1', '6.7', '5.4', '4', '4.9', '4.5', '9.3', '6.2', '4.2', '6', '3.7', '4.1', '5.8', '5.6', '5.5', '4.4', '4.6', '5.9', '3.9', '3.1', '2.9', '5.2', '3.3', '4.7', '5.1', '3.5', '2.5', '1.9', '3', '2.7', '2.2', '2', '9.5', '2.1', '3.6', '2.8', '1.8', '3.8', '0', '1.6', '9.6', '2.4', '1.7', '1.1', '0.3', '1.5', '0.7', '1.2', '2.3', '0.5', '1.3', '0.2', '0.6', '1.4', '0.9', '1', '9.7'], dtype=object)
В столбце user_score
есть значение tbd
, которое вызовет ошибку при конвертации в float16
.
# Замена 'tbd' на 'np.nan'
# для конвертации столбца в 'float16'
games['user_score'] = pd.to_numeric(
games['user_score'].replace('tbd', np.nan),
downcast='float'
)
games.head()
name | platform | year_of_release | genre | na_sales | eu_sales | jp_sales | other_sales | critic_score | user_score | rating | |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | Wii Sports | Wii | 2006.0 | Sports | 41.36 | 28.96 | 3.77 | 8.45 | 76.0 | 8.0 | E |
1 | Super Mario Bros. | NES | 1985.0 | Platform | 29.08 | 3.58 | 6.81 | 0.77 | NaN | NaN | NaN |
2 | Mario Kart Wii | Wii | 2008.0 | Racing | 15.68 | 12.76 | 3.79 | 3.29 | 82.0 | 8.3 | E |
3 | Wii Sports Resort | Wii | 2009.0 | Sports | 15.61 | 10.93 | 3.28 | 2.95 | 80.0 | 8.0 | E |
4 | Pokemon Red/Pokemon Blue | GB | 1996.0 | Role-Playing | 11.27 | 8.89 | 10.22 | 1.00 | NaN | NaN | NaN |
После обработки пропусков данные отображаются корректно.
# Удаление пропусков в столбце 'name'
games = games.dropna(subset=['name'])
games.info()
<class 'pandas.core.frame.DataFrame'> Int64Index: 16444 entries, 0 to 16714 Data columns (total 11 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 name 16444 non-null object 1 platform 16444 non-null object 2 year_of_release 16444 non-null float64 3 genre 16444 non-null object 4 na_sales 16444 non-null float64 5 eu_sales 16444 non-null float64 6 jp_sales 16444 non-null float64 7 other_sales 16444 non-null float64 8 critic_score 7983 non-null float64 9 user_score 7463 non-null float32 10 rating 9768 non-null object dtypes: float32(1), float64(6), object(4) memory usage: 1.4+ MB
После удаления пропусков сравнялось количество объектов без пропусков в основных аттрибутах.
# Пропущенные рейтинги заменяются на
# рейтинг RP (Rating Pending - Рейтинг ожидается)
games['rating'] = games['rating'].fillna('no_ESRB')
games.loc[games['rating'] == 'RP'].info()
<class 'pandas.core.frame.DataFrame'> Int64Index: 1 entries, 14270 to 14270 Data columns (total 11 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 name 1 non-null object 1 platform 1 non-null object 2 year_of_release 1 non-null float64 3 genre 1 non-null object 4 na_sales 1 non-null float64 5 eu_sales 1 non-null float64 6 jp_sales 1 non-null float64 7 other_sales 1 non-null float64 8 critic_score 1 non-null float64 9 user_score 1 non-null float32 10 rating 1 non-null object dtypes: float32(1), float64(6), object(4) memory usage: 92.0+ bytes
Пропущенные рейтинги заменены на значение no_ESRB
. Данная «заглушка» для пропусков нужна для анализа строк с этим рейтингом.
Результаты удаления пропусков
В датасете заменены или удалены критичные пропуски в данных, которые не позволили бы конвертировать столбцы в более приемлемые типы данных, а также не нужны были при дальнейшем анализе. Так, в year_of_release
пропуски nan
были удалены, что позволило избавиться от строк с данными об играх, которые еще не поступили в полномасштабную продажу, а в user_score
значения tbd
заменены на np.nan
. Также удалены объекты с пропусками в аттрибуте name
.
Пропущенные рейтинги заменены на рейтинг RP (Rating Pending — Рейтинг ожидается). Исходим из того, что не классифицированная по рейтингу игра и ожидающая рейтинга — это одно и тоже.
В остальных столбцах пропуски не изменены для корректного общего представления о данных при расчётах. В каждом отдельном случае можно исключить из расчётов строки с пропусками в столбцах, участвующих в расчётах.
Обработка строк с неявными дубликатами¶
# Просмотр строк с неявными дубликатами,
# выявленными при первичном анализе данных
games.loc[
((games['name'] == 'Madden NFL 13') &
(games['platform'] == 'PS3') &
(games['year_of_release'] == 2012))
]
name | platform | year_of_release | genre | na_sales | eu_sales | jp_sales | other_sales | critic_score | user_score | rating | |
---|---|---|---|---|---|---|---|---|---|---|---|
604 | Madden NFL 13 | PS3 | 2012.0 | Sports | 2.11 | 0.22 | 0.0 | 0.23 | 83.0 | 5.5 | E |
16230 | Madden NFL 13 | PS3 | 2012.0 | Sports | 0.00 | 0.01 | 0.0 | 0.00 | 83.0 | 5.5 | E |
Строку 16230 с неявным дубликатом удалять нельзя, т.к. она содержит данные о продаже в Европе. Для объединения данных строк с неявными дубликатами требуется значение eu_sales
из строки 16230 прибавить к значению eu_sales
в строке 604. После этого строку 16230 требуется удалить.
# Сложение значений 'eu_sales' в строках с неявными дубликатами
#games.loc[games.index == 604, 'eu_sales'] += games.loc[games.index == 16230, 'eu_sales']
games.loc[games.index == 604, 'eu_sales'].add(games.loc[games.index == 16230, 'eu_sales'])
#games.loc[games.index == 604, 'eu_sales'] = games.loc[games.index == 604, 'eu_sales'] + games.loc[games.index == 16230, 'eu_sales']
# Удаление строки дубликата
games = games.loc[games.index != 16230]
# Проверка наличия дубликата
games.loc[
(games['name'] == 'Madden NFL 13') &
(games['platform'] == 'PS3') &
(games['year_of_release'] == 2012)
]
name | platform | year_of_release | genre | na_sales | eu_sales | jp_sales | other_sales | critic_score | user_score | rating | |
---|---|---|---|---|---|---|---|---|---|---|---|
604 | Madden NFL 13 | PS3 | 2012.0 | Sports | 2.11 | 0.22 | 0.0 | 0.23 | 83.0 | 5.5 | E |
Неявные дубликаты строк с игрой Madden NFL 13
на платформе PS3
, выпущенной в 2012 году, обработаны путем сложения данных о продажах в Европе и удаления второй повторяющейся строки.
Далее будут обработаны рейтинги со значениями K-A
и E
.
# Проверка количества значений 'E' в столбце 'rating'
print('Изначальное количество значений "E" в столбце "rating":', games.loc[games['rating'] == 'E', 'rating'].count())
# Замена устаревших значений 'K-A' на 'E' в столбце 'rating'
games.loc[games['rating'] == 'K-A', 'rating'] = 'E'
# Повторная проверка количества значений 'E' в столбце 'rating'
print('Количество значений "E" в столбце "rating" после замены "K-A":', games.loc[games['rating'] == 'E', 'rating'].count())
Изначальное количество значений "E" в столбце "rating": 3920 Количество значений "E" в столбце "rating" после замены "K-A": 3923
Три устаревших значения рейтинга K-A
в столбце rating
заменено на E
.
Преобразование данных в нужные типы¶
При первичном анализа данных были выявлены 7 столбцов, в которых можно понизить разрядность данных, путем их конвертации.
# Конвертация в 'uint16'
games['year_of_release'] = games['year_of_release'].astype('uint16')
#games['year_of_release'] = pd.DatetimeIndex(games['year_of_release']).year
# Конвертация в 'float16'
for i in ['na_sales', 'eu_sales', 'jp_sales', 'other_sales', 'critic_score', 'user_score']:
games[i] = games[i].astype('float16')
games.info()
<class 'pandas.core.frame.DataFrame'> Int64Index: 16443 entries, 0 to 16714 Data columns (total 11 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 name 16443 non-null object 1 platform 16443 non-null object 2 year_of_release 16443 non-null uint16 3 genre 16443 non-null object 4 na_sales 16443 non-null float16 5 eu_sales 16443 non-null float16 6 jp_sales 16443 non-null float16 7 other_sales 16443 non-null float16 8 critic_score 7982 non-null float16 9 user_score 7462 non-null float16 10 rating 16443 non-null object dtypes: float16(6), object(4), uint16(1) memory usage: 867.1+ KB
Типы данных в 7 столбцах изменены. Размер датафрейма уменьшен почти в 2 раза до 867.1 Кб.
games.head()
name | platform | year_of_release | genre | na_sales | eu_sales | jp_sales | other_sales | critic_score | user_score | rating | |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | Wii Sports | Wii | 2006 | Sports | 41.375000 | 28.953125 | 3.769531 | 8.453125 | 76.0 | 8.000000 | E |
1 | Super Mario Bros. | NES | 1985 | Platform | 29.078125 | 3.580078 | 6.808594 | 0.770020 | NaN | NaN | no_ESRB |
2 | Mario Kart Wii | Wii | 2008 | Racing | 15.679688 | 12.757812 | 3.789062 | 3.289062 | 82.0 | 8.296875 | E |
3 | Wii Sports Resort | Wii | 2009 | Sports | 15.609375 | 10.929688 | 3.279297 | 2.949219 | 80.0 | 8.000000 | E |
4 | Pokemon Red/Pokemon Blue | GB | 1996 | Role-Playing | 11.273438 | 8.890625 | 10.218750 | 1.000000 | NaN | NaN | no_ESRB |
Значения в столбцах с измененным типом данных — приемлемые.
Подсчет суммарных продаж игр во всех регионах в отдельном столбце датафрейма¶
# Миллионов проданных копий игр
games['total_sales'] = games.loc[:, [
'na_sales',
'eu_sales',
'jp_sales',
'other_sales'
]].sum(axis=1)
# Корректировка типа данных для дальнейших расчетов
games['total_sales'] = games['total_sales'].astype('float64')
games.head()
name | platform | year_of_release | genre | na_sales | eu_sales | jp_sales | other_sales | critic_score | user_score | rating | total_sales | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | Wii Sports | Wii | 2006 | Sports | 41.375000 | 28.953125 | 3.769531 | 8.453125 | 76.0 | 8.000000 | E | 82.500 |
1 | Super Mario Bros. | NES | 1985 | Platform | 29.078125 | 3.580078 | 6.808594 | 0.770020 | NaN | NaN | no_ESRB | 40.250 |
2 | Mario Kart Wii | Wii | 2008 | Racing | 15.679688 | 12.757812 | 3.789062 | 3.289062 | 82.0 | 8.296875 | E | 35.500 |
3 | Wii Sports Resort | Wii | 2009 | Sports | 15.609375 | 10.929688 | 3.279297 | 2.949219 | 80.0 | 8.000000 | E | 32.750 |
4 | Pokemon Red/Pokemon Blue | GB | 1996 | Role-Playing | 11.273438 | 8.890625 | 10.218750 | 1.000000 | NaN | NaN | no_ESRB | 31.375 |
games.info()
<class 'pandas.core.frame.DataFrame'> Int64Index: 16443 entries, 0 to 16714 Data columns (total 12 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 name 16443 non-null object 1 platform 16443 non-null object 2 year_of_release 16443 non-null uint16 3 genre 16443 non-null object 4 na_sales 16443 non-null float16 5 eu_sales 16443 non-null float16 6 jp_sales 16443 non-null float16 7 other_sales 16443 non-null float16 8 critic_score 7982 non-null float16 9 user_score 7462 non-null float16 10 rating 16443 non-null object 11 total_sales 16443 non-null float64 dtypes: float16(6), float64(1), object(4), uint16(1) memory usage: 995.6+ KB
Успешно добавлен стобец с total_sales
с типом данных float64
, содержащий суммы всех продаж каждого релиза по всем регионам, включая other_sales
, измеряемая в миллионах копий игр.
Итоги подготовки данных¶
В датафрейме заменены и удалены критичные пропуски в данных, которые не позволили бы конвертировать столбцы в более приемлемые типы данных. Так, в user_score
значения tbd
заменены на np.nan
, а в year_of_release
пропуски nan
были удалены. Последнее позволило избавиться от строк с данными об играх, которые еще не поступили в полномасштабную продажу. Также удалены строки с пропусками в столбце name
. После удаления строк с пропусками потеряно только 1.6% всех строк датафрейма, что не является критичным для анализа. В остальных столбцах пропуски не изменены для корректного общего представления о данных при расчётах. В каждом отдельном случае можно исключить из расчётов строки с пропусками в столбцах, участвующих в расчётах.
Пропущенные рейтинги заменены на рейтинг RP (Rating Pending — Рейтинг ожидается). Исходим из того, что не классифицированная по рейтингу игра и ожидающая рейтинга — это одно и тоже.
Неявные дубликаты строк с игрой Madden NFL 13
на платформе PS3
, выпущенной в 2012 году, обработаны путем сложения данных о продажах в Европе и удаления второй повторяющейся строки. Три устаревших значения рейтинга K-A
в столбце rating
заменено на E
.
Типы данных в 7 столбцах изменены. Благодаря этому размер датафрейма уменьшен почти в 2 раза до 867.3 Кб. Успешно добавлен стобец с total_sales
с типом данных float64
, содержащий суммы всех продаж каждого релиза по всем регионам, включая other_sales
, измеряемая в миллионах копий игр. Все названия столбцов датафрейма привередны к нижнему регистру для соответствия «змеиному стилю».
Причины появления пропусков
Пропуски в столбце year_of_release
могли быть вызваны либо небрежностью ввода данных (если в большинстве других столбцов есть данные), либо тем, что игра создана, но еще не выпущена в продажу (если отсутствуют данные о продажах и рейтинге). В любом случае, без этих данных затрудняется анализ объектов и они могут быть удалены.
Одновременные пропуски в столбцах name
и platform
, вероятнее всего вызваны ошибкой ввода данных, т.к. в этом случае объект не возможно идентифицировать и его наличие бессмысленно.
Пропуски в столбцах с продажами в определенном регионе могут означать отсутствие продаж. Пропуски в столбцах с оценками пользователей или экспертов может означать, что эксперты и пользователи не оствили свои отзывы по этим объектам. Пропуски в столбцах с рейтингом при наличии данных о годе выпуска релиза могут означать отсутствие желания рейтинговое агентства по каким-либо причинам давать рейтинг объекту.
# Комментарий ревьюера
# Посмотрим, что осталось
temp = games.copy()
list_c = ['name', 'platform', 'year_of_release', 'genre', 'critic_score', 'user_score', 'rating']
print(temp.info())
for col_l in list_c:
print('-'* 25)
print(col_l, temp[col_l].sort_values().unique())
print(col_l,': кол-во NaN',temp[col_l].isna().sum(),
', процент NaN', round(temp[col_l].isna().mean()*100,2),'%')
<class 'pandas.core.frame.DataFrame'> Int64Index: 16443 entries, 0 to 16714 Data columns (total 12 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 name 16443 non-null object 1 platform 16443 non-null object 2 year_of_release 16443 non-null uint16 3 genre 16443 non-null object 4 na_sales 16443 non-null float16 5 eu_sales 16443 non-null float16 6 jp_sales 16443 non-null float16 7 other_sales 16443 non-null float16 8 critic_score 7982 non-null float16 9 user_score 7462 non-null float16 10 rating 16443 non-null object 11 total_sales 16443 non-null float64 dtypes: float16(6), float64(1), object(4), uint16(1) memory usage: 995.6+ KB None ------------------------- name [' Beyblade Burst' ' Fire Emblem Fates' " Frozen: Olaf's Quest" ... 'uDraw Studio' 'uDraw Studio: Instant Artist' '¡Shin Chan Flipa en colores!'] name : кол-во NaN 0 , процент NaN 0.0 % ------------------------- platform ['2600' '3DO' '3DS' 'DC' 'DS' 'GB' 'GBA' 'GC' 'GEN' 'GG' 'N64' 'NES' 'NG' 'PC' 'PCFX' 'PS' 'PS2' 'PS3' 'PS4' 'PSP' 'PSV' 'SAT' 'SCD' 'SNES' 'TG16' 'WS' 'Wii' 'WiiU' 'X360' 'XB' 'XOne'] platform : кол-во NaN 0 , процент NaN 0.0 % ------------------------- year_of_release [1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016] year_of_release : кол-во NaN 0 , процент NaN 0.0 % ------------------------- genre ['Action' 'Adventure' 'Fighting' 'Misc' 'Platform' 'Puzzle' 'Racing' 'Role-Playing' 'Shooter' 'Simulation' 'Sports' 'Strategy'] genre : кол-во NaN 0 , процент NaN 0.0 % ------------------------- critic_score [13. 17. 19. 20. 21. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. nan] critic_score : кол-во NaN 8461 , процент NaN 51.46 % ------------------------- user_score [0. 0.2 0.3 0.5 0.6 0.7 0.9 1. 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2. 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 3. 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 4. 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 5. 5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9 6. 6.1 6.2 6.3 6.4 6.5 6.6 6.7 6.8 6.9 7. 7.1 7.2 7.3 7.4 7.5 7.6 7.7 7.8 7.9 8. 8.1 8.2 8.3 8.4 8.5 8.6 8.7 8.8 8.9 9. 9.1 9.2 9.3 9.4 9.5 9.6 9.7 nan] user_score : кол-во NaN 8981 , процент NaN 54.62 % ------------------------- rating ['AO' 'E' 'E10+' 'EC' 'M' 'RP' 'T' 'no_ESRB'] rating : кол-во NaN 0 , процент NaN 0.0 %
Шаг 3. Исследовательский анализ данных¶
Датасет содержит данные за несколько десятилетий. Важны ли данные за все периоды? Предположим, что существует 2 подхода к анализу исторических данных.
Первый подход. История циклична и требуется проанализировать исторические данные для выявления закономерностей и циклов.
Второй подход. В реальности на появление данных действует множество факторов и в каждый отдельный момент времени комбинация всего множества факторов почти всегда уникальна, тем более с учётом постоянного развития ситуации вокруг данных. Если это так, то анализ исторических данных не даёт точного ответа на вопрос, что будет с данными дальше. Однако, такую информацию можно отчасти получить из анализа анамалий в данных.
Объединяя оба подхода можно прийти к идее о том, что информацию о закономерности и цикличности значений во времени, полученную в результате анализа исторических данных, а также информацию о текущих анамалиях, можно использовать с определенной долей вероятностей при прогнозировании будущих значений данных. Иключением являются строки с пропусками в year_of_release
, которые удалены из датафрейма.
Количество игр, выпускаемых в разные годы¶
# Диаграммы свродных данных о продажах
# (количество релизов, общая сумма продаж, медиана продаж)
games.pivot_table(
index='year_of_release',
values='total_sales',
aggfunc=('count', 'sum', 'median')
).rename(columns={
'count':'количество релизов',
'sum':'общая сумма колличества продаж (млн.)',
'median':'медиана колличества продаж одного релиза (млн.)'
}).plot(
subplots=True,
layout=(3, 1),
grid=True,
xlabel='Годы релизов'
);
Наблюдается плавный рост количества релизов игр от года к году с 1980 по 2008 год. Затем наблюдается спад. Аналогично ведёт себя общее количество продаж копий игр в исследуемых регионах.
Однако, этой тенденции не подвержены медианные значения миллионов проданных копий игр одного релиза в год. До 1990 наблюдалась оносительно высокая волотильность. Затем до 1995 года был резкий спад с коррекцией. После этого наблюдается стагнация с очень медленным спадом.
Изменения продаж по платформам.¶
Выберите платформы с наибольшими суммарными продажами и постройте распределение по годам. За какой характерный срок появляются новые и исчезают старые платформы?
# Количество релизов игр в зависимости от платформы и года
total_relaese = games.sort_values(by='total_sales').pivot_table(
index='platform',
columns='year_of_release',
values='total_sales',
aggfunc='count'
)
# Тепловая карта количества релизов игр на разных платформах в разные годы
ax = sns.heatmap(total_relaese)
ax.set(
title='Тепловая карта количества релизов игр на разных платформах в разные годы',
ylabel='Платформы',
xlabel='Годы'
);
Из полученной тепловой карты следует:
- Разные платформы имеют разную продолжительность существования. Например, максимальная продолжительность существования у платформы
PC
, которая суммарно вместе с перерывами просуществовала 26 лет. Минимальная продолжительность существования в 1 год у платформыTG16
. - Некоторые платформы имеют перерывы активности. Например,
DC
,DS
,GB
,PC
. ТакPC
имеет три периода активности по году с интервалами в 2, 3 и 1 год, после чего она имеет самую большую непрерывную продолжительность активности 23 года с 1994 по 2016 годы. - На некоторых платформах со средней продолжительностью существования около 11 лет имеется ярко выраженное увеличение количества релизов в середине периода существования. Причем, пик приходится на первую треть-середину периода существования платформы. Например, это ярко выражено на платформах
DC
,PS
,PS2
,Wii
. - Исходя из утверждения в предыдущем пункте, можно предположить, что платформы
PS4
иXOne
находятся в середине своего срока существования. Зафикированный в датафрейме период их активности 4 года, обрывающийся в 2016 году, когда данные прекратили собирать. С начала существования этих платфом наблюдается постепенное увеличение количества релизов, которое обрывается из-за обрыва истории данных. Если утверждение в этом пункте верное, то в начале-середине 2020-х годов можно ожидать снижение до минимума количества релизов на платформахPS4
иXOne
и их прекращение их существования.
# Анализ выброса количества релизов на платформе 'DS' в 1985
games.loc[
(games['platform'] == 'DS')
& (1984 <= games['year_of_release'])
& (games['year_of_release'] <= 2005)
].sort_values(by='year_of_release').head(20)
name | platform | year_of_release | genre | na_sales | eu_sales | jp_sales | other_sales | critic_score | user_score | rating | total_sales | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
15957 | Strongest Tokyo University Shogi DS | DS | 1985 | Action | 0.000000 | 0.000000 | 0.020004 | 0.000000 | NaN | NaN | no_ESRB | 0.020004 |
4007 | Spider-Man 2 | DS | 2004 | Action | 0.409912 | 0.020004 | 0.029999 | 0.040009 | 61.0 | 5.000000 | E | 0.500000 |
4421 | The Urbz: Sims in the City (all regions sales) | DS | 2004 | Simulation | 0.399902 | 0.010002 | 0.020004 | 0.000000 | NaN | NaN | no_ESRB | 0.429932 |
8465 | Zoo Keeper | DS | 2004 | Puzzle | 0.099976 | 0.010002 | 0.049988 | 0.010002 | 74.0 | 7.500000 | E | 0.169922 |
13463 | Cocoto Kart Racer | DS | 2004 | Racing | 0.040009 | 0.000000 | 0.000000 | 0.000000 | NaN | NaN | E | 0.040009 |
12367 | Sprung — A Game Where Everyone Scores | DS | 2004 | Adventure | 0.059998 | 0.000000 | 0.000000 | 0.000000 | NaN | NaN | no_ESRB | 0.059998 |
3414 | Asphalt: Urban GT | DS | 2004 | Racing | 0.310059 | 0.219971 | 0.000000 | 0.059998 | 60.0 | 7.500000 | E | 0.590332 |
8897 | Ridge Racer DS | DS | 2004 | Racing | 0.140015 | 0.000000 | 0.000000 | 0.010002 | 63.0 | 6.699219 | E | 0.150024 |
6063 | Feel the Magic XY/XX | DS | 2004 | Puzzle | 0.170044 | 0.000000 | 0.099976 | 0.020004 | 75.0 | 8.101562 | T | 0.290039 |
2668 | Pokemon Dash | DS | 2004 | Racing | 0.209961 | 0.140015 | 0.379883 | 0.040009 | 46.0 | 5.898438 | E | 0.770020 |
8984 | Tiger Woods PGA Tour | DS | 2004 | Sports | 0.130005 | 0.000000 | 0.000000 | 0.010002 | 64.0 | 7.398438 | E | 0.140015 |
13095 | Tennis no Oji-Sama: 2005 Crystal Drive | DS | 2004 | Sports | 0.000000 | 0.000000 | 0.049988 | 0.000000 | NaN | NaN | no_ESRB | 0.049988 |
6164 | The Urbz: Sims In the City (US weekly sales) | DS | 2004 | Simulation | 0.260010 | 0.000000 | 0.000000 | 0.020004 | NaN | NaN | no_ESRB | 0.280029 |
14087 | Mahjong Taikai | DS | 2004 | Misc | 0.000000 | 0.000000 | 0.040009 | 0.000000 | NaN | NaN | no_ESRB | 0.040009 |
9148 | Mr. Driller: Drill Spirits | DS | 2004 | Puzzle | 0.080017 | 0.000000 | 0.049988 | 0.010002 | 70.0 | 8.898438 | E | 0.140015 |
691 | WarioWare Touched! | DS | 2004 | Puzzle | 0.509766 | 0.449951 | 1.209961 | 0.130005 | NaN | NaN | no_ESRB | 2.300781 |
7902 | Daigasso! Band Brothers | DS | 2004 | Misc | 0.000000 | 0.000000 | 0.189941 | 0.000000 | NaN | NaN | no_ESRB | 0.189941 |
6578 | Madden NFL 2005 | DS | 2004 | Sports | 0.239990 | 0.000000 | 0.000000 | 0.020004 | 68.0 | 7.699219 | E | 0.260010 |
59 | Super Mario 64 | DS | 2004 | Platform | 5.011719 | 3.070312 | 1.250000 | 0.970215 | NaN | NaN | no_ESRB | 10.296875 |
10073 | Ping Pals | DS | 2004 | Misc | 0.099976 | 0.000000 | 0.000000 | 0.010002 | 28.0 | 3.900391 | E | 0.109985 |
# Поиск возможных ремейков игры 'Strongest Tokyo University Shogi DS'
games.loc[games['name'] == 'Strongest Tokyo University Shogi DS']
name | platform | year_of_release | genre | na_sales | eu_sales | jp_sales | other_sales | critic_score | user_score | rating | total_sales | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
15957 | Strongest Tokyo University Shogi DS | DS | 1985 | Action | 0.0 | 0.0 | 0.020004 | 0.0 | NaN | NaN | no_ESRB | 0.020004 |
Отдельно проанализирован выброс количества релизов на платформе DS
в 1985. Можно предположить, что после неуспешного выпуска одного релиза игры Strongest Tokyo University Shogi DS
в Японии, о платформе DS
забыли на 19 лет. После чего ее возродили и начали продажи игр на ней во всех анализируемых регионах. Это распространенный подход, когда спустя много лет возрождаются давно забытые, но в настроящем потенциально успешные технологии.
Требуется обратиться к поставщику данных за разъяснениями о происхождении этого и других выбросов.
# Миллионы проданных копий игр в зависимости от платформы и года
total_sales = games.sort_values(by='total_sales').pivot_table(
index='platform',
columns='year_of_release',
values='total_sales',
aggfunc='sum'
)
# Тепловая карта миллионов проданных копий игр в зависимости от платформы и года
ax = sns.heatmap(total_sales)
ax.set(
title='Тепловая карта миллионов проданных копий игр в зависимости от платформы и года',
ylabel='Платформы',
xlabel='Годы'
);
Данные из этой тепловой карты вторят данным из тепловой карты количества релизов. Активность продаж по годам и платформам совпадает с количеством релизов, но в некоторых случаях наблюдаются более явные изменения. Например, на платформе PS2
продажи в 2002-2004 годах существенно возрасли, а количество релизов увеличилось менее выражено. Еще пример. В 2006 году в начале существования платформы WiiU
продаж было много, а количество релизов относительно небольшое. После пика продаж и количества релизов в 2009 году количество продаж и релизов постепенно синизилось до минимальных значений.
# Создание сводной таблицы информации по платформам
games_platform_total = pd.DataFrame()
# Миллионы продаж
games_platform_total['total_sales'] = total_sales.sum(axis=1)
games_platform_total = games_platform_total.sort_values(by='total_sales', ascending=False)
# Медиана продаж
games_platform_total['median_sales'] = games.sort_values(by='total_sales').pivot_table(
index='platform',
columns='year_of_release',
values='total_sales',
aggfunc='median'
).median(axis=1)
# Количество релизов
games_platform_total['total_release'] = total_relaese.sum(axis=1)
# Количество лет активности платформы
games_platform_total['total_years'] = games.sort_values(by='total_sales').pivot_table(
index='year_of_release',
columns='platform',
values='total_sales',
aggfunc='count'
).count()
# Начало функционирования платформы
games_platform_total['min_years'] = games.pivot_table(
index='platform',
values='year_of_release',
aggfunc=('min')
)
# Окончание функционирование платформы
games_platform_total['max_years'] = games.groupby('platform')['year_of_release'].agg('max')
games_platform_total.rename(columns={
'total_sales':'Количество продаж (млн.)',
'median_sales':'Медиана продаж (млн.)',
'total_release':'Количество релизов',
'total_years':'Общее количество лет существования',
'min_years':'Год создания платформы',
'max_years':'Последний год существования платформы'
})
Количество продаж (млн.) | Медиана продаж (млн.) | Количество релизов | Общее количество лет существования | Год создания платформы | Последний год существования платформы | |
---|---|---|---|---|---|---|
platform | ||||||
PS2 | 1233.543427 | 0.222534 | 2127.0 | 12 | 2000 | 2011 |
X360 | 961.179657 | 0.267517 | 1232.0 | 12 | 2005 | 2016 |
PS3 | 931.361649 | 0.310059 | 1305.0 | 11 | 2006 | 2016 |
Wii | 891.116653 | 0.190063 | 1286.0 | 11 | 2006 | 2016 |
DS | 802.765686 | 0.109985 | 2121.0 | 11 | 1985 | 2013 |
PS | 727.562515 | 0.270020 | 1190.0 | 10 | 1994 | 2003 |
PS4 | 314.140610 | 0.390076 | 392.0 | 4 | 2013 | 2016 |
GBA | 312.872353 | 0.154999 | 811.0 | 8 | 2000 | 2007 |
PSP | 289.533401 | 0.075012 | 1193.0 | 12 | 2004 | 2015 |
3DS | 257.818977 | 0.095001 | 512.0 | 6 | 2011 | 2016 |
PC | 255.759705 | 0.050003 | 957.0 | 26 | 1985 | 2016 |
GB | 254.420227 | 0.900146 | 97.0 | 13 | 1988 | 2001 |
XB | 251.571350 | 0.150024 | 803.0 | 9 | 2000 | 2008 |
NES | 251.034668 | 1.269531 | 98.0 | 12 | 1983 | 1994 |
N64 | 218.001938 | 0.310059 | 316.0 | 7 | 1996 | 2002 |
SNES | 200.022865 | 0.292542 | 239.0 | 10 | 1990 | 1999 |
GC | 196.757355 | 0.150024 | 542.0 | 7 | 2001 | 2007 |
XOne | 159.311836 | 0.342468 | 247.0 | 4 | 2013 | 2016 |
2600 | 86.464722 | 0.409912 | 116.0 | 10 | 1980 | 1989 |
WiiU | 82.190422 | 0.219971 | 147.0 | 5 | 2012 | 2016 |
PSV | 53.812134 | 0.082520 | 429.0 | 6 | 2011 | 2016 |
SAT | 33.590530 | 0.105011 | 173.0 | 6 | 1994 | 1999 |
GEN | 28.348358 | 1.850098 | 27.0 | 5 | 1990 | 1994 |
DC | 15.945816 | 0.119995 | 52.0 | 7 | 1998 | 2008 |
SCD | 1.860016 | 0.779999 | 6.0 | 2 | 1993 | 1994 |
NG | 1.439926 | 0.080009 | 12.0 | 4 | 1993 | 1996 |
WS | 1.419891 | 0.230042 | 6.0 | 3 | 1999 | 2001 |
TG16 | 0.160019 | 0.080009 | 2.0 | 1 | 1995 | 1995 |
3DO | 0.100006 | 0.030003 | 3.0 | 2 | 1994 | 1995 |
GG | 0.040009 | 0.040009 | 1.0 | 1 | 1992 | 1992 |
PCFX | 0.029999 | 0.029999 | 1.0 | 1 | 1996 | 1996 |
Лидером продаж игр является платформа PS2
. На ней продано суммарно более 1233.57 млн. копий игр. Эта же платформа является лидером по количеству релизов игр (2127 релизов), но не по медиане продаж копий игр одного релиза (223 тыс. копий). Далее по количеств продаж следуют X360
(961.24 млн. копий), PS3
(931.11 млн. копий), Wii
(891.19 млн. копий), DS
(802.78 млн. копий) и PS
(727.56 млн. копий). Далее с разрывом почти в 400 млн. копий следует PS4
. Замыкает список платформа PCFX
30 тыс. проданных копий игр.
games_platform_total.loc[:,
['total_sales',
'median_sales',
'total_release',
'total_years']
].rename(columns={
'total_sales':'Количество продаж (млн.)',
'median_sales':'Медиана продаж (млн.)',
'total_release':'Количество релизов',
'total_years':'Общее количество лет существования'
}).plot(
kind='bar',
subplots=True,
layout=(4, 1),
xlabel='Платформы'
);
Исходя из приведенных здесь графиков, перечисленные в них параметры имеют слабую корреляцию. И всё же количество продаж имее зависимость от количества релизов. Это подтверждается наличие одного и того же лидера PS2
по обоим параметрам. Наиболее непредсказуемы медианны продаж копий игр одного релиза по платформам. Наблюдается незначительная обратная зависимость к другим показателям.
# Матрица корреляции Пирсона
games_platform_total.rename(columns={
'total_sales':'Количество продаж (млн.)',
'median_sales':'Медиана продаж (млн.)',
'total_release':'Количество релизов',
'total_years':'Общее количество лет существования',
'min_years':'Год создания платформы',
'max_years':'Последний год существования платформы'
}).corr()
Количество продаж (млн.) | Медиана продаж (млн.) | Количество релизов | Общее количество лет существования | Год создания платформы | Последний год существования платформы | |
---|---|---|---|---|---|---|
Количество продаж (млн.) | 1.000000 | -0.077077 | 0.899286 | 0.504278 | 0.167441 | 0.524750 |
Медиана продаж (млн.) | -0.077077 | 1.000000 | -0.241157 | 0.034879 | -0.314785 | -0.338127 |
Количество релизов | 0.899286 | -0.241157 | 1.000000 | 0.565986 | 0.133384 | 0.608907 |
Общее количество лет существования | 0.504278 | 0.034879 | 0.565986 | 1.000000 | -0.269425 | 0.405698 |
Год создания платформы | 0.167441 | -0.314785 | 0.133384 | -0.269425 | 1.000000 | 0.709808 |
Последний год существования платформы | 0.524750 | -0.338127 | 0.608907 | 0.405698 | 0.709808 | 1.000000 |
Исходя из матрицы корреляции Пирсона количество продаж имет наибольшую зависимость с количеством релизов. Следом с большим отрывом по корреляции с количеством продаж идут последний год существования платформы и общее количество лет существования платформы. Почти полное отсутствие корреляции с годом создания платформы. Незначительнюу обратную корреляцию почти со всеми показателями имеет медиана продаж.
games_platform_total.describe()
total_sales | median_sales | total_release | total_years | min_years | max_years | |
---|---|---|---|---|---|---|
count | 31.000000 | 31.000000 | 31.000000 | 31.000000 | 31.000000 | 31.000000 |
mean | 284.328281 | 0.309924 | 530.419355 | 7.677419 | 1997.645161 | 2005.258065 |
std | 343.945292 | 0.394507 | 617.325618 | 5.081910 | 9.094131 | 9.273503 |
min | 0.029999 | 0.029999 | 1.000000 | 1.000000 | 1980.000000 | 1989.000000 |
25% | 22.147087 | 0.088760 | 39.500000 | 4.000000 | 1992.500000 | 1996.000000 |
50% | 200.022865 | 0.190063 | 247.000000 | 7.000000 | 1996.000000 | 2007.000000 |
75% | 301.202877 | 0.310059 | 884.000000 | 11.000000 | 2004.500000 | 2016.000000 |
max | 1233.543427 | 1.850098 | 2127.000000 | 26.000000 | 2013.000000 | 2016.000000 |
Средняя продолжительность жизни платформы 7.7 лет, медианная 7 лет. Минимальная продолжительность жизни платформы 1 год, максимальная 26 лет. Медианное количество релизов 247, всех продаж по платформам 200 млн. копий, а медиан по каждому релизу 310 тыс. копий.
Предварительные выводы о платформах
Лидером продаж игр является платформа PS2
. На ней продано суммарно более 1233.57 млн. копий игр. Эта же платформа является лидером по количеству релизов игр (2127 релизов), но не по медиане продаж копий игр одного релиза (223 тыс. копий). Далее по количеств продаж следуют X360
(961.24 млн. копий), PS3
(931.11 млн. копий), Wii
(891.19 млн. копий), DS
(802.78 млн. копий) и PS
(727.56 млн. копий). Далее с разрывом почти в 400 млн. копий следует PS4
.
Разные платформы имеют разную продолжительность существования. Например, максимальная продолжительность существования у платформы PC
, которая суммарно вместе с перерывами просуществовала 26 лет. Минимальная продолжительность существования в 1 год у платформы ‘TG16’. Некоторые платформы имеют перерывы активности. Например, DC
, DS
, GB
, PC
. PC
имеет три периода активности по году с интервалами в 2, 3 и 1 год, после чего она имеет самую большую непрерывную продолжительность активности 23 года с 1994 по 2016 годы. Средняя продолжительность жизни платформы 7.6 лет, медианная 7 лет. Минимальная продолжительность жизни платформы 1 год, максимальная 26 лет. Медианное количество релизов 247, всех продаж по платформам 200 млн. копий, а медиан по каждому релизу 310 тыс. копий.
На некоторых платформах со средней продолжительностью существования около 11 лет имеется ярко выраженное увеличение количества релизов в середине периода существования. Также на тех ж платформах в этот период наблюдается рост продаж, но более ярко выражено. Например, на платформе PS2
продажи в 2002-2004 годах существенно возрасли, а количество релизов увеличилось менее выражено. Пик роста количества релизов и продаж приходится на первую треть-середину периода существования платформы. Например, это наглядно на платформах DC
, PS
, PS2
, Wii
.
Исходя из вышесказанного, можно предположить, что платформы PS4
и XOne
находятся в середине своего срока существования. Зафикированный в датафрейме период их активности 5-6 лет, обрывающийся в 2016 году, когда данные прекратили собирать. С начала существования этих платфом наблюдается постепенное увеличение количества релизов, которое обрывается из-за обрыва истории данных. Если утверждение в этом пункте верное, то в начале-середине 2020-х годов можно ожидать снижение до минимума количества релизов на платформах PS4
и XOne
и их прекращение их существования.
Выбор данных за актуальный период¶
Актуальный период определяется самостоятельно в результате исследования предыдущих вопросов. Основной фактор — эти данные помогут построить прогноз на 2017 год. Не учитываются в работе данные за предыдущие годы.
# Актуальный период для прогноза продаж (текущий
# срок существования наиболее перспективных платформ 'PS4' и 'XOne')
actual_years = [2013, 2014, 2015, 2016]
# Продажи за актуальный период
actual_sales = total_sales.loc[:, actual_years].dropna(how='all')
actual_sales
year_of_release | 2013 | 2014 | 2015 | 2016 |
---|---|---|---|---|
platform | ||||
3DS | 56.573982 | 43.766342 | 27.779579 | 15.136314 |
DS | 1.539917 | NaN | NaN | NaN |
PC | 12.377724 | 13.281830 | 8.518822 | 5.250160 |
PS3 | 113.268341 | 47.759399 | 16.822273 | 3.599861 |
PS4 | 25.987915 | 99.995705 | 118.903877 | 69.253113 |
PSP | 3.140205 | 0.240036 | 0.120026 | NaN |
PSV | 10.590317 | 11.902092 | 6.250443 | 4.250237 |
Wii | 8.590233 | 3.750084 | 1.140221 | 0.179932 |
WiiU | 21.648422 | 22.029816 | 16.350273 | 4.600388 |
X360 | 88.579224 | 34.735878 | 11.959328 | 1.520279 |
XOne | 18.960632 | 54.067703 | 60.134880 | 26.148621 |
Учитывая тот факт, что мидана продолжительности существования платформы 7 лет, этот мериод можно считать показательным для прогнозирования дальнейшего развития игровой индустрии. Однако, для целей анализа выбран период в 4 года, которые существуют наиболее перспективные платформы PS4
и XOne
. Из анализа исключены платформы, на которых не было активности за полседние 4 лет.
Какие платформы лидируют по продажам, растут или падают?¶
Выберите несколько потенциально прибыльных платформ.
# Лидеры продаж
actual_sales.sum(axis=1).sort_values(ascending=False)
platform PS4 314.140610 PS3 181.449875 XOne 159.311836 3DS 143.256218 X360 136.794708 WiiU 64.628899 PC 39.428535 PSV 32.993088 Wii 13.660469 PSP 3.500267 DS 1.539917 dtype: float64
За последние 4 года осуществляли продажи около трети всех проанализированных платформ. Только 11 из 31 платформы. Лидером суммарных продаж за последние 4 года является платформа PS4
(314.14 млн. проданных копий игр). Далее с большим отрывом следует PS3
(181.43 млн. проданных копий игр). Замыкает тройку лидеров платформа XOne
(159.31 млн. проданных копий игр). Платформа-долгожитель PC
входит в десятку лидиров продаж (39.43 млн. проданных копий игр).
actual_sales[2016].sort_values(ascending=False)
platform PS4 69.253113 XOne 26.148621 3DS 15.136314 PC 5.250160 WiiU 4.600388 PSV 4.250237 PS3 3.599861 X360 1.520279 Wii 0.179932 DS NaN PSP NaN Name: 2016, dtype: float64
В 2016 году только 9 платформ продавали копии игр. Лидером среди них являлась платформа PS4
(69.25 млн. проданных копий игр). Следом с большим отрывом идут XOne
(26.15 млн. проданных копий игр) и 3DS
(15.14 млн. проданных копий игр). В 2016 году платформа-долгожитель PC
вошла в пятерку лидиров продаж (5.25 млн. проданных копий игр). Постепенно за последние годы сошли с дистанции продаж DS
и PSP
.
actual_sales.sum()
year_of_release 2013 361.256912 2014 331.528885 2015 267.979721 2016 129.938904 dtype: float64
С каждым годом снижается количество проданных копий игр. В 2016 году самые низкие продажи (129.94 млн. проданных копий игр) за последние 4 года. Если это тенденция, то в 2017 году можно ожидать продолжение снижения количества проданных копий игр.
# Тепловая карта миллионов проданных копий игр в зависимости от платформы за последние 4 года
ax = sns.heatmap(actual_sales, annot=True)
ax.set(
title='Тепловая карта миллионов проданных копий игр в зависимости от платформы за последние 4 года',
ylabel='Платформы',
xlabel='Годы'
);
Платформа PS4
является лидером последние 3 года анализа. Это не смотря на снижение продаж в 2 раза в 2016 году, относительно 2015 года. Если развитие PS4
будет подчиненно медианной продолжительности существования всех проанализированных платформ, то PS4
сможет просуществовать еще 3 года, а может и более. Аналогичная ситуация с платформой XOne
, но с отрывом более чем в 2 раза, относительно PS4
.
Предварительный прогноз на 2017 год.
В 2017 году вероятнее всего снизится общее количество продаваемых копий игр. Прдолжат существовать игровые платформы PS4
, XOne
, 3DS
, PC
, WiiU
, PSV
, PS3
, X360
и Wii
. При этом, PS4
и XOne
до 2016 года набирали обороты продаж и, еще не достигли медианного возраста всех платформ. Значит они в 2017 году вероятно продолжат существовать и лидировать в родажах. Также, вероятно, продолжатся продажи на платформе PC
, хоть и с отставанием от лидеров. Остальные платформы, на которых продажи осуществлялись в 2016 году постепенно от года к году снижают количество продаж и могут в любой момент уйти с рынка. Особенно это характерно для PS3
, X360
и Wii
, т.к. они из безусловных лидеров в 2010 превратились в аутсайдеров в 2016 году, а срок их существования больше медианного.
График «ящик с усами» по глобальным продажам игр в разбивке по платформам¶
# Для дальнейшего анализа использовать только актуальные 4 года
games_actual = games.loc[games['year_of_release'] >= 2013]
print('Общая информация из копии датафрейма "games" с данными за последние 4 года')
print()
print(games_actual.info())
print()
print(games_actual.describe())
games_actual.sort_values(by='total_sales', ascending=False).head()
Общая информация из копии датафрейма "games" с данными за последние 4 года <class 'pandas.core.frame.DataFrame'> Int64Index: 2233 entries, 16 to 16714 Data columns (total 12 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 name 2233 non-null object 1 platform 2233 non-null object 2 year_of_release 2233 non-null uint16 3 genre 2233 non-null object 4 na_sales 2233 non-null float16 5 eu_sales 2233 non-null float16 6 jp_sales 2233 non-null float16 7 other_sales 2233 non-null float16 8 critic_score 991 non-null float16 9 user_score 1192 non-null float16 10 rating 2233 non-null object 11 total_sales 2233 non-null float64 dtypes: float16(6), float64(1), object(4), uint16(1) memory usage: 135.2+ KB None year_of_release na_sales eu_sales jp_sales other_sales \ count 2233.000000 2233.000000 2233.000000 2233.000000 2233.000000 mean 2014.477385 0.196167 0.175781 0.063049 0.053772 std 1.089439 0.547852 0.512695 0.234009 0.165649 min 2013.000000 0.000000 0.000000 0.000000 0.000000 25% 2014.000000 0.000000 0.000000 0.000000 0.000000 50% 2014.000000 0.020004 0.029999 0.010002 0.010002 75% 2015.000000 0.150024 0.130005 0.049988 0.040009 max 2016.000000 9.656250 9.093750 4.351562 3.960938 critic_score user_score total_sales count 991.00000 1192.000000 2233.000000 mean inf 6.582031 0.488448 std 12.84375 1.610352 1.235331 min 13.00000 0.199951 0.010002 25% 66.00000 5.800781 0.029999 50% 74.00000 7.000000 0.109985 75% 81.00000 7.800781 0.400146 max 97.00000 9.296875 21.062500
name | platform | year_of_release | genre | na_sales | eu_sales | jp_sales | other_sales | critic_score | user_score | rating | total_sales | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
16 | Grand Theft Auto V | PS3 | 2013 | Action | 7.019531 | 9.093750 | 0.979980 | 3.960938 | 97.0 | 8.203125 | M | 21.062500 |
23 | Grand Theft Auto V | X360 | 2013 | Action | 9.656250 | 5.140625 | 0.059998 | 1.410156 | 97.0 | 8.101562 | M | 16.265625 |
31 | Call of Duty: Black Ops 3 | PS4 | 2015 | Shooter | 6.031250 | 5.859375 | 0.360107 | 2.380859 | NaN | NaN | no_ESRB | 14.632812 |
33 | Pokemon X/Pokemon Y | 3DS | 2013 | Role-Playing | 5.281250 | 4.191406 | 4.351562 | 0.779785 | NaN | NaN | no_ESRB | 14.601562 |
42 | Grand Theft Auto V | PS4 | 2014 | Action | 3.960938 | 6.308594 | 0.379883 | 1.969727 | 97.0 | 8.296875 | M | 12.617188 |
За последние 4 года было выпущено 2233 релиза игр. Продажи копий игр этих релизов распределены не равномерно между всеми аналзируемыми регионами. Медианные продажи по всем регионам зафиксированы на уровне 4 млн. копий игр. Лидером по по общему количеству продаж является игра Grand Theft Auto V
, выпущенная в 2013 году на платформе PS3
. Было продано 21.05 млн. копий этой игры. Эта же игра на платформе X360
в том же году стала лидером по продажам среди регионов. В Северной Америке было продано 9.66 млн копий.
# Графики "Ящик с усами" от 'pandas'
# для анализа распределений продаж игр за последние 4 года
sns.boxplot(
x=games_actual.rename(columns={
'platform':'Платформа'
})['Платформа'],
y=games_actual.rename(columns={
'total_sales':'Продажи млн. копий игр'
})['Продажи млн. копий игр']
);
plt.title('Продажи млн. копий игр одного релиза по всем регионам с учётом выбросов')
plt.show()
sns.boxplot(
x=games_actual.rename(columns={
'platform':'Платформа'
})['Платформа'],
y=games_actual.rename(columns={
'total_sales':'Продажи млн. копий игр'
})['Продажи млн. копий игр'],
showfliers=False
);
plt.title('Продажи млн. копий игр одного релиза по всем регионам без учёта выбросов')
plt.show()
В актуальный период третьи квартили только платформ Wii
и X360
преодолели планку в 700 тыс. продаж копий игр одного релиза. При этом, самая высоквая медиана продаж у X360
. Эта же платформа имеет один из самых больших единичных выбросов в 15 млн. проданных копий игр, уступив в этом только платформе PS3
с выбросом в 20 млн. продаж. Наиболее перспективные с точки зрения возможного начала жизненного цикла платформы PS4
и XOne
входят в пятерку платформ с максимальным третьим квартилем и медианой продаж копий игр одного релиза.
Предварительный вывод об игровых платфомах в актуальный период
Наиболее перспективные с точки зрения возможного начала многолетнего жизненного цикла платформы PS4
и XOne
входят в пятерку платформ с максимальным третьим квартилем и медианой продаж копий игр одного релиза. Это означает, что платформы PS4
и XOne
наиоболее выгодны с точки зрения среднесрочных инвестиционных вложений.
Влияние отзывов критиков и пользователей на продажи отдельно взятых платформ всех вместе¶
# Матрицы диаграмм рассеяния для отслеживания зависимости между количеством
# проданных млн. копий игр, оценками критиков и пользователей
# для каждой платформы отдельно
fig, axes = plt.subplots(
len(games_actual['platform'].unique()),
2
)
r = 0
for i in games_actual['platform'].unique():
c = 0
for j in ['Оценки критиков', 'Оценки пользователей']:
games_actual.loc[
games_actual['platform'] == i
].rename(columns={
'total_sales':'Продано млн. копий игр',
'critic_score':'Оценки критиков',
'user_score':'Оценки пользователей'
}).plot.scatter(
x=j,
y='Продано млн. копий игр',
alpha=.3,
ax=axes[r, c],
figsize=(7, 50),
title=i
);
c += 1
r += 1
fig.tight_layout() # автоматическая регулировка расстояния между пографиками
plt.show()
На графиках все значения «прижимаются» к осям координат. Значит, корреляция слабая.
Графики рассейния подтверждают выводы о небольшой зависимости количества продаж от оценок экспертов и пользователей. С ростом значений параметров увеличивается их разброс. Имеются выбросы.
# Таблица корреляции Пирсона между количеством
# проданных млн. копий игр, оценками критиков и пользователей
# для каждой платформы отдельно
games_actual.loc[
:,
['platform',
'total_sales',
'critic_score',
'user_score']
].rename(columns={
'platform':'Платформа',
'total_sales':'Продано млн. копий игр',
'critic_score':'Оценки критиков',
'user_score':'Оценки пользователей'
}).pivot_table(
index='Платформа',
values=['Продано млн. копий игр', 'Оценки критиков', 'Оценки пользователей'],
aggfunc='corr'
)
Оценки критиков | Оценки пользователей | Продано млн. копий игр | ||
---|---|---|---|---|
Платформа | ||||
3DS | Продано млн. копий игр | 0.357087 | 0.241371 | 1.000000 |
Оценки критиков | 1.000000 | 0.769661 | 0.357087 | |
Оценки пользователей | 0.769661 | 1.000000 | 0.241371 | |
DS | Продано млн. копий игр | NaN | NaN | 1.000000 |
PC | Продано млн. копий игр | 0.195984 | -0.094016 | 1.000000 |
Оценки критиков | 1.000000 | 0.429521 | 0.195984 | |
Оценки пользователей | 0.429521 | 1.000000 | -0.094016 | |
PS3 | Продано млн. копий игр | 0.334198 | 0.002497 | 1.000000 |
Оценки критиков | 1.000000 | 0.600016 | 0.334198 | |
Оценки пользователей | 0.600016 | 1.000000 | 0.002497 | |
PS4 | Продано млн. копий игр | 0.406580 | -0.032015 | 1.000000 |
Оценки критиков | 1.000000 | 0.557659 | 0.406580 | |
Оценки пользователей | 0.557659 | 1.000000 | -0.032015 | |
PSP | Продано млн. копий игр | NaN | -1.000000 | 1.000000 |
Оценки пользователей | NaN | 1.000000 | -1.000000 | |
PSV | Продано млн. копий игр | 0.254687 | 0.000919 | 1.000000 |
Оценки критиков | 1.000000 | 0.611548 | 0.254687 | |
Оценки пользователей | 0.611548 | 1.000000 | 0.000919 | |
Wii | Продано млн. копий игр | NaN | 0.682841 | 1.000000 |
Оценки пользователей | NaN | 1.000000 | 0.682841 | |
WiiU | Продано млн. копий игр | 0.376352 | 0.419424 | 1.000000 |
Оценки критиков | 1.000000 | 0.721421 | 0.376352 | |
Оценки пользователей | 0.721421 | 1.000000 | 0.419424 | |
X360 | Продано млн. копий игр | 0.350403 | -0.011692 | 1.000000 |
Оценки критиков | 1.000000 | 0.520877 | 0.350403 | |
Оценки пользователей | 0.520877 | 1.000000 | -0.011692 | |
XOne | Продано млн. копий игр | 0.416974 | -0.069075 | 1.000000 |
Оценки критиков | 1.000000 | 0.472404 | 0.416974 | |
Оценки пользователей | 0.472404 | 1.000000 | -0.069075 |
Почти все коэффициенты корреляции количества проданных копий игр с оценками экспертов и пользователей, кроме одного, на каждой отдельно взятых платформах по модулю не превышают 0.5. Только на платформе Wii
этот коэффициент больше и равен 0.682841. Часть корреляций отрицательная, но также не значительная по модулю. Например, продажи копий игр на платформе PC
с оценками пользователей имеет корреляцию -0.093991.
# Коэффициент корреляции между 'total_sales' (млн. проданных копий игр)
# и 'critic_score' (отзывы критиков) на всех платформах
print('Коэффициент корреляции между количеством всех проданных копий игр одного релиза и \
оценкой критиков на всех платформах:')
print(games_actual['total_sales'].corr(games_actual['critic_score']))
print()
# Коэффициент корреляции между 'total_sales' (млн. проданных копий игр)
# и 'user_score' (отзывы пользователей) на всех платформах
print('Коэффициент корреляции между количеством всех проданных копий игр одного релиза и \
оценкой пользователей на всех платформах:')
print(games_actual['total_sales'].corr(games_actual['user_score']))
Коэффициент корреляции между количеством всех проданных копий игр одного релиза и оценкой критиков на всех платформах: 0.31367473012747243 Коэффициент корреляции между количеством всех проданных копий игр одного релиза и оценкой пользователей на всех платформах: -0.0025974006973781623
Коэффициенты корреляции количества продаж с оценками экспертов и пользователей на отдельных платформах соотносятся со значенями по всем платформам. Коэффициент корреляции между количеством продаж и оценками экспертов больше по модулю, чем с оценками пользователей, последний имеет отрицательное значение. На смотря на это, в обоих случаях коэффциенты не значительные.
Промежуточные выводы. Отсутствует статистически значимая корреляция между отзывами критиков и пользователей с продажами на всех и отдельно взятых платформах. Т.е. продажи от них почти независимы.
Общее распределение игр по жанрам¶
Что можно сказать о самых прибыльных жанрах? Выделяются ли жанры с высокими и низкими продажами?
# Распределение количества продаж по жанрам игр
games_actual.rename(columns={
'genre':'Жанр'
}).pivot_table(
index='Жанр',
values='total_sales',
aggfunc=('sum', 'median', 'count')
).rename(columns={
'sum':'Сумма млн. продаж',
'median':'Медиана продаж',
'count':'Количество релизов'
}).sort_values(by='Сумма млн. продаж', ascending=False)
Количество релизов | Медиана продаж | Сумма млн. продаж | |
---|---|---|---|
Жанр | |||
Action | 766 | 0.109985 | 321.881523 |
Shooter | 187 | 0.449951 | 232.982071 |
Sports | 214 | 0.239990 | 150.636368 |
Role-Playing | 292 | 0.125031 | 145.890526 |
Misc | 155 | 0.099976 | 62.828140 |
Platform | 74 | 0.224976 | 42.632034 |
Racing | 85 | 0.119995 | 39.895241 |
Fighting | 80 | 0.125000 | 35.310120 |
Adventure | 245 | 0.029999 | 23.639168 |
Simulation | 62 | 0.100006 | 21.759521 |
Strategy | 56 | 0.080017 | 10.080208 |
Puzzle | 17 | 0.059998 | 3.169502 |
Самый большой объем рынка игр в жанре Action
. На этот рынок приходится 321.86 млн. всех продаж. Людям интересны игры в жанре Action
и об этом знают создатели игр, потому данный рынок и самый высококонкурентный. В рамках него создано 766 релизов игр. Более чем в других жанрах. Далее в тройке лидиров по объему рынка с большим отрывом расположились игры в жанрах Shooter
(232.99 млн. продаж копий игр) и Sports
(150.64 млн. продаж копий игр).
Из трех перечисленных жанров более интересен Shooter
. На рынке этого жанра самая высокая медиана продаж на один релиз (450 тыс. копий игр) и не самая высокая активность по созданию релизов (187 релизов — это 5 место по количеству релизов).
# Графики "Ящик с усами" от 'pandas'
# для анализа распределений продаж игр за последние 4 года
sns.boxplot(
x=games_actual.rename(columns={
'genre':'Жанр'
})['Жанр'],
y=games_actual.rename(columns={
'total_sales':'Продажи млн. копий игр'
})['Продажи млн. копий игр']
);
plt.title('Продажи млн. копий игр одного релиза по всем регионам с учётом выбросов')
plt.show()
sns.boxplot(
x=games_actual.rename(columns={
'genre':'Жанр'
})['Жанр'],
y=games_actual.rename(columns={
'total_sales':'Продажи млн. копий игр'
})['Продажи млн. копий игр'],
showfliers=False
);
plt.title('Продажи млн. копий игр одного релиза по всем регионам без учёта выбросов')
plt.show()
Медиана продаж копий игр Shooter
превосходит третий квартиль большинства продаж копий игр других жанров. Третий квартиль Shooter
превосходит 1 млн. продаж, что больше третьих квартилей продаж копий игр других жанров. Для полноты выводов требуется анализ развития рынка этого жанра игр во времени относительно других жанров.
# Таблица корреляции всех продаж с годами релизов по жанрам
genre_years = games_actual.pivot_table(
index='genre',
values=['total_sales', 'year_of_release'],
aggfunc='corr'
)
# Вывод только корреляционных значений по жанрам
# в единичном экземпляере с сортировкой
genre_years.loc[genre_years['total_sales'] < 1, 'total_sales'].sort_values(ascending=False)
genre Adventure year_of_release -0.008960 Shooter year_of_release -0.009209 Fighting year_of_release -0.054020 Role-Playing year_of_release -0.067652 Sports year_of_release -0.088469 Simulation year_of_release -0.173719 Action year_of_release -0.184171 Misc year_of_release -0.195254 Platform year_of_release -0.223892 Racing year_of_release -0.250244 Puzzle year_of_release -0.263163 Strategy year_of_release -0.336985 Name: total_sales, dtype: float64
В дополнение к тому, что рынок игр в жанре Shooter
привлекателем его объемами и самой высокой эффективностью продаж на один релиз, он меньше других подвержен спаду продаж. По этому критерию Shooter
немного уступает только Adventure
.
Итоги исследовательского анализа данных¶
В исследовательском анализе данных исходим из того, что информацию о закономерности и цикличности значений во времени, полученную в результате анализа исторических данных, а также информацию о текущих анамалиях, можно использовать с определенной долей вероятностей при прогнозировании будущих значений данных. Иключением являются строки с пропусками в year_of_release
, которые неинформативны и потому удалены из датафрейма.
О продажах в целом
Наблюдается плавный рост количества релизов игр от года к году с 1980 по 2008 год. Затем наблюдается спад. Аналогично ведёт себя общее количество продаж копий игр в исследуемых регионах. Однако, этой тенденции не подвержены медианные значения миллионов проданных копий игр одного релиза в год. До 1990 наблюдалась оносительно высокая волотильность. Затем до 1995 года был резкий спад с коррекцией. После этого наблюдается стагнация с очень медленным спадом.
О платформах в целом
Лидером продаж игр является платформа PS2
. На ней продано суммарно более 1233.57 млн. копий игр. Эта же платформа является лидером по количеству релизов игр (2127 релизов), но не по медиане продаж копий игр одного релиза (223 тыс. копий). Далее по количеств продаж следуют X360
(961.24 млн. копий), PS3
(931.11 млн. копий), Wii
(891.19 млн. копий), DS
(802.78 млн. копий) и PS
(727.56 млн. копий). Далее с разрывом почти в 400 млн. копий следует PS4
.
Разные платформы имеют разную продолжительность существования. Например, максимальная продолжительность существования у платформы PC
, которая суммарно вместе с перерывами просуществовала 26 лет. Минимальная продолжительность существования в 1 год у платформы ‘TG16’. Некоторые платформы имеют перерывы активности. Например, DC
, DS
, GB
, PC
. PC
имеет три периода активности по году с интервалами в 2, 3 и 1 год, после чего она имеет самую большую непрерывную продолжительность активности 23 года с 1994 по 2016 годы. Средняя продолжительность жизни платформы 7.6 лет, медианная 7 лет. Минимальная продолжительность жизни платформы 1 год, максимальная 26 лет. Медианное количество релизов 247, всех продаж по платформам 200 млн. копий, а медиан по каждому релизу 310 тыс. копий.
На некоторых платформах со средней продолжительностью существования около 11 лет имеется ярко выраженное увеличение количества релизов в середине периода существования. Также на тех ж платформах в этот период наблюдается рост продаж, но более ярко выражено. Например, на платформе PS2
продажи в 2002-2004 годах существенно возрасли, а количество релизов увеличилось менее выражено. Пик роста количества релизов и продаж приходится на первую треть-середину периода существования платформы. Например, это наглядно на платформах DC
, PS
, PS2
, Wii
.
Исходя из вышесказанного, можно предположить, что платформы PS4
и XOne
находятся в середине своего срока существования. Зафикированный в датафрейме период их активности 5-6 лет, обрывающийся в 2016 году, когда данные прекратили собирать. С начала существования этих платфом наблюдается постепенное увеличение количества релизов, которое обрывается из-за обрыва истории данных. Если утверждение в этом пункте верное, то в начале-середине 2020-х годов можно ожидать снижение до минимума количества релизов на платформах PS4
и XOne
и их прекращение их существования.
О влиянии разных факторов на продажи в целом
Важное влияние на продажи имеет жанр игры. Так, игры в жанре Action
являются лидерами продаж. На этот жанр приходится 1716.52 млн. проданных копий игр. Далее в тройке лидиров с большим отрывом расположились игры в жанрах Sports
(1309.55 млн. продаж копий игр) и Shooter
(1041.35 млн. продаж копий игр). Замыкает рейтинг жанров Strategy
(172.57 млн. продаж копий игр). В отличии от жанров игр, от отзывов критиков продажи почти независимы. Это следует из отсутствия статистически значимой корреляция между отзывами критиков и пользователей с продажами на всех и отдельно взятых платформах. Важная особенность — не зависимо от оценки критиков большое количество значений продаж стремиться к минимуму.
Актуальный период для анализа
Учитывая тот факт, что мидана продолжительности существования платформы 7 лет, этот мериод можно считать показательным для прогнозирования дальнейшего развития игровой индустрии. Однако, для целей анализа выбран период в 4 года, которые существуют наиболее перспективные платформы PS4
и XOne
. Из анализа исключены платформы, на которых не было активности за полседние 4 лет.
Игровые платфомы в актуальный период
Наиболее перспективные с точки зрения возможного начала многолетнего жизненного цикла платформы PS4
и XOne
входят в пятерку платформ с максимальным третьим квартилем и медианой продаж копий игр одного релиза. Это означает, что платформы PS4
и XOne
наиоболее выгодны с точки зрения среднесрочных инвестиционных вложений.
Жанры в актуальный период
Наиболее интересный рынок игр в жанре Shooter
. Этот рынок входит в тройку по объему продаж и составляет 232.99 млн. проданных копий игр. На рынке этого жанра самая высокая медиана продаж на один релиз (450 тыс. копий игр) и не самая высокая активность по созданию релизов (187 релизов — это 5 место по количеству релизов).
Оценки критиков и пользователей в актуальный период Отсутствует статистически значимая корреляция между отзывами критиков и пользователей с продажами на всех и отдельно взятых платформах. Т.е. продажи от них почти независимы.
Шаг 4. Портрет пользователя каждого региона¶
Определение прортета для пользователя каждого региона (NA, EU, JP)
Самые популярные платформы (топ-5). Различия в долях от всего объема продаж¶
# Датафрейм с долями продаж по регионам
regions_sales_percent = pd.DataFrame()
regions_sales_percent['platform'] = games_actual['platform']
regions_sales_percent['na_sales'] = games_actual['na_sales'].fillna(0) / games_actual['total_sales'].fillna(0).sum()
regions_sales_percent['eu_sales'] = games_actual['eu_sales'].fillna(0) / games_actual['total_sales'].fillna(0).sum()
regions_sales_percent['jp_sales'] = games_actual['jp_sales'].fillna(0) / games_actual['total_sales'].fillna(0).sum()
regions_sales_percent['other_sales'] = games_actual['other_sales'].fillna(0) / games_actual['total_sales'].fillna(0).sum()
# Датафрейм с долями продаж по регионам
regions_sales_percent = pd.DataFrame()
regions_sales_percent['platform'] = games_actual['platform']
regions_sales_percent['na_sales'] = games_actual['na_sales'] / games_actual['total_sales'].sum()
regions_sales_percent['eu_sales'] = games_actual['eu_sales'] / games_actual['total_sales'].sum()
regions_sales_percent['jp_sales'] = games_actual['jp_sales'] / games_actual['total_sales'].sum()
regions_sales_percent['other_sales'] = games_actual['other_sales'] / games_actual['total_sales'].sum()
games_actual.info()
<class 'pandas.core.frame.DataFrame'> Int64Index: 2233 entries, 16 to 16714 Data columns (total 12 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 name 2233 non-null object 1 platform 2233 non-null object 2 year_of_release 2233 non-null uint16 3 genre 2233 non-null object 4 na_sales 2233 non-null float16 5 eu_sales 2233 non-null float16 6 jp_sales 2233 non-null float16 7 other_sales 2233 non-null float16 8 critic_score 991 non-null float16 9 user_score 1192 non-null float16 10 rating 2233 non-null object 11 total_sales 2233 non-null float64 dtypes: float16(6), float64(1), object(4), uint16(1) memory usage: 199.7+ KB
# Датафрейм с топ-5 платформ по долям продаж в каждом регионе
# Создание датафрейма
top5_platform_regions = pd.DataFrame(index=games_actual.platform.unique())
# Доли продаж в Северной Америке
top5_platform_regions['na_sales'] = regions_sales_percent.pivot_table(
index=regions_sales_percent.platform,
values='na_sales',
aggfunc='sum'
)['na_sales'].sort_values(
#by='na_sales',
ascending=False
).head(5)
# Доли продаж в Европе
top5_platform_regions['eu_sales'] = regions_sales_percent.pivot_table(
index=regions_sales_percent.platform,
values='eu_sales',
aggfunc='sum'
).sort_values(
by='eu_sales',
ascending=False
).head(5)
# Доли продаж в Японии
top5_platform_regions['jp_sales'] = regions_sales_percent.pivot_table(
index=regions_sales_percent.platform,
values='jp_sales',
aggfunc='sum'
).sort_values(
by='jp_sales',
ascending=False
).head(5)
# Доли продаж в других регионах
top5_platform_regions['other_sales'] = regions_sales_percent.pivot_table(
index=regions_sales_percent.platform,
values='other_sales',
aggfunc='sum'
).sort_values(
by='other_sales',
ascending=False
).head(5)
# Удаление из списка платформ тех, что не вошли в топ-5
top5_platform_regions = top5_platform_regions.dropna(how='all')
# Переименование столбцов для наглядности вывода и их сортировка
top5_platform_regions = top5_platform_regions.rename(columns={
'na_sales':'Северная Америка',
'eu_sales':'Европа',
'jp_sales':'Япония',
'other_sales':'Другие регионы'
}).sort_values(by='Северная Америка', ascending=False)
top5_platform_regions
Северная Америка | Европа | Япония | Другие регионы | |
---|---|---|---|---|
PS4 | 0.099670 | 0.129272 | 0.014633 | 0.044312 |
XOne | 0.085327 | 0.047272 | NaN | 0.013077 |
X360 | 0.074829 | 0.038971 | NaN | 0.011101 |
PS3 | 0.058197 | 0.062164 | 0.021408 | 0.024536 |
3DS | 0.035004 | 0.028381 | 0.062164 | 0.005756 |
WiiU | NaN | NaN | 0.009972 | NaN |
PSV | NaN | NaN | 0.017044 | NaN |
Разные платформы пользуются популярностью в разных регионах. Некоторые платформы популярны только в определенных регионах. Так, например, WiiU
популярна только в Японии. Некотоыре платформы входят в топ-5 всех исследуемых регионов, как, например, PS4
, занимающая большую долю продаж во всех исследуемых регионах.
print('Максимум:', top5_platform_regions.max().max())
print('Медиана :', top5_platform_regions.median().median())
print('Минимум :', top5_platform_regions.min().min())
Максимум: 0.1293 Медиана : 0.03217 Минимум : 0.005756
Медианная доля использования платформ из топ-5 в 3.22% приходится на использование платформы 3DS
в Северной Америке и Европе. Максимальная доля приходится в 12.93% приходится на PS4
в Европе. Минимальная доля в 0.57% приходится на 3DS
в других регионах.
top5_platform_regions.sum(axis=1).sort_values(ascending=False)
PS4 0.287842 PS3 0.166260 XOne 0.145630 3DS 0.131348 X360 0.124878 PSV 0.017044 WiiU 0.009972 dtype: float16
Самая популярная платформа во всех трех регионах PS4
. На нее приходится в общем 28.78% всех продаж.
# Тепловая карта топ-5 платформ по продажам в каждом регионе
ax = sns.heatmap(top5_platform_regions, annot=True)
ax.set(
ylabel='Платформы',
xlabel='Регионы',
title='Топ-5 платформ по объёму продаж в разных регионах'
);
Данный хитпэп подтвреждает ранее сделанный вывод о том, что PS4
лидирует почти во всех регионах по количеству продаж.
Выводы о топ-5 игровых платформ
Разные платформы пользуются популярностью в разных регионах. Некоторые платформы популярны только в определенных регионах. Так, например, WiiU
популярна только в Японии. Некотоыре платформы входят в топ-5 всех исследуемых регионов, как, например, PS4
, занимающая большую долю продаж во всех исследуемых регионах. Платформа PS4
самая популярная почти во всех анализируемых регионах. На нее приходится в общем 28.78% всех продаж.
Самые популярные жанры (топ-5)¶
# Датафрейм с топ-5 жанров по продажам в каждом регионе
# Создание датафрейма
top5_genre_regions = pd.DataFrame(index=games_actual.genre.unique())
# Жанры-лидеры в Северной Америке
top5_genre_regions['na_sales'] = games_actual.pivot_table(
index='genre',
values=('na_sales'),
aggfunc='sum'
)['na_sales'].sort_values(
#by='na_sales',
ascending=False
).head(5)
# Жанры-лидеры в Европе
top5_genre_regions['eu_sales'] = games_actual.pivot_table(
index='genre',
values=('eu_sales'),
aggfunc='sum'
).sort_values(
by='eu_sales',
ascending=False
).head(5)
# Жанры-лидеры в Японии
top5_genre_regions['jp_sales'] = games_actual.pivot_table(
index='genre',
values=('jp_sales'),
aggfunc='sum'
).sort_values(
by='jp_sales',
ascending=False
).head(5)
# Жанры-лидеры в других регионах
top5_genre_regions['other_sales'] = games_actual.pivot_table(
index='genre',
values=('other_sales'),
aggfunc='sum'
).sort_values(
by='other_sales',
ascending=False
).head(5)
# Удаление жанров, не вошедшиж в топ-5 регионов
top5_genre_regions = top5_genre_regions.dropna(how='all')
# Переименование столбцов для наглядности вывода
top5_genre_regions = top5_genre_regions.rename(columns={
'na_sales':'Северная Америка',
'eu_sales':'Европа',
'jp_sales':'Япония',
'other_sales':'Другие регионы'
})
top5_genre_regions
Северная Америка | Европа | Япония | Другие регионы | |
---|---|---|---|---|
Action | 126.062500 | 118.12500 | 40.500000 | 37.187500 |
Shooter | 109.750000 | 87.87500 | 6.609375 | 28.765625 |
Role-Playing | 46.406250 | 36.96875 | 51.031250 | 11.476562 |
Misc | 27.484375 | NaN | 9.203125 | 6.089844 |
Sports | 65.250000 | 60.53125 | NaN | 19.453125 |
Fighting | NaN | NaN | 7.648438 | NaN |
Racing | NaN | 20.18750 | NaN | NaN |
3 жанра входят в топ-5 по объёму продаж во всех анализируемых регионов: Action
, Sports
, Role-Playing
. При этом, игры в жанре Action
лидируют по объёмам продаж в Северной Америке (126.06 млн. продаж), Европе (118.13 млн. копий) и «других» регионах. Самые «экзотичные» жанры Fighting
, который популярен только в Японии (7.65 млн. копий игр), и Racing
только в Европе (20.19 млн. копий игр).
print('Максимум:', top5_genre_regions.max().max())
print('Медиана :', top5_genre_regions.median().median())
print('Минимум :', top5_genre_regions.min().min())
Максимум: 126.06 Медиана : 40.0 Минимум : 6.09
Жанр Action
, входящий в топ-5 всех исследуемых регионов, максимально популярен в Северной Америке. Там продано 126.06 млн. копий игр в этом жанре за все время исследований. Продажи игр в жанре Misc
в других регионах замыкает рейтинг жанров, входящих в топ-5 всех регионов.
top5_genre_regions.sum(axis=1).sort_values(ascending=False)
Action 322.000000 Shooter 233.000000 Role-Playing 145.875000 Sports 145.250000 Misc 42.781250 Racing 20.187500 Fighting 7.648438 dtype: float16
Самым популярным жанром игр во всех анализируемых регионах является Action
. На него приходится 322 млн. проданных копий игр за актуальные четыре голов исследований.
# Тепловая карта топ-5 жанров по продажам в регионах
ax = sns.heatmap(top5_genre_regions, annot=True)
ax.set(
ylabel='Жанры',
xlabel='Регионы',
title='Топ-5 жанров по объёму продаж в разных регионах'
);
3 жанра входят в топ-5 объёма продаж во всех рассматриваемых регионах: Action
, Shooter
, Role-Playing
. 2 жанра популярны только в одном регионе. Так Racing
популярен только в Европе, а Fighting
в Японии. Жанр Action
, входящий в топ-3 всех исследуемых регионов, максимально популярен в Северной Америке. Там продано 1.3 млн. копий игр в этом жанре, что является абсолютным максимум за актуальный период.
# Пироги для наглядности
for i in top5_genre_regions.columns:
plot = top5_genre_regions[i].plot.pie(
y='genre',
#figsize=(2, 2),
subplots=True,
autopct='%.2f'
)
plt.show()
Общая доля количества продаж игр в жанре Action
во всех регионах большая. Общая доля продаж в жанрах Role-Playing
и Shooter
кратно отличается в разных регионах.
Выводы о топ-5 жанров игр
3 жанра входят в топ-5 по объёму продаж во всех анализируемых регионов: Action
, Sports
, Role-Playing
. При этом, игры в жанре Action
лидируют по объёмам продаж в Северной Америке (126.06 млн. продаж), чуть менее в Европе (118.13 млн. копий) и «других» регионах. Всего на него приходится 322 млн. проданных копий игр.
2 жанра популярны только в одном регионе. Так Racing
популярен только в Европе, а Fighting
в Японии. Самые «экзотичные» жанры Fighting
, который популярен только в Японии (7.65 млн. копий игр), и Racing
только в Европе (20.19 млн. копий игр).
Влияет ли рейтинг ESRB на продажи в отдельном регионе?¶
# Датафрейм с топ-5 рейтинга ESRB по долям продаж в каждом регионе
# Создание датафрейма
top5_rating_regions = pd.DataFrame(index=games_actual.rating.unique())
# Количство разных рейтинговых значений в Севрной Америке
top5_rating_regions['na_sales'] = games_actual.pivot_table(
index='rating',
values=('na_sales'),
aggfunc='sum'
)['na_sales'].sort_values(
#by='na_sales',
ascending=False
).head(5)
# Количство разных рейтинговых значений в Европе
top5_rating_regions['eu_sales'] = games_actual.pivot_table(
index='rating',
values=('eu_sales'),
aggfunc='sum'
).sort_values(
by='eu_sales',
ascending=False
).head(5)
# Количство разных рейтинговых значений в Японии
top5_rating_regions['jp_sales'] = games_actual.pivot_table(
index='rating',
values=('jp_sales'),
aggfunc='sum'
).sort_values(
by='jp_sales',
ascending=False
).head(5)
# Количство разных рейтинговых значений в других регионах
top5_rating_regions['other_sales'] = games_actual.pivot_table(
index='rating',
values=('other_sales'),
aggfunc='sum'
).sort_values(
by='other_sales',
ascending=False
).head(5)
print(top5_rating_regions.head())
# Удаление из списка платформ тех, что не вошли в топ-5
top5_rating_regions = top5_rating_regions.dropna(how='all')
# Переименование столбцов для наглядности вывода
top5_rating_regions = top5_rating_regions.rename(columns={
'na_sales':'Северная Америка',
'eu_sales':'Европа',
'jp_sales':'Япония',
'other_sales':'Другие регионы'
})
top5_rating_regions
na_sales eu_sales jp_sales other_sales M 165.25000 145.3750 14.109375 47.031250 no_ESRB 89.43750 78.9375 85.062500 23.468750 E 79.06250 83.3750 15.140625 22.609375 T 49.78125 41.9375 20.593750 14.289062 E10+ 54.25000 42.6875 5.890625 12.570312
Северная Америка | Европа | Япония | Другие регионы | |
---|---|---|---|---|
M | 165.25000 | 145.3750 | 14.109375 | 47.031250 |
no_ESRB | 89.43750 | 78.9375 | 85.062500 | 23.468750 |
E | 79.06250 | 83.3750 | 15.140625 | 22.609375 |
T | 49.78125 | 41.9375 | 20.593750 | 14.289062 |
E10+ | 54.25000 | 42.6875 | 5.890625 | 12.570312 |
Топ-5 рейтинга: M
(Mature — Для взрослых), no_ESRB
(игр без рейтинга), E
(Everyone — Для всех), T
(Teen — Подросткам) и E10+
(Everyone 10 and older — Для всех от 10 лет и старше). Во всех регионах, кроме Японии, по объёмам продаж лидируют игры с рейтингом M
. В Японии лидируют продажи игр с без рейтинга (no_ESRB
).
# Топ-5 значений рейтинга ESRB с продажами по всем платформам
top5_rating_regions.sum(axis=1).sort_values(ascending=False)
M 371.5000 no_ESRB 277.0000 E 200.2500 T 126.6875 E10+ 115.3750 dtype: float16
Самые продоваемые игры имеют рейтинг M
. С его маркировкой во всех анализируемых регионах продано 371.5 млн. копий игр. Игры без рейтинга (no_ESRB
) находимся на втором месте по продаваемости.
# Тепловая карта топ-5 значений рейтинга ESRB по продажам в регионах
ax = sns.heatmap(top5_rating_regions, annot=True)
ax.set(
ylabel='Рейтинг ESRB',
xlabel='Регионы',
title='Топ-5 значений рейтинга ESRB по продажам в регионах'
);
Выводы о топ-5 рейтинга
Подажи игр с маркировкой M
(Mature — Для взрослых) в Серной Америке и Европе значительно превосходят игры других категорий и в других регионах. Аналогичная контрастов, но только в Японии, наблюдается с проводами игр без маркировки (no_ESRB
).
# Комментарий ревьюера
temp = games.copy()
print(temp.rating.isna().sum(), temp.rating.isna().sum()/len(temp))
temp.rating.value_counts()
0 0.0
no_ESRB 6676 E 3923 T 2905 M 1536 E10+ 1393 EC 8 RP 1 AO 1 Name: rating, dtype: int64
Итоги анализа портрета потребителя в разных регионах¶
Топ-5 игровых платформ
Разные платформы пользуются популярностью в разных регионах. Некоторые платформы популярны только в определенных регионах. Так, например, WiiU
популярна только в Японии. Некотоыре платформы входят в топ-5 всех исследуемых регионов, как, например, PS4
, занимающая большую долю продаж во всех исследуемых регионах. Платформа PS4
самая популярная почти во всех анализируемых регионах. На нее приходится в общем 28.78% всех продаж.
Топ-5 жанров
3 жанра входят в топ-5 всех трех регионов: Action
, Sports
, Misc
. 2 жанра популярны только в одном регионе. Так Racing
популярен только в Европе, а Role-Playing
в Японии. Жанр Action
, входящий в топ-5 всех исследуемых регионов, максимально популярен в Северной Америке. Там продано 863 млн. копий игр в этом жанре за все время исследований, а во всех трех регионах 1534 млн. копий. Продажи игр в жанре Misc
в Японии замыкает рейтинг жанров, входящих в топ-5 всех регионов.
Топ-5 рейтинга
Топ-5 рейтинга: M
(Mature — Для взрослых), no_ESRB
(игры без рейтинга), E
(Everyone — Для всех), T
(Teen — Подросткам) и E10+
(Everyone 10 and older — Для всех от 10 лет и старше). Во всех регионах, кроме Японии, по объёмам продаж лидируют игры с рейтингом M
. В Японии лидируют продажи игр с без рейтинга (RP
).
Самые продоваемые игры имеют рейтинг M
. С его маркировкой во всех анализируемых регионах продано 371.5 млн. копий игр. Игры без рейтинга (no_ESRB
) находимся на втором месте по продаваемости.
Подажи игр с маркировкой M
(Mature — Для взрослых) в Серной Америке и Европе значительно превосходят игры других категорий и в других регионах. Аналогичная контрастов, но только в Японии, наблюдается с проводами игр без маркировки (no_ESRB
).
Портреты пользователей
Пользователь из Северной Америки в 2016 году предпочитает игры по мере уменьшения интереса в жанрах Action
, Shooter
, Sports
, Role-Playing
, Misc
с рейтингом M
, no_ESRB
, E
, E10+
, T
на платформах PS4
, XOne
, X360
, PS3
, 3DS
.
Пользователь из Европы в 2016 году предпочитает игры по мере уменьшения интереса в жанрах Action
, Shooter
, Sports
, Role-Playing
, Racing
, с рейтингом M
, E
, no_ESRB
, E10+
, T
на платформах PS2
, PS3
, X360
, Wii
, PS
.
Пользователь из Японии в 2016 году предпочитает игры по мере уменьшения интереса в жанрах Role-Playing
, Action
, Misc
, Fighting
, Shooter
с рейтингом no_ESRB
, T
, E
, M
, E10+
на платформах 3DS
, PS3
, PSV
, PS4
, WiiU
.
Пользователь из других регионов в 2016 году предпочитает игры по мере уменьшения интереса в жанрах Action
, Shooter
, Sports
, Role-Playing
, Misc
с рейтингом M
, no_ESRB
, E
, T
, E10+
на платформах PS4
, PS3
, XOne
, X360
, 3DS
.
Шаг 5. Проверка гипотез¶
В качестве нулевой гипотезы в обоих ниже приведенных задачах будет проверяться равенство срендних значений двух параметров. В качестве альтернативной гипотезы отсутствие их равенства. В качестве критерия проверки гипотезы будет использоваться пороговое значение $\alpha = 0.5$. Подобное значение выбрано из двух общепринятых 0.1 и 0.5, в свзи с тем, что проверяются значения не требующие высокой точности.
Средние пользовательские рейтинги платформ Xbox One и PC одинаковые¶
Нулевая и альтернативная гипотезы:
Гипотеза Н0: Средние пользовательские рейтинги платформ Xbox One и PC одинаковые.
Гипотеза Н1: Средние пользовательские рейтинги платформ Xbox One и PC не одинаковые.
results = st.ttest_ind(
games_actual.loc[games_actual['platform'] == 'XOne', 'user_score'].dropna(),
games_actual.loc[games_actual['platform'] == 'PC', 'user_score'].dropna(),
equal_var=False,
alternative='two-sided'
)
print(results.pvalue)
if results.pvalue < .05:
print('Отвергаем нулевую гипотезу')
else:
print('Не получилось отвергнуть нулевую минуту')
0.14414213365247552 Не получилось отвергнуть нулевую минуту
Вывод. Не получилось отвергнуть нулевую гипотезу о том, что средние пользовательские рейтинги платформ Xbox One и PC одинаковые.
Средние пользовательские рейтинги жанров Action (англ. «действие», экшен-игры) и Sports (англ. «спортивные соревнования») разные¶
Нулевая и альтернативная гипотезы:
Гипотеза Н0: Средние пользовательские рейтинги жанров Action и Sports одинаковые.
Гипотеза Н1: Средние пользовательские рейтинги платформ Action и Sports не одинаковые.
results = st.ttest_ind(
games_actual.loc[games_actual['genre'] == 'Action', 'user_score'].dropna(),
games_actual.loc[games_actual['genre'] == 'Sports', 'user_score'].dropna(),
equal_var=False,
alternative='two-sided'
)
print(results.pvalue)
if results.pvalue < .05:
print('Отвергаем нулевую гипотезу')
else:
print('Не получилось отвергнуть нулевую минуту')
1.5566794221869148e-20 Отвергаем нулевую гипотезу
Вывод. Отвергаем нулевую гипотезу о том, что средние пользовательские рейтинги жанров Action
и Sports
одинаковые.
# Визуализация результата задачи
games.loc[
(games['genre'] == 'Action') |
(games['genre'] == 'Sports')
].astype({
'user_score':'float64'
}).pivot_table(
index='platform',
columns='genre',
values='user_score',
aggfunc='mean'
)
genre | Action | Sports |
---|---|---|
platform | ||
3DS | 6.555897 | 5.783529 |
DC | NaN | 6.000000 |
DS | 6.522830 | 7.380469 |
GBA | 7.379936 | 7.841694 |
GC | 7.544298 | 7.792682 |
PC | 7.035785 | 5.875686 |
PS | 7.426855 | 8.087402 |
PS2 | 7.637054 | 7.653393 |
PS3 | 6.901560 | 6.166070 |
PS4 | 6.933194 | 5.757394 |
PSP | 7.174121 | 6.966514 |
PSV | 7.178773 | 6.510959 |
Wii | 6.798373 | 6.746998 |
WiiU | 6.933464 | 5.756975 |
X360 | 6.848961 | 6.291492 |
XB | 7.239496 | 8.009671 |
XOne | 6.708653 | 5.567498 |
Итоги проверки гипотез¶
Гипотеза о том, что средние пользовательские рейтинги платформ Xbox One и PC одинаковые, не отергнута. Это значит, что с высокой вероятностью средние пользовательские рейтинги этих платформ одинаковые. Гипотезу о том, что средние пользовательские рейтинги жанров Action
и Sports
одинаковые, удалось отвергнуть. Из этого следует, что есть вероятность того, что средние пользовательские рейтинги жанров Action
и Sports
разные.
Шаг 6. Общий вывод¶
В датафрейме всего 11 столбцов и 16715 строк. 7 столбцов содержат пропуски. Вес датафрейма 1.4 Мб. В данных наблюдаются пропуски. Строки с пропуском в названии игры требуется удалить, т.к. во многих аттрибутах этих объектов пропуски. Названия столбцов в датафрейме выполнены не в «змеином» стиле. Можно изменить типы данных столбцов:
Year_of_Release
наuint16
, т.к. года являются четырёхзначными натуральными числами;NA_sales
,EU_sales
,JP_sales
,Other_sales
,Critic_Score
иUser_Score
наfloat16
, т.к. в этих столбцах использованы рациональные числа небольшой размерности.
О столбце с рейтингом ESRB
В рейтингах присутствуют пропуски и устаревшее значение K-A
, которое для актуализации требуется заменить на E
.
Всего наблюдается 6766 пропусков в столбце Rating
, что составляет 40.48% от всего количества значений. Вывод части датафрейма показал, что пропуски в столбце Critic_Score
иногда совпадают с пропусками в столбцах Critic_Score
и User_Score
.
Не обнаружено какой-либо зависимости пропусков в Rating
, Critic_Score
и User_Score
от значений в столбцах Name
, Platform
, Year_of_Release
или Genre
. Согласно мнению пользователей (не экспертов) ресурса gaming.stackexchange.com отсутствие рейтинга может свидетельствовать о нежелании владельцев рейтинга ESRB устанавливать метки со своим рейтингом на играх, которые имеют очень разнообразное содержание для разных возрастных групп, которое зависит от определенных условий использования игры (https://gaming.stackexchange.com/questions/27940/why-doesnt-esrb-rate-online-games, 2023). Строки с подобными пропусками можно оставить в датафрейме для дальнейшего анализа. Отсутствие данных в них — это информация о том, что ни рейтинговое агентство ESRB, ни эксперты, ни пользователи, не захотели или не смогли охарактеризовать эти игры.
В тех же случаях, где пропуски в Rating
, Critic_Score
и User_Score
совпадают с пропусками в Year_of_Release
, это может означать, что игра еще не выпущена в продажу. Это подтверждается нулевыми медианными продажами почти во всех регионах. Наличие медианных продаж в Северной Америке в размере 10 тыс. копий игр может означать их продажу с целью изучения рынка. Строкам с подобными данными можно дать рейтинг no_ESRB
(игры без рейтинга), что будет уместно. Либо, удалить их из датафрейма, т.к. они не несут в себе полезной информации для дальнейшего анализа.
Результаты обработки данных
В датафрейме заменены и удалены критичные пропуски в данных, которые не позволили бы конвертировать столбцы в более приемлемые типы данных. Так, в user_score
значения tbd
заменены на np.nan
, а в year_of_release
пропуски nan
были удалены. Последнее позволило избавиться от строк с данными об играх, которые еще не поступили в полномасштабную продажу. Также удалены строки с пропусками в столбце name
. После удаления строк с пропусками потеряно только 1.6% всех строк датафрейма, что не является критичным для анализа. В остальных столбцах пропуски не изменены для корректного общего представления о данных при расчётах. В каждом отдельном случае можно исключить из расчётов строки с пропусками в столбцах, участвующих в расчётах.
Пропущенные рейтинги заменены на рейтинг RP (Rating Pending — Рейтинг ожидается). Исходим из того, что не классифицированная по рейтингу игра и ожидающая рейтинга — это одно и тоже.
Неявные дубликаты строк с игрой Madden NFL 13
на платформе PS3
, выпущенной в 2012 году, обработаны путем сложения данных о продажах в Европе и удаления второй повторяющейся строки. Три устаревших значения рейтинга K-A
в столбце rating
заменено на E
.
Типы данных в 7 столбцах изменены. Благодаря этому размер датафрейма уменьшен почти в 2 раза до 867.3 Кб. Успешно добавлен стобец с total_sales
с типом данных float64
, содержащий суммы всех продаж каждого релиза по всем регионам, включая other_sales
, измеряемая в миллионах копий игр. Все названия столбцов датафрейма привередны к нижнему регистру для соответствия «змеиному стилю».
Результаты исследовательского анализа данных
За все время анализа наблюдается плавный рост количества релизов игр от года к году с 1980 по 2008 год. Затем наблюдается спад. Аналогично ведёт себя общее количество продаж копий игр в исследуемых регионах. Однако, этой тенденции не подвержены медианныые значения продаж копий игр в год.
Учитывая тот факт, что мидана продолжительности существования платформы 7 лет, этот мериод можно считать показательным для прогнозирования дальнейшего развития игровой индустрии. Однако, для целей анализа выбран период в 4 года, которые существуют наиболее перспективные с точки зрения возможного продолжения многолетнего жизненного цикла платформы PS4
и XOne
. Эти перспективные платформы входят в пятерку платформ с максимальным третьим квартилем и медианой продаж копий игр одного релиза. Это означает, что платформы PS4
и XOne
наиоболее выгодны с точки зрения среднесрочных инвестиционных вложений.
Для инвестиций важна не только платформа, но и жанр игры. Наиболее интересный рынок игр в жанре Shooter
. Этот рынок входит в тройку по объему продаж и составляет 232.99 млн. проданных копий игр в актуальный период. На рынке этого жанра самая высокая медиана продаж на один релиз (450 тыс. копий игр) и не самая высокая активность по созданию релизов (187 релизов — это 5 место по количеству релизов). Можно сделать вывод о том, что в 2017 году наиболее перспективно развивать игры в жанре Shooter
на платформах PS4
и XOne
. При этом, не следует особого внимания уделять экспертным и пользователским оценкам, т.к. не обнаружена статистически значимая корреляция их с продажами на всех и отдельно взятых платформах.
Топ-5 игровых платформ
Разные платформы пользуются популярностью в разных регионах. Некоторые платформы популярны только в определенных регионах. Так, например, WiiU
популярна только в Японии. Некотоыре платформы входят в топ-5 всех исследуемых регионов, как, например, PS4
, занимающая большую долю продаж во всех исследуемых регионах. Платформа PS4
самая популярная почти во всех анализируемых регионах. На нее приходится в общем 28.78% всех продаж.
Топ-5 жанров
3 жанра входят в топ-5 всех трех регионов: Action
, Sports
, Misc
. 2 жанра популярны только в одном регионе. Так Racing
популярен только в Европе, а Role-Playing
в Японии. Жанр Action
, входящий в топ-5 всех исследуемых регионов, максимально популярен в Северной Америке. Там продано 863 млн. копий игр в этом жанре за все время исследований, а во всех трех регионах 1534 млн. копий. Продажи игр в жанре Misc
в Японии замыкает рейтинг жанров, входящих в топ-5 всех регионов.
Топ-5 рейтинга
Топ-5 рейтинга: M
(Mature — Для взрослых), no_ESRB
(игры без рейтинга), E
(Everyone — Для всех), T
(Teen — Подросткам) и E10+
(Everyone 10 and older — Для всех от 10 лет и старше). Во всех регионах, кроме Японии, по объёмам продаж лидируют игры с рейтингом M
. В Японии лидируют продажи игр с без рейтинга (no_ESRB
).
Самые продоваемые игры имеют рейтинг M
. С его маркировкой во всех анализируемых регионах продано 371.5 млн. копий игр. Игры без рейтинга (no_ESRB
) находимся на втором месте по продаваемости.
Подажи игр с маркировкой M
(Mature — Для взрослых) в Серной Америке и Европе значительно превосходят игры других категорий и в других регионах. Аналогичная контрастов, но только в Японии, наблюдается с проводами игр без маркировки (no_ESRB
).
Портреты пользователей
Пользователь из Северной Америки в 2016 году предпочитает игры по мере уменьшения интереса в жанрах Action
, Shooter
, Sports
, Role-Playing
, Misc
с рейтингом M
, no_ESRB
, E
, E10+
, T
на платформах PS4
, XOne
, X360
, PS3
, 3DS
.
Пользователь из Европы в 2016 году предпочитает игры по мере уменьшения интереса в жанрах Action
, Shooter
, Sports
, Role-Playing
, Racing
, с рейтингом M
, E
, no_ESRB
, E10+
, T
на платформах PS2
, PS3
, X360
, Wii
, PS
.
Пользователь из Японии в 2016 году предпочитает игры по мере уменьшения интереса в жанрах Role-Playing
, Action
, Misc
, Fighting
, Shooter
с рейтингом no_ESRB
, T
, E
, M
, E10+
на платформах 3DS
, PS3
, PSV
, PS4
, WiiU
.
Пользователь из других регионов в 2016 году предпочитает игры по мере уменьшения интереса в жанрах Action
, Shooter
, Sports
, Role-Playing
, Misc
с рейтингом M
, no_ESRB
, E
, T
, E10+
на платформах PS4
, PS3
, XOne
, X360
, 3DS
.
Проверка гипотез
Гипотеза о том, что средние пользовательские рейтинги платформ Xbox One и PC одинаковые, не отергнута. Это значит, что с высокой вероятностью средние пользовательские рейтинги этих платформ одинаковые. Гипотезу о том, что средние пользовательские рейтинги жанров Action
и Sports
одинаковые, удалось отвергнуть. Из этого следует, что есть вероятность того, что средние пользовательские рейтинги жанров Action
и Sports
разные.
Коммерческое предложение
Предлагается развита игры в жанре Shooter
с рейтингом M
на платформах PS4
и XOne
в Северной Америке или Европе.