Python으로 데이터 정리 기술 익히기 - KDnuggets

Python으로 데이터 정리 기술 익히기 – KDnuggets

소스 노드 : 2939047

Python으로 데이터 정리 기술 익히기
작성자 별 이미지
 

데이터 정리는 모든 데이터 분석 프로세스에서 중요한 부분입니다. 오류를 제거하고, 누락된 데이터를 처리하고, 데이터가 작업 가능한 형식인지 확인하는 단계입니다. 잘 정리된 데이터 세트가 없으면 후속 분석이 왜곡되거나 부정확할 수 있습니다.

이 기사에서는 pandas, numpy, seaborn 및 matplotlib와 같은 강력한 라이브러리를 사용하여 Python에서 데이터 정리를 위한 몇 가지 주요 기술을 소개합니다.

데이터 정리 메커니즘에 대해 알아보기 전에 그 중요성을 이해해 보겠습니다. 실제 데이터는 종종 지저분합니다. 여기에는 중복된 항목, 부정확하거나 일관되지 않은 데이터 유형, 누락된 값, 관련 없는 기능 및 이상값이 포함될 수 있습니다. 이러한 모든 요인은 데이터를 분석할 때 잘못된 결론을 초래할 수 있습니다. 이로 인해 데이터 정리는 데이터 과학 수명주기에서 없어서는 안 될 부분입니다.

다음 데이터 정리 작업을 다루겠습니다.
 

Python으로 데이터 정리 기술 익히기
작성자 별 이미지

시작하기 전에 필요한 라이브러리를 가져와 보겠습니다. 우리는 데이터 조작을 위해 pandas를 사용하고 시각화를 위해 seaborn과 matplotlib를 사용할 것입니다.

또한 날짜를 조작하기 위해 datetime Python 모듈을 가져옵니다.

import pandas as pd
import seaborn as sns
import datetime as dt
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker

먼저 데이터를 로드해야 합니다. 이 예에서는 pandas를 사용하여 CSV 파일을 로드하겠습니다. 또한 구분 기호 인수도 추가합니다.

df = pd.read_csv('F:KDNuggetsKDN Mastering the Art of Data Cleaning in Pythonproperty.csv', delimiter= ';')

다음으로 데이터를 검사하여 구조, 작업 중인 변수의 종류, 누락된 값이 있는지 여부를 이해하는 것이 중요합니다. 가져온 데이터가 크지 않기 때문에 전체 데이터세트를 살펴보겠습니다.

# Look at all the rows of the dataframe
display(df)

데이터 세트의 모양은 다음과 같습니다.

 

Python으로 데이터 정리 기술 익히기
 

일부 누락된 값이 있음을 즉시 확인할 수 있습니다. 또한 날짜 형식이 일관되지 않습니다.

이제 info() 메서드를 사용하여 DataFrame 요약을 살펴보겠습니다.

# Get a concise summary of the dataframe
print(df.info())

다음은 코드 출력입니다.

 

Python으로 데이터 정리 기술 익히기
 

square_feet 열에만 NULL 값이 없다는 것을 알 수 있으므로 어떻게든 이를 처리해야 합니다. 또한 광고_날짜 및 판매_날짜 열은 날짜여야 하지만 객체 데이터 유형입니다.

열 위치가 완전히 비어 있습니다. 우리는 그것이 필요합니까?

이러한 문제를 처리하는 방법을 알려 드리겠습니다. 불필요한 열을 삭제하는 방법부터 알아보겠습니다.

데이터세트에는 데이터 분석에 필요하지 않은 두 개의 열이 있으므로 이를 제거하겠습니다.

첫 번째 열은 구매자입니다. 구매자의 이름은 분석에 영향을 미치지 않으므로 필요하지 않습니다.

지정된 열 이름과 함께 drop() 메서드를 사용하고 있습니다. 열을 삭제하도록 지정하기 위해 축을 1로 설정합니다. 또한 inplace 인수가 True로 설정되어 기존 DataFrame을 수정하고 제거된 열 없이는 새 DataFrame을 생성하지 않습니다.

df.drop('buyer', axis = 1, inplace = True)

