Patrick's 데이터 세상

Python 데이터 분석 - 탐색적 자료 분석 EDA (Na 데이터 처리, Seaborn 그래프) 본문

Data Analysis/EDA

Python 데이터 분석 - 탐색적 자료 분석 EDA (Na 데이터 처리, Seaborn 그래프)

patrick610 2020. 6. 24. 22:00
반응형
SMALL

 

 

 

* EDA(Exploratory Data Analysis) : 데이터 초기에 이해를 높이기 위한 방법

 

 

◎ 결측치 처리

 

 na 데이터 처리

missing_values는 2가지 방법이 있다.
버리는 방법(제거), 의미있는 값으로 대체하는 방법(평균, 중앙값, 최빈값)


* 자동으로 결측치 처리

   Imputed

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# import matplotlib.pylab as plt       pyplot + numpy + ...
titanic_train = pd.read_csv("data_files/titanic-train.csv")
titanic_train.info()

결과

titanic_train.head()   # 0~n번째 데이터 반환(기본 5개)

결과

titanic_train.describe()

결과

na = titanic_train.isnull()   # == isna()
na_sum = na.sum()   # 합 계산 (True : 1, False : 0)
na_sum = na_sum.sort_values(ascending=False)   # 값으로 정렬

# na_sum = titanic_train.isnull().sum().sort_values(ascending=False)

na_sum

결과

na_percent = na.sum() / na.count()   # True 갯수 / 전체 갯수
na_percent = na_percent.sort_values(ascending=False)   
na_percent

결과

type(na_sum), type(na_percent)   # 마지막 실행문의 결과는 출력 값(대화형에서만 가능)
                                 # series 형태

결과

# print( type(na_sum), type(na_percent) )
missing_values = pd.DataFrame({ "TOTAL" : na_sum, 
                                "PERCENT" : na_percent})   # Series로 DataFrame 만들기
# missing_values = pd.concat([na_sum, na_percent], 
#                            axis=1, # 열방향으로(오른쪽으로) 결합하는 설정
#                            keys=["TOTAL", "PERCENT"])
missing_values

결과



 na 데이터 평균으로 대체

original_titanic_train = titanic_train.copy()   # 데이터 복제
# remove missing value column

# del titanic_train["Cabin"]
# titanic_train = titanic_train.drop("Cabin", axis=1)   # 수정된 복사본 생성
titanic_train.drop("Cabin", axis=1, inplace=True)       # 원본 수정  axis 0이면 행, 1이면 열

# titanic_train.info()
titanic_train.head()

결과

# replace missing value by a value

age_mean = titanic_train["Age"].mean()                # 평균
age_mean
titanic_train['Age'].fillna(age_mean, inplace=True)   # 원본 변경, 평균으로 대체
titanic_train.info()
titanic_train.head()

결과




 na 데이터 행, 열 삭제

# 결측치 처리 : 행 삭제
titanic_train.dropna(axis=0, inplace=True)  # missing value가 포함된 행 제거 (axis=0)
titanic_train.info()
titanic_train.head()

결과

#df = titanic_train.reset_index() # 인텍스를 새로 만들고 원래 인덱스는 컬럼으로 변경
#df = df.drop('index', axis=1)   # index 컬럼 삭제
df = titanic_train.reset_index(drop=True) # 인덱스를 새로 만들고 원래 인덱스는 제거, 위 두 줄의 결합
# df.info()
df.head()

결과

#titanic_train.drop('PassengerId', axis=1, inplace=True)
titanic_train.drop(['PassengerId'], axis=1, inplace=True)
titanic_train.head()

결과

 


 새로운 컬럼 생성

# 새로운 컬럼 생성(있으면 수정, 없으면 생성)
titanic_train["FamilySize"] = titanic_train["SibSp"] + titanic_train["Parch"]   # 직계 가족과 수평적 관계 가족을 하나로 묶는다.
titanic_train.head()

결과

original_titanic_train['Name'].head()

결과

 


 특정 컬럼에서 문자열 형식을 토대로 데이터 가져와 새로운 컬럼 생성

title_column = original_titanic_train['Name'].str.extract('([A-Za-z]+)\.', expand=False) # 영문자1개이상 + . 를 괄호 안 내용 추출 (호칭)
titanic_train['Title'] = title_column
titanic_train.head()

결과

titanic_train['Title'].unique()   # 중복을 제외한 값 목록 반환

결과

 

 

 

⊙ 그룹바이로 평균 계산

age_means = titanic_train.groupby('Title')['Age'].mean()   # 타이틀을 그룹바이해서 나이의 평균 계산
age_means

결과

 

map_means = age_means.to_dict()   # series를 dictionary로 
map_means

결과

 

titanic_train_copy = titanic_train.copy()   # 데이터 복사
titanic_train = titanic_train_copy.copy()
# Age의 missing value를 전체평균으로 대체
# -> Age의 missing value를 Title별 평균으로 대체
row_nan_age = titanic_train['Age'] == original_titanic_train["Age"].mean()   # NaN이었던 행을 찾는 것
idx_nan_age = titanic_train[row_nan_age].index   # 찾은 행의 인덱스 가져오기


loc으로 위치를 찾아서 map으로 교체

row_nan_age
idx_nan_age
titanic_train['Title'].loc[idx_nan_age]
titanic_train['Title'].loc[idx_nan_age].map(map_means)
# loc : 인덱스로 찾기, map : 원본 값을 다른 값으로 변환할 때 각각 1:1 처리
titanic_train.loc[idx_nan_age, 'Age'] = titanic_train['Title'].loc[idx_nan_age].map(map_means)   
titanic_train.head(10)

결과


Imputed 행을 만들어서 변경되었는지 확인

titanic_train['Imputed'] = 0
titanic_train.loc[idx_nan_age, 'Imputed'] = 1
titanic_train.head(10)

결과

 

 

⊙ Seaborn을 활용한 그래프 생성

import seaborn as sns

plt.figure(figsize=(15, 5))   # figure 크기 지정
sns.barplot(x=titanic_train['Title'], y=titanic_train['Age'])   # Title별 평균 Age
plt.show()

결과

 

sns.catplot(data=titanic_train, x='Pclass', y='Survived', kind='bar')
plt.show()

결과

sns.catplot(data=titanic_train, x='Sex', y="Survived", kind='bar')
plt.show()

결과

 표본으로 실제 모집단을 예측(추정)해야 함.
  catplot 시에 막대 위에 있는 줄은 오차범위를 뜻한다.

 

plt.figure(figsize=(15, 5))
sns.barplot(titanic_train['Age'], titanic_train["Survived"])
plt.xticks(rotation=90)
plt.show()

결과

 

titanic_train['AgeGroup'] = pd.cut(titanic_train['Age'], 
                                   bins=[0, 15, 50, 200], 
                                   labels=['Child', 'Adult', 'Elder'])
titanic_train['AgeGroup'].head(10)

결과

· histogram 

   bins : 데이터의 범주
   labels : 범주의 이름

 

sns.barplot(titanic_train['AgeGroup'], titanic_train["Survived"])
plt.show()

결과

 

# sns.barplot(titanic_train['FamilySize'], titanic_train["Survived"])
sns.catplot(data=titanic_train, x='FamilySize', y='Survived', kind='bar')
plt.show()

결과

 

sns.barplot(titanic_train['Embarked'], titanic_train["Survived"])
plt.show()

결과

 

sns.barplot(x=titanic_train["Survived"], 
            y=titanic_train['Fare'], 
            hue=titanic_train['Pclass'])
plt.show()

결과

 

반응형
LIST
Comments