수치형 변수의 탐색적 데이터 분석
1-1. 히스토그램 : 표로 되어 있는 도수 분포를 정보 그림으로 나타낸 것(시각화)
1-2. 도수 분포 : 표본의 다양한 산출 분포를 보여주는 목록, 표, 그래프
도수 분포표에 들어가는 항목은 특정 그룹이나 주기 안에 값이 발생한 빈도, 횟수를 포함하고 있으며 표본 값의 분포를 요약한다.
나이를 10대, 20대, 30대, 40대로 그룹화하게 되면 그룹들의 빈도수를 구할 수 있는데 이렇게 빈도수 등을 나타낸 표를 도수 분포표라고 한다.
그리고 이 표를 시각화한 것이 히스토그램
1-3. 수치형 변수의 unique값, unuique 보기
: df["mpg"].unique() -> mpg 변수의 유일값들을 보여준다. (중복 X)
: df["mpg"].nunique() -> mpg 변수의 유일값의 개수를 보여준다.
1-4. 히스토그램 그리기 : hist()를 사용하면 히스토그램을 그릴 수 있다.
df.hist() : 히스토그램이 그려지긴 하지만 위의 로그때문에 가독성이 떨어진다.
따라서 df.hist()를 따로 변수에 저장해서 출력한다.
A = df.hist() 이렇게 하면 로그가 뜨지 않고 히스토그램만 떠서 가독성이 좋다.
X축 : 값의 범위 / Y축 : 빈도수
hist 안의 figsize는 표의 크기를 정하는 명령어이다.
bins는 막대 개수인데, bins로 값의 범위와 빈도수를 조절할 수 있다.
bins = 10일 때
: 막대의 수가 10개로 적어서 그만큼 범위가 좁고 빈도수도 높은 것을
알 수 있다.
bins = 50일 때
: 막대의 수가 50개로 많아서 그만큼 범위도 높고 빈도수도 적은 것을
알 수 있다.
: 막대의 수가 많아졌을때 연속된 수치 데이터를 잘 볼 수 있다.
ex) bins=10일때는 mpg와 model_year 모두 비슷한 연속된 수치데이터로 보이지만 bins=50일때 비교해보면 model_year는 mpg에 비해 덜 연속적인 것을 알 수 있다.
: skew를 통해 나타낼 수 있다.
df.skew()
: kurt를 통해 나타낼 수 있다.
df.kurt()
4-1. displot : 히스토그램 그래프 출력
sns.displot(data=df, x="mpg") : displot을 통해 히스토그램 그리기
-displot에 kdeplot, rug 옵션 추가
따라서 세개의 옵션을 혼합하여 그래프를 그릴 수 있다.
displot과 kde옵션 사용 -> 히스토그램과 밀도 추정 그래프 출력
4-2. kdeplot : 밀도 추정 그래프 출력
sns.kdeplot(data=df, x="mpg") : kdeplot을 통해 밀도 추정 그래프 시각화
4-3. boxplot : 사분위 값 표현, 이상치 값 표현
sns.boxplot(data=df, x="mpg") : boxplot 그리기
-boxplot의 장점 : 사분위 수를 시각화할 수 있다.
-boxplot의 단점 : 박스 안의 값이 바뀌게 되면 박스 안에 있는 분포를 확인하기 어렵다.
-> 이러한 단점을 보완하기 위해 violinplot을 그린다!
4-4. violinplot : 사분위 수 박스와 함께 전체적인 데이터 분포 표현
sns.violinplot(data=df, x="mpg")
boxplot과 violinplot으로 전체 변수 시각화하기
sns.boxplot(data=df)
sns.violinplot(data=df)
weight가 스케일이 너무 커서 다른 데이터들의 그래프가 제대로 그려지지 않는다.
이럴 때는 각각의 데이터별로 boxplot, violinplot을 그려 파악하는 것이 좋다.
하지만 이렇게 전체 데이터를 시각화했을 때는
각각 데이터 간의 스케일 비교가가능하다는 장점이 있다.
5-1. scatterplot : 산점도 시각화
sns.scatterplot(data=df, x="weight", y="mpg")
분석 : 무게(Weight)가 증가할수록 연비(mpg)는 점점 감소한다.
scatterplot 색상 다르게 하기 : hue 옵션 사용
hue = origin을 하면 국가별로 색상이 나뉘어 값들이 분류된다.
미국은 무게가 무거운 차들이 많이 있다.
일본은 무게가 가벼운 차들이 많다.
5-2.regplot : 회귀선 시각화
sns.regplot(data=df, x="weight", y="mpg")
5-3.residplot : 변수와 회귀선과의 잔차 시각화
sns.residplot(data=df, x="weight", y="mpg")
점선 : 회귀선으로, 기울어진 회귀선을 수평이 되게 해서
얼마나 값들이 회귀선에 떨어져 있는지 시각화
회귀선과 가까운 값들은 거의 0에 수렴한다.
5-4. lmplot : 회귀선 시각화 + 색상별 시각화 + 서브플롯 그리기
② 서브플롯 그리기 (col 옵션 사용)
sns.lmplot(data=df, x="weight", y="mpg", hue="origin", col="origin")
∴ lmplot을 사용하면 scatterplot의 회귀선과 색상표현, 서브플롯을 표현할 수 있다.
5-5. jointplot : scatterplot + 히스토그램 시각화
sns.jointplot(data=df, x="weight", y="mpg")
scatterplot을 그리고 해당되는 변수의 히스토그램을 같이 그려준다.
jointplot에서 kind옵션을 사용하면 그래프를 다르게 그릴 수 있다.
(기본값은 scatterplot)
sns.jointplot(data=df, x="weight", y="mpg", kind="reg")
jointplot으로 regplot을 그려 회귀선과 히스토그램을 시각화했다.
5-6. pairplot : 모든 수치 데이터에 대해 짝을 지어서 시각화해준다.
df_sample = df.sample(100) : 100개만 추출해서 그리기
sns.pairplot(data=df_sample, hue = "origin")
cylinder 데이터는 끊어진 데이터라는 것을 알 수 있어서 범주형 데이터에 가깝다.
양의 상관관계(기울기가 양수) / 음의 상관관계(기울기가 음수)를 알 수 있다.
기울기가 뚜렷하지 않고 상관관계가 명확하지 않은 데이터들도 있다.
* pairplot은 sample을 뽑아서 그린 후 전체 데이터 관계에 대해 파악한 후
자세히 보고 싶은 데이터만 scatterplot 같은 세부 plot으로 그리기!
5-7. lineplot : 선형 그래프 시각화
sns.lineplot(data=df, x="model_year", y="mpg")
model_year에 따라 mpg값이 어떻게 변하는지 선형으로 알 수 있다.
lineplot의 그려지는 값의 기본값은 mean(평균)으로, model_year에 따른
mpg의 평균을 그려준다.
색칠된 영역은 ci로, cofidence interval(신뢰구간)이다.
ci는 샘플링을 해서 구하기 때문에 시간이 오래걸려서 없애는 게 좋다.
: ci = None으로 없앨 수 있다.
sns.lineplot(data=df, x="model_year", y="mpg", ci=None)
5-8. replot : 수치형 변수에 대한 서브플롯 그릴 때 사용
rel : relation의 약자로, 수치 데이터 간의 관계를 표현할 때 쓴다는 의미
기본적으로 scatterplot 형태로 표현된다.
sns.relplot(data=df, x="model_year", y="mpg", hue="origin", col="origin")
이때 kind 옵션을 통해 scatterplot이 아니라 lineplot을 그릴 수 있다.
sns.relplot(data=df, x="model_year", y="mpg", hue="origin", col="origin", kind="line", ci=None)
두 변수간에 선형적, 비선형적 관계를 갖고 있는지를 분석하는 방법
상관관계의 정도를 파악하는 상관계수는 두 변수간의 연관 정도를 나타낼 뿐
인과관계를 설명하는 것은 아니다.
: 인과관계는 회귀분석을 통해 확인할 수 있다.
상관계수
상관계수 구할때 : corr() 사용
df.corr()
: -1~1 사이의 값을 가진다. 대각선은 자기 자신이므로 1의 값을 가진다.
상관계수 시각화할때 : heatmap 사용
: sns.heatmap(df.corr(), annot=True, cmap="coolwarm", vmax=1, vmin=-1)
① annot : 값 표시 (False면 네모 안에 값이 표시가 안 된다.)
② cmap : 박스의 색깔 테마 (print(plt.colormaps()) 에서 테마 종류 알 수 있다.)
③ vmax : 맨 오른쪽 막대의 최댓값
④ vmin : 맨 오른쪽 막대의 최솟값
-> 자기 자신의 값도 나오고 대칭되는 값도 나와서 가독성이 떨어진다.
*가독성이 좋은 heatmap 만들기 (mask 옵션 사용)
1. 먼저, 자기 자신인 대각선 값, 대칭되는 값을 지우기 위해 행렬을 만든다.
2. corr = df.corr() 선언
3. np.ones_like(corr)
(np.ones_like(x) : x와 크기만 같은 1로 이루어진 array 생성)
4. mask = np.triu(np.ones_like(corr)) 선언
(np.triu : matrix를 상삼각행렬로 만드는 numpy math : 그림보고 이해하기)
5. heatmap 그릴 때 mask 옵션에 mask 넣기 (mask = mask)
sns.heatmap(corr, annot=True, cmap="coolwarm", vmax=1, vmin=-1, mask = mask)
자기 자신 값도 없어지고 대칭되는 값도 없어져서 가독성이 좋다.
cylinders와 displacement는 0.95로 1에 가까운 상관계수를 가지고 있어서 양의 상관관계를 가진다.
weight와 mpg는 -1에 가까운 상관계수를 가지고 있어서
음의 상관관계를 가진다.
acceleration과 model_year는 0.29로 가장 0에 가까워서 거의 상관이 없다.