빅데이터분석기사
실기 분류

제2회 빅데이터 분석기사(실기) - 작업형:제1유형(파이썬) 2

작성자 정보

  • ◆딥셀◆ 작성
  • 작성일

컨텐츠 정보

본문

지난 번 글(제2회 빅데이터 분석기사(실기) - 작업형:제1유형(파이썬) 1)에서는 간단하게 풀이 방법을 설명하였습니다. 

이번에는 초보자들을 대상으로 각 행의 의미와 왜 이렇게 푸는 것이 좋은지 그리고 어떻게 공부하며 준비하는 것이 좋은 지 설명해 보겠습니다.


우선 모듈과 라이브러리의 사용입니다. 공홈에 보면 시험 환경에 설치되어 있는 파이썬 패키지 목록이 있습니다. 이 목록이 실기 준비를 위한 중요한 힌트 중 하나입니다.


예제와 관련있는 패키지는 pandas와 sklearn(SK-Learn; 사이킷 런)입니다. 이 두개의 패키지는 데이터 전문가와 머신러닝을 하는 사람들에게는 가장 기본적인 패키지입니다. 실기 시험에서도 당연히 이 패키지를 다루는 능력을 요구하는 것 같습니다. 그래서 이런 기본 패키지에 익숙해 질 필요가 있기 때문에 가능한 한 이 패키지들을 활용하는 쪽으로 문제를 풀어야 합니다.


시험 환경에서는 하나의 파이썬 파일 편집창과 실행 결과 창이 주어지기 때문에 답을 제출하기 위해서는 하나의 파이썬 파일에 코딩을 해야합니다. 하지만 파이썬에 능숙하지 않은 준비자들이라면 준비하는 동안은 주피터 노트북(또는 주피터 랩)에서 공부하고 연습하는 것을 추천합니다. 주피터 노트북에서는 한 줄씩 실행하며 확인할 수 있기 때문에 학습능률이 매우 좋습니다.


이 전글의 코드를 보며 하나씩 설명하겠습니다.(초보자를 대상으로 아주 기본적인 개념도 다룰 예정입니다.)


import pandas as pd

파이썬에서는 다른 파일에 있는 모듈을 사용하기 위해 import를 해야합니다. 이 문장은 pandas라는 모듈을 사용하기 위해 import하라는 명령입니다. pandas는 파일에 있는 데이터를 읽어 와서 DataFrame이라는 타입의 데이터로 변환해 줍니다. DataFrame 타입은 엑셀과 같이 표와 같은 구조로 데이터를 사용할 수 있다고 생각하면 됩니다. 

import된 모듈을 그 이름으로 호출해서 사용할 수 있는데 많이 사용하는 모듈의 이름은 좀 간결하게 하는 것이 좋습니다. 그래서 뒤에 'as pd' 붙입니다. 그러면 이제부터는 pandas를 pd라는 이름으로도 부를 수 있습니다. pandas는 관례적으로 pd로 사용을 하기 때문에 항상 위 문장과 같이 import하는 것을 습관화 하는 것이 좋습니다.


mtcars_df = pd.read_csv('data/mtcars.csv') 

이 문장은 pandas에 있는 read_csv()라는 함수를 실행(호출)한 것입니다. pandas모듈에 있는 기능들을 사용할 때 이와 같이 .(마침표)을 찍고 연결하면 됩니다. pandas는 pd로 사용할 수 있기 때문에 간결하게 pd.read_csv()라고 실행하면 됩니다. 괄호 안에는 읽을 파일의 이름을 '' 또는 ""로 묶어서 넣어 주면 됩니다. 이 함수는 매개 변수로 받은 파일의 이름을 찾아서 데이터를 읽고 타입을 DataFrame으로 변환하여 반환합니다. 위 문장에서는 반환된 데이터를 mtcars_df라는 변수에 저장하였습니다.


아래와 같은 명령으로 읽어온 데이터를 확인할 수 있습니다. 데이터가 많을 수 있기 때문에 상위 일부만 보여주는 .head() 메써드를 사용하였습니다. 주피터 노트북에서는 print()문을 사용하지 않고도 mtcars_df.head()만 실행하여도 결과를 볼 수 있습니다.


