A kiugró értékek kezelése lépésről lépésre

Minden adatelemzési projekt rémálma a torz statisztika. A kiugró értékek kezelése (outlier detection) ezért kritikus lépés a pontos eredményekhez. Egyetlen extrém adatpont, mint például egy 4 méter magas kosárlabdázó, teljesen elhúzhatja az átlagot.

Adattisztítás profi módon

Ebben a gyakorlati útmutatóban egy valós projekten keresztül mutatjuk be a megoldást. Először Python kódokkal, majd egy nyelvi modell segítségével végezzük el a munkát. Másold ki a kódokat, és kövesd az utasításokat a saját gépeden.

A három alapvető módszer

A kiugró értékek azonosítása az adatok eloszlásától függ. Három fő technikát alkalmazunk.

  1. Szórás (Standard Deviation): Normál eloszlású adatoknál használjuk. Az átlagtól való távolságot méri.
  2. Interkvartilis tartomány (IQR): Nem normál eloszlásnál hasznos. Az adatok középső 50%-át vizsgálja.
  3. Percentilis (Percentile): Egyszerű küszöbértékek (pl. alsó és felső 1%) levágása.

1. Szórás módszer Pythonban

Ha az adataink haranggörbét (normál eloszlást) követnek, a szórás a legjobb eszköz. Az átlag plusz/mínusz háromszoros szórása lefedi az adatok 99,7%-át. Ami ezen kívül esik, az kiugró érték.

Íme a kód a szűréshez:

import pandas as pd
import numpy as np

# Feltételezzük, hogy 'df' az adatkeretünk
col = df['column']

mean = col.mean()
std = col.std()

lower = mean - 3 * std
upper = mean + 3 * std

# Csak a határértéken belüli értékeket tartjuk meg
filtered_df = df[(col >= lower) & (col <= upper)]

2. IQR módszer Pythonban

Ez a módszer kevésbé érzékeny a szélsőséges eloszlásra. Először kiszámoljuk az IQR értékét (harmadik kvartilis mínusz első kvartilis). A határokat az IQR 1,5-szerese jelöli ki.

Q1 = df['column'].quantile(0.25)
Q3 = df['column'].quantile(0.75)

IQR = Q3 - Q1

lower = Q1 - 1.5 * IQR
upper = Q3 + 1.5 * IQR

# Szűrés a határokon belülre
filtered_df = df[(df['column'] >= lower) & (df['column'] <= upper)]

3. Percentilis módszer Pythonban

Ez a legegyszerűbb eljárás. Meghatározzuk a legalsó és legfelső 1%-ot, majd ezeket eltávolítjuk. Nem igényel feltételezéseket az eloszlásról.

lower_p = df['column'].quantile(0.01)
upper_p = df['column'].quantile(0.99)

filtered_df = df[(df['column'] >= lower_p) & (df['column'] <= upper_p)]

A Physician Partners adatprojekt

A gyakorlati példánkhoz a Physician Partners szintetikus egészségügyi adatkészletét használjuk. A feladat: találjuk meg a kiugró értékek kezelése során a gyanúsan magas költéseket generáló pácienseket.

Töltsük be és vizsgáljuk meg az adatokat:

sfrs = pd.read_csv('sfr_test.csv')
sfrs.info()

Az adatok vizsgálatakor egy technikai problémába ütközünk. A pénzügyi oszlopok (pl. plan_premium) dollárjeleket („$”) és vesszőket tartalmaznak. Ezeket szövegként kezeli a rendszer, így nem tudunk velük számolni. A tisztítás elengedhetetlen.

Automatizálás nyelvi modellel

A manuális kódolás helyett használhatunk modern nyelvi modelleket a folyamat felgyorsítására. Két promptot írunk: egyet a detektálásra, egyet a törlésre.

1. Prompt a detektáláshoz

Ez az utasítás betölti az adatokat, elvégzi a tisztítást (dollárjelek törlése), és lefuttatja mindhárom fenti módszert. A kimenet nem a teljes adatbázis lesz, hanem CSV fájlok a kiugró értékek indexeivel.

Másold be ezt a promptot a modellnek, miután csatoltad az adatfájlt:

Prompt: You are a data analysis assistant. I have attached a dataset. Your task is to detect outliers using three methods: Standard Deviation, IQR, and Percentile.

Follow these steps:

  1. Load the attached dataset and remove both the „$” sign and any comma separators („,”) from financial columns, then convert them to numeric.
  2. Handle missing values by removing rows with NA in the numeric columns we analyze.
  3. Apply the three methods to the financial columns:
    • Standard Deviation Method: flag values outside mean +/- 3 * std
    • IQR Method: flag values outside Q1 – 1.5 * IQR and Q3 + 1.5 * IQR
    • Percentile Method: use the 1st and 99th percentiles as cutoffs
  4. Instead of listing all results for each column, compute and output only:
    • the total number of outliers detected across all financial columns for each method
    • the average number of outliers per column for each method

Additionally, save the row indices of the detected outliers into three separate CSV files:

  • sd_outlier_indices.csv
  • iqr_outlier_indices.csv
  • percentile_outlier_indices.csv

Output only the summary counts and save the indices to CSV.

financial_columns = [„ipa_funding”, „ma_premium”, „ma_risk_score”, „mbr_with_rx_rebates”,”partd_premium”, „pcp_cap”, „pcp_ffs”, „plan_premium”, „prof”,”reinsurance”, „risk_score_partd”, „rx”, „rx_rebates”,”rx_with_rebates”, „rx_without_rebates”, „spec_cap”]

A modell válaszként generál három letölthető CSV fájlt. Ezek tartalmazzák a törlendő sorok azonosítóit.

2. Prompt a törléshez

A következő lépés a tisztítás végrehajtása. Válaszd ki az egyik módszert (pl. a Standard Deviation eredményét), és töltsd vissza a modellnek az sd_outlier_indices.csv fájlt.

Használd ezt a promptot:

Prompt:You are a data analysis assistant. I have attached a dataset along with a CSV which includes indices which are outliers.

Your task is to remove these outliers and return a clean version of the dataset.

  1. Load the dataset.
  2. Remove all given outliers using the given indices.
  3. Confirm how many values were removed.
  4. Return the cleaned dataset.

Eredmények ellenőrzése

A folyamat végén ellenőriznünk kell, hogy valóban megtörtént-e a tisztítás. Töltsük le a tisztított adatbázist (cleaned_dataset.csv), és futtassuk le ezt a Python ellenőrző kódot:

original = pd.read_csv('sfr_test.csv')
cleaned = pd.read_csv('cleaned_dataset.csv')

print("Eredeti méret:", original.shape)
print("Tisztított méret:", cleaned.shape)
print("Eltávolított sorok:", original.shape[0] - cleaned.shape[0])

A teszt során láthatjuk, hogy a módszer 791 kiugró értéket távolított el sikeresen.

Az adatelemzés minősége mindig az adatok tisztaságán múlik. Ezekkel a kódokkal és promptokkal percek alatt, hatékonyan végezhető el a kiugró értékek kezelése.

Kérjük, ellenőrizd a mező formátumát, és próbáld újra.
Köszönjük, hogy feliratkoztál.

vagyunk.hu hírlevél

Hozzászólás

Az e-mail címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük