이상치 제거 Python | [빅데이터 분석기사 실기 – Pandas 31] 이상치(Outlier) 확인 및 해결방법 22798 명이 이 답변을 좋아했습니다

당신은 주제를 찾고 있습니까 “이상치 제거 python – [빅데이터 분석기사 실기 – Pandas 31] 이상치(outlier) 확인 및 해결방법“? 다음 카테고리의 웹사이트 you.prairiehousefreeman.com 에서 귀하의 모든 질문에 답변해 드립니다: https://you.prairiehousefreeman.com/blog/. 바로 아래에서 답을 찾을 수 있습니다. 작성자 EduAtoZ – Programming 이(가) 작성한 기사에는 조회수 823회 및 좋아요 18개 개의 좋아요가 있습니다.

Table of Contents

이상치 제거 python 주제에 대한 동영상 보기

여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!

d여기에서 [빅데이터 분석기사 실기 – Pandas 31] 이상치(outlier) 확인 및 해결방법 – 이상치 제거 python 주제에 대한 세부정보를 참조하세요

이상치(Outlier) 확인 및 해결 방법을 알아봅니다.
사용 파일 : https://nice-trail-e26.notion.site/a589653792674fccb39d0faaf57387dd?v=a4bb24253f64426caebe7b778d04a314

이상치 제거 python 주제에 대한 자세한 내용은 여기를 참조하세요.

python, pandas series type에서 이상치(outlier) 제거 하기

python, pandas series type에서 이상치(outlier) 제거 하기. Dr_Kim 2022. 3. 1. 08:46. 데이터 관련하여 포스팅하면서 가장 어려운 부분이 대상 데이터를 만드는 …

+ 여기에 더 보기

Source: lifelong-education-dr-kim.tistory.com

Date Published: 7/9/2021

View: 5869

[Pandas] 파이썬 IQR 기반 이상치(outlier) 탐지 및 제거 방법

파이썬 판다스 이상값 찾기, 처리 예제 파이썬의 데이터프레임 내에서 각 열 내에서 이상치(outlier)를 찾아보고 이를 제거해보는 방법을 간단한 예제 …

+ 여기에 표시

Source: jimmy-ai.tistory.com

Date Published: 10/16/2021

View: 2162

Lv3 전처리 2/4 python 파이썬 이상치 제거 – DACON

즉, 우리는 이 boxplot의 4와 6사이의 실선보다 작고, 8과 10 사이의 실선보다 큰 데이터 포인트들을 이상치로 판단하고 제거해보겠습니다.

+ 여기에 더 보기

Source: dacon.io

Date Published: 12/16/2022

View: 1470

파이썬 실습 – 이상치(Outliers) 제거하기

파이썬 실습 – 이상치(Outliers) 제거하기 … 저는 총 세 개의 데이터에 대해 이상치 제거를 해줄 것이므로 박스플롯을 세 번 찍어 주겠습니다.

+ 여기에 표시

Source: hungryap.tistory.com

Date Published: 7/15/2021

View: 3819

이상치(Outlier) 제거하는 Python 예제 코드 – 멈춤보단 천천히라도

표준화 전후로 이상치(Outlier)를 제거하는 Python 예제 코드입니다. 2022. 4. 5 최초작성 이상치는 대부분의 값과 다르게 아주 작거나 아주 큰 값을 …

+ 여기에 보기

Source: webnautes.tistory.com

Date Published: 9/16/2021

View: 7432

판다스 pandas IQR 활용해서 이상점(outlier) 찾고 삭제하기

인구 수를 기준으로 75% 지점에서 1.5*IQR을 더한 것보다 많은 인구 수를 가진 국가를 제거하고 산점도 그래프를 다시 그려보자. 먼저 IQR을 구해야 …

+ 여기에 더 보기

Source: fhaktj8-18.tistory.com

Date Published: 5/9/2022

View: 3322

이상치 제거 – Python 샘플 코드

이상치 제거. #Removing outliers first then skewness from scipy.stats import zscore z=abs(zscore(df)) print(z.shape) df=df[(z<3).all(axis=1)] df.shape.

+ 자세한 내용은 여기를 클릭하십시오

Source: ko.code-paper.com

Date Published: 9/12/2021

View: 7005

파이썬으로 데이터 전처리 하기 / 결측치, 중복 데이터, 이상치 …

DataFrame.drop_duplicates의 subse, keep을 통해 중복을 제거 할 수 있다. > 이상치 (Outlier) <. 대부분 값의 범위에서 벗어난, 극단적으로 크거나 ...

+ 여기에 표시

Source: iambeginnerdeveloper.tistory.com

Date Published: 11/15/2022

View: 6720

Python Boxplot 박스 플롯 이상치 제거하기 – feat. IQR, 함수

