본문 바로가기

노력/데이터 사이언스

[데이터 다루기] FIFA 19 데이터 깔끔하게 다듬기

저번 포스트에서 FIFA 19 선수들 데이터를 선택했다는 말씀을 드렸습니다.

 

https://www.kaggle.com/karangadiya/fifa19

 

FIFA 19 complete player dataset

18k+ FIFA 19 players, ~90 attributes extracted from the latest FIFA database

www.kaggle.com

Kaggle에서 데이터를 받을 수 있습니다.

 

데이터를 받고 분석을 하기 전에 데이터를 이해하고 전처리해야겠죠?

 

제 첫 데이터 전처리라 꽤 긴 시간이 소요됐습니다. 아직 pandas와 numpy가 어렵네요. python3도 마찬가지입니다.

 

import numpy as np
import pandas as pd
import seaborn as sns

먼저 분석에 사용할 라이브러리들을 임포트합니다.

 

player = pd.read_csv("E:\\Data Science\\fifa19.csv")

다운로드 해 둔 FIFA 데이터를 읽어옵니다.

 

player.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 18207 entries, 0 to 18206
Data columns (total 89 columns):
Unnamed: 0                  18207 non-null int64
ID                          18207 non-null int64
Name                        18207 non-null object
Age                         18207 non-null int64
Photo                       18207 non-null object
Nationality                 18207 non-null object
Flag                        18207 non-null object
Overall                     18207 non-null int64
Potential                   18207 non-null int64
Club                        17966 non-null object
Club Logo                   18207 non-null object
Value                       18207 non-null object
Wage                        18207 non-null object
Special                     18207 non-null int64
Preferred Foot              18159 non-null object
International Reputation    18159 non-null float64
Weak Foot                   18159 non-null float64
Skill Moves                 18159 non-null float64
Work Rate                   18159 non-null object
Body Type                   18159 non-null object
Real Face                   18159 non-null object
Position                    18147 non-null object
Jersey Number               18147 non-null float64
Joined                      16654 non-null object
Loaned From                 1264 non-null object
Contract Valid Until        17918 non-null object
Height                      18159 non-null object
Weight                      18159 non-null object
LS                          16122 non-null object
ST                          16122 non-null object
RS                          16122 non-null object
LW                          16122 non-null object
LF                          16122 non-null object
CF                          16122 non-null object
RF                          16122 non-null object
RW                          16122 non-null object
LAM                         16122 non-null object
CAM                         16122 non-null object
RAM                         16122 non-null object
LM                          16122 non-null object
LCM                         16122 non-null object
CM                          16122 non-null object
RCM                         16122 non-null object
RM                          16122 non-null object
LWB                         16122 non-null object
LDM                         16122 non-null object
CDM                         16122 non-null object
RDM                         16122 non-null object
RWB                         16122 non-null object
LB                          16122 non-null object
LCB                         16122 non-null object
CB                          16122 non-null object
RCB                         16122 non-null object
RB                          16122 non-null object
Crossing                    18159 non-null float64
Finishing                   18159 non-null float64
HeadingAccuracy             18159 non-null float64
ShortPassing                18159 non-null float64
Volleys                     18159 non-null float64
Dribbling                   18159 non-null float64
Curve                       18159 non-null float64
FKAccuracy                  18159 non-null float64
LongPassing                 18159 non-null float64
BallControl                 18159 non-null float64
Acceleration                18159 non-null float64
SprintSpeed                 18159 non-null float64
Agility                     18159 non-null float64
Reactions                   18159 non-null float64
Balance                     18159 non-null float64
ShotPower                   18159 non-null float64
Jumping                     18159 non-null float64
Stamina                     18159 non-null float64
Strength                    18159 non-null float64
LongShots                   18159 non-null float64
Aggression                  18159 non-null float64
Interceptions               18159 non-null float64
Positioning                 18159 non-null float64
Vision                      18159 non-null float64
Penalties                   18159 non-null float64
Composure                   18159 non-null float64
Marking                     18159 non-null float64
StandingTackle              18159 non-null float64
SlidingTackle               18159 non-null float64
GKDiving                    18159 non-null float64
GKHandling                  18159 non-null float64
GKKicking                   18159 non-null float64
GKPositioning               18159 non-null float64
GKReflexes                  18159 non-null float64
Release Clause              16643 non-null object
dtypes: float64(38), int64(6), object(45)
memory usage: 12.4+ MB

데이터의 개요에 대해 먼저 살펴봅니다. Column이 상당히 많이 있다는 것을 알 수 있습니다. 무려 89개입니다. 대충 느낌상으로만 훑어본 뒤 넘어가겠습니다.

 

player.describe()

Column이 많기 때문에 한눈에 들어오지도 않고 중간에 생략된 속성도 많았습니다. 느낌만 보고 넘어가도록 하겠습니다. 대충 보더라도 ID값 같은 경우는 int로 있을 이유가 없어 보이네요.

 

player.head()

느낌상 Unnamed: 0은 정말 필요 없는 인덱스와 같은 값으로 보입니다. 아까 살펴봤듯이 ID도 int값일 필요는 없어 보이고 Photo와 그 옆에는 잘 보이지 않지만 Flag값입니다. 둘 다 사진 경로인 것으로 보아 분석에는 필요 없는 값으로 보입니다.

 

player.tail()

taIl에서는 head과 다른 통찰을 얻기는 힘들어 보입니다. 완전히 똑같은 형태입니다.

 

player.sample()

sample도 마찬가지입니다. 별 다른 것은 없어 보입니다.

 

player[['Unnamed: 0', 'Photo', 'Flag', 'Club Logo']]

미리 확인해 둔 분석에 쓸모없어 보이는 속성들입니다. 더 있을 수 있겠지만 한눈에 확인하기에 이 속성들은 확연히 쓸모없어 보이기 때문에 삭제하도록 하겠습니다.

 

player.drop(['Unnamed: 0', 'Photo', 'Flag', 'Club Logo'], axis=1, inplace=True)

위의 속성들을 제거하는 코드입니다. drop에서 제거할 속성들의 이름을 골라주고, axis는 축을 고르게 됩니다. 만약 0이었다면 행을 삭제하는 코드가 될 것입니다. 위에서 player를 간단하게 보았었는데요, 필요하지 않은 행이 있다고 판단되면 player.drop(['0', '1', '2'], axis=0)의 형태로 삭제가 가능할 것입니다. inplace는 True일 경우에 실제 값을 변경한다는 뜻입니다. inplace가 없다면 view의 관점으로 삭제된 모습을 보여주기만 하고 실제 값은 변화가 없습니다.

 

player.drop(['Unnamed: 0', 'Photo', 'Flag', 'Club Logo'], axis=1, inplace=False)
player
player.drop(['Unnamed: 0', 'Photo', 'Flag', 'Club Logo'], axis=1, inplace=True)
player

확인해보고 싶으시다면 위 코드를 이용해 보세요. inplace는 default가 False이기 때문에 굳이 명시해주지 않는다면 실제 값은 변화되지 않습니다.

 

player = player.drop(['Unnamed: 0', 'Photo', 'Flag', 'Club Logo'], axis=1)

이런 형태로 하더라도 inplace=True와 같은 결과를 얻으실 수 있을 겁니다.

 

 

player[['ID', 'Nationality', 'Club', 'Preferred Foot', 'Real Face', 'Position', 'Body Type', 'Loaned From']] = player[['ID', 'Nationality', 'Club', 'Preferred Foot', 'Real Face', 'Position', 'Body Type', 'Loaned From']].astype('category')

개인적으로 전에 말씀드린 적이 있었던 openintro-statistics를 활용해서 공부하고 있는 중입니다. player.info()에서 얻어낸 가벼운 느낌과 함께 실제 데이터를 일일이 확인해본 뒤에 통계학적으로 값보다 카테고리로 나누어야 할 것으로 판단한 값들은 category데이터로 변경했습니다.

 

