728x90
๋ฐ์ํ
๐ ๋ชฉ์ฐจ
- GE ์ฝ๋ ์ ์ฒด ํ๋ฆ
- ๊ธฐ๋ณธ ์ธํ (๊ฐ์ฅ ๋จ์ํ ๋ฐฉ์)
- ์ค๋ฌด์์ ๊ฐ์ฅ ๋ง์ด ์ฐ๋ Expectation ์์
- Validation ์คํ & ์คํจ ์ฒ๋ฆฌ
- DE ์ค๋ฌด ํ
1๏ธโฃ GE ์ฝ๋ ์ ์ฒด ํ๋ฆ (์ด๊ฑฐ ๊ธฐ์ตํ๋ฉด ๋)
๋ฐ์ดํฐ ๋ก๋
↓
Expectation ์ ์
↓
Validation ์คํ
↓
๊ฒฐ๊ณผ ํ์ธ (PASS / FAIL)
GE๋ ํ ์คํธ ์ฝ๋ ์ฐ๋ฏ์ด DQ๋ฅผ ์์ฑํ๋ค๊ณ ์๊ฐํ๋ฉด ๋ผ.
2๏ธโฃ ๊ธฐ๋ณธ ์ธํ (Pandas ๊ธฐ์ค, ์ ์ผ ์ฌ์)
DB / Spark๋ ๊ฑฐ์ ๋์ผํ ๊ตฌ์กฐ๋ผ
๊ฐ๋ ์ตํ๊ธฐ์ Pandas๊ฐ ์ต๊ณ
pip install great-expectations
import great_expectations as ge
import pandas as pd
# ๋ฐ์ดํฐ ๋ก๋
df = pd.read_csv("users.csv")
# GE DataFrame ์์ฑ
ge_df = ge.from_pandas(df)
3๏ธโฃ ์ค๋ฌด์์ ๊ฐ์ฅ ๋ง์ด ์ฐ๋ Expectation ์์ โญโญโญ
๐น 1. NOT NULL ์ฒดํฌ
ge_df.expect_column_values_to_not_be_null("user_id")
๐ ์๋ฏธ
user_id ์ปฌ๋ผ์ NULL ์์ผ๋ฉด FAIL
๐น 2. PK ์ ๋ํฌ ์ฒดํฌ
ge_df.expect_column_values_to_be_unique("user_id")
๐ ์๋ฏธ
user_id ์ค๋ณต ์์ผ๋ฉด FAIL
๐น 3. ๊ฐ ๋ฒ์ ์ฒดํฌ (๋์ด, ๊ธ์ก)
ge_df.expect_column_values_to_be_between(
"age",
min_value=0,
max_value=120
)
๐น 4. ํ์ฉ ๊ฐ ๋ชฉ๋ก ์ฒดํฌ
ge_df.expect_column_values_to_be_in_set(
"gender",
["M", "F"]
)
๐น 5. ๋ ์ง ํฌ๋งท ์ฒดํฌ
ge_df.expect_column_values_to_match_regex(
"signup_date",
r"\d{4}-\d{2}-\d{2}"
)
๐น 6. row count ์ต์ ๋ณด์ฅ
ge_df.expect_table_row_count_to_be_between(
min_value=1000
)
๐ ์๋ฏธ
๋ฐ์ดํฐ๊ฐ ๋๋ฌด ์ ์ผ๋ฉด FAIL
4๏ธโฃ row count ์ ์ผ ๋๋น ±X% ์์ โญ (์ค๋ฌด ํต์ฌ)
GE์๋ “์ ์ผ ๋๋น”๊ฐ ๋ด์ฅ๋ผ ์์ง ์์์
๐ ์ด์ row count๋ฅผ ๋ณ์๋ก ๋ฃ์ด์ ๋น๊ตํ๋ ๋ฐฉ์์ด ์ผ๋ฐ์ ์ด์ผ.
yesterday_cnt = 100000
today_cnt = ge_df.shape[0]
diff_pct = abs(today_cnt - yesterday_cnt) / yesterday_cnt
assert diff_pct <= 0.3, "Row count anomaly detected"
๐ ์ค๋ฌด์์ :
- ์ด์ row count → ๋ฉํ ํ ์ด๋ธ์์ ์กฐํ
- ์ด assert ์คํจ → Airflow task FAIL
5๏ธโฃ Validation ์คํ & ๊ฒฐ๊ณผ ํ์ธ
result = ge_df.validate()
print(result["success"])
- True → DQ ํต๊ณผ
- False → DQ ์คํจ (ํ์ดํ๋ผ์ธ ์ค๋จ)
์คํจ ์ ์ด๋ค ์ ๋ณด๊ฐ ๋์ค๋?
- ์คํจํ ์ปฌ๋ผ
- ์คํจํ Expectation
- ์คํจํ row ๊ฐ์ ๋น์จ
๐ ์ฌ๋์ด ๋ฐ๋ก ์์ธ ํ์ ๊ฐ๋ฅ


6๏ธโฃ Airflow / ๋ฐฐ์น์์ ์ฐ๋ ํจํด (์ค์)
โ ์ค๋ฌด ํจํด
result = ge_df.validate()
if not result["success"]:
raise Exception("Data Quality Check Failed")
๐ ์ด ํ ์ค๋ก:
- Airflow task FAIL
- downstream ์ฐจ๋จ
- Slack ์๋ฆผ ํธ๋ฆฌ๊ฑฐ ๊ฐ๋ฅ
7๏ธโฃ DE ์ค๋ฌด ํ โญโญโญ
โ ํ์ง ๋ง ๊ฒ
- ๋ชจ๋ ์ปฌ๋ผ์ Expectation
- ํ๋ฃจ์ 50๊ฐ DQ
- ๋๋ฌด ๋นก์ผ ๊ธฐ์ค
โ ์ด๋ ๊ฒ ํด๋ผ
- ํ ์ด๋ธ๋น 5~10๊ฐ ํต์ฌ DQ
- PK / row count / freshness ์ฐ์
- ์ ์ง์ ์ผ๋ก ์ถ๊ฐ
๐ฏ ํต์ฌ ์์ฝ
GE๋ “DQ๋ฅผ ํ ์คํธ ์ฝ๋๋ก ์์ฑํ๋ ๋๊ตฌ”
- expect = DQ ๋ฃฐ
- validate = ์คํ
- FAIL = ํ์ดํ๋ผ์ธ ์ค๋จ
728x90
๋ฐ์ํ
'DataEngineering > Data Quality' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| GE(Great Expectations) ์ด๋? (0) | 2026.02.01 |
|---|---|
| DQ Tools (0) | 2026.02.01 |
| Data Quality ๊ฒ์ฆ์ ์ด๋ป๊ฒ ํ๋๊ฐ? (0) | 2026.02.01 |
| DQ(Data Quality)๋? (0) | 2026.02.01 |