[Python]데이터 전처리

2023. 12. 22. 16:29· 공부/Python
목차
  1. AI 데이터 분석 과정
  2. 데이터 클린징
  3. 결측 데이터
  4. 결측 데이터 확인
  5. 실습 평균 풍속 결측치 출력
  6. 결측치 개수 확인
  7. 결측치 제거, 대체
  8. 실습. 결측치 데이터 삭제
  9. 실습. 결측치 데이터 대체
  10. 실습. 결측치 데이터 대체
  11. 이상 데이터
  12. 이상데이터 시각화
  13. 이상 데이터 처리 방법
  14. 중복 데이터 처리
  15. 중복 데이터 확인
  16. 실습 . 데이터 중복 제거
  17. 데이터 연결 중요 
  18. 데이터프레임 연결
  19. 그룹 분석
  20. 그룹 분석 절차
  21. 필터링 - 논리 인덱싱 사용
  22. 데이터정렬 - 판다스 데이터프레임 정렬 메소
  23. 데이터 재구조화
  24. 피봇 테이블(Pivot table)
반응형

AI 데이터 분석 과정

Untitled.png

  • 데이터 수집
    • 오픈 데이터 API, 웹 크롤링, 파일 읽기, DB 엑세스
  • 데이터 전처리 : 넘파이**,** 판다스 활용
    • 데이터 클린징**,** 데이터 연결과 병합**,** 데이터 재구조화
  • 데이터 분석/응용
    • 데이터 시각화(맷플롯립 활용), 기계학습

데이터 클린징

• 편향 없이 명확하고 깨끗한 데이터를 확보하는 작업

  • 데이터 클린징 작업
    • 결측 데이터 처리
      • 결측 데이터 확인
      • 결측 데이터 대체/제거 [평균 대체법]
      • 결측 데이터 반영 확인
  • 이상 데이터 처리
    • 이상 데이터 확인
    • 이상 데이터 대체/제거
    • 이상 데이터 처리 확인
  • 중복 데이터 처리
    • 중복 데이터 확인
    • 중복 데이터 처리(유일한 1개 키만 남기고 나머지 중복 제거)

결측 데이터

  • 결측값(Missing data)
    • 데이터 누락값
  • 결측값이 있는 상태로 분석하게 되면 변수간의 관계가 왜곡
    • 분석의 정확성이 떨어짐
  • 판다스에서는 결측값을 'NaN(Not a Number)' 으로 표기
    • 'None'도 결측값을 의미
  • 결측값을 처리 방법
    • 제거(Deletion)
      • 결측값을 포함한 행, 열을 삭제하는 것
    • 대체(Imputation)
    • 결측값을 다른 값(예, 대표값인 평균)으로 변환하는 방법

결측 데이터 확인

  • 판다스 isnull() 메소드 = isna() 메소드
    • 결측 데이터이면 True값을 반환
    • 유효한 데이터가 존재하면 False를 반환
  • 판다스 notnull() 메소드
    • 유효한 데이터가 존재하면 True를 반환
    • 누락 데이터면 False를 반환

Untitled.png

두 메소드를 사용하면 모든 값에 대해 True, False로 바뀐다.

실습 평균 풍속 결측치 출력

# 평균 풍속 결측치 출력
import pandas as pd
import matplotlib.pyplot as plt
import datetime as dt

weather = pd.read_csv('https://raw.githubusercontent.com/dongupak/DataSciPy/master/data/csv/weather.csv',
                      encoding='CP949')
weather[ weather['평균풍속'].isna() == True ] # null 데이터만 가지고 있는 행만 추출해줘

Untitled.png

결측치 개수 확인

  • 판다스 결측치 개수 확인 함수
  • 칼럼별(행방향) 결측값 개수 구하기
    • df.isnull().sum() == df.isnull().sum(0)
  • 행(row) 단위(열방향)로 결측값 개수 구하기
    • df.isnull().sum(1)
  • 행(row) 단위(열방향)로 실제값 개수 구하기
    • df.notnull().sum(1)

행방향은 0 , 열방향은 1

결측치 제거, 대체

  • 결측치 제거 메소드
    • 행 삭제
      • df.dropna(axis=0)
    • 열 삭제
      • df.dropna(axis=1)
      • df.dropna()
  • 결측치 대체 메소드
    • 결측값을 특정 값으로 채우기
      • df.fillna(0)
    • 결측값을 특정 문자열로 채우기
      • df.fillna(‘ ‘)
    • 결측값을 변수별 평균으로 대체
      • df.fillna(df.mean())

실습. 결측치 데이터 삭제

  • weather. dropna(axis=0, how=“any”, inplace=True)
    • axis=0 → 결측치를 포함하는 행 삭제
    • how=“any” → 하나의 칼럼이라도 NaN이면 행 삭제
    • inplace=True → 현재 데이터프레임에 변경 적용
# 결측치 데이터 삭제

weather = pd.read_csv('https://raw.githubusercontent.com/dongupak/DataSciPy/master/data/csv/weather.csv',
                      encoding='CP949')
weather.dropna(axis = 0, how="any", inplace=True)
weather[ weather['평균풍속'].isna() == True]
# 결측치를 포함하는 행, 하나의 컬럼이라도 NaN이면 행 삭제, 현재 데이터 프레임에 적용

Untitled.png

실습. 결측치 데이터 대체

  • weather. fillna(0, inplace=True)
    • 0 → 결측치를 0으로 대체
    • inplace=True → 현재 데이터프레임에 변경 적용
weather = pd.read_csv('https://raw.githubusercontent.com/dongupak/DataSciPy/master/data/csv/weather.csv',
                      encoding='CP949')

weather.fillna(0, inplace = True)
weather[ weather['평균풍속'] == 0.0 ]
# 결측치를 0으로 대체

Untitled.png

실습. 결측치 데이터 대체

  • 평균값으로 결측치를 대체
    • weather['최대풍속'].fillna(weather['최대풍속'].mean(), inplace=True)
    • weather['평균풍속'].fillna(weather['평균풍속'].mean(), inplace=True)
weather = pd.read_csv('https://raw.githubusercontent.com/dongupak/DataSciPy/master/data/csv/weather.csv',
                      encoding='CP949')

weather['최대풍속'].fillna(weather['최대풍속'].mean(), inplace=True)
weather['평균풍속'].fillna(weather['평균풍속'].mean(), inplace=True)


weather[ weather['일시'] == '2012-02-11' ]

Untitled.png

이상 데이터

  • 정상에서 벗어난 데이터를 이상치(Outlier)
  • 이상탐지(Anomaly Detection)
    • 이상한(비정상적인) 데이터를 검출하는 것
  • 이상데이터 처리 방법
    • 이상데이터 확인
    • 이상데이터 결측 대체/제거
    • 이상데이터 반영 확인

Untitled.png

⬆️⬆️⬆️ 이상데이터

이상데이터 시각화

  • 박스(Box)
    • 25%(Q1) ~75%(Q3) 까지 값
  • 수염 (whiskers)
    • 박스의 각 모서리(Q1, Q3)로 부터 1.5배 내에 있는 가장 멀리 떨어진 데이터 점까지 이어져 있는 것
  • 이상치(Outlier)
    • 수염(whiskers)보다 바깥쪽 데이터

Untitled.png

이상 데이터 처리 방법

  • 단순 삭제
    • 이상값이 논리적 에러 에 의해서 발생한 경우 해당 관측치를 삭제
    • 단순 오타나, 주관식 설문 등의 비현실 적인 응답, 데이터 처리 과정에서의 오류 등의 경우에 사용
  • 다른 값으로 대체
    • 데이터의 개수가 작은 경우
    • 관측치를 삭제하는 대신 다른 값(평균 등)으로 대체
  • 변수화
    • 자연발생적인 이상값의 경우
  • 리샘플링
    • 해당 이상값을 분리해서 모델을 만드는 방법
  • 케이스분리 분석
    • 자연 발생한 이상값에 별다른 특이점이 발견되지 않는다면, 단순 제외 보다는 분석 케이스를 분리하여 분석

중복 데이터 처리

  • 데이터를 수집하는 과정 중 또는 데이터를 병합하는 단계에서 오류 등으로 인해 데이터가 중복 발생
  • 특히, 유일한 키(key) 값을 관리해야 하는 경우 중복(Duplicates)데이터가 발생하면 분석에 영향을 끼칠 수 있음
  • 데이터 분석 전에 중복 데이터를 확인하고 처리하는 데이터 클린징 작업 필요
  • 판다스 중복 데이터 처리 메소드
    • 중복 데이터 확인
      • df.duplicated()
    • 중복값 삭제
      • df.drop_duplicates()

중복 데이터 확인

  • 중복이 있으면 처음이나 끝에 무엇을 남길지 확인
  • df.duplicated([칼럼명], keep=‘first’)
    • keep='first' → default
      • 중복값이 있으면 첫번째 값을 duplicated 여부를 False로 반환
      • 나머지 중복값에 대해서는 True를 반환
    • keep=‘last’
    • keep=False
      • 처음이나 끝값인지 여부는 고려를 안하고 중복이면 무조건 True를 반환
# 데이터 중복 확인 
import pandas as pd

data = {'key1':['a', 'b', 'b', 'c', 'c'],
        'key2':['v', 'w', 'w', 'x', 'y'],
        'col':[1, 2, 3, 4, 5]}

df = pd.DataFrame(data, columns=['key1', 'key2', 'col'])

print(df.duplicated(['key1']))
print('------------------------------')
print(df.duplicated(['key1','key2']))

Untitled.png

실습 . 데이터 중복 제거

# 데이터 중복 제거

import pandas as pd

data = {'key1':['a', 'b', 'b', 'c', 'c'],
        'key2':['v', 'w', 'w', 'x', 'y'],
        'col':[1, 2, 3, 4, 5]}

df = pd.DataFrame(data, columns=['key1', 'key2', 'col'])

print(df.duplicated(['key1']))

df.drop_duplicates(['key1'], keep='first')

Untitled.png

데이터 연결 중요 

  • 데이터프레임을 행과 열로 위/아래로 결합하는 방법
  • 인덱스 값 중복에 주의 필요
  • 판다스 데이터프레임 연결 메소드
    • df.concat()
    • df.append()

Untitled.png

axis 0 이면 행을 확장

axis 1 이면 열을 확장

데이터프레임 연결

  • pd.concat(df_list, axis=0, join=‘outer’) 함수
    • df_list → 합칠 데이터프레임의 리스트
    • axis = 0 → 행방향 연결(행 확장), 칼럼 조인
    • join=‘outer’ → 칼럼들의 합집합 (cf. inner : 칼럼들의 교집합)

Untitled.png

axis 여부에 따라서 어떻게 되는지 확인!!!! 시험문제나

Untitled.png

그룹 분석

  • 분석 대상 변수를 그룹별로 데이터를 집계하여 진행하는 분석
  • 특정한 조건에 맞는 데이터가 하나 이상 데이터 그룹을 이루는 경우 자주 사용
  • 그룹 분석은 대부분 ‘범주형 변수’ 가 그룹 연산의 기준
  • 일반적으로 범주형과 연속형이 결합된 경우 그룹 분석 진행

Untitled.png