저도 아직 미흡하지만 아예 데이터에 대해 모르시는 분들은 numerical, categorical 데이터의 구분에 대해서 찾아보시는 것을 추천드립니다. 다음번에 이에 관해서 꼭 포스트 하도록 하겠습니다.

 

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 18207 entries, 0 to 18206
Data columns (total 89 columns):
Value                       18207 non-null object
Wage                        18207 non-null object
Special                     18207 non-null int64
Weak Foot                   18159 non-null float64
Skill Moves                 18159 non-null float64
Work Rate                   18159 non-null object
Position                    18147 non-null object
Jersey Number               18147 non-null float64
Joined                      16654 non-null object
Contract Valid Until        17918 non-null object
Height                      18159 non-null object
Weight                      18159 non-null object
LS                          16122 non-null object
ST                          16122 non-null object
RS                          16122 non-null object
LW                          16122 non-null object
LF                          16122 non-null object
CF                          16122 non-null object
RF                          16122 non-null object
RW                          16122 non-null object
LAM                         16122 non-null object
CAM                         16122 non-null object
RAM                         16122 non-null object
LM                          16122 non-null object
LCM                         16122 non-null object
CM                          16122 non-null object
RCM                         16122 non-null object
RM                          16122 non-null object
LWB                         16122 non-null object
LDM                         16122 non-null object
CDM                         16122 non-null object
RDM                         16122 non-null object
RWB                         16122 non-null object
LB                          16122 non-null object
LCB                         16122 non-null object
CB                          16122 non-null object
RCB                         16122 non-null object
RB                          16122 non-null object
Crossing                    18159 non-null float64
Finishing                   18159 non-null float64
HeadingAccuracy             18159 non-null float64
ShortPassing                18159 non-null float64
Volleys                     18159 non-null float64
Dribbling                   18159 non-null float64
Curve                       18159 non-null float64
FKAccuracy                  18159 non-null float64
LongPassing                 18159 non-null float64
BallControl                 18159 non-null float64
Acceleration                18159 non-null float64
SprintSpeed                 18159 non-null float64
Agility                     18159 non-null float64
Reactions                   18159 non-null float64
Balance                     18159 non-null float64
ShotPower                   18159 non-null float64
Jumping                     18159 non-null float64
Stamina                     18159 non-null float64
Strength                    18159 non-null float64
LongShots                   18159 non-null float64
Aggression                  18159 non-null float64
Interceptions               18159 non-null float64
Positioning                 18159 non-null float64
Vision                      18159 non-null float64
Penalties                   18159 non-null float64
Composure                   18159 non-null float64
Marking                     18159 non-null float64
StandingTackle              18159 non-null float64
SlidingTackle               18159 non-null float64
GKDiving                    18159 non-null float64
GKHandling                  18159 non-null float64
GKKicking                   18159 non-null float64
GKPositioning               18159 non-null float64
GKReflexes                  18159 non-null float64
Release Clause              16643 non-null object
dtypes: float64(38), int64(6), object(45)
memory usage: 12.4+ MB

위쪽에서부터 옳게 돼있다고 생각한 값이나 이미 데이터를 변경, 삭제한 값들은 제외하고 남은 데이터들입니다.

 

먼저 Work Rate에 대해서 알아보고 변경하도록 하겠습니다.

 

player['Work Rate']

어떤 데이터인지 확인하기 어려워 보입니다.

 

kaggle에서 아래 Columns에서 확인해본 결과 attack work rate/defence work rate입니다. 정확히 어떤 역할을 하는지는 모르지만 일단 두 속성으로 나눠야 하는 것을 확인했습니다.

 

wr = player['Work Rate'].str.split('/', expand = True)

player['Attack Work Rate'] = wr[0].astype('category')
player['Defence Work Rate'] = wr[1].astype('category')

work rate를 / 기준으로 나눠서 wr에 넣습니다. expand는 이를 데이터 프레임으로 만든다는 뜻입니다. 별다른 옵션 없이 만들었기 때문에 wr은 0, 1 속성을 가진 데이터 프레임이 됐습니다.

 

wr를 확인해보겠습니다.

 

player['Attack Work Rate'] = wr[0].astype('category')
player['Defence Work Rate'] = wr[1].astype('category')

이제 'Attack Work Rate'와 'Defence Work Rate'로 나누어서 player에 붙여주면 됩니다.

 

player.drop(['Work Rate'], axis=1, inplace=True)

물론 붙이고 나면 이전에 있던 값은 필요가 없기 때문에 삭제해줍니다.

 

이제 성질이 비슷한 세 속성을 한 번에 변경해보겠습니다.

 

player[['Value', 'Wage', 'Release Clause']]

돈에 관련된 세 데이터입니다.

 

value, wage, rc = player['Value'], player['Wage'], player['Release Clause']

데이터 상으로 유로와 K, M이 달려있는 데이터들입니다. 각각 Series의 형태로 입력해줍니다. 한 번에 모아서 money 데이터 프레임으로 처리하고 싶었는데 아직 미숙해서 제대로 처리하지 못했습니다. 일단 Series로 데이터를 처리하겠습니다.

 

