seaborn에서 제공하는 diamonds 실습 데이터를 이용해서 선형회귀분석의 기본 가정을 확인하고 실제 회귀식을 적합해본다.
💎 다이아몬드 데이터
- Format: A data frame with 53940 rows and 10 variables:
- price: price in US dollars ($326--$18,823)
- carat: weight of the diamond (0.2--5.01)
- cut: quality of the cut (Fair, Good, Very Good, Premium, Ideal)
- color: diamond colour, from D (best) to J (worst)
- clarity: a measurement of how clear the diamond is (I1 (worst), SI2, SI1, VS2, VS1, VVS2, VVS1, IF (best))
- x: length in mm (0--10.74)
- y: width in mm (0--58.9)
- z: depth in mm (0--31.8)
- depth: total depth percentage = z / mean(x, y) = 2 * z / (x + y) (43--79)
- table: width of top of diamond relative to widest point (43--95)
1. 분석 목표 설정
- 다이아몬드의 가격(price)에 영향을 미치는 요인을 살펴본다.
- 선형회귀분석을 적용하고 회귀계수의 절대값 크기로 영향도를 판단한다.
2. 탐색적 데이터분석(EDA)
3. 전처리
- 결측치는 존재하지 않음
- 가격 데이터에 극단적인 값이 보이나, 다이아몬드의 경우 품질별 가격 편차가 큰 점을 감안하여 이상치로 보지 않기로 결정
- categorical자료는 서열척도로 범주에 위계가 존재하여 LabelEncoding 대신 상위 범주에 높은 값을 매핑해줌
- 변수별 측정 단위가 다른 점을 감안하여 수치형 변수를 표준편차표준화(StandardScaler) 적용
- 전처리 결과
4. 선형회귀 가정 확인
-
선형성
- 종속변수 price와 타 변수의 선형 상관관계를 살펴보면 carat, x, y, z 변수와 강한 선형 상관관계가 확인
- 그런데 carat과 x, y, z 변수도 강한 선형 상관관계를 보임
- table, depth 변수는 수치형 변수임에도 불구하고 종속변수 price와 선형 관계를 보이지 않으므로 변수에서 제거 결정
- carat 변수를 모델에서 제거하여 변수 간 다중공선성 문제를 해소
-
정규성
- 단순선형회귀 적합 후 잔차에 대하여 shapiro검정과 kolmonorov-smirnov 검정 수행
- 잔차가 정규성을 따른다는 귀무가설 하에서 두 검정 모두 극도록 낮은 p_value를 반환하며 귀무가설을 기각
(표본의 크기가 매우 큰 경우에는 검정의 민감도가 높아져 정규성을 조금만 따르지 않아도 귀무가설이 기각될 수 있음)
-
등분산성
-
독립성
- Durbin-Watson 값은 약 0.3으로 잔차가 양의 상관관계를 갖는 것으로 확인됨
-
회귀계수 추정 결과
- 놀랍게도 모든 회귀계수의 p-value가 0.05 미만으로 통계적으로 유의미하게 나오는데 그 이유는 std_err에서 확인할 수 있다.
- std_err는 모분산(표본분산)을 표본의 수로 나눈 값으로 표현할 수 있는데, 표본의 크기가 매우 크면 이 std_err가 극히 낮아지는 것이다.
- 즉 정규성, 등분산성, 독립성을 위반한 상태로 회귀직선을 구하였으나 표본의 크기가 워낙 커 선형으로는 현재 추정한 회귀식이 데이터를 잘 설명한다고 말할 수 있는 것이다.
(선형 회귀모형이 본 데이터를 가장 잘 설명한다는 것은 아니다!)