当前位置:   article > 正文

数据分析学习1——数据获取,单因子探索分析与可视化_数据的获取,数据的处理,数据的分析

数据的获取,数据的处理,数据的分析

数据分析学习

数据分析含义:数据分析就是在数据中利用统计分析方法提取有用的信息并且进行总结和概况的过程。
在这里插入图片描述

一、数据获取

数据获取的手段:数据仓库,监测与抓取,填写、日志、埋点,计算。

1、数据获取手段——数据仓库

数据仓库含义:将所有业务数据经汇总处理,构成数据仓库( DW )(包括全部事实的记录、部分维度与数据的整理(数据集市-DM ))
数据库VS仓库
数据库面向业务存储(面向业务需要保证高并发,快速读写,数据精简等,主要是为用户提供最为优质的体验),仓库面向主题存储(主题:较高层次上对分析对象数据的一个完整并且一致的描述)
数据库针对应用( OLTP) ,仓库针对分析( OLAP )
数据库组织规范,仓库可能冗余,相对变化大,数据量大

2、数据获取手段——监测与抓取

直接解析网页、接口、文件的信息
Python常用工具∶抓取数据(urllib、urllib2、requests、scrapy),解析数据(beautifulSoup、Xpath /lxml),渲染工具(PhantomJS)

3、数据获取手段——填写、埋点、日志

用户填写信息;APP或网页埋点(特定流程的信息记录点);操作日志
说明:(1)埋点:在app或应用服务中针对特定的流程收集一定的信息用来跟踪App或网页服务被使用的情况,以便后续用来进一步优化产品或进行运营支持。比较常见的记录项包括访问、访客、停留时间、页面查看和跳出率。这样的信息收集大致可以分为两种,第一种是页面统计,第二种就是统计它的操作行为。
对于一个互联网公司,埋点是一个非常重要的数据来源,他直接记录了用户与互联网产品之间的交互过程,几乎可以复现用户使用互联网产品的过程。埋点可以自己开发,也可以用一些第三方插件。
(2)日志:日志和数据仓库具有相同的作用,只不过日志更加精简,可以在出故障的时候帮我们定位问题。日志是以文件形式记录的但一般为了分析,日志也是需要汇总到数据仓库中,然后进行统一分析。日志也有前端日志和后端日志,前端日志就是你的网页或者app里的日志,前端日志是需要传输到后端才能被记录的,后端日志就是服务器的日志,可以直接进行处理。

4、数据获取手段——计算

通过已有的数据计算生成衍生数据。例:统计报表某些项目

数据学习网站推荐:

数据竞赛网站(Kaggle&天池)
数据集网站(ImageNet/Open Images)
各领域统计数据(统计局、政府机构、公司财报等)

二、单因子探索分析

1、理论铺垫

案例数据介绍:satisfaction_level、work_accident、last_evaluation、left、number_project、promotion_last_5years、average_montly_hours、department、salary、time_spend_company
(数据是从kaggle下载的,直接搜索HR就可以找到)

import pandas as pd
#读取案例数据
df = pd.read_csv("D:/HR.csv")
df.head(10)
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述

type(df) 
#结果pandas.core.frame.DataFrame
type(df["satisfaction_level"])
#结果pandas.core.series.Series
  • 1
  • 2
  • 3
  • 4

(1)集中趋势:均值、中位数与分位数、众数
四分位数计算方法:Q1的位置=(n+1)*0.25;Q2的位置=(n+1)0.5;Q3的位置=(n+1) 0.75
说明:这里的n指的是数据的个数。分位数就是把数据从小到大排列,然后切割成等份的数据点,分位数中最常用的是四分位数 。

df.mean()#均值
type(df.mean()) #结果pandas.core.series.Series
df["satisfaction_level"].mean()
df.median()#中位数
df["satisfaction_level"].median() #0.64
df.quantile(q=0.25)#四分位数,q决定几分位
df["satisfaction_level"].quantile(q=0.25) #0.44
df.mode() #众数
df["satisfaction_level"].mode() #连续型的众数
df["Department"].mode() #离散型的众数
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

