IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 数据分析技术在审计中的应用(一)- 学习笔记 -> 正文阅读

[大数据]数据分析技术在审计中的应用(一)- 学习笔记

一、理论学习

(一)概念理解

? ? 1. 数据式审计不是大数据审计。如果直接用SQL查询就能解决的问题,严格来讲不属于大数据审计。

? ? 2. 大数据时代,各单位、部门的数字化程度越来越高,数字越来越完备,SQL查询的计算机审计将更有作为。

? ? 3. 严格的大数据审计包括以下三个课题:

? ? ? ? (1)使用计算框架解决单台计算机计算能力不足的问题;

? ? ? ? (2)对非结构化的数据进行采集、分析、处理、解决非结构化数据转为结构化数据的问题;

? ? ? ? (3)对接数据挖掘算法,解决审计线索的发现难题。

(二)本福特和他的发现

? ? 1. 本福特(Frank Benford,1883~1984)是一位美国电气工程师。工作中,他注意到自己所使用的对数表的书前面几页比后面几页的磨损程度更为严重,而前面页对应的是首位数字较小的数。受此现象启发,本福特推论首位数字较小的数在日常生活中会更频繁地用到。

? ? 2. 为了验证自己得到的猜想,他从包括河流面积、人口统计、分子及原子重量、物理常数等多种来源中采集了20000多个随机数字。发现,大约31%的数字首位数是1,19%的数字首位数是2,越往后频率越低,首位数是9的数字只占5%。

? ? 3. 可以证明,当数字自然地产生(不人为设置最大值或最小值)时,大量数字的首位数的确具有某种内在规律性。

?(三)“信息熵”及其应用

? ? 1. 信息熵(Information Entropy)是度量信息混乱程度的指标,越混乱值越大,越存粹越接近于0.利用信息熵可以审计“参保人员购药骗保”。

? ? 2. 基于假设:不法分子倾向于在医保最高限额下,从多家不同药店和医院购买不同药物用于贩卖。因此,其购药行为特点是所关联的药店和医院数量多,且金额趋向于平均。

? ? 3. 可见,若要有效锁定不法分子,不能仅仅看消费总额,还要看消费方式。信息熵提供了这样一种度量方式,购药金额信息熵高的人存在较高嫌疑。

? ? 信息熵计算公示如下,其中p表示概率:

?

?二、实战训练

? ? 1. 验证本福特定律中首位数为1~9概率之和为1

? ? ? ? (1)验证前3219个斐波那契数列数

import numpy as np
import pandas as np
import matplotlib.pyplot as plt

[np.log10(1+1/x) for x in range(1,10)]
sum([np.log10(1+1/x) for x in range(1,10)])
# 构造斐波那契数列
def getFib(n):
    if n == 1 or n == 2:
        return 1
    else:
        return getFib(n-1) + getFib(n-2)

[getFib(n) for n in range(1,3220)]
# 数据量太大,运算速度慢,返回时间长



# 改进一下,缓存一下,用空间换时间
import functools
@functools.lru_cache()
def getFib(n):
    if n == 1 or n == 2:
        return 1
    else:
        return getFib(n-1) + getFib(n-2)

ls = [getFib(n) for n in range(1,3220)]  # 保存在ls中



# 字典递归/使用现有函数
rst = pd.Series(ls).apply(lambda x: int(str(x)[0])).value_counts().sort_index()  # 函数:转换为字符串;取首位;转换为数字;再使用value_counts进行计数;最后使用sort_index()排序,从1到9显示

? ? ? ? (2)验证前3219个阶乘并绘图

# 计算阶乘的函数
@functools.lru_cache()
def getFactorial(n):
    if n == 1:
        return 1
    else:
        return getFactorial(n-1)*n



ls2 = [getFactorial(n) for n in range(1,3220)]

rst2 = pd.Series(ls2).apply(lambda x: int(str(x)[0])).value_counts().sort_index()
plt.bar(range(1,10), height = rst/np.sum(rst), width=0.4)
plt.bar(np.arange(1,10)+0.5, height = rst2/np.sum(rst2), width=0.4)  # 为了两个柱状图错开,往左0.5个单位;但range无法直接+0.5,因此使用np.arange
plt.xticks(range(1,10))  # 设置横坐标1~10
plt.show()

