[Machine Learning] 03-2. 데이터 결측치 시각화

Jihyeon Park·2024년 9월 16일

Machine Learning

목록 보기
5/5

seaborn

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
import seaborn as sns

train = pd.read_csv('train.csv') # 모델 훈련
test = pd.read_csv('test.csv') # 모델 검증

plt.style.use('ggplot') # 격자 추가할 용도 주석 처리해도 무관
sns.set() 
sns.set_palette("Set2")

def chart(dataset, feature):
    Survived = dataset[dataset['Survived'] == 1][feature].value_counts() 
    NSurvived = dataset[dataset['Survived'] == 0][feature].value_counts() 
    df = pd.DataFrame([Survived, NSurvived])
    df.index = ['Survived','dead']
    df.plot(kind='bar', stacked=True)

#1~3등석별 생존자 
chart(train, 'Pclass') 
plt.show()

#성별 생존자 
chart(train, 'Sex') 
plt.show()

tmp=train[(train['SibSp']>=3)] #가족수가 3명 이상인사람의 생존자 
chart(tmp,'SibSp')
plt.show()



sns.heatmap(train.isnull(), cbar=False)
plt.show()

코드 해석
1. train.isnull()
.isnull()은 train 데이터프레임 내에서 결측값이 있는지 여부를 확인하는 메서드. 각 요소가 결측값이면 True, 그렇지 않으면 False를 반환하는 동일한 크기의 데이터프레임을 든다.
2. sns.heatmap(train.isnull(), cbar=False)
sns.heatmap(): Seaborn의 히트맵 함수로, 2차원 데이터를 색상으로 표현하는 그래프이다. 여기서 train.isnull() 결과를 입력으로 사용하여 결측값을 시각적으로 나타낸다. True는 특정 색(보통 밝은 색)으로 표시되고, False는 다른 색(보통 어두운 색)으로 표시된다.
cbar=False: 히트맵 오른쪽에 나오는 색상 막대(color bar)를 표시하지 않도록 설정한 옵션이다.색상 막대는 값이 어느 정도인지 나타내는 기준이 되지만 결측값 여부만 표현할 때는 불필요할 수 있어 생략한다.

sns.heatmap(train.isnull(), cbar=True)
plt.show()

missingno

주요 시각화

  • 매트릭스 : missingno.matrix(데이터셋)
  • 바챠트 : missingno.bar(데이터셋) # 각 열의 결측치가 합해진 값 보여줌
  • 히트맵 : mssingno.heatmap(데이터셋)
  • dendrogram : missingno.dendrogram(데이터셋)
msno.matrix(train)

msno.bar(train)

msno.heatmap(train)

msno.dendrogram(test)

실습

# 1
a = [1, np.nan, np.nan]
b = [2, 3, 4]
c = [5, 6, np.inf]
df = pd.DataFrame({'a' : a, 'b' : b, 'c' : c})
df

# 2
a = [1, np.nan, np.nan]
b = [2, 3, 4]
c = [5, 6, np.inf]
df = pd.DataFrame({'a' : a, 'b' : b, 'c' : c})
df.isna() # 결측치 확인
df.isna().sum() # 빈도 확인
df.isnull() # null 확인(= 결측치 확인과 동일 결과)
df.isin([np.nan, np.inf]) # nan, infinity(무한 반복) 확인
df.isin([np.nan, np.inf]).sum() # 빈도 확인
# 3
a=[1,np.nan, 3]
b=[2,3,4]
c=[5,6,np.inf] 
df=pd.DataFrame({'a':a, 'b':b,'c':c}) 
print(df)
print()

df=df.fillna(method='ffill') # 앞행 대체
print(df)
print()

df=pd.DataFrame({'a':a, 'b':b,'c':c}) 
print(df)
print()

df=df.fillna(method='bfill') #뒷행 대체
print(df)
print()

df=pd.DataFrame({'a':a, 'b':b,'c':c}) 
print(df)
print()

df=df.fillna(100) # 특별한 값 대체
print(df)
# 4
a = pd.Series([1, 2, 3, 4], index=['A', 'B', 'C', 'D'])
print(a)

# 행이름 출력
print(a.loc['A'])

# index로 출력
print(a.iloc[1:3])
# 5
a = pd.Series([1, 2, 3, 4], index=['A', 'B', 'C', 'D'])

# a의 0 ~ 열 출력, error가 나오면 error 메시지 출력(try ~ except 사용)
try:
    print(a[0:4])
except IndexError as e:
    print(e)
# 6
a = np.arange(15).reshape(3, 5) # 3행 5열
b = pd.DataFrame(a)
print(b)
print()

b.loc['stc3'] = ['k', 'l', 'd', 'f', 'r'] # 행 추가
print(b)

# 7
a=np.arange(15).reshape(3,5) 
b=pd.DataFrame(a)
print(b)
print()

t={0:1000, 1:2000, 2:30000, 3:30000, 4:5000} 

# 딕셔너리를 데이터프레임으로 변환
t_df = pd.DataFrame([t])

# 기존 데이터프레임 b에 새로운 행을 추가 (pd.concat 사용)
# b=b.append(t, ignore_index=True) 
b = pd.concat([b, t_df], ignore_index=True)
print(b)

'''
pandas에서 append 메서드는 버전 1.4.0 이후에 사용 중단 되었고
이후 버전에서 완전히 제거 되었으므로
pd.concat()을 사용할 수 있음 
유사한 역할 한다.
'''

profile
Studying data analysis and data science!

0개의 댓글