Python / Өгөгдөл цэвэрлэх

Өгөгдөл цэвэрлэх

Өгөгдлийн шинжилгээчдийн цагийн 70–80 хувийг өгөгдөл цэвэрлэхэд зарцуулдаг гэсэн судалгаа байдаг. Бодит ертөнцийн өгөгдөл хэзээ ч төгс ирдэггүй — дутуу утга, буруу бичлэг, давхардсан мөр, тэвчиж болохгүй зай зэрэг асуудал үргэлж тохиолддог. Pandas эдгээрийг шийдэх хүчирхэг хэрэгслүүдтэй.

Дутуу утга (missing values)

Pandas дутуу утгыг NaN (Not a Number) гэж тэмдэглэдэг. Эхлээд дутуу утга байгаа эсэхийг шалгана:

python
import pandas as pd

өгөгдөл = {
    "нэр":   ["Болд", "Сарнай", None, "Номин", "Эрдэнэ"],
    "нас":   [20, None, 21, 23, 20],
    "оноо":  [85, 92, 78, None, 60],
    "хот":   ["УБ", "УБ", "Дархан", "УБ", None],
}
df = pd.DataFrame(өгөгдөл)

# Баганаар дутуу утгын тоо
print(df.isnull().sum())

# Дутуу утгатай мөрүүдийг бүгдийг устгах
цэвэр_df = df.dropna()
print(f"Үлдсэн мөр: {len(цэвэр_df)}")

Устгахын оронд дутуу утгыг дүүргэж болно — өгөгдөл алдахгүйн тулд илүү байнга хэрэглэгдэх арга:

python
# Тоон баганыг дундажаар дүүргэх
df["нас"] = df["нас"].fillna(df["нас"].mean())
df["оноо"] = df["оноо"].fillna(df["оноо"].median())

# Текстэн баганыг тогтмол утгаар дүүргэх
df["хот"] = df["хот"].fillna("Тодорхойгүй")
df["нэр"] = df["нэр"].fillna("Нэргүй")

print(df)

Давхардсан мөр ба буруу формат

Давхардсан өгөгдөл шинжилгээний үр дүнг гажуудуулдаг тул эрт илрүүлж устгах нь чухал:

python
# Давхардал шалгах
print(f"Давхардсан мөр: {df.duplicated().sum()}")

# Давхардлыг устгах (эхнийхийг нь үлдээнэ)
df = df.drop_duplicates()

# Тодорхой баганаар давхардал шалгах
df = df.drop_duplicates(subset=["нэр"])

Мөр мөрийн форматыг засах ч адилхан чухал. Зай, том/жижиг үсгийн хольц нийтлэг асуудал:

python
# Текстэн өгөгдлийг цэвэрлэх
df["нэр"] = df["нэр"].str.strip()             # эхний, эцсийн зай хасах
df["хот"] = df["хот"].str.upper()             # бүгдийг том үсгээр
df["хот"] = df["хот"].str.replace("  ", " ")  # давхар зай засах

# Тоон өгөгдлийн хүрээ шалгаж буруугийг засах
df["оноо"] = df["оноо"].clip(0, 100)          # 0–100 хүрээнд хязгаарлах
df["нас"]  = df["нас"].astype(int)            # float-аас int болгох

Баганын нэр ба өгөгдлийн төрөл цэвэрлэх

CSV файлаас уншсан өгөгдөл ихэвчлэн баганын нэрэнд зай, том үсэг хольсон байдаг. Стандартчилах нь хамгийн эхний алхам:

python
# Баганын нэрийг стандартчилах
df.columns = df.columns.str.strip().str.lower().str.replace(" ", "_")

# Өгөгдлийн төрлийг зөв болгох
df["огноо"] = pd.to_datetime(df["огноо"], format="%Y-%m-%d")
df["үнэ"]   = pd.to_numeric(df["үнэ"], errors="coerce")  # буруу утгыг NaN болгоно

# Өгөгдлийн төрлүүдийг шалгах
print(df.dtypes)

Бүрэн цэвэрлэх pipeline

Бодит төсөлд цэвэрлэх алхмуудыг нэг функцэд нэгтгэж, дахин ашигладаг — энэ нь мэргэжлийн зөв дадал:

python
def өгөгдөл_цэвэрлэх(df: pd.DataFrame) -> pd.DataFrame:
    # 1. Баганын нэр стандартчилах
    df.columns = df.columns.str.strip().str.lower().str.replace(" ", "_")

    # 2. Давхардал устгах
    df = df.drop_duplicates()

    # 3. Дутуу утга засах
    df["оноо"] = df["оноо"].fillna(df["оноо"].median())
    df["хот"]  = df["хот"].fillna("Тодорхойгүй")

    # 4. Текст цэвэрлэх
    df["нэр"] = df["нэр"].str.strip()

    # 5. Хүрээнээс гарсан утга засах
    df["оноо"] = df["оноо"].clip(0, 100)

    print(f"Цэвэрлэсний дараа: {len(df)} мөр үлдлээ ✓")
    return df


df_цэвэр = өгөгдөл_цэвэрлэх(df)
df_цэвэр.to_csv("цэвэр_өгөгдөл.csv", index=False, encoding="utf-8")

Өгөгдөл цэвэрлэх нь уйтгартай мэт санагдаж болох ч энэ алхмыг алгасвал дараагийн шинжилгээ, загвар бүгд буруу үр дүн өгнө. Цэвэр өгөгдөл — зөв шийдвэрийн суурь.

Дараагийн хичээлд:

Цэвэрлэсэн өгөгдлөө matplotlib ашиглан график хэлбэрт оруулна — шугамын, баарны, дугуй диаграмм зуран, өгөгдлийн дотоод хэв маягийг нүдэнд харагдуулж сурна.