Post

[심화세션]_2주차

사전 학습 정리



주교재


[3장] 고객의 전체 모습을 파악하는 테크닉 10

img1 img2


21. 데이터를 읽어들이자

img3


22. 데이터를 가공하자

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 테이블 조인하기
customer_join = pd.merge(customer, class_master, on="class", how="left")
customer_join = pd.merge(customer, campaign_master, on="campaign_id", how="left")

# join된 테이블 확인
customer_join.head()

# customer 테이블과 customer_join 테이블 사이즈 비교
print(len(customer))
print(len(customer_join))
# 4192
# 4192


# 조인 후 결측치 확인
customer_join.isnull().sum()
# end_date 외에는 결측치 없음을 확인


23. 데이터를 집계하자

img4

1
2
3
4
5
# 이 외에도 추가로 궁금한 부분이 있다면 직접 집계해보자. 
customer_join["start_date"] = pd.to_datetime(customer_join["start_date"])
customer_start = customer_join.loc[customer_join["start_date"]>pd.to_datetime("20180401")]
print(len(customer_start))
# 1361


24. 최신 고객 데이터 집계

1
2
3
4
5
6
7
customer_join["end_date"] = pd.to_datetime(customer_join["end_date"])
customer_newer = customer_join.loc[(customer_join["end_date"]>=pd.to_datetime("20190331"))|(customer_join["end_date"].isna())]
print(len(customer_newer))
customer_newer["end_date"].unique()
# 2953
# array([                          'NaT', '2019-03-31T00:00:00.000000000'],
#      dtype='datetime64[ns]')

img5

위의 출력 결과를 보면 회원 구분 및 성별에 큰 차이가 없음을 알 수 있다. 이것은 특정 회원 구분이나 성별이 탈퇴한 것이 아니라고 생각할 수 있다.

25. 이용 이력 데이터를 집계하자

1
2
3
4
5
6
7
# 이용이력 데이터 집계
uselog["usedate"] = pd.to_datetime(uselog["usedate"])
uselog["연월"] = uselog["usedate"].dt.strftime("%Y%m")
uselog_months = uselog.groupby(["연월","customer_id"],as_index=False).count()
uselog_months.rename(columns={"log_id":"count"}, inplace=True)
del uselog_months["usedate"]
uselog_months.head()

img6

1
2
3
4
# 고객별 이용 횟수 통계 집계
uselog_customer = uselog_months.groupby("customer_id").agg(["mean", "median", "max", "min" ])["count"]
uselog_customer = uselog_customer.reset_index(drop=False)
uselog_customer.head()

img7

26. 이용 이력 데이터로부터 정기 이용 플래그 작성

1
2
3
4
5
6
7
# 월별, 요일별 이용 데이터 작성

uselog["weekday"] = uselog["usedate"].dt.weekday
uselog_weekday = uselog.groupby(["customer_id","연월","weekday"], 
                                as_index=False).count()[["customer_id","연월", "weekday","log_id"]]
uselog_weekday.rename(columns={"log_id":"count"}, inplace=True)
uselog_weekday.head()

img8

1
2
3
4
5
6
7
# 정기 이용 여부 데이터 추가


uselog_weekday = uselog_weekday.groupby("customer_id",as_index=False).max()[["customer_id", "count"]]
uselog_weekday["routine_flg"] = 0
uselog_weekday["routine_flg"] = uselog_weekday["routine_flg"].where(uselog_weekday["count"]<4, 1)
uselog_weekday.head()

img9

27. 고객 데이터 + 이용 이력 데이터 결합

img10

28. 회원기간 계산

탈퇴하지 않은 회원의 end date: 4/30으로 설정

1
2
3
4
5
6
7
8
9
10
# 아직 탈퇴하지 않은 회원의 탈퇴일을 임의로 4/30으로 설정하고
# membership 가입 기간 계산
from dateutil.relativedelta import relativedelta
customer_join["calc_date"] = customer_join["end_date"]
customer_join["calc_date"] = customer_join["calc_date"].fillna(pd.to_datetime("20190430"))
customer_join["membership_period"] = 0
for i in range(len(customer_join)):
    delta = relativedelta(customer_join["calc_date"].iloc[i], customer_join["start_date"].iloc[i])
    customer_join["membership_period"].iloc[i] = delta.years*12 + delta.months
customer_join.head()

img11

29. 고객 행동 통계량 파악

img12

img13

30. 탈퇴 회원과 지속 회원의 차이

탈퇴 회원 vs 지속 회원 통계치 출력

img14

위의 통계치에서 mean, median, routine_flg 등에서 큰 차이가 난다는 것을 볼 수 있다.

1
2
# customer_join 데이터 .csv 파일로 출력
customer_join.to_csv("customer_join.csv", index=False)



[4장] 고객의 행동을 예측하는 테크닉 10

img15 img16

