小言_互联网的博客

用Python分析5187位CSDN博主数据,顺便把昨天扒掉的裤子穿上

438人阅读  评论(0)

大家好,我是小五????

前情回顾:用两种非传统的爬虫,我把CSDN博主的底裤都给爬出来了!,来看看你写的博客各项数据达标了没~

今天就来一波数据分析,走起~

一、数据介绍

数据来源:从CSDN首页Python、Java等十个栏目共爬取7868条数据

数据字段

字段名 含义
blog_name 博主名
code_time 码龄
blog_num 博客数
view_num 访问量
fans_num 粉丝数
like_num 点赞数
comments_num 评论数
collections_num 收藏数

二、数据预处理

首先,我们来预览下数居


   
  1. import pandas as pd
  2. df = pd.read_csv( 'csdn_user.csv',encoding= 'gb18030')
  3. df.info()

从结果来看,除博客数外,其他均为字符型变量。code_time(码龄)存在一条缺失值,删除即可。

df = df.dropna(how='any',axis=0)

由于不同栏目下会有同一作者发布的博客,所以需要依据博主名进行去重处理


   
  1. df1 = df.drop_duplicates(subset= 'blog_name',keep= 'last',ignore_index=True)
  2. print( '重复数据共{}条,现有数据{}条'.format( len(df)- len(df1), len(df1)))

从结果来看,共2680条重复数据,现有5187条博主信息数据。

