반응형
* 위 강의노트는 패스트캠퍼스에서 주관하는 강의를 수강하고 작성한 노트입니다.
1. Dataframe data 살펴보기¶
DataFrame¶
- Series가 1차원이라면 DataFrame은 2차원으로 확대된 버젼
- Excel spreadsheet이라고 생각하면 이해하기 쉬움
- 2차원이기 때문에 인덱스가 row, column로 구성됨
- row는 각 개별 데이터를, column은 개별 속성을 의미
- Data Analysis, Machine Learning에서 data 변형을 위해 가장 많이 사용
In [1]:
import pandas as pd
import numpy as np
In [2]:
# data 출처: https://www.kaggle.com/hesh97/titanicdataset-traincsv/data
train_data = pd.read_csv('./train.csv')
head, tail 함수¶
- 데이터 전체가 아닌, 일부(처음부터, 혹은 마지막부터)를 간단히 보기 위한 함수
In [3]:
train_data.head() ## 상위 n개의 행 추출해서 확인
Out[3]:
In [4]:
train_data.tail() ## 하위 n개의 행 추출해서 확인
Out[4]:
dataframe 데이터 파악하기¶
- shape 속성 (row, column)
- describe 함수 - 숫자형 데이터의 통계치 계산
- info 함수 - 데이터 타입, 각 아이템의 개수 등 출력
In [5]:
train_data.shape # 데이터의 크기 파악하기(891 rows, 12 cols)
Out[5]:
In [7]:
train_data.describe() # 숫자형 데이터의 기초통계 보여주기
Out[7]:
In [8]:
train_data.info() # 데이터의 타입 및 간단 정보 출력
2. DataFrame의 구조 이해하기¶
인덱스(index)¶
- index 속성
- 각 아이템을 특정할 수 있는 고유의 값을 저장
- 복잡한 데이터의 경우, 멀티 인덱스로 표현 가능
In [9]:
train_data.index # 가장 기본 index는 range index
Out[9]:
컬럼(column)¶
- columns 속성
- 각각의 특성(feature)을 나타냄
- 복잡한 데이터의 경우, 멀티 컬럼으로 표현 가능
In [10]:
train_data.columns # dataframge의 컬럼 출력
Out[10]:
3. DataFrame데이터 생성하기¶
DataFrame 생성하기¶
- 일반적으로 분석을 위한 데이터는 다른 데이터 소스(database, 외부 파일)을 통해 dataframe을 생성
- 여기서는 실습을 통해, dummy 데이터를 생성하는 방법을 다룰 예정
dictionary로 부터 생성하기¶
- dict의 key -> column
In [12]:
data = {'a' : 100, 'b' : 200, 'c' : 300} # key는 columns 개념
pd.DataFrame(data, index = ['x', 'y', 'z'])
Out[12]:
In [13]:
data = {'a' : [1, 2, 3], 'b' : [4, 5, 6], 'c' : [10, 11, 12]} # key는 columns 개념
pd.DataFrame(data, index = ['0', '1', '2'])
Out[13]:
Series로 부터 생성하기¶
- 각 Series의 인덱스 -> column
In [14]:
a = pd.Series([100, 200, 300], ['a', 'b', 'c'])
b = pd.Series([101, 201, 301], ['a', 'b', 'c'])
c = pd.Series([110, 210, 310], ['a', 'b', 'c'])
pd.DataFrame([a, b, c]) # Series의 인덱스들이 columns으로 들어감
Out[14]:
4. 샘플 csv 데이터로 DataFrame 데이터 생성하기¶
csv 데이터로 부터 Dataframe 생성¶
- 데이터 분석을 위해, dataframe을 생성하는 가장 일반적인 방법
- 데이터 소스로부터 추출된 csv(comma separated values) 파일로부터 생성
- pandas.read_csv 함수 사용
In [15]:
# data 출처: https://www.kaggle.com/hesh97/titanicdataset-traincsv/data
train_data = pd.read_csv('./train.csv')
train_data.head()
Out[15]:
read_csv 함수 파라미터¶
- sep - 각 데이터 값을 구별하기 위한 구분자(separator) 설정
- header - header를 무시할 경우, None 설정
- index_col - index로 사용할 column 설정
- usecols - 실제로 dataframe에 로딩할 columns만 설정
In [17]:
train_data = pd.read_csv('./train.csv',
sep = ',', # 구분자 : csv를 쪼개는 기준에 대해 말함
header = 'infer', # 헤더가 없을 경우 None으로 대체
index_col = None, # 인덱스로 사용할 컬럼이 어떤 것인지 명시
usecols = ['PassengerId', 'Survived'] # 필요한 컬럼만 불러오기
)
train_data
Out[17]:
5. DataFrame 원하는 column(컬럼)만 선택하기¶
column 선택하기¶
- 기본적으로 [ ]는 column을 추출
- 컬럼 인덱스일 경우 인덱스의 리스트 사용 가능
- 리스트를 전달할 경우 결과는 Dataframe
- 하나의 컬럼명을 전달할 경우 결과는 Series
In [18]:
# data 출처: https://www.kaggle.com/hesh97/titanicdataset-traincsv/data
train_data = pd.read_csv('./train.csv')
하나의 컬럼 선택하기¶
In [20]:
train_data[0] # dataframe의 값이 한개만 존재한다면, columns을 의미하는 것임
In [21]:
train_data['Survived'] # 해당 컬럼만 추출
Out[21]:
복수개의 컬럼 선택하기¶
In [22]:
# 데이터 프레임으로 출력됨
train_data[['Survived', 'Age', 'Name']] # 여러개의 컬럼은 리스트 입력하기
Out[22]:
6. DataFrame 원하는 row(데이터)만 선택하기¶
dataframe slicing¶
- dataframe의 경우 기본적으로 [] 연산자가 column 선택에 사용
- 하지만, slicing은 row 레벨로 지원
In [24]:
train_data[:3] # slicing은 row 지원
Out[24]:
row 선택하기¶
- Seires의 경우 []로 row 선택이 가능하나, DataFrame의 경우는 기본적으로 column을 선택하도록 설계
- .loc, .iloc함수로 row 선택 가능
- loc - 인덱스 자체를 사용
- iloc - 0 based index로 사용
- 이 두 함수는 ,를 사용하여 column 선택도 가능
In [27]:
train_data.info()
In [31]:
train_data.index = np.arange(100, 991) # index 변경
train_data.head()
Out[31]:
In [32]:
# loc : 인덱스의 값을 가지고 추출
train_data.loc[986]
Out[32]:
In [34]:
train_data.loc[[986, 100, 102]] # 여러개의 row 추출
Out[34]:
In [36]:
# iloc : 0 based index를 기준으로 가져오기
train_data.iloc[[0, 1, 2]]
Out[36]:
row, column 동시에 선택하기¶
- loc, iloc 속성을 이용할 때, 콤마를 이용하여 둘 다 명시 가능
In [37]:
train_data.loc[[986, 100, 110], ['Survived', 'Name', 'Sex', 'Age']]
Out[37]:
In [39]:
train_data.iloc[[101, 102], [1, 4, 5]] # column 도 인덱스로 출력
Out[39]:
7. DataFrame Boolean Selection으로 데이터 선택하기¶
boolean selection으로 row 선택하기¶
- numpy에서와 동일한 방식으로 해당 조건에 맞는 row만 선택
30대이면서 1등석에 탄 사람 선택하기¶
In [42]:
class_ = train_data['Pclass'] == 1 # 1등석에 탄사람
sex_ = train_data['Age'] < 40 # 40대 미만인 사람
train_data[class_ & sex_].head()
Out[42]:
In [40]:
train_data[(train_data['Pclass'] == 1) & (train_data['Age'] < 40)]
Out[40]:
8. DataFrame에 새 column(컬럼) 추가하기¶
새 column 추가하기¶
- [] 사용하여 추가하기
- insert 함수 사용하여 원하는 위치에 추가하기
In [3]:
train_data.head()
Out[3]:
In [5]:
## []를 사용하여 변수 추가
train_data['Age_double'] = train_data['Age']*2
train_data.head()
Out[5]:
In [6]:
#insert를 이용하여 원하는 위치에 변수 삽입
train_data.insert(3, 'Fare10', train_data['Fare']/10)
train_data.head()
Out[6]:
column 삭제하기¶
- drop 함수 사용하여 삭제
- 리스트를 사용하여 멀티플 삭제 가능
In [ ]:
## drop을 이용해서 데이터 삭제
train_data = train_data.drop('Age_double', axis = 1) # axis = 1이면 컬럼 삭제
train_data.head()
변수(columns) 사이의 상관계수(correlation)¶
- corr함수를 통해 상관계수 연산(-1, 1사이의 결과)
- 연속성(숫자형 데이터)에 대해서만 연산
- 인과관계를 의미하진 않음
In [7]:
train_data.corr()
Out[7]:
In [10]:
import matplotlib.pyplot as plt
%matplotlib inline
In [13]:
plt.matshow(train_data.corr())
Out[13]:
10. DataFrame NaN 데이터 처리¶
NaN 값 확인¶
- info함수를 통하여 개수 확인
- isna함수를 통해 boolean 타입으로 확인
In [14]:
# info()를 통해 개수 확인
train_data.info()
In [16]:
train_data.isna() # 해당 값이 null인지 아닌지 츨략
Out[16]:
NaN 처리 방법¶
- 데이터에서 삭제
- dropna 함수
- 다른 값으로 치환
- fillna 함수
In [17]:
# 한개라도 na가 있으면 그 row 지우기
train_data.dropna()
Out[17]:
In [18]:
# 해당 컬럼만 na 처리하기
train_data.dropna(subset = ['Fare10'])
Out[18]:
- NaN값 대체하기
- 평균으로 대체하기
- 생존자/사망자 별 평균으로 대체하기
In [20]:
# 평균으로 대체
train_data.fillna(train_data['Age'].mean())
Out[20]:
In [23]:
# 생존자 나이 평균
mean1 = train_data[train_data['Survived'] == 1]['Age'].mean()
# 사망자 나이 평균
mean2 = train_data[train_data['Survived'] == 0]['Age'].mean()
print(mean1, mean2)
In [27]:
train_data.loc[train_data['Survived'] == 1, 'Age'] = train_data[train_data['Survived'] == 1]['Age'].fillna(mean1)
train_data.loc[train_data['Survived'] == 0, 'Age'] = train_data[train_data['Survived'] == 0]['Age'].fillna(mean1)
11. 숫자 데이터와 범주형 데이터의 이해¶
In [30]:
# data 출처: https://www.kaggle.com/hesh97/titanicdataset-traincsv/data
train_data = pd.read_csv('./train.csv')
train_data.head()
Out[30]:
info함수로 각 변수의 데이터 타입 확인¶
- 타입 변경은 astype함수를 사용
In [31]:
train_data.info()
Pclass 변수 변환하기¶
- astype 사용하여 간단히 타입만 변환
In [32]:
train_data['Pclass'] = train_data['Pclass'].astype(str)
train_data.info()
Age 변수 변환하기¶
- 변환 로직을 함수로 만든 후, apply 함수로 적용
In [36]:
import math
# apply를 위한 함수 생성
def age_categorize(age):
if math.isnan(age):
return -1
else:
return math.floor(age/10)*10
# apply로 변환
train_data['Age'].apply(age_categorize)
Out[36]:
12. 범주형 데이터 전처리하기¶
One-hot encoding¶
- 범주형 데이터는 분석단계에서 계산이 어렵기 때문에 숫자형으로 변경이 필요함
- 범주형 데이터의 각 범주(category)를 column레벨로 변경
- 해당 범주에 해당하면 1, 아니면 0으로 채우는 인코딩 기법
- pandas.get_dummies 함수 사용
- drop_first : 첫번째 카테고리 값은 사용하지 않음
In [39]:
# 범주형 데이터를 모두 con_hot encoding
pd.get_dummies(train_data,
columns = ['Pclass', 'Sex', 'Embarked'], # 필요한 컬럼만
drop_first = True # 차원을 줄이기 위해
)
Out[39]:
반응형
'Study > ML_Basic' 카테고리의 다른 글
머신러닝과 데이터 분석 A-Z 올인원 패키지 - 회귀분석_수학적 개념 이해(1) - 확률과 통계 (0) | 2020.12.03 |
---|---|
머신러닝과 데이터 분석 A-Z 올인원 패키지 - 데이터 분석을 위한 Python(Pandas) – (3) (0) | 2020.09.30 |
머신러닝과 데이터 분석 A-Z 올인원 패키지 - 데이터 분석을 위한 Python(Pandas) – (1) (0) | 2020.09.30 |
머신러닝과 데이터 분석 A-Z 올인원 패키지 - 데이터 처리를 위한 Python(Numpy)(2) (0) | 2020.09.30 |
머신러닝과 데이터 분석 A-Z 올인원 패키지-데이터 처리를 위한 Python(Numpy) – (1) (0) | 2020.09.30 |