정확성 (Accuracy): 데이터가 정확해야 함

 

1. beer.csv

 

%matplotlib inline
import pandas as pd

df = pd.read_csv('data/beer.csv', index_col=0)
df.head()
df.plot(kind='box', y='abv')

 

박스플롯을 생성해본 결과

이상점이 3개가 보인다.

 

 

'abv'의 Q1(25%) Q3(75%)지점을 구해본다.

 

describe() 

- 수치형 변수들의 통계량을 보여준다.

df['abv'].describe()
count    2190.000000
mean        0.060186
std         0.117010
min         0.032000
25%         0.050000
50%         0.055000
75%         0.065000
max         5.500000
Name: abv, dtype: float64

 

 

# Q1 = 25%
df['abv'].quantile(0.25)
0.05

 

# Q3 = 75%
df['abv'].quantile(0.75)
0.065
q1 = df['abv'].quantile(0.25)
q3 = df['abv'].quantile(0.75)
iqr = q3 - q1

 

 

25% 지점보다 밑에 있거나,

75% 지점보다 위에 있다면

이상점이다.

condition = (df['abv'] < q1 - 1.5 * iqr) | (df['abv'] > q3 + 1.5 * iqr)
df[condition]

 

위의 박스플롯에서 보였던 이상점 3개가 출력되었다.

2250인덱스의 abv값은 입력실수 이므로 데이터를 수정해준다.

 

이상값 데이터 수정

df.loc[2250,'abv'] = 0.055
df.loc[2250]
abv                             0.055
ibu                              40.0
id                                145
name              Silverback Pale Ale
style         American Pale Ale (APA)
brewery_id                        424
ounces                           12.0
Name: 2250, dtype: object

 

 

이상점을 다시 출력해보면

condition = (df['abv'] < q1 - 1.5 * iqr) | (df['abv'] > q3 + 1.5 * iqr)
df[condition]

 

2개로 줄었음을 알 수있다.

남은 2개의 이상점은 맥주가 아닌 것들이 잘못입력된것으로 보인다.

따라서 삭제하도록 한다.

 

 

이상점의 인덱스를 출력

df[condition].index
Index([963, 1856], dtype='int64')

 

 

이상점 삭제

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

 

 

이상점을 다시 확인해본다.

condition = (df['abv'] < q1 - 1.5 * iqr) | (df['abv'] > q3 + 1.5 * iqr)
df[condition]

 

이상점이 출력되지 않는다.

 

박스플롯 생성

df.plot(kind='box', y='abv')




2. exam_outlier.csv

df = pd.read_csv('data/exam_outlier.csv')
df

 

 

산점도 출력

df.plot(kind='scatter', x='reading score', y='writing score')

 

 

학생들의 읽기 점수와 쓰기 점수가 어떤 연관성이 있는지 확인해보았다.

700에 있는 이상점이 하나있다.

 

 

상관계수 출력

df.corr(numeric_only=True)

 

이상점 찾기

df['writing score'] > 100
0      False
1      False
2      False
3      False
4      False
       ...  
995    False
996    False
997    False
998    False
999    False
Name: writing score, Length: 1000, dtype: bool

 

쓰기 점수를 인덱싱해본다.

df[df['writing score'] > 100]

 

51번째 인덱스가 이상점이다.

 

이상점 제거

df.drop(51, inplace=True)
df.plot(kind='scatter', x='reading score', y='writing score')

 

상관계수 출력

 

읽기와 쓰기의 상관계수가

0.58 -> 0.94로 올라갔다.

하지만 그래프를 보면 하나의 점이 동 떨어져 있는 것을 알 수있다.

 

# 쓰기는 90이 넘고 앍가눈 40이 안넘는 학생
condition = (df['writing score'] > 90) & (df['reading score'] < 40)
df[condition]

 

이상점 제거

df.drop(373, inplace=True)
df

 

df.plot(kind='scatter', x='reading score', y='writing score')

 

그래프는 오른쪽위로 일직선에 가까움을 볼 수있다.

따라서 양의 상관관계이다.

 

상관관계를 출력해보면

df.corr(numeric_only=True)

 

읽기와 쓰기는 0.95로 1에 매우 가까워 강한 양의 상관관계를 알 수있다.

 

'데이터 분석 > Data_cleansing' 카테고리의 다른 글

데이터 클리닝(유일성)  (0) 2024.06.04
데이터 클리닝(완결성)  (0) 2024.06.04
데이터 정제  (0) 2024.06.04

유일성 (Uniqueness): 동일한 데이터가 불필요하게 중복되어 있으면 안됨

 

import pandas as pd

df = pd.read_csv('data/dust.csv', index_col=0)
df.head()

 

중복되는 row가 존재한다.

 

날짜를 출력해서 정확하게 확인을 다시한다.

날짜는 index이므로 index로 출력한다.

df.index
Index(['08월 11일', '08월 10일', '08월 09일', '08월 08일', '08월 07일', '08월 06일',
       '08월 05일', '08월 04일', '08월 03일', '08월 02일', '08월 01일', '07월 31일',
       '07월 31일', '07월 30일', '07월 29일', '07월 28일', '07월 27일', '07월 26일',
       '07월 25일', '07월 24일', '07월 23일', '07월 22일', '07월 21일', '07월 20일',
       '07월 19일', '07월 18일', '07월 17일', '07월 16일', '07월 15일', '07월 14일',
       '07월 13일'],
      dtype='object', name='날짜')

 

인덱스의 개수를 출력