31. 데이터를 읽어 들이고 확인하자

img17

32. 클러스터링으로 회원 그룹화

img18

33. 클러스터링 결과 분석

img19

34. 클러스터링 결과 가시화

5개 변수를 그래프로 표현하기 위해 주성분 분석을 통해 2개의 변수로 차원 축소

img20

35. 클러스터링 결과를 바탕으로 탈퇴회원 경향 파악

img21

36. 다음 달 이용 횟수 예측을 위해 데이터 준비

예측의 경우에는 회귀 분석을 이용한다. 이를 위한 데이터를 준비하자.

2018.5~10월 데이터와, 11월 이용 데이터(정답 데이터)를 준비하자

img22

37. 특징이 되는 변수 추가

특징이 되는 데이터, 여기서는 시계열 변화를 볼 수 있는 회원 기간 데이터를 추가해보자.

img23

38. 다음달 이용횟수를 예측하는 모델을 구축하자

img24

39. 모델에 기여하는 변수 확인

img25

모델의 계수로부터 예측 기여도를 확인할 수 있다.

40. 다음 달의 이용 횟수 예측

img26



부교재


[4장] 추론통계 ~ 신뢰구간


4.1 추론통계를 배우기 전에

전수조사 vs 표본조사

  • 확률분포와 실현값

img27

  • 데이터로부터 그 발생원의 확률분포 추정하기

  • 모집단분포 모형화

  • 무작위추출

  • 무작위추출 방법: 단순무작위추출법 vs. 층화추출법

  • 편향된 추출로는 올바른 추정이 어렵다.

  • 데이터 얻는 법 - 모집단에 대해 추정한 결과를 어느 정도 일반화할 수 있는가는, 각 분야 고유의 지식(도메인 지식)에 따라 달라진다.

추론통계는 된장국을 국자로 맛보는 것과 같다?!

img28


4.2 표본오차와 신뢰구간

모집단과 데이터 사이의 오차 고려하기

표본오차: 표본평균과 모평균이 일치하지 않기에 이런 어긋남을 표본오차(sampling error)라고 한다.

  • 주사위의 표본오차

  • 표본오차는 확률적으로 바뀐다

  • 큰 수의 법칙: n이 커질수록 표본평균이 모평균에 한없이 가까워진다는 법칙

  • 중심극한정리(Central Limit Theorem): 모집단이 어떤 분포이든 간에, n이 커질수록 표본평균의 분포는 정규분포로 근사할 수 있다.

  • 추정량: 모집단의 성질을 추정하는 데 사용하는 통계량
  • 일치추정량: n을 무한대로 했을 때, 모집단의 성질과 일치하는 추정량
  • 비편향추정량: 추정량의 평균값이 모집단의 성질과 일치할 때의 추정량

신뢰구간

img29

  • 신뢰구간의 해석: 00%의 확률로 이 구간에 모평균이 있다. = 모집단에서 표본을 추출하여 00% 신뢰구간을 구하는 작업을 100번 반복했을 때 평균적으로 그 구간에 모평균이 포함되는 것이 00번이라는 뜻이다.

  • 신뢰구간은 표본에서 구한 모평균의 추정값을 어느 정도 신뢰할 수 있는지를 나타낸다.


[5장] 가설검정


5.1 가설검정의 원리

가설검정의 구체적인 계산: 가설검정의 개념은 다양한 검정기법에서 공통이지만, p값의 계산 방법은 서로 다르다.

가설검정에서는 p-value를 계산하여 가설을 지지하는지 여부를 판단한다.

  • 가설 검증하기

img30 img31

img32 img33

img34

5.2 가설검정 시행

이표본 t검정(two-sample t-test): 2개 집단 간의 평균값을 비교하는 검정

img35

img36

기각역과 p값 img37

신뢰구간과 가설검정의 관계: p값 계산과 신뢰구간 계산은 서로 닮았다. 실은 m_a-m_b의 95% 신뢰구간이 0에 걸치는지 여부와 p값이 0.05를 밑도는지 여부는 등치다. 실제 값인 표본평균으로 모평균을 추정하는 것이 신뢰구간이며, 귀무가설을 가정해 모평균을 m_a-m_b=0으로 고정했을 때의 표본평균이 어떤 값이 될 것인지를 구하는 것이 가설검정이다.

img38

가설검정의 예시 img39 img40

p-value가 0.246이 되면 귀무가설을 채택하는 것이 아니라 “통계적으로 유의미한 차이를 발견할 수 없었다.”와 같이 기술한다는데, 응용통계학에서 배운 바로는 p-value가 0.1 이상이면 귀무가설을 채택한다고 배웠어서 (0.01<p<0.1, 애매함. p<0.01, 귀무가설 기각) 책의 내용과 응통에서 배운 내용이 충돌하는 것처럼 느껴진다.

5.3 가설검정 관련 그래프

오차 막대(error bar)

