数据挖掘之关联分析(实验展示以及源代码)

2023-11-16

简单描述下,关联分析概念
关联分析概念主要参考下面的博文
原文:https://blog.csdn.net/qq_40587575/article/details/81022350

关联分析是从大量数据中发现项集之间有趣的关联和相关联系,而关联分析的最终目标就是要找出强关联规则。
•关联分析的基本概念:
1、事务:每一条交易称为一个事务,如上图包含5个事务。
2、项:交易的每一个物品称为一个项,例如豆奶,啤酒等。 
3、项集:包含零个或多个项的集合叫做项集,例如{尿布,啤酒}。
4、k−项集:包含k个项的项集叫做k-项集,例如 {豆奶,橙汁}叫做2-项集。
5、支持度计数:一个项集出现在几个事务当中,它的支持度计数就是几。
例如{尿布, 啤酒}出现在事务002、003和005中,所以 它的支持度计数是3。
6、支持度:支持度计数除于总的事务数。
例如上例中总的事务数为5,{尿布, 啤酒}的支持度计数为3,所以它的支持度是 3÷5=60%,说明有60%的人同时买了尿布, 啤酒。
7、频繁项集:支持度大于或等于某个阈值的项集就叫做频繁项集。例如阈值设为50%时,因为{尿布,啤酒}的支持度是60%,所以 它是频繁项集。
8、前件和后件:对于规则{尿布}→{啤酒},{Diaper}叫做前件,{啤酒}叫做后件。
9、置信度:对于规则{尿布}→{啤酒},{尿布,啤酒}的支持度计数除于{尿布}的支持度计数,为这个规则的置信度。

   例如规则{尿布}→{啤酒}的置信度为3÷3=100%。说明买了尿布的人100%也买了啤酒。

10、强关联规则:大于或等于最小支持度阈值和最小置信度阈值的规则叫做强关联规则

算法实现:Apriori算法和FP-growth 算法

其余的基本概念可以去其他博客大佬们观摩啦!

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

接下来,就是我自己的实验内容,我主要写的是一个关于关联分析的实验例子:
首先先引入各种包,再读取数据,数据用的虚拟伪造“泰塔号”事故的数据集(一共700条数据),主要目的是关联分析“泰塔号”船上的乘客的一些属性的关系
第一,是有无船舱(cabin),第二,是船的费用大于10¥和小于10¥的关联(fare),第三,是否生还(survived)

下面是引入包,还有读取csv格式的数据,最后组合三种属性成为3个元祖。

import csv
import pandas as pd
import sys
import numpy as np

#读取892行数据
Survived = pd.read_csv('f:/train.csv', usecols=['Survived'],nrows=892)

data_category1 = Survived.values
List_category1 = []
for k in data_category1: 
    for j in k: 
        List_category1.append(j)
Cabin = pd.read_csv('f:/train.csv', usecols=['Cabin'],nrows=892)
data_category2 = Cabin.values
List_category2 = []
for k in data_category2: 
    for j in k: 
        List_category2.append(j)
Fare = pd.read_csv('f:/train.csv', usecols=['Fare'],nrows=892)
data_category3 = Fare.values
List_category3 = []
for k in data_category3: 
    for j in k: 
        List_category3.append(j)
        #组合3个元祖
z = list(zip(List_category1,List_category2,List_category3))

对数据进行处理,有无生还(1为存活,空为狗带),有无船舱(1为有,空为无),费用fare(fare大于10,和小于10的)。

#将数量转化成商品名称
#fare大于10则输入数据,否则删除数据
#survived和cabin则通过判断是否为空来输入或删除数据
for k in z1:
    index = z1.index(k)
    if k[2] >10:
        z2[index][2] = 'Fare'
    else:
        del z2[index][2]
    if k[1] == k[1]:
        z2[index][1] = 'Cabin'
    else:
        del z2[index][1]
    if k[0] == k[0]:
        z2[index][0] = 'Survived'
    else:
        del z2[index][0] 
pass

最后我们打印各级的项集:

