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

news2024/11/10 23:13:22

文章目录

  • 项目三 关联规则分析
    • 一、实践目的
    • 二、实践平台
    • 三、实践内容
      • 任务一:在线购物车分析
        • (一)数据读入
        • (二)数据理解
        • (三)数据预处理
        • (四)生成频繁项集
        • (五)计算关联度
        • (六)可视化
        • (七)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.coloradmin.cn/o/2140433.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

常见算法——自相关的含义及Python、C实现

常见算法——自相关的含义及C实现 一、概念1. 自相关概念2. 滞后期示例说明&#xff1a; 二、自相关的计算步骤&#xff1a;1. 确定滞后期 (Lag)&#xff1a;2. 计算平均值&#xff1a;3. 计算自相关&#xff1a; 三、示例 Python自相关计算1. 代码2. 运行结果 四、C语言实现自…

yjs06——numpy的介绍与优势(1)

1.numpy是什么&#xff1f; numpy是python的一个科学计算库&#xff0c;用于快速处理 任意维度的数据&#xff1b; numpy的存储单元/基本数据类型是 ndarray&#xff08;多维数组&#xff09; 2.多维数组的建立&#xff1a; import numpy as np np.array([ [1,2,3], [4,5,6…

C++ | Leetcode C++题解之第406题根据身高重建队列

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {sort(people.begin(), people.end(), [](const vector<int>& u, const vector<int>& v) …

IV 无规矩不成方圆,区块链的“规矩”是怎么起作用的?

大家好啊&#xff0c;我是豆小匠。 通过前面几期&#xff0c;我们知道区块链是一种非中心化的解决方案&#xff0c;没有“中央处理器”。 那么&#xff0c;区块链中的各种操作&#xff0c;比如转账、状态记录等规则是怎么定义&#xff0c;又是怎么起作用的呢&#xff1f; 本…

QT--connect的使用

在qt里面我们可以用connect将信号与槽函数连接器起来&#xff0c;而connect是一个常用的函数&#xff0c;用法也非常简单。 来看一个非常简单的栗子 Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);qpbnew QPushButton(this)…

go语言中的数组指针和指针数组的区别详解

1.介绍 大家知道C语言之所以强大&#xff0c;就是因为c语言支持指针&#xff0c;而且权限特别大&#xff0c;c语言可以对计算机中任何内存的指针进行操作&#xff0c;这样自然而然也会带来一些不安全的因素&#xff0c;所以在golang中&#xff0c;「取消了对指针的一些偏移&…

清理Go/Rust编译时产生的缓存

Go Mac 1T的磁盘频频空间高级&#xff0c;发现是/Users/yourname/Library/Caches/go-build 目录占用了大量空间。 此目录保存来自 Go 构建系统的缓存构建工件。 如果目录太大&#xff0c;请运行go clean -cache。 运行go clean -fuzzcache以删除模糊缓存。 当时直接手工清理了…

C++——多线程编程(从入门到放弃)

进程&#xff1a;运行中的程序 线程&#xff1a;进程中的进程 线程的最大数量取决于CPU的核心数 一、将两个函数添加到不同线程中 demo&#xff1a;两个函数test01()和test02()&#xff0c;实现将用户输入的参数进行打印输出1000次 将这两个函数均放到独立的线程t1和t2中&…

STM32 的 CAN 通讯全攻略

目录 一、CAN 通讯概述 二、 CAN 通讯原理 1.ISO11898 标准下的物理层特征 2.CAN 协议的帧类型 3. 总线仲裁介绍 4.位时序 5.STM32 CAN 控制器简介 6.标识符筛选器 三、软件设计 1.发送流程 1.1初始化 CAN 控制器 1.2准备发送数据 1.3 将数据填充到发送缓冲区 1.4…

初始c++的继承

概念&#xff1a; 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类特性的基础上进行扩展&#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称派生类。继承呈现了面向对象程序设计的层次结构&#xff0c…

Java高级Day43-类加载

117.类加载 静态和动态加载 反射机制是java实现动态语言的关键&#xff0c;也就是通过反射实现类动态加载 静态加载&#xff1a;编译时加载相关的类&#xff0c;如果没有则报错&#xff0c;依赖性太强 动态加载&#xff1a;运行时加载需要的类&#xff0c;如果运行时不用该类…

集群聊天服务器项目【C++】(五)网络模块和业务模块

经过前面介绍相关的库和工具&#xff0c;比如Json、CMake、muduo等&#xff0c;我们可以开始编写本项目的代码了。 1.项目目录创建 一般一个项目由以下结构组成&#xff1a; bin文件夹存放&#xff1a;可执行程序build文件夹存放&#xff1a;编译过程中的临时文件include文…

消失的数去哪里了

大家好&#xff0c;我是大圣&#xff0c;最近消失了很长一段时间了&#xff0c;之前答应粉丝要更新的文章也没有按时更新。其实我这段时间去闭关修炼去了&#xff0c;现在满血归来啦&#xff0c;之前答应粉丝的文章都会陆续发出来的。 消失的 Count 去哪了 今天给大家分享一个…

BolckingQueue

队列 队列的特点先进先出&#xff08;FIFO&#xff09;。 如图&#xff1a; 进入队列的顺序是1&#xff0c;2&#xff0c;3&#xff0c;那么出队列的顺序只能是1&#xff0c;2&#xff0c;3&#xff0c;不可能是其他顺序&#xff0c;这是由队列的特点保证的。 保存数据的基本…

彻底理解浅拷贝和深拷贝

目录 浅拷贝实现 深拷贝实现自己手写 浅拷贝 浅拷贝是指创建一个新对象&#xff0c;这个对象具有原对象属性的精确副本 基本数据类型&#xff08;如字符串、数字等&#xff09;&#xff0c;在浅拷贝过程中它们是通过值传递的&#xff0c;而不是引用传递&#xff0c;修改值并不…

基于yolov8的茶叶病害检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv8的茶叶病害检测系统&#xff0c;是利用深度学习技术&#xff0c;特别是YOLOv8这一先进的目标检测算法&#xff0c;来精准识别和监测茶叶生长过程中出现的各种病害。该系统通过无人机、地面机器人或固定摄像头等设备&#xff0c;定期采集茶园的高分辨率…

力扣刷题(6)

两数之和 II - 输入有序数组 两数之和 II - 输入有序数组-力扣 思路&#xff1a; 因为该数组是非递减顺序排列&#xff0c;因此可以设两个左右下标当左右下标的数相加大于target时&#xff0c;则表示右下标的数字过大&#xff0c;因此将右下标 - -当左右下标的数相加小于targ…

??Ansible——ad-hoc

文章目录 一、ad-hoc介绍二、ad-hoc的使用1、语法2、ad-hoc常用模块1&#xff09;shell模块2&#xff09;command模块3&#xff09;script模块4&#xff09;file模块5&#xff09;copy模块6&#xff09;yum模块7&#xff09;yum-repository模块8&#xff09;service模块9&#…

优化算法(一)—遗传算法(Genetic Algorithm)附MATLAB程序

遗传算法&#xff08;Genetic Algorithm, GA&#xff09;是一种启发式搜索算法&#xff0c;用于寻找复杂优化问题的近似解。它模拟了自然选择和遗传学中的进化过程&#xff0c;主要用于解决那些传统算法难以处理的问题。 遗传算法的基本步骤&#xff1a; 初始化种群&#xff0…

【GO语言】Go语言详解与应用场景分析,与Java的对比及优缺点

Go is an open source programming language that makes it easy to build simple, reliable, and efficient software. Go是一种开源编程语言&#xff0c;可以轻松构建简单、可靠和高效的软件。 文章目录 一、引言二、Go语言详解1. 简史2. 特点3. 核心库 三、应用场景四、与Ja…