Python實戰案例,pyecharts模塊,Python實現抖音大v數據可視化 前言 開發工具 環境搭建 獲取數據 數據可視化

前言

利用Python實現抖音大v數據可視化,廢話不多說~

讓我們愉快地開始吧~

開發工具

Python版本: 3.6.4

相關模塊:

pyecharts模塊;

matplotlib模塊;

wordcloud模塊;

PIL模塊;

pandas模塊

numpy模塊

jieba模塊;

以及一些Python自帶的模塊。

環境搭建

安裝Python並添加到環境變量,pip安裝需要的相關模塊即可。

這一期就給大家用數據分析一下在抖音,什麼類型的視頻最受歡迎

獲取數據

數據來自於第三方,一共是有5000+抖音大V的數據信息

主要包含大V們的暱稱、性別、地點、類型、點贊數、粉絲數、視頻數、評論數、分享數、關注數、畢業學校、認證、簡介等信息

數據可視化

代碼實現

from pyecharts.charts import Pie, Bar, TreeMap, Map, Geo
from wordcloud import WordCloud, ImageColorGenerator
from pyecharts import options as opts
import matplotlib.pyplot as plt
from PIL import Image
import pandas as pd
import numpy as np
import jieba

df = pd.read_csv('douyin.csv', header=0, encoding='utf-8-sig')
print(df)

性別分佈情況

從圖上看,男女比例差別不大

可視化代碼實現①

def create_gender(df):
    df = df.copy()
    # 修改數值
    df.loc[df.gender == '0', 'gender'] = '未知'
    df.loc[df.gender == '1', 'gender'] = '男性'
    df.loc[df.gender == '2', 'gender'] = '女性'
    # 根據性別分組
    gender_message = df.groupby(['gender'])
    # 對分組後的結果進行計數
    gender_com = gender_message['gender'].agg(['count'])
    gender_com.reset_index(inplace=True)

    # 餅圖數據
    attr = gender_com['gender']
    v1 = gender_com['count']

    # 初始化配置
    pie = Pie(init_opts=opts.InitOpts(width="800px", height="400px"))
    # 添加數據,設置半徑
    pie.add("", [list(z) for z in zip(attr, v1)], radius=["40%", "75%"])
    # 設置全局配置項,標題、圖例、工具箱(下載圖片)
    pie.set_global_opts(title_opts=opts.TitleOpts(title="抖音大V性別分佈情況", pos_left="center", pos_top="top"),
                        legend_opts=opts.LegendOpts(orient="vertical", pos_left="left"),
                        toolbox_opts=opts.ToolboxOpts(is_show=True, feature={"saveAsImage": {}}))
    # 設置系列配置項,標籤樣式
    pie.set_series_opts(label_opts=opts.LabelOpts(is_show=True, formatter="{b}:{d}%"))
    pie.render("抖音大V性別分佈情況.html")

點贊

點贊數TOP10,除了「小團團」和「毒舌」,其他都是新聞媒體類的大V

記得「四川觀察」還被評論區調侃爲四處觀察,意思是發佈消息非常快

點贊破億的有500多個大V,1000萬到5000萬點贊數的大V人數最多

可視化代碼實現②

def create_likes(df):
    # 排序,降序
    df = df.sort_values('likes', ascending=False)
    # 獲取TOP10的數據
    attr = df['name'][0:10]
    v1 = [float('%.1f' % (float(i) / 100000000)) for i in df['likes'][0:10]]

    # 初始化配置
    bar = Bar(init_opts=opts.InitOpts(width="800px", height="400px"))
    # x軸數據
    bar.add_xaxis(list(reversed(attr.tolist())))
    # y軸數據
    bar.add_yaxis("", list(reversed(v1)))
    # 設置全局配置項,標題、工具箱(下載圖片)、y軸分割線
    bar.set_global_opts(title_opts=opts.TitleOpts(title="抖音大V點贊數TOP10(億)", pos_left="center", pos_top="18"),
                        toolbox_opts=opts.ToolboxOpts(is_show=True, feature={"saveAsImage": {}}),
                        xaxis_opts=opts.AxisOpts(splitline_opts=opts.SplitLineOpts(is_show=True)))
    # 設置系列配置項,標籤樣式
    bar.set_series_opts(label_opts=opts.LabelOpts(is_show=True, position="right", color="black"))
    bar.reversal_axis()
    bar.render("抖音大V點贊數TOP10(億).html")


