数据分析L1
数据分析的三个重要组成部分
- 数据采集
- 数据挖掘
- 数据可视化

数据采集

数据挖掘

数据可视化

数据挖掘
基本流程
- 商业理解:从商业的角度理解项目需求,在这个基础上,再对数据挖掘的目标进行定义。
- 数据理解:尝试收集部分数据,然后对数据进行探索,包括数据描述、数据质量验证等。对收集的数据有个初步的认知。
- 数据准备:开始收集数据,并对数据进行清洗、数据集成等操作,完成数据挖掘前的准备工作。
- 模型建立:选择和应用各种数据挖掘模型,并进行优化,以便得到更好的分类结果。
- 模型评估:对模型进行评价,并检查构建模型的每个步骤,确认模型是否实现了预定的商业目标。
- 上线发布:呈现的形式可以是一份报告,也可以是实现一个比较复杂的、可重复的数据挖掘过程

Numpy
为什么要使用numpy的数据结构,而不是用Python自带的list
- list的元素在系统内存中是分散存储的,Numpy数组存储在一个均匀连续的内存块中,遍历可以节省计算资源
- 内存访问模式中,数据连续的存储在内存中,Numpy直接利用现在CPU的矢量化指令计算,加载寄存器中的多个连续浮点数
- Numpy的矩阵计算可以采用多线程的方式,提升计算效率
一个重要提升内存和计算资源的利用率的规则
- 避免采用隐式拷贝,而是采用就地操作的方式
自己创造类型
1 | import numpy as np |