(2)离中趋势:标准差、方差
在这里插入图片描述
说明:数据越大越离散,越小越集中。

df.std() #标准差
df["satisfaction_level"].std() 
df.var() # 方差
df["satisfaction_level"].var() 
  • 1
  • 2
  • 3
  • 4

(3)数据分布:偏态与峰态、正态分布与三大分布
在这里插入图片描述
说明:偏态:数据平均值偏离状态的衡量。通常一个对称数据,中位数和均值都是相差不多的还有可能相同,而对于一些非对称数据,他的中位数和均值就会有所偏差,这就是偏态。 S为正,那就是正偏,表示它的均值大;S负,负偏,表示它的均值小。
峰态系数:数据分布集中强度的衡量。值越大,峰态系数的顶越尖。
一般来说正态分布的峰态系数为3。若某个分布的K与正态分布的K相差大于2,那么一般可以认为这个分布不是正态分布。

df.skew() #偏态系数
df["satisfaction_level"].skew() 
df.kurt() #峰态系数
df["satisfaction_level"].kurt()
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述

import scipy.stats as ss
ss.norm  #生成正态分布
ss.norm.stats(moments = "mvsk")  
#m 均值 v 方差 s 偏态系数 k 峰态系数

ss.norm.pdf(0.0)
#pdf()函数,指定横坐标返回纵坐标的值
ss.norm.ppf(0.9)
#ppf()输入值必须是0~1之间的,他是一个累计值
#从负无穷大一直到1.28..之间的累计值是0.9
ss.norm.cdf(2)
#cdf()表示从负无穷积到2它的累计概率是多少
ss.norm.cdf(2)-ss.norm.cdf(-2)
#从2倍的标准差到-2倍的标准差的累计概率

ss.norm.rvs(size = 10)
#十个符合正态分布的数字

#三大分布
#三大分布的函数调用都和正态分布调用的类似
ss.chi2 
ss.t #t分布 
ss.f #f分布
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

(4)抽样理论:抽样误差、抽样精度
在这里插入图片描述
N:总体抽样的数量 n:抽样的数量
说明:抽样分为重复抽样和不重复抽样(抽出之后不放回),抽样的方式也有许多种,比如完全随机的抽样,或者是等差距的抽样(根据某个属性从低到高进行排列然后等差距的进行抽样),还有一种方法叫分类的分层抽样(根据各个类别的比例进行抽样,保证抽样在这个类别下的分布与总体是一致的)。是抽样就会有误差,重复抽样和不重复抽样的误差也是不一样的。

df.sample(n = 10) #抽样,抽十个
df.sample(frac = 0.001) #抽百分比0.001(15条)
df["satisfaction_level"].sample(frac = 0.001)
  • 1
  • 2
  • 3

2、数据分类

定类(类别):根据事物离散、无差别属性进行的分类。例:性别、姓名。
定序(顺序):可以界定数据的大小,但不能测定差值,只能在形式上表示一下。例如:收入的低,中,高。
定距(间隔):可以界定数据大小的同时,可测定差值,但无绝对零点。没有绝对零点的意思就是它的乘除比率都是毫无意义的。例:不能说摄氏20度是摄氏10度的两倍。
定比(比率):可以界定数据大小,可测定差值,有绝对零点。例如:身高、体重等。

3、单属性分析

(1)异常值分析:离散异常值,连续异常值,常识异常值
连续异常值:在K取1.5时,若是临近上下界边界的话,就是中等异常k取3时,若是临近上下界边界的话,就是非常异常。例如:有些人特别有钱,就会超过边界,计算可以忽略获取取边界值。
在这里插入图片描述
离散异常值:离散属性定义范围外的所有值均为异常值。例如:收入离散化后只有中高低三类,其余都是异常值,可以直接将异常值舍弃或者说将它们全部归为一类。
知识异常值:在限定知识与常识范围外的所有值均为异常值。例如:一个人升高十米,超过常人认知。

import numpy as np

#对于一个数据型类型的属性来说,null就是异常值
sl_s = df["satisfaction_level"]
#isnull()有空值则返回TRUE
sl_s.isnull()

