본문 바로가기

자격증/빅분기 실기

[작업형 1] Data Scaling(1) Min-Max Scaling하는 두 가지 방법

안녕하세요....... 벼락치기에 돌입한 갓생도전입니다 ^-^

 

 

필답형이 빠지고 작업형3이 추가가 된다는 소식에 멘붕에 빠지면서 그냥 작년에 시험 볼 걸... (급 현타로 미응시함) 하는 생각이 마구 들었지만 뭐 어쩌겠어요 해야지요

그런데말입니다 이 공지를 3월말인가 4월초에 확인해놓고 이제야 공부하는 저는 뭘까요

 

그런데 한창 데이터 쪽 공부를 하고 있던 작년과는 다르게 깡통이 되어버린 제 머리에 다시 지식을 주입시키기란 여간 어려운 일이 아니더군요

그래서 블로그에 틈틈히 기록하며 공부를 해보려 합니다 ^_ㅠ 5회 실기를 준비할 땐 넘 쉬워서 거저 주는 문제들이라고 생각했던 작업형 1유형 문제들에서 끙끙대는 절 보며 정말 한숨만 나왔답니다 하하

 

암튼 이 글을 보시는 여러분 모두 같이 힘내요 파이팅,,,


이번 포스팅에서 정리할 개념은 data scaling입니다

 

데이터자격검정센터에서 직접 제공하는 체험환경과 예시문제를 들고왔어요!

https://dataq.goorm.io/exam/116674/%EC%B2%B4%ED%97%98%ED%95%98%EA%B8%B0/quiz/1

 

구름EDU - 모두를 위한 맞춤형 IT교육

구름EDU는 모두를 위한 맞춤형 IT교육 플랫폼입니다. 개인/학교/기업 및 기관 별 최적화된 IT교육 솔루션을 경험해보세요. 기초부터 실무 프로그래밍 교육, 전국 초중고/대학교 온라인 강의, 기업/

edu.goorm.io

해당 링크에 들어가시면 jupyter, colab 등으로 파이썬을 구동하셨던 분들은 당황하실 수도 있는 작업환경이 등장합니다

반드시 print()를 입력해야 보고싶은 값을 출력할 수 있어요!! 

 

제1유형

mtcars 데이터셋(data/mtcars.csv)의 qsec 컬럼을 최소최대 척도(Min-Max Scale)로 변환한 후 0.5보다 큰 값을 가지는 레코드 수를 구하시오.

 

#데이터 불러오기
import pandas as pd
a = pd.read_csv('data/mtcars.csv'), index_col = 0)

#사용자 코딩

이 때 scaling을 진행하는데에 있어 두 가지 방법이 있는데, 한 가지는 sklearn 패키지 안의 라이브러리를 사용하는 것이고 다른 한 가지는 최소최대 척도의 원리대로 직접 계산하는 것입니다.

 

Way1. MinMaxScaler 사용하기

이건 딱히 원리랄게 없고 MinMaxScaler를 사용할 줄만 알면 바로 할 수 있으므로 곧장 코딩에 들어가겠습니다.

 

from sklearn.preprocessing import MinMaxScaler as mM

mM = mM()
a.qsec = mM.fit_transform(a[['qsec']]) #mM은 데이터프레임에만 적용됨. a.qsec은 array라서 꼭 df화 시켜주기

print(len(a[a.qsec > .5]))

제가 항상 헤매는 지점이 fit_transform()은 array에 사용할 수 없어 a.qsec을 []로 감싸 df화 시켜주는 부분인데요.....

a[a['qsec']] 등 희한한 코딩으로 몇 번이나 오류를 내곤 했습니다

 

이젠 외우려구용 a[['컬럼명']] ^__^

 

Way2. 공식 활용하기

Min-Max Scale은 최소값을 0으로, 최대값을 1로 두고 모든 값을 0~1 사이로 변환시키는 스케일링 기법입니다.

 

모든 값을 (값 - 최소값) / (최대값 - 최소값) 로 변환하면 되겠네요!

 

a.qsec = (a.qsec - min(a.qsec))/(max(a.qsec) - min(a.qsec))

print(len(a[a.qsec > .5]))

혹은

mM = (a.qsec - min(a.qsec))/(max(a.qsec) - min(a.qsec))

print(sum(mM>.5))

단 두 줄로 간단히 답을 구할 수 있습니다. 

 

여기서 len과 sum의 차이를 확인할 수 있는데요,

sum의 경우 true인 값들을 더하기 때문에 바로 a.qsec>0.5 라는 조건을 집어 넣을 수 있습니다.

하지만 len은 데이터의 개수를 세기 때문에 len(a.qsec > .5)를 print하면 a.qsec가 총 몇 행인지가 반환됩니다!

그래서 len(a[a.qsec > .5])를 print해야 정확한 수를 반환받을 수 있답니닷 

 

사실 이거 보는 분 중 헷갈리는 분은 없을것 같습니다만 제가 헷갈리니까용^^

개인적으로 sum이 더 간편하긴 하지만 len이 더 익숙하므로 실제 시험에서는 len을 주로 사용할 것 같습니당ㅎㅎ

 

작업형의 경우 결과만을 보지 풀이과정은 확인하지 않으므로 무조건 라이브러리를 사용하는것이 능사는 아니겠네요!

 

그럼 이렇게 data scaling 중 하나인 MinMax Scale에 대해 알아보았습니다 ^-^