"인터넷 밈"은 인터넷 커뮤니티나 SNS 등지에서 퍼져나가는 여러 문화의 유행과 파생의 경향을 총칭하는 용어라고 합니다. 이런 나무위키에서 따온 사전적인 정의보다는 "너 T야?", "완전 럭키비키잖아~" 등의 예시가 더 확 와닿을거라고 생각되는데요.
인스타 릴스나, 유튜브 쇼츠 등의 발전으로 이러한 밈들이 빠른속도로 퍼져나가고 있어서 조금만 긴장을 늦춰도 유행에 뒤쳐지는 시대인것 같습니다. 특히 이번 "이탈리안 브레인롯"이라는 밈은 굉장히 당황스러울정도로 뜬금없었어요. 술자리에서 친구들이 갑자기 "트랄라레로 트랄랄라", "붐바르딜로 크로코딜로"를 외치는데 한동안 벙져있게 만들더라구요.
그런데 최근 기업들이나 공공기관이 젊은 세대를 타겟팅하거나, 젊은 이미지를 구축하려는 시도로 자사의 인스타, 유튜브 채널을 개설하고 유행하는 밈과 자신들의 상품들을 결합해서 마케팅을 진행하고 있습니다. 예를들어 전청조 밈으로 유명한 "I am 신뢰에요"를 활용해서 위메프가 "I am 특가에요 Next time은 없어요 ~" 라는 문구를 활용해 논란이 됐던적이 있었죠.
이러한 밈을 활용한 마케팅 환경에서 가장 크게 고려해야할 부분은 타이밍이라고 생각해요. 언제 시작하고 언제 빠져야하는가. 밈은 유행이라는 특성 상 생명주기는 그렇게 길지 않기 때문에 특히 타이밍을 더 신경써야하는 것 같아요. 다음 밈이 떠오르기 시작하면 금방 잊혀지니까요. 그래서 이번에는 밈들이 각 유형별(노래, 춤, 유행어, 성격)로 얼마나 오래가는지 밈 유형별 생명주기를 파악해보려고 합니다.
밈은 얼마나 오래갈까? 한번 확인해 보자
활용 데이터
밈이름 및 유행시기 - 나무위키
나무위키에 유행했던 밈들이 정리되어 있다. 그 중 내가 들어본 밈들만 따로 추출해서 데이터를 만들었다.
유형별 분석을 위해 유행어, 성격, 노래, 춤으로 밈을 분류했다.
네이버 트렌드 API
밈별 검색량을 파악해 얼마나 관심이 오래 지속되는지를 판단하기 위해 수집했다.
분석 과정 및 결론
1. 밈별 검색량 데이터 수집
먼저 네이버 트렌드 API를 이용해 나무위키에서 수집한 밈별 검색량 데이터를 수집했다. 네이버 API는 데이터 수집시기를 지정해 주어야 한다. 나는 밈이 유행하기 시작한 시기를 기준으로 3개월 전 ~ 6개월 후를 검색량 수집시기로 설정했다.
최근 유행한 밈은 6개월 후가 현재시간을 넘을 수 있으므로 그런 경우는 마감일을 오늘날짜(datetime.now)로 예외처리 해주었다.
그 다음 밈별로 검색량 데이터를 수집했다. 검색량은 아래와 같이 주어지고 그 검색량들을 추후 생명주기 계산에 편하게 사용하기 위해 "검색량"이라는 새로운 컬럼으로 추가했다. 네이버 트렌드는 상대적인 검색량을 제공한다. 검색량이 가장 높았던 날을 100으로 잡고, 100을 기준으로 나머지 검색량을 상대적인 비율로 계산하여 제공하는 것이다. 아래 검색량에서는 12월 5일이 포함된 주에 가장 높은 검색량을 기록했다는 것을 의미한다. timeUnit 파라미터를 이용해 일별, 주별, 월별 검색량 데이터를 수집할 수 있다.
2. 밈별 생명주기 계산
검색량 데이터를 이용해 생명주기를 계산했다. 검색량이 늘어나는 시점부터 검색량이 줄어드는 시점 즉, 사람들의 관심이 늘어나기 시작한 시점부터 관심이 줄어드는 시점까지를 그 밈의 생명주기라 판단했다.
검색량이 늘어나고 줄어드는 시점의 기준은 각 밈별 검색량의 "평균 + 표준편차"로 설정했다. 기준값을 임의로 설정하면 밈마다 다른 검색량 분포를 고려하지 못하기 때문이다. 실제로 재유행과 같이 다른 분포를 가진 밈들이 몇몇 존재했다. 그래서 평균 + 표준편차를 기준값으로 이용하여 그 기준값보다 높은 검색량을 연속적으로 가장 길게 유지한 구간을 그 밈의 생명주기로 계산했다. 예를들어 검색량 기준값이 30이라 했을 때 30 이상을 연속적으로 유지한 구간이 2주, 3주, 5주가 있다면 그 밈의 생명주기를 5주라고 판단했다.
결과는 다음과 같았다.
가장 오랜 기간 인기를 유지했던 밈은 "미룬이" 였다. 미룬이를 처음 봤을때 보는 내가 더 민망했던 기억이 떠올랐다.
추가적으로 전체 밈의 생명주기 평균은 "4.18주" 표준편차는 "2.57주"였다.
3. 밈 유형별 생명주기 시각화 및 결론
내가 분류한 밈 유형별로 생명주기를 시각화 했다. X축은 밈 유형이고 Y축은 유형별 생명주기의 평균값이다.
생명주기가 가장 긴 밈 유형은 평균 생명주기가 6주인 노래유형이었다.
마무리
물론 브랜드의 성격과 어울리는 밈을 선택하는 것이 가장 좋은 전략이다. 하지만 밈의 유형 선택이 고민된다면, 가장 긴 생명주기를 가진 "노래형 밈"을 우선적으로 고려하는 것이 전략적인 선택이 될 수 있다. 빠르게 지나가는 유행 속에서 그나마 조금 더 긴 호흡으로 활용할 수 있기 때문이다.
밈의 평균 생명주기는 약 4주로 생각보다 짧았다. 밈을 마케팅에 잘 활용하기 위해서는 짧은 생명주기 속에서 적절한 타이밍을 잡아내는 것 또한 핵심이라 할 수 있다.
쿠키
그렇다면 가장 최근 유행하는 "이탈리안 브레인 롯" 의 관심은 어떨까? 이 밈도 하나의 유행어 밈이니까 평균적으로는 3주정도의 생명주기를 가질 것으로 예측된다.
그래도 한번 확인해 봤다. 이탈리안 브레인 롯 검색량 추이는 아래 그래프와 같았다.
3주 정도로 예측했던 생명주기가 6주 정도로 생각보다 오래가고 있다. 예전보다 관심은 줄었으나 아직까지도 쇼츠나, 릴스에 등장하는 걸 유행이 조금 더 지속될 밈인 것 같다.
최종코드
# 라이브러리 임포트
import pandas as pd
import numpy as np
import requests
from tqdm import tqdm
import time
from datetime import datetime, timedelta
import warnings
warnings.simplefilter(action='ignore', category=FutureWarning)
import json
import matplotlib.pyplot as plt
data['검색량'] = ""
for idx, row in data.iterrows():
startDate = row['유행시기'] - timedelta(days = 90)
endDate = row['유행시기'] + timedelta(days = 180)
if endDate > datetime.now():
endDate = datetime.now() - timedelta(days = 1)
startDate = startDate.strftime('%Y-%m-%d')
endDate = endDate.strftime('%Y-%m-%d')
keywords = []
if ',' in row['밈이름']:
keywords.extend([k for k in row['밈이름'].split(', ')])
else:
keywords.append(row['밈이름'])
body = {
"startDate": startDate,
"endDate": endDate,
"timeUnit": "week",
"keywordGroups": [
{
"groupName": "밈",
"keywords": keywords
}
]
}
response = requests.post(url, headers=headers, json = body)
if response.status_code == 200:
result = response.json()
search = result['results'][0]['data']
data.loc[idx, "검색량"] = json.dumps(search)
else:
print(response.status_code)
# 생명주기 계산 함수
def get_main_trend_period(data):
max_len = 0
start = end = None
temp_start = None
threshold = np.array(ratios).mean() + np.array(ratios).std()
for i, v in enumerate(data):
if v >= threshold:
if temp_start is None:
temp_start = i
else:
if temp_start is not None:
length = i - temp_start
if length > max_len:
max_len = length
start, end = temp_start, i - 1
temp_start = None
if temp_start is not None:
length = len(data) - temp_start
if length > max_len:
start, end = temp_start, len(data) - 1
return start, end, end - start + 1 if start is not None else (None, None, 0)
# 밈별 생명주기 계산 후 출력
data['생명주기'] = 0
for idx, row in data.iterrows():
ratios = []
dates = []
for ratio in json.loads(row['검색량']):
ratios.append(ratio['ratio'])
dates.append(ratio['period'])
start, end, lifespan = get_main_trend_period(ratios)
data.loc[idx, '생명주기'] = lifespan
print(f"\"{row['밈이름']}\" 생명주기: {lifespan}주")