그룹 분석 절차

  • 몇몇 기준(범주형)에 따라 여러 그룹으로 데이터를분할(splitting)
    • 예) 반별 그룹
  • 각 그룹에 독립적으로 함수를적용(applying)
    • 예) 반별 평균
  • 결과물들을 하나의 데이터 구조로결합(combining)
    • 예) 반별 평균결합
    Untitled.png
    • 그룹 평균 : means = weather.groupby('month').mean()
    • 그룹 합계 : sums = weather.groupby('month’).sum()
    # 그룹 평균과 합계
    import pandas as pd
    
    weather = pd.read_csv('https://raw.githubusercontent.com/dongupak/DataSciPy/master/data/csv/weather.csv',
                          encoding='CP949')
    weather['month'] = pd.DatetimeIndex(weather['일시']).month
    means = weather.groupby('month').mean()
    print(means)
    Untitled.png
    import pandas as pd
    import matplotlib.pyplot as plt
    import datetime as dt
    
    weather = pd.read_csv('https://raw.githubusercontent.com/dongupak/DataSciPy/master/data/csv/weather.csv',
                          encoding='CP949')
    weather['month'] = pd.DatetimeIndex(weather['일시']).month
    means = weather.groupby('month').mean()
    means['평균풍속'].plot()
    
    plt.show()
    Untitled.png
  • 실습. 월 평균 풍속 그래프
  • 그룹 평균과 합계

필터링 - 논리 인덱싱 사용

• 데이터프레임 열벡터에 논리 연산을 적용하여 필터링을 위한 논리 배열 생성

import pandas as pd
import datetime as dt

weather = pd.read_csv('https://raw.githubusercontent.com/dongupak/DataSciPy/master/data/csv/weather.csv',
                      encoding='CP949')
weather['month'] = pd.DatetimeIndex(weather['일시']).month
weather[ weather['최대풍속'] >= 10.0]

Untitled.png

데이터정렬 - 판다스 데이터프레임 정렬 메소

  • df.sort_values(열이름, ascending=True, inplace=True)
    • 열이름 → 정렬 기준
      • 정렬 기준으로 [열이름 리스트] 지정 가능
    • ascending=True → 오름 차순 정렬
    • inplace=True → 현재 데이터프레임 정렬

데이터 재구조화

  • Reshaping이라고 함
    • 분석 과정에서 원본 데이터의 구조가 분석 기법에 맞지 않아 행과 열의 위치를 바꾸는 경우
    • 특정 요인에 따라 집계 해서 구조를 변경하는 경우

• 판다스 재구조화 관련 기능

Untitled.png

피봇 테이블(Pivot table)

  • 많은 양의 데이터에서 필요한 자료만을 뽑아 새롭게 테이터를 재구성하는 기능
    • 피봇 테이블을 사용하면 사용자가 원하는 대로 데이터를 정렬하고 필터링 가능
  • 판다스는 피봇테이블 관련 메소드
    • df.pivot(index, columns, values)
    • 첫번째 인수 행 인덱스로 사용할 열 이름, 두번째 인수 열 인덱스로 사용할 열 이름, 세번째 인수 데이터로 사용할 열 이름
    • 데이터 열 중에서 두 개의 열을 각각 행 인덱스, 열 인덱스로 사용하여 데이터를 조회하여 펼쳐 놓은 표(데이터프레임) 반환
# 피봇 테이블
import pandas as pd

df_1 = pd.DataFrame({'item': ['ring0', 'ring0', 'ring1', 'ring1'],
                     'type': ['Gold', 'Silver', 'Gold', 'Bronze'],
                     'price': [20000, 10000, 50000, 30000]})

df_2 = df_1.pivot(index='item', columns='type', values='price')
# index 행으로 지정 
print(df_2)

Untitled.png

반응형
  1. AI 데이터 분석 과정
  2. 데이터 클린징
  3. 결측 데이터
  4. 결측 데이터 확인
  5. 실습 평균 풍속 결측치 출력
  6. 결측치 개수 확인
  7. 결측치 제거, 대체
  8. 실습. 결측치 데이터 삭제
  9. 실습. 결측치 데이터 대체
  10. 실습. 결측치 데이터 대체
  11. 이상 데이터
  12. 이상데이터 시각화
  13. 이상 데이터 처리 방법
  14. 중복 데이터 처리
  15. 중복 데이터 확인
  16. 실습 . 데이터 중복 제거
  17. 데이터 연결 중요 
  18. 데이터프레임 연결
  19. 그룹 분석
  20. 그룹 분석 절차
  21. 필터링 - 논리 인덱싱 사용
  22. 데이터정렬 - 판다스 데이터프레임 정렬 메소
  23. 데이터 재구조화
  24. 피봇 테이블(Pivot table)
'공부/Python' 카테고리의 다른 글
  • [Python]판다스
  • [Python]데이터 수집
  • [Python]데이터분석과 머신러닝
  • 파이썬 자료구조
Future0_
Future0_
rm -rf /
Future0_
Luna Developer Blog
Future0_
전체
오늘
어제
  • 분류 전체보기 (112)
    • 프로그래밍 (4)
      • 알고리즘 (4)
    • 보안 (14)
      • Dreamhack (4)
      • Hackthebox (1)
      • Webhacking (9)
    • 프로젝트 (4)
    • 공부 (80)
      • Database (2)
      • Python (11)
      • System (4)
      • Java (13)
      • JSP (13)
      • Spring (11)
      • Kotlin (16)
      • 자료구조 (10)
      • 기계학습 (0)
    • Docker (4)
    • Github (2)
    • Tip (1)
    • 잡담 (2)

블로그 메뉴

  • 홈
  • 태그

공지사항

인기 글

태그

  • 보안
  • api 통신
  • Computer science
  • dreamhack
  • React
  • shared preference
  • 디버깅키해시
  • 자료구조
  • 컴퓨터
  • cs
  • 코틀린기본문법
  • Python
  • spring
  • jsp
  • native app
  • Java
  • 키 해시
  • webhacking
  • Kotlin
  • ViewModel
  • android studio 삭제
  • Android Studio
  • Database
  • 1.9.22
  • 자바빈즈
  • 프로그래밍
  • docker
  • 알고리즘
  • SpringBoot
  • 상속

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.0
Future0_
[Python]데이터 전처리
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.