안녕하세요! Everly입니다.
오늘 포스팅은 SNS 입소문 전파를 예측하는 파이썬 시뮬레이션 마지막 포스팅입니다.
오늘은 실제 결과와 예측 결과를 비교해보고, 실제 결과가 없는 미래에 대해서 예측까지 진행해보겠습니다.
✔Table of Contents
Tech 79. 실제 데이터와 시뮬레이션을 비교하자.
앞선 Tech 78에서 소멸확률과 확산확률을 추정했던 것 기억나시죠? 얘네를 불러옵니다.
#각각 앞에서 구한 확산확률, 소멸확률
p_percent = count_link_to_active/count_link
d_percent = count_active_to_inactive/count_active
print(p_percent, d_percent)
확산확률 p_percent는 약 4%, 소멸확률 d_percent는 약 10%로 추정되었습니다.
이제 시뮬레이션을 해봅니다. 시뮬레이션 코드는 Tech 74에서 한 것과 비슷합니다. 살짝만 수정해서 사용하겠습니다.
## 시뮬레이션 - df_link -> mem_link, 그리고 확산/소멸확률 파라미터 바꾸기
## (밑의 for문은 시간이 오래걸리니 주의.. 약 40분 소요)
T_NUM = 24 #24 개월 동안 어떻게 바뀔지 지켜보자.
NUM = len(mem_link.index) # 540명
list_active = np.zeros(NUM)
list_active[0] = 1 #노드0가 입소문 퍼뜨리기 시작!
list_ts = []
for t in range(T_NUM):
#확산, 소멸확률 파라미터 지정
list_active = simulate_population(NUM, list_active, p_percent , d_percent , mem_link)
#시뮬레이션 과정 24번에 걸쳐 list_ts에 차곡차곡 쌓음
list_ts.append(list_active.copy())
mem_info 데이터는 고객(노드)들의 방문 횟수가 월별로 24개월동안 나와 있죠. 이것이 실제 데이터입니다.
그리고 이와 비교할 것이, 바로 고객들의 24개월간 방문 횟수를 시뮬레이션한 것입니다.
위 코드를 실행하면 T_NUM(24개월) 동안 for문을 수행하며 시뮬레이션을 합니다. list_active엔 540명의 노드가 들어 있는데, 그중 0번째 노드가 입소문을 퍼뜨리기 시작하면, 24개월을 거치며 이 값이 어떻게 변하는지 알 수 있겠죠?
값이 1이 된다면 전파된 것이고 0이라면 전파가 안 된 것입니다.
이런 시뮬레이션은 이전에 만든 simulate_population을 사용합니다. 파라미터는 이렇게 바꾸면 되겠죠
- df_link → mem_link (각 노드들의 연결 현황)
- percent_percolation → p_percent (확산확률)
- percent_disappearence → d_percent (소멸확률)
이렇게 list_ts라는 리스트에 개월별 전파현황 24개가 담깁니다.
개월별로 전파 합계를 보기 위해 시계열 그래프를 그려봅시다. 역시 저번에 만든 코드를 그대로 사용합니다.
list_ts_num = []
for t in range(len(list_ts)):
list_ts_num.append(sum(list_ts[t]))
plt.plot(list_ts_num) #총 24개월을 거치며 전파된 노드의 수 시각화
plt.show()
이렇게 그려지네요. 시뮬레이션을 해보니 몇개월 안 되어 높은 전파력이 급상승했습니다.
아까도 말했듯, 우리는 이미 실제 데이터를 알고 있습니다. 바로 mem_info 데이터죠! 이 데이터는 재구매 고객 540명의 24개월간 방문 현황을 알 수 있습니다. 그래서 위의 그래프와 똑같이 개월별 전파 합계를 구할 수 있겠죠!
mem_info.head()
list_ts_real이라는 리스트를 만들고, 여기에 개월별 전파 합계(열 합계)를 구해 차곡차곡 쌓습니다. 혹은 책에서처럼 각 열별로 값이 1인 애들의 index 개수를 세어도 됩니다.
그럼 총 24개 원소가 생기겠죠?
list_ts_real = []
for t in range(0, 24):
t_sum = len(mem_info[mem_info[str(t)] == 1].index)
list_ts_real.append(t_sum)
print(list_ts_real)
## 이 방법도 가능
#list_ts_real = list(np.sum(mem_info.iloc[:,1:], axis=0))
#print(list_ts_real)
이제 위의 결과로 시계열 그래프를 그립시다. 어차피 x축은 개월수이므로 0~23까지 자동 생성됩니다.
y축에 실제 전파 합계(list_ts_real)과 시뮬레이션한 전파 합계(list_ts_num)을 넣어 그립니다.
#이제 시뮬레이션 결과 list_ts_num , 실제결과 list_ts_real 을 비교한 그래프를 그려보자.
plt.plot(list_ts_num, label = 'simulation')
plt.plot(list_ts_real, label = 'real')
plt.xlabel('month')
plt.ylabel('population #')
plt.legend(loc = 'lower right')
plt.show()
결과를 보면, 시뮬레이션과 실제 결과가 비슷하게 움직이고 있습니다.
다만 주의할 점! 어느 지점에서 사용자가 급격히 증가하느냐의 경향은 파악할 수 있으나,
프로그램 난수의 영향으로 증가하는 시간대/시기에 오차가 생깁니다.
이를 방지하기 위해선, 여기선 시뮬레이션을 1회 돌려봤지만 이를 여러번 돌린 후 평균값으로 최종 시뮬레이션 결과를 낸다면 오차가 줄어들 것입니다.
Tech 80. 시뮬레이션으로 미래를 예측해보자
앞에서는 24개월 시뮬레이션을 해봤죠. 그래서 실제 결과와 비교를 해볼 수 있었습니다.
그렇다면 이번에는 실제값이 존재하지 않는, 25~36개월이 되면 어떻게 전파 수(회원 수)가 바뀔지를 시뮬레이션해봅시다. T_NUM을 36으로만 바꾸면 되겠죠?
코드는 이전에 썼던 것 그대로입니다.
T_NUM = 36 #36 개월 동안 어떻게 바뀔지 지켜보자.
NUM = len(mem_link.index) # 540
list_active = np.zeros(NUM)
list_active[0] = 1 #노드0가 입소문 퍼뜨리기 시작!
list_ts = []
for t in range(T_NUM):
list_active = simulate_population(NUM, list_active, p_percent , d_percent , mem_link)
list_ts.append(list_active.copy())
#아까전에 만든 코드 그대로 사용
list_ts_num = []
for t in range(len(list_ts)):
list_ts_num.append(sum(list_ts[t]))
plt.plot(list_ts_num, label = 'simulated')
plt.xlabel('month')
plt.ylabel('population #')
plt.legend(loc ='lower right')
plt.show()
결과를 보면, 24개월 이후엔 회원수에 별다른 변화가 없이 지속된다고 예측이 되었네요.
중요한 것은, "회원수가 급격히 감소하지 않고 지속된다"는 것입니다.
이 결과가 당연할 수 있겠지만, 현실로 나타나기 전까진 정확한지 알 수 없습니다.
직관적으로 봤을 때 그렇겠지~ 라고 하더라도, 직접 분석과 예측을 해봤기에 미래가 이렇게 될 것이라고 추정하고 주장할 수 있는 것입니다.
이런 의미에서 시뮬레이션은 중요한 기법입니다! 책에선 여기서 배운 수치 시뮬레이션을 실제 데이터 분석과 병용하면 위력을 발휘할 수 있으니 꼭 현장에서 응용해 보라고 하네요 :)
Summary
이렇게 해서 [파이썬 데이터 분석 실무 테크닉] 의 #1장부터 #8장까지의 포스팅을 마칩니다!
이 내용을 공부하면서, 실제 현장에서 데이터 분석으로 어떻게 결과를 내는지, 그리고 데이터 분석으로 어떻게 개선할 것인지를 알아봤습니다.
실무에서 일반적인 Data Analysis를 하기 위해선 여기까지만 알아도 되겠지만, 앞으로 남은 9장과 10장에선 좀 더 심화된 내용을 공부해봅니다.
9장은 이미지 처리로, OpenCV 라이브러리를 활용해 이미지와 동영상으로부터 사람을 인식해봅니다.
10장은 자연어 처리(NLP)의 내용을 다뤄봅니다.
이러한 텍스트와 이미지를 처리하는 기술은 AI(인공지능)을 얘기할 때면 언제나 빠지지 않고 나오는 내용이죠? 그만큼 중요한 기술이지만, 실제 현장에서 이를 다루는 내용은 별로 없어 유용한 분석이 될 것입니다.
이 내용에 관한 포스팅은 다음 포스팅부터 이어집니다. 감사합니다!
'Data Science > Analysis Study' 카테고리의 다른 글
Python OpenCV (2) - 이미지에서 사람 얼굴 인식하기 (0) | 2022.05.12 |
---|---|
Python OpenCV (1) - 이미지, 동영상 데이터를 불러오고 저장하기 (0) | 2022.05.11 |
파이썬 시뮬레이션 - SNS 입소문 전파 예측하기 (3) / 파이썬 데이터 분석 실무 테크닉 100 (0) | 2022.05.04 |
파이썬 시뮬레이션 - SNS 입소문 전파 예측하기 (2) / 파이썬 데이터 분석 실무 테크닉 100 (0) | 2022.05.03 |
파이썬 시뮬레이션 - SNS 입소문 전파 예측하기 (1) / 파이썬 데이터 분석 실무 테크닉 100 (0) | 2022.05.02 |