EDA๋ ์ ์ฒ๋ฆฌ ๋จ๊ณ์์ ์ ์ ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ๋ถ์ํ๊ณ ํผ์ฒ ์์ง๋์ด๋ง(feature enginnering)์ผ๋ก ๋๊ฒจ ์ฃผ๋ ์ญํ ์ ๋๋ค๋ง ์ ์ฒ๋ฆฌ์ ์ผ๋ถ๋ EDA๋ฅผ ์งํํด์ผ ํ ์ ์๊ณ ํผ์ฒ ์์ง๋์ด๋ง ์ญ์ EDA์ ํผ์ฌ๋์ด์๊ธฐ ๋๋ฌธ์ ์ค์ ๋ช ํํ๊ฒ ๊ตฌ๋ถ๋๋ ๊ณผ์ ์ ์๋๋๋ค.
์ด๋ฒ ํ์์์ ์ ์ฒ๋ฆฌ๋ ์ฃผ๋ก ์ด์์น์ ๊ฒฐ์ธก๊ฐ ์ฒ๋ฆฌ ๋ฑ์ ์ฃผ๋ก ์ดํด๋ณผ ์์ ์ด๋ฉฐ EDA์ ๊ธฐ๋ณธ์ด๋ผ๊ณ ํ ์ ์๋ ๊ธฐ์ด ํต๊ณ๋์ ํ์ธํ๋ ๊ฒ๋ถํฐ ๋ฐ์ดํฐ์ ํน์ง(feature)๋ฅผ ์ฐพ์๋ด๋ ๊ณผ์ ๊น์ง ํจ๊ป ๊ณต๋ถํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์ฌ๊ธฐ์ ๊ธฐ์ด ํต๊ณ๋์ด๋ ๋ฐ์ดํฐ์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ํน์ง์ธ ํ๊ท , ๋ถ์ฐ, ํธ์ฐจ ๋ฑ์ ์ผ์ปท์ง๋ง ๊ฒฝ์ฐ์ ๋ฐ๋ผ์ ๋ค์ฏ ์์น ์์ฝ, ์๋, ์ฒจ๋ ๋ฑ์ ํฌํจํ๊ธฐ๋ ํฉ๋๋ค.
๋ณธ ์์ ์์๋ Fundamental 9. ๋ค์ํ ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ ๊ธฐ๋ฒ์์ ์๊ฐ๋ ์บ๊ธ Video Game Sales ๋ฐ์ดํฐ์ ์ผ๋ถ๋ฅผ ๋ณํํ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
from scipy.stats import norm
from sklearn.preprocessing import StandardScaler
from scipy import stats
import warnings
warnings.filterwarnings('ignore')
%matplotlib inline
df = pd.read_csv("./data/vgsales_lecture.csv")
์ด๋ฒ ํ์์์๋ ํ๋ค์ค ์๋ฆฌ์ฆ / ๋ฐ์ดํฐํ๋ ์์ ์ด์ฉํ๋๋ก ํ๊ฒ ์ต๋๋ค.
ํ๋ค์ค๋ ์ฌ๋ฌ๊ฐ์ง ํจ์๋ฅผ ์ ๊ณตํ๋ฉฐ ๋ฐ์ดํฐ ์กฐ์ ๋ฐ EDA๋ฅผ ๋น ๋ฅด๊ณ ์์ฝ๊ฒ ์งํํ ์ ์๋๋ก ๋์์ฃผ๋ ๋๊ตฌ์ ๋๋ค.
์๋์๋ ๋ช๊ฐ์ง ํจ์๋ฅผ ํตํด ์ดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
info ํจ์๋ ์ด ๋ฐ์ดํฐ ์์ ๋ฐ์ดํฐ ํ์ ์ ๋ํ ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค.
์๋์์ ์กฐ๊ธ ๋ ์ดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 16598 entries, 0 to 16597
Data columns (total 11 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Rank 16598 non-null int64
1 Name 16598 non-null object
2 Platform 16598 non-null object
3 Year 16327 non-null object
4 Genre 16598 non-null object
5 Publisher 16335 non-null object
6 NA_Sales 12099 non-null float64
7 EU_Sales 10870 non-null float64
8 JP_Sales 6141 non-null float64
9 Other_Sales 10123 non-null float64
10 Global_Sales 16596 non-null float64
dtypes: float64(5), int64(1), object(5)
memory usage: 1.4+ MB
์์ผ๋ก ์ฃผ๊ตฌ์ฅ์ฐฝ ๋ณด๊ฒ๋์ค head ํจ์๋ ๋ฐ์ดํฐ๋์ด ๋ง์๋ ์์ ๋ช๊ฐ๋ง ๊ณจ๋ผ์ ๋ณผ ์ ์๋ ํจ์์ ๋๋ค.
๋ฐ๋๋ก ๋ค์์ ๋ฝ์์ค๋ tail์ด๋ ํจ์๋ ์์ต๋๋ค.
df.head()
Rank | Name | Platform | Year | Genre | Publisher | NA_Sales | EU_Sales | JP_Sales | Other_Sales | Global_Sales | |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | Wii Sports | Wii | 2006 | Sports | Nintendo | 41.49 | 29.02 | 3.77 | 8.46 | 82.74 |
1 | 2 | Super Mario Bros. | NES | 1985 | Platform | Nintendo | 29.08 | 3.58 | 6.81 | 0.77 | 40.24 |
2 | 3 | Mario Kart Wii | Wii | 2008 | Racing | Nintendo | 15.85 | 12.88 | 3.79 | 3.31 | 35.82 |
3 | 4 | Wii Sports Resort | Wii | 2009 | Sports | Nintendo | 15.75 | 11.01 | 3.28 | 2.96 | 33.00 |
4 | 5 | Pokemon Red/Pokemon Blue | GB | 1996 | Role-Playing | Nintendo | 11.27 | 8.89 | 10.22 | 1.00 | 31.37 |
unique ํจ์๋ ํจ์ ์ด๋ฆ์ฒ๋ผ ์ค๋ณต๊ฐ์ ์ ํ๊ณ ๋จ์ ๊ฒ๋ค๋ง ๋ณด์ฌ์ค๋๋ค.
์๋ฆฌ์ฆ์์ ์ฌ์ฉํ๋ ํจ์๋ก ๋ฐ์ดํฐ ํ๋ ์์์ nunique() ํจ์๋ฅผ ์ฌ์ฉํด์ค ์ ์์ง๋ง ๊ฐฏ์๋ง์ ์นด์ดํธํด์ค๋๋ค.
df.nunique()
Rank 16598
Name 11493
Platform 33
Year 40
Genre 14
Publisher 577
NA_Sales 408
EU_Sales 304
JP_Sales 243
Other_Sales 156
Global_Sales 623
dtype: int64
df["Platform"].unique()
array(['Wii', 'NES', 'GB', 'DS', 'X360', 'PS3', 'PS2', 'SNES', 'GBA',
'3DS', 'PS4', 'N64', 'PS', 'XB', 'PC', '2600', 'PSP', 'XOne', 'GC',
'WiiU', 'GEN', 'DC', 'PSV', 'SAT', 'SCD', 'WS', 'NG', 'TG16',
'2007', '3DO', 'GG', '2010', 'PCFX'], dtype=object)
# ์๋์ ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ ๋น์ฐํ ์ผ์
๋๋ค.
# df.unique()
๋ง์ง๋ง์ผ๋ก describe๋ ์์ฝ ํต๊ณ๋ฅผ ํ ๋ฒ์ ๋ณด์ฌ์ค๋๋ค.
describe ์ญ์ ์ฌ๋ฌ๊ฐ์ง ํ๋ผ๋ฏธํฐ๊ฐ ์์ง๋ง ํด๋น ๋ถ๋ถ์ ํ๋ค์ค ๋ฌธ์๋ฅผ ์ฐธ์กฐํด์ฃผ์ธ์.
df.describe()
Rank | NA_Sales | EU_Sales | JP_Sales | Other_Sales | Global_Sales | |
---|---|---|---|---|---|---|
count | 16598.000000 | 12099.000000 | 10870.000000 | 6141.000000 | 10123.000000 | 16596.000000 |
mean | 8300.605254 | 0.363084 | 0.223942 | 0.210210 | 0.078818 | 0.537498 |
std | 4791.853933 | 0.937693 | 0.610455 | 0.480352 | 0.236416 | 1.555113 |
min | 1.000000 | 0.010000 | 0.010000 | 0.010000 | 0.010000 | 0.010000 |
25% | 4151.250000 | 0.060000 | 0.020000 | 0.030000 | 0.010000 | 0.060000 |
50% | 8300.500000 | 0.140000 | 0.070000 | 0.070000 | 0.030000 | 0.170000 |
75% | 12449.750000 | 0.350000 | 0.200000 | 0.190000 | 0.070000 | 0.470000 |
max | 16600.000000 | 41.490000 | 29.020000 | 10.220000 | 10.570000 | 82.740000 |
ํ๋ค์ค ๋ฌธ์์ ์ฃผ์๋ ์๋์ ๊ฐ์ต๋๋ค.
https://pandas.pydata.org/docs/reference/index.html
์ฐ์ธก ๋ชฉ๋ก์์ dataframe ํน์ series์ ์ด์ด๋ณด๋ฉด ์๋ง์ ํจ์๋ค์ด ์์ ๊ฒ์ ๋๋ค.
โ(์กฐ๋ณํ์ต)์ง๊ธ๋ถํฐ๋ ์กฐ๋ณ๋ก ์์ describe ํจ์ ๊ฒฐ๊ณผ๊ฐ์ ํ๋์ฉ ์ด๋ค ์ฝ๋๋ฅผ ํตํด ๊ตฌํํด๋ผ ์ ์์์ง ๊ณ ๋ฏผํด๋ด ์๋ค.
๊ทธ๋ผ ์ด๋ฒ์ ์ด์์น๋ฅผ ํ์ํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ ๊ฐ์ด ๋งค์ฐ ํฌ๊ฑฐ๋ ๋งค์ฐ ์์ ๊ฒฝ์ฐ๋ฅผ ์๋ฏธํ๊ธฐ ๋๋ฌธ์ ๊ทธ๋ํ๋ฅผ ํตํด, ํน์ z-score ๋ฑ์ ํตํด์ ์ฐพ์๋ด๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด์ง๋ง ์ฐ๋์ ๊ฒฝ์ฐ ๊ฐ์ ์ข ๋ฅ ์์ฒด๊ฐ ๋ง์ง ์๊ธฐ ๋๋ฌธ์ ํ ๋ฒ ๋ฐ์ดํฐ๋ฅผ ๋ฝ์๋ณด๊ฒ ์ต๋๋ค.
df["Year"].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', '2003', '1986', '2000', nan, '1995',
'2016', '1991', '1981', '1987', '1980', '1983', '2020',
'Adventure', '2017'], dtype=object)
df[df["Year"]=="Adventure"]
Rank | Name | Platform | Year | Genre | Publisher | NA_Sales | EU_Sales | JP_Sales | Other_Sales | Global_Sales | |
---|---|---|---|---|---|---|---|---|---|---|---|
11593 | 11595 | Boku no Natsuyasumi 3: Hokkoku Hen: Chiisana B... | 2007 | Adventure | Sony Computer Entertainment | NaN | NaN | 0.08 | NaN | 0.08 | NaN |
13538 | 13540 | B's-LOG Party??PSP | 2010 | Adventure | Idea Factory | NaN | NaN | 0.04 | NaN | 0.04 | NaN |
Platform์๋ ์ฐ๋๊ฐ, Year์๋ ์ฅ๋ฅด๊ฐ, ์ฅ๋ฅด์๋ ํ๋ซํผ์ด ์ ํ์์ต๋๋ค.
์ ํ์ ์ธ ํด๋จผ์๋ฌ๋ก๊ตฐ์. ์์ฐ์์ ๋ฐ์ดํฐ๋ ์๋ ์ ์ ๋ ๋ฐ์ดํฐ์๋ ์ค๋ฅ(๋ ธ์ด์ฆ)๊ฐ ์กด์ฌํฉ๋๋ค.
๋คํํ ๊ทธ ์ด์ธ์ ํน๋ณํ ์ด์์น๊ฐ ๋์ ๋ณด์ด์ง ์์ต๋๋ค.
์ด์์น๋ ๊ฐ๋จํ๊ฒ dropํจ์๋ฅผ ํตํด ์ง์๋ฒ๋ฆด ์๋ ์์ง๋ง ์ด๋ฒ์๋ ๋น๊ต์ ๊ฐ๋จํ ์๋ฌ์๊ธฐ ๋๋ฌธ์ ์ง์ ์์ ํ๋๋ก ํ๊ฒ ์ต๋๋ค.
# ์ด ์ฝ๋๋ ๋ฐ๋ก ์ ์ฉํด์ ๋ฐ๊พธ๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ๋ฒ ์คํํ๋ฉด ๊ณ์ ๋ฐ๋๊ฒ ๋ฉ๋๋ค. ์ ์ฉํ์๋ ์ฃผ์์ฒ๋ฆฌ ํด์ฃผ์ธ์
# df.iloc[11593, [2, 3, 4]] = list(df.iloc[11593, [4, 2, 3]])
# df.iloc[13538, [2, 3, 4]] = list(df.iloc[13538, [4, 2, 3]])
df.iloc[11593]
Rank 11595
Name Boku no Natsuyasumi 3: Hokkoku Hen: Chiisana B...
Platform Sony Computer Entertainment
Year 2007
Genre Adventure
Publisher NaN
NA_Sales NaN
EU_Sales 0.08
JP_Sales NaN
Other_Sales 0.08
Global_Sales NaN
Name: 11593, dtype: object
๊ทธ๋ผ ๊ณ์ํด์ nan, ๊ฒฐ์ธก์น์ ๋ํด์ ์ดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
df[df[["Year"]].isnull().any(axis=1)].head()
Rank | Name | Platform | Year | Genre | Publisher | NA_Sales | EU_Sales | JP_Sales | Other_Sales | Global_Sales | |
---|---|---|---|---|---|---|---|---|---|---|---|
179 | 180 | Madden NFL 2004 | PS2 | NaN | Sports | Electronic Arts | 4.26 | 0.26 | 0.01 | 0.71 | 5.23 |
377 | 378 | FIFA Soccer 2004 | PS2 | NaN | Sports | Electronic Arts | 0.59 | 2.36 | 0.04 | 0.51 | 3.49 |
431 | 432 | LEGO Batman: The Videogame | Wii | NaN | Action | Warner Bros. Interactive Entertainment | 1.86 | 1.02 | NaN | 0.29 | 3.17 |
470 | 471 | wwe Smackdown vs. Raw 2006 | PS2 | NaN | Fighting | NaN | 1.57 | 1.02 | NaN | 0.41 | 3.00 |
607 | 608 | Space Invaders | 2600 | NaN | Shooter | Atari | 2.36 | 0.14 | NaN | 0.03 | 2.53 |
์ํค ๋ฐฑ๊ณผ์ ๋ฐ๋ฅด๋ฉด ๊ฐ์ฅ ๋จผ์ ๋์ค๋ Madden NFL 2004๋ 2003๋ Game Boy Advance, GameCube, Microsoft Windows, PlayStation, PlayStation 2, Xbox๋ฅผ ํตํด ๋ฐ๋งค๋์๋ค๊ณ ํฉ๋๋ค.
https://en.wikipedia.org/wiki/Madden_NFL_2004
df.iloc[179]
Rank 180
Name Madden NFL 2004
Platform PS2
Year NaN
Genre Sports
Publisher Electronic Arts
NA_Sales 4.26
EU_Sales 0.26
JP_Sales 0.01
Other_Sales 0.71
Global_Sales 5.23
Name: 179, dtype: object
df.iloc[179, 3] = 2003
df.iloc[179]
Rank 180
Name Madden NFL 2004
Platform PS2
Year 2003
Genre Sports
Publisher Electronic Arts
NA_Sales 4.26
EU_Sales 0.26
JP_Sales 0.01
Other_Sales 0.71
Global_Sales 5.23
Name: 179, dtype: object
์ฐ๋ฆฌ๊ฐ ์ํ๋๋๋ก ๋ฐ๋์์ต๋๋ค. ๊ทธ๋ฐ๋ฐ ์๊ฐํด๋ณด๋ฉด ์ผ๊ตฌ๋ ์ถ๊ตฌ ๊ฒ์ ์ ๋ชฉ์ ์ฐ๋๊ฐ ๋ถ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ ๊ฒ ๊ฐ์ต๋๋ค.
๋ง์นจ ๊ทธ ์๋ ํญ๋ชฉ์ ๋ณด๋ FIFA Soccer 2004์ ๊ฒฝ์ฐ๋ 2003๋ ๋ฐ๋งค๊ฐ ๋์์ต๋๋ค. ์คํฌ์ธ ๊ฒ์ ํ์ดํ์ ์ฐ๋๊ฐ ๋ถ์ ๊ฒฝ์ฐ ํด๋น ์ฐ๋ -1์ ์ ์ฉํ๋ฉด ํ๋ํ๋ ์ฐพ์๋ณด์ง ์๊ณ ๊ฒฐ์ธก์น๋ฅผ ์ฑ์๋ฃ์ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค.
โ(์กฐ๋ณํ์ต)์ด๋ป๊ฒ ํ๋ฉด ํด๋น ๊ฒฐ์ธก์น๋ฅผ ์ฑ์๋ฃ์ ์ ์์๊น์?
์๋ณธ ๋ฐ์ดํฐ ํ๋ ์์ ์ ์ฉํ๊ธฐ ์ ์ "Year" ์ปฌ๋ผ์ด NaN์ธ ํ๋ง ๋ฝ์ df_temp๋ฅผ ๋ง๋ค์ด ์ค์ตํด๋ด ์๋ค.
Hint. apply ํจ์๋ฅผ ์ด์ฉํด์ ํ ๋ฒ์ ์ฒ๋ฆฌ ํ ์๋ ์์ ๊ฒ ๊ฐ์ต๋๋ค.
df_temp = df[df[["Year"]].isnull().any(axis=1)][df["Genre"] == "Sports"]
df_temp = df[df["Genre"] == "Sports"].iloc[:50]
# Pandas ์ฌ์ฉ์ด ๋ฏ์ค๋ค๋ฉด ์ข ๋ ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ๋ค๋ค๋ด๋ ์ข์ ๊ฒ์
๋๋ค. ์๋ ์ฝ๋๋ Sports ์ฅ๋ฅด๋ง์ ๊ณจ๋ผ๋ด๋ ์ฝ๋์
๋๋ค.
# ๊ฒฐ์ธก์น๋ง ๋ชจ์์ ๋ณด๊ธฐ
# df_temp = df[df[["Year"]].isnull().any(axis=1)][df["Genre"] == "Sports"]
# 50๊ฐ๋ง ์ฌ์ฉํด๋ณด๊ธฐ
# df_temp = df[df["Genre"] == "Sports"].iloc[:50]
df_temp = df[df["Genre"] == "Sports"]
df_temp.head()
# Hint
def year_function(row):
if row[4] == "Sports":
text = row[1].split()[-1]
if text.isdigit() and (1960 <= int(text) <= 2022):
return str(int(text) - 1)
else:
return row[3]
else:
return row[3]
df_temp["Year"] = df_temp.apply(year_function, axis = 1)
df_temp.head()
df_temp.info()
์ ์ฝ๋๋๋ก๋ผ๋ฉด 10๊ฐ์ "Year"๊ฐ์ด ์ถ๊ฐ๋ ๊ฒ๋๋ค!
๋ค๋ค ์ ํด๋ด์ จ์ผ๋ฆฌ๋ผ ์๊ฐํฉ๋๋ค!
์ ๊ฐ์ ๊ฒฝ์ฐ Triple Play 99์ฒ๋ผ ๋งจ ๋ค ๋๊ธ์๋ง ํ๊ธฐํ๋ ๋ถ๋ถ์ ๋น ๋จ๋ ธ๊ตฐ์!
๊ทธ ์ธ์๋ 20-03 ์ด๋ผ๋๊ฐ 2K8 ๊ฐ์ด ์๊ฐ์ง๋ ๋ชปํ ํ๊ธฐ๋ค์ด ์์์ต๋๋ค.
๋ค๋ค ์ ๋ณด๋ค ๋ ๋ง์ ๊ฒฝ์ฐ์ ๋ํด์ ๊ณ ๋ฏผํด๋ณด์ จ์ผ๋ฆฌ๋ผ ๊ธฐ๋ํฉ๋๋ค.
๋ง์ผ ์ฐ๋๊ฐ ์๋ ๊ฒฝ์ฐ๋ ์ด๋ป๊ฒ ํ ๊น์?
์ค์ ์ ๋ชฉ์ ํตํด์ ์ฐพ์๋ด๋ ๊ฒ ๋ณด๋ค ๋ ํ์คํ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
๋์น์ฑ์ ๋ถ๋ค๋ ๊ณ์๊ฒ ์ง๋ง ์ด ๋ฐ์ดํฐ๋ ๊ฐ์ ๊ฒ์์ด๋ผ๋ ๋ฐ๋งค๋ ํ๋ซํผ์ ๋ฐ๋ผ์ ํต๊ณ๊ฐ ๋ฐ๋ก ์กํ์์ต๋๋ค. ์ด์ด ์ข๋ค๋ฉด ๋ค๋ฅธ ํ๋ซํผ์์ ๋ฐ๋งค๋ ๊ฐ์ ๊ฒ์์ ํต๊ณ์๋ฃ์์ ์ ์๋ฏธํ ์๋ฃ๋ฅผ ์ฐพ์๋ผ์ง๋ ๋ชจ๋ฆ ๋๋ค.
โ(์กฐ๋ณํ์ต)"Year" ์ปฌ๋ผ์ด ๋น ๋ฐ์ดํฐ ์ค ๋ค๋ฅธ ํ๋ซํผ์์ ๋ฐ๋งค๋ ๋ฐ์ดํฐ์ "Year"๊ฐ์ด ์์ ๊ฒฝ์ฐ ์ด ๊ฐ์ผ๋ก ๊ฒฐ์ธก์น๋ฅผ ์ฑ์๋ด ์๋ค.
df_sorted = df.sort_values(by = [df.columns[1], df.columns[3]], ascending = False, na_position = "first")
df_sorted.head()
์ ๋ชฉ๋ก์์ ๋ณด์ด์ง ์์ง๋ง na_position ์ธ์๋ฅผ first(default๋ last)๋ก ์ฃผ๊ฒ ๋๋ฉด Nan ๊ฐ์ ์ ์ผ ์๋ก ์ฌ๋ ค์ค๋๋ค. ์ ๋ ์ด ์ฑ์ง์ ์ด์ฉํด Null ๊ฐ์ ์ฐพ๋๋ก ํ๊ฒ ์ต๋๋ค.
df_sorted[df_sorted["Name"] == "Madden NFL 07"]
def general_year_function(row):
if str(row[3]) == "nan":
text = str(df_sorted[df_sorted["Name"] == row[1]].iloc[-1][3])
if text.isdigit():
return df_sorted[df_sorted["Name"] == row[1]].iloc[-1][3]
else:
return row[3]
df_sorted["Year"] = df_sorted.apply(general_year_function, axis = 1)
df_sorted[df_sorted["Name"] == "Madden NFL 07"]
df_sorted.info()
๋ด์น๊น์ ์๊น ๋ง๋ค์ด๋ year_function๋ ์ ์ฉํด๋ด ์๋ค.
๋จ, ์ด๋ฏธ ์ฒ๋ฆฌ๋ ๋ฐ์ดํฐ๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ฒ์์ ํ๋ ๊ฒ๊ณผ ๋ฌ๋ฆฌ ํฐ ํจ๊ณผ๋ ์์ ์ ์์ต๋๋ค.
df_sorted["Year"] = df_sorted.apply(year_function, axis = 1)
df_sorted.info()
์ฌ๋ฌ๋ถ์ ๊ฒฐ๊ณผ๋ฌผ์ ์ด๋ ์ ๊ฐ์? ์งง์ ์๊ฐ์ ๋ง๋ ๊ฒ ์น๊ณ ๋ ์ ๋ฒ ์ ์ฑ์์ง ๊ฒ ๊ฐ๋ค์.
์ ๋ ์๋ ์ฝ๋๋ฅผ ํตํด ์๋ณธ ๋ฐ์ดํฐ์ ์ ์ฉํด ๋๊ฒ ์ต๋๋ค.
df = df_sorted.sort_index(ascending = False)
df.head()
๋จ์ "Year" ์ปฌ๋ผ์ ์ด๋ป๊ฒ ์ฑ์ธ ์ ์์๊น์?
์ด์ ๋จ์ ์๊ฐ ๋ง์ง ์๊ธฐ ๋๋ฌธ์ ์ผ์ผํ ๊ฒ์ํ ์๋ ์๊ฒ ์ง๋ง 10๋ง๊ฐ, 100๋ง๊ฐ์ง๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฌ๋ค๊ณ ์๊ฐํ๊ณ ๋ฐฉ๋ฒ์ ๋ ผ์ํด ๋ด ์๋ค.
์ฌ์ค ์ด๋ป๊ฒ ๋ณด๋ฉด ์ฐ๋์ ์๋ ๊ฒฐ์ธก์น๋ ํฐ ๋ฌธ์ ๊ฐ ์๋์์์ง๋ ๋ชจ๋ฆ ๋๋ค. ์๋ ์ ๊ณ ๋ฒ์ ์ญ์ ์ข์๊ธฐ ๋๋ฌธ์ด์ฃ .
์ด๋ฒ ์ ๋์์๋ ํ๋งค๋์ ์๋ ์๋ง์ ๊ฒฐ์ธก์น๋ฅผ ์ฑ์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๊ทธ ์ค์์๋ ๊ฐ์ฅ ์ผ๋ฐ์ ์ด๋ฉด์๋ ๋ง์ด ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ๋ค์ ๋ํด์ ์ดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๋จ์ํ ํ ํน์ ์ด์ ์ ๊ฑฐํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
์๋ฅผ ๋ค์ด์ JP_sales์ ๊ฒฝ์ฐ ์ ๋ฐ ์ด์์ด ๊ฒฐ์ธก์น(๋ณธ๋๋ 0์ผ๋ก ๊ธฐ๋ก)์ผ๋ก ๋น๋์ค ๊ฒ์์ด ์ผ๋ณธ์์ ๊ฐ๋ ์ธ๊ธฐ๋ฅผ ์๊ฐํด๋ณผ๋ 6000์ฌ๊ฐ์ ๋ฐ์ดํฐ๋ ์กฐ๊ธ ์ด์ํฉ๋๋ค.
์ด๋ฐ ๊ฒฝ์ฐ JP_sales ๋ฐ์ดํฐ ์์ฒด์ ์ ๋ขฐ๋๊ฐ ๋ฎ๊ธฐ ๋๋ฌธ์ ์์ ๋ฐฐ์ ํ๋ ๊ฒ์ ๊ณ ๋ คํด๋ณผ ์ ์์ต๋๋ค.
df.info()
์ด๋ ๊ฒ ๋ฐ์ดํฐ์ ๊ฒฐ์ธก์น๊ฐ ๋๋ฌด ๋ง์ ๊ฒฝ์ฐ JP_Sales ์ปฌ๋ผ ์์ฒด๋ฅผ ์ ๊ฑฐํ๋ ๊ฒ๋ ๊ณ ๋ คํด๋ณผ๋ง ํ ๊ฒ ๊ฐ์ต๋๋ค.
# inplace = False(default๊ฐ)์ผ ๊ฒฝ์ฐ ์๋ณธ์ ์ ์ฉ๋์ง ์๊ธฐ ๋๋ฌธ์ ์๋ ์ฝ๋๋ฅผ ์ ์ฉํ๊ธฐ ์ํด์ ์ฃผ์๊ณผ ๊ฐ์ด ์์ฑํด์ผํฉ๋๋ค.
# df = df.drop(columns = "JP_Sales", axis = 1)
df.drop(columns = "JP_Sales", axis = 1)
์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ Global_Sales์ ๊ฐ์ ์์ ํ ํ์๊ฐ ์์ด๋ณด์ ๋๋ค.
ํ์ง๋ง ๊ทธ ์ ์ 16595๋ฒ์ด ์ ๋์ ๋๋๊ตฐ์.(Global_Sales์ ๊ฐ์ ์์ ํ๋ ๊ฒ์ ์์ ๋ก ๋จ๊ฒจ๋๊ฒ ์ต๋๋ค.)
NA, EU, ๊ธฐํ ์ง์ญ์์ ํ๋งค๋ ๋ฐ์ดํฐ๊ฐ ์๋๋ฐ global๋ง? ์๋ง๋ ์ผ๋ณธ์์๋ง ํ๋ ธ๋ ๋ฐ์ดํฐ๊ฐ ์ญ์ ๋๋ฉด์ ๋ฌธ์ ๊ฐ ๋ ๋ชจ์์ ๋๋ค.
global ํ๋งค๋์ด ๋๋ฌด ๋ฎ์ ๊ฒฝ์ฐ ๊ฒฐ์ธก์น๋ ๋๋ฌด ๋ง๊ณ ๋ฐ์ดํฐ์ ์๋ฏธ๋ ์ ์ ๊ฒ ๊ฐ๋ค๋ ์๊ฐ์ด ๋๋๊ตฐ์. ์ด๋์ ๋ ํ๋งค๊ฐ ๋ ๊ฒ์๋ง์ ๊ณจ๋ผ๋ณด๊ฒ ์ต๋๋ค.
๋ค๋ง ์ด ๊ฒฝ์ฐ๋ ๊ตณ์ด drop์ ์ฌ์ฉํ์ง ์์๋ ๊ด์ฐฎ์ต๋๋ค๋ง ์กฐ๊ธ ๋ณต์กํ ๊ฒฝ์ฐ ์ฌ๋ฌ๋ฒ์ drop์ ํตํด ์ํ๋ ๊ฒฐ๊ณผ๋ง์ ๋จ๊ธฐ๋ ๋ฐฉ๋ฒ๋ ์ข์ต๋๋ค.
df[df["Global_Sales"] >= 1]
dropna๋ ๊ฒฐ์ธก์น๋ฅผ ๊ธฐ์ค์ผ๋ก ํ์ด๋ ์ด์ ์ญ์ ํ๋ ๋ฐฉ๋ฒ์
๋๋ค.
๊ฒฐ์ธก์น๊ฐ ํฌํจ๋์ด์์ผ๋ฉด ์ญ์ ํ ์๋ ์๊ณ ํน์ ์กฐ๊ฑด๋ฑ์ ๋ค๋ ๋ฐฉ๋ฒ๋ ์์ต๋๋ค.
dropna์ ๊ฒฝ์ฐ ๋ง์ด ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ํ๋ผ๋ฏธํฐ์ ๋ํด์ ๊ฐ๋จํ๊ฒ ์ง๊ณ ๋์ด๊ฐ๊ฒ ์ต๋๋ค.
0, or 'index' : ๊ฒฐ์ธก๊ฐ์ด ์๋ ํ(๊ฐ๋ก)์ ์ ๊ฑฐํฉ๋๋ค.
1, or 'columns' : ๊ฒฐ์ธก๊ฐ์ด ์๋ ์ด(์ธ๋ก)์ ์ ๊ฑฐํฉ๋๋ค.
'any' : ๊ฒฐ์ธก์น๊ฐ ํ๋๋ผ๋ ์์ผ๋ฉด ํด๋น ์ด/ํ์ ์ ๊ฑฐํฉ๋๋ค.
'all' : ๋ชจ๋ ํญ๋ชฉ์ด ๊ฒฐ์ธก์น์ผ๋ ํด๋น ์ด/ํ์ ์ ๊ฑฐํฉ๋๋ค.
int : ํ/์ด ์ค value๊ฐ ์๋ ์นธ์ ๊ฐฏ์๊ฐ int๊ฐ ๋ฏธ๋ง์ธ ํ/์ด์ ์ ๊ฑฐํฉ๋๋ค.
colomns or lows : ์ ํํ ํ/์ด๋ค์ ํํด์ ์ ์กฐ๊ฑด๋ค์ ์ ์ฉํฉ๋๋ค.
# default ๊ฐ์ธ axis = 0, how = 'any'
df.dropna()
df.dropna().info()
๊ฒฐ์ธก์น๊ฐ ํ๋๋ ์๋ ๋ฐ์ดํฐ ์ ์ ๋ง๋ค์ด๋์ต๋๋ค๋ง ๋๋ฌด ๋ง์ ๋ฐ์ดํฐ๊ฐ ์๋ฆฐ ๊ฒ ๊ฐ์ต๋๋ค.
์ด๋ฒ์ ์ ๋นํ ์กฐ๊ฑด์ ๋ฌ์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
df.dropna(thresh = 3, subset = ["NA_Sales", "EU_Sales", "JP_Sales", "Other_Sales"])
์ด ๊ฒฝ์ฐ ์์ ๋จ์์์ ์ซ์๊ฐ ์ ๋ง๋ ๊ฒ์ด ๊ฑฐ์ฌ๋ฆฌ๋๊ตฐ์.
์ด์ ์ ํ๋ ๋ฐฉ๋ฒ์ ์์ฉํด ๋ณด๊ฒ ์ต๋๋ค.
df.dropna(thresh = 3, subset = ["NA_Sales", "EU_Sales", "JP_Sales", "Other_Sales"])[df["Global_Sales"] >= 1]
๊ฒฐ์ธก์น๋ฅผ ๋ฒ๋ฆฌ์๋ ๋ฐ์ดํฐ๊ฐ ์กฐ๊ธ๋ฐ์ ๋จ์ง ์๊ณ ๋จ๊ฒจ๋์๋ ๋์ ๊ฐ์๋ก๊ตฐ์.
๊ทธ๋ ๋ค๋ฉด ์ฑ์ฐ๋ ๊ฒ์ ์ด๋จ๊น์?
fillna๋ ๊ฒฐ์ธก์น๋ฅผ ์ฑ์ฐ๋ ๋ฐฉ๋ฒ ์ค ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ ์ค ํ๋์ ๋๋ค.
์ ์๊ฐ์ ํผ๋ธ๋ฆฌ์ ๋ ์ข ๋ฅ๋ ๋๋ฌด ๋ง์๋ฐ๋ค ๋ฑํ ์ค์ํ ๊ฒ ๊ฐ์ง ์๋ค์. ํผ๋ธ๋ฆฌ์ ์ ์๋ ๊ฒฐ์ธก์น๋ Unknown์ผ๋ก ์ฑ์ฐ๊ฒ ์ต๋๋ค.
๋ ํ๋งค๋ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ ์ฃผ๋ก ์ ๊ฒ ํ๋ฆฐ ๊ฒฝ์ฐ์ ๊ฒฐ์ธก์น๊ฐ ๋ง๋ค๋ ๊ฒ์ ํน์ ์์ ์ ํ๋ฆฐ ๊ฒ์ ์๋๊น์? ํ๋งค๋์ ๊ฒฐ์ธก์น๋ 0์ผ๋ก ์ฃผ๋๋ก ํ๊ฒ ์ต๋๋ค.
value = {"Publisher" : "Unknown", "NA_Sales" : 0, "EU_Sales" : 0, "JP_Sales" : 0, "Other_Sales" : 0}
df.fillna(value = value)
์ด์ฒ๋ผ ๊ฒฐ์ธก์น์ ๋ฌธ์๋ ์ซ์๋ฅผ ์ ํด์ ์ง์ด๋ฃ์ด์ค ์ ์์ต๋๋ค.
๋น์ฐํ ๊ทธ ์ซ์๋ ๋ฐ์ดํฐ์ ํ๊ท ๊ฐ๊ณผ ๊ฐ์ ํต๊ณ๊ฐ์์ ๊ฐ์ ธ์ฌ ์๋ ์๊ฒ ์ฃ .
ํน์ method ํ๋ผ๋ฏธํฐ์ 'backfill'์ด๋ 'ffill' ๋ฑ์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฃผ๋ฉด ๋ค์์ ๋์ค๋ ์ฒซ๋ฒ์งธ ์ ํจ๊ฐ์ผ๋ก ์ฑ์ฐ๊ฑฐ๋ ์ด์ ์ ๋์จ ๋ง์ง๋ง ์ ํจ๊ฐ์ผ๋ก ์ฑ์ธ ์๋ ์์ต๋๋ค.
๋ค๋ง ์ด ๋ฐฉ๋ฒ์ ์ด ๋ฐ์ดํฐ ์ ์์ ํฌ๊ฒ ์ ์ฉํด๋ณด์ด์ง ์๋๋ฐ ์ฌ๋ฌ๋ถ๋ค์ ์ด๋ป๊ฒ ์๊ฐํ์๋์? ์ ์ ์๊ฐํด๋ด ์๋ค.
โ(์๊ฐํด๋ณด๊ธฐ) ์ฌ๊ธฐ์๋ ์จ๋ณผ๋ง ํ ๊น์? ๊ทธ ์ด์ ๋ ๋ฌด์์ธ๊ฐ์?
ํน์ ๋ณ๋ก์ผ ๊ฒ ๊ฐ๋์? ๊ทธ๋ ๋ค๋ฉด ์ด๋ค ๋ฐ์ดํฐ์์ ์ธ๋งํ ๊น์?