医学数据分析实训 项目三 关联规则分析作业--在线购物车分析--痹症方剂用药规律分析

文章目录

  • 项目三 关联规则分析
    • 一、实践目的
    • 二、实践平台
    • 三、实践内容
      • 任务一:在线购物车分析
        • (一)数据读入
        • (二)数据理解
        • (三)数据预处理
        • (四)生成频繁项集
        • (五)计算关联度
        • (六)可视化
        • (七)Apriori参数及其解读
        • (八)association_rules参数及其解读
      • 任务二:用药规律分析
    • 四、结果提交
      • 任务一:在线购物车分析
        • (三)数据预处理
        • (四)生成频繁项集
        • (五)计算关联度
        • 可视化结果
      • 任务二:用药规律分析

注意 任务二:痹症方剂用药规律分析

项目三 关联规则分析

一、实践目的

  1. 了解关联规则算法原理;
  2. 熟悉关联规则应用场景;
  3. 掌握使用 Apriori算法、FP-grouth算法进行关联规则分析的方法;

二、实践平台

  1. 操作系统:Windows7及以上
  2. Python版本:3.8.x及以上
  3. PyCharm或 Anoconda集成环境

三、实践内容

任务一:在线购物车分析

针对数据集 Online Retail.xlsx进行预处理。该数据集记录了在 2010年 12月 01日至 2011年 12月 09日的 541909条在线交易记录,包含 8个属性,主要属性如下:

  1. InvoiceNo: 订单编号,由 6位整数表示,退货单号由字母“C”开头。
  2. StockCode: 产品编号,每个不同的产品由不重复的 5位整数表示。
  3. Description: 产品描述。
  4. Quantity: 产品数量,每笔交易的每件产品的数量。
  5. InvoiceDate: 订单日期和时间,表示生成每笔交易的日期和时间。
  6. UnitPrice: 单价,单位产品的英镑价格。
  7. CustomerID: 顾客编号,每个客户由唯一的 5位整数表示。
  8. Country: 国家名称,每个客户所在国家/地区的名称。
(一)数据读入
  1. 导入本案例所需的 Python包;
  2. 将数据读入并存为 DataFrame格式,查看前 5行数据。
(二)数据理解
  1. 调用 shape属性查看数据集的形状;
  2. 调用 describe()方法对数据集进行探索性分析;
  3. 调用 info()方法查看样本数据的相关信息概览;
  4. 查看国家列(country)的取值;
  5. 查看各国家的购物数量;
  6. 查看订单编号(invoiceno)一列中是否有重复值;
(三)数据预处理
  1. 查看数据集中是否有缺失值;
  2. 删除商品名称(description)一列的字符串头尾的空白字符;
  3. 查看商品名称(description)一列的缺失值个数,并去除缺失值;
  4. 由于退货的订单编号由字母“C”开头,删除含有 C字母的已取消订单,并查看数据集形状;
  5. 将数据改为每一行一条购物记录(只计算德国客户),并查看结果的前 5行;
  6. 由于 Apriori方法中 df参数允许的值为 0/1或 True/False,在此将上面处理后的数据集转换为 0/1的形式;
(四)生成频繁项集
  1. mlxtend.frequent_patterns的 apriori()方法可以进行频繁项集的计算,将最小支持度设定为 0.07;输出结果,并查看满足条件的频繁项集个数;
  2. 使用 fpgrowth()方法寻找频繁项集,最小支持度设为 0.05;输出结果,查看满足条件的频繁项集个数;
(五)计算关联度
  1. 将提升度(lift)作为度量计算关联规则,并设置阈值为 1,表示计算具有正相关关系的关联规则,请通过 mlxtend.frequent_patterns的 association_rules()方法实现,并输出计算结果;
  2. 在以上结果中筛选出提升度不小于 2且置信度不小于 0.8的关联规则,并输出结果;
(六)可视化

通过 matplotlib.pyplot的 scatter函数绘制出提升度不小于1的关联规则的散点图,横坐标设置为支持度,纵坐标为置信度,散点的大小表示提升度。

(七)Apriori参数及其解读

在这里插入图片描述

(八)association_rules参数及其解读

在这里插入图片描述

任务二:用药规律分析

数据集“痹症方剂.xls“记录了治疗痹症的用药药方,请使用关联规则算法生成频繁项集,并计算关联度。(最小支持度及支持度、提升度等度量指标可自行决定。)

四、结果提交

提交任务一和任务二的全部实现代码。

任务一:在线购物车分析

