220926 0105번파일 : 추상화된 도구를 사용하여 기술통계 그래프 그리기(판다스프로파일링, 스윗비즈, 오토비즈) / 0106번 파일 : 수치형 데이터의 기술통계 (1개 수치변수 plot, 2개 이상 수치변수 plot) (seaborn, 추상화, pandas-profiling, sweetviz, autoviz, 범주형 데이터, 수치형 데이터, 결측치, 기술통계, skewness, 왜도, kurtosis, 첨도, plot 종류, 상관분석 등)
멋쟁이 사자처럼 AI스쿨 7기, 박조은 강사님 강의
들어가기 전
- ctrl+/ 주석 추가. 꼭 외우기!
- 📌 https://seaborn.pydata.org/ 에서 튜토리얼 들어가면 plot들 구분 자료 찾을 수 있다.
파이썬 데이터 분석 기초
- 기본 EDA 이해하기
- 추상화된 도구를 통한 기술 통계 구하기 : Pandas-profiling, sweetviz, autoviz
- 범주형 데이터의 기초 기술통계
- 수치형 데이터의 기초 기술통계
- 기술통계, 데이터 색인, 원하는 데이터 찾기, 빈도수 구하기와 집계
✅ 0105 실습 파일 - 기술통계
- 라이브러리 로드
import pandas as pd # 데이터 분석을 위한 도구
import numpy as np # 수치 계산을 위한 다차원 배열을 다룰 수 있게 해준다.
import seaborn as sns # 데이터 시각화 도구 - 데이터셋 불러오기
df = sns.load_dataset("mpg") # seaborn의 데이터셋을 로드하는데, ()하면 어떤 데이터셋을 불러올까. mpg는 mile per gallon. 한 갤런 당 몇 마일을 가느냐.
df.shape #출력하면 (398,9)가 나오는데, 398개의 행과 9개의 변수. - 데이터셋 일부만 가져오기
df.head() # df.iloc[:5]와 같다.
df.tail() # df.iloc[-5:]와 같다.
df.sample() # 랜덤하게 데이터 하나를 가져온다.
Pandas Profiling
- 실린더와 mpg 파일의 차이 : 범주형데이터와 수치형데이터
- Q. distinct는 판다스의 어떤 값과 같나? 유니크값
- Extreme value는 이상치 값을 볼 수 있다.
- Q. 분포가 한 쪽에 몰려 있고, 뾰족한 히스토그램은 어떤 변수가 있을까? kurtosis를 통해 skewness 첨도를 알 수 있다. model_year에서는 kurtosis는 -값. 완만하게 뾰족함. skewness도 0에 가까운 값
- Q. interaction을 통해서 어떤 정보를 볼 수 있을까? 상관관계 mpg와 weight는 음의 상관관계
- interactions 메뉴에는 name 과 cylinder 값이 없는데, 범주형 자료라서 그렇다.
- correlations 스피어만 상관계수, 피어슨 상관계수 등등. 토글 누르면 각 상관계수 설명도 같이 볼 수 있다.
- 앤스컴스 콰르텟 데이터를 통해서 correlation 값 구한 적 있다.
- Q.판다스에서 코릴레이션 값을 구할 때, 어떤 기본 값을 사용했는지? 피어슨 상관계수
- missing values: 오버뷰에서 미싱값 6개, 전체 비율 중 미싱값. dendrogram에서 horsepower에 결측치가 있다 확인 가능
- sample : 앞에서 10개, 뒤에서 10개. head, tail 찍어보는 것을 판다스 프로파일링을 통해 구해볼 수 있다.
sweetviz
- horsepower에 결측치 색이 칠해져 있다.
판다스 프로파일링과 차이?
autuviz
- bokeh로 시각화 해주는 추상화된 도구 이름? autoviz
- cat plot : weight와 mpg를(수치형변수) y축에 넣고 그리면 단점은 x축에 무슨 값이 있는지 확인이 안된다. x축의 범위를 적절히 쪼개야 할 것 같다. Q. 적절히 쪼갠 그래프가 무엇일까? 히스토그램
- x축 오리진, y축 mpg. y축은 mpg의 어떤 값일까? average값을 표현
- 바이올린 플롯: 박스플롯 있음. 흰 것은 중앙값
- pannel : 을 마주보고 그린 것이 바이올린 플롯
- 히트맵 : -1에서 1 사이의 값
- pair 플롯 : 개별 관측치 값을 표현해 볼 수 있다. 나는 x축과 y축을 둘다 mpg로 뒀는데, 자기 자신이라서 우상향 직선으로 그려짐.
- 추상화된 도구를 사용하면, 번거로운 과정을 줄이고 한 번에 기술통계 그래프를 그릴 수 있다. 수치형 데이터일 때는 scatterplot이 더 적절하다.(weight, mpg)
✅ 0106 실습 파일 - EDA 수치형 변수
추상화된 도구를 사용하게 되면 단점?
놓치지 않기 위해 그래프를 그리지만, 놓칠 수 있는 부분이 발생하기도 함. 미세한 컨트롤이 불가능. 버전 호환성 이슈.
결정적인 이유는 report는 대용량 데이터에 사용할 수 없다. 큰 용량 데이터로 리포트를 출력하려고 할 때 오래 걸린다.
1. 라이브러리 로드
import matplotlib.pylot as plt # plt는 pylot의 준말, 수학적 연산을 그래프로 표현해 준 라이브러리
2. 요약하기
df.info() # 앤스컴 데이터셋은 44개, 이것은 398개로 조금 더 많음. 퀴즈에 나왔는데, 똑같이 info에 관한 설명을 옮기자면 전체 데이터프레임에 대한 정보를 출력해주는 기능. 행과 열의 갯수, 인덱스 값의 범위, 전체 컬럼명, 데이터의 타입, 결측치를 제외한 빈도수, 메모리 사용량 등의 정보를 볼 수 있다.
결측치 보기
- df.isnull().sum() # 결측치에 sum을 하게 되면 결측치를 찾을 수 있다. horsepower에 결측치 6개
- 결측치의 비율을 구하려면 : df.isnull().mean() #df.isnull().mean() * 100 하면 결측치에 대한 비율을 구할 수 있다. horseposwer의 비율 값은 0.015075. 판다스 프로파일링에서 2프로로 나온 비율은 1.5가 반올림 되서 그렇다.
- len(df), df.shape()는 398로 똑같이 나와서 sum처럼 나눠줘도 된다. 하지만 df.count()는 nan 값은 제외하고 구하기 때문에 값이 다르게 나온다.
- 결측치 값에 대한 시각화
plt.figure(figsize=(12,8))
sns.heatmap(df.isnull(), cmap="gray") # cmap은 color map. gray와 같은 색상은 다 외울 필요 없다. plt.colormaps()하면 된다.
기술통계 보기
- df.describe()
- df.describe(include="object") # 범주형 데이터의 기술통계값
- cylinder를 범주형 데이터 값으로 보고 싶을 때 : 두 개 변수를 넣고 싶으면 대괄호 2개. 그 이유는 판다스 기초나 데이터 사이언스 개요에서 보면 됨. 판다스 sheet 에도 있는데, 변수가 3개가 되어도 대괄호는 2개. 이유는) 데이터프레임은 2차원 형태. 대괄호 2개로 묶어줌. 데이터가 한개라도 대괄호 두 개로 묶어주면 데이터프레임 형식으로 출력됨. df[["cylinders", "model_year"]].astype(str).describe()
수치형 변수
- 수치형 변수 mpg의 unique 값 보기 : df["mpg].unique()
- 전체 수치변수에 대한 히스토그램 그리기
df.hist(figsize=(12,10), bins = 50)
plt.show() # 이 코드를 넣어주면 로그 제외하고 볼 수 있음.
비대칭도(왜도) Skewness
- 양수, 음수, 정의되지 않을 수 있음.
- 음수(Negative Skew), 확률밀도함수의 왼쪽으로 긴 꼬리, 중앙값 포함 오른쪽에 더 많이 분포
- 양수(Positive Skew), 확률밀도함수의 오른쪽으로 긴 꼬리, 중앙값 포함 왼쪽에 더 많이 분포
백퍼 양수 음수 그림이 어떤지 헤깔릴 것 같다 - 평균과 중앙값이 같으면 왜도는 0
- df.skew() : 나머지는 1 이하인데, horsepower가 1.087로 가장 큰 값.
- df.skew().sort_values() # skew 값 정렬
첨도 kurtosis
- 그래프의 뾰족한 정도. 중심에 얼마나 몰려있는지. 첨도값(K)가 < 3 이면 뾰족, k>3이면 완만
- 0에 가까울수록 normal. 정규분포에 가깝다. (피셔 기준. 통계학자마다 차이가 나서 3 기준으로 잡기도 함)
- __df.kurt().sort_values(ascending=False) # 역순으로 정렬도 가능.
- acceleration이 0에 가까워서 가장 정규분포에 가깝다.
1개의 수치변수
displot, kdeplot
sns.displot(data=df, kde=True)
- displot을 통해 히스토그램과 kdeplot 그림
- hist는 빈도, kde는 밀도 == 적분했을 때 1이 되는 값
- kde를 서브 플롯으로 그리게 해주는 것이 displot이다.
- 위 hist()로 히스토그램을 그린 것과 다르게 x축을 공유한다.
sns.displot(data=df, x="mpg", kde=True, hue="origin", col="origin", bins=50)
- hue는 그룹바이 기능이랑 비슷하다. 범주형 변수에 따라 색을 다르게 해줌.
- col은 서브플롯을 생성해줌
- kde로 표시 할 것이냐, 말 것이냐. False는 kde를 그리지 않는다로 해서 히스토그램만 나오고 선 그래프는 나오지 않는다.
kdeplot, rugplot으로 밀도함수 표현하기
sns.kdeplot(data=df, x="mpg")
sns.rugplot(data=df, x="mpg")
- 카펫의 실처럼 데이터가 있는 부분에 실이 나와 있다. rugplot
skew, kurt 값 구하기
df["mpg"].agg(["skew", "kurt", "mean", "median"])
boxplot
sns.boxplot(data=df, x="mpg")
mpg의 기술통계값
df["mpg"].describe()
앤스컴콰르텟에서 한 적 있음.
violinplot
하얀색 점은 중앙값, 박스플롯
boxplot, kdeplot, violinplot, 스케일링
박스 플롯으로 전체 변수를 시각화하려면, sns.boxplot(data=df)
바이올린 플롯으로 전체 변수.
- autoviz로 그린 것과 무슨 차이일까 : 스케일링의 차이. 한꺼번에 모아서 그리려니 축 스케일링 값이 다 다르기 때문에 안 보이는 그래프가 많다.
- 스케일링 하는 방법
df_std = (df_num - df_num.mean()) / df_num.std() - df.std() 는 전체 변수의 표준편차
df_num = df.select_dtypes(include="number") 이해 못함- (관측치 - 평균) / 표준편차 : normalization 한다.
- sns.violinplot(data=df_std)로 하면 중앙값이 0에 가깞게 플롯들이 그려짐.
2개 이상의 수치 변수
1개 이상의 수치변수를 그리는 그래프를 보니까, 축 하나가 mpg면 다른 축 하나는 count나 density 같이 그래프 특성의 값이 나오는구나. 박스 플롯도 mpg 값에 대한 사분위값, 중앙값 등을 나타내는 거고!
2개 이상의 수치 변수 비교는 말 그래도 x축과 y축에 변수를 바꿔가면서 비교하는거고!
scatterplot
x축은 mpg, y축은 horsepower
scatterplot은 relplot(relational, 관계형변수)에 속하는 plot.
회귀 시각화 regplot
x축을 mpg, y축을 horsepower로 하면 음의 상관관계를 가지는 점들이 찍혀있으면서 직선이 그려진다.
잔차 시각화 residplot
regplot의 직선이 resid의 0축이 되었다.
- 회귀선의 잔차를 시각화
- resid는 잔차를 나타내게됨
residplot은 어디에 속하는거지? lmplot, relplot, displot, catplot 중에서
lmplot
lmplot을 통해 범주값에 따라 색상, 서브플롯 그리기
- regplot은 hue가 없어서 값을 구분해서 그리기 쉽지 않음.
- lmplot은 hue가 있어서 변수에 따라 서브 플롯을 그려볼 수 있다.
- lmplot 안에 속한게 regplot
jointplot
2개의 수치변수 표현하기
- kind로 kde나 hex 표현 가능
sns.jointplot(data=df, x="mpg", y="horsepower", kind="hex")
pairplot
pairplot은 시간이 오래 걸리기 때문에 일부 샘플을 추출해 그려보고 샘플의 수를 늘려가며 그리는 것을 추천.
sns.pairplot(data=df.sample(100))
- 히스토그램으로 나오지만, hue로 빼게 되면 구분이 잘 안되기 때문에 kde 형태로 색상별로 다르게 나오게 한다.
- 여러 변수에 대해 짝을 지어서 출력해줌
- hue를 넣어 origin 값에 따라 다른 색상을 넣어줄 수 있다.
lineplot
model_year, mpg를 x축, y축으로 시각화
선과 상관계수 범위가 같이 그려진다.
- relplot과 lineplot의 차이는 regplot과 lmplot의 차이와 비슷하다.
- relplot으로 범주형 변수에 따라 서브플롯
- sns.relplot(data=df, x="model_year", y="mpg", kind="line") # kind 옵션을 통해 선그래프를 그린다.
- sns.relplot(data=df, x="model_year", y="mpg", hue="origin", col="origin", kind="line", ci=None)
- ci=None하면 신뢰구간을 표시하지 않고, 그림자를 표시하지 않고 선 그래프만 출력.
상관분석
상관계수는 두 변수간의 연관된 정도를 나타낼 뿐, 인과관계를 설명하는 것은 아니다.
- 피어슨 상관계수 : 완전 동일 +1 / 전혀 다르면 0 / 반대방향으로 동일하면 -1
- df.corr()
- np.triu는 상삼각행렬을 만들어주는 numpy math : 1과 대각선 마주보는 값을 제거해주기 위해 위쪽이 1이 되고 아랫쪽이 0이 됨.
- np.ones_like(x)는 x와 크기가 같은 1로 이루어진 array를 생성 : 0과 1로 채워줌
- ones_like도 있지만 zeros_like도 있음. corr.shape, mask.shape 비슷하게 나옴.
- mask = np.triu(np.ones_like(corr))
- sns.heatmap(corr, cmap="coolwarm", annot=True, mask=mask)
- 멘토님 답변 내용 : 앞의 mask는 heatmap의 attribute이고, 뒤의 mask는 위에서 변수 정의한 mask. 위 mask에서 값이 1인 부분은 어차피 대칭이기 때문에 가독성을 높여주기 위해서 지워진다 라고 생각하면 된다.
- 대각선은 자기 자신. -1에서 1까지의 값
- anoot=True는 heatmap내 값을 표현해준다.
퀴즈 복습
퀴즈 10문제/10문제
1. 맞았지만 애매한
- 2번 문제 : isnull().mean() : '결측치는 True, False 값을 가지게 되는데, True==1, False==0과 같다. 이 값을 다 더해주면 결측치의 수가 되고, 평균을 구하면 비율이 된다.'
- 3번 문제 : describe()를 통해 알 수 없는 값 : 빈도수, 평균, 표준편차, 최솟값, 1사분위(25%), 2사분위(50%), 3사분위(75%), 최댓값
- 4번 문제 : bins의 개수에 따라 그래프의 모양이 달라지는 것, 도수 분포 정보를 그림으로 나타낸 것 : 히스토그램
- 5번 문제 : 박스 플롯에서 평균은 알 수 없다!
- 6번 문제 : 마찬가지로 바이올린에서도 평균은 알 수 없다!, kdeplot을 마주보고 표현. 밀도추정곡선
- 7번 문제 : lmplot 은 막대그래프로 표현할 수 없다.
해결과제
- seaborn에서는 히스토그램은 수치형, 카운터플롯으로 범주형 빈도를 그려봤다고 했는데, 카운터플롯은 플롯 표에 안보인다. 언제 봤는지 찾아보기
- 앤스컴스콰르텟 데이터에서 correlation값 구한 것 찾아보기
판다스에서 correlation값 구할 때, 피어슨 상관계수를 사용한 건지 보기 - 판다스프로파일링 부분 글이랑 비교 - sweetviz랑 판다스 프로파일링 차이. 다른 동기 TIL 보면서 다시 공부하기
- x축 오리진, y축 mpg. y축은 mpg의 어떤 값일까? average값을 표현 한다는데 autoviz로 다시 그래프 확인하기
- relplot과 lineplot/ regplot과 lmplot 지난주 목요일 발표 자료도 다시 찾아보기
댓글