본문 바로가기
Python/멋사_AIS7

Day 09

by Hi_heidi 2022. 9. 27.

Day 09

기술통계값을 한 번에 생성해주는 EDA 도구

EDA 파일을 생성해주는 도구가 많지만 문서를 보고 어떤 식으로 내 데이터에 적용해야 하는지 해결해야 한다

 

  1. Pandas Profiling
  • 관찰할 수 있는 기본 기술통계: number of variables(변수의 개수), number of observations(관측값), missing cells(결측치 개수), missing cells %(결측치 비율), duplicate rows(중복행), duplicate rows %(중복행 비율), total size in memory(총 메모리 사용량), average record size in memory(평균 메모리 사용량) --> 전체 데이터셋 정보를 확인할 수 있게 된다.
  • 수치형(numerical)/범주형(categorical)에 따라 다른 기술 통계값과 그래프를 보여준다.

   2. Sweetviz

  • rows(행 개수), duplicates(중복값 개수), ram(램에서 차지하는 용량), features(피처 변수 개수), categorical(범주형 변수 개수), numerical(수치형 변수), text
  • train, test, target 값을 비교해볼 수 있다는 장점이 있다. 판다스 프로파일링과 같이 관찰할 수 있는 기본 기술통계 리포트를 생성해준다. 

   3. Autoviz

  • bokeh로 시각화해주는 추상화된 도구고 여러 데이터셋을 가져와서 리포트를 생성해준다. 한 번에 여러 변수의 짝을 지어 비교해주며 인터렉티브한 시각화가 가능하다.

--EDA도구 사용 단점: 대용량 데이터 사용 어려움(대용량 데이터로 리포트 출력 시 시간이 오래 걸림)


데이터셋 불러오기

  • df = sns.load_dataset("데이터명")
  • df.shape   #(행, 열)
  • df. head()   #앞에서 5개 데이터 출력     df.tail()   #뒤에서 5개 데이터 출력
    • 내부 소스코드로 가져오면? → dfiloc[:5]   df.iloc[-5:]

요약하기

  • df.info()   #column, non-null count, Dtype 등 데이터 정보 요약 결과 출력

결측치 보기

  • df.isnull()
  • df.isnull.sum()   #결측치 합계 값
  • df.isnull().mean()   #결측치의 비율
  • df.isnull().mean()*100   #결측치의 백분율   ==   df.isnull().sum()/len(df) *100
  • df.count()   #결측치 제외 변수별 데이터 개수
  • sns.heatmap(df.isnull(),cmap='gray')   #결측치 시각화 #cmap = colormap 도표 색상 설정
    • plt.figure(figsize=(12,8))   #도표 크기 설정. 기본 사이즈는 6.4 * 4.8
  • plt.figure?   plt.colormaps?   --   그림이나 시각화 관련 도움말 얻을 수 있다.

기술통계 보기

  • df.describe()   #수치형 데이터의 기술통계값
  • df.describe(include='object')   #범주형 데이터의 기술통계값
  • df[['cylinders','model_year']].astype(str).describe()   #수치형 데이터를 범주형으로 보고 싶을 때

수치형 변수

 

  • df['변수명'].unique()   #유니크값 전체를 출력해 수치형 변수인지 범주형 변수인지 확인 가능하다.
  • df.hist(figsize=(12,8), bins=50)   #전체 수치변수에 대한 히스토그램 그리기
  • plt.show()   #로그 제외 도표만 보여줌
  • 왜도(비대칭도)
    • 실수 값 확률 변수의 확률 분포 비대칭성을 나타내는 지표
    • 왜도 값이 양수일 때 = 자료가 왼쪽에 많이 분포(중앙값 포함) 오른쪽 긴 꼬리 ↔ 음수일 때 = 오른쪽에 많이 분포 왼쪽 긴 꼬리. 왜도 값은 정의되지 않을 수도 있다.
    • 평균 = 중앙값 → 왜도 = 0
    • df.skew()
    • df.skew().sort_values()   #오름차순 정렬
  • 첨도(K)
    • 확률분포의 뾰족한 정도를 나타내는 척도
    • 관측치들이 어느 정도 몰려있는가 측정 시 사용
    • 첨도값(K) < 3 : 정규분포보다 뾰족, 꼬리 얇음 ↔ 첨도값(K) > 3 : 정규분포보다 완만, 꼬리 두껍
    • 첨도값(K)이 3과 가까울수루고 산포도가 정규분포에 근사
    • df.kurt()   #이 결과값이 0에 가까울수록 정규분포에 가깝다
    • df.kurt().sort_values(Ascending=False)   #역순 정렬 #그냥 정렬은 ascending~삭제
  • 1개의 수치변수
    • sns.displot(data=df, x='mpg', kde=True, hue='origin', col='origin', bins=50)   #kde=True 곡선 추가 #hue='origin' 오리진 범주별로 색깔 달리 설정 #col='origin' 오리진 범주별로 그래프 분리(subplot 생성) #bins=50 막대 50개  #displot을 통해 히스토그램과 kdeplot그리기?
    • sns.kdeplot(data=df, x='mpg')   #kdeplot 확률밀도함수 표현
    • sns.rugplot(data=df, x='mpg')   #rugplot 확률밀도함수 표현
    • df['mpg'].agg(['skew','kurt','mean','median'])   #agg(어그리게이션)로 skew, kurt값 구하기. 이외 알아보고 싶은 기술통계값을 어그리게이션으로 표현 가능하다.
    • sns.boxplot(data=df, x='mpg')   #boxplot으로 사분위 수 표현
    • df['mpg'].rescribe()   #describe로 기술통계값 산출
    • sns.violinplot(data=df, x='mpg')   #violinplot으로 값 상세 보기
  • boxplot과 kdeplot
    • df.std()   #전체 변수의 표준편차 구하기
    • df_num = df.select_dtypes(include='number')   #보충
    • df_std = ( df_num - df_num.mean() ) / df_num.std()   #Standard Scaling (관측치-평균) / 표준편차
    • sns.violinplot(data=df_std)   #data=df일 때보다 그래프가 선명하게 잘 보인다 
      • Scaling : 변수의 수치와 범위가 다른 데이터를 비슷한 값을 갖도록 만들어주는 과정. 수치형 변수에만 적용된다. 
      • Standard Scaling : 평균이 0, 표준편차가 1이 되도록 표준정규분포화 시키는 스케일링 기법. 이상치에 민감하며, 회귀보다 분류 모델에 적합하다.
      • Min-Max Scaling : 변수의 범위를 0~1 사이 값으로 만들어주는 정규화 스케일링 기법. 최솟값을 0, 최댓값을 1로 만든다. 이상치에 민감하며, 분류보다 회귀 모델에 적합하다.

