B站美食区热门视频播放量影响因素分析

概要

1、背景和分析目的

目的:

本项目基于学习与兴趣,通过对B站2022年美食分区1月份热播视频数据分析,研究美食区用户行为以及分区类别同视频播放量的关系。

分目标如下:

研究的对象包括

(1)目标变量:视频播放量

(2)选用的特征:点赞数、收藏数、转发数、弹幕数、粉丝数、分区类别

将回答,这些用户行为和分区类别因素中,哪些因素对视频播放量有显著影响?其中影响最大的是什么因素?

用到的主要分析方法:

多元线性回归分析

2、用到的主要工具和库

  • 数据获取 :chromedriver、selenium、scrapy
  • 数据分析:statesmodels、pandas、numpy、matplotlib、seaborn
  • IDE:Jupyter Notebook

数据分析

1、数据收集

本次用于分析的数据来源于B站美食分区2022年1月播放热门视频数据,每个分区计划采集前1000个热门视频数据样本共5000条,特征包括up名称、粉丝数、视频bv号、视频发布时间、视频标题、视频播放量、点赞数、投币数、收藏数、转发数、弹幕数等11个特征数据,实际共采集4998个样本数据。

将用于分析的变量及其含义如下:

  • views: 播放量
  • likes:点赞数
  • collections: 收藏数
  • retweets: 转发数
  • danmus: 弹幕数
  • followers: 粉丝数
  • category: 分区类别

2、导入分析所用包

#数据处理
import pandas as pd
import numpy as np
from datetime import datetime
from scipy.stats import norm
from sklearn.preprocessing import MinMaxScaler

#建模
from statsmodels.stats.outliers_influence import variance_inflation_factor
from statsmodels.stats.diagnostic import het_white
import statsmodels.api as sm
from sklearn.model_selection import train_test_split

#可视化
import matplotlib.pyplot as plt
import seaborn as sns

%matplotlib inline
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['font.sans-serif'] = ['simhei']

#不显示warnings
import warnings
warnings.filterwarnings('ignore')

3、分析辅助方法

def cleanData(data):
    data=str(data)
    try:
        if "投币" in data or "分享" in data or "收藏" in data:
            return 0
        elif "万" in data:
            data=float(data.strip().replace("万","").replace("\n","").replace(" ",""))
        else:
            data=round(float(data.strip().replace("\n","").replace(" ",""))/10000,4)
        return data
    except:
        return None

def plot_corr_map(df):
    corr = df.corr()
    _ , ax = plt.subplots( figsize =( 12 , 10 ) )
    cmap = sns.diverging_palette( 220 , 20 , as_cmap = True )
    _ = sns.heatmap(
        corr, 
        cmap = cmap,
        square=True, 
        cbar_kws={ 'shrink' : .9 }, 
        ax=ax, 
        annot = True, 
        annot_kws = { 'fontsize' : 12 }
    )
    plt.show()
    
def plot_scatter(x,y,data):
    sns.regplot(x,y,data)
    plt.title('Relevance: %s and %s'%(x,y))
    plt.show()

4、数据导入

food_mk=pd.read_csv('food_mk.csv')
food_dt=pd.read_csv('food_dt.csv')
food_rl=pd.read_csv('food_rl.csv')
food_rw=pd.read_csv('food_rw.csv')
food_rd=pd.read_csv('food_rd.csv')
food_mk['category']='make'
food_dt['category']='detective'
food_rl['category']='rural'
food_rd['category']='record'
food_rw['category']='review'
food=food_mk.append(food_dt).append(food_rw).append(food_rl).append(food_rd)
food=food.reset_index(drop=True)

5、数据预处理

#缺失值
food.isnull().sum()

#重复值
food[food.video_id.duplicated()]

#收藏、粉丝、播放量等数据清洗
numeric_cols=['followers','likes','collections','danmus','retweets','views']
for i in numeric_cols:
    food[i]=food[i].map(cleanData)  

