삶은돼지고기 2022. 9. 27. 01:02
728x90

7일차 오늘은 EDA기초와 Seaborn을 활용한 데이터 시각화에 대하여 배워보았습니다.

 

  • 아나콘다 : 파이썬과 파이썬 생태계 다 지배하고 있으며 가상환경 만들기 쉽게 해줌
  • 파이썬은 다른언어로 만들어진 도구를 쉬운 인터페이스로 만들게 한 특징 : 접착제 언어
  • 기업에서는 아나콘다가 유료로 바뀜.(기업에선 일일이 가입하는 경우가 많음)
  • 주피터노트북의 온라인 버전 : Colab (클라우드 환경에서 공유 장점)
  • Seaborn에 내장되어있는 데이터셋을 사용할 것임(업무데이터든, 논문에 쓰일 데이터든공통적으로 보는 기술통계가 있음)
  • 반복해서보는 기술통계들을 한번에 그려줌(pandas-profiling/Sweetviz/AutoBiz)
  1. 판다스 프로파일링 : https://github.com/ydataai/pandas-profiling
  1. Sweetviz : 기본적인 기술통계값 https://github.com/fbdesignpro/sweetviz
  2. AutoBiz : https://github.com/AutoViML/AutoViz
  • 넘파이 : 수치계산을 위한 계산기(nd.array로 다차원 가능)
  • 씨본 : 데이터 시각화 도구
  • 파일형태의 데이터셋은 로그형태의 데이터셋일 확률이 높다.
  • 실시간성으로 다뤄야하는 데이터는 데이터베이스에서 관리한다.
  • Pandas Profiling Report html 보면, 결측치등의 기술통계값을 확인해볼 수 있다.
  • 추상화된 기술통계값 사용하면 객관적인 EDA를 볼 수 있다)
  • 히스토그램의 밀도 추정할때 옵션이 다르기때문에 그래프 디테일부분 차이가 있다.(그래프 나눠진 개수에 따라 커브형태 달라지듯이)
  • 수치형 변수의 유니크 값을 확인(유니크값을 통해 수치형인지 범주형인지 확인)
  • 전체 수치변수에 대한 히스토그램 그리기 : df.hist()
  • bins 값을 크게 하면 도수 분포표라고 볼 수 도있음 (중간중간에 이빠진 모양을 가지는 그래프가 있음 ==> 수치형 데이터로 되어있지만 범주형 데이터에 가깝다고 생각할 수 있음)
  1. 비대칭도(왜도)
  1. 첨도
  • kurt 출력 : df.kurt()
  • df.kurt? => 문서를 보면, 0일때가 normal 임을 알 수 있음, 피셔의 정의를 사용하고 있음 => 0보다 큰지 작은지로 파악(0에 가까울수록 nomal, 정규분포에 가깝다)
  • kurt 값 정렬 : df.kurt().sort_values(ascending=False) # DESC 정렬
  • 참고 : https://ko.wikipedia.org/wiki/첨도
  1. 1개의 수치변수
  • displot으로 x축 공유하여 히스토그램&kdeplot : sns.displot(data=df, kde=True)
  • 서브 1개에 대해 히스토&kde : sns.displot(data=df, x="mpg", kde=True)
  • mpg 각 데이터에 따른 히스토&kde : sns.displot(data=df, x="mpg", kde=True, hue="origin", col="origin")
  • HUE : 변수에 따라 색상 다르게 만들어줌
  • COL : subplot 나누어줌( col에 지정한 값을 기준으로 그래프를 분리해서 그릴 수 있음 )
  • KDE(Kernel Density Estimate) : 관측치에 대한 확률밀도함수를 그림(히스토그램의 밀도를 추정한 것)
  • ECDFplot : 누적 그래프
  • rugplot : 작은 선분(rug)으로 나타내어 데이터들의 위치 및 분포를 보여줌
  • lmplot regplot의 상위 개념으로, regplot scatterplot lineplot을 합쳐 놓은 그래프 (다만, lmplot은 옵션을 이용해 분리해 그리는것이 가능)
  • 정리) hist : 빈도, kde : 밀도 == 적분했을 때 1이 되는 값
  • boxplot으로 사분위 수 표현 : sns.boxplot(data=df, x=“mpg”)
  • 수치형 변수만 가져오는 방법
  • 정규화 : (관측치-평균)/표준편차 하는 과정
  1. 2개 이상의 수치 변수
  • reg residplot 차이는??
  • regplot lmplot 차이
  • 2개의 변수에 대해 짝을 지어서 그림(시간 오래 걸림) => pairplot
  • ci : 신뢰구간 의미하는 파라미터
  • 정규화
  1. 상관분석
  • 두 변수간의 연관 정도를 나타낼 뿐 인과관계를 설명하는 것은 아니다.
  • 데이터 프레임 전체의 수치변수에 대해 상관계수 구하기 : df.corr()
  • 참고 : https://ko.wikipedia.org/wiki/상관_분석
  • 상삼각 대각행렬

