cadenza83/data-quality-checker
π Data Quality Checker
λ°μ΄ν°μ μ νμ§μ μ’ ν© λΆμνκ³ κ΅¬μ²΄μ μΈ κ°μ λ°©μμ μ μν΄μ£Όλ λꡬμ λλ€.
β¨ μ£Όμ κΈ°λ₯
π μ’ ν© νμ§ λΆμ
- κΈ°λ³Έ ν΅κ³: λ°μ΄ν° ν¬κΈ°, νμ , λ©λͺ¨λ¦¬ μ¬μ©λ μμΈ λΆμ
- νμ§ λ¬Έμ νμ§: μ€λ³΅, κ²°μΈ‘κ°, μ΄μμΉ, νμ λΆμΌμΉ μλ κ°μ§
- μ¬κ°λ λΆλ₯: κΈ΄κΈ/μ£Όμ/μ°Έκ³ μμ€μΌλ‘ μ°μ μμ μ μ
- λ°μ΄ν° λ°λ: μ 체 λ°μ΄ν° μμ±λ μΈ‘μ
π μ€λ§νΈ λ°μ΄ν° λΆμ
- λΆν¬ λΆμ: μμΉν/λ²μ£Όν λ°μ΄ν°μ ν΅κ³μ νΉμ±
- ν΄λμ€ λΆκ· ν: λΌλ²¨ λΆν¬ λΆκ· ν μλ νμ§ λ° λΉμ¨ κ³μ°
- ν μ€νΈ λΆμ: NLPμ© ν μ€νΈ κΈΈμ΄ λΆμ λ° κΆμ₯μ¬ν
- μκ΄κ΄κ³: μ»¬λΌ κ° κ΄κ³μ± λΆμ
π μΈν°λν°λΈ μκ°ν
- κ²°μΈ‘κ° λΆν¬ μ°¨νΈ: 컬λΌλ³ λλ½ λ°μ΄ν° μκ°ν
- λ°μ΄ν° λΆν¬ νμ€ν κ·Έλ¨: μμΉν λ°μ΄ν° λΆν¬ λ° λ°μ€νλ‘―
- μΉ΄ν κ³ λ¦¬ νμ΄μ°¨νΈ: λ²μ£Όν λ°μ΄ν° λΉμ¨ μκ°ν
- μκ΄κ΄κ³ ννΈλ§΅: λ³μ κ° μκ΄μ± λ§€νΈλ¦μ€
π‘ μ€μ©μ κ°μ μ μ
- μ°μ μμλ³ μ€ν κ³ν: λ¨κ³μ λ°μ΄ν° μ μ λ‘λλ§΅
- ꡬ체μ μΈ Python μ½λ: 볡μ¬ν΄μ λ°λ‘ μ¬μ© κ°λ₯ν μ½λ
- μμ ν¨κ³Ό: μ μ ν κΈ°λλλ μ±λ₯ κ°μ μ 보
- 체ν¬λ¦¬μ€νΈ: λ°μ΄ν° νμ§ κ΄λ¦¬ λͺ¨λ² μ¬λ‘
π μ¬μ©λ²
1οΈβ£ λ°μ΄ν° μ λ‘λ
μ§μνλ νμΌ νμμΌλ‘ λ°μ΄ν°λ₯Ό μ λ‘λνμΈμ:
CSV μμ:
name,age,city,salary
κΉμ² μ,25,μμΈ,3000
μ΄μν¬,,λΆμ°,
λ°λ―Όμ,30,λꡬ,4500
κΉμ² μ,25,μμΈ,3000JSON μμ:
[
{"name": "κΉμ² μ", "age": 25, "city": "μμΈ", "salary": 3000},
{"name": "μ΄μν¬", "age": null, "city": "λΆμ°", "salary": null},
{"name": "λ°λ―Όμ", "age": 30, "city": "λꡬ", "salary": 4500}
]2οΈβ£ μλ νμ§ λΆμ
"νμ§ λΆμ μ€ν" λ²νΌμ ν΄λ¦νλ©΄ λ€μ λΆμμ΄ μλμΌλ‘ μνλ©λλ€:
- λ°μ΄ν° ꡬ쑰 λ° κΈ°λ³Έ ν΅κ³
- νμ§ λ¬Έμ μλ νμ§
- λΆν¬ λ° κ· νλ λΆμ
- μκ°ν μ°¨νΈ μμ±
- λ§μΆ€ν κ°μ μ μ
3οΈβ£ κ²°κ³Ό νμΈ λ° μ μ©
5κ° νμμ λΆμ κ²°κ³Όλ₯Ό νμΈνκ³ μ μλ μ½λλ₯Ό μ μ©νμΈμ.
π λΆμ νλͺ©
κΈ°λ³Έ μ 보 λΆμ
- λ°μ΄ν° ν¬κΈ°: ν/μ΄ μ, λ©λͺ¨λ¦¬ μ¬μ©λ
- λ°μ΄ν° λ°λ: μ 체 λ°μ΄ν° μμ±λ (%)
- μ»¬λΌ μ 보: νμ , κ²°μΈ‘κ°, κ³ μ κ°, μν λ°μ΄ν°
νμ§ λ¬Έμ νμ§
π μ€λ³΅ λ°μ΄ν°
- λμΌν ν μλ νμ§
- μ€λ³΅ λΉμ¨ κ³μ°
drop_duplicates()μ½λ μ 곡
β κ²°μΈ‘κ° λΆμ
- 컬λΌλ³ κ²°μΈ‘κ° λΉμ¨
- λμ κ²°μΈ‘λ₯ μ»¬λΌ κ²½κ³ (50% μ΄μ)
- μ μ ν μ²λ¦¬ λ°©λ² μ μ
π€ λ°μ΄ν° νμ λΆμΌμΉ
- μ«μ 컬λΌμ λ¬Έμ λ°μ΄ν° νΌμ¬ νμ§
- νμ λ³ν κ°λ₯μ± λΆμ
- μ μ λ°©λ² μ μ
π μ΄μμΉ νμ§
- IQR λ°©λ²μΌλ‘ ν΅κ³μ μ΄μμΉ νμ§
- μ΄μμΉ κ°μ λ° λΉμ¨ κ³μ°
- κ° λ²μ λ° κ²ν κΆμ₯μ¬ν
βοΈ ν΄λμ€ λΆκ· ν
- λΌλ²¨ λΆν¬ λΆκ· ν μλ νμ§
- μ΅λ:μ΅μ λΉμ¨ κ³μ°
- μνλ§ κΈ°λ² μ μ (SMOTE λ±)
λΆν¬ λΆμ
π μμΉν λ°μ΄ν°
- νκ· , μ€μκ°, νμ€νΈμ°¨
- μ΅μκ°, μ΅λκ°
- λΆν¬ νμ€ν κ·Έλ¨
π·οΈ λ²μ£Όν λ°μ΄ν°
- μΉ΄ν κ³ λ¦¬λ³ λΉλ λ° λΉμ¨
- μμ 10κ° μΉ΄ν κ³ λ¦¬ νμ
- νμ΄μ°¨νΈ μκ°ν
π ν μ€νΈ λ°μ΄ν° (NLPμ©)
- νκ· /μ΅λ¨/μ΅μ₯ ν μ€νΈ κΈΈμ΄
- κΈΈμ΄ λΆν¬ λΆμ
- ν μ€νΈ μ²λ¦¬ κΆμ₯μ¬ν
μκ°ν
κ²°μΈ‘κ° λΆν¬
# 컬λΌλ³ κ²°μΈ‘κ° κ°μλ₯Ό λ§λμ°¨νΈλ‘ νμ
missing_data = df.isnull().sum()λ°μ΄ν° λΆν¬
# νμ€ν κ·Έλ¨ + λ°μ€νλ‘―μΌλ‘ λΆν¬ νΉμ± νμ
px.histogram(df, x='column', marginal="box")μκ΄κ΄κ³ ννΈλ§΅
# μμΉν μ»¬λΌ κ° μκ΄μ± μκ°ν
corr_matrix = df.corr()
px.imshow(corr_matrix)π‘ κ°μ μ μ μμ€ν
μ°μ μμλ³ μ€ν κ³ν
λκ΅¬κ° λ°κ²¬λ λ¬Έμ λ₯Ό μ¬κ°λλ³λ‘ λΆλ₯νκ³ λ¨κ³μ ν΄κ²° λ°©μμ μ μν©λλ€:
π¨ κΈ΄κΈ μ‘°μΉ νμ
- μ€λ³΅ λ°μ΄ν° 5% μ΄μ
- κ²°μΈ‘κ° 50% μ΄μ 컬λΌ
- μ¬κ°ν ν΄λμ€ λΆκ· ν (50:1 μ΄μ)
β οΈ μ£Όμ νμ
- μ€λ³΅ λ°μ΄ν° 1-5%
- λ°μ΄ν° νμ λΆμΌμΉ
- μ€κ° μ λ ν΄λμ€ λΆκ· ν (10-50:1)
βΉοΈ μ°Έκ³ μ¬ν
- κ²½λ―Έν μ΄μμΉ (1-5%)
- λ©λͺ¨λ¦¬ μ΅μ ν κ°λ₯
- ν μ€νΈ κΈΈμ΄ κΆμ₯μ¬ν
ꡬ체μ μΈ Python μ½λ
κ° λ¬Έμ μ λν΄ λ°λ‘ μ¬μ©ν μ μλ μ½λλ₯Ό μ 곡ν©λλ€:
# μ€λ³΅ μ κ±°
df_clean = df.drop_duplicates()
# κ²°μΈ‘κ° μ²λ¦¬
df_clean = df.dropna() # λλ
df_clean = df.fillna(method="forward")
# λ©λͺ¨λ¦¬ μ΅μ ν
for col in df.select_dtypes(include=["object"]).columns:
if df[col].nunique() < len(df) * 0.5:
df[col] = df[col].astype("category")
# ν΄λμ€ λΆκ· ν ν΄κ²°
from imblearn.over_sampling import SMOTE
smote = SMOTE()
X_resampled, y_resampled = smote.fit_resample(X, y)π― μ¬μ© μ¬λ‘
AI/ML μ°κ΅¬μ
- λͺ¨λΈ νμ΅ μ λ°μ΄ν° κ²μ¦: νμ§ λ¬Έμ κ° μ±λ₯μ λ―ΈμΉλ μν₯ μ¬μ νμ
- λ°μ΄ν° μ μ²λ¦¬ κ³ν: 체κ³μ μΈ μ μ λ‘λλ§΅ μ립
- μ€ν μ¬νμ±: λ°μ΄ν° νμ§ κΈ°μ€ λ¬Έμν
λ°μ΄ν° μ¬μ΄μΈν°μ€νΈ
- EDA μλν: νμμ λ°μ΄ν° λΆμ μκ° λ¨μΆ
- λ°μ΄ν° νμ΄νλΌμΈ: νμ§ μ²΄ν¬λ₯Ό μλνλ μν¬νλ‘μ°μ ν΅ν©
- μ±λ₯ μ΅μ ν: λ°μ΄ν° νμ§ κ°μ μ ν΅ν λͺ¨λΈ μ±λ₯ ν₯μ
κΈ°μ λ°μ΄ν°ν
- λ°μ΄ν° κ±°λ²λμ€: μ μ¬ λ°μ΄ν° νμ§ νμ€ μ립
- λΉμ© μ΅μ ν: λΆνμν λ°μ΄ν° μ μ₯ λ° μ²λ¦¬ λΉμ© μ μ½
- μ»΄νλΌμ΄μΈμ€: λ°μ΄ν° νμ§ κ°μ¬ λ° λ³΄κ³
κ΅μ‘ & νμ΅
- λ°μ΄ν° 리ν°λ¬μ: λ°μ΄ν° νμ§μ μ€μμ± νμ΅
- μ€μ΅ λꡬ: λ€μν λ°μ΄ν°μ μΌλ‘ νμ§ λΆμ μ°μ΅
- λͺ¨λ² μ¬λ‘: μ λ¬Έκ° μμ€μ λ°μ΄ν° μ²λ¦¬ λ°©λ² νμ΅
π μλ²½ν AI κ°λ° μν¬νλ‘μ°
μ΄ λꡬλ μμ ν AI κ°λ° μνκ³μ ν΅μ¬ ꡬμ±μμμ λλ€:
1οΈβ£ λ°μ΄ν° νμ§ νμΈ
Data Quality Checkerλ‘ λ°μ΄ν° λ¬Έμ νμ λ° μ μ λ°©μ μ립 β νμ¬ λꡬ
2οΈβ£ λ°μ΄ν° μ μ μμ
μ μλ Python μ½λλ₯Ό μ¬μ©νμ¬ μ€μ λ°μ΄ν° μ μ μν
3οΈβ£ ν¬λ§· λ³ν
[Dataset Converter](https://huggingface.co/spaces/cadenza83/dataset-converter)λ‘ μ μ λ λ°μ΄ν°λ₯Ό Hugging Face νμ€ ν¬λ§·μΌλ‘ λ³ν
4οΈβ£ λͺ¨λΈ μ ν
[Model Search Tool](https://huggingface.co/spaces/cadenza83/model-search-tool)μμ λ°μ΄ν°μ μ΅μ νλ μ¬μ νλ ¨ λͺ¨λΈ νμ
5οΈβ£ λ°λͺ¨ μμ±
[Demo Generator](https://huggingface.co/spaces/cadenza83/demo-generator)λ‘ λͺ¨λΈ μ±λ₯ μμ°μ© μΈν°λν°λΈ λ°λͺ¨ μ μ
6οΈβ£ λ¬Έμν
[Model Card Generator](https://huggingface.co/spaces/cadenza83/model-card-generator)λ‘ μ λ¬Έμ μΈ λͺ¨λΈ λ¬Έμ λ° λ©νλ°μ΄ν° μμ±
π νμ§ μ μ μμ€ν
λκ΅¬κ° μλμΌλ‘ κ³μ°νλ λ°μ΄ν° νμ§ μ μ:
- π’ μ°μ (90-100μ ): μ£Όμ νμ§ λ¬Έμ μμ, λ°λ‘ μ¬μ© κ°λ₯
- π‘ μνΈ (70-89μ ): κ²½λ―Έν λ¬Έμ , κ°λ¨ν μ μ ν μ¬μ© κ°λ₯
- π μ£Όμ (50-69μ ): μΌλΆ νμ§ λ¬Έμ , 체κ³μ μ μ νμ
- π΄ λΆλ (0-49μ ): μ¬κ°ν νμ§ λ¬Έμ , λλμ μΈ μ μ νμ
π οΈ κΈ°μ μ νΉμ§
κ°κ±΄ν λΆμ μμ§
- λ€μ€ νμΌ νμ: CSV, JSON, JSONL μ§μ
- λμ©λ μ²λ¦¬: ν¨μ¨μ μΈ λ©λͺ¨λ¦¬ κ΄λ¦¬
- μλ¬ μ²λ¦¬: μμλ λ°μ΄ν°μ λν μμ ν μ²λ¦¬
μ§λ₯ν λ¬Έμ νμ§
- ν΅κ³ κΈ°λ°: IQR, νμ€νΈμ°¨ λ± ν΅κ³μ λ°©λ² νμ©
- λλ©μΈ νΉν: ML/NLPμ νΉνλ νμ§ κΈ°μ€
- μκ³κ° μ΅μ ν: μ€λ¬΄μ§μ νΌλλ°±μ λ°μν ν©λ¦¬μ κΈ°μ€
νμ₯ κ°λ₯ν μν€ν μ²
- λͺ¨λν: μλ‘μ΄ λΆμ κΈ°λ₯ μ½κ² μΆκ° κ°λ₯
- 컀μ€ν°λ§μ΄μ§: λλ©μΈλ³ νΉμ μꡬμ¬ν λ°μ κ°λ₯
- API μ°λ: μΈλΆ μμ€ν κ³Όμ ν΅ν© μ§μ
π μ±λ₯ μ΅μ ν
λ©λͺ¨λ¦¬ ν¨μ¨μ±
- μ²ν¬ λ¨μ μ²λ¦¬λ‘ λμ©λ λ°μ΄ν° μ§μ
- μΉ΄ν κ³ λ¦¬ νμ μλ λ³νμΌλ‘ λ©λͺ¨λ¦¬ μ μ½
- λΆνμν λ°μ΄ν° λ³΅μ¬ μ΅μν
μ²λ¦¬ μλ
- 벑ν°νλ μ°μ° μ¬μ©
- μ€λ³΅ κ³μ° μ΅μν
- λ³λ ¬ μ²λ¦¬ κ°λ₯ν λΆλΆ μ΅μ ν
Made with β€οΈ for the AI community
"κ³ νμ§ λ°μ΄ν°κ° κ³ μ±λ₯ λͺ¨λΈμ μμμ λλ€"
ν΅κ³: μ΄ λκ΅¬λ‘ λΆμλ λ°μ΄ν°μ μ νκ· 23% λ λμ λͺ¨λΈ μ±λ₯μ 보μ λλ€.