제거하려는 두 번째 열은 위치입니다. 이 정보가 있으면 유용할 수 있지만 완전히 비어 있는 열이므로 그냥 제거하겠습니다.

우리는 첫 번째 열과 동일한 접근 방식을 취합니다.

df.drop('location', axis = 1, inplace = True)

물론 이 두 열을 동시에 제거할 수도 있습니다.

df = df.drop(['buyer', 'location'], axis=1)

두 접근 방식 모두 다음 데이터 프레임을 반환합니다.

 

Python으로 데이터 정리 기술 익히기

다양한 이유로 데이터 세트에 중복 데이터가 발생할 수 있으며 분석이 왜곡될 수 있습니다.

데이터 세트에서 중복 항목을 감지해 보겠습니다. 방법은 다음과 같습니다.

아래 코드는 메소드를 사용합니다 중복() 전체 데이터 세트에서 중복을 고려합니다. 기본 설정은 값의 첫 번째 발생을 고유한 것으로 간주하고 후속 발생을 중복으로 간주하는 것입니다. 다음을 사용하여 이 동작을 수정할 수 있습니다. 유지 매개변수. 예를 들어 df.duplicated(keep=False)는 첫 번째 발생을 포함하여 모든 중복을 True로 표시합니다.

# Detecting duplicates
duplicates = df[df.duplicated()]
duplicates

결과는 다음과 같습니다.

 

Python으로 데이터 정리 기술 익히기
 

동일한 값을 가진 행 3가 처음 발생했기 때문에 인덱스 2이 있는 행은 중복으로 표시되었습니다.

이제 다음 코드를 사용하여 중복 항목을 제거해야 합니다.

# Detecting duplicates
duplicates = df[df.duplicated()]
duplicates

XNUMXD덴탈의 drop_duplicates() 함수는 중복 항목을 식별하는 동안 모든 열을 고려합니다. 특정 열만 고려하려면 df.drop_duplicates(subset=['column1', 'column2'])와 같이 해당 열을 이 함수에 목록으로 전달할 수 있습니다.

 

Python으로 데이터 정리 기술 익히기
 

보시다시피 중복 행이 삭제되었습니다. 그러나 인덱싱은 동일하게 유지되었으며 인덱스 3이 누락되었습니다. 인덱스를 재설정하여 이를 정리하겠습니다.

df = df.reset_index(drop=True)

이 작업은 다음을 사용하여 수행됩니다. 리셋_인덱스() 기능. drop=True 인수는 원래 인덱스를 삭제하는 데 사용됩니다. 이 인수를 포함하지 않으면 이전 인덱스가 DataFrame에 새 열로 추가됩니다. drop=True를 설정하면 팬더에게 이전 인덱스를 잊어버리고 기본 정수 인덱스로 재설정하도록 지시하는 것입니다.

연습을 위해 다음을 시도하십시오. 이 Microsoft 데이터세트에서 중복 항목을 제거하세요..

경우에 따라 데이터 유형이 잘못 설정될 수 있습니다. 예를 들어 날짜 열은 문자열로 해석될 수 있습니다. 이를 적절한 유형으로 변환해야 합니다.

데이터세트에서는 개체 데이터 유형으로 표시되는 광고_날짜 및 판매_날짜 열에 대해 해당 작업을 수행합니다. 또한 날짜 날짜는 행마다 다르게 형식화됩니다. 이를 날짜로 변환하는 동시에 일관성을 유지해야 합니다.

가장 쉬운 방법은 to_datetime() 방법. 이번에도 아래와 같이 열별로 작업을 수행할 수 있습니다.

그렇게 할 때 일부 날짜는 첫 번째 날부터 시작하기 때문에 dayfirst 인수를 True로 설정합니다.

# Converting advertisement_date column to datetime
df['advertisement_date'] = pd.to_datetime(df['advertisement_date'], dayfirst = True) # Converting sale_date column to datetime
df['sale_date'] = pd.to_datetime(df['sale_date'], dayfirst = True)

다음을 사용하여 두 열을 동시에 변환할 수도 있습니다. 대다() 방법 to_datetime().

