샘플 프로젝트
5.연관 규칙분석을 통한 장바구니 분석 ( 연관규칙분석을 배우는 부분 )
A마트는 지속적인 매출 감소가 매대 진열에 문제가 있다고 판단하였다.
따라서 매대 진열을 다시 기획하고 있다. 서로 잘 팔리는 상품에 대해서는 근접하게 매대에 배치하려고 한다.
고객의 구매 데이터(POS)를 활용해서 같이 팔리는 상품을 확인하고 이를 기반을 레이아웃을 조정하고자 한다.
문제정의
:지속적인 매출 감소
기대효과
:매출 증가,회복
해결방안
:연관규칙분석을 통해서 매대 레이아웃 재배치
성과측정
:매대 레이아웃 개선 전/후 매출 비교
운영
:유의미한 규칙에 의거 매대 레이아웃 설계
-여기 데이터는 보통 알던 데이터와는 다르다
->연관규칙분석 데이터는 그냥 구매한 상품들만 있는게 좋다.
-TransactionEncoder
: 모든 List 값을 Unique하게 만든 후 Col으로 변경, 각각의 Row 마다 동일한 형태로 데이터를 변경함
-apriori 사용한 규칙탐색
#연관 규칙이란?
비지도학습 , 대규모 거래 데이터로부터 함께 구매될 규칙을 도출
특정 상품 구매시 이와 연관성이 높은 상품을 추천하는 것
#Apriori
빈발항목집합을 통해 규칙들을 생성하는 알고리즘
빈발항목집합 -> 최소지지도 이상을 갖는 항목집합
#사용예시
암 데이터에서 빈번이 발생하는 DNA패턴 탐색
마트에서 장바구니 분석을 통해 상품 추천 및 상품 진열
작동원리
1. 전체 Data set에서 빈번하게 발생하는 사건의 유형을 발견
2. 최소지지도 이상을 마족하는 반발항목 집합을 발견
3. 빈발항목으로 집합 생성
4. 2~3단계 반복 수행 , 새로운 빈발항목집합이 생기지 않을때 까지
5. 빈발항목 집합을 활용하여 연관규칙 생성
상위에서 생성한 Rule에 대해, 추가 지표들에 대한 탐색
metric과 threshold 설정 필요
association_rules_df = association_rules(frequent_itemset,
metric='confidence',
min_threshold=0.005)
#support , confidence , lift >> 이 3개는 알아야지 좋음
-support(지지도) : 전체 거래 항목 중 해당 규칙이 나올 확률
:"얼마나 자주 나오는 규칙이냐?"
-confidence(신뢰도) : 조건부확률이라고도 하며 , A의 거래중에서 B가 포함된 거래의 확률
:"기저귀 살때 , 맥주를 같이 살 확률이 높을까?"
-Lift(향상도) : 임의로 B가 나올 확률 대비 A와 B가 같이 나올 확률의 비 ( 신뢰도 / 지지도 )
:"자연스럽게 구매하는 확률보다 높은가?"
#Lift는 1이상이여야 좀 유의미하다
-Lift 기준으로 탐색
-많이 발견되는 규칙 (※ Support)
-무조건 같이 사는 규칙 (※ Confidence) 순서로 분석함
6.고객 Segmentation을 위한 RFM분석 ( Segmentation 기법인 RFM 개념을 학습 )
A사는 오픈마켓 플랫폼을 운영 중이다. 런칭 이후 사용자들이 빠르게 상승하였지만 현재는 정체기에 빠져있다.
현재 서비스 이용 수준이 어떻게 되고 있으며 런칭 이후 어떻게 변해왔는지를 파악하기 위해 다양한 분석을 수행.
문제정의
:런칭 이후 서비스 정체기로 인한 영업이익 , 사용 고객수 감소
기대효과
:정체 원인 파악 및 대응책 수립 및 실행을 통한 영업 이익, 사용 고객수 증가.
해결방안
:구매 데이터 활용 서비스 이용 현황 파악 (지표 기획)
성과측정
:지표 활용 서비스 사용 현황 파악
운영
:지표 활용 데이터 인사이트 리포트 발행
:개발된 지표 활용 대시보드 ( BI tool 활용 ) 개발 후 모니터링 및 이슈확인
-RFM 모델 이란?
:최근성(recency), 구매빈도(frequency),구매금액(monetary)의 3가지 지표들을 통해서 고객 점수 부여 및 등급화
#최근성(recency)을 보기 위한 과정
고객ID별 가장 마지막 구매일
recency_df = df.groupby('CustomerID',as_index=False)['Date'].max()
recency_df.columns = ['CustomerID','LastPurchaseDate']
recency_df.head()
고객의 가장 마지막 구매일로 부터 몇일이 지났는지를 계산하기 위함
recency_df['Recency'] = recency_df['LastPurchaseDate'].apply(lambda x : (df['Date'].max() - x).days)
recency_df.drop(columns=['LastPurchaseDate'],inplace=True)
#최빈성(frequency)을 보기 위한 과정
Customer ID당 유니크한 Invoice를 1개의 주문건으로 인식하여 얼마나 자주 구매하고 있는지를 파악
frequency_df = df.copy()
frequency_df.drop_duplicates(subset=['CustomerID','InvoiceNo'], keep="first", inplace=True)
frequency_df = frequency_df.groupby('CustomerID', as_index=False)['InvoiceNo'].count()
frequency_df.columns = ['CustomerID','Frequency']
frequency_df.head()
#금액 ( Monetary)을 보기 위한 과정
구매금액 = 구매개수 구매단가
df['Total_cost'] = df['UnitPrice'] df['Quantity']
monetary_df=df.groupby('CustomerID',as_index=False)['Total_cost'].sum()
monetary_df.columns = ['CustomerID','Monetary']
monetary_df.head()
#Data merge
#ecency and frequency
rf = recency_df.merge(frequency_df,how='left',on='CustomerID')
#monetary
rfm = rf.merge(monetary_df,how='left',on='CustomerID')
-Min max scale (최대값을 1로 최소값을 0으로 표준화 하는 기법)
#▶ Min max scale = 최대값을 1, 최소값을 0으로 표준화하는 기법
from sklearn.preprocessing import minmax_scale
#▶ 최근성은 숫자가 작을수록, 즉 최근 구매일이 얼마 지나지 않은 고객이 더 점수가 높음
rfm['Recency'] = minmax_scale(rfm['Recency'], axis=0, copy=True)
rfm['Recency'] = 1-rfm['Recency']
rfm['Frequency'] = minmax_scale(rfm['Frequency'], axis=0, copy=True)
rfm['Monetary'] = minmax_scale(rfm['Monetary'], axis=0, copy=True)
#▶ Score
rfm['Score']=rfm['Recency']+rfm['Frequency']+rfm['Monetary']
#▶ Score scaling 100 socre
rfm
-Feature Engineering
:Target 변수와의 의미있는 변수 선택하는 방법
#종류
1. Classification(분류) : bin(통)으로 구분 후 Target 변수와의 관계 파악
2. Regression(회귀) : Target 변수와의 correlation을 확인하거나 bin(통)으로 구분 후 Target 변수와의 관계 파악
-모델링 과정
#데이터 사전준비
모델은 숫자로 이루어진 형태의 Data만 인식 가능 (※ 문자형 변수 인코딩 필요)
모델링을 수행하기 위해 Feature와 예측하고자하는 값인 Y로 데이터를 나눔
학습과 예측을 위한 Train / Test set 분할
Categorical value 인코딩
#Model Selection (Regression)
선형회귀 모델 (Ridge, Lasso, Elastic Net)
비선형회귀 모델 (polynomial, log모형)
*Tree 계열 Regression 모델
#Model 학습
Model Selection 단계에서 선정한 모델들을 학습하고 성능을 기록
동일한 Data set, 동일한 환경에서 동일한 비교 지표로 성능을 비교
#RandomForest
from sklearn.ensemble import RandomForestRegressor
from sklearn import metrics
rfc = RandomForestRegressor()
rfc.fit(x_train, y_train)
#예측 및 성능 확인
y_pred_train = rfc.predict(x_train)
y_pred_test = rfc.predict(x_test)
print(metrics.r2_score(y_train, y_pred_train))
print(metrics.r2_score(y_test, y_pred_test))
#하이퍼 파라미터 튜닝 - 방법중 하나인 Bayesian Optimization을 사용함
BayesianOptimization
import numpy as np
from bayes_opt import BayesianOptimization
from sklearn.model_selection import cross_val_score
def model_evaluate(n_estimators, maxDepth):
clf = RandomForestRegressor(
n_estimators= int(n_estimators),
max_depth= int(maxDepth))
scores = cross_val_score(clf, x_train, y_train, cv=5, scoring='r2')
return np.mean(scores)
def bayesOpt(x_train, y_train):
clfBO = BayesianOptimization(model_evaluate, {'n_estimators': (100, 300),
'maxDepth': (2, 8)
})
clfBO.maximize(init_points=5, n_iter=10)
print(clfBO.res)
bayesOpt(x_train, y_train)
문제 정의
: 글로벌 오픈에 따른 버그 이용 유저 증가 , 신규 진입 유저 및 기존 이용 유저 이탈률 증가
기대 효과
: 버그 사용 의심 유저 색출 및 게임 정상화 , 유저 고객 불만 감소 및 사용율 증대
해결 방안
:버그 의심 유저 행동 패턴을 정의하고 이상 유저 검출
성과 측정
:모델 활용 전/후 버그 신고 건수 비교 , 신규 사용자 증감 비교 , 기존 사용자 이탈률 비교
운영
:게임 플레이 데이터 수집 및 이상 탐지 model에 input , 버그 의심 유저 검출시 해당 유저 상세 분석 및 조치 실행
-핵 유저를 분별하기 위해 핵의 종류가 뭐가 있을지 가설을 정해봄
① Automated aiming : 이동거리가 낮은데 헤드샷 비율이 높은사람을 예측
② Inhuman Kills : 힐 없이 킬수가 높은 유저를 예측
③ 100% Headshot Kills : 헤드샷이 100퍼인 사람을 예측
④ Anomalies in Heals : 치료제를 너무 많이 쓰는 유저를 예측
⑤ Without moving & WeaponsAcquired : 이동없이 무기를 획득하는 유저를 예측
-이상 감지 모델링
#각각의 유형에 따른 모델링을 한다.
① Automated aiming - analyze : 내림 or 오름차순으로 정렬했을 때 10등분으로 데이터를 나눔
② Inhuman Kills - analyze : heal 0회, kill수는 평균*3std 이상 유저 확인
③ 100% Headshot Kills - analyze : headshot 100% 유저 탐색 그 중에서 킬이 높은 유저 확인
④ Anomalies in Heals - analyze : heal 아이템 사용횟수가 높은 유저 확인
⑤ Without moving & WeaponsAcquired - analyze : 움직임도 적은데 무기는 많이 얻은 유저를 확인
9.제주도 지역 물동량 분석 ( 가설검증/인사이트 도출)
A물류업체는 상/하차 과정에서 물품 파손 등에 대한 고객 클레임 수가 증가하고 있다.
물품의 특성마다 조심해야하는 부분이 다르기 때문에 여간 힘든 일이 아니다.
따라서 A사는 특정 물품이 많이 배송되는 지역들을 구분하고 용도에 맞는 적절한 택배차량을 선정할 것 이다.
문제 정의
:상품 배송 고객 클레임 건수 증가 , 물품 파손 건수 증가
기대 효과
:고객 클레임 건수 감수 , 물품 파손 건수 감소
해결 방안
:지역별 물품 배송량 분석을 통해 적정 차량 배차 및 직원 교육
성과 측정
:배송 운영 후 클레임 건수 모니터링
운영
:지역별 물품 배송 특성 추출 및 배차
:직원 교육을 통한 고객 클레임 감소 활동
#한글 폰트 설치 후 런타임 재시작
!sudo apt-get install -y fonts-nanum
!sudo fc-cache -fv
!rm ~/.cache/matplotlib -rf
·출발지/도착지 분석 : 결과가 애매함
·유통경로 분석 : 결과가 애매함
-> 출발지 기준 배차분석 : 출발 기준으로 가장 많이 배송하는 물품을 대표 물품으로 선정
#Summary
(1) 출발지 : 4,229개소 / 도착지 : 26,875개소
(2) 총 배송량(80%) : 출발지(상위 500개소), 도착지(상위 20,500개소)
(3) 대표 물품 선정
문제 정의
:웹사이트의 트래픽과 사용자 행동 패턴의 변동원인에 대한 정보부족
기대 효과
:사용자의 주요 행동 패턴과 유입 채널을 파악하여 효율적인 마케팅 전략 수립 및 웹사이트 개선 방향 설정
해결 방안
:GA 데이터를 통해 주요 트래픽 소스 및 채널 그룹핑 분석
:사용자의 지리적 위치와 기기 정보에 따른 세그먼트 분석
:방문자의 세션 및 방문 시간 흐름 분석
성과 측정
:분석을 통해 도출된 주요 트래픽 소스와 유저 행동 패턴의 변화를 기반으로 웹사이트의 방문자 수 및 사용자 행동
운영
:GA데이터를 주기적으로 모니터링하며, 도출된 인사이트를 바탕으로 웹사이트 및 마케팅 전략의 지속적인 개선,최적화
#json 파일을 읽는 코드
import numpy as np
import pandas as pd
import json
from pandas.io.json import json_normalize
json_cols = ['device', 'geoNetwork', 'totals', 'trafficSource']
def load_df(filename):
# path = "../input/" + filename
df = pd.read_csv(filename, converters={column: json.loads for column in json_cols},
dtype={'fullVisitorId': 'str'})
for column in json_cols:
column_as_df = json_normalize(df[column])
column_as_df.columns = [f"{column}_{subcolumn}" for subcolumn in column_as_df.columns]
df = df.drop(column, axis=1).merge(column_as_df, right_index=True, left_index=True)
return df
df = load_df("S_PJT10_DATA.csv")
-주요 지표(KPI) 추출
·월 별 MAU(Monthly Active Users) : 월 별 활동 유저수
·월 별 Transaction AMT : 거래금액 ★
·월 별 Conversion Rate : 특정한 행위를 한 방문자의 비율
#우리는 Revenue를 한 사람을 conversion으로 설정해서 -> Revenue / total로 Conversion Rate를 설정
-Profit 분석
#plotly를 사용해서 시각화 했음
·Device Attributes Analysis
·GeoNetwork Attributes Analysis
·TrafficSource Analysis
#trafficSource_campaign 칼럼은 방문자를 사이트로 유도한 광고 켐페인의 이름을 나타냄(black friday sale 등등)
#trafficSource_source 칼럼은 방문자가 사이트에 도달한 경로를 나타내는 컬럼 ( google, facebook 등등)
#trafficSource_medium칼럼은 방문자가 사이트에 도달한 매체를 나타냄(organic(무료검색) , cpc(유료검색)등등)
##plotly 예제
import pandas as pd
import plotly.graph_objects as go
from plotly.subplots import make_subplots
#첫 번째 그래프 데이터
df_device_browser = pd.DataFrame(df.groupby(df['device_browser'])['totals_transactionRevenue'].mean()).reset_index()
df_device_browser = df_device_browser.dropna().sort_values("totals_transactionRevenue", ascending = True)
#두 번째 그래프 데이터
df_device_category = pd.DataFrame(df.groupby(df['device_deviceCategory'])['totals_transactionRevenue'].mean()).reset_index()
df_device_category = df_device_category.dropna().sort_values("totals_transactionRevenue", ascending = True)
#1x2 서브플롯 생성
fig = make_subplots(rows=1, cols=2, subplot_titles=('Transaction Revenue by Device Category', 'Transaction Revenue by Device Browser'))
#'Device Category` 그래프를 첫 번째 서브플롯에 추가 (수평 막대그래프로 변경)
fig.add_trace(
go.Bar(x=df_device_category['totals_transactionRevenue'], y=df_device_category['device_deviceCategory'], orientation='h'),
row=1, col=1
)
#'Device Browser` 그래프를 두 번째 서브플롯에 추가 (수평 막대그래프로 변경)
fig.add_trace(
go.Bar(x=df_device_browser['totals_transactionRevenue'], y=df_device_browser['device_browser'], orientation='h'),
row=1, col=2
)
#레이아웃 업데이트 및 출력
fig.update_layout(title_text="Transaction Revenue Analysis")
fig.show()