[데이터 전처리]1.데이터읽어오기

July 22 2021

데이터 전처리란?

  • 데이터 전처리란 데이터를 분석하기 전에 분석하기에 적합한 형태로 만드는 과정을 의미합니다.
  • 데이터 분석을 하기에 적합한 형태의 데이터가 있으면 좋겠지만 현실은 데이터에 결측치(비어있는 부분)가 많거나 이상치(패턴에 벗어난 값) 또는 정합성이 맞지 않는 경우가 대다수입니다.
  • 데이터의 품질이 낮아지는 원인으로는 측정오류와 수집과정 오류가 있습니다.
  • 측정 오류 : 사람의 실수로 잘못된 단위로 기록을 하거나 측정 장비 자체의 한계로 측정과정에서 발생하는 오류
  • 수집과정 오류 : 데이터 손실, 중복 등의 문제로 발생하는 오류
  • 데이터의 품질에 따라 모델 성능에 메우 큰 영향을 끼치므로 데이터 전처리는 매우 중요한 과정이며 80%의 시간을 데이터 수집과 전처리에 사용한다고 합니다.

파일 데이터 읽어오기

  • 데이터를 수집했다는 전제하에 전처리를 하려면 데이터를 가져와야겠죠?
  • 국가 공공데이터를 이용하거나 경진대회를 참가하는 등 파일에 저장된 데이터를 이용하여 분석하는 경우가 많습니다.
  • 파일형식의 종류는 csv, txt, xlsx, JSON, 이미지파일 등이 있는데 파일을 읽어올때는 pandas의 함수를 이용합니다.
  • 여기서는 일단 제일 많이 쓰이는 파일 형식중 하나인 csv파일을 읽어오는 연습을 해보겠습니다.
  • 그 밖의 파일 형식을 읽어오는 방법은 pandas공식 홈페이지에서 확인하시면 됩니다.

csv파일 읽어오기

  • read_csv(‘데이터 파일 경로’)를 이용하며 가장 기본이 되는 매개변수로는 데이터가 저장된 파일경로를 설정합니다.

read_csv의 매개변수

  • read_csv에 설정할 수 있는 매개변수의 수가 대충 세어봐도 2-30개가 되는데 그 중에 자주 쓰이는 매개변수 몇가지만 알아보겠습니다.
  • header=n
    • n번째 행을 컬럼으로 지정합니다.
    • 기본은 0번째 행을 컬럼을 지정합니다.
  • index_col=n
    • n번째 열을 인덱스로 지정합니다.
    • 생략하면 자동으로 숫자형 인덱스가 설정되어 파일을 읽어옵니다
  • sep=’구분자’
    • 슬래쉬’/’ 콤마’,’ 탭’\t’ 등 데이터가 나누어지는 단위구분자를 지정합니다.
    • 기본은 콤마’,’입니다.
  • encoding=’인코딩방식’
    • 한글인식이 되지 않을 때 사용되며 윈도우즈환경에서는 ms949 또는 cp949을, 웹에서는 euc-kr, 유럽문자는 iso_latin 를 그리고 utf-8설정이 있습니다.
  • thousands=’천단위 구분 기호’
    • 10,000과 같이 숫자에 콤마가 섞여있으면 파일을 읽어올 때 문자로 인식하여 데이터 타입이 object가 되어버리기 때문에 천단위 구분 기호로 숫자로 인식할 수 있도록 하기 위해 사용합니다.
  • DataFrame형식으로 반환됩니다.
  • 데이터를 읽어온 뒤에는 info()로 결측치가 있는지 또는 데이터의 형태나 타입을 확인하거나 데이터를 출력해서 어떤 데이터가 들어있는지 확인해야 합니다. 이를 데이터 탐색이라고 합니다.

자동차연료(mpg) 데이터 가져오기

import pandas as pd
#auto-mpg.csv 파일의 데이터 가져오기
mpg = pd.read_csv('./data/auto-mpg.csv',header=None)
mpg.head()
0 1 2 3 4 5 6 7 8
0 18.0 8 307.0 130.0 3504.0 12.0 70 1 chevrolet chevelle malibu
1 15.0 8 350.0 165.0 3693.0 11.5 70 1 buick skylark 320
2 18.0 8 318.0 150.0 3436.0 11.0 70 1 plymouth satellite
3 16.0 8 304.0 150.0 3433.0 12.0 70 1 amc rebel sst
4 17.0 8 302.0 140.0 3449.0 10.5 70 1 ford torino
  • 일단 가장 기본적으로 데이터를 출력해서 값들을 확인해봅니다.
  • 그리고 info()를 이용해 어떤 컬럼이 있는지 데이터에 이상한 값은 없는지, 결측치는 있는지, 데이터타입은 맞게 설정되있는지 등을 확인해야합니다.
  • 컬럼명이 없는 경우도 있는데 각 컬럼의 의미를 알고 있다면 컬럼명을 부여해주고, 수치형데이터임에도 문자형 object로 읽히는 경우에는 자료형을 변환해줍니다.
#컬럼 이름 만들기
mpg.columns = ['mpg','cylinder','displacement','horsepower','weight',
              'acceleration','model year','origin','name']
mpg.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 398 entries, 0 to 397
Data columns (total 9 columns):
 #   Column        Non-Null Count  Dtype  
---  ------        --------------  -----  
 0   mpg           398 non-null    float64
 1   cylinder      398 non-null    int64  
 2   displacement  398 non-null    float64
 3   horsepower    398 non-null    object 
 4   weight        398 non-null    float64
 5   acceleration  398 non-null    float64
 6   model year    398 non-null    int64  
 7   origin        398 non-null    int64  
 8   name          398 non-null    object 