value = value.str.replace('€', '')
wage = wage.str.replace('€', '')
rc = rc.str.replace('€', '')

유로를 공백으로 대체합니다.

 

v = value.str.split(pat=(r'([A-Z])'), expand=True)
w = wage.str.split(pat=(r'([A-Z])'), expand=True)
r = rc.str.split(pat=(r'([A-Z])'), expand=True)

세 개 모두 문자를 기준으로 나누고 데이터 프레임 형태로 만듭니다. split의 pat는 문자나 정규표현식을 넣을 수 있습니다.

 

v.iloc[:][1].replace('M', 1000000, inplace=True)
v.iloc[:][1].replace('K', 1000, inplace=True)
w.iloc[:][1].replace('K', 1000, inplace=True)
r.iloc[:][1].replace('M', 1000000, inplace=True)
r.iloc[:][1].replace('K', 1000, inplace=True)

M과 K를 숫자인 1000000, 1000으로 변경한다.

 

v[0] = v[0].astype(float)
w[0] = w[0].astype(float)
r[0] = r[0].astype(float)

이 속성들이 object였기 때문에 계산을 위해서 float로 변경한다.

 

v.fillna(0, inplace=True)
w.fillna(0, inplace=True)
r.fillna(0, inplace=True)

NaN은 계산을 할 수 없기 때문에 fillna 함수를 사용해서 0으로 채워준다.

 

v[2] = v[0] * v[1]
w[2] = w[0] * w[1]
r[2] = r[0] * r[1]

각 프레임의 2번째 자리에 두 수를 곱해서 넣어준다.

 

player['Value'] = v[2]
player['Wage'] = w[2]
player['Release Clause'] = r[2]

원래의 자리에 곱한 수를 넣어준다. 

 

 

이제 돈에 관련된 3가지도 모두 정돈되었습니다. 

 

남은 대부분의 데이터는 단순 숫자인 경우가 많습니다.

 

for i in player[['Crossing', 'Finishing', 'HeadingAccuracy', 'ShortPassing', 'Volleys', 'Dribbling', 'Curve', 'FKAccuracy', 'LongPassing', 'BallControl', 'Acceleration', 'SprintSpeed', 'Agility', 'Reactions', 'Balance', 'ShotPower', 'Jumping', 'Stamina', 'Strength', 'LongShots', 'Aggression', 'Interceptions', 'Positioning', 'Vision', 'Penalties', 'Composure', 'Marking', 'StandingTackle', 'SlidingTackle', 'GKDiving', 'GKHandling', 'GKKicking', 'GKPositioning', 'GKReflexes']]:
    player[i] = player[i].values.astype(int)

float로 표현되어 있던 속성들입니다. 잠깐 살펴보니 마지막 자리만 .0으로 표현되어 있는 데이터였기 때문에 int로 변경합니다.

 

data = pd.DataFrame()

for i in ('LS', 'ST', 'RS', 'LW', 'LF', 'CF', 'RF', 'RW', 'LAM', 'CAM', 'RAM', 'LM', 'LCM', 'CM', 'RCM', 'RM', 'LWB', 'LDM', 'CDM', 'RDM', 'RWB', 'LB', 'LCB', 'CB', 'RCB', 'RB'):
    data[i] = player[i].str.slice(stop=2)

각 포지션별 데이터들입니다. 데이터는 각각 두 숫자를 '+' 문자로 연결한 형태입니다. 앞의 숫자는 10의 자릿수로 되어있었기 때문에 앞의 두 숫자만 잘라냈습니다.

 

data.fillna(0, inplace=True)

for i in ('LS', 'ST', 'RS', 'LW', 'LF', 'CF', 'RF', 'RW', 'LAM', 'CAM', 'RAM', 'LM', 'LCM', 'CM', 'RCM', 'RM', 'LWB', 'LDM', 'CDM', 'RDM', 'RWB', 'LB', 'LCB', 'CB', 'RCB', 'RB'):
    player[i] = data[i].astype(int)

NaN은 연산을 할 수 없기 때문에 0으로 채우고 자료들을 int형으로 변경해서 저장합니다.

 

player['Total Stats'] = player['Special']

player.drop('Special', axis=1, inplace=True)