food=food[food.views<food.views.mean()+food.views.std()*3]
scaler = MinMaxScaler()
food[numeric_cols]= scaler.fit_transform(food[numeric_cols])

#对分区类别变量进行独热编码
cat=pd.get_dummies(food['category'])

#特征合并和删除掉多余的特征
complete=pd.concat([food,cat],axis=1)
complete=complete.drop(['video_id','up_name','video_title','category','coins','release_time'],axis=1)

6、回归分析

(1)选择特征

corr=complete.corr()['views'].sort_values(ascending=False,key=abs)
Features=corr.index[1:]
Excludes=['review','danmus','followers']
Features=[i for i in Features if i not in Excludes]

(2)建模

X=complete[Features]
y=complete['views']
reg=sm.OLS(y,sm.add_constant(X))
model=sm.OLS(y,sm.add_constant(X)).fit()
print(model.summary())

经过逐次剔除不显著的特征变量,最终模型结果如下

(3)统计检验

    拟合优度检验

由OLS回归结果表可得,𝑅2=0.677,修正可决系数为0.677,这说明模型对样本的拟合较好,回归关系可以解释67.7%的变异。

    F检验

由OLS回归结果表可得,针对𝐻0:𝛽1=𝛽2=𝛽3=𝛽4=𝛽5=𝛽6=𝛽7,给定显著性水平𝛼=0.05,F统计量为1462,对应的P值接近于0,应拒绝原假设,说明回归方程显著,即点赞数、收藏数、转发数田园美食分区、美食制作分区、美食侦探分区、美食记录分区联合起来对视频播放量有显著影响。

    t检验

由OLS回归结果表可得,针对H0:𝛽j=0(j=1,2,3,4,5,6,7),给定显著性水平𝛼=0.05,t统计量所对应的P值都小于0.05,说明,当其他解释变量不变的情况下,解释变量即点赞数、收藏数、转发数、田园美食分区、美食制作分区、美食侦探分区、美食记录分区分别对视频播放量有显著影响。

(4)模型验证

    多重共线性检测

检测和结果:VIF<10,模型不存在多重共线性

def checkVIF(X):
    vif = pd.DataFrame()
    vif['Features']=X.columns
    vif['VIF']=[variance_inflation_factor(X.values, i) for i in range(X.shape[1])]
    vif['VIF']=round(vif['VIF'], 2)
    vif=vif.sort_values(by = "VIF", ascending=False)
    return(vif)
checkVIF(X)

异方差性检测

检测和结果:通过怀特检验,F统计量为9.92,对应的p值接近于0,拒绝原假设, 模型存在异方差性

模型修正:用稳健性标准误修正

  • 用怀特检验进行异方差检测
test_result=sm.stats.diagnostic.het_white(model.resid,reg.exog)
print('lm:  {:.2f}'.format(test_result[0]))
print('lm_pvalue:  {:.2f}'.format(test_result[1]))
print('fvalue:  {:.2f}'.format(test_result[2]))
print('f_pvalue: {:.2f}'.format(test_result[3]))

  • 用white标准误修正模型
model_HC0 =sm.OLS(y,sm.add_constant(X)).fit(cov_type='HC0', use_t=True)
print(model_HC0.summary().tables[1])

修正后的回归方程如下

结论

在研究的所有因素包括点赞数、收藏数、转发数、弹幕数、粉丝数、美食制作分区、美食侦探分区、田园美食分区、美食测评分区、美食记录分区中,

  • 除了粉丝数、弹幕数以及美食测评分区这三个因素外,其余的因素都对视频播放量有显著影响。
  • 其中,点赞数带来的影响最大,远超其他几个影响因素,其次是转发数和收藏数。
  • 分区类别因素带来的影响相对比较弱。

#数据分析#
全部评论

相关推荐

07-14 12:22
门头沟学院 Java
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
2
5
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务