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
'Data Analysis > EDA' 카테고리의 다른 글
Python 데이터 분석 - 통계분석 (0) | 2020.06.24 |
---|---|
Python 데이터 분석 - 통계분석 기초 (0) | 2020.06.24 |
Python 데이터 분석 - 탐색적 자료 분석 EDA (NumPy를 활용한 그래프, 산점도) (0) | 2020.06.24 |
Python 데이터 분석 - 통계 검정 (0) | 2020.06.24 |
Python 데이터 분석 - 지도 시각화(EDA) (2) | 2020.06.24 |
Comments