def create_cut_likes(df):
    # 將數據分段
    Bins = [0, 1000000, 5000000, 10000000, 25000000, 50000000, 100000000, 5000000000]
    Labels = ['0-100', '100-500', '500-1000', '1000-2500', '2500-5000', '5000-10000', '10000以上']
    len_stage = pd.cut(df['likes'], bins=Bins, labels=Labels).value_counts().sort_index()
    # 獲取數據
    attr = len_stage.index.tolist()
    v1 = len_stage.values.tolist()

    # 生成柱狀圖
    bar = Bar(init_opts=opts.InitOpts(width="800px", height="400px"))
    bar.add_xaxis(attr)
    bar.add_yaxis("", v1)
    bar.set_global_opts(title_opts=opts.TitleOpts(title="抖音大V點贊數分佈情況(萬)", pos_left="center", pos_top="18"),
                        toolbox_opts=opts.ToolboxOpts(is_show=True, feature={"saveAsImage": {}}),
                        yaxis_opts=opts.AxisOpts(splitline_opts=opts.SplitLineOpts(is_show=True)))
    bar.set_series_opts(label_opts=opts.LabelOpts(is_show=True, position="top", color="black"))
    bar.render("抖音大V點贊數分佈情況(萬).html")

粉絲

「人民日報」和「央視新聞」粉絲都破億

今年直播帶貨火熱,李佳琦排入前十,也不足爲奇,畢竟帶貨一哥

大V們粉絲數的分佈情況

5000萬以上56個,都是大佬~

評論數TOP10

總的來說,媒體類的視頻評論較多

分享數TOP10

從圖上看,大家還是比較喜歡分享新聞類以及美食類的視頻

各類型點贊數/粉絲數彙總分佈圖

可視化代碼實現③

def create_type_likes(df):
    # 分組求和
    likes_type_message = df.groupby(['category'])
    likes_type_com = likes_type_message['likes'].agg(['sum'])
    likes_type_com.reset_index(inplace=True)
    # 處理數據
    dom = []
    for name, num in zip(likes_type_com['category'], likes_type_com['sum']):
        data = {}
        data['name'] = name
        data['value'] = num
        dom.append(data)
    print(dom)

    # 初始化配置
    treemap = TreeMap(init_opts=opts.InitOpts(width="800px", height="400px"))
    # 添加數據
    treemap.add('', dom)
    # 設置全局配置項,標題、工具箱(下載圖片)
    treemap.set_global_opts(title_opts=opts.TitleOpts(title="各類型抖音大V點贊數彙總圖", pos_left="center", pos_top="5"),
                            toolbox_opts=opts.ToolboxOpts(is_show=True, feature={"saveAsImage": {}}),
                            legend_opts=opts.LegendOpts(is_show=False))

    treemap.render("各類型抖音大V點贊數彙總圖.html")

平均視頻點贊數/粉絲數TOP10

李現作爲2019年的頂級流量,登頂第一

可視化代碼實現④

def create_avg_likes(df):
    # 篩選
    df = df[df['videos'] > 0]
    # 計算單個視頻平均點贊數
    df.eval('result = likes/(videos*10000)', inplace=True)
    df['result'] = df['result'].round(decimals=1)
    df = df.sort_values('result', ascending=False)

    # 取TOP10
    attr = df['name'][0:10]
    v1 = ['%.1f' % (float(i)) for i in  df['result'][0:10]]

    # 初始化配置
    bar = Bar(init_opts=opts.InitOpts(width="800px", height="400px"))
    # 添加數據
    bar.add_xaxis(list(reversed(attr.tolist())))
    bar.add_yaxis("", list(reversed(v1)))
    # 設置全局配置項,標題、工具箱(下載圖片)、y軸分割線
    bar.set_global_opts(title_opts=opts.TitleOpts(title="抖音大V平均視頻點贊數TOP10(萬)", pos_left="center", pos_top="18"),
                        toolbox_opts=opts.ToolboxOpts(is_show=True, feature={"saveAsImage": {}}),
                        xaxis_opts=opts.AxisOpts(splitline_opts=opts.SplitLineOpts(is_show=True)))
    # 設置系列配置項
    bar.set_series_opts(label_opts=opts.LabelOpts(is_show=True, position="right", color="black"))
    # 翻轉xy軸
    bar.reversal_axis()
    bar.render("抖音大V平均視頻點贊數TOP10(萬).html")

抖音大V分佈情況

廣東、浙江、四川位列前三

可視化代碼實現⑤

