Day 09
기술통계값을 한 번에 생성해주는 EDA 도구
EDA 파일을 생성해주는 도구가 많지만 문서를 보고 어떤 식으로 내 데이터에 적용해야 하는지 해결해야 한다
- 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로 만든다. 이상치에 민감하며, 분류보다 회귀 모델에 적합하다.

- 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기 박조은 강사님 강의록