? ? 2. 计算并展示购药总金额与本福特定律的吻合性

df = pd.read_excel(r".\审计数据分析\df20.xlsx")
df.head(15)



s1 = df.总价.apply(lambda x: int(str(x)[0])).value_counts().sort_index()



plt.bar(range(1,10), height = s1/np.sum(s1))
plt.xticks(range(1,10))  # 设置横坐标1~10
plt.show()

? ? 3. 验证下图左侧表格

def calcInfo(v):
    p = v/np.sum(v)
    return -np.sum(p*np.log2(p))
[calcInfo([1]*n) for n in range(1,11)]

? ? ?4. 数据探索与发现

? ? ? ? (1)多少消费者?多少家店?多少种药?

df.Buyer.unique().size, df.Shop.unique().size ,df.Medicine.unique().size
# unique()不计重复的,size总计,用逗号隔开返回元组

? ? ? ? (2)单价最贵的药?

df.iloc[df.单价.idxmax()]
# 返回那一行所有信息

? ? ? ? (3)药品按单价由高到低排序

df[["Medicine", "单价"]].sort_values(by = "单价", ascending = False)
# 有的药可能在不同店售价不同,下面我们将同一种药在不同店售价取平均值,再进行排序
df.单价.groupby(df.Medicine).mean().sort_values(ascending = False)

? ? ? ? (4)药品按销售额由高到低排序

df.单价.groupby(df.Medicine).sum().sort_values(ascending = False)

? ? ? ? (5)药品按销量由高到低排序

df.Num.groupby(df.Medicine).sum().sort_values(ascending = False)

? ? ? ? (6)购药者按照购药总金额由高到低排序

总金额排行 = df.总价.groupby(df.Buyer).sum().sort_values(ascending = False)
总金额排行

? ? 5. 购药者按照信息熵排序(传统编程思路)

bid = df.Buyer.unique()  # 获取所有购药者的ID
rst = []  # 准备放每个BID对应的信息熵值
for b in bid:
    d = df[[“Shop”, "总价"]][df.Buyer == b]  # 进行切片df.Buyer == b
    v = d.总价.groupby(d.Shop).sum().values
    tmp = calcInfo(v)  # calcInfo函数前面已经定义
    rst.append(tmp)
    print(">", end="")  # 代码运行需要一段时间,每执行完一个就输出一个>,方便查看运行情况。     
info = pd.Series(rst, index = bid)  # 直接输出rst不好看,转换为rst与bid相对应的
info.sort_values(ascending = False)

? ? ? ? · 观察信息熵极高者的购药行为

df[df.Buyer == "BID2104"]

? ? 6. 购药者按照信息熵排序(无循环)

# 计算分子,结果双重索引,返回Series而不是DataFrame
df.groupby(["Buyer", "Shop"])["总价"].sum()
# 计算分母
df.groupby(["Buyer"])["总价"].sum()
# 两者相除得到概率
df.groupby(["Buyer", "Shop"])["总价"].sum() / df.groupby(["Buyer"])["总价"].sum()
# 计算信息熵
(df.groupby(["Buyer", "Shop"])["总价"].sum() / df.groupby(["Buyer"])["总价"].sum()).apply(lambda x: -x*np.log2(x))
# 设置索引,进行排序
信息熵排行 = (df.groupby(["Buyer", "Shop"])["总价"].sum() / df.groupby(["Buyer"])["总价"].sum()).apply(lambda x: -x*np.log2(x)).reset_index().groupby(["Buyer"]).sum().sort_values(by = "总价", ascending = False)  # 这里的“总价”历史遗留,其实就是“信息熵”
信息熵排行[:20]

? ? 7. 购药者按照光顾的店面数排序

门店数排行 = df.Shop.groupby(df.Buyer).unique().apply(lambda x:len(x)).sort_values(ascending = False)  # .count()计算全部总数,因此不能使用;使用apply()
门店数排行

? ? ※ 验证包含关系(信息熵高的是否门店数就多?)

信息熵排行[:20].index.isin(门店数排行[:20].index)

? ? ※ 验证包含关系(信息熵高的是否总金额就高?)

信息熵排行[:20].index.isin(总金额排行[:100].index)
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-07-31 16:42:40  更:2021-07-31 16:43:47 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/4 19:12:08-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码