精彩专栏推荐订阅:在 下方专栏👇🏻👇🏻👇🏻👇🏻

💖🔥作者主页:计算机毕设木哥🔥 💖

一、项目介绍

网络文学与图书阅读数据越来越多,读者口味、作品类型和热度结构又常混在一起,运营和研究者光靠表格很难快速摸清规律。行业里缺一套能把多维指标摊开、又能让不同角色各看所需的可视化分析入口。本文通过开发一个基于大数据的豆瓣图书数据分析与可视化系统,用以帮助优化图书小说数据的洞察与展示方式。
系统采用 Hadoop 与 Spark 做数据处理和分析,后端用 Django 提供接口,前端用 Vue 与 ECharts 做图表展示,算法侧用到 K-Means 聚类、FP-Growth 关联挖掘和 Isolation Forest 异常检测。功能上覆盖类型分布、风格偏好、创作状态、作品热度、作者产出、时间趋势和群体画像七个分析模块,图表含漏斗、热力、雷达、词云等多种形态,另有可视化大屏及动态轮播,并按管理员与用户区分权限,管理员可维护用户与小说信息,用户侧重查阅分析与作品明细。
经系统测试,本系统能满足数据分析学习者、图书内容运营人员和课题演示场景下“看清结构、对比热度、区分角色权限”的需求,也为同类阅读数据的可视化实践提供了一条可直接上手的参考路径。

二、开发环境

大数据与算法
Python 3.9
Hadoop 3.2.2
Spark / PySpark 3.3.x
Pandas、scikit-learn(Isolation Forest 等)
后端与数据存储
Django 2.0
MySQL(utf8mb4)
PyMySQL
前端
Vue 2.6
Element UI 2.13
ECharts 5.5(含词云插件)
Vue Router / Vuex / Axios
Node 14.15.0、npm 6.14.8

三、视频展示

基于大数据的豆瓣图书数据分析与可视化

四、项目展示

登录模块:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五、代码展示

def kmeans_cluster_analysis(input_df):
    feature_cols = ["novelZishu", "novelShoucang",
                    "novelShuping", "novelYingyangye"]
    assembler = VectorAssembler(inputCols=feature_cols, outputCol="featuresRaw")
    vec_df = assembler.transform(input_df.select("id", *feature_cols))

    # 标准化后再聚类,避免量纲差太大
    scaler = StandardScaler(
        inputCol="featuresRaw", outputCol="features",
        withMean=True, withStd=True
    )
    scaled_df = scaler.fit(vec_df).transform(vec_df)

    model = KMeans(k=4, seed=42, featuresCol="features",
                   predictionCol="cluster").fit(scaled_df)
    predictions = model.transform(scaled_df)

    # 按簇心综合热度排序,贴「长尾 / 冷门 / 中腰 / 头部」标签
    cluster_stats = predictions.groupBy("cluster").agg(
        spark_count("id").alias("count"),
        spark_round(spark_avg("novelZishu"), 2).alias("avgZishu"),
        spark_round(spark_avg("novelShoucang"), 2).alias("avgShoucang"),
        spark_round(spark_avg("novelShuping"), 2).alias("avgShuping"),
        spark_round(spark_avg("novelYingyangye"), 2).alias("avgYingyangye")
    )
    cluster_stats = cluster_stats.withColumn(
        "heatScore",
        col("avgZishu") + col("avgShoucang") +
        col("avgShuping") + col("avgYingyangye")
    )
    # ……按 heatScore 升序映射 clusterLabel 后写出 csv
    save_result(result, "kmeans_cluster_analysis.csv")
    return result

// 类型页:组合热度 → 漏斗图
renderTypeComboHeat(data) {
  const chart = this.charts.typeComboHeat
  const topData = (data || []).slice(0, 10)
  let opt = buildFunnel(topData, {
    nameField: 'novelType',
    valueField: 'avgShoucang',
    name: '平均收藏'
  })
  chart.setOption(opt)
},

// 画像页:K-Means 结果 → 雷达图
renderKmeansCluster(data) {
  const clusters = data || []
  const indicators = [
    { name: '平均字数', max: Math.max(...clusters.map(c => Number(c.avgZishu || 0)), 1) },
    { name: '平均收藏', max: Math.max(...clusters.map(c => Number(c.avgShoucang || 0)), 1) },
    { name: '平均书评', max: Math.max(...clusters.map(c => Number(c.avgShuping || 0)), 1) },
    { name: '平均营养液', max: Math.max(...clusters.map(c => Number(c.avgYingyangye || 0)), 1) }
  ]
  const series = clusters.map(c => ({
    name: c.clusterLabel || c.cluster,
    values: [
      Number(c.avgZishu || 0), Number(c.avgShoucang || 0),
      Number(c.avgShuping || 0), Number(c.avgYingyangye || 0)
    ]
  }))
  this.charts.kmeansCluster.setOption(buildRadar(indicators, series))
}
def preprocess(df):
    # novelType 按 "-" 拆成 4 级:原创/衍生、言情/纯爱、时代、题材
    df = df.dropna(subset=['novelType']).reset_index(drop=True)
    type_split = df['novelType'].str.split('-', expand=True)
    df['origin'] = type_split[0].fillna('未分类')
    df['prodOrientation'] = type_split[1].fillna('未分类')
    df['era'] = type_split[2].fillna('未分类')
    df['genre'] = type_split[3].fillna('未分类')

    # 发表时间转标准时间,再拆年/月/小时
    df['novelTime'] = pd.to_datetime(
        df['novelTime'], format='%Y/%m/%d %H:%M:%S', errors='coerce'
    )
    df = df.dropna(subset=['novelTime']).reset_index(drop=True)
    df['year'] = df['novelTime'].dt.year.astype(int)
    df['month'] = df['novelTime'].dt.month.astype(int)
    df['hour'] = df['novelTime'].dt.hour.astype(int)

    # 热度相关数值字段转整型
    for col in ['novelZishu', 'novelJifen', 'novelShuping',
                'novelShoucang', 'novelYingyangye']:
        df[col] = pd.to_numeric(df[col], errors='coerce').astype(int)
    return df

六、项目文档展示

在这里插入图片描述

七、总结

本系统围绕「基于大数据的豆瓣图书数据分析与可视化」展开,用 Hadoop、Spark 完成数据处理与多维分析,再经 Django 接口与 Vue、ECharts 前端,把结果做成图表和大屏。系统覆盖类型分布、风格偏好、创作状态、作品热度、作者产出、时间趋势和群体画像七个模块,其中群体画像引入 K-Means 聚类、FP-Growth 关联挖掘和 Isolation Forest 异常检测,用于分群、找类型配方、识别异常爆款。另配可视化大屏,并按管理员与用户区分权限:管理员可维护用户与小说信息,用户侧重查阅分析。整体把统计分析、算法洞察和可视化展示串成一条可演示、可使用的完整链路,便于了解图书小说数据的结构、热度与群体特征。

大家可以帮忙点赞、收藏、关注、评论啦👇🏻👇🏻👇🏻

💖🔥作者主页:计算机毕设木哥🔥 💖

更多推荐