프로파일링

강림·2023년 10월 8일
0

Data Pre-processing

목록 보기
5/11
post-thumbnail

1. 탐색적 데이터 분석 개요

1.1 탐색적 데이터 분석 (EDA)

  • EDA(Exploratory Data Analysis)라고 함
  • 수집한 데이터를 분석하기 전에 그래프나 통계적인 방법을 이용하여 다양한 각도에서 데이터의 특징을 파악하고 자료를 직관적으로 바라보는 분석 방법
  • EDA를 통해서 Data Pre-processing(데이터 전처리), Feature engineering(피쳐 엔지니어링) 방향 확보

1.2 EDA 프로세스

Step 1: 데이터의 속성(변수, feature) 확인
Step 2: 각 피쳐별 단변량 데이터 분석
Step 3: 피쳐간 상관관계 분석
Step 4: 결측치 처리
Step 5: 이상치 처리
Step 6: 피쳐 엔지니어링을 통한 피쳐 선택, 추가, 삭제

1.3 변수 분석

단변량 분석

  • 변수 하나에 대해 기술통계량(descriptive statistics) 을 확인
    - 대표값 : 데이터의 평균, 중위수, 최빈수
    - 산포 : 표준편차, 분산, 범위, 사분위수
    - 분포 : 왜도, 첨도
    - 기타 : 신뢰구간, 데이터의 정규성
  • Histogram이나 Boxplot을 사용해서 평균, 최빈값, 중간값 등과 함께 각 변수들의 분포를 확인
  • 범주형 변수의 경우 Boxplot을 사용해서 빈도 수 분포를 체크

이변량 분석

  • 변수 2개 간의 관계를 분석
    • 상관관계 분석(Correlation Analysis): 두 개 이상의 변수 사이에 존재하는 상호 연관성의 존재 여부와 연관성의 강도를 측정하여 분석
  • 변수의 유형에 따라 적절한 시각화 및 분석 방법 적용: 산점도 등

다변량 분석

  • 범주형 변수가 하나 이상 포함되어 있는 경우 변수를 범주에 따라 분리한 후 위 분석 방법에 따라 분석
  • 모두 연속형 변수이면 연속형 변수를 Feature engineering을 통해 범주형 변수로 변환한 후 분석, 혹은 3차원 그래프를 그려 시각적으로 확인

그래프 분석

  • 데이터의 종류에 따라 적절한 그래프를 선택해야 함
  • 다양한 그래프를 통하여 피처들의 특성을 파악하하는 것이 중요


2. 데이터 프로파일링

2.1 데이터 프로파일링

프로파일링(profiling)

  • 어떤 개인의 심리적, 행동적 특성을 분석함으로써 특정 상황이나 영역에서의 행동을 예상하는 것
  • 사회인구학적 특성을 포함한 여러 변수에 의해 특정한 하위 그룹으로 분류하는 것

데이터 프로파일링(profiling)

  • EDA(Exploratory Data Analysis, 탐색적 데이터 분석)를 수행하는 것
  • 데이터 내 값의 분포, 변수 간의 관계, Null 값과 같은 결측값(missing values) 존재 유무 등을 분석

2.2 데이터 프로파일링의 단계

2.2.1 메타데이터 수집 및 분석

  • 실제 운영 중인 데이터베이스의 테이블 명, 컬럼 명, 제약조건 등의 정보 분석
    • 테이블 정의서, 컬럼 정의서와 같은 데이터 관리 문서의 정보 분석
    • 추출된 테이블 및 컬럼에 대한 메타데이터와 데이터 관리 문서를 매핑하여 불일치 사항을 분석

2.2.2 컬럼 속성 분석

  • 컬럼 속성 분석은 대상 컬럼의 비유효한 값을 확인
  • 컬럼의 총 건수, 유일값 수, NULL값 수, 공백값 수, 최댓값, 최솟값, 최대 빈도, 최소빈도 등 기초 집계값을 산출하여 값이 유효한 범위 내에 있는지 판단

2.2.3 결측치 분석

  • 반드시 입력되어야 하는 데 누락이 발생한 컬럼을 발견하는 절차
  • 결측치에는 NULL값, 공백값 또는 숫자 ‘0’ 등이 해당
  • NULL 허용 컬럼일지라도 NULL과 공백이 혼재하는 경우와 총건수와 NULL 건수가 같아 미사용으로 추정되는 컬럼을 발견하는 일도 포함

2.2.4 허용범위 분석

  • 허용범위 분석은 값이 가져야 할 범위 내에 그 값이 있는지를 파악하는 절차
  • 허용범위는 해당 속성의 도메인 유형에 따라 정해짐
    • 아래 예시에서 MAGAZINE 테이블의 권, 호, 페이지 등의 컬럼은 0 이상의 값을 가져야 하지만 최솟값이 -999 등으로 이루어진 것으로 보아 NULL 대신 무의미한 값을 부여한 데이터일 가능성이 큼
    • 해당값이 오류 데이터라면 NULL값을 부여해야 함

2.2.5 허용값 분석

  • 허용값 분석은 해당 컬럼의 허용값 목록이나 집합에 포함되지 않는 값을 발견하는 절차
  • 코드 매핑 정의서에 기술한 코드 성격의 컬럼이 분석 대상에 해당
    • 아래 예시에서 등록되지 않은 코드가 포함되어 있거나 의미는 유사하나 다른 값으로 혼재된 경우를 확인가능

2.2.6 패턴 분석

  • 해당 컬럼의 문자열 유형을 따르지 않는 오류 유형을 발견하는 절차
  • 데이터 집계할 때 문자일 경우 C, 숫자일 경우 9, 공백일 경우 S를 반환하는 함수를 만들어 사용
    • 해당 컬럼의 데이터를 패턴화하여 SQL로 조회하면 비정상적인 형태를 보인 값을 오류로 추정할 수 있음

2.2.7 날짜 유형 분석

  • 대상 컬럼이 DBMS의 DATE 관련 자료형을 가지면 날짜 패턴 및 유효성 검증은 문제가 없음
    • 하지만 문자형 데이터 타입에 날짜 데이터를 입력하면 아래 예시와 같은 사례가 발생할 수 있음
    • 이는 패턴 검증을 통하여 쉽게 검증할 수 있음

2.2.8 유일값 분석

  • 유일값 분석은 업무적 의미에서 유일해야 하는 컬럼에 중복이 발생하였는지를 파악하는 절차
  • DBMS의 제약조건으로 PK(Primary Key)가 설정된 컬럼이나 UNIQUE가 설정된 컬럼은 문제가 없음
  • 아래 예시처럼 CUSTOMER 테이블의 EMAIL 컬럼은 PK 컬럼이 아니지만, 업무적으로 고객의 이메일은 유일해야 하는 경우 최대 빈도를 통하여 중복된 데이터를 확인할 수 있음

2.2.9 구조 분석

  • 데이터 구조 분석은 구조 결함으로 인해 일관되지 못한 데이터를 발견하는 분석 기법
  • 아래 예시에 ORDER 테이블에 CUSTOMER 테이블에는 존재하지 않는 데이터가 존재하여 데이터의 일관성이 없는 오류 데이터가 발생
  • ERD(Entity-Relationship Diagram) 등 설계 시에는 관계를 설정해두고 실제 데이터베이스에는 제약조건을 적용하지 않고 개발하는 경우 이러한 사례가 빈번하게 발생

3. 데이터 프로파일링을 위한 Python 패키지

3.1 klib

  • Pandas 데이터프레임을 기반으로 데이터전처리 및 프로파일링을 제공해주는 패키지
  • 데이터 품질평가, 데이터 전처리, 관계시각화를 목적으로 사용
  • 속도가 상당히 빠르며, 유려한 시각화 기능을 제공

