7.1.1 놀이공원 데이터 시뮬레이션
랜덤 시드 설정해 관측치에 대한 변수 선언
각 만족도 점수에 영향을 끼치는 고객의 무작위 변수인 halo로 만족도 후광 점수를 시뮬레이션한다.
설문 조사 항목에 각 응답자의 후광 점수를 추가해 만족도 평가에 대한 응답을 생성한다. 이때 floor()를 사용해 연속값을 정수로 변환한다. 그런 다음 해당 범위를 벗어난 값을 대체해 값을 0-100 범위로 제한한다.
다른 영향에 대한 가중치 기여도를 추가한다.
random.normal()을 사용해 임의의 정규 변형을 추가한다.
데이터 포인트를 데이터프레임으로 결합한다.
7.2.1 예비 데이터 검사
=> 그림 7.1 우중앙에 있는 변수가 양의 상관관계가 있는 것으로 보인다는 사실에 주의!
만족도 조사의 경우 응답자들은 각 항목에 대해 독립적으로 평가하지 않았을 수 있다.
그러나 변수가 강하게 연관되어 있으면 통계 모델로 개별 효과를 평가하기 어렵다.
pandas의 corr()과 sns.heatmap()을 사용해 상관관계 구조를 추가로 조사한다.
=> 여러 항목에 대해 상관관계가 매우 강해 문제가 되는 것은 없는 것으로 보이기 때문에 이대로 선형 모델링을 진행해도 괜찮은 것으로 평가된다.
7.2.2 요약: 이변량 연관성
7.2.3 단일 예측자가 있는 선형 모델
전체적인 만족도와 놀이기구 만족도에 관련된 선형 모델을 추정하기 위해 overall~rides 공식을 사용하며, 이는 'overall은 rides에 따라 변함'으로 읽을 수 있다.
=> 가장 중요한 부분은 coef 열의 모델 계수를 보여주는 중간 부분이다. rides의 계수는 1.2887이므로 rides에 대한 각 추가 평가 점수는 overall 점수를 1.2887점 증가시키는 것으로 추정된다.
=> std err 열은 데이터가 더 큰 모집단의 무작위 표본이라는 가정하에 계수 추정치의 불확실성을 나타낸다.
=> t값, p값과 신뢰구간은 계수가 0과 유의하게 다른지 여부를 나타낸다.
절편과 계수는 rides 값에 기반해 응답자의 overall 보고서에 대한 최상의 추정치를 결정하는데 사용할 수 있다.
7.2.4 ols 객체
모델에 기반해 overall을 추정하기 위해 ols 객체의 predict() 메서드를 사용할 수 있다.
위와 마찬가지로 overall~rides에 대한 산점도를 다시 그리면 모델 예측을 사용해 선형 적합선을 추가할 수 있다.
또한 잔차를 검사할 수 있다.
=> 잔차의 범위는 -27.954에서 22.757까지 매우 넓으며, 이는 주어진 데이터 포인트에 대해 예측이 다소 틀릴 수 있음을 의미한다.
히스토그램을 그려 잔차의 대칭을 확인해볼 수 있다.
=> 히스토그램이 대칭에 가깝다는 것은 모델이 편향되지 않았다는 좋은 신호이다.
7.2.5 모델 적합 확인
선형 모델을 데이터에 적합화할 때:
가정1. 예측 변수와 결과 간의 관계가 선형이다.
y가 x^2의 함수인 데이터를 생성한 다음 선형 모델 y~x에 적합화하면 곡선인 점 구름들 사이를 통과하는 직선이 그려진다.
=> x에 대한 적합계수는 -0.1129이고 t-검정은 계수가 0과 유의하게 다르지 않다는 것을 보여준다.
x대 y를 도식화한 다음 도면에 적합선을 그리면 무슨 일이 일어나고 있는지 더 명확하게 볼 수 있다.
가정2. 예측 오차가 정규 분포를 따르고 패턴이 없는 랜덤 노이즈처럼 보인다는 것이다.
모델의 적합화 값 대 잔차를 그려 조사한다.
=> 0에 가까운 y의 값을 과소 예측하고 0에서 멀리 떨어진 것은 과도하게 예측한다.
이럴 경우 해결책은 일반적으로 x를 변환하는 것이다.
만족도 동인 데이터에 대해 유사한 적합화 도면을 생성할 수 있다.
=> 왼쪽 상단 모서리 그림은 적합치 대 잔차를 보여준다. 적합치와 잔차 사이에 명확한 패턴이 없는 것으로 나타나는 것을 보아 잔차가 무작위 오차에 기인한 것이라는 생각과 일치하며, 모델이 합리적이고 명백한 비선형성을 무시하지 않는다는 개념을 뒷받침한다.
=> 왼쪽 아래에 두 번째 그림은 원시 잔차 값을 그리는 대신 잔차 절댓값의 제곱근을 그린다는 점을 제외하고는 첫 번째 그림과 유사하다.
잔차 그림의 일반적인 패턴은 원뿔이나 깔때기이다. 분산성, 즉 적합치가 클수록 점차 커지는 오차 범위는 선에 대한 적합화를 최적화하는 선형 모델 가정을 위반한다.
=> 오른쪽 상단 그림은 정규 QQ 도면이다. 잔차가 정규 분포를 따르는지 여부를 확인하는데 도움을 준다. 모델이 적절할 떄 이러한 점들은 유사하고 대각에 가깝다.
=> 오른쪽 하단 패널 그림은 잠재적 특이치, 즉 다른 분포에서 나올 수 있는 관측치를 식별하는데 도움을 준다. 포인트가 고표준화된 잔차 거리와 모델 레버리지를 기반으로 잠재적으로 문제가 되는 특이치인 경우 자동으로 행 번호로 레이블이 지정된다.
다중 변수 모델을 추정하기 위해 모델을 설명하는 공식을 사용해 ols()를 호출한다.
=> 모델은 모든 만족도 항목을 포함해 예측이 향상됐음을 알 수 있다.
잔차의 대칭여부를 히스토그램을 그려 확인하고, 모델 계수를 조사한다.
각 계수는 다른 예측 변수 값을 조건으로 해당 특징에 대한 만족도와 전체 만족도 간의 관계 강도를 나타낸다.
=> 네 가지 특징 모두 p값, P>|t| <0.05를 통해 통계적으로 유의한 것으로 식별된다.
-도면을 생성해 계수를 시각화하는 것이 더 도움이 된다.
=> 청결에 대한 만족도가 전반적인 만족도와 관련된 가장 중요한 특징으로 추정된다.
7.3.1 모델 비교
R-제곱 값을 비교해 두 모델을 평가할 수 있다.
=> m2가 m1보다 만족도의 변동을 더 많이 설명한다고 말할 수 있다.
그러나 예측 변수가 더 많은 모델은 일반적으로 R-제곱값이 더 높으므로 대신 모델의 예측 변수 수를 제어하는 수정 R-제곱 값을 비교해볼 필요가 있다.
=> 여전히 m2가 전체 만족도의 변동을 더 많이 설명한다는 것을 암시한다.
anova_lm()을 사용해 m2가 m1보다 더 많은 변동을 설명하는지 여부를 알아볼 수 있다.
=> p값이 낮으면 m2의 추가 예측 변수가 모형의 적합도를 크게 향상시킨다는 것을 나타낸다. 따라서 m2이 더 정확한 모델이라고 볼 수 있다.
7.3.2 모델을 사용해 예측하기
모델 계수를 사용해 설명 변수의 다양한 조합에 대한 overall 결과를 예측할 수 있다.
4개의 개별 측면을 각각 100점으로 평가한 고객의 전체 평가를 예측하려면 해당 평가에 계수를 곱하고 절편을 추가할 수 있다.
=> 최적 추정치는 108.024이며, 이는 최고 점수보다 높다. 모든 것을 100점으로 평가하는 사람은 또한 전체적으로 100점을 줄 가능성이 있음을 알 수 있다.
ols.predict()를 사용해 더 효율적으로 모델 예측을 계산할 수 있다.
=> 이를 통해 원하는 범위에 대한 예측을 얻을 수 있다. 이 경우 처음 10명의 고객에 대한 예측을 얻을 수 있다.
7.3.3 예측자 표준화
계수를 비교하려는 경우 모델을 적합화하기 전에 공통 척도로 데이터를 표준화하면 좋다.
가장 일반적인 표준화는 값을 0을 중심으로 표준 편차 단위로 변환하는 것이다. 이는 각 관측치에서 변수의 평균을 뺀 다음 표준 편차(std())로 나누며 Z 점수라고도 한다.
변수의 크기에 대해 걱정하지 않고 상대적인 기여도만 고려한다면, 크기가 조정된 버전의 sat_df를 만들 수 있다.
표준화 후에는 결과를 확인해야 한다. 표준화된 변수는 평균이 0이고 값은 평균으로부터 몇 단위 이내에 있어야 한다. describe()로 확인해볼 수 있다.
=> 단, 이 때 절편이 0이 되어도 제거하면 안된다. 절편은 표준화 후에도 모델에 계속 남아있어야 한다.
모델을 개선하기 위해 주말에 오거나 먼 곳을 여행하는 고객, 혹은 다자녀의 경우 만족도가 서로 다른지 다음 예측 변수를 모델에 추가해 확인해본다.
=> 모델 요약은 적합도(R-제곱)가 크게 향상되었으며, log_dist와 num_child에 대한 계수가 0보다 상당히 큰 것을 보아 더 멀리 여행하고 더 많은 자녀를 둔 사람들이 전반적인 만족도 등급이 더 높다는 것을 알 수 있다.
데이터에 요인이 포함된 경우 데이터 유형에 주의해야 한다.
이 경우 num_child는 0-5 범위의 숫자 변수이지만, 이를 숫자로 취급하는 것이 반드시 의미가 있지는 않다. 따라서 요인으로 변환하고 모델을 재추정한다.
pandas.get_dummies()를 사용해 num_child가 1명을 나타낼 때 1, 그렇지 않으면 0을 나타내는 변수 num_child_1을 생성하고, 마찬가지로 6까지 생성한다.
=> 이제 num_child에 대해 6개의 적합 계수가 있음을 알 수 있다. 그룹에 있는 어린이 수에 관계없이 전반적인 만족도의 증가가 거의 동일하다는 것이 확인된다. 즉, 실제로 각 어린이 수의 증가를 다르게 추정할 필요가 없음을 시사한다.
수식의 변수 간에 : 연산자를 사용해 두 용어의 상호 작용을 포함할 수 있다.
만족도 등급과 방문을 설명하는 두 가지 변수 no_child와 is_weekend 간의 상호 작용을 사용해 새 모델을 만든다.
=> 공원과 has_child 및 weekend의 특징에 대한 등급 사이에 8개의 상호 작용 항이 포함된다. 이러한 상호 작용 중 하나(wait:has_child)만 중요하기 때문에 중요하지 않은 상호 작용은 삭제할 수 있다.
=> 이 결과를 통해 아이들과 함께 공원에 간 그룹으로부터 더 높은 만족도를 예측할 수 있으며, 아이들이 없는 사람들보다 아이들이 있는 사람에서 대기 시간이 더 중요한 예측 변수임을 알 수 있다.
모델에 상호 작용 항을 포함할 때 두 가지 중요한 점:
7.5.1 언어 요약: 고급 수식 구문
7.5.2 주의! 과적합
=> 과적합(overfitting): 너무 많은 변수를 추가하고 덜 정확하거나 부적절한 모델로 끝나는 과정
7.5.3 선형 모델 적합화를 위한 권장 절차