Fate

使用matplotlib对b站前10000名用户做简单分析

Markdown

summary: 在前面几篇文章中我安装了MySQLdb,然后我利用MySQLdb爬取了b站前10000名用户,现在我将使用matplotlib对这些数据做一个简单的数据分析.

对b站会员的等级分布做一个简单的饼图分析.

  • 在这里我们可以看到b站的等级是分为1-6总共6个等级,其中等级4的人是占比最大的.等级6的人所占人数不过0.31%.
    Markdown

对b站会员的粉丝数做一个简单的柱状图分析.

  • 我将粉丝人数分为了6个区间,从柱状图可以看到b站的粉丝数是呈现一个递减的趋势,而且0-10粉丝数的人处于最多的那一片.或许这个图的区间还太大了,描述的不够精确.于是我们细分一下区间.
    Markdown

  • 这样的话可以看到图有一点波动,但是还是描述的不够好.
    Markdown

源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#coding:utf-8
import MySQLdb
from numpy.random.mtrand import np
import matplotlib.pylab as plt
def draw_pie():
'''
#函数说明
pie(x, explode=None, labels=None,
colors=('b', 'g', 'r', 'c', 'm', 'y', 'k', 'w'),
autopct=None, pctdistance=0.6, shadow=False,
labeldistance=1.1, startangle=None, radius=None,
counterclock=True, wedgeprops=None, textprops=None,
center = (0, 0), frame = False )
x (每一块)的比例,如果sum(x) > 1会使用sum(x)归一化
labels (每一块)饼图外侧显示的说明文字
explode (每一块)离开中心距离
startangle 起始绘制角度,默认图是从x轴正方向逆时针画起,如设定=90则从y轴正方向画起
shadow 是否阴影
labeldistance label绘制位置,相对于半径的比例, 如<1则绘制在饼图内侧
autopct 控制饼图内百分比设置,可以使用format字符串或者format function
'%1.1f'指小数点前后位数(没有用空格补齐)
pctdistance 类似于labeldistance,指定autopct的位置刻度
radius 控制饼图半径
返回值:
如果没有设置autopct,返回(patches, texts)
如果设置autopct,返回(patches, texts, autotexts)
patches -- list --matplotlib.patches.Wedge对象
texts autotexts -- matplotlib.text.Text对象
'''
conn = MySQLdb.connect(host='localhost', user='root', passwd='helloworld', port=3306,db='bilibili_user',charset='utf8')
cur = conn.cursor()
level_count = []
for i in range(0,6):
sql = 'select * from user_info where level='+str(i+1)
level_count.append(cur.execute(sql))
cur.close()
conn.close()
labels = [u'Level-1', u'Level-2', u'Level-3', u'Level-4',u'Level-5',u'Level-6']
colors = ['red', 'yellow', 'blue', 'green','orange']
expl = [0,0,0,0.1,0,0] #每一块离开圆心的距离
plt.pie(level_count, explode=expl, labels=labels, colors=colors, labeldistance=1.1, autopct='%.3f%%', shadow=False)
plt.title('bilibili top 10000 user ratings analysis')
plt.axis('equal') #加上这句让 x y 轴相等成为标准的圆
plt.legend(loc='upper left', bbox_to_anchor=(-0.17, 1.1))
plt.show()
plt.close()
def draw_bar():
conn = MySQLdb.connect(host='localhost', user='root', passwd='helloworld', port=3306,db='bilibili_user',charset='utf8')
cur = conn.cursor()
fans_count = []
fans_num = [0,5,10,100,1000,1000000]
labels = ['0','1-5','6-10','11-100','101-1000','1001-10000']
pre = 0
for i in range(len(fans_num)):
sql = 'select * from user_info where fans<='+str(fans_num[i])
now = cur.execute(sql)
fans_count.append(now-pre)
pre=now
cur.close()
conn.close()
width = 0.5
ind = np.linspace(0,len(fans_num),len(fans_num))
# make a square figure
fig = plt.figure(1)
ax = fig.add_subplot(111)
# Bar Plot
ax.bar(ind-width/2,fans_count,width,color='green')
# Set the ticks on x-axis
ax.set_xticks(ind)
ax.set_xticklabels(labels)
# labels
ax.set_xlabel('Fan number interval')
ax.set_ylabel('Number of Fans')
# title
ax.set_title('bilibili top 10000 users fans')
plt.grid(True)
plt.show()
plt.close()
if __name__ == '__main__':
#draw_pie()
draw_bar()

小结

  • 一直对数据分析这个方向比较感兴趣,很想做一点等级与粉丝数的相关性分析,但是现在自己要考研,没时间做深入学习,争取考上研究生能够做数据分析、机器学习方向的研究.
  • 感兴趣的同学可以试下:b站用户爬虫

热评文章