python数据科学-单变量数据分析
总第85篇
01|背景:
我们在做机器学习之前,需要自己先对数据进行深入的了解(这些数据是什么类型,总共有多少数据,有没有缺失值,均值是多少之类的),只有自己对数据足够了解了,才能够更好地利用机器学习。我们把在正式开始机器学习之前对数据的了解过程成为探索性分析 , 简称 EDA。
02|单变量数据分析:
单边量数据是指数据集中只有一个变量 ,也可以是多列中的某一列(可以理解成是某一个指标)。比如一个班的体测成绩表是一个数据集(包含身高、体重、1000 米用时之类的各种指标),那么该数据集里面的某一个指标就可以看作是一个单变量数据。
我们本篇以美国总统历年在国情咨询中对国会提起的诉求数量作为实例。
2.1数据整体情况了解:
我们在拿到一批/列数据时,第一件事就是看一下这批数据的一个整体分布情况,而要看分布情况最好的方法就是绘制该批数据的散点图。
#加载需要的库%matplotlib inline
import numpy as np
plt.style.use("ggplot")
from matplotlib.pylab import frange
import matplotlib.pyplot as plt
#导入相应的数据
fill_data=lambda x:int(x.strip() or 0)#用来处理缺失值,如果缺失,用0填充
data=np.genfromtxt("D:\Data-Science\Exercisedata\python数据科学指南配套文件\president.csv",
dtype=(int,int),delimiter=",",converters={1:fill_data})
x=data[:,0]
y=data[:,1]
#绘制数据图表以观察趋势
ax1=plt.subplot(1,1,1)
ax1.set_title("All data")
ax1.scatter(x,y,c="r")
ax1.set_xlabel("year")
ax1.set_ylabel("No presdential Request")
通过上图我们可以看出,大部分数据分布还是相对比较集中,但是这是主观上感觉,我们需要采用更科学的方法来进行衡量,这里采用分位数去衡量。
分位数是指在统计学中把所有数值由小到大排列按所处的位置进行分割,一般会把所有的数据用三个点(25、50、75位置的)分成四份。
#计算数据的百分位数(第25、50、75位数)以了解数据分布
perc_25=np.percentile(y,25)
perc_50=np.percentile(y,50)
perc_75=np.percentile(y,75)
print("25th Percentile=%0.2f"%(perc_25))
print("50th Percentile=%0.2f"%(perc_50))
print("75th Percentile=%0.2f"%(perc_75))
在得到相应的分位数以后,我们将分位数对应的图表绘制到散点图中。
#将这些百分位数添加到之前绘制的图表中作为参考
ax1=plt.subplot(1,1,1)
ax1.set_title("All data")
ax1.scatter(x,y,c="r")
ax1.set_xlabel("year")
ax1.set_ylabel("No presdential Request")
ax1.axhline(perc_25,label="25th",c="y")
ax1.axhline(perc_50,label="50th",c="g")
ax1.axhline(perc_75,label="75th",c="m")
ax1.legend(loc="best")
现在可以看到,大部分数据确实是分布在 50 分位数(中间值)的两侧,只有左上角和右下角的几个点离 50 分位数比较远,,这里把他们当作异常值来看待。
异常值的处理方式可以直接删除,也可以把异常值当作缺失值对待进行值替换,具体选择哪种根据不同情况来定,我们这里选择把异常值删除掉。
#在图形中查找是否存在异常值
#使用mask函数删除异常值
#删除异常值0和54
y_masked=np.ma.masked_where(y==0,y)
y_masked=np.ma.masked_where(y==54,y_masked)
重新绘制图表,并将对应的分位数线也绘制进去。
#在图中添加25、50、75分位数线
ax2=plt.subplot(1,1,1)
ax2.scatter(x,y_masked,c="r")
ax2.set_title("Masked data")
ax2.set_xlabel("year")
ax2.set_ylabel("No Presedential Request")
ax2.set_ylim(0,60)
ax2.axhline(perc_25,label="25th perc",c="y")
ax2.axhline(perc_50,label="50th perc",c="g")
ax2.axhline(perc_75,label="75th perc",c="m")
ax2.legend(loc="best")
现在看起来是不是就顺眼很多了哈。通过上表我们可以看出,该批数据大部分还是集中 50 分位数(中间位置数)附近,绝对值大小为 20 左右。散点图能帮我们对数据有一个大概的认识,但是还不够具体,我们接下来通过其他几个角度继续对该批数据集进行探索。
2.2对单变量数据进一步分析:
看了整体数据分布以后我们还想看得更具体一点,比如:哪一年的诉求量最多?哪个量级的诉求量最多之类的。
对诉求数量的绝对量级进行分析:
#对数据出现的频率进行统计
x_freq=Counter(y)
x_=list(x_freq.keys())#某一个量级诉求数量出现的次数
y_=list(x_freq.values())#诉求数量绝对值
#绘制分组数据的点阵图
plt.subplot(111)
plt.title("Dot Plot by Frequency")
#绘制频率plt.plot(y_,x_,"yo")
plt.xlabel("Count")
plt.ylabel("Presdential Request")
#设置x轴的最小值和最大值
plt.xlim(min(y_)-1,max(y_)+1)
plt.ylim(-5,60)
通过上图可以看出,超过30的诉求数量只出现一次,出现2次,3次的诉求数量均低于30,说明生活还是很稳定,人们的诉求并不是那么多。(我瞎说的)
对不同年份的诉求数量分析:
#采用年份范围进行分组
x_group=collections.OrderedDict()
group=5group_count=1
keys=[]
values=[]
for i,xx in enumerate(x):
keys.append(xx)
values.append(y[i])
if group_count==group:
x_group[tuple(keys)]=values
keys=[]
values=[]
group_count=0
group_count+=1x_group[tuple(keys)]=values
print(x_group)
#绘制散点图plt.subplot(111)
x_vals=[]
x_labels=[]
y_vals=[]
x_tick=1
for k,v in x_group.items():
for i in range(len(k)):
x_vals.append(x_tick)
x_label="-".join([str(kk) if not i else str(kk)[-2:] for i ,kk in enumerate(k)])
x_labels.append(x_label)
y_vals.extend(list(v))
x_tick+=1plt.title("Dot Plot by Year Grouping")
plt.xlabel("Year Group")
plt.ylabel("No Presedential Request")try:
plt.plot(x_vals,y_vals,"co")except ValueError:
print(len(x_vals),len(y_vals))
plt.xticks(x_vals,x_labels,rotation=-50)
plt.ylim(-5,60)
年份分析里面我们以5年为一个界限进行分组,通过图表我们可以看出1961-1965的诉求数量最低,且均低于20,1986-1990年的诉求数量较分散,且诉求数量的绝对值在该范围内,1981-1985年之间的诉求数量较平稳,且5年中有4年的诉求数量是低于10的。
涉及的知识点总结:
- np.genfromtxt()#numpy库中用来读取文件的,相当于pandas中的read_csv()。
- np.percentile()#用来计算一批数据的分位数。
- np.ma.masked_where()#用来屏蔽满足某一条件的数值,常用来处理缺失数据。
- Collections.OrderedDict()#用来创建一个有序字典。
- Counter()#用于统计一批数据中不同点出现的次数,返回一个字典,键为值,值为键在该批数据中出现的次数。
- enumerate()#用于返回一个值在一批数据中出现的顺序。
- np.repeat()#用于重复某一个序列数据。
- 使用神经网络来拟合函数y = x^3 +b
- GO语言如何调用C写的函数
- 使用Anaconda搭建TensorFlow-GPU环境
- google gflag使用方法举例
- caffe源码学习之Proto数据格式【1】
- 降维之pca算法
- 聚类之dbscan算法
- ubuntu 使用sudo apt-get update 出现 被配置多次导致无法升级错误解决方法
- morestack与goroutine pool
- 关于python使用threadpool中的函数单个参数和多个参数用法举例
- python科学计算之numpy
- 关于python使用cv画矩形并填充颜色同时填充文字
- Go语言入门基础
- 【前端编程】加载第三方JS的各种姿势
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- kali下安装beef并联合Metasploit
- 初次使用maven创建web工程发现只有一个idea目录,src,webapp目录都不见了,解决方案
- 栈论 : 递归与栈式访问,如何用栈实现所有递归操作(幼儿园题目篇,题目2)
- SQL注入原理及代码分析(一)
- SQL注入原理及代码分析(二)
- 写一个方法,输入一个文件名和一个字符串,统计这个字符串在这个文件中出 现的次数。
- SSRF漏洞简单分析
- 树莓派基础实验30:BMP180气压传感器实验
- DC-1靶机实战和分析
- 如何用Python优雅的登录校园网?
- PHP入门之类型与运算符
- 栈论 : 递归与栈式访问,如何用栈实现所有递归操作(幼儿园题目篇,题目3)
- Maven是什么? Maven的概念+作用+仓库的介绍+常用命令
- JDK8;HashMap:再散列解决hash冲突 ,源码分析和分析思路
- 写一个 Singleton