이번 주는 실전 데이터분석가가 되었다 생각하고 해보자
탐색적 데이터 분석
K-Means를 이용한 회원 데이터 클러스터링
결정트리 decision tree
할것임
탐색적 데이터 분석
데이터 파일을 유기적으로 분석
어떤 선을 기준으로 데이터가 연결될 수도 있다. 그래서 데이터를 파일이 나눠져있다 해서 따로 분석하는 게 아니라 합쳐서 유기적으로 분석한다. 이걸 해볼거임
어떤 걸 기준으로 데이터를 결합하는걸 Join이라함 (sql그건가)
join
left join (idee는 sql그거랑 똑같음)
pd.merge(left = DF1, right = DF2, how = 'left', on = '이름')
가설세우기
이용량을 토대로 어떤 정보를 알아낼 수 있을지 알아보기
고객의 행동을 예측해보자
회귀로만 예측하는 게 아니라 고객의 특성을 그룹화해서 이렇게 행동하겠구나 하고 직관적 파악 가능
어떻게 특성대로 그룹화할 수 있을까?
이전 시간에 탐색적 데이터 분석으로 customer_join을 만들었다.
클러스터링에 쓸 데이터는 use_log와 customer join
이걸 토대로 고객 데이터를 그룹화해보자.
정규고객/비정규고객 등 다양한 특성을 기준으로 여러 그룹으로 묶어보자.
이 기초과정이 클러스터링 - 비지도학습
지도학습 - 지금까지 해왔던 영화장르 분류, 회귀 등 이런 건 학습시킬 때 정답을 알려줬었음.
비지도학습 - 클러스터링은 정답을 알려주지 않는다. 패턴과 구조를 학습하라고 시키는거고 분류가 목적. 군집화라고 보면 된다.
k-means클러스터링을 할 거임
k는 그룹의 개수. k-means에서 means는 평균. 그래서 개수와 평균을 이용해서 그룹을 만들어나가는 알고리즘이다.
1) 군집의 개수 설정(k)
몇개의 그룹까지 나눠보라고 k-means에게 요구
2) 초기 중심점 설정
영어로는 centroid라 하며 무게중심을 뜻함. 초기 중심점으로 어떤 값을 설정하냐에 따라 성능이 크게 달라진다.
i) 랜덤설정
ii) 수동설정
iii) K-means++ 알고리즘으로 설정
3) 데이터를 군집에 할당(배정)
거리상 가장 가까운 중심점으로 주어진 모든 데이터를 할당함
4) 중심점 재설정(갱신)
모든 데이터의 군집배정이 끝나면 중심점을 그 군집에 속하는 데이터들의 가장 평균지점으로 재설정
5) 데이터를 군집에 재할당(배정) - 중심점의 위치가 변하지 않을 때까지
3)과 똑같이 시행후, 중심점이 바뀌지 않을 때까지 4)와 5)를 반복시행
고객별 월별 이용량의 평균값, 중간값, 최대값, 최소값, 그리고 회원기간의 특성을 이용해 그룹화해보자.
k는 4개로 할것
여러 방식으로 해봐도됨. 여기서는 4개가 명확하게 나뉠 것같아서 그렇게 지정.
다른 값보다 회원기간이 숫자가 압도적으로 큼. 이런 경우에는 기계가 회원 기간 중심으로 클러스터링을 할것이므로 StandardScaler로 정규화를 통한 보정이 필요함.
클러스터링 시각화
준비과정
mean, median, max, min, period
를 토대로 시각화를 해야함. 특성이 5개인데 그래프 어떻게 그림?
시각화 하려면 편한 방법은 이 5개따리 변수를 2개짜리로 줄이는 방법이 있다. --> 차원축소 (dimensionality reduction)
이걸 구현하기 위한 방법이 주성분 분석.
특성이 5개가 있는데 3개를 삭제시키는 게 아니라 다섯개의 특성을 온전히 가진 2개의 변수를 만들겠다는 것. 중요한 부분만 축약시켜서 두 개의 변수로 하겠다는 것. 변수의 특성은 그대로 유지한 채로 변수의 수만 줄이겠다는 것. 그래서 데이터 자체가 가진 고유한 특성은 남는다.
어떤 이용자가 과거 행동 데이터를 이용해서 다음 달에는 몇 회 이용할지 예측해보자.
학습을 시켜야함. 이미 갖고있는 6개월의 데이터를 토대로 학습데이터를 만들것임.
학습데이터 구성
x데이터 y데이터
2018년 4, 5, 6, 7, 8, 9월 -> 2018년 10월 예측
2018년 5, 6, 7, 8, 9, 10월 -> 2018년 11월 예측
2018년 6, 7, 8, 9, 10, 11월 -> 2018년 12월 예측
2018년 7, 8, 9, 10, 11, 12월 -> 2019년 1월 예측
2018년 8, 9, 10, 11, 12, 1월 -> 2019년 2월 예측
2018년 9, 10, 11, 12, 1, 2월 -> 2019년 3월 예측
회원탈퇴 예측
customer_join과 use_log_months를 사용
탈퇴를 결심한 달과 탈퇴를 결심하기 한 달 전 데이터만 x데이터로 활용
지난 번에 봤을 땐 탈퇴하는 사람들이 짧게 이용하고 탈퇴하는 경우가 많았다. 이 데이터도 이용해보자. 6개월 전의 데이터는 예측에 사용하기 어려움. 그래서 탈퇴를 결심한 달과 그 한 달 전, 두 달간의 이력으로 예측해볼 것.
end_date값이 2018년 11월 30일 이면 이미 10월에 탈퇴를 신청했다는 뜻. 이런 경우에는 11월 데이터를 사용치 않고 9월과 10월 데이터만 사용.
x값 - 탈퇴신청(end_date -1), 탈퇴신청 전 달(end_date - 2)
y값 - is_deleted (0 or 1)
데이터 가공
회원이 탈퇴한 회원인지 아닌지 보자
그래서 이렇게 이용한 회원은 탈퇴하고 저렇게 이용한 회원은 탈퇴하지 않는다는걸 기계한테 학습
결정트리 Decision Tree
(의사결정나무)
결정과정을 통해 예측
스무고개와 같은 원리 여러 질문 후 패턴 예측 - 아키네이터?
사이킷런에서는 DecisionTreeClassifier()로 사용
객체 생성하고 fit하면 학습 가능
max depth - 결정과정의 깊이 (질문 개수)
random_state = 0으로 하면 어디서 하든 결과가 똑같아짐. 랜덤을 없애서
훈련, 테스트모델 차이나는 걸(과적합) 어떻게 예방하나?
정확도를 올리기 위한 또다른 방법에 대해 알아보자.
파라미터 변경 (depth값 제한)
트리의 깊이가 깊어진다 --> 훈련데이터에 대해 깊게 학습한다는 뜻. 그러면 훈련데이터에서 벗어난 생각을 하지 않음. 그런데 트리의 깊이를 얕게 함.
정확도 높이기 - 변수 추가
어떻게 하면 정확도를 상승시킬 수 있을까? - 유저가 몇달동안 회원으로 있었는지 변수 추가 (단골고객)
머신러닝 모델을 평가하는 다양한 지표
이전에는 그냥 정확도accuracy만 가지고 했는데 F1 score도 해볼것임
precision, recall
pdf파일 마지막 강의 표 참고
실제 정답 true 예측 결과도 true --> True Positive(TP)
실제 정답 true 예측 결과는 False --> False Negative(FN)
실제 정답 False 예측 결과도 False --> True Negative(TN)
실제 정답 False 예측 결과는 true --> False Positive(FP)
볼드처리된 것 --> 맞춘 것
나머지 --> 틀린 것 --> 정확한 결과 도출 못한것.
이걸 토대로 모델 평가
ex)
날씨 - 비오거나 맑거나 두 가지만 있다고 가정
맑은 날씨 - True
비 - False
정밀도 = 어떤 모델이 맑다고 예측했을 때 실제로 맑을 확률
재현율 = 실제정답이 True인 것 중에서 모델이 True라고 예측할 확률
정확도 = 전체 예측한 데이터 중 정답을 맞출 확률
Precision = TP/(TP+FP)
Recall = TP/(TP+FN)
accuracy = (TP + TN) / (TP + FN + FP + TN)
accuracy는 레이블이 불균형할 때 예측하기 적절치 않음.
ex) 100일 동안 3일만 비왔을 때, 이 모델은 100일 내내 맑았다고 예측함. 실제로 정확도는 97%이나 비온 날은 하나도 못맞춤.
이걸 보완하는 게 F1 Score
--> Precision과 Recall와 조화평균
레이블이 불균형할 때 사용