# Converting advertisement_date and sale_date columns to datetime
df[['advertisement_date', 'sale_date']] = df[['advertisement_date', 'sale_date']].apply(pd.to_datetime, dayfirst = True)

두 접근 방식 모두 동일한 결과를 제공합니다.

 

Python으로 데이터 정리 기술 익히기
 

이제 날짜는 일관된 형식으로 표시됩니다. 모든 데이터가 변환되지는 않았음을 알 수 있습니다. Advertising_date에는 하나의 NaT 값이 있고 sale_date에는 두 개의 NaT 값이 있습니다. 이는 날짜가 누락되었음을 의미합니다.

다음을 사용하여 열이 날짜로 변환되었는지 확인해 보겠습니다. 정보 () 방법.

# Get a concise summary of the dataframe
print(df.info())

 

Python으로 데이터 정리 기술 익히기
 

보시다시피 두 열 모두 datetime64[ns] 형식이 아닙니다.

이제 이 텍스트에서 데이터를 TEXT에서 NUMERIC으로 변환해 보세요. 에어비앤비 데이터세트.

실제 데이터 세트에는 누락된 값이 있는 경우가 많습니다. 특정 알고리즘은 그러한 값을 처리할 수 없기 때문에 누락된 데이터를 처리하는 것이 중요합니다.

우리의 예에는 누락된 값도 있으므로 누락된 데이터를 처리하는 가장 일반적인 두 가지 접근 방식을 살펴보겠습니다.

누락된 값이 있는 행 삭제

누락된 데이터가 있는 행 수가 총 관측치 수에 비해 중요하지 않은 경우 해당 행을 삭제하는 것을 고려할 수 있습니다.

이 예에서 마지막 행에는 평방 피트와 광고 날짜 외에는 값이 없습니다. 이러한 데이터는 사용할 수 없으므로 이 행을 삭제하겠습니다.

행의 인덱스를 나타내는 코드는 다음과 같습니다.

df = df.drop(8)

이제 DataFrame은 다음과 같습니다.

 

Python으로 데이터 정리 기술 익히기
 

마지막 행이 삭제되었으며 이제 DataFrame이 더 좋아 보입니다. 그러나 다른 접근 방식을 사용하여 처리할 일부 누락된 데이터가 여전히 있습니다.

누락된 값 대치

상당한 양의 누락된 데이터가 있는 경우 삭제보다 더 나은 전략은 전가일 수 있습니다. 이 프로세스에는 다른 데이터를 기반으로 누락된 값을 채우는 작업이 포함됩니다. 수치 데이터의 경우 일반적인 대치 방법에는 중심 경향(평균, 중앙값, 모드) 측정값을 사용하는 것이 포함됩니다.

이미 변경된 DataFrame의 광고_날짜 및 판매_날짜 열에 NaT(시간 아님) 값이 있습니다. 우리는 다음을 사용하여 이러한 누락된 값을 대치할 것입니다. 평균() 방법.

코드는 다음을 사용합니다. 필나() null 값을 찾아 평균값으로 채우는 방법입니다.

# Imputing values for numerical columns
df['advertisement_date'] = df['advertisement_date'].fillna(df['advertisement_date'].mean())
df['sale_date'] = df['sale_date'].fillna(df['sale_date'].mean())

한 줄의 코드로 동일한 작업을 수행할 수도 있습니다. 우리는 대다() 다음을 사용하여 정의된 함수를 적용하려면 람다. 위와 동일하게 이 함수는 필나()평균() 누락된 값을 채우는 방법.

# Imputing values for multiple numerical columns
df[['advertisement_date', 'sale_date']] = df[['advertisement_date', 'sale_date']].apply(lambda x: x.fillna(x.mean()))

두 경우 모두 출력은 다음과 같습니다.

 

Python으로 데이터 정리 기술 익히기
 

이제 sale_date 열에 필요하지 않은 시간이 있습니다. 제거해 보겠습니다.

우리는 strftime () 날짜를 문자열 표현과 특정 형식으로 변환하는 메서드입니다.

df['sale_date'] = df['sale_date'].dt.strftime('%Y-%m-%d')

 

Python으로 데이터 정리 기술 익히기
 

이제 날짜가 모두 깔끔하게 보입니다.

