🌟欢迎来到 我的博客 —— 探索技术的无限可能!
🌟博客的简介(文章目录)
目录
- 摘要
- 前言
- 技术栈
- 开发环境
- 数据说明
- 正文
- 数据获取
- 数据存储
- 数据清理
- 数据分析
- 数据挖掘
- 关联规则
- 二分类预测
- 数据可视化
- 书籍价格区间柱状图
- 书籍评分分布散点图
- 书籍包装类型占比柱状图
- 书籍出版时间分布
- 借阅图书数量前20出版社柱状图
- 借阅排名前20的书籍作者柱状图
- 借阅排名前十的书籍类型占比饼图
- 书籍书名词云
- 可视化大屏(Flask)
摘要
在数字化时代背景下,图书馆已经成为知识获取和共享的重要场所。然而,随着馆藏书籍数量的增加,如何高效管理和利用这些资源成为了图书馆管理者和用户面临的挑战。数据分析和可视化技术的引入为解决这一问题提供了新的途径。本文致力于通过数据分析技术和可视化手段,对图书馆书籍数据进行综合挖掘,希望通过图书分类、书籍价格及读者偏好等多维度信息,进而优化图书馆管理策略、指导书籍采购决策并提升读者服务质量。
前言
本文在数字化和信息化快速发展的背景下,图书馆如何利用数据分析与可视化方法来挖掘和优化书籍借阅数据。主要内容包括数据的重要性、数据分析的应用、当前挑战等,具体如下:
- 数据的重要性:在当代社会,数据已成为一种宝贵的资源。图书馆积累的借阅数据反映了阅读偏好、流通情况及藏书结构等信息。
- 数据分析的应用:数据分析与可视化是大数据时代的关键工具,尤其在图书馔领域,它们能揭示借阅行为规律并直观展示信息,对提升运营效率和服务体验至关重要。(
- 数据预处理:对原始数据进行清洗、验证和归一化的必要性,以提高数据分析的准确性和一致性。这包括去除重复、错误或不完整的记录,将来自不同渠道的数据合并到统一格式中,便于分析等。
- 复杂数据分析:系统应包含先进的分析工具,能够执行包括描述性统计、趋势分析和关联规则在内的多种分析方法,以揭示图书流通和用户行为的深层次特征。
- 可视化与交互:通过Flask框架设计直观的可视化方案来展示分析结果,使非技术用户也能轻松理解复杂的数据关系,并提供丰富的交互能力,让用户能基于自己的需求进一步探索数据。
)
- 当前挑战:图书馆面临数字资源增长和用户需求多样化的双重挑战,需要深入分析书籍数据以应对这些挑战。
- 研究目标:本研究旨在通过数据分析和可视化深入探讨图书馆书籍数据的隐藏信息,如流通趋势和借阅模式,以提供管理支持和改善服务质量。
技术栈
- Pandas
- Pyecharts
- Matplotlib
- …
- Flask
- Apriori算法
- 二分类
开发环境
类别 | 配置 |
---|---|
处理器 | Intel® Core(M) i7-10875H CPU @ 2.30GHz |
已安装的内存(RAM) | 16.0 GB (15.8 GB 可用) |
系统类型 | 64 位操作系统, 基于 x64 的处理器 |
显示适配器 | Intel® UHD Graphics 630 |
NVIDIA GeForce GTX 1650 | |
磁盘驱动器 | NVMe INTEL SSDPEKNW51 |
WDC WD10SPSX-22A6WTO | |
开发工具 | PyCharm 2022.2.2 |
数据库系统 | MySQL 8.0.26 |
服务器软件 | Flask 2.1.0 |
数据分析库 | Pandas 2.2.2 |
NumPy 1.23.3 | |
Pyecharts 2.0.5 | |
Matplotlib 3.9.0 | |
Jinja2 3.1.3 | |
Seaborn 0.13.2 | |
前端库 | HTML |
CSS | |
JavaScript (ES6) |
数据说明
字段名 | 释义 | 分析 |
---|---|---|
book_rank | id | 书籍的排名或ID,用于区分不同的书籍。 |
book_author | 作者 | 记录了创作书籍的个人或团队的名称。 |
book_rating | 评分 | 基于读者评价的平均分数,反映了书籍的受欢迎程度和质量。 |
book_discounted_price | 优惠价 | 在促销或折扣期间书籍的销售价格。 |
book_paper | 纸张 | 书籍使用的纸张类型,可能影响读者购买决策。 |
book_type | 类型 | 如小说、教科书、自助指南等,帮助读者快速识别内容类别。 |
book_name | 书名 | 书籍的主要标识,用于识别和索引。 |
book_publisher | 出版社 | 出版书籍的公司或机构,其声誉可能影响读者对书籍质量的预期。 |
book_comment_count | 评论数 | 可以作为书籍受欢迎程度的一个指标。 |
book_discount_rate | 优惠力度 | 表示书籍原价与优惠价之间的折扣百分比。 |
book_packaging | 包装 | 书籍的包装方式,可能涉及书籍的外观保护或特殊包装需求。 |
book_desc | 简述 | 对书籍内容的简短描述,帮助读者理解书籍的主题和内容。 |
book_publish_time | 出版时间 | 书籍的出版日期,对于寻找最新或特定时期出版物的读者很重要。 |
book_price | 定价 | 书籍的正常销售价格,不含任何优惠。 |
book_format | 开本 | 书籍的尺寸格式,影响阅读体验和携带方便性。 |
book_set | 套装 | 若书籍属于系列或套装,此字段标明,对成套购买的读者有吸引力。 |
数据集中可能存在缺失值或异常值,这可能由于录入错误、系统故障或其他因素造成。因此,在进行深入分析之前,必须进行数据清洗和预处理,以确保分析结果的准确性和可靠性。
正文
数据获取
本文是直接采用数据集,没有进行爬取,下面提供爬取的示例
Python脚本通过requests库向特定网站发送请求,借助BeautifulSoup解析返回的HTML页面,从而抓取图书信息。这些信息包括排名、书名、简介、作者等数据,随后被组织成一个对象。最终,这个包含图书信息的数据集被导出并保存为一个CSV文件,以便后面进一步存储于分析。整个过程中,只需要提供网站的地址和相应的请求头信息,确保能够成功获取数据。其流程图如图所示。
#!/usr/bin/env python
# coding: utf-8
# 导入包
import time
import requests
import pandas as pd
from bs4 import BeautifulSoup
# 定义爬取函数
def get_book_data(url, headers):
r = requests.get(url, headers=headers)
r.encoding = r.apparent_encoding
# 使用BeautifulSoup解析网页
soup = BeautifulSoup(r.text, 'html.parser')
# 提取图书信息
book_list = []
for row in soup.find_all('tr')[1:]:
cols = row.find_all('td')
book_rank = cols[0].text.strip()
book_name = cols[1].text.strip()
book_desc = cols[2].text.strip()
book_author = cols[3].text.strip()
book_publisher = cols[4].text.strip()
book_publish_time = cols[5].text.strip()
book_rating = cols[6].text.strip()
book_comment_count = cols[7].text.strip()
book_price = cols[8].text.strip()
book_discounted_price = cols[9].text.strip()
book_discount_rate = cols[10].text.strip()
book_format = cols[11].text.strip()
book_paper = cols[12].text.strip()
book_packaging = cols[13].text.strip()
book_set = cols[14].text.strip()
book_type = cols[15].text.strip()
book_list.append([book_rank, book_name, book_desc, book_author, book_publisher, book_publish_time, book_rating,
book_comment_count, book_price, book_discounted_price, book_discount_rate, book_format,
book_paper, book_packaging, book_set, book_type])
# 将数据转换为DataFrame
df = pd.DataFrame(book_list, columns=['排名', '书名', '简述', '作者', '出版社', '出版时间', '评分', '评论数', '定价', '优惠价', '优惠力度', '开本',
'纸张', '包装', '套装', '类型'])
return df
# 请求头
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36',
'cookie':'登录图书馆,添加自己浏览器的cookie'# 替换为实际的图书网址
}
url ='https://example.com/books' # 替换为实际的图书网址
df = get_book_data(url, headers)
# 保存数据为CSV文件
df.to_csv('CSV文件文件名.csv', index=None, encoding='utf-8-sig') # 使用utf-8-sig编码以避免中文乱码问题
数据存储
本文是直接采用数据集,没有进行爬取,下面提供爬取后存储的示例
通过Python的pandas库读取刚刚爬取保存好的名为“书籍Top500.csv”的CSV文件,接着利用pymysql库将文件中的数据导入到名为’books_db’的MySQL数据库中。我们首先需要定义了与数据库建立连接和关闭连接的辅助函数,然后创建一个函数来逐行插入数据至数据库预设的’books’表。最终通过调用函数实现数据的批量存储操作。其存储流程图如图所示。
import pandas as pd
import pymysql
# 读取csv文件
data = pd.read_csv("书籍Top500.csv")
# 连接数据库,需要先在数据库中定义好一张表
def get_con():
con = pymysql.connect(host='localhost', user='数据库用户名', password='数据库密码', database='books_db', charset='utf8')
# 修改user='数据库用户名', password='数据库密码', database='数据库名'
cursor = con.cursor()
return con, cursor
# 关闭数据库
def con_close(con, cursor):
if cursor:
cursor.close()
if con:
con.close()
# 将数据存储到数据库
def save_to_database(data):
con, cursor = get_con()
for index, row in data.iterrows():
sql = f"INSERT INTO books (排名,书名,简述,作者,出版社,出版时间,评分,评论数,定价,优惠价,优惠力度,开本,纸张,包装,套装,类型) " \
f"VALUES ({row['排名']}, '{row['书名']}', '{row['简述']}', '{row['作者']}', '{row['出版社']}', '{row['出版时间']}', {row['评分']}, {row['评论数']}, {row['定价']}, {row['优惠价']}, {row['优惠力度']}, '{row['开本']}', '{row['纸张']}', '{row['包装']}', '{row['套装']}', '{row['类型']}')"
cursor.execute(sql)
con.commit()
con_close(con, cursor)
# 调用函数将数据存储到数据库
save_to_database(data)
存储到数据库后数据库查看情况如图所示。
数据清理
查看数据集中缺失值的分布情况。
可以看到 ‘简述’ 列有缺失值,我们可以通过dropna()函数指定要删除的列为"简述",然后使用subset参数来限制只删除"简述"列中的缺失值。
删除 ‘简述’ 列中的缺失值后:
检查数据集中是否存在重复的行,并计算重复行的总数
书名处理
new_name = []
for name in df['书名'].tolist():
new_name.append(name.split('(')[0])
df['书名_new'] = new_name
类型处理
new_typs = []
for typ in df['类型'].tolist():
new_typs.append(typ.split('-')[0])
df['类型_new'] = new_typs
定价处理
df['定价区间'] = pd.cut(df['定价'], bins=[0, 20, 30, 40, 50, 60, 1000], labels=['20元以下', '20-30元','30-40元', '40-50元','50-60元','60元以上'])
数据分析
首先读取数据集的基本信息,接着获取检获取数据集的基本信息(如列数、行数、每列的数据类型)
该数据集共有500条记录,包含16个字段,每个字段的非空值数量均为500。其中,5列是数值型变量(包括整型和浮点型),11列是字符串型变量。数据集占用的内存大小为62.6MB。
对于数据集中各数值型列的描述性统计量
变量呈现出一定程度的正偏态分布,有几个极端高值拉高了平均值,但大部分数据集中在相对较低的值域内。
数据挖掘
关联规则
基于书籍数据进行关联规则挖掘的。首先,它导入了必要的库和函数,然后读取了书籍数据并进行了预处理。接着,使用Apriori算法挖掘频繁项集,并生成关联规则。最后,根据最小置信度和最小支持度阈值筛选关联规则,并输出满足条件的关联规则、支持度和置信度。
从给出的关联规则结果中,我们可以得出以下结论:
- 中国儿童文学和童书之间有强烈的关联,置信度为1.0,支持度为0.046。这意味着在中国儿童文学的书籍中,有很高的概率会出现童书类别的书籍。
- 中国当代小说和小说之间也有强烈的关联,置信度为1.0,支持度为0.046。这表明中国当代小说中有很大比例属于小说类别。
- 中国现当代随笔和文学之间的关联非常强,置信度为1.0,支持度为0.066。这说明中国现当代随笔主要属于文学类别。
- 小学阅读和中小学用书之间存在完全的关联,置信度为1.0,支持度为0.064。这意味着小学阅读类别的书籍全部属于中小学用书类别。
- 中小学用书和小学阅读之间的关联也较强,置信度为0.711,支持度为0.064。这表示在中小学用书类别中,有较高比例的书籍属于小学阅读类别。
- 大陆漫画和动漫/幽默之间的关联非常强,置信度为1.0,支持度为0.032。这表明大陆漫画主要属于动漫/幽默类别。
- 外国儿童文学和童书之间也有强烈的关联,置信度为1.0,支持度为0.036。这意味着外国儿童文学书籍中有很大概率属于童书类别。
- 社会小说和小说之间的关联非常强,置信度为1.0,支持度为0.036。这表明社会小说主要属于小说类别。
- 绘本/图画书和童书之间的关联也非常强,置信度为1.0,支持度为0.068。这意味着绘本/图画书主要属于童书类别。
所以这些关联规则揭示了不同类型的书籍之间的关联关系,可以帮助我们更好地了解书籍分类和推荐书籍。
二分类预测
通过逻辑回归模型预测借阅童话书籍的概率,并计算了测试集上的准确率。它使用了评分、评论数、定价和优惠价作为特征,将类型为"童书-绘本/图画书"的书籍标记为正例,其他书籍标记为负例。通过训练集拟合模型,并在测试集上进行预测,最终输出了预测的准确率。
结果显示借阅童话书籍的准确率为96%。96%的高准确率表明模型在区分童话书籍与其他类型书籍方面表现良好,能够有效地根据特征(评分、评论数、定价、优惠价)来识别出童话书籍。
利用逻辑回归模型的预测概率,并绘制了ROC曲线。首先读取数据并进行特征选择和标签定义,然后划分训练集和测试集。接着使用训练集训练逻辑回归模型,获取模型在测试集上的预测概率。最后计算ROC曲线的真正率(TPR)和假正率(FPR),并绘制ROC曲线。
我们可以看到ROC曲线下的面积(AUC)为0.66,表明模型性能略高于随机猜测。曲线上的点揭示了不同阈值下的性能变化。理想模型的ROC曲线紧贴左上角,但此模型的曲线显示出它在某些阈值下能较好地区分正负例,而在其他阈值下则表现不佳。总体而言,该模型有提升空间,调整阈值可帮助找到最佳平衡点,以减少误判并提高正确识别率。
数据可视化
书籍价格区间柱状图
柱状图清晰展示了图书馆不同价格区间内书籍的数量分布,其中“20元以下”区间的书籍数量最多,达到120本,而“60元以上”区间的书籍数量最少,仅有20本。其他价格区间的书本数量依次递减,反映出价格与数量之间存在一定的负相关关系。
- 经济因素:价格较低的书籍可能更容易被普通读者接受,因此需求较大,导致库存较多。相反,价格较高的书籍可能因为其独特性或稀缺性,使得购买者较少,从而库存较少。
- 出版策略:出版商可能会根据市场需求来决定书籍的定价。如果某一价格区间的书籍需求大,出版商会增加该区间的书籍生产量以满足市场需求。
- 消费心理:消费者在购买书籍时往往希望获得更多的性价比。价格较低的书籍提供了更高的性价比,因此更受欢迎。
- 库存管理:图书馆或书店为了减少库存损失和提高资金周转率,可能会优先处理那些长时间滞销、价格较高的书籍,从而导致这些书籍的数量减少。
书籍评分分布散点图
从图中可以看出,图书馆大部分的书籍评分集中在4到5之间,而2和3的评分较少。这可能意味着大部分书籍的评价都是中等偏上的,而只有很少的书籍被评为很差。说明了以下几点:
- 图书馆中大部分的书籍都获得了较高的评分,说明这些书籍在内容、质量或可读性方面得到了读者的认可。这为读者提供了高质量的阅读材料,有助于提升整体的阅读体验。
- 图书馆可能会根据书籍的评分来选择购买或推荐给读者。因此,高评分的书籍更有可能被选中,而低评分的书籍则较少被关注。
- 高评分的书籍可能更符合大多数读者的兴趣和需求,因此更受欢迎。相反,那些获得较低评分的书籍可能不符合大众口味或存在某些缺陷,导致其受众较小。
- 出版社可能会根据市场反馈调整出版物的质量。如果某本书籍经常获得较高评分,出版商可能会继续投资该系列书籍;反之,如果某本书籍持续获得低分,出版商可能会考虑改进其产品。
书籍包装类型占比柱状图
从图中可以看出,“平装-胶订”占据了最大的比例,为70%。接下来是“线装”,占了2%。其他类型的占比分别为:“软装”为6%,“平装-锁线订”为4%,“线装”为8%,以及“精装”为20%。说明了以下几点:
- 平装-胶订由于其低成本和易于生产的特点,成为了图书馆中最常见的书籍装帧类型。这种类型的书籍通常价格适中,便于大规模生产和流通,因此更受读者欢迎。
- 线装作为一种传统的书籍装帧方式,虽然在现代图书市场中占比较小,但仍有其独特的地位和价值。它代表了中国传统文化的一部分,可能在特定领域或古籍收藏中有其特定的应用。
- 精装书通常被视为高品质、高档次的图书,因此它们在图书馆中的占比相对较高。这些书籍往往采用精美的封面设计和高质量的纸张,适合作为礼品或珍藏。
- 不同的书籍装帧类型反映了市场对于不同类型书籍的需求。例如,学术著作和专业书籍可能更倾向于使用平装-胶订,而文学作品和艺术类书籍可能更多采用精装。
书籍出版时间分布
这折线图表示了不同时间点的书籍出版数量。图中的Y轴代表书籍的数量,而X轴代表不同的时间点。
从图中可以看出,有几个时间点的书籍出版数量明显增多,例如在2015年、2016年和2021年等。而在其他时间点,如2018年和2019年,出版数量则相对较低。
说明了图书出版业可能存在周期性波动,其中某些年份可能会有更多的新书推出,而其他年份则相对较少。这种周期性可能与市场需求、经济状况或出版政策等因素有关。
某些特殊的事件或趋势可能导致特定时间点书籍出版数量的增加。例如,某个年份可能有重要的文化活动、学术会议或社会运动,吸引了更多的出版商和作者推出新作品。
借阅图书数量前20出版社柱状图
这是一张展示排名前20的出版社借阅图书数量的柱状图,其中“某合出版社”和“湖南文艺出版社”的借阅量显著领先,大部分出版社的借阅数量集中在10到20之间,反映出各社之间的借阅情况存在一定的差距。
借阅排名前20的书籍作者柱状图
从图中可以看出,大部分的作者数量集中在6-9之间,而有些作者的借阅量则相对较低。具体来说,刘震云、作译者、汪曾祺和宫崎骏等作者的借阅量明显高于其他作者,说明他们的书在读者中非常受欢迎。而赫尔曼•黑塞、冯骥才、季羡林和莫言等作者虽然也有一定的借阅量,但与前几位相比略显不足。至于老舍、北岛和京极漫画等作者,他们的借阅量较低,可能是由于他们的作品受众相对较少或与其他热门作者存在竞争。总的来说,这张图表为我们提供了一个关于不同作者作品受欢迎程度的直观印象。
借阅排名前十的书籍类型占比饼图
这张饼图展示了“借阅排名前十的书籍类型占比”。从图中可以看出,童书和小说是最受欢迎的两个类别,分别占据了25.5%和23.4%。这可能意味着在当前的读者群体中,儿童和青少年的阅读需求非常旺盛。
其他如心理学、哲学/宗教、文学、历史等类别也有一定的市场份额,但相对于童书和小说来说较小。这可能表示尽管这些类别的书籍在某些特定的读者群体中很受欢迎,但它们的整体市场份额仍然不如童书和小说。
书籍书名词云
我们可以看到各种书名和作者名,它是图书馆热门书籍列表。这种类型的图像通常用于展示关键词、主题或任何特定数据集中的高频词汇。
可视化大屏(Flask)
图书馆大数据可视化分析系统的可视化大屏可以更直观地展示数据和信息。它整合了各类数据,包括销售、借阅量、分类比例以及随时间变化的趋势等,为图书馆管理者提供了一个全方位的视角来了解当前图书馆的书籍运营情况。这不仅有助于图书馆管理员全面了解图书馆的运作状况,也能够让管理员及时发现问题并进行处理,确保图书馆的运营流畅无阻。此外,通过大屏上的分类比例数据,管理员可以更科学地进行图书采购和分类策略的制定,从而提高工作效率。数字统计表和进度条的设计使得数据的交互性增强,让用户能更好地理解和使用数据,从而提升用户体验。