본문 바로가기

개념 이론 수학

[DataAnalysis] EDA (Exploratory Data Analysis) -탐색적 데이터 분석

EDA
원본데이터(Raw Data)를 탐색하는 방법, 분석하기전 전체적인 테이터의 '견적'을 내는 분석

시각화 (Data Visualization)을 통해 패턴을 찾고, 데이터의 특이성을 발견하여(데이터전처리). 통계와 그래픽을 통해 가설을 결정하는과정을 포함한다. 

 

 

EDA의 방법

  1. Non-Graphic
    1. 연속형 데이터 (Numeric Data) : 숫자형 데이터는 샘플데이터의 분포를 확인하는 것이 주 목적. 주로 Summary Statistics를 활용함.
      1. Center (평균값 Mean, 중앙값 Median, 최빈값 Mode)
        • df.mean()
        • df.median()
        • df.mode() 
      2. Spread (분산 Variance, 표준편차 SD(Standard Deafness), 사분위 IQR, 범위 Range)
        • df.describe() >>> df.describe(include='all') 옵션값으로 'all'을 주면 카테고리컬 문자형 정보까지 표현해준다.
        • df.var()>> 분산을 계산.
        • df.std() >> columns 기반의 표준편차(Standard Deviation)를 보여준다.
        • df.quantile() >> 괄호 안에 0~1사이의 값(Q1= 0.25 /Q2= 0.5 / Q3= 0.75)을 넣으면 분위수를 계산해줌
        • df.percenrile() >> 0과 100사이의 값을 넣으면 백분위수를 계산해줌
          df.min()
        • df.max()
        • df.abs()
      3. Modality 양상 (최고치 Peak)
        • df.nlargest (n, '정렬할column name', key='first')
          >>정렬할column 리스트에서 가장 큰수 n개를 목록의 위에서부터(기본값) 도출함 
        • df.nsmallest (n, '정렬할column name', key='last')
          >>정렬할column 리스트에서 가장 작은수 n개를 목록의 아래에서 부터 도출함 (key='all' 일때는 중복값 삭제 안함.)
          [in:1]
          df.nsmallest(3, ['population', 'GDP'])
          [out:1]
                    population  GDP alpha-2
          Tuvalu         11300   38      TV
          Anguilla       11300  311      AI
          Nauru         337000  182      NR
          
          [in:2] 
          df[df['Year'] >= 2016]['Total_sales'].nlargest(10)
          #in:2 와 같이 조건부를 걸어도 작동이 가능하다.
      4. Shape (Tail, 비대칭도 Skewness, 첨도(도수분포의 뾰족한 정도)  Kurtosis)
        • df.shape() 
        • skew(df)
        • Kurtosis(df, fisher=True)
          from scipy.stats import skew, kurtosis
          
          # 왜도
          skew(data)
          - 확률분포의 뾰족한 정도.
          - 정규분포 = 첨도 0(Pearson 첨도 = 3)
          - 위로 뾰족함 = 첨도 > 0(Pearson 첨도 >3)
          - 아래로 뾰족함 = 첨도 < 0 (Pearson 첨도 < 3)
          
          # 첨도
          kurtosis(data, fisher=True)
          * Fisher = True 
          - 첨도 기준이 Fisher (normal ==> 0.0) 이다.
          - 정규분포의 첨도 = 0이다. 
          * Fisher = False
          - 첨도 기준이 Pearson (normal ==> 3.0)
          - 정규분포의 첨도 = 3이다.
          
           ​
      5. Outliers (평균치에서 크게 벗어나 다른 대상들과 확연히 구분되는 표본)
      6. Tabulation
    2. 범주형 데이터 (Categorical Data)
      1. Occurence
        • df.count()
        • df.unique() >> 유일한 값 찾기 / 데이터 내 값들을 목록화 시켜서 보여준다. 
      2. Frequency
        • df.value_counts() >> 각각의 유일한 값 별로 개수 세기 (시리즈types에 적합)
        • df.size() 
      3. Tabulation : 범주형 변수의 요인별로 교차분석
        • pd.crosstab(index가될 요인명, columns가 될 요인명)
          [#Data]
              fac_1   fac_2    id
          0     a       d       id1
          1     a       d       id1
          2     a       d       id1
          3     b       c       id2
          4     b       c       id2
          5     b       d       id3
          ==============================================
          [In:1]
          pd.crosstab(data.fac_1, data.fac_2)
          
          [Out:1]
          fac_2  c  d
          fac_1     
          a      0  3
          b      2  1
          
          [In:2]
          pd.crosstab(data.id, data.fac_1)
          
          [Out:2]
          fac_1  a  b
          id        
          id1    3  0
          id2    0  2
          id3    0  1
          -----------------------------------------------------
          #하나이상의 index를 multi-level로 교차표 만드는 방법
          [In:1]
          pd.crosstab(data.id, [data.fac_1, data.fac_2])
          
          [Out:2]
          fac_1  a  b  
          fac_2  d  c  d
          id           
          id1    3  0  0
          id2    0  2  0
          id3    0  0  1
          
          [In:2] 
          pd.crosstab([data.fac_1, data.fac_2], data.id)
          
          [Out:2]
          id           id1  id2  id3
          fac_1 fac_2              
          a     d        3    0    0
          b     c        0    2    0
                d        0    0    1
          --------------------------------------------------------
          #교차표의 row/column의 합 추가 하기 위해서는 옵션값에 margins=True 부여
          [In:1] 
          pd.crosstab(data.id, [data.fac_1, data.fac_2], margins=True)
          
          [Out:1]
          fac_1  a  b    All
          fac_2  d  c  d   
          id               
          id1    3  0  0   3
          id2    0  2  0   2
          id3    0  0  1   1
          All    3  2  1   6
          -------------------------------------------------------
          #구성 비율로 교차표를 만들기위해서는 옵션값에 normalize=True 부여
          [In:1] 
          pd.crosstab(data.id, [data.fac_1, data.fac_2], normalize=True)
          
          [Out:1]
          fac_1    a         b         
          fac_2    d         c         d
          id                           
          id1    0.5  0.000000  0.000000
          id2    0.0  0.333333  0.000000
          id3    0.0  0.000000  0.166667
  2. Graphic 
    1. 단일 변수 그래픽
      1. Histogram
        • plot.hist
        • plot.kde / sns.kdeplot
          (커널 밀도 추정(KDE: Kernel Density Estimator)히스토그램을 부드럽게 곡선화 시키는 그래프
      2. Pie chart
        •  plot.pie
      3. Stem-leaf plot
      4. Boxplot
        • plot.box
      5. QQplot
        >> 데이터의 분포와 이론상의 분포가 일치하는지 확인하는 방법
        >> skrewness확인 및 normality test
        >>결과가 선형 상에서 삐뚤게 나타나면, normal dist를 따르지 않고, 따르면 normal dist라고 생각해도 됨
    2. 멀티 변수 그래픽 
      1. Category & Numeric
        1. Boxplots
        2. Stacked bar
        3. Parallel Coordinate
        4. Heatmap = sns.heatmap(df)
          • 주로 crosstab의 데이터를 확인하는데 사용한다.
          • 주로 pivot-table의 데이터를 가지고 사용한다
            ax=sns.heatmap(df, vmin=100,				#최소값
            					vmax=700, 				#최대값
                                cbar=True, 				#colorbar의 유무
                                center=400 				#중앙값 선정
                                linewidthd=0.5			#cell 사이 선의 굵기
                                annot= True, fmt="d", 	#각 cell의 값 표기, 그 값의 데이터 타입 설정
                                cmap='Blues') 			#히트맵의 색 설정​
            sns 컬러 참조 >> https://chrisalbon.com/python/data_visualization/seaborn_color_palettes/
      2. Numeric & Numeric :
        1. Scatter Plot
          •  plot.scatter