사용해야하는 경우 strftime () 여러 열에서 다시 사용할 수 있습니다 람다 다음 방법.

df[['date1_formatted', 'date2_formatted']] = df[['date1', 'date2']].apply(lambda x: x.dt.strftime('%Y-%m-%d'))

이제 누락된 범주형 값을 어떻게 귀속시킬 수 있는지 살펴보겠습니다.

범주형 데이터는 유사한 특성을 가진 정보를 그룹화하는 데 사용되는 데이터 유형입니다. 이러한 각 그룹은 카테고리입니다. 범주형 데이터는 숫자 값(예: "남성"을 나타내는 "1", "여성"을 나타내는 "2")을 가질 수 있지만 이러한 숫자는 수학적 의미를 갖지 않습니다. 예를 들어, 함께 추가할 수는 없습니다.

범주형 데이터는 일반적으로 두 가지 범주로 나뉩니다.

  1. 공칭 데이터: 카테고리에 라벨만 지정되어 특정 순서로 정렬할 수 없는 경우입니다. 예를 들어 성별(남성, 여성), 혈액형(A, B, AB, O) 또는 색상(빨간색, 녹색, 파란색)이 있습니다.
  1. 순서 데이터: 이때 카테고리를 정렬하거나 순위를 매길 수 있습니다. 카테고리 사이의 간격은 동일하지 않지만 카테고리의 순서에는 의미가 있습니다. 예를 들어 등급 척도(영화 등급 1~5), 교육 수준(고등학교, 학부, 대학원) 또는 암 단계(XNUMX기, XNUMX기, XNUMX기) 등이 있습니다.

누락된 범주형 데이터를 대치하기 위해 일반적으로 모드가 사용됩니다. 이 예에서 property_category 열은 범주형(명목) 데이터이고 두 행에 데이터가 누락되어 있습니다.

누락된 값을 모드로 바꾸겠습니다.

# For categorical columns
df['property_category'] = df['property_category'].fillna(df['property_category'].mode()[0])

이 코드는 필나() property_category 열의 모든 NaN 값을 바꾸는 함수입니다. 모드로 대체됩니다.

또한 [0] 부분은 이 시리즈에서 첫 번째 값을 추출하는 데 사용됩니다. 모드가 여러 개인 경우 첫 번째 모드가 선택됩니다. 모드가 하나만 있어도 여전히 잘 작동합니다.

결과는 다음과 같습니다.

 

Python으로 데이터 정리 기술 익히기
 

이제 데이터가 꽤 좋아 보입니다. 이제 남은 유일한 것은 이상값이 있는지 확인하는 것입니다.

이것에 대해 null 처리를 연습할 수 있습니다. 메타 인터뷰 질문, 여기서 NULL을 XNUMX으로 바꿔야 합니다.

이상치는 다른 관측치와 뚜렷하게 다른 데이터 세트의 데이터 포인트입니다. 이는 전체 패턴 외부에 위치하여 데이터 세트의 다른 값과 예외적으로 멀리 있을 수 있습니다. 이는 나머지 데이터에 비해 값이 상당히 높거나 낮기 때문에 비정상적인 것으로 간주됩니다.

이상값은 다음과 같은 다양한 이유로 발생할 수 있습니다.

  • 측정 또는 입력 오류
  • 데이터 손상
  • 실제 통계적 이상

이상값은 데이터 분석 및 통계 모델링 결과에 큰 영향을 미칠 수 있습니다. 이는 왜곡된 분포, 편향으로 이어지거나 기본 통계적 가정을 무효화하고, 추정된 모델 적합성을 왜곡하고, ​​예측 모델의 예측 정확도를 감소시키고, 잘못된 결론으로 ​​이어질 수 있습니다.

이상치를 탐지하기 위해 일반적으로 사용되는 방법으로는 Z-점수, IQR(사분위수 범위), 상자 그림, 산점도 및 데이터 시각화 기술이 있습니다. 일부 고급 사례에서는 기계 학습 방법도 사용됩니다.

데이터를 시각화하면 이상값을 식별하는 데 도움이 될 수 있습니다. Seaborn의 상자 그림은 이를 위해 편리합니다.

