Study/AI

01. 데이터 처리 (Numpy, Pandas 기초)

Dream Amal 2022. 2. 5.

실제로 모델링해보고자 하는 data를 바탕으로 이상철 교수님의 유튜브 강의를 들으며 정리한 내용을 앞으로 이어서 posting하고자 한다.
오늘은 가장 기초적인 내용들에 대해 다루어보았다.
해당 내용은 주피터 노트북 파일을 마크다운으로 변환한 것으로,
각각의 code 바로 밑에 적혀진 내용이 해당 코드를 실행시킨 결과 값이다.


01. 데이터 처리

Python에서 사용하는 데이터형에 대해 먼저 알아보자.
기계학습에서는 대부분, Data Frame을 활용하기때문에 Pandas를 주로 사용하게 되므로, 그렇게 큰 비중이 있는 내용은 아니지만,알아두는 것이 Python 공부에도 더욱 도움이 된다.

Python에서 활용하는 collection literal은 총 4가지이다.

종류 형식 데이터수정,삭제 index 이용
리스트(list) num = [1, 2, 3] Mutable O
튜플(tuple) num = (1, 2, 3) Immutable O
집합(set) num = {1, 2, 3} Mutable X
딕셔너리(dictionary) num = {'key1' : 1, 'key2' : 2} Mutable X

실제로 data를 분석할 때에는 tuple을 가장 많이 활용하니, tuple의 특성을 잘 기억해두자.

Numpy

Python의 list를 그대로 활용하여서 내부의 값을 계산하기에는 어려움이 많다.
이를 행렬과 같이 계산할 수 있도록 도와주는 package가 numpy이다.

해당 Part에서 Numpy의 모든 것을 다루는 것이 아니라 배열의 기본 기능에 대해서만 이야기해보자.

num1 = [1, 2, 3, 4]
num2 = [5, 6, 7, 8]
num = [num1, num2]
# num은 2차원 list가 됨
num
[[1, 2, 3, 4], [5, 6, 7, 8]]
# 계산 불가
# 하나의 리스트로 합쳐짐
num1 + num2
[1, 2, 3, 4, 5, 6, 7, 8]

numpy를 사용하기 위해, 먼저 import문을 작성하자.

import numpy as np

numpy의 배열(==행열)을 활용해 연산하는 방법은 다음과 같다.

num = np.array(num)
num1 = np.array(num1)
num2 = np.array(num2)
num1.sum()
10
num1.std()
1.118033988749895

배열 추출

배열의 인덱싱은 인덱스연산자[,]를 활용하여 가능하다.
slicing또한 [:행, :열]을 활용하여 편하게 추출할 수 있다.

# 배열 인덱싱
num[1, 3]
8
# 배열 슬라이싱
num3 = num[:2, :2]
num3
array([[1, 2],
       [5, 6]])

배열 메소드

numpy의 기본적인 메소드로는
sum() : 열 또는 행 기준 합
add() : 행렬 합
dot() : 행렬 곱
이 존재하나, 자주 사용하지는 않으니 참고만 하자.

# 열 기준으로 합계
num.sum(axis=0)
array([ 6,  8, 10, 12])
# 행 기준으로 합계
num.sum(axis=1)
array([10, 26])
# 덧셈
np.add(num1, num2)
array([ 6,  8, 10, 12])
# 행렬 곱
np.dot(num1, num2)
70

Pandas

기계학습에서 가장 중요한 Package가 바로 Pandas이다.
pandas의 기본적인 사용 방법을 알아보자.

numpy와 마찬가지로 먼저 import문을 작성해야 한다.

import pandas as pd

자신이 분석하기 원하는 .csv 파일의 경로를 read_csv()함수의 매개변수로 전달하여 파일을 열 수 있다.
해당 메소드로 파일을 열면, 자동으로 data frame으로 인식된다.

data = pd.read_csv('../Data/train.csv')

# 상위 5개 data만 출력
data.head()

employee_id department region education gender recruitment_channel no_of_trainings age previous_year_rating length_of_service awards_won? avg_training_score is_promoted
0 65438 Sales & Marketing region_7 Master's & above f sourcing 1 35 5.0 8 0 49 0
1 65141 Operations region_22 Bachelor's m other 1 30 5.0 4 0 60 0
2 7513 Sales & Marketing region_19 Bachelor's m sourcing 1 34 3.0 7 0 50 0
3 2542 Sales & Marketing region_23 Bachelor's m other 2 39 1.0 10 0 50 0
4 48945 Technology region_26 Bachelor's m other 1 45 3.0 2 0 73 0

그런데, 계속해서 데이터를 만지다보면 listnumpy 형태로 계속해서 변환되는 현상이 발생할 수도 있다.
그럴 때는 다시 pandas의 data frame 형태로 변환하여 분석을 이어가면 된다.

python으로만 데이터 분석을 해 온 사람은 아마 헷갈릴 일이 없겠지만, R이 더 익숙한 사람들은 이 개념이 어렵게 느껴질 수도 있다.

data = pd.DataFrame(data)
data.head()