if __name__ == "__main__":
    """
    Test
    """
    data_set = load_data_set()
    L, support_data = generate_L(data_set, k=3, min_support=0.1)
    #将限制概率调制0.6,低于0.6不显示
    big_rules_list = generate_big_rules(L, support_data, min_conf=0.6)
    for Lk in L:
        print("="*50)
        print("frequent " + str(len(list(Lk)[0])) + "-itemsets\t\tsupport")
        print("="*50)
        for freq_set in Lk:
            print(freq_set, support_data[freq_set])
    print
    print("Big Rules")
    for item in big_rules_list:
        print(item[0], "=>", item[1], "conf: ", item[2])

在这里插入图片描述
最后,得出结果是:
可以看出,{1-项集}中,船票价格fare大于10美元的人是70%,存活率是58.7%,有船舱住的人是34%.
{2-项集}中,我们主要关注,船票价格fare大于10美元的人且存活的是45.2%,有船舱住的人且存货的是21.4%
{3-项集}中,船票价格fare大于10美元的人且存货的人,概率高达77.1%,我们再次调整fare的价格限制为20美元,概率也有67%,可见船票价格fare大于10美元的人与是否存活有着一定关系。同时,有船舱的人他们的船票价格fare大于10美元的概率是97.3%,可见船上大于10美元的船舱是占巨大的比例。
在这里插入图片描述

源代码

import csv
import pandas as pd
import sys
import numpy as np

#读取892数据
Survived = pd.read_csv('f:/train.csv', usecols=['Survived'],nrows=892)

data_category1 = Survived.values
List_category1 = []
for k in data_category1: 
    for j in k: 
        List_category1.append(j)
Cabin = pd.read_csv('f:/train.csv', usecols=['Cabin'],nrows=892)
data_category2 = Cabin.values
List_category2 = []
for k in data_category2: 
    for j in k: 
        List_category2.append(j)
Fare = pd.read_csv('f:/train.csv', usecols=['Fare'],nrows=892)
data_category3 = Fare.values
List_category3 = []
for k in data_category3: 
    for j in k: 
        List_category3.append(j)

#组合3个元祖
z = list(zip(List_category1,List_category2,List_category3))

 #将元祖转换为列表
for c in z:
    z[z.index(c)] = list(c)
pass
z1 = z.copy()

#删除有两个空值的列表
for h in z1:
    index = z1.index(h)
    if h[0] != h[0] and h[1] != h[1]:
        del z1[index]
        continue
    elif h[0] != h[0] and h[2] != h[2]:
        del z1[index]
        continue
    elif h[1] != h[1] and h[2] != h[2]:
        del z1[index]
        continue
pass

z2 = z1.copy()

#将数量转化成商品名称
for k in z1:
    index = z1.index(k)
    if k[2] >15:
        
        z2[index][2] = 'Fare'
    else:
        del z2[index][2]
    if k[1] == k[1]:
        z2[index][1] = 'Cabin'
    else:
        del z2[index][1]
    if k[0] == k[0]:
        z2[index][0] = 'Survived'
    else:
        del z2[index][0]
    
pass


print(z2)


def load_data_set():
    data_set = z1
    return data_set

def create_C1(data_set):
    C1 = set()
    for t in data_set:
        for item in t:
            item_set = frozenset([item])
            C1.add(item_set)
    return C1


def is_apriori(Ck_item, Lksub1):
    for item in Ck_item:
        sub_Ck = Ck_item - frozenset([item])
        if sub_Ck not in Lksub1:
            return False
    return True


def create_Ck(Lksub1, k):
    Ck = set()
    len_Lksub1 = len(Lksub1)
    list_Lksub1 = list(Lksub1)
    for i in range(len_Lksub1):
        for j in range(1, len_Lksub1):
            l1 = list(list_Lksub1[i])
            l2 = list(list_Lksub1[j])
            l1.sort()
            l2.sort()
            if l1[0:k-2] == l2[0:k-2]:
                Ck_item = list_Lksub1[i] | list_Lksub1[j]
                if is_apriori(Ck_item, Lksub1):
                    Ck.add(Ck_item)
    return Ck


def generate_Lk_by_Ck(data_set, Ck, min_support, support_data):
    Lk = set()
    item_count = {}
    for t in data_set:
        for item in Ck:
            if item.issubset(t):
                if item not in item_count:
                    item_count[item] = 1
                else:
                    item_count[item] += 1
    t_num = float(len(data_set))
    for item in item_count:
        if (item_count[item] / t_num) >= min_support:
            Lk.add(item)
            support_data[item] = item_count[item] / t_num
    return Lk


def generate_L(data_set, k, min_support):
    support_data = {}
    C1 = create_C1(data_set)
    L1 = generate_Lk_by_Ck(data_set, C1, min_support, support_data)
    Lksub1 = L1.copy()
    L = []
    L.append(Lksub1)
    for i in range(2, k+1):
        Ci = create_Ck(Lksub1, i)
        Li = generate_Lk_by_Ck(data_set, Ci, min_support, support_data)
        Lksub1 = Li.copy()
        L.append(Lksub1)
    return L, support_data


def generate_big_rules(L, support_data, min_conf):
    big_rule_list = []
    sub_set_list = []
    for i in range(0, len(L)):
        for freq_set in L[i]:
            for sub_set in sub_set_list:
                if sub_set.issubset(freq_set):
                    conf = support_data[freq_set] / support_data[freq_set - sub_set]
                    big_rule = (freq_set - sub_set, sub_set, conf)
                    if conf >= min_conf and big_rule not in big_rule_list:
                        big_rule_list.append(big_rule)
            sub_set_list.append(freq_set)
    return big_rule_list