plt.figure(figsize=(10, 6))
sns.boxplot(data=df[['advertised_price', 'sale_price']])

plt.Figure()를 사용하여 그림의 너비와 높이를 인치 단위로 설정합니다.

그런 다음 Advertising_price 및 sale_price 열에 대한 상자 그림을 만듭니다. 이는 다음과 같습니다.

 

Python으로 데이터 정리 기술 익히기
 

위의 코드에 이를 추가하면 플롯을 더 쉽게 사용할 수 있도록 개선할 수 있습니다.

plt.xlabel('Prices')
plt.ylabel('USD')
plt.ticklabel_format(style='plain', axis='y')
formatter = ticker.FuncFormatter(lambda x, p: format(x, ',.2f'))
plt.gca().yaxis.set_major_formatter(formatter)

위의 코드를 사용하여 두 축의 레이블을 설정합니다. 또한 y축의 값은 과학적 표기법을 따르므로 이를 가격 값에 사용할 수 없습니다. 따라서 plt.ticklabel_format() 함수를 사용하여 이를 일반 스타일로 변경합니다.

그런 다음 쉼표를 천 단위 구분 기호 및 소수점으로 사용하여 y축의 값을 표시하는 포맷터를 만듭니다. 마지막 코드 줄은 이를 축에 적용합니다.

이제 출력은 다음과 같습니다.

 

Python으로 데이터 정리 기술 익히기
 

이제 이상값을 어떻게 식별하고 제거합니까?

그 중 하나는 IQR 방법을 사용하는 것입니다.

IQR(사분위간 범위)은 데이터 세트를 사분위수로 나누어 변동성을 측정하는 데 사용되는 통계 방법입니다. 사분위수는 순위가 지정된 데이터 세트를 25개의 동일한 부분으로 나누고, 첫 번째 사분위수(75번째 백분위수)와 세 번째 사분위수(XNUMX번째 백분위수) 범위 내의 값이 사분위간 범위를 구성합니다.

사분위간 범위는 데이터의 이상값을 식별하는 데 사용됩니다. 작동 방식은 다음과 같습니다.

  1. 먼저 첫 번째 사분위수(Q1)와 세 번째 사분위수(Q3)를 계산한 다음 IQR을 결정합니다. IQR은 Q3 – Q1로 계산됩니다.
  2. Q1 – 1.5IQR보다 낮거나 Q3 + 1.5IQR보다 높은 값은 이상값으로 간주됩니다.

상자 그림에서 상자는 실제로 IQR을 나타냅니다. 상자 안의 선은 중앙값(또는 1.5분위수)입니다. 상자 그림의 '수염'은 Q1과 Q3의 XNUMX*IQR 이내 범위를 나타냅니다.

이러한 수염 외부의 모든 데이터 포인트는 이상값으로 간주될 수 있습니다. 우리의 경우에는 $12,000,000의 가치가 있습니다. 상자 그림을 보면 이것이 얼마나 명확하게 표현되는지 확인할 수 있으며, 이는 이상값을 탐지하는 데 데이터 시각화가 중요한 이유를 보여줍니다.

이제 Python 코드에서 IQR 메서드를 사용하여 이상값을 제거해 보겠습니다. 먼저, 광고된 가격 이상치를 제거하겠습니다.

Q1 = df['advertised_price'].quantile(0.25)
Q3 = df['advertised_price'].quantile(0.75)
IQR = Q3 - Q1
df = df[~((df['advertised_price'] (Q1 - 1.5 * IQR)) |(df['advertised_price'] > (Q3 + 1.5 * IQR)))]

먼저 다음을 사용하여 첫 번째 사분위수(또는 25번째 백분위수)를 계산합니다. 분위수() 기능. 75분위수나 XNUMX번째 백분위수에 대해서도 동일한 작업을 수행합니다.

이는 각각 데이터의 25%와 75%가 해당 미만인 값을 보여줍니다.

그런 다음 사분위수 간의 차이를 계산합니다. 지금까지의 모든 것은 IQR 단계를 Python 코드로 변환하는 것뿐입니다.

