[MySQL] 데이터 정합성 검증(클렌징)

김예은·2024년 2월 13일

데이터 정합성 검증(클렌징)이란?

데이터 정합성 검증(클렌징)은 단순 데이터 전처리 과정이 아닙니다.
정확한 분석 결과를 도출해내기 위한 필수적인 과정입니다.

그렇기 때문에 프로젝트 초기단계에서부터 적재하고 있는 데이터의 형태/결측치/NULL값 확인이 필요합니다.

오늘은 튼튼하고 완벽한 데이터분석을 위한 데이터 정합성 검증(클렌징) 방법에 대해서 정리해보고자 합니다.

1. 데이터 양(Quantity) 확인

SELECT *
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = SCHEMA();

2. 데이터 Data Type 확인

1). SHOW COLUMNS (특정 테이블의 data type, collation, Null여부)

- 전체 필드 보기
SHOW COLUMNS FROM 테이블명;

- 특정 필드 보기
SHOW FULL COLUMNS FROM olist_sales;

2). DESC (특정 테이블의 data type, Null여부)

DESC 테이블명;

3) information_schema (현재 스키마에 있는 모든 테이블의 data type)

- 전체 필드 보기
SELECT
 ORDINAL_POSITION AS NO, TABLE_NAME, COLUMN_COMMENT,  COLUMN_NAME, COLUMN_TYPE,  IF(IS_NULLABLE = 'YES','','V') AS NOT_NULL
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = SCHEMA()
AND TABLE_NAME IN (
 SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = SCHEMA()
)
ORDER BY TABLE_NAME, ORDINAL_POSITION;

3. 데이터 Character Set/Collation 확인

1) Character Set/Collation 확인

- 전체 스키마 
SELECT SCHEMA_NAME AS 'database', DEFAULT_CHARACTER_SET_NAME AS 'character_set', DEFAULT_COLLATION_NAME AS 'collation'
FROM information_schema.SCHEMATA;

- 특정 스키마
mysql> USE database_name;
mysql> SHOW VARIABLES LIKE 'character_set_database';

2) Collation 확인

- 전체 테이블 collation 확인
SELECT *
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = SCHEMA();

- 특정 테이블 collation 확인
SHOW TABLE STATUS WHERE NAME LIKE '테이블명';

- 특정 컬럼 collation 확인
SHOW FULL COLUMNS FROM 테이블명;

4. 데이터 중복 확인 및 삭제

1) 중복데이터 확인

SELECT  COLUMN_NAME ,  -- 중복되는 데이터
         COUNT(COLUMN_NAME) -- 중복 갯수
FROM TABLE_NAME              -- 중복조사를 할 테이블 이름
GROUP BY COLUMN_NAME      -- 중복되는 항목 조사를 할 컬럼
HAVING COUNT(COLUMN_NAME) > 1 ;  -- 1개 이상 (갯수)

2) 중복데이터 삭제

#JOIN을 통한 중복 데이터 삭제
DELETE t1
FROM   TABLE_NAME t1
       JOIN TABLE_NAME t2
         ON t1.column_a = t2.column_a
            AND t1.column_b = t1.column_b
WHERE  t1.idx > t2.idx;


#UPDATE 문을 통한 Soft Delete
UPDATE TABLE_NAME t1
       JOIN TABLE_NAME t2
         ON t1.column_a = t2.column_a
            AND t1.column_b = t2.column_b
SET    t1.delete_yn = true
WHERE  t1.idx > t2.idx;

5. 데이터 이상값(너무 많거나, 적을때) 확인(rank, percentage_rank)

6. 데이터 결손값(있어야하는게 없거나, 없어야하는게 있을 때) 확인

  1. 컬럼값이 null인지 아닌지, 조건에 부합하는지에 따라 점수를 부여
  2. 각 항목의 평균값을 계산해서 컬럼값의 결손 정도를 판단(1에 가까울 수록 결손도가 없는 것)
SELECT
    round(avg(case when order_delivered_carrier_date is not null then 1.0
					    else 0.0 end),2)as order_delivered_carrier_date,
	
	round(avg(case when order_delivered_customer_date is not null then 1.0
 					    else 0.0 end),2)as order_delivered_customer_date
FROM olist_orders_dataset;

profile
경계를 두지 않습니다.

0개의 댓글