目录
1. 报告摘要
摘要:本文研究的数据来源于2008-2020中国上市公司股吧评论数据库,其中包括有帖子总量、帖子情感属性、阅读量、评论量等字段。基于此数据库,本文利用pandas、matplotlib、pyecharts等常见数据分析python库对这部分数据进行深入分析、挖掘,并对挖掘到得规则进行可视化分析,以期从中挖掘出上市公司股吧评论数据库中有价值的规则。
本文以时间跨度和公司跨度两个维度上进行分析,从2008-2020年所有数据分析再到个别年份数据分析、从整个股吧数据分析再到个别公司股吧数据分析等,这过程中本文挖掘出众多规则,并将其进行可视化处理,建立了并列直方图、箱型图、饼图、3D直方图、3D散点图、漏斗图、水滴图等多达15种图表,28张图表。分析这些图标,本文发现股吧每年变化情况较大,股吧中正向情绪占据主导地位,股吧的种种现象与我们的生活联系紧密。
关键词:股吧评论,帖子情感倾向,可视化分析
2. 报告正文
2.1 2008-2020年股吧总体分析
(1) 2008-2020年股吧综合参数(折线图)
1. def get_line(file_path):
2. filelist = os.listdir(file_path)
3. x_data, Readnum, Tpostnum, Commentnum, Pospostnum, Negpostnum,
4. Neupostnum = []
5. for file in filelist: # 遍历所有数据文件
6. olddir = os.path.join(file_path, file) # 文件相对路径
7. print(olddir)
8. filename = os.path.splitext(file)[0]
9. filetype = os.path.splitext(file)[1]
10. if filetype == '.csv':
11. df = pd.read_csv(olddir)
12. x_data.append(filename)
13. Readnum.append(df.Readnum.sum())
14. Tpostnum.append(int(df.Tpostnum.sum()))
15. Commentnum.append(int(df.Commentnum.sum()))
16. Pospostnum.append(int(df.Pospostnum.sum()))
17. Negpostnum.append(int(df.Negpostnum.sum()))
18. Neupostnum.append(int(df.Neupostnum.sum()))
19. line = Line()
20. line.add_xaxis(list(x_data))
21. line.add_yaxis('Readnum', Readnum)
22. line.add_yaxis('Tpostnum', Tpostnum)
23. line.add_yaxis('Commentnum', Commentnum)
24. line.add_yaxis('Pospostnum', Pospostnum)
25. line.add_yaxis('Neupostnum', Neupostnum)
26. line.set_global_opts(title_opts=opts.TitleOpts(title='2008-2020年年度数据折线图', pos_top='-10%'))
27. Return line
按年份将阅读量、帖子总量、正面帖子、负面帖子、中性帖子、评论数等参数进行求和,绘制出多条折线复合图。
通过上图可以看出,股吧各项指标有着一定的相关性,总体呈正相关,同时通过正面评论总数线总处在负面评论总数的折线之上,可以见得股吧的整体舆情还是呈正面的,特别在2016年正面帖子总数总体远高于负面帖子总数,可以推测2016年股市整体走势较为良好;此外,股吧的帖子总量从2015年开始剧减,直至2018年才开始回升,可以推测股市在这段时间出现了一些较大的变动,导致股民对于股市的讨论热情减退。
(2) 2008-2020年股吧用户参与度(折线图)
1. # 帖子参与度计算,由阅读量/评论数体现
2. def participateline(data_path):
3. # 用data_path获取csv文件
4. filelist = os.listdir(data_path)
5. Participate, Readnum, Commentnum, x_data = []
6. for file in filelist: # 遍历所有数据文件
7. olddir = os.path.join(data_path, file) # 文件相对路径
8. filename = os.path.splitext(file)[0]
9. filetype = os.path.splitext(file)[1]
10. if filetype == '.csv':
11. x_data.append(filename)
12. df = pd.read_csv(olddir)
13. particpate.append(int(int(df.Readnum.sum())/int(df.Commentnum.sum())))
14. Readnum.append(int(df.Readnum.sum()))
15. Commentnum.append(int(df.Commentnum.sum()))
16. line = Line()
17. line.add_xaxis(list(x_data))
18. line.add_yaxis('参与度(阅读数/评论数)', particpate)
19. line.add_yaxis('Readnum', Readnum)
20. line.add_yaxis('Commentnum', Commentnum)
21. line.set_global_opts(title_opts=opts.TitleOpts(title='2008-2020年年度数据折线图', pos_top='-10%'))
22. return line
本图以(阅读数/评论数)作为股吧用户对当前信息讨论得参与度以年为时间刻度进行绘制,希望得出股吧用户在不同年份参与股市情况讨论的热情程度。
由上图可以看出2016年以前,尤其在2012年—2016年,股吧每年阅读量与评论数之比在高速增长,结合之前的总体阅读量走势,可以看出股吧在2016年以前的讨论热度是在上升的,股民对于股市的变化较为上心。但在2018年后,讨论参与度急剧下降,可能出现某种情况致使股民对于股市的热情减退。
(3) 2008-2020年股吧热度排行榜(以阅读量为指标)
1. # 递归文件夹
2. for rank_by in attr:
3. for year_dir in os.listdir(zrr_dir_path):
4. if re.match(r'^\d*$', year_dir):
5. df = pd.read_csv(zrr_dir_path + os.sep + year_dir + os.sep + year_dir + '-hot.csv')
6. df.groupby('Coname')[rank_by].sum().sort_values(ascending=False).head(10).plot(kind= 'bar', y='发帖数', x = '公司名称')
7. plt.xticks(rotation=20)
8. if not os.path.exists('每年排名前十的公司-柱状图'+os.sep+rank_by):
9. os.makedirs('每年排名前十的公司-柱状图'+os.sep+rank_by)
10. plt.xlabel("公司名称")
11. plt.ylabel(attr_map[rank_by])
12. plt.title("%s年%s排名前十公司"%(year_dir, attr_map[rank_by]))
13. plt.savefig('每年排名前十的公司-柱状图'+os.sep+rank_by+os.sep+year_dir+'.jpg', dpi = 600, bbox_inches = 'tight')
以阅读数的高低为公司热度评判标准,可以得到每一年热度排名前十的公司排行榜。分析上图,可以得到以下结论:
对比不同年份的排行榜,可发现不同年份上榜公司变化较大;
对比不同年份的排行榜,可发现2010年前传统行业(如:金融业、重工业、房地产业)的公司比较热度较高,而2011年后科技公司等信息行业上榜数量逐渐增多,科技公司的热度逐渐攀升;
除了2009年外,每年股吧热度排行榜前三与其他公司热度差距较大;
综上分析可得,每年热度排行榜变化大,2010年前主要是传统行业的公司热度较高,2011年后新型行业公司上榜数量增加,可以看出新兴行业公司股票在2011年后股民得关注度上升,可预见未来新兴行业公司的热度将持续上升,而传统行业股票仍然是股民心中的中流砥柱。
(4) 2008-2020年上榜次数频率统计(横向柱状图&饼图)
1. rank_company = [] # 每年上榜公司
2. for year_dir in os.listdir(zrr_dir_path):
3. if re.match(r'^\d*$', year_dir):
4. df = pd.read_csv(zrr_dir_path + os.sep + year_dir + os.sep + year_dir + '-hot.csv')
5. rank_company.extend(list(df.groupby('Coname')["Readnum"].sum().sort_values(ascending=False).head(10).index))
6. count_series = pd.Series(rank_company).value_counts() # 统计上榜次数
7. count_series[count_series > 1].plot(kind='barh', title='近十年上榜公司次数统计(大于一次)') # 统计上榜大于一次数
8. tmp = count_series.value_counts()
9. pie = Pie(init_opts = opts.InitOpts(theme = ThemeType.LIGHT))
10. items = ['上榜' + str(i) + '次公司数量' for i in count_series.value_counts().index]
11. c = ( Pie()
12. .add("", [list(z) for z in zip(items, [int(i) for i in tmp.values])])
13. .set_global_opts(title_opts=opts.TitleOpts(title=<