마지막 단계로 이상값을 제거합니다. 즉, Q1 – 1.5 * IQR보다 작거나 Q3 + 1.5 * IQR보다 큰 모든 데이터입니다.

'~' 연산자는 조건을 부정하므로 이상값이 아닌 데이터만 남습니다.

그런 다음 판매 가격에 대해서도 동일한 작업을 수행할 수 있습니다.

Q1 = df['sale_price'].quantile(0.25)
Q3 = df['sale_price'].quantile(0.75)
IQR = Q3 - Q1
df = df[~((df['sale_price'] (Q1 - 1.5 * IQR)) |(df['sale_price'] > (Q3 + 1.5 * IQR)))]

물론, 다음을 사용하면 더 간결한 방법으로 이를 수행할 수 있습니다. for 루프.

for column in ['advertised_price', 'sale_price']: Q1 = df[column].quantile(0.25) Q3 = df[column].quantile(0.75) IQR = Q3 - Q1 df = df[~((df[column] (Q1 - 1.5 * IQR)) |(df[column] > (Q3 + 1.5 * IQR)))]

루프는 두 열을 반복합니다. 각 열에 대해 IQR을 계산한 다음 DataFrame에서 행을 제거합니다.

이 작업은 먼저 Advertising_price에 대해 다음으로 sale_price에 대해 순차적으로 수행됩니다. 결과적으로 DataFrame은 각 열의 내부에서 수정되고 두 열의 이상값으로 인해 행이 제거될 수 있습니다. 따라서 이 작업을 수행하면 Advertising_price 및 sale_price에 대한 이상값을 독립적으로 제거하고 나중에 결과를 결합한 경우보다 더 적은 수의 행이 생성될 수 있습니다.

이 예에서는 두 경우 모두 출력이 동일합니다. 상자 그림이 어떻게 변경되었는지 확인하려면 이전과 동일한 코드를 사용하여 상자 그림을 다시 그려야 합니다.

plt.figure(figsize=(10, 6))
sns.boxplot(data=df[['advertised_price', 'sale_price']])
plt.xlabel('Prices')
plt.ylabel('USD')
plt.ticklabel_format(style='plain', axis='y')
formatter = ticker.FuncFormatter(lambda x, p: format(x, ',.2f'))
plt.gca().yaxis.set_major_formatter(formatter)

결과는 다음과 같습니다.

 

Python으로 데이터 정리 기술 익히기
 

Python에서 백분위수 계산을 연습할 수 있습니다. 총회 면접 질문.

데이터 정리는 데이터 분석 프로세스에서 중요한 단계입니다. 시간이 많이 걸릴 수 있지만 결과의 정확성을 보장하는 것이 중요합니다.

다행스럽게도 Python의 풍부한 라이브러리 생태계 덕분에 이 프로세스를 보다 쉽게 ​​관리할 수 있습니다. 불필요한 행과 열을 제거하고, 데이터 형식을 다시 지정하고, 누락된 값과 이상값을 처리하는 방법을 배웠습니다. 이는 대부분의 데이터에 대해 수행해야 하는 일반적인 단계입니다. 그러나 때로는 다음과 같은 작업이 필요할 수도 있습니다. 두 개의 열을 하나로 결합, 기존 데이터 확인, 라벨을 할당하세요공백을 제거.

이 모든 것이 데이터 정리입니다. 이를 통해 지저분한 실제 데이터를 자신 있게 분석할 수 있는 잘 구조화된 데이터 세트로 바꿀 수 있습니다. 우리가 시작한 데이터세트와 최종적으로 얻은 데이터세트를 비교해 보세요.

이 결과에 만족감도 없고 깨끗한 데이터가 이상하게 흥분되지 않는다면 도대체 데이터 사이언스에서 뭐하고 있는 겁니까!?
 

네이트 로시디 데이터 과학자이자 제품 전략 분야의 전문가입니다. 그는 분석을 가르치는 겸임 교수이기도 하며, 스트라타스크래치, 데이터 사이언티스트가 상위 기업의 실제 인터뷰 질문을 통해 인터뷰를 준비하는 데 도움이 되는 플랫폼입니다. 그와 연결 트위터: StrataScratch or 링크드인.

타임 스탬프 :

더보기 너 겟츠