print(mtcars_df.head())

주피터 노트북에서의 실행 결과(내용은 print()의 결과와 동일)


Unnamed: 0mpgcyldisphpdratwtqsecvsamgearcarb
0Mazda RX421.06160.01103.902.62016.460144
1Mazda RX4 Wag21.06160.01103.902.87517.020144
2Datsun 71022.84108.0933.852.32018.611141
3Hornet 4 Drive21.46258.01103.083.21519.441031
4Hornet Sportabout18.78360.01753.153.44017.020032


시험 환경에서는 데이터를 볼 수 있는 탭이 있으므로 데이터에 대한 파악이 쉽습니다. 미리 데이터를 보는 것이 좋습니다.

첫 번째 컬럼의 데이터가 숫자가 아니라 문자열입니다. 이 문제를 푸는데 도움이 안되므로 제거하는 것이 좋습니다. 제거하지 않으면 다음 스케일 변환에서 간단하게 처리하는데 방해가 됩니다. 방법은 아래와 같습니다.


mtcars_num_df = mtcars_df.iloc[:, 1:] 

이 문장은 전체 데이터에서 첫 번째 컬럼(열)을 제거하는 일을 합니다. 

mtcars_df는 DataFrame 타입의 데이터입니다. DataFrame에는 .iloc라는 매써드가 있는데 이 메써드는 DataFrame의 일부분을 선택할 수 있게 해 줍니다. 기본 사용법은 [ : , : ]과 같은 형식입니다. 


  [처음행:마지막 전행, 처음열:마지막 전열]  

  예) : [0:3, 1:2] : 0행(첫번째 행)부터 2행(세번째 행)까지와 1열(두번째 열)만 선택


DataFrame의 인덱스는 0부턱 시작합니다. 그리고 : 뒤의 수(행, 열)의 전 값까지를 선택합니다.

그리고 위의 코드와 같이 값이 없는 경우는 전부를 선택한다고 생각하면 됩니다. 그래서 위 코드의 [:, 1:]는 모든 행을 선택하고 1열(두 번째 열)부터 모든 열을 선택한다는 의미입니다. 즉 첫번째 열(0열)을 빼고 모든 데이터를 선택하는 것입니다.


이제 모든 데이터값이 숫자이므로 스케일 변환에 문제가 없습니다. sklearn에 있는 MinMaxScaler를 사용할 것입니다. 코드를 보겠습니다.


from sklearn.preprocessing import MinMaxScaler


scaler = MinMaxScaler()

scaler.fit(mtcars_num_df)


mtcars_scaled_df = pd.DataFrame(scaler.transform(mtcars_num_df), columns=mtcars_num_df.columns)

먼저 import를 합니다. 이 번에는 문법이 조금 다릅니다. sklearn에 있는 많은 모듈들 중에서 필요한 것만 import하기 위한 방법입니다. 직관적으로 이해하기 쉽습니다. sklearn의 하위에 있는 preprocessing모듈에 있는 MinMaxScaler만을 임포트합니다.


다음은 MinMaxScaler를 사용하는 방법입니다. MinMaxScaler()를 실행하면 Min-Max Scale을 할 수 있는 객체를 만들어서 반환합니다. 이 객체를 scaler라는 변수에 저장을 합니다.


scaler는 이제 주어진 데이터를 스케일할 수 있는 능력을 가지고 있습니다. scaler에 있는 .fit() 메써드에 입력값으로 DataFrame을 주면 각 열에 대하여 최소값과 최대값을 계산하여 Min Max 스케일 변환을 할 수 있는 준비를 합니다. 위 코드에서는 mtcars_num_df를 입력값으로 주었습니다. 실제로 필요한 것은 qsec 열 하나 이지만 전체 데이터의 크기도 작고 MinMaxScaler가 디폴트로 전체 열들을 모두 스케일 변환하기 때문에 모든 데이터를 처리하는 것이 더 간단합니다. 이렇게 하기 위해서 오류가 날 수 있는 문자열이 있는 열을 미리 제거한 것입니다.