#如果有空值则返回TRUE,这里的运算结果表示没有空值
sl_s[sl_s.isnull()]  #方法一
df[df["satisfaction_level"].isnull()]  #方法二

sl_s=sl_s.dropna() #丢弃异常值
sl_s=sl_s.fillna() #填充异常值

np.histogram(sl_s.values,bins=np.arange(0.0,1.1,0.1))
#np.histogram()可以大概得到这串数据的分布
#bins表示区分的临界值,参数0.1是分隔点
#0-0.1之间的数有196个,0.1-0.2有1214个,以此类推
#大致看这个数后面都比前面大。类似负偏

np.histogram(sl_s.values,bins=10)
#bins还可以直接等于一个数字,表示将这串数据分成几份

np.histogram(sl_s.values,bins=np.arange(sl_s.min(),sl_s.max()+0.1,0.1))
#sl_s.max()+0.1表示多取一个间隔也就是0.1,不然的话可能取不到最大值

sl_s.value_counts(bins=np.arange(sl_s.min(),sl_s.max()+0.1,0.1))
#value_counts中的bin是左开右闭
#histogram中的bin是左闭右开

np.histogram(sl_s.values,bins=np.arange(0.0,1.1,0.2))
#间隔为0.2
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
le_s = df["last_evaluation"]
le_s[le_s.isnull()]

#le_s一般都小于等于1,这里查看是否有大于1的值
le_s[le_s>1] 

#剔除异常值的方法
q_low = le_s.quantile(q=0.25) #下四分位数
q_high = le_s.quantile(q=0.75) #下四分位数
q_interval = q_high - q_high  
k = 1.5
le_s = le_s[le_s < q_high + k * q_interval][le_s > q_low - k * q_interval]
#上下界之间的为正常值,其余为异常值

np.histogram(le_s.values,bins=np.arange(0.0,1.1,0.1))

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
#一般数据中都是整数,可以通过函数value_counts()进行整数出现次数的计算
left=df["left"]
left.value_counts()

salary=df["salary"]
salary.value_counts()

#假设出现salary数据中出现一个名为nme的异常值的处理方法
salary.where(salary != "nme").dropna()
#where(salary != "nme")表示nme异常值处的数据会变成null
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

(2)对比分析:绝对数与相对数,时间、空间、理论维度比较
绝对数比较就是比较数字,比如身高,评分之类的。
相对数是指将几个有联系的指标构建成为一个新的数。联合的方式有很多,所以相对数的方式也有很多。
常用的联合方式有:结构相对数(部分与整体相比,例如用考试通过率评价学生整体水平)、比例相对数(总体内用部分不同的数值进行比较,例如不同产业间比例的比较)、比较相对数(同一时空下的相似或者同质的指标进行对比,例如不同时期下同样商品的价格)、动态相对数(一般有时间概念在里面,比如物理上速度,用户数量的增速)、强度相对数(性质不同但又相互联系的属性进行联合,比如我们的GDP占第二但是人均GDP只占好几十)
怎么比?——时间、空间、理论维度比较
时间维度:过去和现在比,现在和之前比等等。
例如:同比指和去年同期比较,环比指的是和上个月进行比较。
空间维度:现实方位上的空间(如不同城市,不同国家,不同方位等)、逻辑上空间(如同一个公司的不同部门、不同公间进行比较)
经验与计划:如历史上失业率达到多少就可能会引发暴乱,我们将自己国家的失业率与之相比就是经验方面的比较。我们做工作的排期与实施工作的计划进行比较就是计划上的比较。

d_s = df["Department"]
d_s.value_counts(normalize=True)
##数字出现次数在总次数中的比例

#对比分析
#1.异常值处理
df=df.dropna(axis = 0,how = "any")
#axis=0表示以行为单位进行删除,属性依旧留着
#how = "any"表示这一行有一个数据是null就删除
#how = "all"表示这一行所有数据全都是null时才删除
df = df[df["last_evaluation"] <= 1][df["salary] != "nme"]
#可以同时删除异常值,格式如上

#2.对比分析
#以部门为单位进行一次简单的对比
#先对部门进行分组,这次以mean作为聚合方法
df.groupby("Department").mean()

#对不同属性列也可以进行对比分析
df.loc[:,["last_evaluation","Department"]].groupby("Department").mean()

#自己定义函数进行对比,这里对比的是极差
df.loc[:,["average_montly_hours","Department"]].groupby("Department")["average_montly_hours"].apply(lambda x:x.max() - x.min())
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

(3)结构分析:各组成部分的分布与规律。类似比例相对数比较。
结构分析分为静态结构分析(直接分析总体的组成),动态结构分析(以时间为轴分析结构变化的趋势,例第一个五年计划和第二个五年计划的各个产业占比)。

np_s = df["number_project"]
np_s.max() #7
np_s.min() #2
np_s.kurt() #峰度

#对于整数类的数值求峰度还可以之间计算数据出现的次数
np_s.value_counts()

np_s.value_counts(normalize=True)
#求各个数字出现次数在总次数中的比例

np_s.value_counts(normalize=True).sort_index()
#将index(各个数字)进行排序
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

(4)分布分析:数据分布频率的显式分析
直接获得概率分布:得到的一些数直接进行排列或者其他方式进行概率分布。
判断一个分布是不是正态分布:利用偏态系数或者峰态系数,或者利用假设检验的方法(下一章)
极大似然:极大相似的样子即相似程度的衡量。
给出一串数据,如果它们属于是正态分布,那么一定存在一个均值一个方差,在该均值和方差下,这串数据的这几个点在这个分布的取值也就是概率,它们的和或者积是最大的。它们的和或者积(取对数)即为极大似然。

三、单因子探索分析可视化

python可视化工具: matplotlib、seaborn、plotly

#可视化分析——利用matplotlib
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

df = pd.read_csv("D:/HR.csv")

plt.title("SALARY")
plt.xlabel("salary")
plt.ylabel("Number")
#对x轴做标注,+0.5是为了平移使得图像更明确
plt.xticks(np.arange(len(df["salary"].value_counts()))+0.5,df["salary"].value_counts().index)

#设置显示范围
#x轴是0~4,y轴是0~10000
plt.axis([0,4,0,10000])

#arange()主要是用于生成数组
#numpy.arange(start, stop, step, dtype = None)
#在给定间隔内返回均匀间隔的值
#值在半开区间 [开始,停止)内生成,返回的是 ndarray
#长度len(df["salary"].value_counts())),高度df["salary"].value_counts()
#+0.5是为了平移,宽度width=0.5
plt.bar(np.arange(len(df["salary"].value_counts()))+0.5,df["salary"].value_counts(),width=0.5)

#将总数字标注在图表上
#用text()函数,对x,y中对y轴进行标注(x,y,y),水平选center,垂直选bottom
for x,y in zip(np.arange(len(df["salary"].value_counts()))+0.5,df["salary"].value_counts()):
        plt.text(x,y,y,ha="center",va="bottom")

plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

VpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM0NjIzNDgw,size_16,color_FFFFFF,t_70)

#可视化分析——利用seaborn 
import seaborn as sns
import numpy as np
import pandas as pd

df = pd.read_csv("D:/HR.csv")

#用sns更改样式(whitegrid,darkgrid,dark,white,ticks)
sns.set_style(style="whitegrid")
#更改字体(paper,notebook,talk,poster)、字号
sns.set_context(context="poster",font_scale=0.8)
#设置颜色(matplotlib colormap、seaborn color palette、hls、husl)
#sns.set_palette("summer") #matplotlib colormap
sns.set_palette([sns.color_palette("RdBu",n_colors=7)[5]]) 
#seaborn color palette 是个数组

#绘图
#countplot可以帮助我们多层绘制,利用Hue
#hue="Department"表示按部门再分类画图
sns.countplot(x="salary",hue="Department",data=df)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

在这里插入图片描述

#可视化分析——绘制直方图、分布图
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

df = pd.read_csv("D:/HR.csv")

#用sns更改样式(whitegrid,darkgrid,dark,white,ticks)
sns.set_style(style="whitegrid")
#更改字体(paper,notebook,talk,poster)、字号
sns.set_context(context="poster",font_scale=0.8)
#设置颜色(matplotlib colormap、seaborn color palette、hls、husl)
#sns.set_palette("summer") #matplotlib colormap
sns.set_palette([sns.color_palette("RdBu",n_colors=7)[0]]) 
#seaborn color palette 是个数组

#绘制直方图
f = plt.figure()
#加一个子图,一行三列第一个
f.add_subplot(1,3,1)
#kde=False表示不产生分布图
#hist=False表示不产生直方图
sns.distplot(df["satisfaction_level"],bins=10,kde=True,hist=True)

#加一个子图,一行三列第二个
f.add_subplot(1,3,2)
sns.distplot(df["last_evaluation"],bins=10)

#加一个子图,一行三列第三个
f.add_subplot(1,3,3)
sns.distplot(df["average_montly_hours"],bins=10)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

在这里插入图片描述

#可视化分析——绘制箱线图
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

df = pd.read_csv("D:/HR.csv")

#用sns更改样式(whitegrid,darkgrid,dark,white,ticks)
sns.set_style(style="whitegrid")
#更改字体(paper,notebook,talk,poster)、字号
sns.set_context(context="poster",font_scale=0.8)
#设置颜色(matplotlib colormap、seaborn color palette、hls、husl)
#sns.set_palette("summer") #matplotlib colormap
sns.set_palette([sns.color_palette("RdBu",n_colors=7)[0]]) 
#seaborn color palette 是个数组

#绘制箱线图
#可以非常直观的让我们了解到异常值和正常值之间的区间范围
#黑线表示上下界
#saturation参数表示方框的边界,saturation=0.75表示四分位数
#whis参数表示k,即多久到达上下界
sns.boxplot(x=df["time_spend_company"],saturation=0.75,whis = 3)
plt.show()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

在这里插入图片描述

#可视化分析——绘制折线图法一
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

df = pd.read_csv("D:/HR.csv")

#用sns更改样式(whitegrid,darkgrid,dark,white,ticks)
sns.set_style(style="whitegrid")
#更改字体(paper,notebook,talk,poster)、字号
sns.set_context(context="poster",font_scale=0.8)
#设置颜色(matplotlib colormap、seaborn color palette、hls、husl)
#sns.set_palette("summer") #matplotlib colormap
sns.set_palette([sns.color_palette("RdBu",n_colors=7)[0]]) 
#seaborn color palette 是个数组

#绘制折线图
sub_df = df.groupby("time_spend_company").mean()
#横轴sub_df.index,纵轴sub_df["left"]
sns.pointplot(sub_df.index,sub_df["left"])
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

在这里插入图片描述

#可视化分析——绘制折线图法二
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

df = pd.read_csv("D:/HR.csv")

#用sns更改样式(whitegrid,darkgrid,dark,white,ticks)
sns.set_style(style="whitegrid")
#更改字体(paper,notebook,talk,poster)、字号
sns.set_context(context="poster",font_scale=0.8)
#设置颜色(matplotlib colormap、seaborn color palette、hls、husl)
#sns.set_palette("summer") #matplotlib colormap
sns.set_palette([sns.color_palette("RdBu",n_colors=7)[0]]) 
#seaborn color palette 是个数组

#绘制折线图
sns.pointplot(x="time_spend_company",y="left",data=df)
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

在这里插入图片描述

#可视化分析——利用matplotlib绘制饼图
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

df = pd.read_csv("D:/HR.csv")

#利用matplotlib绘制饼图
#添加标签、数字autopct="%1.1f%%"
lbs=df["Department"].value_counts().index

#着重强调sales,并将其分割开
explodes=[0.1 if i=="sales" else 0 for i in lbs]

plt.pie(df["Department"].value_counts(normalize=True),explode=explodes,labels=lbs,autopct="%1.1f%%",colors=sns.color_palette("Reds"))
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/396589
推荐阅读
相关标签
  

闽ICP备14008679号