Pandas
Series和DataFrame
- 分别代表着一维的序列和二维的表结构
Series
- Series 是个定长的字典序列。说是定长是因为在存储的时候,相当于两个 ndarray
- Series有两个基本属性:index 和 values。
- 在 Series 结构中,index 默认是 0,1,2,……递增的整数序列,当然我们也可以自己来指定索引
1 | import pandas as pd |
DataFrame
- 包括了行索引和列索引,我们可以将 DataFrame 看成是由相同索引的 Series 组成的字典类型。
1 | import pandas as pd |
数据清洗
删除 DataFrame 中的不必要的列或行
- ```python df.drop(columns=[]) df.drop(index=[])
1
2
3
4
5
- **重命名列名 columns,让列表名更容易识别**
- ```python
df2.rename(columns={origin:change})
- ```python df.drop(columns=[]) df.drop(index=[])
去重复的值
- ```python df.drop_duplicates()
1
2
3
4
5
- **格式问题**
- ```python
df.column.astype(type)
- ```python df.drop_duplicates()
数据间的空格
```python # 删除左右两边空格 df2['Chinese']=df2['Chinese'].map(str.strip) # 删除左边空格 df2['Chinese']=df2['Chinese'].map(str.lstrip) # 删除右边空格 df2['Chinese']=df2['Chinese'].map(str.rstrip)
去除$
df2['Chinese']=df2['Chinese'].str.strip('$')
大小写转换
全部大写
df2.columns = df2.columns.str.upper() # 全部小写 df2.columns = df2.columns.str.lower() # 首字母大写 df2.columns = df2.columns.str.title()
1
2
3
4
5
6
7
8
9
10
- **查找空值**
- ```python
df.isnull()
# 知道哪列存在空值
df.isnull().any()
# 寻找非空值
df.notnull()
使用apply函数对数据进行清洗
```python df['name'] = df['name'].apply(str.upper)
def double_df(x): return 2*x df1[u'语文'] = df1[u'语文'].apply(double_df)
def plus(df,n,m): df['new1'] = (df[u'语文']+df[u'英语']) * m df['new2'] = (df[u'语文']+df[u'英语']) * n return df df1 = df1.apply(plus,axis=1,args=(2,3,))
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240

### 数据分析的一些概念
- 商业智能 BI、数据仓库 DW、数据挖掘 DM
- 元数据 VS 数据元
- **元数据**(MetaData):描述其它数据的数据,也称为“中介数据”。
- **数据元**(Data Element):就是最小数据单元。

#### 数据预处理
1. 数据清洗
- 主要是为了去除重复数据,去噪声(即干扰数据)以及填充缺失值。
2. 数据集成
- 是将多个数据源中的数据存放在一个统一的数据存储中。
3. 数据变换
- 就是将数据转换成适合数据挖掘的形式
### 用户画像:标签化

#### 设计唯一标签
- **用户唯一标识是整个用户画像的核心**。
- 设计唯一标识可以从这些项中选择:用户名、注册手机号、联系人手机号、邮箱、设备号、CookieID 等。
#### 给用户打标签
**用户消费行为分析**
1. 用户标签:它包括了性别、年龄、地域、收入、学历、职业等。这些包括了用户的基础属性。
2. 消费标签:消费习惯、购买意向、是否对促销敏感。这些统计分析用户的消费习惯。
3. 行为标签:时间段、频次、时长、访问路径。这些是通过分析用户行为,来得到他们使用 App 的习惯。
4. 内容分析:对用户平时浏览的内容,尤其是停留时间长、浏览次数多的内容进行分析,分析出用户对哪些内容感兴趣,比如,金融、娱乐、教育、体育、时尚、科技等
#### 用户生命周期
1. 获客:如何进行拉新,通过更精准的营销获取客户。
2. 粘客:个性化推荐,搜索排序,场景运营等。
3. 留客:流失率预测,分析关键节点降低流失率。

### 数据采集
#### 数据源

开放数据源

#### 爬虫抓取
- 使用 Python 编写爬虫代码
- **[火车采集器](http://www.locoy.com/)**
- **[八爪鱼](http://www.bazhuayu.com/)**
- 可云采集
- **[集搜客](http://www.gooseeker.com/)**
#### 日志采集
1. 通过 Web 服务器采集,例如 httpd、Nginx、Tomcat 都自带日志记录功能。同时很多互联网企业都有自己的海量数据采集工具,多用于系统日志采集,如 Hadoop 的 Chukwa、Cloudera 的 Flume、Facebook 的 Scribe 等,这些工具均采用分布式架构,能够满足每秒数百 MB 的日志数据采集和传输需求。
2. 自定义采集用户行为,例如用 JavaScript 代码监听用户的行为、AJAX 异步请求后台记录日志等。4
##### 埋点
- 埋点是日志采集的关键步骤
- **埋点就是在有需要的位置采集相应的信息,进行上报**
- 埋点就是在你需要统计数据的地方植入统计代码,当然植入代码可以自己写,也可以使用第三方统计工具
### 数据清洗
#### 4个关键点:完全合一
1. **完**整性:单条数据是否存在空值,统计的字段是否完善。
2. **全**面性:观察某一列的全部数值,比如在 Excel 表中,我们选中一列,可以看到该列的平均值、最大值、最小值。我们可以通过常识来判断该列是否有问题,比如:数据定义、单位标识、数值本身。
3. **合**法性:数据的类型、内容、大小的合法性。比如数据中存在非 ASCII 字符,性别存在了未知,年龄超过了 150 岁等。
4. 唯**一**性:数据是否存在重复记录,因为数据通常来自不同渠道的汇总,重复的情况是常见的。行数据、列数据都需要是唯一的,比如一个人不能重复记录多次,且一个人的体重也不能在列指标中重复记录多次。
### 数据集成
#### 两种架构:ELT和ETL
1. ETL
- 提取 (Extract)——转换 (Transform)——加载 (Load)
- 在数据源抽取后首先进行转换,然后将转换的结果写入目的地。
2. ELT
- 提取 (Extract)——加载 (Load)——变换 (Transform)
- 在抽取后将结果先写入目的地,然后利用数据库的聚合分析能力或者外部计算框架

- ELT 和 ETL 相比,最大的区别是“重抽取和加载,轻转换”,从而可以用更轻量的方案搭建起一个数据集成平台
- ELT 架构中,数据变换这个过程根据后续使用的情况,需要在 SQL 中进行,好处是你可以从数据源中提取数据,经过少量预处理后进行加载
### 数据变换

数据变换是数据准备的重要环节,它**通过数据平滑、数据聚集、数据概化和规范化等方式**将数据转换成适用于数据挖掘的形式。
#### 常见的变换方式
1. **数据平滑**:去除数据中的噪声,将连续数据离散化。这里可以采用分箱、聚类和回归的方式进行数据平滑,我会在后面给你讲解聚类和回归这两个算法;
2. **数据聚集**:对数据进行汇总,在 SQL 中有一些聚集函数可以供我们操作,比如 Max() 反馈某个字段的数值最大值,Sum() 返回某个字段的数值总和;
3. **数据概化**:将数据由较低的概念抽象成为较高的概念,减少数据复杂度,即用更高的概念替代更低的概念。比如说上海、杭州、深圳、北京可以概化为中国。
4. **数据规范化**:使属性数据按比例缩放,这样就将原来的数值映射到一个新的特定区域中。常用的方法有最小—最大规范化、Z—score 规范化、按小数定标规范化等
5. **属性构造**:构造出新的属性并添加到属性集中。这里会用到特征工程的知识,因为通过属性与属性的连接构造新的属性,其实就是特征工程。比如说,数据表中统计每个人的英语、语文和数学成绩,你可以构造一个“总和”这个属性,来作为新属性。这样“总和”这个属性就可以用到后续的数据挖掘计算中。
最简单易用的就是对数据进行规范化处理
#### 数据规范化的几种方法
#### **1. Min-max 规范化**
Min-max 规范化方法是将原始数据变换到 [0,1] 的空间中。用公式表示就是:
新数值 =(原数值 - 极小值)/(极大值 - 极小值)。

- 是在列上进行计算
- 每一行表示一个样本,每一列表示一个特征
#### **2. Z-Score 规范化**
可以使用相同的标准比价两个不同标准下的数值
新数值 =(原数值 - 均值)/ 标准差



#### **3. 小数定标规范化**
- 小数定标规范化就是通过移动小数点的位置来进行规范化。
- 小数点移动多少位取决于属性 A 的取值中的最大绝对值。
- 举个例子,比如属性 A 的取值范围是 -999 到 88,那么最大绝对值为 999,小数点就会移动 3 位,即新数值 = 原数值 /1000。那么 A 的取值范围就被规范化为 -0.999 到 0.088。#
### 数据可视化
#### 使用视图背后的目的

- 呈现某个变量的分布情况,就可以通过直方图的形式来呈现
- 想要看两个变量之间的相关性及分布情况,可以采用散点图的形式呈现。
- 散点图既可以表明两个变量之间的关系,也可以体现它们的分布情况
#### 前端可视化组件
**Canvas 和 SVG 是 HTML5 中主要的 2D 图形技术,WebGL 是 3D 框架。**
- **Canvas 适用于位图**
- Canvas 技术可以绘制比较复杂的动画
- 就是给了你一张白板,需要你自己来画点
- **SVG** 的中文是可缩放矢量图形,它是使用 XML 格式来定义图形的
- SVG 经常用于图标和图表上。它最大的特点就是支持大部分浏览器,动态交互性实现起来也很方便,比如在 SVG 中插入动画元素等。
- **WebGL 是一种 3D 绘图协议**,能在网页浏览器中呈现 3D 画面技术,并且可以和用户进行交互。

#### 可视化视图
四种关系
1. 比较:比较数据间各类别的关系,或者是它们随着时间的变化趋势,比如折线图;
2. 联系:查看两个或两个以上变量之间的关系,比如散点图;
3. 构成:每个部分占整体的百分比,或者是随着时间的百分比变化,比如饼图;
4. 分布:关注单个变量,或者多个变量的分布情况,比如直方图。
按照变量的个数,我们可以把可视化视图划分为单变量分析和多变量分析。
散点图:
```python
import pandas as pd
import matplotlib.pyplot as plt
import seanborn as sns
# 散点图
plt.scatter(x, y)
sns.jointplot(x, y, data=, kind='scatter')
# 折线图
plt.plot(x, y)
sns.lineplot(x, y, data=)
# 直方图
plt.hist(x)
sns.distplot(x)
# 条形图
plt.bar(x, y)
sns.barplot(x, y)
# 箱型图
plt.boxplot(x)
sns.boxplot(x)
# 饼图
plt.pie(x)
# 热力图
sns.heatmap()
# 蜘蛛图
# 画图数据准备,角度、状态值
labels=np.array([u" 推进 ","KDA",u" 生存 ",u" 团战 ",u" 发育 ",u" 输出 "])
stats=[83, 61, 95, 67, 76, 88]
angles=np.linspace(0, 2*np.pi, len(labels), endpoint=False)
stats=np.concatenate((stats,[stats[0]]))
angles=np.concatenate((angles,[angles[0]]))
fig = plt.figure()
ax = fig.add_subplot(111, polar=True)
ax.plot(angles, stats, 'o-', linewidth=2)
ax.fill(angles, stats, alpha=0.25)
# 二元变量分布
# 用 Seaborn 画二元变量分布图(散点图,核密度图,Hexbin 图)
sns.jointplot(x="total_bill", y="tip", data=tips, kind='scatter')
sns.jointplot(x="total_bill", y="tip", data=tips, kind='kde')
sns.jointplot(x="total_bill", y="tip", data=tips, kind='hex')
# 成对关系
sns.pairplot()