다음에는 실제 데이터를 스케일 변화하여 저장을 한 것인데 설명을 위해서 코드를 풀어 보겠습니다.


mtcars_scaled_df = pd.DataFrame(scaler.transform(mtcars_num_df), columns=mtcars_num_df.columns)

이 코드는 풀어쓰면 다음과 같습니다.

mtcars_scaled = scaler.transform(mtcars_num_df)
mtcars_scaled_df = pd.DataFrame(mtcars_scaled, columns=mtcars_num_df.columns) 

먼저 scaler.transform(mtcars_num_df)로 스케일 변환을 합니다. 이 한 줄로 우리가 원하는 Min-Max Scale 변환이 끝납니다. 그런데 이 결과는 데이터 타입이 어레이(array)로 반환됩니다. 이 어레이 타입의 데이터에서 0.5보다 큰 레코드의 수를 세는 것보다 DataFrame의 데이터에서 이 작업을 하는 것이 더 쉽고 간단합니다. 그리고 시험 준비를 하는 입장에서 pandas의 DataFrame을 가능한 한 많이 활용하면서 익숙해지는 것이 좋습니다.

그래서 이 결과를 DataFrame으로 변환한 것이 위 코드의 2번째 줄입니다. pd.DataFrame은 입력된 어레이 데이터를 DataFrame 타입으로 변환 해 줍니다. 이 때 컬럼을 지정할 수 있습니다. 위 코드에서는 원래 데이터의 컬럼 값을 그대로 다시 준 것입니다. 이렇게 함으로써 모든 데이터가 Min-Max 스케일 변환된 DataFrame 타입의 데이터를 갖게 되었습니다. 결과를 확인해 보면 다음과 같습니다.


mtcars_scaled_df.head()

mpgcyldisphpdratwtqsecvsamgearcarb
00.4510640.50.2217510.2049470.5253460.2830480.2333330.01.00.50.428571
10.4510640.50.2217510.2049470.5253460.3482490.3000000.01.00.50.428571
20.5276600.00.0920430.1448760.5023040.2063410.4892861.01.00.50.000000
30.4680850.50.4662010.2049470.1474650.4351830.5880951.00.00.00.000000
40.3531911.00.7206290.4346290.1797240.4927130.3000000.00.00.00.142857

 위의 결과를 보면 모든 데이터가  0부터 1사이의 값을 갖는 것을 볼 수 있습니다. Min-Max 스케일 변환은 전체 데이터 중 가장 큰 값을 1로 하고 가장 작은 값을 0으로 되도록 변환하는 것입니다. 수식으로 보면 다음과 같습니다.


$$ x_1 = \frac{x - min(x) }{max(x) -min(x)} $$


이제 변환까지 잘 된 것 같습니다. 0.5 보다 큰 값들만 골라서 숫자를 세면 됩니다. 코드를 보겠습니다.


answer = len(mtcars_scaled_df[mtcars_scaled_df.qsec > 0.5]) 

이 한 줄의 코드로 끝납니다. DataFrame의 편리함입니다. 설명을 위해 이 코드도 나누어 보겠습니다.


up_df = mtcars_scaled_df[mtcars_scaled_df.qsec > 0.5]

answer = len(up_df) 

위 코드의 첫 줄은 전체 데이터 중에서 qsec 열에 있는 값이 0.5보다 큰 값들만 선택한 것입니다. 이 값을 up_df에 저장합니다. len()함수는 입력받은 DataFrame의 행의 수를 반환합니다. 이렇게 반환 값을 answer에 저장한 다음 print()문으로 출력하면 됩니다.


간단한 내용을 기본적인 내용까지 설명하다 보니 좀 길어졌습니다. 

오류가 있거나 더 필요한 내용들이 있으시면 댓글 달아 주시기 바랍니다. 

관련자료

댓글 0
등록된 댓글이 없습니다.

최근글


새댓글


알림 0