x와 크기만 같은 1로 이루어진 array 생성 : np.ones_like(x) -> heatmap에서 대각선 윗부분 제거 : sns.heatmap(corr, cmap="coolwarm", annot=True, mask=mask) -> mask에서 1인 부분은 대칭이기 때문에 가독성을 높여주기 위해서 지워진다!

 

데이터 결측치

# 결측치의 합계 df.isnull().sum()

# 결측치의 비율 df.isnull().mean() * 100

 

------------

데이터의 기술 통계보기

# 수치 데이터 요약 df.describe()

# 문자열 데이터 요약 df.describe(include = "object)

# df["cylinders"].astype(str).describe() -> Series형으로 출력

# df[["cylinders"]].astype(str).describe() -> DataFrame으로 출력 df[["cylinders","model_year"]].astype(str).describe()

 

------------

수치형 변수

# hist()를 통해 전체 수치변수에 대한 히스토그램 df.hist()

# .hist()만 했을 때 나오는 로그 제외하고 그래프만 출력하기 plt.show

# hist()를 통해 전체 수치변수에 대한 히스토그램 그리기 df.hist(figsize = (12,10), bins = 50)

# .hist()만 했을 때 나오는 로그 제외하고 그래프만 출력하기 plt.show

 

-------------

1개의 수치변수 가지고 kdeplo 그리기

# displot을 통해 히스토그램과 kdeplot 그리기 sns.displot(data = df, kde = True)

# sns.displot(data = df, x = "mpg", kde = True) sns.displot(data = df, x = "mpg", kde = True, hue = "origin", col = "origin", bins = 50)

 

--------------

kde plot으로 밀도 함수 표현하기

# kdeplot, rugplot으로 밀도함수 표현하기 sns.kdeplot(data = df, x = "mpg") kdeplot과 rugplot으로 밀도 함수 표현하기

# kdeplot, rugplot으로 밀도함수 표현하기 sns.kdeplot(data = df, x = "mpg") sns.rugplot(data = df, x = "mpg")

 

------------------

agg로 기술 통계 값 구하기 _skew, kurt

# mpg 값에 대해 agg로 skew, kurt 값 구하기 df["mpg"].agg(["skew", "kurt"])

 

-----------------

Standard scaling df_num = df.select_dtypes(include = "number") df_num.head(1)

# 표준화 df_std = (df_num - df_num.mean())/df_num.std() df_std.describe().round(2)

 

------------------

회귀 시각화 - regplot 잔차 시각화 - residplot

 

------------------

pairplot pairplot은 시간이 오래 걸리기 때문에 일부 샘플을 추출해서 그려보고 샘플의 수를 늘려가며 그리는 것을 추천한다. 한번에 그래프를 그려볼 수 있다. lineplot relplot과 kind 옵션을 이용해 선그래프 그리기