img41

오차 막대를 그래프에 그릴 때는, 오차 막대가 무엇을 표시하고 있는지를 그래프 범례에 반드시 기재하자.

위의 그림에 대해 설명을 덧붙이자면, se를 오차막대로 그릴 때는 n에 따라 해석하는 방법이 달라진다. 표본이 작을 때(n=3)는 오차 막대 2개 만큼의 차이가 있어야만 p<0.05를 만족한다. 반대로 표본이 클 때는, 차이가 오차 막대 1개만 되어도 p<0.05를 만족한다.

“통계적으로 유의미”를 나타내는 표기

  • *: 0.01<p<0.05
  • **: 0.05<p<0.01
  • ***: 0.01<p<0.001
  • N.S.: non-significant, 유의미하지 않음

5.4 제1종 오류와 제2종 오류

진실과 판단의 4패턴

img42

  • 제1종 오류: 실제로는 아무런 차이가 없음에도 차이가 있다고 잘못 판단하는 경우, 확보한 데이터가 귀무가설에서 얻은 것이라면 p<α일 확률은 α가 된다. 때문에 α를 경계로 귀무가설을 기각하면, 귀무가설이 옳은데도 착오로 귀무가설을 기각해 버리는 오류가 확률 α로 발생하게 된다. 즉, 유의수준 α의 값을 미리 정해 둠으로써, 제1종 오류가 일어날 확률을 통제할 수 있는 것이다.

  • 제2종 오류: 정말로 차이가 있는데도 차이가 있다고는 말할 수 없어, 귀무가설을 기각하지 않는 판단을 내려 버리는 것을 말한다. 제2종 오류가 일어나는 확률은 β로 나타내는데, 제2종 오류가 일어나지 않을 확률, 즉 정말로 차이가 있을 때 차이가 있다고 올바르게 판단할 확률을 검정력 1-β라고 한다. 일반적으로 검정력 1-β를 80%로 설정하지만 β는 α와 달리 직접 통제할 수 없다. β는 표본크기 n이 커질수록 작아지며, 어느 정도의 차이를 차이로 간주하는지를 나타내는 값인 효과크기가 커짐에 따라서도 작아진다.

α와 β 사이에는 상충관계, 즉 한쪽이 작아지면 또 다른 한쪽이 커지는 관계가 있다.

img43

효과크기(effect size)를 달리 했을 때의 α와 β

  • 효과크기(effect size)는 일반적으로 얼마나 큰 효과가 있는지를 나타내는 지표다.

img44

가설검정에서는 모집단을 대상으로 검출하고 싶은 효과크기를 미리 설정하는 것이 바람직하다.

또한 이 값들에는 α와 β, 표본크기 n, 효과크기 d의 네 값 중 셋을 결정하면, 나머지 하나는 자동으로 정해진다는 성질이 있다. 따라서 α=0.05, 1-β=0.8과 검출하고자 하는 효과크기 d를 미리 설정함으로써 가설검정에 필요한 표본크기 n을 구할 수 있다.

img45

세션 후

모델링 이후에 모델의 적합성을 평가하는 데 중요한 시각화 도구

  • 잔차 그래프: 실제값과 예측값의 차이를 잔차라고 함, X축에 독립변수, y축에 잔차값을 놓아 글니 그래프. 잔차들이 무작위로 흩어져 있고 특정한 패턴이 없는 모델이 데이터를 잘 적합시켰다고 볼 수 있다. 잔차가 평균 0을 중심으로 일정하게 분포하는지 시각적으로 확인하는 것이 목표다.
  • Q-Q(Quantile-Quantile) plot: 데이터의 분포가 특정 분포(주로 정규 분포)를 따르는 지를 확인하는 데 사용하는 그래프다. 두 분포의 quantile을 비교하여 데이터가 얼마나 잘 일치하는지를 보여준다. 그래프가 직선에 가깝다면 데이터가 정규 분포를 잘 따라서 잔차가 정규성을 가진다고 볼 수 있다.

GPT가 생성한 예시 그래프: img46


About p-value: GPT에 따르면 위에서 작성한 p-value 관련 질문은 큰 의미가 없다고 한다. 왜냐면 두 경우가 표현만 다른 것이기 때문이다. 일반적으로 p-value가 0.05보다 크다면 ‘통계적으로 유의미한 차이를 발견하지 못했다’고 말하는 것이 더 정확하다. 이는 p-value가 얼마나 높던지 상관 없이 작용한다. 애초에 통계에서 ‘귀무가설을 채택한다’는 표현이 문제를 일으킬 수 있기에 위의 표현을 사용한다. 귀무가설을 내 주장에서 기각해야 할 요소로 설정하기에 만약 p-value가 지나치게 높다면 가설을 잘못 세운 것이라고도 생각해볼 수 있겠다.

This post is licensed under CC BY 4.0 by the author.