데이터 먼징 : 문자열 다루기, 정규표현식, 데이터 정리

이수진·2024년 4월 5일
0

상태가 안좋은 데이터?

  1. 데이터 형식 문제
    • 영어 대소문자가 엉망
    • 무의미한 공백이 있는 데이터
  2. 실제 데이터에 문제가 있는 경우
    • 중복
    • 특수하거나 예외적인 값이 존재

데이터를 전처리 하기 전에

  • 문자열 데이터를 사용한다면 데이터를 열어 직접 확인하라
  • 설명서가 있다면 꼭 읽어라
  • 다양한 데이터에 적용 가능한 공통 질문 목록을 만들어라
  • 이미 정답을 아는 값을 직접 추출해 정답과 비교하라

데이터 자체의 문제가 있는 경우 해결하는 법

  1. 중복 데이터
    중복데이터를 하나의 표본으로 간주하는 경우, 중복 데이터를 하나로 병합하는 경우가 있음

  2. 같은 의미의 값이 여러 개 존재
    중복데이터와 조금 다르다. 데이터를 갱신하며 오래된 값과 새 값을 같이 저장하며 일어나게 되는 문제.(일부 데이터를 여러 번 사용하게 되면 기록이 여러번 남을 수 있다.)
    예를 들어, 공장에서 문제가 있는 부품을 고쳐 재활용 하면 기존 식별자를 그대로 사용하게 된다.

    식별자1 -> 고장
    식별자1 -> 정상 작동

  3. 데이터 누락
    이럴 때는 비어있는 데이터를 그냥 둘지, 특정 값으로 채울지를 결정해야 한다.

  4. NULL 값
    다른 데이터를 보고 값을 추정하고나, NULL이 아닌 표본의 평균을 사용하는 방법 등이 있다.
    수집과정에서 누락된 데이터가 NULL로 채워져 있기도 하다. 상황에 따라 NULL값의 여부 자체를 특징 값으로 활용할 수 있다.

  5. 이상치
    이상치 자체를 데이터에서 완전히 배제하는 경우
    데이터 누락때문에 이상치가 생기는 경우-> NULL값을 사용하거나, 미리 정해놓은 값을 NULL값 대신 사용하기

  6. 오래된 데이터
    필요에 따라 너무 오래된 데이터는 걸러내고 사용한다.

  7. 인공 데이터
    인공 데이터란 실제로 존재하는 값을 측정한게 아니고, 사람이 만든 데이터.
    시스템 시험용으로 만든 데이터.

  8. 불규칙한 데이터 수집
    보통의 데이터는 일정한 간격으로 수집한다. 따라서 일정한 간격이 아니라면 문제가 발생한다.
    내삽법으로 간격을 일정하게 바꾸어 주기도 한다.
    같은 시각에 다른 데이터가 기록되어 있는 경우도 있다. -> 이 경우 시각을 기록하는 정밀도가 너무 낮기 때문에 발생하는 문제

    ex) 시각을 분단위로 기록하며 측정을 초단위로 한다면 서로 다른 데이터가 같은 시각에 기록된 것 처럼 보일 수 있음!

데이터 형식 문제인 경우 해결하는 법

  1. 표 또는 열마다 다른 형식을 사용한 경우
    호환성에 주의하며 데이터 셋을 병합한다.

  2. 공백문자
    파이썬에서는 strip()이라는 메서드로 문자열 앞뒤 공백문자를 제거한다.

  3. 불규칙한 대소문자 사용
    파이썬에서는 lower()과 upper()메서드를 사용할 수 있다.

  4. 불규칙한 구분 기호
    열을 나누는 기준이 되는 구분 기호는 통일해서 사용해야 한다.

    콤마( , ), 탭(\t) , 파이프( | )

  5. 불규칙한 NULL문자
    NA, unavailable, unknown 등으로 표현된 경우가 있음 ! 통일해서 사용하기

  6. 유효하지 않은 문자 사용
    인코딩 문제로 글자가 깨지는 경우 있음. 이 경우 걸러낸다.

s.decode("asci", "ignore") #아스키 기준에 적합하지 않은 경우는 무시하기
  1. 불규칙한 날짜 및 시간 표기
    파이썬 dateutil 사용해 걸러내기
import deteutil.parser as p
p.parse("August 13, 1985")
  • 만일 시간 정보가 없다면 0시
  1. 운영체제 호환문제
    맥OS -> \n
    윈도우 -> \r\n



정규표현식

패턴유형정규식참고
문자열abc123abc123을 찾기
:---::---::---:
문자 반복a*b*앞의 문자열이 반복된다고 가정하고(0회 포함) 반복되는 모든 문자를 가져온다.
최소 1회 이상 문자 반복a+b+앞의 문자가 최소 1회 이상 반복하는 경우 문자 가져옴
최대 1회 이하 문자 반복a?b?앞의 문자가 0회 혹은 1회 반복되는 경우 문자 가져옴
정해진 횟수만큼 문자 반복a{5}aaaaa 찾기
정해진 횟수만큼 특정 패턴 반복(a*b){3}a가 반복(0회 포함)되는 ab 문자를 3번 반복하는 문자 출력
특정 패턴 반복, 반복횟수 범위로 정의a{2, 4}2, 3, 4회 a를 반복
정해진 문자 후보 중 1개 등장[a,b]c대괄호 내부의 문자열 중 하나가 나타나면 됨
[]와 *의 조합[ab]*c*가 []에 적용되어 대괄호 내부 문자열중 하나가 임의 횟수만큼 반복
가능한 문자 후보를 범위로[A-H][a-z]a~h, A~H까지 허용
제외할 문자 정의[^AB]대괄호 내 문자만 아니면 됨
문자열 후보 제시Dr|Mr|Ms|Mrs주어진 문자열 중 하나면 됨
괄호, |, *를 조합한 예시([A-Z]|[a-z])*알파벳 대문자 혹은 소문자로 이루어진 모든 문자
행의 시작 부분 탐색^abab로 시작하는 모든 행
행의 종료 부분 탐색ab$ab로 끝나는 모든 행
특수문자\["[" 찾기
개행문자를 제외한 모든 문자열.a, *, _, .
비탐욕적 탐색<.*>?<>로 둘러싼 모든 문자열중 짧은 것을 찾음
빈칸\s공백, 탭, 개행문자 찾음
import re

# 0~9로 시작 + 빈칸 + A~Z로 시작하거나, a~z로 시작하는 문자가 0회 이상 반복되는 경우
# 1600 pennsylvania를 찾을 수있음
pattern = r"^[0-9]\s[A-Z][a-z]*" 
profile
뇽안

0개의 댓글