제공 API

  • klib.describe: 시각화 메서드
    • klib.cat_plot(df): 범주형 변수 프로파일링
    • klib.corr_mat(df): 상관관계 매트릭스
    • klib.corr_plot(df): 상관관계
      klib.dist_plot(df): 분포
  • klib.missingval_plot(df): 결측치
    • klib.clean: 데이터 정제 메서드
    • klib.data_cleaning(df): 데이터 정제 (데이터 유형변경, 중복/결측치행 삭제,…)
    • klib.clean_column_names(df): 컬럼명 변경
    • klib.convert_datatypes(df): 데이터 유형 변경
    • klib.drop_missing(df): 결측행 삭제
    • klib.mv_col_handling(df): 피처 삭제
    • klib.pool_duplicate_subsets(df): 중복 데이터 삭제
  • klib.preprocess: 데이터 전처리(feature selection, scaling, …)
    • klib.train_dev_test_split(df): 데이터세트 분리
    • klib.feature_selection_pipe(): 피쳐 선택
    • klib.num_pipe(): 수치형 데이터 처리
    • klib.cat_pipe(): 범주형 데이터 처리
    • klib.preprocess.ColumnSelector(): 피쳐 선택
    • klib.preprocess.PipeInfo(): 전처리 파이프 라인처리
mamba install klib

"mamba"는 "conda"의 대안으로 사용되는 패키지 관리자이며, "pip"는 Python 패키지를 설치하는 데 사용되는 표준 도구임

따라서

pip install klib

을 하면됨.

import warnings

# hide warnings
warnings.filterwarnings("ignore")
  • warnings 모듈을 사용하여 모든 경고 메시지를 무시하도록 필터링함
    • filterwarnings("ignore")는 모든 경고를 무시하도록 설정하는 메서드
import klib
import pandas as pd
import seaborn as sns

df = sns.load_dataset("titanic")
df.head()
  • 'sns.load_dataset("titanic")' seaborn에서 제공하는 타이타닉 데이터셋 불러오기

klib.missingval_plot(df)
  • 'missingval_plot' 함수를 사용하여 데이터프레임 df에 대한 결측값(누락된 데이터)의 시각화를 생성하는 코드


klib.corr_plot(df, split='pos') 

klib.corr_plot(df, split='neg') 

양의 상관관계 플롯

음의 상관관계만 플롯

  • 데이터셋에서 어떤 변수들이 서로 어떻게 관련되어 있는지 빠르게 파악
klib.corr_plot(df, target='age') 
  • 'corr_plot' 함수를 사용하여 데이터프레임 df에서 특정 타겟(목표) 변수, 여기서는 'age' 변수와 다른 변수들 간의 상관관계를 시각화

klib.dist_plot(df) 
  • 'dist_plot' 함수는 주어진 데이터프레임의 각 열(특성)에 대한 분포를 히스토그램이나 커널 밀도 플롯 등의 형태로 시각적

df_cleaned = klib.data_cleaning(df)
  • 'data_cleaning' 함수는 자동적으로 다양한 데이터 정리 작업을 수행
  • 'df_cleaned = klib.data_cleaning(df)' 코드는 이러한 작업들을 자동으로 수행하고, 정리된 데이터프레임을 df_cleaned 변수에 저장
  1. 누락된 데이터 처리: 결측값이나 누락된 데이터를 적절한 방식으로 처리합니다. 예를 들어, 중간값이나 평균값으로 대체할 수 있습니다.
  2. 이상치 처리: 이상치(Outliers)를 감지하고 이를 처리하는 작업을 수행합니다. 예를 들어, 이상치를 제거하거나 대체할 수 있습니다.
  3. 중복된 행 처리: 중복된 행이 있는 경우 이를 처리합니다.
  4. 데이터 유형 변환: 데이터의 유형을 변환하여 적절한 형태로 만듭니다.
  5. 기타 데이터 정리 작업: 필요한 경우 기타 데이터 정리 작업을 수행합니다.

결과 :

데이터 형태 (Shape) 및 남아있는 결측값 (Remaining NAs):
Shape of cleaned data: (784, 15) - Remaining NAs: 692

행 삭제 (Dropped rows):
Dropped rows: 107
of which 107 duplicates. (Rows (first 150 shown): [47, 76, 77, 87, 95, 101, 121, 133, 173, 196, 198, 201, 213, 223, 241, 260, 274, 295, 300, 304, 313, 320, 324, 335, 343, 354, 355, 358, 359, 364, 368, 384, 409, 410, 413, 418, 420, 425, 428, 431, 454, 459, 464, 466, 470, 476, 481, 485, 488, 490, 494, 500, 511, 521, 522, 526, 531, 560, 563, 564, 568, 573, 588, 589, 598, 601, 612, 613, 614, 635, 636, 640, 641, 644, 646, 650, 656, 666, 674, 692, 696, 709, 732, 733, 734, 738, 739, 757, 758, 760, 773, 790, 792, 800, 808, 832, 837, 838, 844, 846, 859, 863, 870, 877, 878, 884, 886])

열 삭제 (Dropped columns):
Dropped columns: 0
of which 0 single valued. Columns: []
결측값 삭제 (Dropped missing values):
Dropped missing values: 177
메모리 감소 (Reduced memory):
Reduced memory by at least: 0.06 MB (-75.0%)

3.2 ydata-profiling

  • 인터렉티브한 프로파일링 기능을 통합해 놓은 패키지
  • 판다스 프로파일링(pandas-profiling)에서 최근 ydata-profiling으로 명칭을 변경
  • ydata-profiling의 주요 특징
    • 타입 추론: 컬럼의 데이터 타입 자동 감지 (Categorical , Numerical , Date 등)
    • 경고: 작업해야 할 수 있는 데이터의 문제/도전 사항 요약( 누락된 데이터 , 부정확성 , 왜곡 등)
    • 단변량 분석: 기술 통계(평균, 중앙값, 최빈값 등) 및 분포 히스토그램과 같은 정보 시각화 포함
    • 다변량 분석: 상관 관계, 누락된 데이터에 대한 자세한 분석, 중복 행, 변수 쌍별 상호 작용에 대한 시각적 지원 포함
    • 시계열: ACF 및 PACF 플롯을 따라 자동 상관 및 계절성과 같은 시간 종속 데이터와 관련된 다양한 통계 정보를 포함
    • 텍스트 분석: 가장 일반적인 범주(대문자, 소문자, 구분 기호), 스크립트(Latin, Cyrillic) 및 블록(ASCII, Cyrilic)
    • 파일 및 이미지 분석: 파일 크기, 생성 날짜, 크기, 잘린 이미지 표시 및 EXIF ​​메타데이터 존재
    • 데이터 세트 비교: 데이터 세트 비교에 대한 빠르고 완전한 보고서를 가능하게 하는 한 줄 솔루션
    • 유연한 출력 형식: 모든 분석은 다른 당사자와 쉽게 공유할 수 있는 HTML 보고서로 내보낼 수 있으며, 자동화 시스템에 쉽게 통합하기 위한 JSON 및 Jupyter 노트북의 위젯으로 내보낼 수 있음
  • 실행 속도가 느린 것이 단점

3.2.1 ydata-profiling 활용

  • ydata-profiling 패키지 및 ipywidgets 설치
pip install ydata-profiling ipywidgets
  1. ydata-profiling 패키지는 데이터프레임에 대한 프로파일링 리포트를 생성하는 도구

    • 데이터프레임을 분석하고 통계 정보, 결측값 분석, 중복된 행/열, 변수 간 상관관계 등에 대한 시각적 리포트를 생성하여 데이터를 빠르게 탐색
  2. ipywidgets 패키지는 IPython 환경에서 대화형 위젯을 생성하는 도구

    • 버튼 (Button): 클릭할 수 있는 버튼을 생성
    • 텍스트 상자 (Text Box): 사용자가 텍스트를 입력할 수 있는 상자를 생성
    • 슬라이더 (Slider): 범위 내에서 값을 선택할 수 있는 슬라이더를 생성
    • 체크 박스 (Checkbox): 선택 상태를 나타내는 체크 박스를 생성
import numpy as np
import pandas as pd
from ydata_profiling import ProfileReport

테스트 데이터 생성

df = pd.DataFrame(np.random.rand(100, 5), columns=["a", "b", "c", "d", "e"])
print(df.head())
  • 코드는 100x5 크기의 랜덤한 값을 가진 데이터프레임을 생성하고, 처음 5개의 행을 출력하는 것. 결과적으로는 다섯 개의 열("a", "b", "c", "d", "e")과 100개의 행으로 이루어진 데이터프레임이 출력

프로파일링 리포트 생성

profile = ProfileReport(df, title="Ydata Profiling Report")