지난 포스팅대로 박스 플롯을 시각화했는데 편차가 너무 커서 데이터를 제대로 해석하지 못한다고 가정해보자. 그런 경우에는 IQR(Inter Quartile …

+ 더 읽기

Source: blog.naver.com

Date Published: 10/3/2022

View: 2640

[Python] Pandas – DataFrame 이상치 제거 – Developer

def dr_outlier(df): quartile_1 = df.quantile(0.25) quartile_3 = df.quantile(0.75) IQR = quartile_3 – quartile_1 condition = (df …

+ 여기를 클릭

Source: bjy2.tistory.com

Date Published: 12/4/2021

View: 375

주제와 관련된 이미지 이상치 제거 python

주제와 관련된 더 많은 사진을 참조하십시오 [빅데이터 분석기사 실기 – Pandas 31] 이상치(outlier) 확인 및 해결방법. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.

[빅데이터 분석기사 실기 - Pandas 31] 이상치(outlier) 확인 및 해결방법
[빅데이터 분석기사 실기 – Pandas 31] 이상치(outlier) 확인 및 해결방법

주제에 대한 기사 평가 이상치 제거 python

  • Author: EduAtoZ – Programming
  • Views: 조회수 823회
  • Likes: 좋아요 18개
  • Date Published: 2021. 11. 1.
  • Video Url link: https://www.youtube.com/watch?v=iRt7C9Dd_c4

python, pandas series type에서 이상치(outlier) 제거 하기

데이터 관련하여 포스팅하면서 가장 어려운 부분이 대상 데이터를 만드는 것이다. 실제 데이터는 회사내에서 추출이 안되니 내가 경험했던 것과 유사한 데이터를 임의로 만들야 하기 때문이다. 그래도 데이터를 생성하는 것도 하나의 재미를 주기 때문에 그리 나쁘지만은 않다. 이상치 제거를 하기 위해 이상치가 포함된 데이터를 우선 만들어 보기로 한다.

1. 정규분포를 갖는 일반 데이터 생성

2. 10개의 이상치를 갖는 데이터 셋 만들기

3. 이상치 제거하기

4. 이상치 제거 함수

1. 정규분포를 갖는 일반 데이터 생성

자연계의 데이터들은 일반적으로 정규분포를 갖는다라는 이론이 있다. 실제 데이터 처리 및 분석 시 정규분포의 평균과 표준편차를 많이 이용한다. 데이터를 생성하기 위해 정규분포를 이용했다.

python에서 사용할 라이브러리는 다음과 같이 import 시킨다.

import numpy as np import pandas as pd import random import matplotlib.pyplot as plt import scipy.stats as stats

불러온 라이브러리의 목적을 간단하게 기술한다.

– numpy : 정규분포 데이터 생성 (np.random.normal)

– random : 평균, 표준편차 랜덤 생성

– scipy.stats : 정규분포 그래프 생성 (stats.norm.pdf)

이제 임의의 평균과 표준편차를 이용하여 정규분포를 이루는 3000개의 데이터 셋을 생성해보자

row_no = 3000 mean = random.random() std = random.random() data = list(np.random.normal(mean, std, row_no))

생성된 일반 데이터 그래프

어렵지 않게 일반데이터를 만들었다. 물론 해당 데이터를 정규분포 생성함수(np.random.normal)을 이용하여 만들긴 했지만 확인을 위해 정규분포를 그려본다. 정규분포를 만들기 위해 scipy의 stats 라이브러리를 사용한다.

data_mean = np.mean(data) data_std = np.std(data) pdf = stats.norm.pdf(np.sort(data), data_mean, data_std) plt.figure() plt.plot(np.sort(data), pdf)

일반 데이터의 정규분포

데이터의 평균과 표준편차를 구해서 pdf(Probability Density Function, 확률밀도함수) 함수에 넣으면 된다. 이때 sort를 사용하는 이유는 x축 값에 대한 y축 값을 매칭하는 정도로 이해하면 될 듯 하다.

2. 10개의 이상치를 갖는 데이터 셋 만들기

일반 데이터에 이상치 10개를 삽입해 본다. 초기에 데이터를 list type으로 만든 이유는 데이터 삽입 함수인 list.insert를 사용하기 위해서였다. 데이터를 outlier_data로 복사를 하고 리스트 내 임의의 위치에 값을 3배 증폭시켜 삽입한다.

ol_data = data.copy() ol_no = 10 for i in range(ol_no): rand_no = random.randint(0, len(data)) ol_data.insert(rand_no, ol_data[rand_no]*3)

10개의 이상치를 갖는 데이터 셋

3. 이상치 제거하기

이상치 제거하는 방법에는 여러가지가 있지만, 본 포스팅에서는 박스차트의 개념을 도입하였다. 내가 실제 데이터의 이상치를 제거할 때 편히 쓰는 방식으로 이상치 제거 민감도 가 쉽게 조절이 되고 python에서 pandas의 특성을 잘 이용할 수 있기 때문이다. 이상치 제거 민감도는 박스차트를 구해주는 공식에서 IQR에 곱해주는 1.5의 값이다. 1.5의 값은 박스차트의 Whisker 값을 만들어 주는 인자로 정규분포로 말하자면 2.698σ(시그마)와 동일하다. 필자는 일반적으로 현장데이터에 한해 3을 적용한다.

출처 : https://itwiki.kr/w/이상치

s_ol_data = pd.Series(ol_data) level_1q = s_ol_data.quantile(0.25) level_3q = s_ol_data.quantile(0.75) IQR = level_3q – level_1q rev_range = 3 # 제거 범위 조절 변수 dff = s_ol_data[(s_ol_data <= level_3q + (rev_range * IQR)) & (s_ol_data >= level_1q – (rev_range * IQR))] dff = dff.reset_index(drop=True)

위의 코드는 조금의 설명이 필요하겠다. 첫 줄에서 리스트를 시리즈로 변환하는 이유는 dff를 만들때 pandas의 조건문을 사용하기 위해서다. pandas내의 조건문을 이용하게 되면 for문을 쓰는 것보다 속도가 빨라지기 때문에 데이터 처리에서 유리하다. 지금은 한 종류의 데이터 셋에 대해서 설명하지만 실제 100개 이상의 종류의 데이터에 몇십만개의 데이터 셋을 처리하다 보면 일반 노트북에서는 잘 동작 되지 않는다. 이상치 제거 후의 그래프는 아래와 같다.

이상치 제거 후 데이터 셋

처음에 만들었던 일반 데이터 셋과 같음을 확인할 수 있다. 필자가 데이터 생성 코드까지 같이 공유하는 이유는 데이터 분석 공부에서 가장 어려운게 데이터를 구하는 것이기 때문이다. 향후의 포스팅 시에도 가능하면 데이터를 생성할 수 있는 방법을 고민해서 같이 올리려 한다.

4. 이상치 제거 함수

이상치 제거 방법을 코드로 확인했으나, 여러종류의 데이터에서 적용하려면 함수로 만드는 것이 편하다. 3번에서 설명한 코드를 DataFrame type을 다룰 수 있도록 함수로 구현해 봤다.

def remove_out(dataframe, remove_col): dff = dataframe for k in remove_col: level_1q = dff[k].quantile(0.25) level_3q = dff[k].quantile(0.75) IQR = level_3q – level_1q rev_range = 3 # 제거 범위 조절 변수 dff = dff[(dff[k] <= level_3q + (rev_range * IQR)) & (dff[k] >= level_1q – (rev_range * IQR))] dff = dff.reset_index(drop=True) return dff

함수의 입력 변수에서 dataframe은 데이터 셋을 의미하고, remove_col은 이상치를 제거하고 싶은 데이터 종류를 말한다. 추가적으로 rev_range를 입력변수로 받아서 제거 범위 조절도 함수 호출 시 별도로 할 수 있다.

5. 이상치에 대한 고찰

이번 포스팅에서 이상치 제거를 위해 여러 방법 중에 박스차트 공식을 사용하였다. 그 중에서 이상치 제거 민감도를 어떻게 결정할 것인지에 대해서 고민을 할 필요가 있다. 데이터를 확인하다 보면 제거를 해야하는 이상치인지 제거를 하면 안 되는 불량치인지를 구분해야 한다. 사실 이상치 제거 민감도 값을 결정하기 앞서 데이터를 그래프로 그려 확인하는 분석을 먼저 수행해야 한다. 수집되는 데이터에서 불량값으로 판단되는 데이터는 이상치 제거에서 삭제되면 안된다. 이상값과 불량값을 단순하게 아래와 같이 예로 정리했다.(레이저 변위 센서로 제품의 길이를 측정한다고 가정)

제품의 정상값 : 30cm ± 5mm

불량값 : 30.6cm, 30.9cm (실제 제품이 양품 기준을 벗어나 제작된 상태)

이상값 : 0cm, 99cm

(센서 미동작으로 값이 읽히지 않은 상태 또는 측정 위치에 이물이 묻어 레이저가 반사되 이상값이 측정된 상태)

이상치 제거 민감도를 1.5로 한다면 2.7σ 수준으로 불량값을 제거할 가능성이 높다. 제거 민감도 값을 결정할 때는 사전에 꼭 데이터를 확인해서 이상값이 발생하는 수준을 판단해야 한다. 필자가 3으로 설정한 이유는 현장의 데이터, 즉 양품데이터와 불량데이터는 그대로 사용하고 그 범주에 속하지 않는 이상상태에서 입력된 데이터를 잘라내기 위해 5σ 수준으로 설정한 것이다. 사실 그 정도면 양품/불량품 데이터가 다치치 않았다.

[Pandas] 파이썬 IQR 기반 이상치(outlier) 탐지 및 제거 방법

반응형

파이썬 판다스 이상값 찾기, 처리 예제

파이썬의 데이터프레임 내에서 각 열 내에서 이상치(outlier)를 찾아보고

이를 제거해보는 방법을 간단한 예제를 통하여 이해하기 쉽게 다루어보도록 하겠습니다.

여기서는 IQR을 기반으로 이상치를 탐지하는 예시를 다루었으며,

이상치의 기준은 아래와 같습니다.

Q3 : 100개의 데이터로 가정 시, 25번째로 높은 값에 해당합니다.

Q1 : 100개의 데이터로 가정 시, 75번째로 높은 값에 해당합니다.

IQR : Q3 – Q1의 차이를 의미합니다.

이상치 : Q3 + 1.5 * IQR보다 높거나 Q1 – 1.5 * IQR보다 낮은 값을 의미합니다.

참고로, outlier의 경계 기준은 데이터의 분포와 사용하는 상황에 맞게 조절할 수 있습니다.

이해를 돕기 위하여 아래와 같이 100명의 학생들의 국어, 수학 점수 정보가

포함되어있는 간단한 데이터프레임 df를 생각해보겠습니다.

Step 1 : 컬럼별 Q3, Q1, IQR 값 구하기(quantile 함수 이용)

먼저, 각 열별의 Q3, Q1 및 IQR 값을 미리 구해두는 것이 좋습니다.

이는 백분위수를 구해주는 quantile 함수를 적용하여 쉽게 구할 수 있으며,

아래 코드처럼 데이터프레임 전체 혹은 특정 열에 대하여 모두 적용이 가능합니다.

q3 = df.quantile(0.75) # df[‘국어’].quantile(0.75) 처럼 특정 열만 적용 가능 q1 = df.quantile(0.25) iqr = q3 – q1

위에서 구한 Q3, Q1, IQR 값을 출력해본 결과의 예시는 다음과 같습니다.

(기본적으로 Series 형태로 반환됩니다.)

반응형

Step 2 : 각 값의 이상치 여부 판별하기(apply 함수 이용)

앞 과정에서 구한 Q3, Q1 및 IQR가 저장된 Series를 활용하여

특정 열에 대하여 각 데이터의 outlier 여부 판별을 진행할 수 있습니다.

apply 함수를 통하여 각 값의 이상치 여부를 한 번에 쉽게 구할 수 있으며,

‘국어’ 열에 대하여 이상값 여부 판별 결과를 구하여 저장한 예시는 아래와 같습니다.

(outlier 경계 기준을 바꾸고 싶은 경우에는 if문 내의 식을 바꿔서 적용해주시면 됩니다.)

# ‘국어’ 열에 대하여 이상치 여부를 판별해주는 함수 def is_kor_outlier(df): kor_score = df[‘국어’] if kor_score > q3[‘국어’] + 1.5 * iqr[‘국어’] or kor_score < q1['국어'] - 1.5 * iqr['국어']: return True else: return False # apply 함수를 통하여 각 값의 이상치 여부를 찾고 새로운 열에 결과 저장 df['국어_이상치여부'] = df.apply(is_kor_outlier, axis = 1) # axis = 1 지정 필수 df Step 3 : 이상치 행 제거하기 이제 앞 스텝에서 구한 이상치 정보를 바탕으로 이상치 행을 제거해보겠습니다. 이는 loc 함수를 이용한 조건 필터링을 통하여 이상치 여부가 False로 판별된 행들만 남긴 뒤, outlier 여부를 구했던 열을 제거해주시면 원래 데이터프레임에서 이상치 행만 제거된 결과를 얻을 수 있게 됩니다. # 이상치인 행은 제거하여 필터링 df_trim = df.loc[df['국어_이상치여부'] == False] # 이상치여부를 나타내는 열 제거 del df_trim['국어_이상치여부'] df_trim 2개의 이상치 행이 제거된 모습(2번 인덱스 행도 사라졌습니다.)을 살펴볼 수 있었습니다. 반응형

Lv3 전처리 2/4 python 파이썬 이상치 제거

이번 시간에는 IQR을 통해서 이상치를 제거해보겠습니다.

IQR이란, 3분위수(75%에 위치한 값) – 1분위수(25%에 위치한 값)를 의미합니다.

아래의 지난 시간에서 다룬 boxplot을 통해서 살펴보겠습니다.

각각의 선들이 의미하는 바를 살펴보겠습니다.

10~8 사이의 실선 : 3분위수 + 1.5 * IQR

보라색 박스의 위쪽 실선 : 3분위수 (75%)

보라색 박스의 중앙 실선 : 2분위수 (중앙값)

보라색 박스의 아래 실선 : 1분위수 (25%)

4~6 사이의 실선 : 1분위수 – 1.5 * IQR

보라색 박스의 길이 : 3분위수 – 1분위수 = IQR

즉, 우리는 이 boxplot의 4와 6사이의 실선보다 작고, 8과 10 사이의 실선보다 큰 데이터 포인트들을 이상치로 판단하고 제거해보겠습니다.

———————————————————————————————————

# 25%에 위치한 값을 구해줍니다.

quantile_25 = np.quantile(train[‘fixed acidity’], 0.25)

———————————————————————————————————

# 75%에 위치한 값을 구해줍니다.

quantile_75 = np.quantile(train[‘fixed acidity’],0.75)

———————————————————————————————————

# IQR을 구해줍니다.

IQR = quantile_75 – quantile_25

———————————————————————————————————

# quantile_25보다 1.5 * IQR 작은 값을 구해줍니다.

minimum = quantile_25 – 1.5 * IQR

———————————————————————————————————

# quantile_75보다 1.5 * IQR 큰 값을 구해줍니다.

maximum = quantile_75 + 1.5 * IQR

———————————————————————————————————

# minimum보다 크거나 같고, maximum보다 작거나 같은 값들만 뽑아냅니다.

train2 = train[(minimum <= train['fixed acidity']) & (train['fixed acidity'] <= maximum)] --------------------------------------------------------------------------------------------------------- [Colab 실습 링크] ↩️ 오늘의 파이썬 리스트 #데이콘_101 #AI #머신러닝 #딥러닝 #파이썬 #파이선 #데이터분석 #데이터사이언티스트 #코랩 #Python #colab #kaggle #pandas #numpy #sckit-learn # read_csv #이상치제거 #IQR

파이썬 실습 – 이상치(Outliers) 제거하기

반응형

이상치 제거하기

먼저 이상치를 제거해줄 데이터에 대해 박스플롯을 찍어 봅니다.

저는 총 세 개의 데이터에 대해 이상치 제거를 해줄 것이므로 박스플롯을 세 번 찍어 주겠습니다.

여기서는 seaborn의 boxplot을 사용해 주었습니다. 컬러는 레드를 넣었습니다.

빨간색 박스가 아래 배치되어 있고 그 위로 수 많은 마름모 모양의 이상치들이 존재하는 걸 확인할 수 있습니다.

두 번째 데이터에 대해 박스플롯을 찍어봅니다.

이번에 박스 컬러를 옐로우로 넣었습니다.

역시 노란색 박스 위로 이상치들이 무수히 많이 존재하는 걸 확인할 수 있습니다.

마지막 데이터도 박스플롯을 찍어봅니다.

이번엔 컬러를 그린으로 주었습니다.

위, 아래로 이상치들이 존재하는 걸 확인할 수 있습니다.

다음 이상치를 제거할 함수를 하나 만들어보겠습니다.

먼저 numpy를 불러옵니다.

그리고 4분의 3에서 4분의 1지점을 빼준 iqr을 계산해준 뒤

lower_bound, upper_bound를 계산하는 식에 넣어줍니다.

데이터가 upper_bound보다 크거나 lower_bound보다 작을 경우를 return해줍니다.

(해당 함수의 이해를 돕기 위해 바로 아래에 그림을 첨부합니다.)

다음 이상치를 제거해줄 데이터들을 정의해준 함수에 차례대로 넣습니다.

각각 데이터들의 이상치에 대해 확인합니다.

그리고 concatenate함수를 이용해 이 (array형태의) 세 함수를 합쳐줍니다.

이상치의 총 개수도 print해줍니다.

for문을 이용해 이상치가 아닌 index를 lead_not_outlier_index에 넣어줍니다.

인덱스를 리셋해준 후 출력해줍니다.

이상치가 모두 제거되었습니다.

반응형

이상치(Outlier) 제거하는 Python 예제 코드

반응형

표준화 전후로 이상치(Outlier)를 제거하는 Python 예제 코드입니다.

2022. 4. 5 최초작성

이상치는 대부분의 값과 다르게 아주 작거나 아주 큰 값을 의미합니다.

평균 ± 표준편차 × 3 을 벗어나는 것을 이상치로 취급하여 제거해본 예제 코드입니다. 표준화를 적용 전후에 각각 이상치를 제거해봤습니다.

전체 코드입니다.

import pandas as pd

import numpy as np

import matplotlib.pyplot as plt

from collections import Counter

# 5개의 특징으로 구성된 샘플 40개 생성

a = np.random.randint(1, 13, size=200).reshape(40, 5)

df_raw = pd.DataFrame(a)

# 0번째 특징에 이상치 추가

df_raw.iloc[0, 0] = -30

df_raw.iloc[1, 0] = 30

df_raw.iloc[2, 0] = 60

df_raw.iloc[3, 0] = -27

df_raw.iloc[4, 0] = 27

df_raw.iloc[5, 0] = -60

# 평균과 표준편차

df_raw_mean = df_raw.mean(axis=0)

df_raw_std = df_raw.std(axis=0)

# df_raw에 포함된 숫자(key_raw) 별로 몇개가 존재하는지 계산(value_raw)

key_raw = Counter(df_raw.values.flatten()).keys()

value_raw = Counter(df_raw.values.flatten()).values()

# mean – 3*std ~ mean + 3*std 범위 벗너나면 이상치로 제거

df_raw_result = df_raw.copy()

df_raw_result[df_raw_result > df_raw_mean + df_raw_std * 3] = 0

df_raw_result[df_raw_result < df_raw_mean - df_raw_std * 3] = 0 # df_raw_result에 포함된 숫자(key_raw_result) 별로 몇개가 존재하는지 계산(value_raw_result) key_raw_result = Counter(df_raw_result.values.flatten()).keys() value_raw_result = Counter(df_raw_result.values.flatten()).values() # 표준화 적용 df_standardization = (df_raw - df_raw_mean) / df_raw_std # df_standardization에 포함된 숫자(key_standardization) 별로 몇개가 존재하는지 계산(value_standardization) key_standardization = Counter(df_standardization.values.flatten()).keys() value_standardization = Counter(df_standardization.values.flatten()).values() # -3 ~ 3 범위 벗어나면 이상치로 제거 df_standardization_result = df_standardization.copy() df_standardization_result[df_standardization_result > 3] = 0

df_standardization_result[df_standardization_result < -3] = 0 # df_standardization_result에 포함된 숫자(key_standardization_result) 별로 몇개가 존재하는지 계산(value_standardization_result) key_standardization_result = Counter(df_standardization_result.values.flatten()).keys() value_standardization_result = Counter(df_standardization_result.values.flatten()).values() # 이상치가 존재했던 셀만 값을 출력하여 변화 확인 print( 'df_raw' ) for i in range(6): print(df_raw.iloc[i, 0], end= " " ) print( ' ' ) print( 'df_raw_result' ) for i in range(6): print(df_raw_result.iloc[i, 0], end= " " ) print( ' ' ) print( 'df_standardization' ) for i in range(6): print(df_standardization.iloc[i, 0], end= " " ) print( ' ' ) print( 'df_standardization_result' ) for i in range(6): print(df_standardization_result.iloc[i, 0], end= " " ) print( ' ' ) # 이상치 제거되는 것을 그래프로 확인 k = 0 # 각 값들의 분포 모양 비교 f,ax = plt.subplots(1,4,figsize=(12, 5)) ax[0].bar(key_raw, value_raw, color= 'red' ) ax[0].set_xlim([-65, 65]) ax[0].set_ylim([0, 45]) ax[0].set_title( 'rawdata before' ) ax[0].axvline(df_raw_mean[k], color= 'b' , linestyle= 'dashed' , linewidth=1) ax[0].axvline(df_raw_mean[k] - df_raw_std[k]*3 , color= 'k' , linestyle= 'dashed' , linewidth=1) ax[0].axvline(df_raw_mean[k] + df_raw_std[k]*3 , color= 'k' , linestyle= 'dashed' , linewidth=1) ax[1].bar(key_raw_result, value_raw_result, color= 'red' ) ax[1].set_xlim([-65, 65]) ax[1].set_ylim([0, 45]) ax[1].set_title( 'rawdata after' ) ax[1].axvline(df_raw_mean[k], color= 'b' , linestyle= 'dashed' , linewidth=1) ax[1].axvline(df_raw_mean[k] - df_raw_std[k]*3, color= 'k' , linestyle= 'dashed' , linewidth=1) ax[1].axvline(df_raw_mean[k] + df_raw_std[k]*3 , color= 'k' , linestyle= 'dashed' , linewidth=1) ax[2].bar(key_standardization, value_standardization, color= 'red' ) ax[2].set_xlim([-7, 7]) ax[2].set_ylim([0, 45]) ax[2].set_title( 'Standardization data before' ) ax[2].axvline(-3, color= 'k' , linestyle= 'dashed' , linewidth=1) ax[2].axvline(3 , color= 'k' , linestyle= 'dashed' , linewidth=1) ax[3].bar(key_standardization_result, value_standardization_result, color= 'red' ) ax[3].set_xlim([-7, 7]) ax[3].set_ylim([0, 45]) ax[3].set_title( 'Standardization data after' ) ax[3].axvline(-3, color= 'k' , linestyle= 'dashed' , linewidth=1) ax[3].axvline(3 , color= 'k' , linestyle= 'dashed' , linewidth=1) plt.show() 이상치 제거를 보여주는 그래프입니다. 왼쪽 2개는 표준화 전에 이상치를 제거한 전후이고 오른쪽 2개는 표준화 후에 이상치를 제거한 전후입니다. 이상치에 해당되는 값만 출력한 결과입니다. df_raw -30 30 60 -27 27 -60 df_raw_result -30 30 0 -27 27 0 df_standardization -2.124591463996994 1.4536678437874169 3.2427974976796223 -1.9456784986077733 1.2747548783981963 -3.913721117889199 df_standardization_result -2.124591463996994 1.4536678437874169 0.0 -1.9456784986077733 1.2747548783981963 0.0 참고 https://machinelearningmastery.com/how-to-use-statistics-to-identify-outliers-in-data/ https://analyticsindiamag.com/outlier-detection-using-z-score-a-complete-guide-with-python-codes/ 반응형

판다스 pandas IQR 활용해서 이상점(outlier) 찾고 삭제하기

어떤 데이터를 분석하고 시각화하려 할 때 다른 값들과 확연한 차이가 나거나 비정상적인 이상점이 존재할 때 데이터가 의미하는 바를 제대로 분석하지 못할 수도 있다.

그래서 데이터 분석의 목적에 따라서 이상점을 삭제하거나 수정해야 한다.

이상점을 삭제하려면 우선 이상점을 찾아야 한다.

박스 플롯을 보면 데이터의 분포와 데이터들 사이에서 이상점의 개별적인 이상치를 볼 수 있다.

박스 플롯의 구성은 이렇다.

그래프 바깥에는 이상점이 표시된다. 즉, 데이터의 최댓값과 최솟값을 넘어가는 위치에 있는 값을 이상점이라 할 수 있다.

그리고 Q1은 제 1사분위로, 25%의 위치를 가르킨다.

Q2는 제 2사분위로, 50%의 위치인 중앙값(median)을 가르킨다.

Q3은 제 3사분위로, 75%의 위치를 가르킨다.

Q1 – 1.5 * IQR = 최솟값, Q3 + 1.5 * IQR = 최댓값

->이상점 기준 공식이다. 이 때 결정된 최솟값보다 작거나, 최댓값보다 큰 값을 이상점으로 간주한다. boolean 활용해서 구할 수 있다. 아래 코드보기.

참고로 IQR은 InterQuartile Range의 줄임말로, Q1과 Q3 사이에 있는 수치이다. 박스 플롯의 기본이 되는 수치이다.

즉, IQR = Q3 – Q1

이제 이상점을 찾는 공식을 알았으니 응용해서 이상점을 찾고 삭제해보자.

Latest Covid-19 Data in Asia.csv 0.00MB

아시아 국가들의 최근 코로나 현황을 모아놓은 데이터셋이다.

코로나 확진자 수, 사망자 수, 완치자, 총 인구 수 등 코로나 현황 분석을 위한 여러 컬럼들이 있다.

총 인구 수와 확진자 수의 산점도를 그려보자.

import pandas as pd %matplotlib inline covid=pd.read_csv(‘data/Latest Covid-19 Data in Asia.csv’) covid.plot(kind=’scatter’,x=’Population’,y=’Total Cases’)

보다시피 인구 수가 다른 국가에 비해 월등히 높은 몇몇 국가들의 데이터 때문에 그래프가 잘 보이지 않는다.

인구 수를 기준으로 75% 지점에서 1.5*IQR을 더한 것보다 많은 인구 수를 가진 국가를 제거하고 산점도 그래프를 다시 그려보자.

먼저 IQR을 구해야 하는데, describe() 메소드로 데이터의 최솟값, 최댓값, 중앙값, 25% 지점, 75% 지점 등 여러 통계값을 확인할 수 있다.

covid[‘Population’].describe() >>> count 4.900000e+01 mean 9.477503e+07 std 2.814899e+08 min 4.417360e+05 25% 5.221495e+06 50% 1.695384e+07 75% 5.131411e+07 max 1.439324e+09 Name: Population, dtype: float64 >>>

‘Population’ 열의 통계값들을 쭉 나열한 결과가 나왔다. 이 중 25% 지점과 75% 지점의 값들을 Q1과 Q3 변수에 할당해줘서 IQR 을 구할 수 있다. 하지만 quantile() 함수를 쓰면 일일히 확인하지 않아도 25% 값과 75% 값을 구할 수 있다.

q1=covid[‘Population’].quantile(0.25) q2=covid[‘Population’].quantile(0.5) q3=covid[‘Population’].quantile(0.75) iqr=q3-q1 iqr >>> 46092611.0 >>>

quantile의 파라미터로 구하고 싶은 값을 넣어주면 그 값에 해당하는 숫자가 리턴된다.

그 값을 q1과 q3 변수에 할당해주고 위에서 언급했던 IQR = Q3 – Q1 공식을 적용해서 IQR 값을 구했다.

총 인구 수 열의 IQR 값은 46092611.0 으로 나왔다.

condition=covid[‘Population’]>q3+1.5*iqr covid[condition]

우리는 인구 수가 많은 국가들을 제거해야 하니 75% 지점인 q3에서 1.5*iqr 많은 인구 수를 가진 국가들(최댓값)을 찾고 이 값보다 인구 수가 많은 국가들을 구해 condition 변수에 저장한다.

그리고 이 조건을 covid 데이터프레임에 적용하면

총 인구 수가 q3+1.5*iqr 보다 많은 인덱스 값들이 쫙 나온다.

방글라데시, 중국, 인도, 인도네시아, 일본, 파키스탄이 걸렸다. 이제 이 행들만 삭제하면 된다.

a=covid[condition].index covid.drop(a,inplace=True)

a를 실행하면 covid[condition]의 모든 인덱스 번호가 리턴된다. Int64Index([4, 8, 12, 13, 17, 31], dtype=’int64′)

이 인덱스들을 지워야 하니 drop의 파라미터로 a를 넣어준다. 참고로 drop 함수는 기존 데이터프레임을 건들지 않으니 결과값을 df에 적용하고 싶으면 inplace=True 꼭 해주기.

covid.plot(kind=’scatter’,x=’Population’,y=’Total Cases’)

6개의 국가들을 제거하고 다시 산점도 그래프를 그려보면 제거하지 않았을 때 그렸던 그래프보다 훨씬 보기 좋다.

산점도를 보니 점들이 일관성있진 않은 것 같다.

일관된 패턴 발견되지 않음. 인구가 많으면 그만큼 확진자 수도 많아지겠지만 꼭 그렇지만도 않은게 이번 분석의 결론..

<전체보기>

import pandas as pd %matplotlib inline covid=pd.read_csv(‘data/Latest Covid-19 Data in Asia.csv’) q1=covid[‘Population’].quantile(0.25) q3=covid[‘Population’].quantile(0.75) iqr=q3-q1 condition=covid[‘Population’]>q3+1.5*iqr a=covid[condition].index covid.drop(a,inplace=True) covid.plot(kind=’scatter’,x=’Population’,y=’Total Cases’)

파이썬으로 데이터 전처리 하기 / 결측치, 중복 데이터, 이상치, 정규화, 원-핫 인코딩, 구간화

728×90

이번 노드에서는 관세청 수출입 무역 통계 데이터를 사용하여 데이터 전처리를 진행하였다.

먼저 데이터를 준비한다.

아이펠에선 데이터를 제공 해 주기 때문에 나는 다운받기만 하면 되었다.

데이터를 가지고 무언가를 하기 전에 데이터의 대한 기본 정보 부터 알아야 한다.

해당 데이터에서 금액은 단위가 천 불(USD 1,000) 이며 무역수지는 ‘수출금액 – 수입금액’ 이다.

데이터 준비

> 결측치 (Missing Data) < 많은 데이터들은 결측치를 포함하고 있다. 결측치가 존재하는 데이터는 따로 처리를 해 주어야 한다. 결측치를 처리하는 방법은 두가지가 있다. 1. 결측치가 있는 데이터를 제거. 2.결측치를 다른 값으로 대체. 두 방법 중 데이터의 특성을 반영하여 적절한 방법을 선택하면 된다. 먼저 데이터에 결측치가 있는지 확인을 해야 한다. '전체 데이터 건수 - 각 컬럼 별 값이 있는 데이터 수'를 하면 컬럼 별 결측치 개수를 알 수 있다. 기타사항을 보면 전부 결측치이기 때문에 정보가 없는 칼럼이라 판단 후 삭제한다. trade = trade.drop('기타사항', axis=1) trade.head() 결측치가 있는 행을 확인하기 위해 DataFrame.isnull()을 사용한다. 이는 결측치 여부를 True, False로 반환한다. index 196,197,198은 기간, 국가명 제외 모두 결측값이기에 삭제해도 좋다. 기타사항 칼럼을 지우지 않은 데이터이다... 지우는 거 까먹은 듯... ㅠ index 191은 수출금액과 무역수지만 결측값이기에 이는 다른 값으로 대체가능하다. 이러한 수치형 데이터를 보완하는 방법은 4가지가 있다. 1. 특정 값을 지정하기. 2. 평균, 중앙값으로 대체하기. 3. 다른 데이터를 활용 해 예측 값으로 대체하기. 4. 앞뒤 데이터를 통해 결측치 대체하기. 해당 index 191은 앞뒤 데이터를 통해 값을 대체할 것이다. 수출금액은 이전 달과 다음 달의 평균으로, 무역수지는 수출금액과 수입금액의 차이를 이용하여 결측치를 대체한다. 마찬가지로 기타사항 칼럼을 삭제하지 않은 제대로 되지 않은 데이터이다... 위의 과정을 거치면 결측치였던 수출금액과 무역수지에 값을 채워넣게 된다. > 중복된 데이터 < 같은 값을 가진 데이터 없이 row 별로 유일한 값을 가지는 데이터가 되어야 한다면 중복된 데이터로 제거 해 주어야 한다. 위의 결측치처럼 먼저 중복된 데이터를 확인한다. index 186, 187에서 데이터가 중복된 것을 알 수 있다. DataFrame.drop_duplicates를 사용하여 중복된 데이터를 삭제할 수 있다. DataFrame.drop_duplicates의 subse, keep을 통해 중복을 제거 할 수 있다. > 이상치 (Outlier) < 대부분 값의 범위에서 벗어난, 극단적으로 크거나 작은 값을 이상치라고 한다. 극단적인 값이 생기는 경우를 제외하여 데이터를 고려할 때 이상치를 제거하고 분석해야 한다. - z score 방법 자주 사용되는 방법으로는 평균과 표준편차를 이용하는 'z score'방법이 있다. Z score = (x -mean) / std.deviation 평균을 빼고 표준편차로 나누어 계산을 했을 때 z score가 특정 기준을 넘어서는 데이터를 이상치라고 판단한다. 이상치를 판단한 후에는 이상치를 삭제, 다른 값으로 대체, 다른 데이터를 활용 해 예측값 사용, bining을 통해 수치형 데이터를 범주형으로 바꾸는 방법 등, 결측치와 마찬가지로 데이터의 특성에 맞는 방법으로 해결하면 된다. outlier : 이상치인 데이터의 인덱스를 반환하는 함수. input 으로는 데이터프레임(df), 칼럼(col), 기준(z)를 받는다. 데이터에서 평균을 빼 절댓값을 취한 것을 표준편차로 나누어 준다. 값이 z보다 큰 데이터의 인덱스를 반환한다. 무역수지의 이상치를 확인하는 기준이 되는 값이 커질수록 이상치가 적어지는 것을 볼 수 있다. z score 방법은 평균과 표준편차 자체가 이상치의 존재에 크게 영향을 받는다. 또 작은 데이터셋의 경우 이 방법으로 이상치를 알아내기 어렵다. 이러한 한계점을 가진 z score 방법의 대안으로 IQR(Interquartile range)로 이상치를 알아낼 수도 있다. - IQR method 사분위범위수 IQR(Interquartile range)를 사용하여 이상치를 찾을 수 있다. IQR = Q3 ​− Q1 ​IQR은 제 3사분위수에서 제 1사분위수를 뺀 값이다. 즉 데이터의 중간 50%의 범위이다. Q1​−1.5∗IQR보다 왼쪽에 있거나, Q_3 + 1.5*IQRQ3​+1.5∗IQR 보다 오른쪽에 있는 경우 우리는 이상치라고 판단한다. 아웃라이어가 포함된 임의의 데이터 제 1사분위수와 제 3사분위수를 구하여 이상치를 확인할 수 있다. > 정규화(Normalization) < 다시 관세청 수출입 무역 통계 데이터로 돌아와서, 수입 건수, 금액, 무역수지는 각각 단위가 다 다르다. 칼럼마다 스케일의 차이가 꽤 날 대는 머신러닝 모델 학습에서 문제가 생길 수도 있다. 때문에 칼럼 간 범위가 다를 때 전처리 과정에서 데이터를 정규화한다. 정규화 방법 중 가장 잘 알려진 표준화(Standardization)와 Min-Max-Scaling을 통해 전처리를 하였다. lms.aiffel.io - 표준화 (Standardization) 정규화를 시킬 수치형 칼럼들을 변수에 담은 후 데이터에서 평균을 빼고 표준 편차로 나누어 준다. standardization 방법으로 정규화시킨 데이터를 보면 각 칼럼들의 평균은 거의 0에 가까우며, 표준편차는 1에 가까운 것을 볼 수 있다. - Min-Max-Scaling 데이터에서 최소값을 빼고 '최대값 - 최소값'으로 나누어 준다. Min-Max Scaling 방법으로 정규화시킨 후, 각 컬럼의 최소값(min)은 0, 최대값(max)은 1인 것을 볼 수 있다. 데이터가 train 데이터와 test 데이터가 나누어져 있을 때는 train 데이터를 정규화시킨 기준 그대로 test 데이터도 정규화 시켜주어야 한다. scikit-learn에서 제공하는 StandardScaler, MinMaxScaler를 사용하는 방법도 있다. 로그 변환 등의 기법도 정규화화 함게 사용하면 도움이 되기도 한다. > 원-핫 인코딩 (One-Hot Encoding) < 원-핫 인코딩은 카테고리별 이진 특성을 만들어 해당 특성을 1, 나머진 모두 0으로 만드는 것이다. 머신러닝과 딥러닝의 프레임워크에서 범주형을 지원하지 않으면 원-핫 인코딩을 해야한다. get_dummies 함수를 사용하면 쉽게 원-핫 인코딩을 할 수 있다. pd.concat 함수로 trade와 country를 합친 후 필요 없는 국가명 칼럼을 삭제하면 원하는 데이터 프레임이 된다. > 구간화 (Binning) < 데이터를 구간 별로 나눌 때 사용하는 기법을 구간화라고 한다. 연속적인 데이터(ex. 히스토그램)를 구간을 나누어서 분석할 때 주로 사용한다. pandas의 cut과 qcut을 사용하여 수치형 데이터를 범주형 데이터로 변형 시킨다. cut을 사용하기 전 구간을 먼저 정해야 하며, cut 함수에 데이터와 나눈 구간을 입력하면 데이터를 정한 구간별로 나눈다. qcut은 데이터의 분포를 비슷한 크기의 그룹으로 나눈다. 위의 과정들을 모든 데이터에 대해 적용하는 것은 아니다. 데이터 전처리는 데이터의 특성에 맞게 해주어야 한다. 728x90

키워드에 대한 정보 이상치 제거 python

다음은 Bing에서 이상치 제거 python 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.

이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!

사람들이 주제에 대해 자주 검색하는 키워드 [빅데이터 분석기사 실기 – Pandas 31] 이상치(outlier) 확인 및 해결방법

  • eduatoz
  • 빅데이터 분석기사 실기
  • pandas
[빅데이터 #분석기사 #실기 #- #Pandas #31] #이상치(outlier) #확인 #및 #해결방법


YouTube에서 이상치 제거 python 주제의 다른 동영상 보기

주제에 대한 기사를 시청해 주셔서 감사합니다 [빅데이터 분석기사 실기 – Pandas 31] 이상치(outlier) 확인 및 해결방법 | 이상치 제거 python, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.

Leave a Comment