【導語】:今天我們來聊聊五月天這場刷屏朋友圈的線上演唱會,Python技術部分請看第四部分。
Show me data,用數據說話!
在五月的最後一天,五月天實現了他們2020年的“五月之約”。5月31日 一場席捲朋友圈的線上演唱會如約上演。
空蕩的體育館,數萬根銀光棒,一個樂隊獨自在開狂歡的party ,感覺最近真的被蛋黃長裙洗腦了,深陷Jony J 魔咒。
好,讓我們言歸正傳。五月天實現了5月的約定,歌迷滿足了娛樂填補內心空虛的需求,要不真的要去擺地攤了,所以這場演唱也是瞬間火遍了全網,朋友圈刷屏的都是“五月天線上演唱會”。
雖然只有短短一個小時,沒有安可的喊聲,但是現場的效果還是非常好的。五月天唱着青春、夢想,唱着自己的人生經歷,而身處人生各個階段、懷着各種心情的歌迷,似乎都能找到共鳴,得到激勵。
那麼五月天的線上演唱會里,有你的青春嗎?下面讓我們用數據說話。
01、豆瓣9.4分,這場線上演唱會到底多好看?
首先讓我們看到豆瓣上的數據:
截止到目前爲止,五月天的這次線上演唱會共有10萬餘人進行了評價,目前豆瓣評分爲9.4分,是非常高的成績了。
豆瓣評分分佈
進一步分析可以看到,評論中有68.4%的人給出了滿分5星,其次24.2%的人給出了4星。
豆瓣評論詞雲圖
豆瓣評論中大家都在說些什麼呢?可以看到"太短"是大家的統一呼聲,這樣的演唱會一個小時實在是太短了,還有歌迷感嘆到 “五月天的演唱會就像我的青春,猝不及防結束了。”與此同時"青春"、"感動"、"永遠"等也是常出現的高頻詞。
02、喜歡五月天的都是哪些人?
那麼喜歡五月天的都是哪些人呢?最後讓我們看到五月天微博的粉絲畫像,我們一共收集整理的微博評論和粉絲數據在去重後,分別是4288條和4213條。
微博粉絲性別佔比
首先在性別佔比方面,五月天的粉絲中女歌迷是主力,佔到了79.84%,男歌迷佔比20.16%。
微博粉絲地區分佈
在粉絲分佈方面,廣東省是最多的位居榜首,其次身處海外的歌迷也不少,位居第二。北京、浙江、江蘇分別位居三四五名。
微博粉絲年齡分佈
粉絲的年齡分佈方面,不用想,90後妥妥的佔到了絕大多數,佔比高達71.11%。其次是00後,佔比12.74,80後位居第三7.88%。粉絲中也不乏一些10後,佔比4.81%。
03、線上開唱1小時,3500萬人在線同步觀看
我們整理分析了QQ音樂上五月天的評論數據,去重之後得到7126條樣本。下面先看到結論:
評論實時走勢圖
可以看到,在整體評論的實時走勢圖來看:關於五月天的評論留言在5月31日線上演唱會當天達到頂峯,之後逐步回落,趨於平穩。
整體評論詞雲
那麼評論中大家都在說些什麼呢?
看到整體評論的詞雲圖,我們發現在當中"喜歡"、"希望"、"感動"都是出現頻率特別高的詞;還有就是"青春"這個詞也多次出現,的確,尤其對於90後來說,五月天就是我們這一代人的青春記憶。
同時關於本次線上演唱會也是討論的焦點,比如"直播"、"現場"、"回放"等都被大家提及。與此同時,《知足》、《倔強》等歌也在評論中多次出現,這些也是最讓人產生共鳴的歌曲。
評論中關注成員對比
那麼五月天的成員中,大家關注度最高的是哪位成員呢?沒錯,在這方面,阿信是毫無懸念的第一位。其他幾位成員冠佑、怪獸、石頭和瑪莎的關注度就差不多了,平分秋色。
阿信評論詞雲圖
關於阿信的評論大家都在說些什麼?看到詞雲圖,最主要的就是"喜歡"、"希望"、表達歌迷對阿信的喜愛和美好祝願的,其次還提到其他幾個樂隊成員,有意思的是提"前女友"的也特別多。
評論關注歌曲對比
五月天的金曲實在是太多太多了,哪些歌曲是最受大家關注的呢?
通過分析整理可以看到,提到最多的就是《突然好想你》了,然後就是《知足》《倔強》。除此之外,還有《我不願讓你一個人》《星空》《盛夏光年》等等,全都是耳熟能詳的名曲。
04、教你用Python分析,QQ音樂評論數據
我們使用Python分別獲取了QQ音樂五月天/TME live評論數據、豆瓣短評數據和微博樂高中國的評論和粉絲數據,進行了數據分析。此處展示QQ音樂評論分析部分關鍵代碼,整體的分析流程如下:
- 評論數據獲取
- 數據預處理
- 數據可視化分析
01 數據獲取
首先,我們獲取五月天/TME live的評論數據,地址如下:
https://y.qq.com/n/yqq/mv/v/k0034mj6ty2.html
通過分析網頁可以發現,評論的數據是通過js進行動態加載的,使用chrome瀏覽器簡單的抓包分析,得到真實的數據傳輸接口,通過精簡網址並修改其中的pageSize參數即可得到所有的數據。
代碼如下:
# 導入包
import pandas as pd
import time
import requests
import json
from faker import Factory
def get_qq_comment(page_num):
"""
功能:傳入頁面數,獲取QQ音樂評論數據。
"""
# 存儲數據
df_all = pd.DataFrame()
for i in range(page_num):
# 打印進度
print('我正在獲取第{}頁的信息'.format(i))
# 獲取URL
url = 'https://c.y.qq.com/base/fcgi-bin/fcg_global_comment_h5.fcg?g_tk_new_20200303=1516279237&g_tk=470981629&loginUin=2315561922&hostUin=0&format=json&inCharset=utf8&outCharset=GB2312¬ice=0&platform=yqq.json&needNewCode=0&cid=205360772&reqtype=2&biztype=5&topid=k0034mj6ty2&cmd=8&needmusiccrit=0&pagenum={}&pagesize=25&domain=qq.com&ct=24&cv=10101010'.format(i)
# 添加headers
headers = {
'user-agent': Factory.create().user_agent()
}
# 發起請求
r = requests.get(url, headers=headers)
# 解析網頁
json_data = json.loads(r.text)
# 獲取數據
comment_list = json_data['comment']['commentlist']
# 暱稱
nick_name = [i.get('nick') for i in comment_list]
# 評論內容
content = [i.get('rootcommentcontent') for i in comment_list]
# 評論時間
comment_time = [i.get('time') for i in comment_list]
# 存儲數據
df = pd.DataFrame({
'nick_name': nick_name,
'content': content,
'comment_time': comment_time
})
# 追加數據
df_all = df_all.append(df, ignore_index=True)
# 休眠一秒
time.sleep(1)
return df_all
if __name__ == '__main__':
# 運行函數
df = get_qq_comment(page_num=286)
通過以上程序,獲取到7127條評論數據。獲取數據格式如下所示:
df.head()
02 讀入數據和數據預處理
此處我們主要對以上獲取的數據集進行整理和清洗。工作包含:
- 檢查重複值和空值
- comment_time:將時間戳轉換成標準的時間格式
- content:替換錯誤值
# 導入所需包
import numpy as np
import re
import jieba
# 讀入數據
df = pd.read_excel('../data/五月天QQ評論數據6.05.xlsx')
# 刪除重複值
df = df.drop_duplicates()
# 轉換函數
def transform_time(time_second):
time_array = time.localtime(time_second)
otherStyleTime = time.strftime('%Y-%m-%d %H:%M:%S', time_array)
return otherStyleTime
# 時間數據處理
df['comment_time'] = df['comment_time'].apply(lambda x: transform_time(x))
# content初步處理
pattern = re.compile('\[em\](.*?)\[/em\]')
df['content'] = df.content.str.replace(pattern, '')
df.head()
03 數據可視化分析
接下來我們使用數據可視化庫pyecharts進行以下的數據可視化分析,詞雲工具使用stylecloud庫。
# 導入庫
from pyecharts.charts import Pie, Bar, Map, Line, WordCloud, Page
from pyecharts import options as opts
from pyecharts.globals import SymbolType
import stylecloud
五月天QQ音樂評論日期走勢圖
# 日期數量
df['comment_time'] = pd.to_datetime(df['comment_time'])
day_num = df.comment_time.astype('str').str.split(':').str[0].value_counts().sort_index()
# 產生數據
x1_line1 = [i.split('2020-')[1] for i in day_num.index.values.tolist()]
y1_line1 = day_num.values.tolist()
# 繪製面積圖
line1 = Line(init_opts=opts.InitOpts(width='1350px', height='750px'))
line1.add_xaxis(x1_line1)
line1.add_yaxis('', y1_line1,
markpoint_opts=opts.MarkPointOpts(data=[
opts.MarkPointItem(type_='max', name='最大值'),
opts.MarkPointItem(type_='min', name='最小值')
]))
line1.set_global_opts(title_opts=opts.TitleOpts('五月天QQ音樂評論日期走勢圖'),
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate='90')),
visualmap_opts=opts.VisualMapOpts(max_=2000)
)
line1.set_series_opts(label_opts=opts.LabelOpts(is_show=False),
linestyle_opts=opts.LineStyleOpts(width=3))
line1.render()
QQ音樂評論中關注歌手對比
# 計數
axin = df.content.str.contains('阿信|陳信宏').sum()
guaishou = df.content.str.contains('溫尚翊|阿翊|怪獸|團長').sum()
shitou = df.content.str.contains('石錦航|石頭').sum()
masha = df.content.str.contains('蔡升晏|瑪莎').sum()
guanyou = df.content.str.contains('劉冠佑|冠佑|劉諺明|劉浩明').sum()
actor_list = ['阿信', '怪獸', '石頭', '瑪莎', '冠佑']
actor_num = [int(axin), int(guaishou), int(shitou), int(masha), int(guanyou)]
# 條形圖
bar1 = Bar(init_opts=opts.InitOpts(width='1350px', height='750px'))
bar1.add_xaxis(actor_list)
bar1.add_yaxis('', actor_num)
bar1.set_global_opts(title_opts=opts.TitleOpts(title='QQ音樂評論中關注歌手對比'),
visualmap_opts=opts.VisualMapOpts(max_=150),
)
bar1.render()
QQ音樂評論中關注歌曲對比
# 歌曲名稱
music_list = ['一顆蘋果', '盛夏光年', '孫悟空', '星空', '我不願讓你一個人',
'派對動物', '離開地球表面', '突然好想你', '愛情的模樣', '戀愛ing',
'知足', '諾亞方舟', '倔強']
music_num = [int(df.content.str.contains(pattern).sum()) for pattern in music_list]
# 創建df
df_music = pd.DataFrame({
'music_name': music_list,
'music_num': music_num
}).sort_values('music_num', ascending=True)
# 條形圖
bar2 = Bar(init_opts=opts.InitOpts(width='1350px', height='750px'))
bar2.add_xaxis(df_music.music_name.values.tolist())
bar2.add_yaxis('', df_music.music_num.values.tolist())
bar2.set_global_opts(title_opts=opts.TitleOpts(title='QQ音樂評論中關注歌曲對比'),
visualmap_opts=opts.VisualMapOpts(max_=307),
)
bar2.set_series_opts(label_opts=opts.LabelOpts(position='right'))
bar2.reversal_axis()
bar2.render()
QQ評論整體詞雲圖
stylecloud.gen_stylecloud(text=' '.join(text_all), # text需要是str類型
max_words=1000,
collocations=False,
font_path=r'C:\Windows\Fonts\msyh.ttc',
icon_name='fas fa-comments',
size=768,
output_name='QQ音樂評論整體詞雲圖.png'
)
作者:澤龍、Mika
數據:真達
後期:澤龍
(1)獲取更多優質內容及精彩資訊,可前往:https://www.cda.cn/?seo
(2)瞭解更多數據領域的優質課程: