데이터 분포의 비대칭도를 나타내는 지표
왜도 s의 특징
│s│≤ 0.5 | 0.5 ≤ │s│ ≤ 1 | │s│ ≤ 1 |
---|---|---|
상당히 대칭적 | 적당히 치우침 | 상당히 치우침 |
확률 분포의 뾰족한 정도를 나타내는 지표
관측치들이 얼마나 집중적으로 중심에 몰려있는지 측정 시 사용
첨도 k의 특징
k < 3 | k = 3 | k > 3 |
---|---|---|
platykurtic | mesokurtic | leptokurtic |
데이터가 가벼움 이상치 부족 | 정규분포와 유사한 첨도 | 데이터의 꼬리가 무거움 이상치가 많음 |
import numpy as np
import pandas as pd
import seaborn as sns
df = sns.load_dataset('titanic')
df.head()
df.info()
df.describe()
df_number = df.select_dtypes(include=np.number)
df_number.describe()
age | sibsp | survived | pclass | parch | fare | |
---|---|---|---|---|---|---|
count | 714.000000 | 891.000000 | 891.000000 | 891.000000 | 891.000000 | 891.000000 |
mean | 29.699118 | 0.523008 | 0.383838 | 2.308642 | 0.381594 | 32.204208 |
std | 14.526497 | 1.102743 | 0.486592 | 0.836071 | 0.806057 | 49.693429 |
min | 0.420000 | 0.000000 | 0.000000 | 1.000000 | 0.000000 | 0.000000 |
25% | 20.125000 | 0.000000 | 0.000000 | 2.000000 | 0.000000 | 7.910400 |
50% | 28.000000 | 0.000000 | 0.000000 | 3.000000 | 0.000000 | 14.454200 |
75% | 38.000000 | 1.000000 | 1.000000 | 3.000000 | 0.000000 | 31.000000 |
max | 80.000000 | 8.000000 | 1.000000 | 3.000000 | 6.000000 | 512.329200 |
※ 소수점 뒷 부분이 다 0인 것들은 범주형인 것으로 의심할 필요가 있음
▶ 왜도, 첨도 확인
print('첨도 :', df_number['fare'].kurt())
print('왜도 :', df_number['fare'].skew())
df_number['fare'].plot.hist(bins=50) # pandas 자체 기능
# fare 데이터는 뾰족하고 치우쳐있음
▶ 이상치 확인
sns.boxplot(x=df_number['survived'], y=df_number['age'])
▶ 상관관계 확인
sns.heatmap(df_number.corr(), annot=True, linewidths=0.2, cmap='Reds')
df_object = df.select_dtypes(exclude=np.number)
# survived 추가
df_object = df_object.join(df['survived'])
# 데이터 타입 변형 (수치 → 범주)
df_object['survived'] = df_object['survived'].astype('category')
df_object.describe()
sex | embarked | class | who | adult_male | deck | embark_town | alive | alone | survived | |
---|---|---|---|---|---|---|---|---|---|---|
count | 891 | 889 | 891 | 891 | 891 | 203 | 889 | 891 | 891 | 891 |
unique | 2 | 3 | 3 | 3 | 2 | 7 | 3 | 2 | 2 | 2 |
top | male | S | Third | man | True | C | Southampton | no | True | 0 |
freq | 577 | 644 | 491 | 537 | 537 | 59 | 644 | 549 | 537 | 549 |
pd.crosstab()
: 데이터 재구조화pd.crosstab(df_object['sex'], df_object['survived'], margins=True)
# margins : 전체 통계 포함 여부
pd.crosstab(df_object['sex'], df_object['survived'], margins=True, normalize='all')
# normalize : 개수가 아닌 비율로 표시