CDA數據分析師 出品
作者:Mika、澤龍
數據:真達
後期:澤龍
【導語】:今天我們來聊聊最近的社交遊戲新寵--劇本殺,Python技術部分請看第三部分。公衆號後臺,回覆關鍵字“劇本殺”獲取完整數據。
Show me data,用數據說話
今天我們聊一聊 劇本殺
點擊下方視頻,先睹爲快:
如果問,線下聚會可以玩兒什麼?狼人殺?密室逃脫?
nonono,說道現在社交遊戲的新寵,就不得不提到ta——劇本殺。
劇本殺,最初源於歐美派對遊戲“謀殺之謎”。玩家們需要根據自己拿到的劇本扮演角色,與其他玩家一起共同演繹故事,通過線索推斷、交流,共同找到兇手並揭開故事全貌。
與狼人殺相似的是,二者都需要通過推理和表演找出兇手或者是掩飾自己。不同的是,狼人殺只有一個固定的劇情,即狼人在夜晚殺害村民,村民要在白天找出兇手。
而劇本殺則有不同的故事,無論從劇本、犯罪、作案到人物劇情都很多樣化,加上線下劇本殺配備的服裝、佈景、道具,甚至玩上一局劇本殺,感覺像是經歷了一場驚險刺激的沉浸式懸疑電影!
今天,我們就用數據跟大家盤一盤劇本殺。
01
被高分綜藝帶火的劇本殺
很多小夥伴第一次聽說劇本殺,可能都是因爲《明星大偵探》(下文簡稱《明偵》)。2016年的3月,芒果TV首播明星推理真人秀《明偵》第一季。目前《明偵》共推出了五季,播出後在豆瓣的評分都還不錯,分別是9.3/ 9.1 / 9.1 / 8.6/ 8.5。角色扮演、蒐證、推理基本構成了許多人對劇本殺的第一印象。
隨着《明偵》的大火,劇本殺也逐漸走進大衆的視野。
說白了,劇本殺就是一個集邏輯推理和角色扮演於一體的社交遊戲。人生如戲,劇本殺讓玩家通過演繹角色切身體會到不一樣的多彩人生,同時通過邏輯推理讓玩家在遊戲中獲得解謎燒腦的樂趣。
03
從線下門店到線上應用
劇本殺到底有多火?
近幾年,劇本殺無論是線下實體店還是線上應用都得到了迅速的發展。
根據對美團點評的數據整理,2017年年初,劇本殺門店還僅有幾十家,2018年年初增加到幾百家,截至2019年12月,全國的劇本殺店已經由1月初的2400家飆升到12000家,一年之間開出一萬家門店。
在今年2020年初,因受疫情影響,無法出門活動的人們迅速將目光聚集到了線上。大年初一,正處於疫情初期,就有用戶反應《我是謎》APP遊戲卡頓,同時微博熱搜榜劇本殺APP《我是謎》也登榜,大量網友均反映系統崩潰。
隨後《我是謎》創始人林世豪連忙發微博表示,對激增的訪問人數感到驚訝,並表示馬上叫程序員來修復。
說道劇本殺的核心,當然是劇本啦。故事寫得好不好,情節和邏輯設置是否吸引人都是玩家尤其關注的點。那麼哪些劇本最受追捧,劇本都在什麼價錢呢?下面我們帶大家分析下淘寶店鋪的數據。
03
用Python分析
淘寶店鋪劇本殺數據
作爲桌遊當中的一種,劇本殺在淘寶的銷量數據如何呢?
我們用Python爬取了淘寶上的桌遊劇本殺的關鍵詞數據,下面一起具體看看:
桌遊銷量TOP10淘寶店鋪
首先,我們看看那些桌遊店鋪最熱門。
其中這家九卓家居專營店銷量最高,其次位居二三的分別是遊卡桌遊昆高專賣店和艾雅玩具店。不過要注意的是,比起普通玩家,這些店鋪買東西的主力肯定還是各大桌遊店。
桌遊店鋪地區排名TOP10
這方面可以看到,桌遊方面的淘寶店鋪主要還是位於一線城市的。其中,上海、廣東爲第一第二位。浙江名列第三,北京位居第四。
桌遊卡牌的價格區間
什麼價位的桌遊卡牌銷量最高呢?
通過分析發現,顯然50元以下的桌遊銷量最高,銷售額佔比高達42.72%。其次是50-100元的,銷售額佔比22.47%。然後比較貴的100-200的桌遊銷售額佔比17.05%。
其中最主要的原因就是便宜,現在的50塊錢可能連一頓下午茶錢都不夠,二是因爲50塊錢的桌遊大多數以紙牌爲主,小巧便利,方便攜帶,出門消磨時光必備物件,很適合我們的生活方式,想要玩大型桌遊,還是踏實去桌遊店吧,規則看不懂還有法官。
劇本殺店鋪銷量數據
說完桌遊店鋪的數據,那麼專門出售劇本殺相關產品的店鋪數據如何呢?我們挑選了一家最火爆的劇本殺店鋪,進行了分析。下面看到具體分析步驟:
我們使用Python獲取了淘寶網上GoDan正版劇本殺商城商品和熱評的數據進行了數據分析,地址如下:
https://shop387156301.taobao.com/category-1515015677.htm
實做過程分爲:
數據獲取
數據預處理
數據分析與可視化
1、數據獲取
代碼
# 導入所需包
import pandas as pd
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 登錄淘寶
def login_taobao_acount():
# 登錄URL
login_url = 'https://login.taobao.com/member/login.jhtml'
# 打開網頁
browser.get(login_url)
# 支付寶登錄
log = wait.until(
EC.element_to_be_clickable((By.CSS_SELECTOR, '#login-form > div.login-blocks.sns-login-links > a.alipay-login'))
)
log.click()
# 解析一頁
def parse_one_page():
# 保存信息
title = []
price = []
sales_num = []
comment_num = []
# 獲取內容
contents = browser.find_elements_by_xpath('//*[@id="J_ShopSearchResult"]//div[@class="item3line1"]//dl[contains(@class, "item")]')
for content in contents:
# 獲取標題
title.append(content.find_element_by_xpath('.//dd[@class="detail"]/a').text)
# 獲取價格
price.append(content.find_element_by_xpath('.//dd[@class="detail"]//div[@class="cprice-area"]').text)
# 獲取銷量
sales_num.append(content.find_element_by_xpath('.//div[@class="sale-area"]').text)
# 獲取評論
comment_num.append(content.find_element_by_xpath('.//h4').text)
# 保存數據
df_one = pd.DataFrame({
'title': title,
'price': price,
'sales_num': sales_num,
'comment_num': comment_num
})
return df_one
# 獲取所有頁
def get_all_page():
df_all = pd.DataFrame()
# 初始URL
start_url = 'https://shop387156301.taobao.com/category-1515015677.htm'
# 獲取URL
browser.get(start_url)
# 休眠
time.sleep(3)
for i in range(7): # 共6頁
# 打印進度
print('正在獲取第{}頁'.format(i+1))
# 運行函數
df_one = parse_one_page()
# 循環追加
df_all = df_all.append(df_one, ignore_index=True)
# 判斷
if i == 6:
break
else:
# 點擊翻頁
click_button = browser.find_element_by_css_selector('#J_ShopSearchResult > div > div.shop-hesper-bd.grid > div.pagination > a.J_SearchAsync.next')
click_button.click()
# 休眠3秒
time.sleep(3)
return df_all
if __name__ == '__main__':
# 實例化
browser = webdriver.Chrome()
wait = WebDriverWait(browser, 10)
# 先登錄
login_taobao_acount()
df = get_all_page()
我們獲取到的數據格式如下,共有7頁146條數據:
df.head()
2、數據導入和數據預處理
主要包含以下部分工作:
重複值處理
異常值處理
title:提取一級標題和二級標題
price:提取數值
sales_num:提取數值
comment_num:提取數值
sales_amount:price * sales_num
# 導入包
import numpy as np
import pandas as pd
import re
# 讀入數據
df = pd.read_excel('../data/淘寶劇本商城數據.xlsx')
# 去重
df = df.drop_duplicates()
# 異常替換-預售
df['title'] = df.title.str.replace(r'【預售】', '')
# 標題
df['title_1'] = df.title.str.extract(r'【(.*?)】')
df['title_2'] = df.title.str.extract(r'【.*?】(.*)')
df['title_2'] = df.title_2.str.replace(re.compile(r'【.*?】'), '')
# strip
df['title_1'] = df.title_1.str.strip()
df['title_2'] = df.title_2.str.strip()
# 價格
df['price'] = df.price.str.extract(r'(\d+)').astype('int')
# 銷量
df['sales_num'] = df.sales_num.str.extract(r'(\d+)').astype('int')
# 評論數量
df['comment_num'] = df.comment_num.str.extract(r'(\d+)').astype('int')
# 計算銷售額
df['sales_amount'] = df['price'] * df['sales_num']
# 刪除title
df = df.drop(['title'], axis=1)
df.head()
3、數據探索和可視化
from pyecharts.charts import Bar, Pie, Page
from pyecharts import options as opts
from pyecharts.globals import SymbolType, WarningType
WarningType.ShowWarning = False
GoDan商城價格分佈
bins = [0,200,500,1000,4900]
bins_label = ['0-200', '200-500', '500-1000', '1000以上']
price_num = pd.cut(df.price, bins=bins, labels=bins_label)
price_num = price_num.value_counts().sort_index()
price_num
# 產生數據對
data_pair = [list(z) for z in zip(price_num.index.tolist(), price_num.values.tolist())]
# 繪製餅圖
# {a}(系列名稱),{b}(數據項名稱),{c}(數值), {d}(百分比)
pie1 = Pie(init_opts=opts.InitOpts(width='1350px', height='750px'))
pie1.add('', data_pair=data_pair, radius=['35%', '60%'])
pie1.set_global_opts(title_opts=opts.TitleOpts(title='GoDan商城商品價格分佈'),
legend_opts=opts.LegendOpts(orient='vertical', pos_top='15%', pos_left='2%'))
pie1.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}:{d}%"))
pie1.set_colors(['#2C69B0', '#EA6B73', '#AC613C', '#E9C39B'])
pie1.render()
首先看到價格區間。對比桌遊50元以下的價格商品最熱門,GoDan的劇本殺就很不一樣了,而是價格在200 - 500之間產品最多,佔比77.87%。畢竟一個劇本大概需要過五萬字的文學創作,這個價錢也對得起我們的內容創作者。
銷量TOP10劇本
# 銷量top10
sales_top10 = df.groupby('title_1')['sales_num'].sum().sort_values(ascending=False)[:10]
sales_top10 = sales_top10.sort_values()
sales_top10
title_1
朝別梨怨 61
孤城 62
愛幼婦產醫院 64
古鏡奇談-月染長安 66
殺人回憶 76
願我如星君如月 81
惡淵百物語 92
古木吟 95
窺鏡 96
情辭白帝 134
Name: sales_num, dtype: int32
# 條形圖
bar1 = Bar(init_opts=opts.InitOpts(width='1350px', height='750px'))
bar1.add_xaxis(sales_top10.index.to_list())
bar1.add_yaxis('', sales_top10.values.tolist())
bar1.set_global_opts(title_opts=opts.TitleOpts(title='GoDan商城銷量Top10劇本'),
visualmap_opts=opts.VisualMapOpts(max_=134))
bar1.set_series_opts(label_opts=opts.LabelOpts(position='right'))
bar1.reversal_axis()
bar1.render()
最後就是萬衆矚目的top10的劇本排名,前三名「情辭百帝」、「窺鏡」、「古木吟」C君都還沒有玩過,可能是孤落寡聞了,但是「殺人回憶」這個本很多家桌遊店都推過,玩起來非常不錯,有機會可以統統嘗試下。
04
玩了幾百場劇本殺
如何精準發現當中套路
最近C君也沉迷於劇本殺,在玩了很多很多很多劇本後,發現一個驚人的事實,關於一個不用思考就可以找出兇手的邏輯,分享給你,保準你每次都是MVP。
當你玩了上百次劇本殺以後,你會發現當中的犯案動機真的是多種多樣的,有時候還讓人特別意想不到。所以想但從殺人動機、證據推理上推斷出兇手那根本不可能,而且現在許多新出劇本寫的越來越離譜,那該怎麼玩兒呢?
所以古人有云,撥開表明看本質,當中的核心點就是“存在感”,而且是人越少越準。其實這和狼人殺中的珉人是一個道理,都是玄學。
但是劇本殺是遊戲,是短時間信息密集遊戲,所以每一個出場人物都有他純在的道理。舉個例子,去電影院看《唐人街探案》,人人都是福爾摩斯,但在生活中秒變腦殘黨,爲什麼?
其中很重要的就是圈層限定,兇手肯定是常出現的幾個人之中,去掉主角、去掉醬油、可能只有一個人讓你選了,劇本殺也一樣,每個人都有必要的任務,你把每個人任務弄清楚,基本可以得出兇手是誰,這可比去盤邏輯簡單多了。
有人會問,這不就失去了劇本殺的原本的樂趣了麼?那就錯了,其實玩劇本殺的人都知道,能投對兇手的劇本都是好劇本,投錯了的劇本都是垃圾,最後結果還是很重要的。
結語
最後想說的是,劇本殺真的可以發散人的思維,因爲這裏有各種稀奇古怪的劇情,比電視劇可有意思多了,喜歡演戲,喜歡開腦洞的朋友們一定要去嘗試下哦。
參考文獻
劇本殺,能「殺」出一條財路嗎?| 36氪新風向
https://mp.weixin.qq.com/s/evCJdX6JMc3szImf8hwwQw
《天天向上》告訴你,劇本殺有多火
https://mp.weixin.qq.com/s/e4Y6r5pc1qJ2t5pOpfF3Zg
劇本殺是什麼?
https://www.douban.com/note/693384771/
線上井噴,社交新寵劇本殺真的是門好生意嗎?
https://www.shangyexinzhi.com/article/517685.html
本文出品:CDA數據分析師(ID: cdacdacda)
近期推薦閱讀:
【1】整理了我開始分享學習筆記到現在超過250篇優質文章,涵蓋數據分析、爬蟲、機器學習等方面,別再說不知道該從哪開始,實戰哪裏找了【2】【終篇】Pandas中文官方文檔:基礎用法6(含1-5)
如果你覺得文章不錯的話,分享、收藏、在看、留言666是對老表的最大支持。