자격증/빅데이터분석기사

[빅분기] 실기 시험까지 D-24, 데이터 정제 등

mabb 2021. 11. 10. 23:49
반응형

안녕하세요. 삶의질을 높이기 위해 노력하는 영차영차입니다.
빅데이터분석기사 실기 시험을 위한 본인의 메모 및 공부 목적 포스팅입니다.

어렵다.
교재를 따라하는데 해도해도 계속 헷갈리고..
데이터 자격검정에서 제공하는 예제문제도 어렵다.

 

예제 작업형1)

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

 

예제 작업형2)

출처: 데이터 자격검정

 

 교재에서 공부한 내용을 토대로 작업형 1번 예제를 직접 해봄.

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

#mtcars 불러오기

import pandas as pd
mtcars = pd.read_csv('mtcars.csv')

print(mtcars)


#결측값 확인하기

print("qsec결측값",mtcars['qsec'].isnull().sum())
#print(mtcars['qsec'].value_counts())


#이상치 제거하기 /그래프를 안 쓰니 IQR 방식으로 제거해야 할 것 같음.

mtcars_qsec_q3 = mtcars['qsec'].quantile(0.75)
mtcars_qsec_q1 = mtcars['qsec'].quantile(0.25)
print('q3:',mtcars_qsec_q3,'q1:',mtcars_qsec_q1)
qsec_iqr = mtcars_qsec_q3 - mtcars_qsec_q1
print('iqr:',qsec_iqr)

#IQR 방식 이상값 제거 방법: q1(25%값) 에서 iqr*1.5를 뺀 값보다 작거나 q3(75%값) 에서 iqr*1.5를 더한 값보다 큰 값을 제거한다.

mtcars_iqr = mtcars[(mtcars['qsec'] > mtcars_qsec_q1 - qsec_iqr*1.5) & (mtcars['qsec'] < mtcars_qsec_q3 + qsec_iqr*1.5)]
print(mtcars_iqr.shape)


#MinMax스케일러 불러오기 minmax 정규화/ 값을 0~1 사의 값으로 전환하는 것. 이상값의 영향을 많이 받음.


#qsec를 MinMax 변환 해보기  / 뭐가 잘 안되서 열을 새로 만들어버림.

qsec_max = mtcars_qsec_iqr['qsec'].max()
qsec_min = mtcars_qsec_iqr['qsec'].min()
qsec_d = qsec_max - qsec_min
print('최대값:',qsec_max,'최소값:',qsec_min ,"차이:",qsec_d)

mtcars_new = mtcars_iqr.copy()
mtcars_new['qsec_new'] = (mtcars_iqr['qsec']- qsec_min) / (qsec_max - qsec_min)
mtcars_new['qsec_new']

# 0.5보다 큰 값을 가지는 레코드를 출력해보면

len(mtcars_new[mtcars_new['qsec_new'] > 0.5])

 

답이 18이 나왔는데 인터넷을 뒤져보니 정답이 9라고 함.
어딘가 잘못된게 분명한데 모르겠음. 괜히 배운걸 토대로 결측값도 있는지 확인해보고 요구하지도 않은
이상치를 제거해보려고 해봄.

 제대로 된 답을 도출하기 위해 다시 시도해보아야겠다.

공부한 것.

 

1) 데이터 불러오기

2) 데이터 탐색하기 / 데이터 분석의 목적

3) 데이터 정제하기 / 결측치, 이상값 등 제거

4) 머신러닝을 위해 정규화하기 / MInMaxScaler 가 대표적

5) 머신러닝 기법을 적용하기

6) 성능 검토하기

 

데이터 탐색과 정제

결측치 확인 기능

# 데이터세트.isnull()  // 컬럼 별 결측값 확인하기
  null값 , NAN로 표기됨. null 값이 True가 됨
  반대는 notnull

# 데이터세트.isnull().sum() // 컬럼 별 결측값의 합을 확인할 수 있음
  행 별로 확인할 때는 sum(1) 로 대입시킴.

결측치 제거 기능  (드롭나 라고 읽는 건가..)

# 데이터세트.dropna()
데이터세트.dropna(axis=0)  or 데이터세트.dropna()  (axis=0이 디폴트, axis(축)이 0이면 행(row) 
결측치가 있는 행 제거
 

데이터세트.dropna(axis=1)  
결측치가 있는 열 제거

결측치 대체 기능 // 자료가 많지 않을 경우 제거하는것보단 대체하는게 나을 수 있다고 함.

# 데이터세트.fillna() 
  fillna(0)  # 0으로 채움
  fillna('으어')  # '으어'로 채움
  fillna(method ='ffil')  # 프론트필 앞의 값으로 채움  ffil을 pad로 써도 됨
  fillna(method ='bfil') # 백필 뒤의 값으로 채움

이상치 제거 하기

이상치는 지나치게 크거나 작은 값.  데이터 분석을 하는데 안좋은 영향을 주기 때문에 제거해주어야 함.
변수들을 정규화하여 머신러닝에 적합하게 만들어주어야하는데 이상치가 있으면 정규화가 제대로 되지 않는다고 함.

빅분기 실기 시험에서는 그래프기능을 미제공하므로 hist 히스토그램으로 이상치를 눈으로 확인하지는 못할 것 같음.
IQR을 이용하여 이상치를 제거하는 방법을 써야하지 않을까 싶음.

 

오늘 공부한 IQR로 이상치 제거하는 방법 

사분위수 Q1(25%), Q2(50%,. 중위값,median), Q3(75%), Q4(100%)
IQR = Q3 -Q1
IQR로 정규화 하는 법
Q1-IQR*1.5 보다 작은 값 제거
Q3+IQR*1.5보다 큰 값 제거

예를들어 변수X의 값이 1,2,3,4,5,6,7,8,9,10일 때
Q1 = 3
Q3 = 8
IQR = 5

Q1-IQR*1.5 = 3-7.5 = -4.5
Q3+IQR*1.5 = 8+7.5 = 15.5

값들 중 지나치게 크거나 작은 것을 제거함.

 

MinMaxScale

MinMax정규화 라고함. 가장 큰 값을 1, 가장 작은 값을 0으로 만들어 버리는 정규화 방법.

#( 변수의 각각의 값 -  최소값) /  최대 값 - 최소값
가장 작은 최소값은 0 이 되고 최대값은 1이 됨.
변수에 직접 수식을 걸어서 구현 가능.

sklearn 사이킷런을 이용하여도 할 수 있는 것 같은데 공부가 필요함.
from sklearn.preprocessing import MinMaxScaler  사이킷런의 전처리 기능. 민맥스스케일러 불러오기

 

#csv 파일 만들기

new_data.to_csv('파일명.csv', index = False)

 

얼마 안 남은 시점 공부 전략..

1. 교재 빨리 끝내기. 핵심 코드 및 문제 위주로 암기 및 집중 공부하여 가지치기식으로 기능을 익혀나가기
2. 예제문제를 스스로 풀 수 있는 수준 + 다양한 문제 풀어보기
3. 단답형 개념 정리하기

 

반응형