employee_id department region education gender recruitment_channel no_of_trainings age previous_year_rating length_of_service awards_won? avg_training_score is_promoted
0 65438 Sales & Marketing region_7 Master's & above f sourcing 1 35 5.0 8 0 49 0
1 65141 Operations region_22 Bachelor's m other 1 30 5.0 4 0 60 0
2 7513 Sales & Marketing region_19 Bachelor's m sourcing 1 34 3.0 7 0 50 0
3 2542 Sales & Marketing region_23 Bachelor's m other 2 39 1.0 10 0 50 0
4 48945 Technology region_26 Bachelor's m other 1 45 3.0 2 0 73 0

Data 분석시 유용한 명령어

pandas의 data frame이 가지고 있는 강력한 명령어들이 많이 있다.
실제 data 분석 시에도 자주 활용되므로 익혀놓는 것이 좋다.

# 배열의 행, 열의 갯수 확인
data.shape
(54808, 13)
# 행 번호 확인
data.index
RangeIndex(start=0, stop=54808, step=1)
# column(열) 확인
# dtype은 data type을 의미함
data.columns
Index(['employee_id', 'department', 'region', 'education', 'gender',
       'recruitment_channel', 'no_of_trainings', 'age', 'previous_year_rating',
       'length_of_service', 'awards_won?', 'avg_training_score',
       'is_promoted'],
      dtype='object')
# 값 확인
data.values
array([[65438, 'Sales & Marketing', 'region_7', ..., 0, 49, 0],
       [65141, 'Operations', 'region_22', ..., 0, 60, 0],
       [7513, 'Sales & Marketing', 'region_19', ..., 0, 50, 0],
       ...,
       [13918, 'Analytics', 'region_1', ..., 0, 79, 0],
       [13614, 'Sales & Marketing', 'region_9', ..., 0, 45, 0],
       [51526, 'HR', 'region_22', ..., 0, 49, 0]], dtype=object)

DataFrame 인덱싱 추출

pandas의 인덱싱 추출 및 슬라이싱 방법은 일반적인 python의 방법과는 차이가 있으므로 유의하자.
index는 언제나 0번째부터 시작한다는 것을 잊지 말자.

# 행 추출 - 행번호 활용
data.iloc[5]
employee_id                  58896
department               Analytics
region                    region_2
education               Bachelor's
gender                           m
recruitment_channel       sourcing
no_of_trainings                  2
age                             31
previous_year_rating           3.0
length_of_service                7
awards_won?                      0
avg_training_score              85
is_promoted                      0
Name: 5, dtype: object

행을 추출할 때 유의할 점은 행번호와 index는 다를 수 있다는 것이다.
현재는 행 번호와 index가 모두 동일하게 나타나지만, 행 수정 및 index setting에 따라 값이 얼마든지 달라질 수 있다.

실제 data를 만지다보면 필요하지 않은 data들도 많이 있고, 정렬도 다시 해줘야 하는 경우도 많다.
때문에 행번호와 index가 헷갈리면 분석에 있어서 어려움을 겪을 수 있으니 조심하자.

# 행 추출 - index 활용
data.loc[5]
employee_id                  58896
department               Analytics
region                    region_2
education               Bachelor's
gender                           m
recruitment_channel       sourcing
no_of_trainings                  2
age                             31
previous_year_rating           3.0
length_of_service                7
awards_won?                      0
avg_training_score              85
is_promoted                      0
Name: 5, dtype: object
# 열 추출 - index 활용
data.iloc[:, 1]
0        Sales & Marketing
1               Operations
2        Sales & Marketing
3        Sales & Marketing
4               Technology
               ...        
54803           Technology
54804           Operations
54805            Analytics
54806    Sales & Marketing
54807                   HR
Name: department, Length: 54808, dtype: object
# 열 추출 - column 명 활용
data['department']
0        Sales & Marketing
1               Operations
2        Sales & Marketing
3        Sales & Marketing
4               Technology
               ...        
54803           Technology
54804           Operations
54805            Analytics
54806    Sales & Marketing
54807                   HR
Name: department, Length: 54808, dtype: object
# 열(column) 삭제
test = data.drop('employee_id', axis=1)
test.head()

department region education gender recruitment_channel no_of_trainings age previous_year_rating length_of_service awards_won? avg_training_score is_promoted
0 Sales & Marketing region_7 Master's & above f sourcing 1 35 5.0 8 0 49 0
1 Operations region_22 Bachelor's m other 1 30 5.0 4 0 60 0
2 Sales & Marketing region_19 Bachelor's m sourcing 1 34 3.0 7 0 50 0
3 Sales & Marketing region_23 Bachelor's m other 2 39 1.0 10 0 50 0
4 Technology region_26 Bachelor's m other 1 45 3.0 2 0 73 0

아주 기초적인 data 처리 방법들에 대해 알아봤다.
data의 수가 많아질 수록, 기본적인 개념이 헷갈리면 난항을 많이 겪으니 처음부터 기초를 확실하게 잡는 것이 좋다.
다음 Part에서는 머신러닝의 기본 골격을 잡아보자.


이번 Part에서는 아주 기초적인 data 처리 방법들에 대해 알아봤다.
data의 수가 많아질 수록, 기본적인 개념이 헷갈리면 난항을 많이 겪으니 처음부터 기초를 확실하게 잡는 것이 좋다.
다음 Part에서는 머신러닝의 기본 골격을 잡아보자.

혹시 내가 공부한 source들이 궁금하다면, Dream - GitHub를 참고하면 된다.

728x90

댓글