def create_province_map(df):
    # 篩選數據
    df = df[df["country"] == "中國"]
    df1 = df.copy()
    # 數據替換
    df1["province"] = df1["province"].str.replace("省", "").str.replace("壯族自治區", "").str.replace("維吾爾自治區", "").str.replace("自治區", "")
    # 分組計數
    df_num = df1.groupby("province")["province"].agg(count="count")
    df_province = df_num.index.values.tolist()
    df_count = df_num["count"].values.tolist()

    # 初始化配置
    map = Map(init_opts=opts.InitOpts(width="800px", height="400px"))
    # 中國地圖
    map.add("", [list(z) for z in zip(df_province, df_count)], "china")
    # 設置全局配置項,標題、工具箱(下載圖片)、顏色圖例
    map.set_global_opts(title_opts=opts.TitleOpts(title="抖音大V省份分佈情況", pos_left="center", pos_top="0"),
                        toolbox_opts=opts.ToolboxOpts(is_show=True, feature={"saveAsImage": {}}),
                        # 設置數值範圍0-600,is_piecewise標籤值連續
                        visualmap_opts=opts.VisualMapOpts(max_=600, is_piecewise=False))
    map.render("抖音大V省份分佈情況.html")

城市TOP10

北京遙遙領先,大V的聚集地

可視化代碼實現⑥

def create_city(df):
    df1 = df[df["country"] == "中國"]
    df1 = df1.copy()
    df1["city"] = df1["city"].str.replace("市", "")

    df_num = df1.groupby("city")["city"].agg(count="count").reset_index().sort_values(by="count", ascending=False)
    df_city = df_num[:10]["city"].values.tolist()
    df_count = df_num[:10]["count"].values.tolist()

    bar = Bar(init_opts=opts.InitOpts(width="800px", height="400px"))
    bar.add_xaxis(df_city)
    bar.add_yaxis("", df_count)
    bar.set_global_opts(title_opts=opts.TitleOpts(title="抖音大V城市分佈TOP10", pos_left="center", pos_top="18"),
                        toolbox_opts=opts.ToolboxOpts(is_show=True, feature={"saveAsImage": {}}),
                        yaxis_opts=opts.AxisOpts(splitline_opts=opts.SplitLineOpts(is_show=True)))
    bar.set_series_opts(label_opts=opts.LabelOpts(is_show=True, position="top", color="black"))
    bar.render("抖音大V城市分佈TOP10.html")

國外Top10

美國居第一,不少在美國的華人會分享他們在美國生活的一些事情

抖音大V畢業學校TOP10

北影、中傳、浙傳、中戲、上戲、央美,妥妥的演藝圈大佬

代碼實現查詢認證情況

df1 = df[(df["custom_verify"] != "") & (df["custom_verify"] != "未知")]
df1 = df1.copy()
df_num = df1.groupby("custom_verify")["custom_verify"].agg(count="count").reset_index().sort_values(by="count", ascending=False)
print(df_num[:20])

結果

抖音大V簡介詞雲

可以看到大部分大V都留下了商務合作的信息,利好內容創作者,如此才能雙贏

可視化代碼實現⑦

def create_wordcloud(df, picture):
    words = pd.read_csv('chineseStopWords.txt', encoding='gbk', sep='\t', names=['stopword'])
    # 分詞
    text = ''
    df1 = df[df["signature"] != ""]
    df1 = df1.copy()
    for line in df1['signature']:
        text += ' '.join(jieba.cut(str(line).replace(" ", ""), cut_all=False))
    # 停用詞
    stopwords = set('')
    stopwords.update(words['stopword'])
    backgroud_Image = plt.imread('douyin.png')
    # 使用抖音背景色
    alice_coloring = np.array(Image.open(r"douyin.png"))
    image_colors = ImageColorGenerator(alice_coloring)
    wc = WordCloud(
        background_color='white',
        mask=backgroud_Image,
        font_path='方正蘭亭刊黑.TTF',
        max_words=2000,
        max_font_size=70,
        min_font_size=1,
        prefer_horizontal=1,
        color_func=image_colors,
        random_state=50,
        stopwords=stopwords,
        margin=5
    )
    wc.generate_from_text(text)
    # 看看詞頻高的有哪些
    process_word = WordCloud.process_text(wc, text)
    sort = sorted(process_word.items(), key=lambda e: e[1], reverse=True)
    print(sort[:50])
    plt.imshow(wc)
    plt.axis('off')
    wc.to_file(picture)
    print('生成詞雲成功!')
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章