心脏病数据集Spark-Scala分析


前言

  随着心脏病患者的逐年增加,我们运用有效的知识来分析统计心脏病与各数据指标的关系,来减少患有心脏病的风险


提示:以下是本篇文章正文内容,下面案例可供参考

一、Sprak是什么?

spark官网Apache Spark™ - Unified Engine for large-scale data analytics

Spark是一种快速、通用、可扩展的大数据分析引擎,2009年诞生于加州大学伯克利分校AMPLab,2010年开源,2013年6月成为Apache孵化项目,2014年2月成为Apache顶级项目。目前,Spark生态系统已经发展成为一个包含多个子项目的集合,其中包含SparkSQL、SparkStreaming、GraphX、MLlib等子项目,Spark是基于内存计算的大数据并行计算框架。Spark基于内存计算,提高了在大数据环境下数据处理的实时性,同时保证了高容错性和高可伸缩性,允许用户将Spark部署在大量廉价硬件之上,形成集群。Spark得到了众多大数据公司的支持,这些公司包括Hortonworks、IBM、Intel、Cloudera、MapR、Pivotal、百度、阿里、腾讯、京东、携程、优酷土豆。当前百度的Spark已应用于凤巢、大搜索、直达号、百度大数据等业务;阿里利用GraphX构建了大规模的图计算和图挖掘系统,实现了很多生产系统的推荐算法;腾讯Spark集群达到8000台的规模,是当前已知的世界上最大的Spark集群。
————————————

二、Scala介绍与安装

1.Scala介绍

Scala是一门多范式的、纯粹的面向对象函数式编程语言。由于Scala文件(.scala)可被编译成Java字节码,所以scala程序可以由JVM加载并运行。

由于Scala编译后得到Java字节码,所以Scala和Java本质上是一个东西,Scala和Java类可以相互调用

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
import  ssl
ssl._create_default_https_context = ssl._create_unverified_context

2.Windows安装Scala

1.将scala-2.11.12.zip解压到某个路径

2.配置SCALA_HOME和path环境变量

验证是否部署成功:

出现下面一串说明安装成功

三.IDEA创建普通的scala项目

1.安装scala插件

运行idea,选择file -> settings...


 四.准备数据集

1.数据来源

数据来源与网址:Find Open Datasets and Machine Learning Projects | Kaggle

2.数据指标

数据指标特征

五.编写统计分析代码

1.建一个包便于观察

2.导入需要的包

代码中导入需要用到的包

3.编写统计代码,分析数据相关性

1.Age_agg
package lzzy.com.heart
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions._
object Age_agg {
  def main(args: Array[String]): Unit = {
    val spark = SparkSession.builder.appName("Spark").master("local[*]").getOrCreate()
    val df = spark.read.format("csv")
      .option("header", "true")
      .load("数据集/heart.csv")
    // 统计年龄大于50的所有数据
    val countAgeOver50 = df.filter(col("age") > 50).count()

    // 统计年龄大于50且target为1的数据
    val countAgeOver50AndTarget1 = df.filter(col("age") > 50 && col("target") === 1).count()

    // 计算年龄大于50且target为1的概率
    val ageOver50AndTarget1Prob = countAgeOver50AndTarget1.toDouble / countAgeOver50 * 100

    // 选择需要显示的列,并过滤数据
    val filteredDf = df.select("age","trestbps", "chol", "thalach", "target")
      .filter(col("age") > 50 && col("target") === 1)

    // 打印结果
    println(s"年龄大于50的数据有 $countAgeOver50 条。")
    println(s"年龄大于50且target为1(即患有心脏病)的数据有 $countAgeOver50AndTarget1 条,概率约为 $ageOver50AndTarget1Prob%。")
    println("显示其中五个指标观察为:age,trestbps, chol, thalach, target")
    filteredDf.show()
  }

}

运行结果1 

 

运行结果2

 

2.AgeMax_thalach
package lzzy.com.heart

import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions._
object AgeMax_thalach {
  def main(args: Array[String]): Unit = {
    val spark = SparkSession.builder.appName("Spa").master("local[*]").getOrCreate()
    val df = spark.read.format("csv")
      .option("header", "true")
      .load("数据集/heart.csv")

    // 过滤出 age 大于 50 且 target 为 1 的行,并选择属性为 thalach(心率) 的所有列
    val filteredDF = df.filter(col("age") > 50 && col("target") === 1).orderBy(col("thalach").desc)

    // 打印患有心脏病年龄大于50的患者的较高心率的前20行结果
    filteredDF.show()
  }

}

运行结果

 

3. Agg_chol
package lzzy.com.heart

import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions._
object Agg_chol {
  def main(args: Array[String]): Unit = {

    val spark = SparkSession.builder.appName("S").master("local[*]").getOrCreate()
    val df = spark.read.format("csv")
      .option("header", "true")
      .load("数据集/heart.csv")
    // 过滤出 target 值为 1 的行,统计 chol 列的平均值
    val avgChol = df.filter(col("target") === 1).agg(avg(col("chol")))
    // 打印所有患者胆固醇平均值
    println("所有患病者的胆固醇指标平均值是: " + avgChol.first().getDouble(0))

  }

}

运行结果

4.Max_chol
package lzzy.com.heart

import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions._
object Max_chol {
  def main(args: Array[String]): Unit = {
    val spark = SparkSession.builder.appName("YourApp").master("local[*]").getOrCreate()
    val df = spark.read.format("csv")
      .option("header", "true")
      .load("数据集/heart.csv")
    //     df.show()
    // 过滤出 target 值为 1 的行(患有心脏病的患者)
    val filteredDF = df.filter(col("target") === 1)
    // 按照 chol 列降序排序,并获取第一行数据
    val highestCholRow = filteredDF.orderBy(col("chol").desc).first()
    println(highestCholRow)
    //打印出胆固醇最高的患者的所有信息
  }


}

运行结果

5.cp_chance
package lzzy.com.heart
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions._

object cp_chance {
  def main(args: Array[String]): Unit = {
    val spark = SparkSession.builder.appName("Spar").master("local[*]").getOrCreate()
    val df = spark.read.format("csv")
      .option("header", "true")
      .load("数据集/heart.csv")
    val countHeartDisease = df.filter(col("target") === 1).count()
    val countCpAndHeartDisease = df.filter(col("target") === 1 && col("cp") =!= 0).count()

    // 计算患有心脏病的人群中患有胸痛的比例
    val cpChance = countCpAndHeartDisease.toDouble / countHeartDisease * 100

    // 打印结果
    println(s"在数据集中患有心脏病的人有 $countHeartDisease 人。")
    println(s"在患有心脏病的人群中,患有胸痛的人占比约为 $cpChance%。")
  }
}

运行结果

6.Max_trestbps
package lzzy.com.heart

import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions._
object Max_trestbps {
  def main(args: Array[String]): Unit = {
    val spark = SparkSession.builder.appName("Sp").master("local[*]").getOrCreate()
    val df = spark.read.format("csv")
      .option("header", "true")
      .load("数据集/heart.csv")

    // 过滤出 target 值为 1 且 trestbps 列不为空的行,并按照 trestbps(静息血压) 列进行降序排序
    val filteredDF = df.filter(col("target") === 1 && col("trestbps").isNotNull).orderBy(col("trestbps").desc)

    // 打印患有心脏病患者中静息血压降序排序显示20行
    filteredDF.show()


  }

}

运行结果

总结

经过对心脏病数据集的分析统计,我们得出以下总结:

1. 年龄大于50的数据:根据数据集中的年龄字段,我们发现共有 705 条数据的年龄大于50。

2. 年龄大于50且目标为1的数据:在年龄大于50的数据中,我们筛选出符合目标为1的数据,发现共有 311 条数据满足这个条件。

3. 年龄大于50且目标为1的概率:根据统计结果,年龄大于50且目标为1的数据占年龄大于50的数据的比例约为 44%。这意味着年龄大于50的人群中,有一定比例的人患有心脏病。

4. 选择的列名和数据:根据需求,我们选择了 trestbps(静息血压)、chol(胆固醇水平)、thalach(最大心率)和 target(心脏病情况)这四列进行分析,并且筛选出符合年龄大于50且目标为1的数据进行显示。

通过以上分析,我们可以更好地了解了年龄大于50的人群中患有心脏病的情况,并对相关指标进行了统计和展示。这些分析结果可以为进一步的研究和决策提供有价值的信息。