Special이라는 속성은 Kaggle의 Discussion 탭을 찾아가서 보니 플레이어의 스탯들을 모두 합한 값인 듯합니다. Total Stats라는 속성으로 만들어주고 삭제하였습니다.

 

player['International Reputation'].fillna(0, inplace=True)
player['Weak Foot'].fillna(0, inplace=True)
player['Skill Moves'].fillna(0, inplace=True)

player['International Reputation'], player['Weak Foot'], player['Skill Moves'] = player['International Reputation'].astype(int), player['Weak Foot'].astype(int), player['Skill Moves'].astype(int)
player['International Reputation'], player['Weak Foot'], player['Skill Moves'] = player['International Reputation'].astype('category'), player['Weak Foot'].astype('category'), player['Skill Moves'].astype('category')

이 세 속성들은 1~5까지로만 표현되어 있는 데이터입니다. '국제적 명성', '약한 발', '스킬 움직임' 정도로 해석 가능할 것 같습니다. 위에서 변경했던 스탯과 마찬가지로 1.0, 2.0 ... 이런 식으로 만들어져 있어서 int로 변경해주고 카테고리형 데이터로 변경하였습니다.

 

player['Joined'] = pd.to_datetime(player['Joined'])
player['Contract Valid Until'] = pd.to_datetime(player['Contract Valid Until'])

선수가 처음으로 클럽에 합류한 날짜와 계약 만료 날짜입니다. datetime 데이터로 변경해서 다시 속성으로 입력해 주었습니다.

 

player['Jersey Number'].isna().any()

player['Jersey Number'].fillna(0, inplace=True)
player['Jersey Number'] = player['Jersey Number'].astype(int)
player['Jersey Number'] = player['Jersey Number'].astype('category')

옷에 적히는 백넘버에 관련된 속성입니다. 혹시나 누락된 값이 있을까 해서 찾아봤는데 정말로 있더군요. 그래서 fillna를 이용해서 0으로 채워주고 int 타입으로 변경해 준 다음에 카테고리 값으로 변경했습니다.

 

이제 딱 두 가지 속성만 남았습니다. 바로 키와 몸무게입니다.

 

player[['Height', 'Weight']]

cm = player['Height'].str.split('\'', expand=True)

cm.fillna(0, inplace=True)

cm[[0, 1]] = cm[[0, 1]].astype(int)

cm['inches'] = cm[0] * 12 + cm[1]
cm['cm'] = cm['inches'] * 2.54
player['Height'] = cm['cm']

키에 대한 데이터의 처리입니다. \' 기준으로 잘라서 cm에 데이터 프레임 형태로 저장해 줍니다. 혹시나 결측치가 있다면 0으로 채워주고요. 연산을 위해서 object 타입을 int 타입으로 변경하였습니다.

 

인치를 cm로 변경하고자 했습니다. 하나의 속성에 넣기 위해서는 피트(feet)와 인치보다는 cm가 편할 것 같았습니다. 피트에 12를 곱하면 인치가 되므로 일단 피트를 인치로 변경시켜줍니다. 인치에 2.54를 곱해서 cm로 변경해줍니다. player['Height'] 속성을 바꾼 cm로 변경합니다.

 

player['Weight'] = player['Weight'].str.replace('lbs', '')
player['Weight'].fillna(0, inplace=True)
player['Weight'] = player['Weight'].astype(int)

Weight는 상대적으로 나눌 데이터가 없어서 간편하게 처리할 수 있었습니다. lbs를 공백으로 대체하고 0을 채워준 다음에 int로만 변경하면 되었습니다.

 

이젠 제가 생각한 만큼의 데이터가 되었습니다.

 