dtypes: float64(4), int64(3), object(2)
memory usage: 28.1+ KB

문자가 포함된 수치형 데이터 처리

  • 데이터를 읽어오면 숫자데이터임에도 데이터타입이 문자(object)로 읽어지는 경우가 있습니다.
  • 숫자데이터 사이에 문자가 섞여지는 이유 중 하나로는 설문조사결과를 입력할때 결측치(존재하지 않는 값, 예를들어 ‘모름’이나 ‘응답없음’)를 하이픈(‘-‘), 스페이스(‘ ‘), 물음표(‘?’) 등과 같은 문자로 입력되었을 수도 있습니다.
  • 따라서 숫자데이터 사이에 문자가 섞여있는지 확인하여 결측치를 의미하는 경우에는 결측치처리(제거나 대체)를 하고, astype(‘변경하고자 하는 자료형’)으로 타입을 변환해줘야 합니다.
  • 또는 금액데이터에 천단위 구분 기호(,)가 있는 경우에도 이를 문자로 인식하므로 데이터를 읽어올 때 thousands=’,’매개변수를 설정해줌으로 숫자형으로 읽어올 수 있게 해줘야 합니다.

수치형 데이터의 자료형 변환순서

  • 숫자 데이터 사이에 문자 데이터가 포함되어있지는 않은가 확인해준다. value_counts함수 사용
  • 물음표 ?나 하이픈 - 등이 포함되어있으면 NaN으로 변환한다 - replace함수 사용
  • NaN이 포함된 행을 삭제한다 - dropna함수 사용 <- 이 과정은 다음 포스팅에서 설명
  • 자료형을 숫자형으로 변환한다 - astype함수 사용

숫자와 문자의 아스키코드범위가 달라 value_counts함수에 sort매개변수를 설정해주면 위나 아래쪽에 문자열이 포함된 것을 확인할 수 있습니다.

# 이해를 돕기 위한 unique()출력
# 실제로는 데이터수가 많아 unique함수로 문자를 찾기는 힘듦
print(mpg['horsepower'].unique())
print()
print(mpg['horsepower'].value_counts(sort=False))
['130.0' '165.0' '150.0' '140.0' '198.0' '220.0' '215.0' '225.0' '190.0'
 '170.0' '160.0' '95.00' '97.00' '85.00' '88.00' '46.00' '87.00' '90.00'
 '113.0' '200.0' '210.0' '193.0' '?' '100.0' '105.0' '175.0' '153.0'
 '180.0' '110.0' '72.00' '86.00' '70.00' '76.00' '65.00' '69.00' '60.00'
 '80.00' '54.00' '208.0' '155.0' '112.0' '92.00' '145.0' '137.0' '158.0'
 '167.0' '94.00' '107.0' '230.0' '49.00' '75.00' '91.00' '122.0' '67.00'
 '83.00' '78.00' '52.00' '61.00' '93.00' '148.0' '129.0' '96.00' '71.00'
 '98.00' '115.0' '53.00' '81.00' '79.00' '120.0' '152.0' '102.0' '108.0'
 '68.00' '58.00' '149.0' '89.00' '63.00' '48.00' '66.00' '139.0' '103.0'
 '125.0' '133.0' '138.0' '135.0' '142.0' '77.00' '62.00' '132.0' '84.00'
 '64.00' '74.00' '116.0' '82.00']

49.00    1
61.00    1
80.00    7
79.00    2
81.00    2
        ..
62.00    2
180.0    5
215.0    3
85.00    9
133.0    1
Name: horsepower, Length: 94, dtype: int64

그럼 이제 물음표를 replace함수를 이용해서 NaN으로 변환해줍니다.

import numpy as np

## ?를 nan으로 변환
mpg['horsepower'].replace('?',np.nan,inplace=True)

# ?부분이 nan로 변홥된 것을 확인할 수 있음
print(mpg['horsepower'].unique())
print()
print(mpg['horsepower'].value_counts(sort=False))
['130.0' '165.0' '150.0' '140.0' '198.0' '220.0' '215.0' '225.0' '190.0'
 '170.0' '160.0' '95.00' '97.00' '85.00' '88.00' '46.00' '87.00' '90.00'
 '113.0' '200.0' '210.0' '193.0' nan '100.0' '105.0' '175.0' '153.0'
 '180.0' '110.0' '72.00' '86.00' '70.00' '76.00' '65.00' '69.00' '60.00'
 '80.00' '54.00' '208.0' '155.0' '112.0' '92.00' '145.0' '137.0' '158.0'
 '167.0' '94.00' '107.0' '230.0' '49.00' '75.00' '91.00' '122.0' '67.00'
 '83.00' '78.00' '52.00' '61.00' '93.00' '148.0' '129.0' '96.00' '71.00'
 '98.00' '115.0' '53.00' '81.00' '79.00' '120.0' '152.0' '102.0' '108.0'
 '68.00' '58.00' '149.0' '89.00' '63.00' '48.00' '66.00' '139.0' '103.0'
 '125.0' '133.0' '138.0' '135.0' '142.0' '77.00' '62.00' '132.0' '84.00'
 '64.00' '74.00' '116.0' '82.00']

49.00    1
61.00    1
80.00    7
79.00    2
81.00    2
        ..
62.00    2
180.0    5
215.0    3
85.00    9
133.0    1
Name: horsepower, Length: 93, dtype: int64

⭐새로운 데이터를 읽어올 때는 type으로 데이터 타입을 출력해보는데 만약에 모르는 자료형이면 dir을 수행하여 어떤 메소드를 사용할 수 있는지 확인합니다.

Leave a comment