#profile.to_widgets() # jupyter notebook에서 위젯으로 보기
profile.to_notebook_iframe() # HTML 보고서와 유사한 방식으로 셀에 직접 포함
profile.to_file("my_profiling_report.html") # HTML로 별도 저장

  • 이 코드는 데이터프레임에 대한 프로파일링 리포트를 생성하고, 이를 주피터 노트북 위젯, HTML로 저장, 노트북 셀에 직접 포함하는 세 가지 형태로 출력하고 저장

다음과 같은 형태로 코랩내부에 있는 저장소에 저장됨

3.2.2 결측치가 있는 데이터(titanic)

import seaborn as sns
import pandas as pd

df_titanic = sns.load_dataset('titanic')
df_titanic.head()

# titanic 데이터세트는 시간이 오래 걸려 최소수준의 분석만 실행
profile = ProfileReport(df_titanic, title = "Titanic 데이터에 대한 프로파일링 보고서", minimal=True)

profile.to_notebook_iframe()
profile.to_file("titanic_profiling_report.html") # HTML로 별도 저장
  • 이 코드는 최소한의 분석을 수행하여 'titanic' 데이터셋에 대한 프로파일링 리포트를 생성하고, 이를 주피터 노트북 셀에 출력하고 HTML 파일로 저장하는 것

3.2.3 NLP를 위한 네이버 영화 리뷰 데이터

colab 으로 데이터 불러오기

  • 코랩으로 csv 데이터를 불러오기 위해서는 컴퓨터에서 저장해서 가져오는 것이 아닌 구글 드라이브에 저장해서 가지고 와야함


맨마지막에 있는 저 파일표시를누르고


3번째 버튼을 누르면 코랩이 구글드라이브와 연결됨.

가지고 있는 csv를 그냥 드래그앤 드롭으로 저창에 두면 저장됨

우클릭후 경로 복사를 하고 붙여 넣으면 성공!

import pandas as pd

movie_df = pd.read_csv('/content/ko_test_label.csv', sep = ',')
print(movie_df.info())
print(movie_df.shape)
print(movie_df.head(5))
  • sep=','는 데이터의 구분자가 쉼표(,)라는 것을 지정
  • info() 메소드는 데이터프레임에 대한 간단한 정보를 출력.
    열의 데이터 타입, 결측값 유무, 메모리 사용량 등을 포함한 기본적인 통계 정보를 확인
  • shape 속성은 데이터프레임의 행과 열의 수를 나타내는 튜플을 반환
    차원을 확인할 수 있음
pf_movie = ProfileReport(movie_df, title="네이버 영화 리뷰 데이터에 대한 프로파일링 보고서")
# pf_movie.to_widgets() # jupyter notebook에서 위젯으로 보기
pf_movie.to_notebook_iframe()
pf_movie.to_file("review_profiling_report.html") # HTML로 별도 저장

위와 같은 방식을 통해 html에 프로파일링 보고서를 저장할 수 있음.

3.3 PyGWalker

  • PyGWalker(“Pig Walker”로 발음)는 시각화를 통한 탐색적 데이터 분석을 위한 Python 라이브러리
  • pandas 데이터 프레임(및 polars 데이터 프레임)을 시각적 탐색을 위한 Tableau 스타일 사용자 인터페이스로 제공
  • 간단한 끌어서 놓기 작업으로 데이터를 분석하고 패턴을 시각화 가능
pip install "pygwalker[notebook]" --pre

설치코드

import pandas as pd
import pygwalker as pyg

필요 패키지 import

import seaborn as sns
# Seborn 데이터 세트 로드
df_titanic = sns.load_dataset('titanic')

gwalker = pyg.walk(df_titanic).display_on_jupyter()


다음과 같은 형태로 간단하게 분석가능

import polars as pl

titanic_pl = pl.from_pandas(df_titanic)
gwalker = pyg.walk(titanic_pl).display_on_jupyter()

데이터 프레임을 polar 로 변환해서 사용할 수도있는데,
Polars는 병렬 처리 및 다른 최적화 기술을 활용하여 대용량 데이터를 효율적으로 처리할 수 있도록 설계됨.

profile
DRUDGER

0개의 댓글