player.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 18207 entries, 0 to 18206
Data columns (total 86 columns):
ID                          18207 non-null category
Name                        18207 non-null object
Age                         18207 non-null int64
Nationality                 18207 non-null category
Overall                     18207 non-null int64
Potential                   18207 non-null int64
Club                        17966 non-null category
Value                       18207 non-null float64
Wage                        18207 non-null float64
Preferred Foot              18159 non-null category
International Reputation    18207 non-null category
Weak Foot                   18207 non-null category
Skill Moves                 18207 non-null category
Body Type                   18159 non-null category
Real Face                   18159 non-null category
Position                    18147 non-null category
Jersey Number               18207 non-null category
Joined                      16654 non-null datetime64[ns]
Loaned From                 1264 non-null category
Contract Valid Until        17918 non-null datetime64[ns]
Height                      18207 non-null float64
Weight                      18207 non-null int32
LS                          18207 non-null int32
ST                          18207 non-null int32
RS                          18207 non-null int32
LW                          18207 non-null int32
LF                          18207 non-null int32
CF                          18207 non-null int32
RF                          18207 non-null int32
RW                          18207 non-null int32
LAM                         18207 non-null int32
CAM                         18207 non-null int32
RAM                         18207 non-null int32
LM                          18207 non-null int32
LCM                         18207 non-null int32
CM                          18207 non-null int32
RCM                         18207 non-null int32
RM                          18207 non-null int32
LWB                         18207 non-null int32
LDM                         18207 non-null int32
CDM                         18207 non-null int32
RDM                         18207 non-null int32
RWB                         18207 non-null int32
LB                          18207 non-null int32
LCB                         18207 non-null int32
CB                          18207 non-null int32
RCB                         18207 non-null int32
RB                          18207 non-null int32
Crossing                    18207 non-null int32
Finishing                   18207 non-null int32
HeadingAccuracy             18207 non-null int32
ShortPassing                18207 non-null int32
Volleys                     18207 non-null int32
Dribbling                   18207 non-null int32
Curve                       18207 non-null int32
FKAccuracy                  18207 non-null int32
LongPassing                 18207 non-null int32
BallControl                 18207 non-null int32
Acceleration                18207 non-null int32
SprintSpeed                 18207 non-null int32
Agility                     18207 non-null int32
Reactions                   18207 non-null int32
Balance                     18207 non-null int32
ShotPower                   18207 non-null int32
Jumping                     18207 non-null int32
Stamina                     18207 non-null int32
Strength                    18207 non-null int32
LongShots                   18207 non-null int32
Aggression                  18207 non-null int32
Interceptions               18207 non-null int32
Positioning                 18207 non-null int32
Vision                      18207 non-null int32
Penalties                   18207 non-null int32
Composure                   18207 non-null int32
Marking                     18207 non-null int32
StandingTackle              18207 non-null int32
SlidingTackle               18207 non-null int32
GKDiving                    18207 non-null int32
GKHandling                  18207 non-null int32
GKKicking                   18207 non-null int32
GKPositioning               18207 non-null int32
GKReflexes                  18207 non-null int32
Release Clause              18207 non-null float64
Attack Work Rate            18159 non-null category
Defence Work Rate           18159 non-null category
Total Stats                 18207 non-null int64
dtypes: category(14), datetime64[ns](2), float64(4), int32(61), int64(4), object(1)
memory usage: 6.9+ MB

 

제가 생각할 수 있는 범위 내에서의 데이터 전처리입니다. 혹시 부족한 부분이 있을 수도 있지만 처음 치고는 괜찮게 가공됐다고 생각합니다. 이젠 시각화와 다른 데이터의 전처리 등에 도전해보고자 합니다. 막상 써놓고 보니 굉장히 적은 라인 수로 끝나버렸네요. 실제로 진행할 때는 굉장히 오래 걸려서 포스트를 나누어서 해야 하나 고민도 했었는데 살짝 허무한 감이 있어요😅 이번 진행에서 느낀 부족함은 pandas와 파이썬만이 아니라 애초에 내가 진행하고 있는 방향이 맞는가에 대한 확신이 없다는 점이 가장 큰 부족함이라고 생각이 듭니다. 통계학적인 지식이 중요하다는 것을 다시 한번 느끼게 된 계기가 됐습니다. 다음에는 pandas의 기본에 대해서 한 번 짚고 넘어가도록 하겠습니다. 그것만 좀 더 잘하더라도 전처리를 더 간단히 할 수 있을거에요. 포스트가 도움이 되셨으면 좋겠네요. 다음에 또 돌아오겠습니다.

'노력 > 데이터 사이언스' 카테고리의 다른 글

[데이터 다루기] Kaggle Dataset 선택  (0) 2019.04.10
데이터 사이언스 앞으로의 방향.  (0) 2019.04.08
벌거벗은 통계학(Naked Statistics) - 찰스 윌런  (0) 2019.03.29
3. 분포  (0) 2019.02.26
2. 추정  (0) 2019.02.19