df.index.value_counts()
날짜
07월 31일    2
08월 11일    1
07월 26일    1
07월 14일    1
07월 15일    1
07월 16일    1
07월 17일    1
07월 18일    1
07월 19일    1
07월 20일    1
07월 21일    1
07월 22일    1
07월 23일    1
07월 24일    1
07월 25일    1
07월 27일    1
08월 10일    1
07월 28일    1
07월 29일    1
07월 30일    1
08월 01일    1
08월 02일    1
08월 03일    1
08월 04일    1
08월 05일    1
08월 06일    1
08월 07일    1
08월 08일    1
08월 09일    1
07월 13일    1
Name: count, dtype: int64

 

인덱스의 개수를 출력해보니

7월 31일의 row만 2개임을 알 수있다.

 

 

7월 31일의 값들을 출력해본다.

df.loc['07월 31일']

모든 컬럼의 값이 일치한다.

 

중복되는 row삭제

df.drop_duplicates() 

- 중복된 row를 삭제한다.

 

기존 데이터에 중복row 없앤 데이터프레임을 덮어씌우려면 inplace=True 작성

 

df.drop_duplicates()
df.drop_duplicates(inplace=True)
df

 

중복된 row가 삭제되었다.

 


 

중복되는 columns찾기

만약 두 컬럼이 완전한 동일한 데이터를 갖고있다면 하나는 삭제해도 된다.

 

row와 컬럼 위치 변경

df.T

df.T

 

'강원'과 '강원.1'의 데이터 값이 동일하다.

df.T.drop_duplicates()

 

 

'강원'과 '강원.1'의 데이터 값이 동일하여 삭제되었다.

그리고 데이터를 다시 로우와 컬럼 위치를 변경시켜준다.

 

df = df.T.drop_duplicates().T
df

'데이터 분석 > Data_cleansing' 카테고리의 다른 글

데이터 클리닝(정확성)  (0) 2024.06.04
데이터 클리닝(완결성)  (0) 2024.06.04
데이터 정제  (0) 2024.06.04

[코드잇] 데이터클리닝 attendance.csv

 

완결성 (Completeness): 필수적인 데이터는 모두 기록되어 있어야함, 결측값이 처리

 

df = pd.read_csv('data/attendance.csv', index_col=0)
df

 

isnull() : 결측값을 True로 반환

결측값이 있는 위치 찾기

결측값이 있는 위치만 True반환

df.isnull()

 

결측값의 개수 세기

df.isnull().sum()

배구 컬럼에만 결측값이 3개가 있음을 알 수 있다.

 

결측값 해결방법

1.  그대로 두기
2. 결측값 레코드 지우기 dropna()

 

 

결측값 레코드 지우기

df.dropna()

 

배구에 결측값이 사라졌다.

결측값을 없앤 데이터프레임을 기존의 데이터에 덮어씌우려면 inplace=True를 작성해줘야 한다.

 

df.dropna(inplace=True)
df

 

기존데이터에서 2010, 2012, 2013년 데이터가 완전히 사라졌음을 알 수있다.


 

결측값이 많은 컬럼의 데이터만 포기하기

df = pd.read_csv('data/attendance.csv', index_col=0)
df

 

결측값이 있는 배구컬럼을 삭제한다.

 

기본값은 axis=0 이다.

 

axis=0(index)

- 행 방향 기준

 

axis=1(columns)

-열 방향 기준

 

둘 다 같은 결과 출력

df.dropna(axis=1)
df.dropna(axis='columns')

 

배구 컬럼이 제거되었다.

 


현재 가진 데이터를 보존하기 : 결측값 대체하기

1. df.fillna(0) : 0으로 채우기

2. df.fillna(df.mean()) : 평균으로 채우기

3. df.fillna(df.median()) : 중앙값으로 채우기

★기존 데이터를 변경하려면 inplace=True

 

 

결측값을 0으로 채우기

df.fillna(0)

 

 

결측값을 평균으로 채우기

df.fillna(df.mean())

 

결측값을 중앙값으로 채우기

df.fillna(df.median())

'데이터 분석 > Data_cleansing' 카테고리의 다른 글

데이터 클리닝(정확성)  (0) 2024.06.04
데이터 클리닝(유일성)  (0) 2024.06.04
데이터 정제  (0) 2024.06.04

완결성 (Completeness): 필수적인 데이터는 모두 기록되어 있어야함, 결측값이 처리
유일성 (Uniqueness): 동일한 데이터가 불필요하게 중복되어 있으면 안됨
통일성 (Conformity): 데이터가 동일한 형식으로 저장되어 있어야 함
정확성 (Accuracy): 데이터가 정확해야 함

 

결측값

  • 없는것이 제일 좋다
  • 자주 발생한다면 원인을 파악해야 한다.

 

이상점 (Outlier) : 다른 값들과 너무 동떨어져 있는 데이터

이상점을 판단하는 기준

 

boxplot : 25%, 75% 지점에서 1.5 * IQR 넘게 밑으로 떨어지면 이상점

 

이상점이 제대로 된 데이터

  • 분석에 방해가 되면 제거
  • 의미있는 정보라면 그냥 두기

관계적 이상점 (Realational Outlier) : 두 변수의 관계를 고려했을 때 이상한 데이터

'데이터 분석 > Data_cleansing' 카테고리의 다른 글

데이터 클리닝(정확성)  (0) 2024.06.04
데이터 클리닝(유일성)  (0) 2024.06.04
데이터 클리닝(완결성)  (0) 2024.06.04