Python 3.7.6 (default, Jan 8 2020, 20:23:39) [MSC v.1916 64 bit (AMD64)]
Type "copyright", "credits" or "license" for more information.
IPython 7.12.0 -- An enhanced Interactive Python.
首先,我们读取原始数据。数据集各字段的介绍可参考此处
import pandas as pd
import re
df=pd.read_csv(r'F:\Python\合鲸社区\10-当当网图书分析\图书数据集.csv',delimiter='\t')
df.head(5)
Out[2]:
书名 ... 评论数
0 机器学习 击败AlphaGo的武林秘籍,赢得人机大战的必由之路:人工智能大牛周志华教授巨著... ... 76149条评论
1 机器学习实战【python基础教程指南,python核心编程实例指导,对wxpython数... ... 25256条评论
2 机器学习实战:基于Scikit-Learn和TensorFlow 被称为机器学习图书*强的... ... 5759条评论
3 机器学习理论导引 ... 783条评论
4 机器学习――原理、算法与应用 全书深入浅出,兼具广度与深度,帮助读者真正掌握机器学习、深度... ... 1184条评论
[5 rows x 5 columns]
我们去掉当前价格这一列中的 '¥' 符号,将当前价格中的数值提取出来,保存为新的一列当前价格_match。
df['当前价格_match']=df['当前价格'].str.replace('¥','')
df['当前价格_match']=df['当前价格_match'].astype('float')
对于评论数这一列提取数值,保存为评论数_match。
df['评论数_match']=df['评论数'].str.replace('条评论','').astype('int32')
对于星级这一列提取数值,保存为星级_match。
df['星级_match']=df['星级'].str.replace('width: ','')
df['星级_match']=df['星级_match'].str.replace('%;','').astype('int32')
接着将提取出的星级数值除以20,将取值范围转换为[0,5]。
def function(x):
if x==100:
return '5星'
elif x==90:
return '4星半'
elif x==80:
return '4星'
elif x==70:
return '3星半'
elif x==60:
return '3星'
elif x==50:
return '2星半'
elif x==40:
return '2星'
elif x==30:
return '1星半'
elif x==20:
return '1星'
elif x==10:
return '半星'
else:
return '0星'
df['星级_match']=df['星级_match'].apply(function)
接下来我们处理出版信息这一列,从原始数据中可以看到,这一列主要包含三个信息,分别是作者、出版日期、出版社。它们以“/”分隔,并且存放在一个数据单元中,我们将它们分别取出,然后单独存为三列。
def function_1(x):
return x.split('/')[0]
def function_2(x):
if len(x.split('/',2))==3:
return x.split('/',2)[1]
else:
return '未知'
def function_3(x):
return x.split('/',2)[-1]
df['作者']=df['出版信息'].apply(function_1)
df['出版社']=df['出版信息'].apply(function_3)
df['出版时间']=df['出版信息'].apply(function_2)
书名信息中混合着简介信息,观察原始数据中书名一列,能找到一些规律。除去一些包含在 【】和 [] 中间的标注信息,剩余的内容中书名和其他内容基本是由空格隔开的。所以我们首先将【】和 [] 去掉,然后按照空格分隔字符串,第一个内容便是书名。
首先在书名一列中去掉【】中的信息,并将结果保存为书名_replace:
df['书名_replace']=df['书名'].str.replace('【',' ')
df['书名_replace']=df['书名_replace'].str.replace('】',' ')
接着在书名_replace一列中去掉[]中的信息,保存为书名_replace_replace:
df['书名_replace_replace']=df['书名_replace'].str.replace('[','')
df['书名_replace_replace']=df['书名_replace_replace'].str.replace(']','')
去除方括号【】和[]后我们把书名_replace_replace列中文字根据空格进行字符串分割,并进行分列。
def name(x):
return x.split()[0]
def jianjie_1(x):
a=x.split()
if len(a)==1:
return ' '
else:
return a[1]
def jianjie_2(x):
a=x.split()
if len(a)==3:
return a[2]
else:
return ' '
df['name']=df['书名_replace_replace'].apply(name)
df['简介_1']=df['书名_replace_replace'].apply(jianjie_1)
df['简介_2']=df['书名_replace_replace'].apply(jianjie_2)
在原始数据中和上面操作生成数据中有许多冗余数据列,我们把不需要的数据列都删除掉。
df=df.drop(['书名','出版信息','当前价格','星级','评论数','书名_replace','书名_replace_replace'],axis=1)
df['当前价格']=df['当前价格_match']
df['评论数']=df['评论数_match']
df['星级']=df['星级_match']
df['书名称']=df['name']
df=df.drop(['当前价格_match','评论数_match','星级_match','name'],axis=1)
df=df.reindex(['当前价格','星级','评论数','作者','出版社','出版时间','书名称','简介_1','简介_2'],axis=1)
首先使用读数据表组件读取原始数据,并查看各字段基本情况。
df.head(5)
Out[15]:
当前价格 星级 ... 简介_1 简介_2
0 66.0 4星半 ... 击败AlphaGo的武林秘籍,赢得人机大战的必由之路:人工智能大牛周志华教授巨著,全面揭开机...
1 46.3 4星半 ... python基础教程指南,python核心编程实例指导,对wxpython数据库充分的讲解,...
2 83.3 4星半 ... 被称为机器学习图书*强的存在!前谷歌工程师撰写,“美亚”人工智能图书畅销榜首图书!从实践出发...
3 62.3 5星 ...
4 39.6 4星半 ... 全书深入浅出,兼具广度与深度,帮助读者真正掌握机器学习、深度学习的原理与应用
[5 rows x 9 columns]
这一步使用字段基本信息统计组件统计并生成数据集中各个字段的样本数、均值、标准差、最小值、四分位数等基本信息。
In [23]:
df.describe()
Out[16]:
当前价格 评论数
count 600.000000 600.000000
mean 60.941183 530.863333
std 32.768884 4074.239732
min 14.990000 0.000000
25% 44.075000 0.000000
50% 55.600000 7.000000
75% 69.000000 133.000000
max 355.000000 76149.000000
使用查看唯一值及数量组件,统计图书所属的出版社信息。
df.groupby(['出版社']).size().sort_values(ascending=False)
Out[17]:
出版社
机械工业出版社 215
人民邮电出版社 127
清华大学出版社 112
电子工业出版社 52
东南大学出版社 17
科学出版社 16
北京大学出版社 11
水利水电出版社 8
中国电力出版社 4
人民邮电出版社有限公司 4
中国人民大学出版社 3
化学工业出版社 3
西安电子科技大学出版社 2
中信出版社 2
人民邮电出版社 等 2
华中科技大学出版社 2
科学技术文献出版社 2
知识产权出版社 2
清华大学出版社 人民邮电出版社 2
莎拉・圭多 /2017-01-01 /东南大学出版社 1
中国科学技术大学出版社 1
2020-07-01 1
上海浦江教育出版社 1
武汉大学出版社 1
中山大学出版社 1
哈尔滨工业大学出版社 1
机械工业出版社 清华大学出版社 1
时事出版社 1
广东高等教育出版社 1
冶金工业出版社 1
国防工业出版社 1
北京交通大学出版社 1
2018-05-16 /同济大学出版社 1
dtype: int64
这一步统计图书的星级信息。
star=df.groupby(['星级']).size()
star
Out[18]:
星级
0星 345
1星半 2
2星半 1
3星 2
3星半 4
4星 16
4星半 66
5星 164
dtype: int64
from pyecharts import options as opts
from pyecharts.charts import Bar
from pyecharts.faker import Faker
c=Bar()
c.add_xaxis(star.index.tolist())
c.add_yaxis("数量",star.values.tolist())
c.reversal_axis()
c.set_series_opts(label_opts=opts.LabelOpts(position="right"))
c.set_global_opts(title_opts=opts.TitleOpts(title="各星级的数量"))
c.render_notebook()
使用直方图,显示图书的价格分布。
#16. 图书价格直方图
price=df['当前价格']
price=price.tolist()
cats=pd.cut(price,20,3)
price_1=df.value_counts(cats).sort_index()
price_1
(14.65, 31.99] 66 (31.99, 48.991] 148 (48.991, 65.991] 201 (65.991, 82.992] 114 (82.992, 99.992] 26 (99.992, 116.993] 16 (116.993, 133.993] 5 (133.993, 150.994] 12 (150.994, 167.994] 3 (167.994, 184.995] 3 (184.995, 201.996] 1 (201.996, 218.996] 1 (218.996, 235.996] 1 (235.996, 252.997] 0 (252.997, 269.998] 1 (269.998, 286.998] 0 (286.998, 303.998] 0 (303.998, 320.999] 1 (320.999, 338.0] 0 (338.0, 355.0] 1 dtype: int64
price_index=['(14.65, 31.99)','(31.99, 48.991)','(48.991, 65.991)','(65.991, 82.992)','(82.992, 99.992)','(99.992, 116.993)'
,'(116.993, 133.993)','(133.993, 150.994)','(167.994, 184.995)','(184.995, 201.996)','(201.996, 218.996)',
'(218.996, 235.996)','(235.996, 252.997)','(252.997, 269.998)','(269.998, 286.998)','(286.998, 303.998)',
'(320.999, 338.0)','(338.0, 355.0)']
from pyecharts import options as opts
from pyecharts.charts import Bar
from pyecharts.faker import Faker
c=Bar()
c.add_xaxis(price_index)
c.add_yaxis("在该价格区间的数量", price_1.values.tolist())
c.set_global_opts(title_opts=opts.TitleOpts(title="图书价格直方图"))
c.render_notebook()
在上一步,通过绘制图书价格的直方图,我们发现一部分图书价格偏离样本均值较大,我们接下来针对这一部分图书进行定性分析。我们首先使用数据筛选组件筛选出价格大于100元的图书信息。筛选结果如下表所示:
more_100=df[df['当前价格']>100]
more_100.head(5)
Out[18]:
当前价格 星级 ... 简介_1 简介_2
5 112.6 4星 ... 人工智能算法,机器学习奠基之作,AI圣经
34 104.2 0星 ... 全景式呈现机器学习领域的基础理论,以及将这些技术应用于实际问题的有效方法,提供自学项目和数据集
53 101.9 5星 ... 自动化技术
80 212.5 5星 ... 畅读原版机器学习经典著作,在全景式知识体系中融会传统与创新算法
94 101.1 4星半 ...
[5 rows x 9 columns]
上一步中我们筛选出了价格大于100元的图书,这一步我们使用饼状图展示这一部分图书所属的出版社。
a=more_100.groupby(['出版社']).size().sort_values()
a.pop('2020-07-01')
a
Out[19]:
出版社
北京大学出版社 1
广东高等教育出版社 1
机械工业出版社 清华大学出版社 1
人民邮电出版社 等 2
清华大学出版社 2
清华大学出版社 人民邮电出版社 2
科学出版社 2
电子工业出版社 4
人民邮电出版社 14
机械工业出版社 15
dtype: int64
from pyecharts import options as opts from pyecharts.charts import Pie from pyecharts.faker import Faker c=Pie() c.add( "", [ list(z) for z in zip( a.index.tolist(), a.values.tolist() , ) ], center=["40%", "50%"], ) c.set_global_opts( title_opts=opts.TitleOpts(title="高价书籍所属出版社统计"), legend_opts=opts.LegendOpts(type_="scroll", pos_left="80%", orient="vertical"), ) c.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}")) c.render_notebook()
这一步使用数据分组聚合组件,对图书分组列分组聚合分析。分组的列为出版社,聚合列为图书价格,聚合函数为平均值函数。这一步的分析主要是计算各个出版社出版图书的平均价格的高低。分组聚合分析的结果如下表所示:
c=df['当前价格'].groupby(df['出版社']).mean()
c.drop(['2018-05-16 /同济大学出版社','2020-07-01'])
Out[20]:
出版社
上海浦江教育出版社 73.570000
东南大学出版社 67.027647
中信出版社 35.495000
中国人民大学出版社 37.533333
中国电力出版社 38.475000
中国科学技术大学出版社 47.600000
中山大学出版社 42.300000
人民邮电出版社 60.872913
人民邮电出版社 等 129.235000
人民邮电出版社有限公司 37.505000
冶金工业出版社 36.300000
化学工业出版社 40.166667
北京交通大学出版社 50.600000
北京大学出版社 53.271818
华中科技大学出版社 34.050000
哈尔滨工业大学出版社 59.200000
国防工业出版社 81.200000
广东高等教育出版社 169.970000
时事出版社 59.900000
机械工业出版社 64.535302
机械工业出版社 清华大学出版社 200.000000
武汉大学出版社 30.000000
水利水电出版社 49.475000
清华大学出版社 50.729464
清华大学出版社 人民邮电出版社 290.000000
电子工业出版社 59.374231
知识产权出版社 34.350000
科学出版社 76.913750
科学技术文献出版社 38.950000
莎拉・圭多 /2017-01-01 /东南大学出版社 70.300000
西安电子科技大学出版社 31.050000
Name: 当前价格, dtype: float64
这一步我们通过计算出版社出版机器学习类图书平均星级的高低,来分析出版社出版机器学习类图书的质量以及出版社在用户中的口碑。使用数据分组聚合组件,对图书进行分组聚合分析。分组的列为出版社,聚合列为图书星级,聚合函数为平均值函数。这一步的分析主要是计算各个出版社出版图书的平均星级的高低。分析的结果如下表所示:
df['星级(float)']=df['星级'].str.replace('星','.')
df['星级(float)']=df['星级(float)'].str.replace('半','5')
df['星级(float)']=df['星级(float)'].astype('float')
b=df['星级(float)'].groupby(df['出版社']).mean()
b.drop(['2018-05-16 /同济大学出版社','2020-07-01'])
Out[21]:
出版社
上海浦江教育出版社 0.000000
东南大学出版社 2.000000
中信出版社 4.750000
中国人民大学出版社 4.333333
中国电力出版社 3.625000
中国科学技术大学出版社 5.000000
中山大学出版社 0.000000
人民邮电出版社 1.748031
人民邮电出版社 等 2.500000
人民邮电出版社有限公司 0.375000
冶金工业出版社 0.000000
化学工业出版社 1.666667
北京交通大学出版社 0.000000
北京大学出版社 2.181818
华中科技大学出版社 2.500000
哈尔滨工业大学出版社 0.000000
国防工业出版社 5.000000
广东高等教育出版社 0.000000
时事出版社 3.500000
机械工业出版社 2.006977
机械工业出版社 清华大学出版社 0.000000
武汉大学出版社 0.000000
水利水电出版社 4.750000
清华大学出版社 1.647321
清华大学出版社 人民邮电出版社 5.000000
电子工业出版社 2.605769
知识产权出版社 5.000000
科学出版社 2.187500
科学技术文献出版社 2.500000
莎拉・圭多 /2017-01-01 /东南大学出版社 5.000000
西安电子科技大学出版社 0.000000
Name: 星级(float), dtype: float64
在这一步,我们使用数据按列值排序组件,对上一步的分析结果,按照图书星级平均值星级_mean进行降序排序,结果如下:
b.sort_values(ascending=False).head(5)
Out[22]:
出版社
国防工业出版社 5.0
知识产权出版社 5.0
清华大学出版社 人民邮电出版社 5.0
2020-07-01 5.0
莎拉・圭多 /2017-01-01 /东南大学出版社 5.0
Name: 星级(float), dtype: float64
from pyecharts import options as opts
from pyecharts.charts import WordCloud
from pyecharts.globals import SymbolType
words = [
("学习", 10),
("机器", 61),
("算法", 43),
("实例", 40),
("技术", 24),
("理论", 22),
("应用", 18),
("基础知识", 14),
("数据分析", 11),
("科学", 8),
("基础", 8),
("工程", 5),
("全面", 5),
("清华大学出版社", 5),
("经典", 4),
("著作", 3),
("智能", 3),
("张敏玲", 2),
("模型", 2),
("问题", 2),
("王磊", 2),
("机械", 22),
("于洋", 18),
("周志华", 14),
("可视化", 11),
("阿图尔", 8),
("数据挖掘", 8),
("帮助", 2),
("大量", 5),
("实际使用", 5),
("深度", 6),
("平台", 3),
("视频", 3),
("场景", 8),
("原理", 7),
("图书", 5),
]
c=WordCloud()
c.add("词云图", words, word_size_range=[20, 100], shape=SymbolType.DIAMOND)
c.set_global_opts(title_opts=opts.TitleOpts(title="WordCloud-shape-diamond"))
c.render_notebook()