CDS

EDA (Exploratory Data Analysis)

juju824 2021. 11. 12. 14:38

📌 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