import pandas as pd
from mlxtend.frequent_patterns import apriori, fpgrowth
from mlxtend.frequent_patterns import association_rules
import warnings# 忽略所有的 DeprecationWarning
warnings.filterwarnings("ignore", category=DeprecationWarning)# (一)数据读入
# 1. 导入本案例所需的 Python 包;
# 2. 将数据读入并存为 DataFrame 格式,查看前 5 行数据。
data = pd.read_excel('input/Online Retail.xlsx')
print(data.head(5))
# (二)数据理解# 1. 调用 shape 属性查看数据集的形状;
print(data.shape)
# 2. 调用 describe()方法对数据集进行探索性分析;
print(data.describe())
# 3. 调用 info()方法查看样本数据的相关信息概览;
print(data.info())
# 4. 查看国家列(country)的取值;
print(data['Country'].unique())
# 5. 查看各国家的购物数量;
print(data['Country'].value_counts())
# 6. 查看订单编号(invoiceno)一列中是否有重复值;
print('重复值的数量', data['InvoiceNo'].duplicated().sum())
(541909, 8)Quantity                    InvoiceDate      UnitPrice  \
count  541909.000000                         541909  541909.000000   
mean        9.552250  2011-07-04 13:34:57.156386048       4.611114   
min    -80995.000000            2010-12-01 08:26:00  -11062.060000   
25%         1.000000            2011-03-28 11:34:00       1.250000   
50%         3.000000            2011-07-19 17:17:00       2.080000   
75%        10.000000            2011-10-19 11:27:00       4.130000   
max     80995.000000            2011-12-09 12:50:00   38970.000000   
std       218.081158                            NaN      96.759853   CustomerID  
count  406829.000000  
mean    15287.690570  
min     12346.000000  
25%     13953.000000  
50%     15152.000000  
75%     16791.000000  
max     18287.000000  
std      1713.600303  
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 541909 entries, 0 to 541908
Data columns (total 8 columns):#   Column       Non-Null Count   Dtype         
---  ------       --------------   -----         0   InvoiceNo    541909 non-null  object        1   StockCode    541909 non-null  object        2   Description  540455 non-null  object        3   Quantity     541909 non-null  int64         4   InvoiceDate  541909 non-null  datetime64[ns]5   UnitPrice    541909 non-null  float64       6   CustomerID   406829 non-null  float64       7   Country      541909 non-null  object        
dtypes: datetime64[ns](1), float64(2), int64(1), object(4)
memory usage: 33.1+ MB
None
['United Kingdom' 'France' 'Australia' 'Netherlands' 'Germany' 'Norway''EIRE' 'Switzerland' 'Spain' 'Poland' 'Portugal' 'Italy' 'Belgium''Lithuania' 'Japan' 'Iceland' 'Channel Islands' 'Denmark' 'Cyprus''Sweden' 'Austria' 'Israel' 'Finland' 'Bahrain' 'Greece' 'Hong Kong''Singapore' 'Lebanon' 'United Arab Emirates' 'Saudi Arabia''Czech Republic' 'Canada' 'Unspecified' 'Brazil' 'USA''European Community' 'Malta' 'RSA']
Country
United Kingdom          495478
Germany                   9495
France                    8557
EIRE                      8196
Spain                     2533
Netherlands               2371
Belgium                   2069
(三)数据预处理
# 1. 查看数据集中是否有缺失值;
print(data.isnull().sum())
# 2. 删除商品名称(description)一列的字符串头尾的空白字符;
data['Description'] = data['Description'].str.strip()
# 3. 查看商品名称(description)一列的缺失值个数,并去除缺失值;
print(data['Description'].isnull().sum())
data = data.dropna(subset=['Description'])
InvoiceNo           0
StockCode           0
Description      1454
Quantity            0
InvoiceDate         0
UnitPrice           0
CustomerID     135080
Country             0
dtype: int64
1455
# 4. 由于退货的订单编号由字母“C”开头,删除含有 C 字母的已取消订单,并查看数据集形状;
data = data[~data['InvoiceNo'].astype(str).str.startswith('C')]
print(data.shape)
# 5. 将数据改为每一行一条购物记录(只计算德国客户),并查看结果的前 5 行;
data_germany = data[data['Country'] == 'Germany']
data_germany = data_germany.groupby(['InvoiceNo', 'Description'])['Quantity'].sum().unstack().reset_index().fillna(0).set_index('InvoiceNo')
data_germany = data_germany.map(lambda x: 1 if x > 0 else 0)
print(data_germany.head())
(四)生成频繁项集
# 1. 使用 apriori() 方法进行频繁项集的计算,将最小支持度设定为 0.07;输出结果,并查看满足条件的频繁项集个数;
frequent_itemsets_apriori = apriori(data_germany,min_support=0.07,use_colnames=True)
# 输出频繁项集结果
print("频繁项集(Apriori 方法):")
print(frequent_itemsets_apriori)# 输出满足条件的频繁项集个数
print("满足条件的频繁项集个数:", len(frequent_itemsets_apriori))

在这里插入图片描述

# 2. 使用 fpgrowth()方法寻找频繁项集,最小支持度设为 0.05;输出结果,查看满足条件的频繁项集个数;
frequent_itemsets_fpgrowth = fpgrowth(data_germany,min_support=0.05,use_colnames=True)# 输出频繁项集结果
print("频繁项集(FP-Growth 方法):")
print(frequent_itemsets_fpgrowth)# 输出满足条件的频繁项集个数
print("满足条件的频繁项集个数:", len(frequent_itemsets_fpgrowth))

在这里插入图片描述

(五)计算关联度
# 1. 将提升度(lift)作为度量计算关联规则,并设置阈值为 1,表示计算具有正相关关系的关联规则,请通过 association_rules() 方法实现,并输出计算结果;
# 计算提升度并生成关联规则
rules = association_rules(frequent_itemsets_apriori,metric="lift",min_threshold=1)# 输出关联规则结果
print("生成的关联规则:")
print(rules)
# 2. 在以上结果中筛选出提升度不小于 2 且置信度不小于 0.8 的关联规则,并输出结果;
filtered_rules = rules[(rules['lift'] >= 2) & (rules['confidence'] >= 0.8)]# 输出筛选结果
print("筛选后的关联规则:")
print(filtered_rules)
# 保存输出结果
filtered_rules.to_csv('output/filtered_rules.csv')

在这里插入图片描述

可视化结果
# 通过 matplotlib.pyplot的 scatter 函数绘制出提升度不小于1的关联规则的散点图,横坐标设置为支持度,纵坐标为置信度,散点的大小表示提升度。import matplotlib.pyplot as plt# 正常显示
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
# 显示符号
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
# 筛选提升度不小于 1 的关联规则
filtered_rules = rules[rules['lift'] >= 1]# 绘制散点图
plt.figure(figsize=(10, 6))
scatter = plt.scatter(filtered_rules['support'], filtered_rules['confidence'],s=filtered_rules['lift'] * 100,  # 散点大小,放大提升度便于观察alpha=0.5,  # 散点透明度c='blue',  # 散点颜色edgecolors='w')  # 散点边缘颜色# 添加标签和标题
plt.title('关联规则的散点图(支持度 vs 置信度)')
plt.xlabel('支持度')
plt.ylabel('置信度')# 添加每个点的标注(可选)
# for i in range(filtered_rules.shape[0]):
#     plt.annotate(filtered_rules.index[i],
#                  (filtered_rules['support'].iloc[i],
#                   filtered_rules['confidence'].iloc[i]),
#                  fontsize=8)plt.grid()
plt.show()

在这里插入图片描述

任务二:用药规律分析

import pandas as pd
from mlxtend.frequent_patterns import apriori, association_rules
from mlxtend.preprocessing import TransactionEncoder# 1. 读取数据
data = pd.read_excel("input/痹症方剂.xls")
print(data)print("\n数据的基本信息:")
print(data.info())
# 2. 数据预处理
# 转换DataFrame为事务格式
def encode_items(x):return [item for item in x if str(item) != 'nan']transactions = data.apply(encode_items, axis=1)# 创建事务编码器对象并拟合数据
te = TransactionEncoder()
te_ary = te.fit(transactions).transform(transactions)
df_te = pd.DataFrame(te_ary, columns=te.columns_)# 应用Apriori算法找到频繁项集
frequent_itemsets = apriori(df_te, min_support=0.05, use_colnames=True)
print(frequent_itemsets)
      support        itemsets
0    0.977528              ()
1    0.067416            (丹参)
2    0.067416            (乳香)
3    0.191011            (人参)
4    0.067416            (僵蚕)
..        ...             ...
151  0.056180  (, 桂心, 甘草, 人参)
152  0.056180  (, 茯苓, 甘草, 人参)
153  0.056180  (, 防风, 甘草, 人参)
154  0.056180  (, 当归, 甘草, 防风)
155  0.056180  (, 茯苓, 桂心, 甘草)
# 计算关联规则
rules = association_rules(frequent_itemsets, metric="lift", min_threshold=1)
print(rules)# 保存频繁项集和关联规则
frequent_itemsets.to_csv('output/test2_frequent_itemsets.csv')
rules.to_csv('output/test2_rules.csv')

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

# 通过 matplotlib.pyplot的 scatter 函数绘制出提升度不小于1的关联规则的散点图,横坐标设置为支持度,纵坐标为置信度,散点的大小表示提升度。import matplotlib.pyplot as plt# 正常显示
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
# 显示符号
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
# 筛选提升度不小于 1 的关联规则
filtered_rules = rules[rules['lift'] >= 1]# 绘制散点图
plt.figure(figsize=(10, 6))
scatter = plt.scatter(filtered_rules['support'], filtered_rules['confidence'],s=filtered_rules['lift'] * 100,  # 散点大小,放大提升度便于观察alpha=0.5,  # 散点透明度c='blue',  # 散点颜色edgecolors='w')  # 散点边缘颜色# 添加标签和标题
plt.title('关联规则的散点图(支持度 vs 置信度)')
plt.xlabel('支持度')
plt.ylabel('置信度')# 添加每个点的标注(可选)
# for i in range(filtered_rules.shape[0]):
#     plt.annotate(filtered_rules.index[i],
#                  (filtered_rules['support'].iloc[i],
#                   filtered_rules['confidence'].iloc[i]),
#                  fontsize=8)plt.grid()
plt.show()

在这里插入图片描述
任务二的运行结果,我并不满意,但是没有找到优化方法。若有良策,望指点一二。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/430155.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于微信小程序的美食外卖管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…

分享两个虚拟试衣工具,一个在线,一个离线,还有ComfyUI插件

SAM &#xff0c;对不住了&#xff01; 我没记错的话&#xff0c;OpenAI CEO&#xff0c;性别男&#xff0c;取向男&#xff0c;配偶男。 这又让我联想到了苹果CEO库克... 所以OpenAI和Apple可以一啪即合。 钢铁直男老马就和他们都不对付~~ 开个玩笑&#xff0c;聊…

WebGL入门(一)绘制一个点

源码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><scr…

Web+Mysql——MyBatis

MyBatis 目标 能够完成Mybatis代理方式查询数据能够理解Mybatis核心配置文件的配置 1&#xff0c;Mybatis 1.1 Mybatis概述 1.1.1 Mybatis概念 MyBatis 是一款优秀的持久层框架&#xff0c;用于简化 JDBC 开发 MyBatis 本是 Apache 的一个开源项目iBatis, 2010年这个项目由…

高等代数笔记(2)————(弱/强)数学归纳法

数学归纳法的引入情景其实很简单&#xff0c;就是多米诺骨牌。 推倒所有多米诺骨牌的关键就是推倒第一块&#xff0c;以及确保第一块倒下后会带动第二块&#xff0c;第二块带动第三块&#xff0c;以此类推&#xff0c;也就是可以递推。由此我们可以归纳出所有的多米诺骨牌都可…

MySQL学习(索引)

文章目录 基本概念单列索引普通索引&#xff08;index&#xff09;唯一索引&#xff08;unique&#xff09;主键索引 组合索引全文索引&#xff08;fulltext&#xff09;空间索引&#xff08;spatial&#xff09;MySQL存储引擎 基本概念 通过某种算法&#xff0c;构建数据模型&…

LeetCode 2374.边积分最高的节点:模拟

【LetMeFly】2374.边积分最高的节点&#xff1a;模拟 力扣题目链接&#xff1a;https://leetcode.cn/problems/node-with-highest-edge-score/ 给你一个有向图&#xff0c;图中有 n 个节点&#xff0c;节点编号从 0 到 n - 1 &#xff0c;其中每个节点都 恰有一条 出边。 图…

k8s中pod的创建过程和阶段状态

管理k8s集群 kubectl k8s中有两种用户 一种是登录的 一种是/sbin/nologin linux可以用密码登录&#xff0c;也可以用证书登录 k8s只能用证书登录 谁拿到这个证书&#xff0c;谁就可以管理集群 在k8s中&#xff0c;所有节点都被网络组件calico设置了路由和通信 所以pod的ip是可以…

如何使用 maxwell 同步到 redis?

文章目录 1、MaxwellListener2、MxwObject1. 使用Maxwell捕获MySQL变更2. 将Maxwell的输出连接到消息系统3. 从消息系统读取数据并同步到Redis注意事项 1、MaxwellListener package com.atguigu.tingshu.album.listener;import com.alibaba.fastjson.JSON; import org.apache.…

mysql中的json查询

首先来构造数据 查询department里面name等于研发部的数据 查询语句跟普通的sql语句差不多&#xff0c;也就是字段名要用到path表达式 select * from user u where u.department->$.name 研发部 模糊查询 select * from user u where u.department->$.name like %研发%…

Go-知识recover

Go-知识recover 1. 介绍2. 工作机制2.1 recover 定义2.2 工作流程2.3 总结 3. 原理3.1 recover函数的真正逻辑3.2 恢复逻辑3.3 生效条件 4. 总结4.1 recover的返回值是什么&#xff1f;4.2 执行recover之后程序将从哪里继续运行&#xff1f;4.3 recover为什么一定要在defer中使…

无法删除选定的端口,不支持请求【笔记】

场景&#xff1a;在删除打印机端口时&#xff0c;提示&#xff1a;“无法删除选定的端口&#xff0c;不支持请求”&#xff0c;如下图所示。 以下以删除USB036端口为示例&#xff0c;操作步骤如下&#xff1a; 在注册表编辑器中&#xff0c;从以下注册表项中“计算机\HKEY_LO…

Spring中存储Bean的常见注解

目录 IoC & DI IOC&#xff08;控制反转&#xff09;详解 依赖注入的三种方式 IoC & DI IoC: Inversion of Control (控制反转), 也就是说 Spring 是⼀个"控制反转"的容器. 控制反转&#xff1a;也就是控制权反转. 什么的控制权发⽣了反转? 获得依赖对…

Python增强办公效率的11个实用代码段

如果你正在学习Python&#xff0c;那么你需要的话可以&#xff0c;点击这里&#x1f449;Python重磅福利&#xff1a;入门&进阶全套学习资料、电子书、软件包、项目源码等等免费分享&#xff01; 引言 在日常工作中&#xff0c;许多任务可以通过编程自动化来提高效率。本…

算法入门-贪心2

第八部分&#xff1a;贪心 561.数组拆分&#xff08;简单&#xff09; 题目&#xff1a;给定长度为 2n 的整数数组 nums &#xff0c;你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), ..., (an, bn) &#xff0c;使得从 1 到 n 的 min(ai, bi) 总和最大。 返回该 最…

Three.js 3D人物漫游项目(下)

本文目录 前言最终效果1、效果回顾2、编写人物模型动画执行类并调用2.1 代码2.2 代码解读2.3 实例化动画类并调用2.4 效果2.4.1 休息动画2.4.2 跑步动画2.4.3 走路动画2.4.4 舞蹈1动画2.4.5 舞蹈2动画3、键盘控制动画3.1 站立休息、走、跑、舞蹈1、舞蹈2代码3.1.1 效果3.2 跳跃…

基于丹摩智算平台-手把手拿下经典目标检测模型 Faster-Rcnn

文章目录 1. 前言1. 1 丹摩智算平台1.2 经典目标检测模型 Faster-Rcnn 2. 前置准备2.1 WindTerm&#xff08;远程连接服务器&#xff09;2.2 项目源码 3. 服务器平台配置3.1 创建实例3.2 远程链接 4. Faster-rcnn 的环境配置4.1 上传文件&#xff0c;解压4.2 安装所需环境 5. 数…

华为HarmonyOS地图服务 1 -- 如何实现地图呈现?

如何使用地图组件MapComponent和MapComponentController呈现地图&#xff0c;效果如下图所示。 MapComponent是地图组件&#xff0c;用于在您的页面中放置地图。MapComponentController是地图组件的主要功能入口类&#xff0c;用来操作地图&#xff0c;与地图有关的所有方法从此…

基于PaddlePaddle复现的PeleeNet

转自AI Studio&#xff0c;原文链接&#xff1a;基于PaddlePaddle复现的PeleeNet - 飞桨AI Studio PeleeNet: An efficient DenseNet architecture for mobile devices 1. 简介 这是一个PaddlePaddle实现的PeleeNet。 PeleeNet是一个高效的卷积神经网络&#xff08;CNN&…

数通。。。

通信&#xff1a;需要介质才能通信电话离信号塔&#xff08;基站&#xff09;越远&#xff0c;信号越弱。信号在基站之间传递。你离路由器越远&#xff0c;信号越差。一个意思 比如想传一张图片&#xff0c;这张图片就是数据载荷 网关&#xff0c;分割两个网络。路由器可以是网…