정규화(Normalization)와 표준화(Standardization) 비교

https://heeya-stupidbutstudying.tistory.com/entry/%ED%86%B5%EA%B3%84-%EC%A0%95%EA%B7%9C%ED%99%94%EC%99%80-%ED%91%9C%EC%A4%80%ED%99%94 표 이미지 출처

 

  • 2개 이상의 수치변수
    • sns.scatterplot(data=df, x='mpg', y='horsepower')   #scatterplot으로 2개의 수치변수 비교
  • 회귀 시각화
    • sns.regplot(data=df, x='mpg', y='horsepower')   #regplot으로 회귀선 그리기 #선형적인 관계 파악 가능
  • 잔차 시각화
    • sns.residplot(data=df, x='mpg', y='horsepower')   #회귀선의 잔차(회귀선에서의 오차) 시각화
    • sns.lmplot(data=df, x='mpg', y='horsepower', hue='origin', col='origin')   #lmplot 범주 별 색상 설정, subplot그리기
    • sns.jointplot(data=df, x='mpg', y='horsepower', kind='hex')   #2개의 수치변수 표현 #kind='hex' 헥사곤 형태로 시각화하겠다

   →reg에서 직선이 resid의 0축으로 나타난다.

 

  • pairplot
    • 2개 변수의 짝을 지어서 그려준다.
    • 로딩에 시간이 오래 걸리기 때문에 일부 샘플을 추출한 뒤 샘플의 수를 늘려가며 시각화하는 것을 추천한다.
    • sns.pairplot(data=df.sample(100))
    • sns.pairplot(data=df.sample(100), hue='origin')   #범주 별 색상 설정 가능
  • lineplot
    • sns.lineplot(data=df, x='model_year', y='mpg')   #신뢰구간도 함께 나오는 lineplot
    • sns.relplot(data=df, x='model_year', y='mpg', hue='origin', col='origin')   #hue='origin' 범주 별 색상 달리 설정 #col='origin' 범주 별 subplot생성
    • sns.relplot(data=df, x='model_year', y='mpg', kind='line')   #lineplot과 비슷한 시각화(같은가?)
    • sns.relplot(data=df, x='model_year', y='mpg', hue='origin', col='origin', kind='line')   #범주 별 다른 색상으로 분리된 그래프가 생성된다. relplot은 subplot을 그리기 위해 주로 사용된다.
    • sns.relplot(data=df, x='model_year', y='mpg', hue='origin', col='origin', kind='line', ci=None)   #ci=None 신뢰구간을 제거한 그래프가 생성된다. 최신 버전의 경우 error bar로 바뀌어 errorbar=None으로 사용해야 한다.
  •  상관분석(Correlation Analysis)
    • 두 변수가 어떤 선형적/비선형적 관계를 가지는지 분석하는 방법.
    • 상관관계(correlation) = 두 변수간 관계의 강도. 상관 계수(상관관계의 정도를 파악하는 계수)는 변수 간 연관된 정도를 나타낼 뿐 인과관계를 나타내지는 않는다. 인과관계는 회귀분석을 통해 확인할 수 있다.
    • 피어슨 상관계수(pearson correlation coefficient) : r값은 x와 y가 완전히 동일하면 1, 전혀 다르면 0, 반대 방향으로 완전히 동일하면 -1이다.
    • 결정계수(coefficient of determination) = r^2 : X 로부터 Y 를 예측할 수 있는 정도
    • np.triu()   #매트릭스를 상삼각행렬로 만드는 넘파이 math
    • np.ones_like(x)   #x와 크기만 같은 1로 이루어진 array 생성, 즉 코릴레이션 개수만큼 1로 채워진 배열 생성
    • mask = np.triu(np.ones_like(corr))   #np.ones_like로 히트맵의 마스크 값을 구하고 triu로 상삼각행렬로 만든다
    • sns.heatmap(corr, cmap='coolwarm', annot=True, mask=mask)  #annot=True는 뭐지? #mask = mask에서 전자의 mask는 히트맵의 어트리뷰트이고 후자의 mask는 앞서 정의한 변수 #cmap=”coolwarm” 히트맵은 다양한 컬러맵을 지원하는데 쿨웜이 가장 직관적 #히트맵은 -1~1사이의 값을 가지게 된다.
    • corr.shape, mask.shape   #(행, 열)
출처: 멋쟁이 사자처럼 AI스쿨 7기 박조은 강사님 강의록

'Python > 멋사_AIS7' 카테고리의 다른 글

Day 12~13  (0) 2022.10.04
Day 10  (0) 2022.09.27
Day 06  (1) 2022.09.22
Day 05  (1) 2022.09.21
Day 04  (0) 2022.09.20