数据挖掘 实验三 探索性数据分析方法与应用
public-time:2020-10-10 09:57
实验三 探索性数据分析方法与应用
【实验目的】
1 了解频率和众数的含义与计算。
2 掌握百分位数的计算方法。
3 掌握常见集中趋势度量的方法与计算。
4 掌握常见分散程度的度量方法与计算。
5 熟悉常见数据分析图表的绘制方法。
【实验类型】
设计型
【实验学时】
2学时
【实验环境】
Windows 7以上操作系统
Python3.0以上版本
Pycharm开发环境
Spyder开发环境
【实验要求】
用到的数据集: iris_proc.data
一、频率和众数是简单描述数据分布状况的常见度量,请编写函数实现序列元素频率序列及其众数的计算,并自行构建数据验证方法。
参考输出结果:
def frequency(dic_, len_):
""" 频率 """
dic = {}
for key, value in dic_.items():
dic[key] = value * 1.0 / len_
return dic
def Mode(dic_):
""" 众数 """
lis = []
max_count = 0
for key, value in dic_.items():
if value > max_count:
max_count = value # 记录新的最大值
lis.clear() # 清空列表
if value == max_count:
lis.append(key)
return lis
def count(lis):
""" 统计数量 """
dic = {}
for i in lis:
if i not in dic:
dic[i] = lis.count(i)
return dic
if __name__ == '__main__':
lis = ['a', 'a', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'd', 'e', 'e', 'e']
dic_1 = count(lis)
dic_2 = frequency(dic_1, len(lis))
Mode_ = Mode(dic_1)
print("Count for distinct:\n{}".format(dic_1))
print("Frequency by distinct:\n{}".format(dic_2))
print("Mode:\n{}".format(Mode_))
二、百分位数也是简单描述数据分布特征的常用度量,请编写函数实现数据序列百分位数的计算,并计算iris数据集中四个属性的百分位数。
参考输出结果:
import numpy as np
def oppenfile():
data = np.loadtxt('iris_proc.data', dtype=float,
delimiter=',')
# 读取文件,格式见下文参考资料
return data[:, 0:4]
def percentile_(data_):
lis = list()
for i in range(0, 11):
lis.append([]) # 扩增数组
lis[i].append(i) # 添加分位数标记
lis[i].extend(np.percentile(data_, i*10, axis=0))
# 求列上的分位数,并追加进数组
return np.array(lis)
if __name__ == "__main__":
print(percentile_(oppenfile()))
"""
用Python实现支持向量机并处理Iris数据集:
https://www.cnblogs.com/asagiyukina/p/10703533.html
对于vscode相对路径的问题可设置插件Runcode:勾上“File Directory As Cwd”
参考:https://www.cnblogs.com/xtgame/p/12950727.html
Numpy中文参考手册:https://www.numpy.org.cn/reference/
"""
三、衡量数据序列集中程度的统计量通常由均值、中位数和截断均值,请编写函数分别实现均值、中位数和截断均值的计算,并分别针对iris数据集的四个属性进行计算。
参考输出结果:
import numpy as np
def oppenfile():
data = np.loadtxt('iris_proc.data', dtype=float,
delimiter=',')
return data[..., 0:4]
def truncatedmean(arr_, p=20):
arr_ = np.sort(arr_, axis=0)
# 头尾等量截取p%
a = int(p*len(arr_)/100)
arr = arr_[a:-a, ...]
"""
对截断值逐个尝试?
for i in range(0, 75):
arr_2 = arr_[i:-i, ...]
print(np.average(arr_2, axis=0))
对于去掉最大值和最小值(两端不等量),结果也一样不符合
"""
# 当然这里返回结果和参考不一样
return np.average(arr, axis=0)
def fun(arr_):
x = np.empty([0, 4], dtype=float)
x = np.append(x, [np.average(arr_, axis=0)], axis=0) # 均值
x = np.append(x, [np.median(arr_, axis=0)], axis=0) # 中位数
x = np.append(x, [truncatedmean(arr_, 20)], axis=0) # 截断均值
return x
if __name__ == "__main__":
arr = oppenfile()
print(fun(arr))
四、简单描述数据序列分散程度的统计量通常由极差、标准差、绝对平均偏差(AAD)、中位数绝对偏差(MAD)、四分位数极差(IQR)等,请编写函数实现这些统计量的计算,并针对iris数据集的四个属性进行计算。
参考输出结果:
import numpy as np
class math_:
def range(arr_):
"""
极差又称范围误差或全距(Range),
以R表示,是用来表示统计资料中的变异量
数(measures of variation),其最大值与
最小值之间的差距,即最大值减最小值后所
得之数据。
"""
arr1 = np.max(arr_, axis=0)
arr2 = np.min(arr_, axis=0)
return arr1-arr2
def standardDeviation(arr_):
"""
标准差(Standard Deviation) ,是离均差
平方的算术平均数的算术平方根,用σ表示。
标准差也被称为标准偏差,或者实验标准差,
在概率统计中最常使用作为统计分布程度上
的测量依据。标准差是方差的算术平方根。
标准差能反映一个数据集的离散程度。平均
数相同的两组数据,标准差未必相同。
"""
arr1 = np.std(arr_, axis=0, ddof=1)
return arr1
def ADD(arr_):
""" 绝对平均偏差(AAD) """
x1 = abs(arr_-np.average(arr_, axis=0))
return (x1.sum(axis=0))/len(arr_)
def MAD(arr_):
""" 中位数绝对偏差(MAD) """
arr = np.sort(arr_, axis=0)
arr2 = arr[int(0.5 * len(arr_))]
# 这儿采用中位数作为\bar{x}
arr3 = abs(arr_-arr2)
return np.median(arr3, axis=0)
def IQR(arr_):
arr = np.sort(arr_, axis=0)
""" 四分位数极差(IQR)
IQR:
interquartile range(x)=x(75%)-x(25%)
"""
return arr[int(0.75 * len(arr))]-arr[int(0.25 * len(arr))]
def oppenfile():
data = np.loadtxt('iris_proc.data', dtype=float,
delimiter=',')
return data[..., 0:4]
def fun(arr_):
x = np.empty([0, 4], dtype=float)
x = np.append(x, [math_.range(arr_)], axis=0) # 极差
x = np.append(x, [math_.standardDeviation(arr_)], axis=0) # 标准差
x = np.append(x, [math_.ADD(arr_)], axis=0) # 绝对平均偏差(AAD)
x = np.append(x, [math_.MAD(arr_)], axis=0) # 中位数绝对偏差(MAD)
x = np.append(x, [math_.IQR(arr_)], axis=0) # 四分位数极差(IQR)
print(x)
# return x
if __name__ == "__main__":
arr = oppenfile()
fun(arr)
"""
标准差:https://baike.baidu.com/item/%E6%A0%87%E5%87%86%E5%B7%AE
numpy之标准差std():https://blog.csdn.net/yangwangnndd/article/details/89528492
绝对平均偏差 AAD:absolute average deviation
中位数绝对偏差MAD:median absolute deviation:https://en.wikipedia.org/wiki/Median_absolute_deviation
四分位数极差IQR:interquartile range
numpy求分位数:https://www.cnblogs.com/mingyuxia/p/5810989.html
"""
五、茎叶图是描述数据分布的一种简单可视化方法,请变成实现茎叶图的输出,完成iris数据集中的第一个属性萼片长度的茎叶图输出。
参考输出结果:
import numpy as np
from itertools import groupby
def sort_(arr_):
arr_.sort()
return arr_
def oppenfile():
data = np.loadtxt('iris_proc.data', dtype=float,
delimiter=',')
arr = (data[..., 0:1]*10).flatten()
return arr
def steLeaf(arr_, s_):
# s_分段
for k, g in groupby(arr_, key=lambda x: int(x) // 10):
lst = [int(h) % 10 for h in list(g)]
for i in range(1, 10//s_+1):
liss = list(filter(lambda x: (i-1)*s_ < x < i*s_, lst))
if len(liss) > 0:
print(k, '|', ' '.join(map(str, liss)))
if __name__ == "__main__":
arr = sort_(oppenfile())
steLeaf(arr, 10)
print()
steLeaf(arr, 5)