Python数据分析实例详解,python数据分析基础和利用python进行数据分析
第85条合计
01背景:在做机器学习之前,我们需要对数据进行深入的了解(有哪些类型的数据,总共有多少个数据,是否有缺失值,平均值是多少等等。).只有对数据有足够的了解,才能更好地利用机器学习。我们把在机器学习正式开始之前理解数据的过程称为探索性分析,简称EDA。
02单变量数据分析:单边数据是指数据集中只有一个变量,也可以是几列中的一列(可以理解为指标)。举个例子,如果一个班级的体检报告单是一个数据集(包括身高、体重、1000m时间等各种指标),那么数据集中的某个指标就可以看作是一个单变量数据。
在这篇文章中,我们以美国总统历年在全国协商中向国会提出申诉的次数为例。
2.1了解数据的整体情况:当我们得到一批/列数据时,首先要看的是这批数据的整体分布情况,而看分布情况最好的方法就是画出这批数据的散点图。
#加载所需库% matplotlib inline Import numpy as NP PLT . style . use( gg plot )from matplotlib . py lab Import frange Import matplotlib . py plot as PLT #导入相应数据fill _ data=lambda x: int (x.strip()或0) #处理缺失值。如果缺少,fill data=NP . genfromxt( d:\ \ data-science \ \ exercise data \ \ Python data science guide支持文件\ \ 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=
从上图可以看出,大部分数据分布相对集中,但这是主观感受,需要采用更科学的方法来衡量。这里用分位数来衡量。
分位数是指将所有数值按照它们在统计学中的位置从小到大进行划分。一般所有数据会被三个点(位置25,50,75)分成四个部分。
#计算数据的百分位数(第25、50、75位)就知道数据分布perc _ 25=NP。百分位(y,25) perc _ 50=NP。百分位(y,50) perc _ 75=NP。百分位(y,75)打印(第25百分位=% 0.2f% (PERC _ 25))打印(第50百分位=% 0.2f% (PERC _ 50))打印(第75百分位=% 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(无预先指定请求)ax1.axhline(perc_25,label= 25th日,c=y)ax1.axhline(perc_50,label= 50th日,c=g)ax1.axhline(perc_75,label= 75th日,c
现在我们可以看到,大部分数据确实分布在50百分位(中间值)的两侧,只有左上角和右下角的几个点距离50百分位很远。在这里,它们被视为异常值。
异常值可以直接删除或替换为缺失值。具体选择看不同情况。我们在这里选择删除异常值。
#找出图中是否有异常值#使用掩码函数删除异常值#删除异常值0和54y _ masked=NP . ma . masked _ where(y==0,y)y _ masked=NP . ma . masked _ where(y==54,y _ masked)并重新绘制图。
# Add 25,50,75分位数行ax2=plt.plot (1,1,1) ax2.scatter (x,y _ masked,c= r )ax2 . set _ title( Masked data )ax2 . set _ xlabel( year )ax2 . set _ ylabel(无预先确定的请求)ax2.set_ylim(0,60)axh line(perc _ 25,label= 25th日PERC ,c=y)ax2.axhline(perc
是不是现在看着顺眼多了?从上表可以看出,这批数据大部分集中在50百分位(中间位置的个数)附近,绝对值在20左右。散点图可以帮助我们对数据有一个大概的了解,但是不够具体。我们将从其他几个角度继续探讨这批数据集。
2.2单变量数据的进一步分析:在看完整体数据分布后,我们想更具体地看一下,比如:哪一年的需求量最大?哪个数量级需求最大等等。
分析上诉数量的绝对数量:
#计数数据出现的频率x _ freq=counter(y)x _=list(x _ freq。keys ()) #一定量级的上诉次数y_=list(x_freq.values())#上诉的绝对值# Draw bitmap PLT . subplot(111 PLT . title(按频率点绘图)# Plot frequency PLT.plot (y _,x _, yo )PLT . xlabel( count )PLT . ylabel(总统请求)#设置x轴PLT.xlim (min (y _
从上图可以看出,30以上的申诉次数只出现一次、两次,三次申诉次数都低于30,说明生活还是很稳定的,人的申诉没那么多。(我在胡说八道)
分析不同年份的上诉数量;
# Group by year range x _ Group=collections . ordered dict()Group=5 Group _ 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)]=valuesprint(x _ Group)# Plot散点图PLT。subplot(111)x _ valves=[]x _ labels=[]y _ valves=[]x _ tick=1v 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)]
在对年份的分析中,我们以五年为界进行分组。从图表中我们可以看到,1961年到1965年的上诉数量是最少的,并且都低于20。1986年到1990年的申诉数量比较分散,申诉数量的绝对值在这个范围内。1981年至1985年的上诉数量相对稳定,五年中有四年的上诉数量低于10起。
涉及的知识点总结:np.genfromtxt()#numpy库用于读取文件,相当于熊猫中的read_csv()。
Np.percentile()#用于计算一批数据的分位数。
Np.ma.masked_where()#用于屏蔽满足一定条件的值,常用于处理缺失数据。
收藏。OrderedDict()# () #用于创建有序字典。
Counter()#用于统计一批数据中不同点的次数,返回一个字典。关键是值,值是关键在该批数据中出现的次数。
Enumerate()#用于返回一个值在一批数据中出现的顺序。
Np.repeat()#用于重复某个数据序列。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。