if __name__ == "__main__":
    """
    Test
    """
    data_set = load_data_set()
    L, support_data = generate_L(data_set, k=3, min_support=0.1)
    big_rules_list = generate_big_rules(L, support_data, min_conf=0.6)
    for Lk in L:
        print("="*50)
        print("frequent " + str(len(list(Lk)[0])) + "-itemsets\t\tsupport")
        print("="*50)
        for freq_set in Lk:
            print(freq_set, support_data[freq_set])
    print
    print("Big Rules")
    for item in big_rules_list:
        print(item[0], "=>", item[1], "conf: ", item[2]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据挖掘之关联分析(实验展示以及源代码) 的相关文章

  • JDBC——BasicDAO

    为什么要有 BasicDAO apache dbutils Druid 简化了 JDBC 开发 但还有不足 SQL语句是固定 不能通过参数传入 通用性不好 需要进行改进 更方便执行增删改查 对于 select 操作 如果有返回值 返回类型不
  • Putty配色方案(转)

    平时用Putty的频率相对挺高的 每次装完系统或是怎么的都得重新配色 还得百度去找配色表 每次太麻烦了 特地转载一篇好看的配色表供以后长期使用 以下内容为转载内容 使用的是修改注册表的方法 1 打开注册表 运行 regedit 2 找到对应

随机推荐

  • matlab仿真实例100题_输入-输出反馈线性化(Feedback linearization)控制算法Matlab仿真实例...

    反馈线性化 Feedback linearization 可能是大部分人接触非线性控制之后学习的第一种控制方法 个人认为主要优点有两点 一 它的理解和实现都相对简单 二 它能让非线性系统的转换为线性系统 这样接下来 就可以直接套用线性系统中
  • SQLEXPRESS服务无法启动

    一 软件版本 SQL Sever2014 localdb MSSQLLocalDB SQLServer13 0 VS2015 二 问题描述 由于使用web API中的odata编程 在工程中使用的是 localdb MSSQLLocalDB
  • Lintcode 464. 整数排序 II 冒泡排序三种实现 直接插入排序 直接选择排序 java

    一 冒泡排序 实现思路 https blog csdn net morewindows article details 6657829 Lintcode https www lintcode com problem sort integer
  • Ubuntu下安装及卸载JDK

    安装 1 添加 PPA repository 到系统 sudo add apt repository ppa webupd8team java 2 更新 sudo apt get update 3 下载安装 JDK sudo apt get
  • 算法专题之二叉树

    前言 树型数据结构广泛存在于现实世界中 比如家族族谱 企业职能架构等 它是一类在计算机领域被广泛应用的非线性数据结构 二叉树是树型数据中最常用的一类 本文从前端角度以js语法构建和操作二叉树的相关知识 基础概念 观察上图 二叉树的数据结构如
  • C++——大数加法

    大数加法 即运算的数据可能很大 int long long long无法存放 存在字符串中 但是加法的运算规则还是10进制 对于两个字符串 首先判断两者的长度 我们将字符串s设置为较长的字符串 方便后面的运算 也可以将t设置为较长的 从低位
  • 一文2000字详细介绍Android APP 常见概念与 adb 命令

    01 背景 因 team 正在推进 APP 自动化测试 那么主要业务是 IoT 相关的产品 既然是 APP 自动化测试 那么 Android APP 相关的一些概念与知识就很关键了 在之前遇到相关的问题都是现查现用 对于一些常用的概念和命令
  • 【Redis】常见数据结构及命令

    Redis常见命令 Redis数据结构介绍 Redis是一个key value的数据库 key一般是String类型 但是value的类型有很多种 Redis 通用命令 通用指令是部分数据类型的 都可以使用的指令 常见的有 KEYS 查看符
  • C++实现英语词典

    需要的东西 1 一个词典的txt文件 2 创建map容器 map
  • 最小二乘支持向量机”在学习偏微分方程 (PDE) 解方面的应用(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 本代码说明了 最小二乘支持向量机 在学习偏
  • 多媒体(视频容量计算)-软件设计(四十二)

    真题详解 有向图 软件设计 四十一 https blog csdn net ke1ying article details 129942490 一 音频概念 声音带宽 人耳 20Hz 20KHz 说话300 3400Hz 小于20Hz次声波
  • 上海链节科技:什么是企业链改?

    如何定义链改 链改 即用区块链中的部分技术原理和机制来改造业务系统中特定的部分 以创造更高效 更有公信力的系统 甚至还包括利用区块链上的各类积分 Token通证 来重新分配业务系统进而间接的改进业务系统背后的生产关系 传统基本结构的公司 通
  • 从IDataReaderHelper中读取数据实体

    using System using System Collections Generic using System Linq using System Text using System Data using System Reflect
  • 截取oracle字符串中的数字(转载)

    截取oracle字符串中的数字 云淡风轻博客 博客园 cnblogs com 方法一 如果Oracle版本不是太低的话 使用 正则表达式函数 REGEXP SUBSTR 处理 REGEXP SUBSTR有5个参数 分别是 第一个是输入的字符
  • GMAPPING的参数设置

    二 运行gmapping 我总结了运行gmapping的两种方法 1 基于命令行 rosrun gmapping slam gmapping scan scan delta 0 1 maxUrange 4 99 xmin 5 0 ymin
  • python必背代码-Python高手必修课:如何让 Python 代码更易读,推荐收藏

    阅读本文大概需要 10 分钟 我们知道 Python 是一种动态语言 在声明一个变量时我们不需要显式地声明它的类型 例如下面的例子 a 2 print 1 a 1 a 运行结果 1 a 3 这里我们首先声明了一个变量 a 并将其赋值为了 2
  • 【深入理解C++】string

    文章目录 1 概述 2 string的定义与初始化 3 string的赋值 4 string的读写 5 string的长度 6 string的遍历 6 1 运算符 6 2 at 6 3 迭代器 6 4 范围for 7 string 与 ch
  • Excel开发(VBA)— 快速定位最后有记录的行

    有时候 在进行Excel开发时 需要知道某列的最后一行的行号 Excel也提供了相关功能 Range End属性 Dim strCell As String Dim nLastUseRow As Long Dim nLastRcdRow A
  • Vue深入响应性原理

    深入响应性原理 参考资料 响应性 深入响应性原理 什么是响应性 Vue如何知道哪些代码在执行 Vue如何跟踪变化 被代理的对象 Proxy vs 原始标识 如何让渲染响应变化 响应性基础 声明响应式状态 创建独立的响应式值作为refs Re
  • 数据挖掘之关联分析(实验展示以及源代码)

    数据挖掘之关联分析 算法实现 Apriori算法和FP growth 算法 源代码 简单描述下 关联分析概念 关联分析概念主要参考下面的博文 原文 https blog csdn net qq 40587575 article detail