关联分析可以了解数据集中的项之间的关联程度,可以挖掘出“某些事件可能会引起另外一些事情的发生”之类的规则,从而有助于做出一些关联性的推断或预测。生成的结果类似于"炸鸡>>啤酒",由前项和后项组成。
(数据集见评论)
import pandas as pd
df = pd.read_excel('/kaggle/input/diseases-of-traditional-chinese-medicine/Diseases of Traditional Chinese Medicine.xlsx')
df.head()
运行结果:
# 转换为双重列表结构
symptoms = []
for i in df['病人症状'].tolist():
symptoms.append(i.split(','))
代码详解:
[] 表示创建一个空列表symptoms;
df['病人症状']是一个Series对象,tolist()函数将该Series对象转换为一个Python列表;
split()函数用于拆分字符串,split(',')表示以逗号为分隔符进行拆分;
i 代表df['病人症状']里的每一个元素,i.split(',')函数作用于每一个元素里的逗号;
append()用于在列表的末尾添加一个元素,append(i)将该字符串作为一个新元素添加到symptoms列表的末尾;
运行结果:
# 安装apyori包
pip install apyori
# 调用apyori库中的apriori()函数对病症列表symptoms进行关联关系分析
from apyori import apriori
rules = apriori(symptoms, min_support=0.1, min_confidence=0.7)
results = list(rules)
代码详解:
min_support:表示最小支持度,即频繁项集在数据集中出现的最小比例。0.1则表示频繁项集在数据集中至少出现10%的次数。
min_confidence:表示最小置信度,即关联规则的最小置信度。0.7表示关联规则的置信度至少为70%。
list()可以将元组、列表、集合等转换为列表。方便我们使用列表的方法和属性来访问和处理关联规则的元素。
运行结果:
# 提取results中的关联规则,并通过字符串拼接更好地呈现关联规则
for i in results: # 遍历results中的每一个频繁项集
for j in i.ordered_statistics: # 获取频繁项集中的关联规则
X = j.items_base # 关联规则的前件
Y = j.items_add # 关联规则的后件
x = ', '.join([item for item in X]) # 连接前件中的元素
y = ', '.join([item for item in Y]) # 连接后件中的元素
if x != '': # 防止出现关联规则前件为空的情况
print(x + ' >> ' + y) # 通过字符串拼接更好地呈现结果
代码详解:
`i.ordered_statistics`是一个属性,它返回频繁项集`i`中的关联规则。
每个关联规则都包含以下信息:
- `items_base`:关联规则的前件,即规则的前半部分。
- `items_add`:关联规则的后件,即规则的后半部分。
- `confidence`:关联规则的置信度,表示在前件出现的情况下,后件也会出现的概率。
join()可以把列表、元组里的元素连成一个字符串;
', '.join()表示把列表里的元素用逗号和空格分隔开,并将它们连接成一个字符串。
运行结果:
结果解读:“便秘 >> 消化不良” 表示在数据集中经常同时出现 "便秘" 和 "消化不良" 这两个项,其他项也同理。
注意:关联分析只能找到项之间的相关性,并不能确定因果关系哦。