数据分析流程
- 识别需求
识别信息需求是确保数据分析过程有效性的首要条件,可以为收集数据、分析数据提供清晰的目标。 - 收集数据
有目的的收集数据,是确保数据分析过程有效的基础。 - 分析数据(数据清洗)
分析数据是将收集的数据通过加工、整理和分析、使其转化为信息,通常用方法有: - 可视化
将数据变得一目了然
老七种工具,即排列图、因果图、分层法、调查表、散布图、直方图、控制图;
新七种工具,即关联图、系统图、矩阵图、KJ法、计划评审技术、PDPC法、矩阵数据图。
概念(定性数据和定量数据)
定性数据和定量数据的区别如下:
- 是否具有数值特征:
- 定性数据没有数值特征,不能对其数据进行数学运算。定性数据分为分类数据和顺序数据两类。
- 定类数据:如反映“职业”、“教育程度”等现象的属性特点的数据,只能用来区分事物,而不能用来表明实物之间的大小、优劣关系。
- 定序数据:如象“教育类别”这样的变量称为顺序变量,相应的观察结果就是顺序数据。说明事物有序类别的一个名称,这类变量的具体表现就是顺序数据。顺序数据的数据之间虽然可以比较大小,却无法计算相互之间的大小、高低或优劣的距离。
- 定量数据:反映“天气温度”、“月收入”等变量可以用数值表示其观察结果,而且这些数值具有明确的数值含义,不仅能分类而且能测量出来具体大小和差异。这些变量就是定量变量也称数值变量,定量变量的观察结果成为定量数据。
- 定性数据没有数值特征,不能对其数据进行数学运算。定性数据分为分类数据和顺序数据两类。
- 计量精度不同
- 定性数据只能粗略区分事物特征,无法计算比较相互间大小,计量精度不高。
- 定量数据作为统计研究的主要资料, 不仅能分类而且能测量出来具体大小和差异,其计量精度远远高于定性数据。
- 统计方法不同
- 定性数据多采用描述性统计分析方法,非参数检验等。
- 定量数据可采用描述性统计分析,也可采用推断性统计分析、参数检验或统计模型。
例:
这是一列定性数据,但是很明显,这列数据是需要计算建模的数据
转换为具有运算特征的定量数据
x['Biweekly High Rate']=x['Biweekly High Rate'].map(lambda v:v.replace("$",'')).astype(float)
思路
在读取文件时可以用导入csv包 (专门处理csv)
它会把每一条数据都包装成一个list 以便下一步操作
with open('ebola.csv','r') as a:
#按每一行读取
for i in csv.reader(a):
print(i) #每一条数据都是一个list
#读取为字典型 样式:OrderedDict([('Year', '1968'), ('Males', '1118.5')])
#可以使用 i['Year']取值
for i in csv.DictReader(a):
print(i)
在数据分析时经常遇到排序问题,最常见的就是利用时间对数据进行排序
如果要用时间作图作为x轴或者y轴 一定要使用datetime进行时间转换(原因请看下一个案例)
转换时间的方式
a='2014-09-26'
x=time.strptime(a,'%Y-%m-%d')
z=dt.datetime.strptime(a,"%Y-%m-%d").date()
y=dt.datetime.strptime(a,"%Y-%m-%d").time()
两种方法都可以排序
import time
datalist=sorted(data,key=lambda x:time.strptime(x[2],'%Y-%m-%d'),reverse=True)
print(datalist)
*使用matplotlib.pyplot绘图 (图像显示错误)
这个问题很重要显示错误和显示不出,可能都是这个问题一定要时刻注意
#y轴需要的数据
#未修改代码
#gy=[x[3] for x in Guinea]
#ny=[x[3] for x in Nigeria]
#sy=[x[3] for x in SierraLeone]
#修改代码
gy=[float(x[3]) for x in Guinea]
ny=[float(x[3]) for x in Nigeria]
sy=[float(x[3]) for x in SierraLeone]
plt.plot(gx,gy,'r-')
plt.show()
下图为修改代码之前 发现y轴的数据,并没有自动解析 一个段一个段出来
分析:
仔细看了一下学习时候的代码,发现在使用matplotlib.pyplot绘图时,x轴或者y轴的数据都是可以做递增的数据 比如 坐标x轴上有:1,2,3,4,5,6,7,8 x轴上的数就可以解析为 2 4 6 8
然而原始数据不做处理的时候,类型都是str,可能是str不能做出自动解析
数据分析必用工具 pandas
首先了解pandas的索引方式极其基本使用方法以便数据的清洗
主要有两种: .loc标签索引 .iloc位置索引 (先按标签索引进行尝试操作,再位置)
现在有一个pandas数据df
#取出第一行
df[0:1]
#利用列名
df[ ['列名1','列名2' ] ]
#最常用的位置索引方法
df.iloc[0:2,0] #取出 0-2(不包括2)行的第一列数据
pandas怎么精确的取出带有什么数据的某一行或者一列的值
ps:比如取出 索引为长郡中学的行
a.loc[a.index == '长郡中学']
ps:比如取出 索引为长郡中学或者长沙一中的行,支持运算符 &(and) |(or)
这里注意:里面是两个元组样式的,否则报错
a[ (a.index == '长郡中学') | (a.index=='长沙市第六中学')]
当然也支持这样:
a[ a['列名']==? ]
#pandas-如何得到某一个值所在的行
df[df['列名'].isin([相应的值])]
修改索引名,列名,数据合并
这一点顺便一提,很多时候不同数据整合要统一才能使用merge()合并
#使用rename()修改
a=dd.count().rename(index={'师大附中':'湖南师大附中',
'长沙市第一中学':'长沙市一中'},columns={'序号':'人数'})
还有一种方法时候修改大多数索引 set_index()
数据合并
参考sql中的inner left_inner right_inner
#参数说明:数据1 数据2 左键 右键 连接方式 默认以重合列做键
pd.merge(a,b,left_on='key1',right_on='key2',how='right')
pandas带有自动转换类型的方法
#ps:
data[''].astype(int)
#时间
pd.to_datetime(data_us['dt'])
DataFrame.plot(*args, **kwargs)
参数解读(官方)
-
kind:str
str:
‘line’:折线图(默认)
‘bar’:垂直条形图
‘barh’:水平条形图
‘hist’:直方图
‘box’:箱线图
‘kde’:内核密度估计图
‘density’:与’kde’相同
‘area’:面积图
‘pie’:饼图
‘scatter’:散点图
‘hexbin’:六边形图。 -
grid : boolean(是否显示网格)
-
fontsize int(字体大小)
-
ax(可以用来设置画布大小)
-
stacked:boolean(是否纵向显示数据)
例:
DataFrame.hist()&Series.hist()
常用参数
- bins:int
分成几块 - by:对象,可选
如果通过,则用于形成单独组的直方图。 - figsize 元组
- alpha:0-1 透明度
- color:srt 颜色
- sharex 共享(x轴设为一样的)
要创建的图形的尺寸(以英寸为单位)
例: