数据挖掘_实验三_探索性数据分析方法与应用


实验三 探索性数据分析方法与应用

【实验目的】
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)

相关