오늘의 회고
- 사실(Fact) : 지난주에 이어서 Pandas, Seaborn 실습을 진행했다. EDA 과정을 추상화된 도구를 사용하는 방법과 직접 작성하는 방법을 학습했다.
- 느낌(Feeling) : 코드를 보고 따라하는 건 할 수 있지만, 그래프마다 다른 용도나 필요한 값들, 기술 통계 안에 있는 수치의 의미를 정확히 이해하기 어려워서, 공부하고 나서 개운하지 않았다.
- 교훈(Finding) : 통계 관련 자료나 책을 더 찾아서 읽어보자
멋사 AI스쿨 main lecture by 박조은 강사님
mpg 데이터셋을 활용한 EDA 분석, 시각화
- EDA란? Exploratory data analysis (탐색적 자료 분석)
1. 추상화된 EDA 도구 활용
pandas profiling, Sweetviz, Autoviz
0105 파일 참고
1️⃣ Pandas Profiling Report
https://github.com/ydataai/ydata-profiling
2️⃣ SweetViz
https://pypi.org/project/sweetviz/
3️⃣ AutoViz (bokeh)
https://github.com/AutoViML/AutoViz
2. 직접 그려보기 ( Matplotlib, seaborn활용)
# pandas, seaborn, numpy, matplotlib.pyplot 불러오기
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
데이터 미리보기
df.head -> iloc[:5]
df.tail -> iloc[-5:]
왜도(Skewness)
- 한쪽에 쏠려있는 데이터 형태
- 확률 변수의 확률 분포 비대칭성을 나타내는 지표
- 음수일때 오른쪽에 데이터가 몰려있고 왼쪽에 긴 꼬리가 있는 형태
- 양수일때 왼쪽에 데이터가 몰려있고 오른쪽에 긴 꼬리가 있는 형태
# df.skew()
df.skew().sort_values()
첨도(Kurtosis)
- 확률 분포의 뾰족한 정도 -> 어느 정도 몰려있는지 측정
- 이번 실습에서는 Fisher의 정의를 바탕으로 0일때가 normal(정규 분포에 가깝다는 뜻)
- 0보다 값이 크냐 작냐로 판단한다.
# kurt를 통해 전체 수치변수에 대한 첨도 구하기
# df.kurt()
df.kurt().sort_values(ascending = False)
히스토그램 - 수치형 변수
# hist()를 통해 전체 수치변수에 대한 히스토그램 그리기
df.hist(figsize=(12,10), bins=20) #bins 는 간격
plt.show()
- cylinders는 수치로 되어 있지만 히스토그램 분포를 통해 범주형 데이터라는 것을 알 수 있다.
결측치 구하기
df.isnull().sum()
결측치 비율 구하기
df.isnull().mean()
결측치 히트맵으로 시각화 하기
plt.figure(figsize=(12,8)) #그래프 사이즈 조정
sns.heatmap(df.isnull(),cmap="gray")
기술통계 확인하기 .describe()
# describe 를 통해 범주형 변수에 대한 기술통계를 보기
df.describe(include="object")
df[["cylinders", "model_year"]].astype(str).describe()
#데이터형을 문자열로 바꿔서 기술통계보는법
displot을 이용해 히스토그램과 kdeplot그리기
sns.displot(data=df, x="mpg", kde = True, hue="origin", col="origin")
# kde는 밀도를 추정해서 부드러운 곡선 추가
- hue는 범주형 자료에 따라 색을 다르게 지정해지는 것이고, col은 서브 plot을 생성하는 것이다.
hist => 빈도, kde=> 밀도 == 적분했을 때 1이 되는 값
kde란?
A kernel density estimate (KDE) plot is a method for visualizing the distribution of observations in a dataset, analagous to a histogram. KDE represents the data using a continuous probability density curve in one or more dimensions.
연속된 데이터에 대한 확률 밀도 함수를 그리는 것이다. 확률 밀도는 히스토그램의 밀도를 추정한 것을 의미한다. 연속된 확률에 대한 밀도를 커브로 표현한 것이다.
표준화, 스탠다드 스케일러
df_std = (df_num - df_num.mean())/df_num.std()
df_std.describe().round(2)
#표준편차로 나누는 스탠다드 스케일링 방법
# (관측치 - 평균)/표준편차
(관측치 - 평균)/표준편차
df_std = (df_num - df_num.mean()) / df_num.std()
df_std.describe().round(2)
스케일링이란? 변수의 절대적인 수치차이를 통일시켜주는 것이다.
표준화 과정을 거치면 변수 간 비교가 수월해진다.
표준화를 거치기 전 / 후
regplot 와 residplot (회귀 시각화와 잔차 시각화)
reg의 직선이 resid의 0축으로 나타난 것이다.
잔차란? 잔차는 각각의 자료가 직선에 얼마나 잘 맞는지 확인하는 도구이다.
상관계수 구하기
corr = df.corr()
Pandas에서 corr값을 구할 때는 Pearson상관계수 이용
상관계수란?
피어슨 상관 계수(Pearson Correlation Coefficient ,PCC)란 두 변수 X 와 Y 간의 선형 상관 관계를 계량화한 수치다. 피어슨 상관 계수는 코시-슈바르츠 부등식에 의해 +1과 -1 사이의 값을 가지며, +1은 완벽한 양의 선형 상관 관계, 0은 선형 상관 관계 없음, -1은 완벽한 음의 선형 상관 관계를 의미한다. 일반적으로 상관관계는 피어슨 상관관계를 의미하는 상관계수이다. (위키피디아 참고)
히트맵을 통해 상관계수 시각화하기
# 자기상관계수는 대각행렬을 기준으로 대칭되어 같은 값이 출력되므로,
# 이대로 전체를 heatmap을 plot하면 오히려 가독성이 떨어질 수 있음
# np.ones_like로 heatmap의 마스크값 구하기
mask = np.triu(np.ones_like(corr))
plt.figure(figsize=(12,10)) #그래프 사이즈 조절
sns.heatmap(corr, cmap="coolwarm", annot = True)
왜 상삼각 대각행렬을 만들었을까?
히트맵에서 자기자신과의 상관관계와 중복값을 지우기 위해서이다.
mask=mask가 상삼각에서 1로 표시된 부분을 지워준다. 가독성이 높아진다.
이 외에도 Relplot, lineplot, pairplot, jointplot, lmplot, scatterplot, violinplot, kdeplot, rugplot 등
다양한 plot을 그려보았다.