📌 EDA ('탐색적 자료 분석')
numpy, pandas에 이어서 수집한 데이터가 들어왔을 때 데이터를 다양한 각도에서 관찰하고 이해하는 과정인 EDA이다.
평균, 표준편차, median, outlier, missing value, 분포 모양 등을 활용
from IPython.display import Image
import numpy as np
import pandas as pd
import seaborn as sns #image 가져오는 모듈
EDA를 하기 위해서 기본적으로 추가되는 import module은 위와 같다
차근차근 EDA를 위한 step을 밟아본다
df = sns.load_dataset("titanic") #타이타닉이라는 데이터셋 로드
df.head() #데이터 중 맨 앞 5개 행만 가져온다
#output)
#survived pclass sex age sibsp parch fare embarked class who adult_male deck embark_town alive alone
#0 0 3 male 22.0 1 0 7.2500 S Third man True NaN Southampton no False
#1 1 1 female 38.0 1 0 71.2833 C First woman False C Cherbourg yes False
#2 1 3 female 26.0 0 0 7.9250 S Third woman False NaN Southampton yes True
#3 1 1 female 35.0 1 0 53.1000 S First woman False C Southampton yes False
#4 0 3 male 35.0 0 0 8.0500 S Third man True NaN Southampton no True
df = pd.read_csv('titanic.csv') #위처럼 이번엔 타이타닉.csv 파일 데이터셋 로드
df.tail() #데이터 중 맨 뒤 5개 행 가져옴
df.shape() #데이터는 몇개의 행과 열로 이루어져 있는지 확인
#output (891,15) 즉, 891행과 15개의 열로 이루어졌다는 뜻
df.info() #column별 데이터의 dtype과 개수 확인
df.isnull().sum() #data의 column별 결측치 확인 가능
df.isna().sum() #위와 같은 결과가 나옴
#output)
#survived 0
#pclass 0
#sex 0
#age 177
#sibsp 0
#parch 0
#fare 0
#embarked 2
#class 0...
#-> age의 결측치가 많으니 이걸 데이터 분석에 이용 가능
df['survived'].value_counts()
#output)
#0 549
#1 342
#Name: survived, dtype: int64
👉 기본적 df 관련 함수 (df : DataFrame)
✔️ df = sns.load_dataset("file name")
: file name의 data set load
✔️ df.head()
: 데이터 중 맨 앞 5개 행만 가져옴
✔️ df = pd.read_csv('file name')
: csv file data set load
✔️ df.tail()
: 데이터 중 맨 뒤 5개 행 가져옴
✔️ df.shape()
: 데이터는 몇개의 행과 열로 이루어져 있는지 확인
✔️ df.info()
: column별 데이터의 dtype과 개수 확인
✔️ df.isnull().sum() or df.isna().sum()
: data의 column별 결측치 확인 가능
✔️ df['column name'].value_counts()
: data의 column name 행의 개수 확인
df.groupby('embarked')['survived'].sum() #항구별 그룹을 만들어서 survived 된 합계 계산
#output)
#embarked
#C 93
#Q 30
#S 217
#Name: survived, dtype: int64
df.groupby('embarked')['survived'].count() #항구별 그룹을 만들어서 sum이 아닌 count()
#output)
#embarked
#C 0.553571
#Q 0.389610
#S 0.336957
#Name: survived, dtype: float64
df.groupby('embarked')['survived'].agg(['sum', 'mean']) #항구별 생존자 합계 및 생존율 계산
#output)
# sum mean
#embarked
#C 93 0.553571
#Q 30 0.389610
#S 217 0.336957
df.groupby('sex')['survived'].agg(['sum', 'mean']) #성별 생존자 합계 및 생존율 계산
#output)
# sum mean
#sex
#female 233 0.742038
#male 109 0.188908
# -> 실제로 확인해보니 female의 생존율이 male보다 훨씬 높았다
df.groupby(['who','sex'])['survived'].agg(['sum','mean'])
#child는 남녀 구분 없이 어느정도 잘 구조되었다 -> '65%와 52%가 유의미한 차이인가'에 대한 데이터 분석 진행
#output)
# sum mean
#who sex
#child female 28 0.651163
# male 21 0.525000
#man male 88 0.163873
#woman female 205 0.756458
df.groupby(by=['embarked','sex'])['survived'].agg(['count','sum','mean'])
#output)
# count sum mean
#embarked sex
#C female 73 64 0.876712
# male 95 29 0.305263
#Q female 36 27 0.750000
# male 41 3 0.073171
#S female 203 140 0.689655
# male 441 77 0.174603
df.groupby(['pclass', 'who'])['fare'].mean()
#fare에 대한 1차원만 나오기 때문에 Dataframe이 아닌 Series
pd.DataFrame(df.groupby(['pclass', 'who'])['fare'].mean())
#Dataframe이면 2차원 배열로 보기 좋게 나옴
groupby(['sex', 'family'])['survived'].mean().reset_index().sort_values('survived', ascending=False).head().reset_index(drop=True)
❓ 위와 같이 groupby가 길어지는 경우가 있는데 하나하나 코드를 뜯어보면 알 수 있다
줄줄이 쓰는 것보다 나는 하나하나 쓰는 걸 좋아하긴 하는데
파이썬이 처음이라 그런가.. 파이썬은 원래 이렇게 줄줄이 쓰나..
👉 코드 뜯어보면..
#성별 & 가족 수에 따른 생존율 (mean:평균)
groupby(['sex', 'family'])['survived'].mean()
#reset_index()를 통해 맨 앞 행에 0,1,2,3... index 추가
groupby(['sex', 'family'])['survived'].mean().reset_index()
# output)
# sex family survived
#0 female 0 0.785714
#1 female 1 0.816092
#2 female 2 0.775510
#3 female 3 0.842105
#4 female 4 0.250000
#sort_values 통해 정렬을 시키며 ascending=False이기 때문에 '내림차순', 이 때 미리 정해놓은 인덱스가 뒤죽박죽이 됨
groupby(['sex', 'family'])['survived'].mean().reset_index().sort_values('survived', ascending=False)
#head()로 맨 앞 행 5개만
groupby(['sex', 'family'])['survived'].mean().reset_index().sort_values('survived', ascending=False).head()
#output)
# sex family survived
#3 female 3 0.842105
#1 female 1 0.816092
#0 female 0 0.785714
#2 female 2 0.775510
#12 male 3 0.500000
#drop=True 옵션을 지정해주면 인덱스로 지정은 하되, 기존열을 남겨놓는다.
groupby(['sex', 'family'])['survived'].mean().reset_index().sort_values('survived', ascending=False).head().reset_index(drop=True)
#output)
# sex family survived
#0 female 3 0.842105
#1 female 1 0.816092
#2 female 0 0.785714
#3 female 2 0.775510
#4 male 3 0.500000
👉 def 함수를 정의하여 이용도 가능하다
def make_bin(x):
if x == 'male':
return 1
elif x == 'female':
return 0
df['gender'] = df['sex'].apply(make_bin)
#def make_bin을 보면 남자는 1, 여자는 0으로 값 변경하고 gender column을 새로 만들어 적용
df['gender'].value_counts()
#output)
#1 577
#0 314
#Name: gender, dtype: int64
#요금을 5구간으로 나뉘어서 fare_bin column을 새로 만들어 적용 가능
df['fare_bin'] = pd.qcut(df['fare'], 5) #qcut 에 두번째 parameter에 5로 하면 5개의 구간
df['fare_bin'].value_counts()
#output)
#(7.854, 10.5] 184
#(21.679, 39.688] 180
#(-0.001, 7.854] 179
#(39.688, 512.329] 176
#(10.5, 21.679] 172
#Name: fare_bin, dtype: int64
📌참고) dtype
int 정수
object str
bool boolean (True, False)
'CDS' 카테고리의 다른 글
Machine Learning [K-NN] (0) | 2021.11.15 |
---|---|
Machine Learning [Scikit-Learn] (0) | 2021.11.15 |
Machine Learning Overview (0) | 2021.11.15 |
Data Visulization : Seaborn(데이터 시각화) (0) | 2021.11.12 |
Data Visulization : Matplotlib(데이터 시각화) (0) | 2021.11.12 |