为后续分析方便,这里将所有的"万+"都转化为对应的数字,如1万+转化为10000(所有的博主的博客数尚未达到一万,故不用转化)。此外,为了解同层次博主排名,加入我自己的博客信息。


   
  1. variable=[ 'view_num', 'fans_num', 'likes_num', 'collections_num']
  2. for  var in variable:
  3.     df1[ var]=df1[ var]. map(lambda x: int(x.replace( '万+', '0000'if  '万+' in x  else x))
  4. df1 = df1. append([{ 'blog_name': '皖渝', 'code_time': '码龄2年', 'blog_num': 43, 'view_num': 40000,
  5.                     'fans_num': 113, 'likes_num': 82, 'comments_num': 99, 'collections_num': 258}],ignore_index=True)

三、探索数据分析

(1)  各类码龄博主分布及平均水平


   
  1. def sns_bar(data,column,ylab,title,adjust_num):
  2.   import numpy as np
  3.   import matplotlib.pyplot as plt
  4.   import seaborn as sns
  5.     plt.rcParams[ 'axes.unicode_minus']=False
  6.  sns.set(font= 'kaiti')
  7.     index=np.arange( len(data))
  8.     plt.figure(figsize=( 10, 6))
  9.     g=sns.barplot(data.index,data[column],
  10.                   palette= 'Set3',alpha= 0.8)
  11.      for name,count in zip(index,data[column]):
  12.         g.text(name,count+adjust_num, int(count),
  13.         ha= 'center',va= 'bottom')
  14.     plt.title(title)
  15.     plt.ylabel(ylab)
  16.     plt.xticks(rotation= 90)
  17.     plt.show()
  18. bloger_code=df1[ 'code_time'].value_counts().to_frame()
  19. sns_bar(bloger_code, 'code_time', '人数', 'CSDN博主码龄分布', 2)

、 从上图来看,在本次爬取的样本中,码龄2年的博主最多,共1124人;其次是码龄1年和3年的,总体来看"年轻"的博主占多数呀。此外,码龄超过15年(包括)的共28人,最长竟达到了20年!(respect)

顺便来计算下,各个码龄层次的博主数据的平均分布情况


   
  1. num_variable=[ 'blog_num', 'view_num', 'fans_num', 'likes_num', 'comments_num', 'collections_num']
  2. bloger_data = df1.groupby( 'code_time')[num_variable].mean()
  3. bloger_data

从上表来看,码龄2年的博主平均发博75篇,平均访问量为47043次,平均粉丝数为92个,平均点赞数为81次,平均评论数为36条,平均收藏数为182条。(哈哈哈,除了发博数和访问量,我都达标了,看来达到平均水平了呀,未来继续努力~)

(2)  构建博主影响力模型

用因子分析法构建影响力模型,如下所示:其中,score为单个博主的影响力综合值,λ为各因子的方差贡献率,F为各个公共因子

这里使用的则是Python自带因子分析库FactorAnalyzer(默认公共因子的数量为3)

1.变量标准化


   
  1. from sklearn  import preprocessing
  2. num_variable=[ 'blog_num', 'view_num', 'fans_num', 'likes_num', 'comments_num', 'collections_num']
  3. df2=pd.concat([df1[[ 'blog_name', 'code_time']],
  4.               pd.DataFrame(preprocessing.scale(df1[num_variable]),columns=num_variable)],axis= 1)

2.确定公共因子个数


   
  1. import numpy.linalg as nlg
  2. C=df2.corr()
  3. eig_value,eig_vector=nlg.eig(C)
  4. eig=pd.DataFrame() #利用变量名和特征值建立一个数据框
  5. eig[ 'names']=df2.columns[ 2:]#列名
  6. eig[ 'eig_value']=eig_value#特征值
  7. # 确定公共因子个数
  8. for k in  range( 1, 7):
  9.     var_cum = eig[ 'eig_value'][:k].sum()/eig[ 'eig_value'].sum()
  10.      print( '累计方差贡献率为{}'.format(var_cum))
  11.      if var_cum>= 0.8:
  12.          print( '确定公共因子数为{}'.format(k))
  13.          break

从输出结果来看,当公共因子数为4个时,累计方差率达到82%,即可解释原数据82%的信息。

3.比较旋转前后载荷矩阵


   
  1. from factor_analyzer  import FactorAnalyzer,Rotator
  2. data = df2[num_variable]  #提取数值型变量
  3. fa = FactorAnalyzer( 4,rotation=None)
  4. fa.fit(data)
  5. print( '未旋转前因子载荷矩阵:\n',fa.loadings_)
  6. rotator = Rotator()
  7. print( "按正交旋转后的因子载荷矩阵:\n", rotator.fit_transform(fa.loadings_))

不难看出,旋转后载荷矩阵各列中的值差别较大。公共因子F1在评论数上的载荷较大,可命名为互动因子;公共因子F2在博客数上载荷较大,可命名为创作因子;公共因子F3在点赞数和收藏数上有着较大的载荷,可命名为认可因子;公共因子F4在粉丝数上有较大的载荷,可命名人气因子

4.计算综合得分


   
  1. fa1 = FactorAnalyzer( 4,rotation= 'varimax')  #使用正交旋转
  2. fa1.fit(data)
  3. def score(factors):
  4.      return sum(factors*fa1.get_factor_variance()[ 1])
  5. scores = []
  6. for i in  range( len(fa1.transform(data))):
  7.      new = score(fa1.transform(data)[i])
  8.     scores. append( new)
  9. df2[ 'scores']=scores
  10. #综合影响力前 10名博主可视化
  11. outstaning_bloger = df2.sort_values(by= 'scores',ascending=False)[: 10][[ 'blog_name', 'scores']].set_index( 'blog_name')
  12. sns_bar(outstaning_bloger, 'scores', '综合影响力', '综合影响力排名前十位10位优质博主', 0.02)

排名前三名的是沉默的王二,guolin,敖丙,向大佬们学习!

再来计算下,我的综合影响力在码龄2年的博主中的排名吧~


   
  1. code_time2_group = df2[df2[ 'code_time']== '码龄2年'].sort_values(by= 'scores',ascending=False,ignore_index=True)
  2. my_rank = code_time2_group[code_time2_group[ 'blog_name']== '皖渝'].index+ 1
  3. print( '码龄2年的博主共{}人,我的排名为第{}名,比例为{}'.format( len(code_time2_group),my_rank[ 0],my_rank[ 0]/ len(code_time2_group)))             

在码龄2年的博主中,我的排名为149名,挤进了前15%呀~

(3)  探究影响力与码龄的相关关系

在得到所有博主的综合影响力后,我们可以思考一个问题:综合影响力是否和码龄的长短有关呢?

1、从纯数据角看,我们可以计算各类码龄博主的平均影响力,如下图所示:


   
  1. code_score = df2.groupby( 'code_time')[ 'scores'].mean().to_frame()
  2. code_score = code_score.sort_values(by= 'scores',ascending=False)
  3. sns_bar(code_score, 'scores', '平均影响力', '各类码龄博主的平均影响力', 0.0005)

从上图来看,明显看出综合影响力较高的博主大多为老博主,而影响力较低的博主大多为新博主。

2、从统计视角看,该问题可转化为不同码龄层次博主的影响力是否有显著性差异。此时,我们尝试使用单因素方差分析,但该方法使用前需要满足两个假定条件:方差齐性和正态性。正态性一般对方差分析结果影响不大,在此忽略。以下,就进行方差齐性的检验。

原假设 :各类码龄博主的影响力方差相等


   
  1. from scipy  import stats
  2. code_time_list = [ '码龄'+str(i)+ '年'  for i in  range( 19)]+[ '码龄20年'
  3. total_df=[]
  4. for code_time in code_time_list:
  5.     total_df. append(df2[df2[ 'code_time']==code_time][ 'scores'])
  6. w,p = stats.levene(*total_df)
  7. w,p

结果表示,在0.05显著性水平下,强烈拒绝原假设。故方差齐性的假设不满足,无法使用单因素方差分析进行探究。继而,我们可以转向非参数统计。在Python中Kruskal可以检验多样本均值差异,且无需假定各样本方差相等。


   
  1. k,p = stats.kruskal(*total_df)
  2. k,p

结果显示,在0.05显著性水平下,强烈拒绝原假设。故我们有充分理由认为不同码龄博主的影响力是具有显著差异的。

以上就是本次分享的全部内容~

凹凸福利

????《图解机器学习—算法原理与Python语言实现》这是一本非常优秀的图解机器学习及其算法的入门书籍。250张图文解读机器学习和算法原理,大量场景应用实例及流程图助你轻松入门机器学习。点击下图可看详情/购买!????

感谢水利水电出版社支持!周末统一兑换!后台回复“读书会”进群,获取最新书籍信息!后台“左下菜单栏”轻松赚币,免费包邮带回家!


转载:https://blog.csdn.net/zhuxiao5/article/details/111399259
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场