数据挖掘
探索性数据分析方法与应用
一、频率和众数是简单描述数据分布状况的常见度量,请编写函数实现序列元素频率序列及其众数的计算,并自行构建数据验证方法。
代码:
# -*- coding: utf-8 -*-
#频率 and 众数
freDict={}
#统计元素数量
def count(l):
for item in l:
if item in freDict.keys():
freDict[item] +=1
else:
freDict[item] =1
return
#求元素频率
def transform():
s = float(sum(freDict.values()))
for k in freDict.keys():
freDict[k] /=s
return
#获取众数
def mode():
max_value = list(freDict.values())[0]
max_key = list(freDict.keys())[0]
for key,value in freDict.items():
if value>max_value:
max_value=value
max_key=key
return max_key
l=['a','b','c','d','e','a','b','c','d','e','c','d','e']
count(l)
print("Count for Distinct:",freDict)
transform()
print("Frequency by precent:",freDict)
print("Mode:",mode())
输出结果:
二、百分位数也是简单描述数据分布特征的常用度量,请编写函数实现数据序列百分位数的计算,并计算iris数据集中四个属性的百分位数。
代码:
# -*- coding: utf-8 -*-
from math import *
import numpy as np
iris = np.loadtxt(r"E:\iris_proc.data",delimiter=",")
rel = np.linspace(0,0, 11*5).reshape(11,5)
rel[...,0]=range(0,101,10)
for col in range(1,5):
rel[...,col]=[np.percentile(iris[...,col-1], p) for p in rel[...,0]]
print(rel)
输出结果:
三、衡量数据序列集中程度的统计量通常由均值、中位数和截断均值,请编写函数分别实现均值、中位数和截断均值的计算,并分别针对iris数据集的四个属性进行计算。
代码:
# -*- coding: utf-8 -*-
import math
import numpy as np
def mean(x):
return sum(x)/ float(len(x))
def median(y):
x=np.sort(y)
if len(x)%2==0:
return (x[len(x)//2]+x[len(x)//2+1])/2.0
else:
return x[len(x)//2]
def trimmean(x,p):
b= np.percentile(x, p//2)
t= np.percentile(x, 100-p//2)
return mean([i for i in x if b <= i <= t])
iris = np.loadtxt(r"E:\iris_proc.data",delimiter=",")
rel = np.linspace(0,0, 3*4).reshape(3,4)
for i in range(3):
for j in range(4):
if(i==0):
rel[0,j] = mean(iris[...,j])
elif(i==1):
rel[1,j] = median(iris[...,j])
else:
rel[2,j] = trimmean(iris[...,j], 20)
print(rel)
输出结果:
四、简单描述数据序列分散程度的统计量通常由极差、标准差、绝对平均偏差(AAD)、中位数绝对偏差(MAD)、四分位数极差(IQR)等,请编写函数实现这些统计量的计算,并针对iris数据集的四个属性进行计算。
代码:
import numpy as np
from math import *
def rang(x):
return max(x)-min(x)
def var(x):
return np.var(x)*len(x)/(len(x)-1)
def std(x):
return sqrt(var(x))
def aad(x):
x_mean = np.mean(x)
return sum([abs(x[i]-x_mean) for i in range(len(x))])/len(x)
def mad(x):
x_median = np.median(x)
return np.median([abs(x[i]-x_median) for i in range(len(x))])
def iqr(x):
return np.percentile(x,75)-np.percentile(x,25)
iris = np.loadtxt("E:\iris_proc.data",delimiter=',')
rel=np.linspace(0,0,5*4).reshape(5,4)
for col in range(4):
rel[0, col] = rang(iris[..., col])
rel[1, col] = std(iris[..., col])
rel[2, col] = aad(iris[..., col])
rel[3, col] = mad(iris[..., col])
rel[4, col] = iqr(iris[..., col])
print(rel)
输出结果:
五、茎叶图是描述数据分布的一种简单可视化方法,请变成实现茎叶图的输出,完成iris数据集中的第一个属性萼片长度的茎叶图输出。
代码:
from itertools import groupby
import numpy as np
iris = np.loadtxt("E:\iris_proc.data",delimiter=',')
data = iris[...,0]*10
data = sorted([str(int(e)) for e in data])
#k 和 h 分别为每个数值的十位数字和个位数字的字符形式
for k,g in groupby(data,key=lambda x:int(x)//5):
lst = map(str,[int(h)%10 for h in list(g)])
print(k//2,'|',''.join(lst))
输出结果: