DATA_ANALYSE
一、数据分析概述
步骤:数据获取、探索分析和可视化、预处理理论、分析建模、模型评估
二、数据获取
-
数据获取:
(1) 数据仓库(DW)
- 汇总整理所有业务数据
- 记录所有事实
- 部分维度和数据排序(数据市场-DM)
- 数据库VS仓库:
- 数据库面向业务存储,仓库面向主题存储(主题:对分析对象数据的完整一致描述)
- 针对应用的数据库(OLTP)分析仓库(OLAP)
- 数据库组织规范。仓库可能冗余,相对变化大,数据量大
(2) 监测与抓取
- 监控:使用监控设备或算法直接获取数据,如传感器网络
- 抓取:
- 直接分析网页、接口和文件的信息
- Python常用工具:urllib urllib2 requests scrapy PhantomJS beautifulSoup Xpath(lxml)
(3) 填写、日志、埋点
- 填写:用户填写信息
- 埋点:APP或网页埋点(具体流程的信息记录点)
- 操作日志:前端日志,后端日志
(4) 计算
- 衍生数据通过现有数据计算生成
- 汇总整理所有业务数据
-
数据学习网站
(1)数据竞赛网站(Kaggle&天池)
(2)数据集网站(ImageNet/Open Images)
(3)各领域统计数据(统计局、政府机构、公司财务报告等)
import pandas as pd df = pd.read_csv("./data/HR.csv") print(df.head(10))
三、探索分析和可视化
-
探索性数据分析(单因子与对比分析)可视化
(1)理论:
- 集中趋势:平均值、中位数、分位数、众数
- 测量数据聚集位置
- 平均值:衡量常规分布连续值的集中趋势
- 中位数:衡量异常值的集中趋势
- 数量:衡量离散值的集中趋势
- 分位数:与其他几个值一起工作
- 离中趋势:标准差、方差
- 值越大,数据越离散,值越小,数据越聚集
- 数据分布:偏态和峰态,正态分布和三种分布
- 偏态系数:数据平均偏差状态的衡量是指平均偏差
- 峰态分布:测量数据分布的集中强度。值越大,分布越尖,值越小,分布越温和(正态分布的峰态系数一般为3,与正态分布的峰态系数相差2)
- 三大分布:卡方分布,t分布,f分布
- 卡方分布:几个变量都是标准正态分布(均值为0,方差为1),几个变量的平方和满足的分布就是卡方分布
- t分布:正态分布的随机变量/服从卡方分布的变量通常用于根据小样本估计正态分布的整体平均值
- f分布:由两个服从卡方分布的随机变量比组成
- 抽样理论
- 抽样误差和精度
(2)代码实现
- 集中趋势:平均值、中位数、分位数、众数
import pandas as pd import scipy.stats as ss df = pd.read_csv("./data/HR.csv") # 可以加sep作为分隔符的参数 print(df.mean()) # 均值 print(df["satisfaction_level"].mean()) print(df.median()) # 中位数 print(df["satisfaction_level"].median()) print(df.quantile(q=0.25)) # 分位数,q=0.25 表示四分位数
print(df["satisfaction_level"].quantile(q=0.25))
print(df.mode()) # 众数
print(df["satisfaction_level"].mode())
print(df.std()) # 标准差,离中趋势
print(df["satisfaction_level"].std())
print(df.var()) # 方差
print(df["satisfaction_level"].var())
print(df.sum()) # 求和,离散数据求和是直接连起来
print(df["satisfaction_level"].sum())
print(df.skew()) # 偏态系数
print(df["satisfaction_level"].skew())
print(df.kurt()) # 峰度系数,以正态分布为0作为标准
print(df["satisfaction_level"].kurt())
print(ss.norm.stats(moments="mvsk")) # 正态分布的性质,m:均值 v:方差 s:偏态系数 k:峰态系数
print(ss.norm.pdf(0.0)) # 正态分布指定横坐标返回纵坐标的值
print(ss.norm.ppf(0.9)) # 输入的值必须是0到1之间的,从负无穷累积的值
print(ss.norm.cdf(2)) # 从负无穷累积到2,累积概率是多少
print(ss.norm.cdf(2) - ss.norm.cdf(-2)) # 正态分布中-2到2的累积概率
print(ss.norm.rvs(size=10)) # 得到10个符合正态分布的数字
print(ss.chi2) # 卡方分布
print(ss.t) # t分布
print(ss.f) # f 分布
print(df.sample(n=10)) # 抽样,抽n个
print(df["satisfaction_level"].sample(10))
print(df.sample(frac=0.001)) # 抽样,frac参数指定百分比
-
数据分类
(1)定类(类别):根据事物离散、无差别属性进行分类(男,女)
(2)定序(顺序):可以界定数据的大小,但不能测定差值。数据间有差距但不能测定差距的大小(收入低,中,高)
(3)定距(间隔):可以界定数据大小的同时,可测定差值,但无绝对零点。乘法除法和比率没有意义(摄氏度)
(4)定比(比率):可以界定数据的大小,可测定差值,有绝对零点(身高,体重)
-
单属性分析
(1)异常值分析:离散异常值,连续异常值,常识异常值
- 连续异常值处理:直接舍弃,也可以直接取边界值来代替异常值
- 离散异常值处理(离散属性定义范围外的所有值):直接舍弃,可以把所有异常值当成单独的值来处理
- 常识异常值(在限定知识与常识范围外的所有值)
(2)对比分析:绝对数与相对数,时间,空间,理论维度比较
- 比什么
- 绝对数比较(收入,身高,评分)
- 相对数比较:几个有联系的指标进行联合构成新的数
- 结构相对数(产品合格率,考试通过率):部分与整体进行相比
- 比例相对数(三大产业的比例):总体内用不同部分的数值进行比较
- 比较相对数(不同时机下同一商品的价格,不同电商互联网公司的待遇水平):同一时空下相似或同质的指标进行对比
- 动态相对数(速度,用户数量的增数):有时间概念
- 强度相对数(人均GDP,密度):性质不同,带有相互联系的属性进行联合
- 怎么比
- 时间维度:同比(和去年同期进行比较),环比(和今年之前进行比较)
- 空间维度:方位空间(城市,国家),逻辑空间(不同部门)
- 经验与计划维度:工作进度与计划排期进行比较
(3)结构分析:各组成部分的分布与规律
- 静态结构分析:直接分析总体的组成(产业结构)
- 动态结构分析:以时间为轴,分析结构变化的趋势(十一五期间三大产业的占比)
(4)分布分析:数据分布频率的显式分析
- 直接获得概率分布
- 是不是正态分布
- 极大似然:相似程度的衡量
import pandas as pd
import numpy as np
df = pd.read_csv("./data/HR.csv")
#### satisfaction_level的分析 ####
sl_s = df["satisfaction_level"]
print(sl_s.isnull()) # 判断是否为空
print(sl_s[sl_s.isnull()]) # 寻找异常值
print(df[df["satisfaction_level"].isnull()]) # 显示存在异常的数据
sl_s = sl_s.dropna() # 丢弃异常值
# sl_s = sl_s.fillna() # 填充异常值
print(sl_s.mean()) # 均值
print(sl_s.std()) # 标准差
print(sl_s.max()) # 最大值
print(sl_s.min()) # 最小值
print(sl_s.median()) # 中位数
print(sl_s.quantile(q=0.25)) # 下四分位数
print(sl_s.quantile(q=0.75)) # 上四分位数
print(sl_s.skew()) # 偏态系数
print(sl_s.kurt()) # 峰态系数
print(np.histogram(sl_s.values, bins=np.arange(0.0, 1.1, 0.1))) # 第一个参数:要切分的值,第二个参数:切分的临界值,np.arrange(开始值,结束值,间隔)
#### last_evaluation的分析 ####
le_s = df["last_evaluation"]
print(le_s[le_s.isnull()]) # 找出空值
print(le_s.mean()) # 均值
print(le_s.std()) # 标准差
print(le_s.median()) # 中位数
print(le_s.max()) # 最大值
print(le_s.min()) # 最小值
print(le_s.skew()) # 偏态系数
print(le_s.kurt()) # 峰态系数
# 异常值:四分位间距: 上四分位数 - 下四分位数 上界:上四位数 + 1.5~3 * 四分位间距 下界:下四位数 - 1.5~3 * 四分位间距 上下界之间为正常值,上下界以外的为异常值
print(le_s[le_s > 1]) # 均值出现异常,且偏态系数和峰态系数过大,寻找异常值
le_s = 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_low # 四分位间距
k = 1.5
le_s = le_s[le_s < q_high + k * q_interval][le_s > q_low - k * q_interval] # 去掉异常值
print(np.histogram(le_s.values, bins=np.arange(0, 1.1, 0.1))) # 统计不同取值区间内的数有多少个
print(le_s.mean()) # 平均值
print(le_s.std()) # 标准差
print(le_s.median()) # 中位数
print(le_s.max()) # 最大值
print(le_s.skew()) # 偏度系数
print(le_s.kurt()) # 峰度系数
#### number_project的分析 ####
np_s = df["number_project"]
print(np_s[np_s.isnull()]) # 寻找空值
print(np_s.mean()) # 均值
print(np_s.std()) # 标准差
print(np_s.median()) # 中位数
print(np_s.max()) # 最大值
print(np_s.min()) # 最小值
print(np_s.skew()) # 偏态系数
print(np_s.kurt()) # 峰态系数
print(np_s.value_counts()) # 计算不同的值出现了多少次
print(np_s.value_counts(normalize=True)) # 计算不同的值出现的比例
print(np_s.value_counts(normalize=True).sort_index()) # 根据数据的index进行排序
#### average_montly_hours的分析 ####
amh_s = df["average_monthly_hours"]
print(amh_s.mean()) # 平均值
print(amh_s.std()) # 标准差
print(amh_s.max()) # 最大值
print(amh_s.min()) # 最小值
print(amh_s.skew()) # 偏态系数
print(amh_s.kurt()) # 峰态系数
q_low = amh_s.quantile(q=0.25) # 下四分位数
q_high = amh_s.quantile(q=0.75) # 上四分位数
q_interval = q_high - q_low # 四分位间距
k = 1.5
amh_s = amh_s[amh_s < q_high + k * q_interval][amh_s > q_low - k * q_interval] # 去除异常值
print(len(amh_s))
print(np.histogram(amh_s.values, bins=10)) # bins=数字 表示直接分成几分
print(np.histogram(amh_s.values, bins=np.arange(amh_s.min(), amh_s.max() + 10, 10))) # 左闭右开区间
print(amh_s.value_counts(bins=np.arange(amh_s.min(), amh_s.max() + 10, 10))) # 左开右闭区间
#### time_spend_company的分析 ####
tsc_s = df["time_spend_company"]
print(tsc_s.value_counts().sort_index()) # 按照数据的index排序
print(tsc_s.mean()) # 平均值
#### Work_accident的分析 ####
wa_s = df["Work_accident"]
print(wa_s.value_counts())
print(wa_s.mean()) # 事故率和均值相同
#### left的分析 ####
l_s = df["left"]
print(l_s.value_counts())
#### promotion_last_5years的分析 ####
pl5_s = df["promotion_last_5years"]
print(pl5_s.value_counts()) # 查看数据的分布
#### salary的分析 ####
s_s = df["salary"]
print(s_s.value_counts())
print(s_s.where(s_s!="nme")) # 寻找异常值,s_s.where(s_s!="nme")将 nme 取成空
s_s.where(s_s!="nme").dropna() # 去掉异常值
#### department的分析 ####
d_s = df["department"]
print(d_s.value_counts(normalize=True)) # 计算不同数据出现的概率
d_s = d_s.where(d_s != "sale") # 此时sale处的数据变成了空
d_s.dropna() # 去掉异常值
import pandas as pd
import numpy as np
df = pd.read_csv("./data/HR.csv")
sl_s = df["satisfaction_level"]
le_s = df["last_evaluation"]
np_s = df["number_project"]
amh_s = df["average_monthly_hours"]
tsc_s = df["time_spend_company"]
wa_s = df["Work_accident"]
l_s = df["left"]
pl5_s = df["promotion_last_5years"]
s_s = df["salary"]
d_s = df["department"]
#### 去除异常值
df = df.dropna(axis=0, how="any") # 去除空值,axis指定坐标轴,0为横坐标,1为纵坐标,how="all"这一行全是空值时才去掉 how="any"这一行有一个空值就去掉
df = df[le_s <= 1][s_s != "nme"][d_s != "sale"] # 去除异常值
#### 对比分析
print(df.groupby("department").mean()) # 根据部门进行分组,并取均值
print(df.loc[:, ["last_evaluation", "department"]].groupby("department").mean()) # 切片后分组并取均值
print(df.loc[:, ["average_monthly_hours", "department"]].groupby("department")["average_monthly_hours"].apply(lambda x:x.max() - x.min())) # 切片后分组,并计算极差
-
可视化
(1)柱状图
import pandas as pd import numpy as np import seaborn as sns import matplotlib.pyplot as plt sns.set_style(style="darkgrid") sns.set_context(context="paper") sns.set_palette("Reds") df = pd.read_csv("./data/HR.csv") #### seaborn绘制 #### sns.countplot(x="salary", hue="department", data=df) # hue:进行多层绘制,以department为分割,又进行了一次绘制 plt.show() #### matplotlib绘制 #### plt.title("SALARY") # 标题 plt.xlabel("salary") # 横轴名称 plt.ylabel("number") # 纵轴名称 plt.xticks(np.arange(len(df["salary"].value_counts()))+0.5, df["salary"].value_counts().index) # 在横轴做标记 plt.axis([0, 4, 0, 10000]) # axis([横轴最小值, 横轴最大值, 纵轴最小值, 纵轴最大值]) # 显示设置 plt.bar(np.arange(len(df["salary"].value_counts()))+0.5, df["salary"].value_counts(), width=0.5) # +0.5是为了在正中间显示, width设置柱子的宽度 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.text(横坐标, 纵坐标, 添加文本, 水平位置, 垂直位置) plt.show()
(2)直方图
import pandas as pd import numpy as np import seaborn as sns import matplotlib.pyplot as plt sns.set_style(style="darkgrid") sns.set_context(context="paper") sns.set_palette("Reds") df = pd.read_csv("./data/HR.csv") f = plt.figure() f.add_subplot(1, 3, 1) sns.distplot(df["satisfaction_level"], bins 标签:
bca73sl072传感器