常用的数据分析与挖掘工具
R语言是由奥克兰大学统计系的Robert和Ross共同开发的,并在1993年首次亮相。其具备灵活的数据操作、高效的向量化运算、优秀的数据可视化等优点,受到用户的广泛欢迎。
它是一款优秀的数据挖掘工具,用户可以借助强大的第三方扩展包,实现各种数据挖掘算法的落地。Pyhton是由荷兰人Guido van Rossum于1989年发明的,并在1991年首次公开发行。它是一款简单易学的编程类工具,同时,其编写的代码具有简洁性、易读性和易维护性等优点,也受到广大用户的青睐。
借助于pandas、statsmodels、scipy等模块用于数据处理和统计分析;matplotlib、seaborn、bokeh等模块实现数据的可视化功能;sklearn、PyML、keras、tensorflow等模块实现数据挖掘、深度学习等操作。Weka由新西兰怀卡托大学计算机系Ian Written博士于1992年末发起开发,并在1996年公开发布Weka 2.1版本。它是一款公开的数据挖掘平台,包含数据预处理、数据可视化等功能,以及各种常用的回归、分类、聚类、关联规则等算法。
对于不擅长编程的用户,可以通过Weka的图形化界面完成数据分析或挖掘的工作内容。SAS是由美国北卡罗来纳州大学开发的统计分析软件,当时主要是为了解决生物统计方面的数据分析。在1976年成立SAS软件研究所,经过多年的完善和发展,最终在国际上被誉为统计分析的标准软件,进而受到各个领域的广泛应用。
SPSS是世界上最早的统计分析软件,最初由斯坦福大学的三个研究生在1968年研发成功,并成立SPSS公司,而且在1975年成立了SPSS芝加哥总部。用户通过SPSS的界面实现数据的统计分析和建模、数据可视化及报表输出,简单的操作受到了众多用户的喜爱。
除此之外,SPSS还有一款Modeler工具,其充分体现了数据挖掘的各个流程,例如数据的导入、清洗、探索性分析、模型选择、模型评估和结果输出,用户可基于界面化的操作完成数据挖掘的各个环节。
学习numpy记录
数组的创建与操作
二维数组的创建
(base) Cheng-MacBook-Pro:~ chelsea$ conda deactivate
Cheng-MacBook-Pro:~ chelsea$ cd /Users/chelsea/pandas-tutorial-master
Cheng-MacBook-Pro:pandas-tutorial-master chelsea$ source venv/bin/activate
(venv) Cheng-MacBook-Pro:pandas-tutorial-master chelsea$ ipython
/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/IPython/core/interactiveshell.py:935: UserWarning: Attempting to work in a virtualenv. If you encounter problems, please install IPython inside the virtualenv.
warn("Attempting to work in a virtualenv. If you encounter problems, please "
Python 3.8.1 (v3.8.1:1b293b6006, Dec 18 2019, 14:08:53)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.13.0 -- An enhanced Interactive Python. Type '?' for help.
In [1]: import numpy as np
In [2]: arr1 = np.array([[1,3,5,7],])
In [3]: arr1 = np.array([[1,3,5,7],[2,4,6,8],[11,13,15,17],[12,14,16,18],[100,10
...: 1,102,103]])
In [4]: arr1
Out[4]:
array([[ 1, 3, 5, 7],
[ 2, 4, 6, 8],
[ 11, 13, 15, 17],
[ 12, 14, 16, 18],
[100, 101, 102, 103]])
In [5]: arr2 = np.array(((8.5,6,4.1,2,0.7),(1.5,3,5.4,7.3,9),
...: (3.2,3,3.8,3,3),(11.2,13.4,15.6,17.8,19)))
...:
In [6]: arr2
Out[6]:
array([[ 8.5, 6. , 4.1, 2. , 0.7],
[ 1.5, 3. , 5.4, 7.3, 9. ],
[ 3.2, 3. , 3.8, 3. , 3. ],
[11.2, 13.4, 15.6, 17.8, 19. ]])
数组元素的返回
1)在一维数组中,列表的所有索引方法都可以使用在数组中,而且还可以将任意位置的索引组装为列表,用作对应元素的获取;
2)在二维数组中,位置索引必须写成[rows,cols]的形式,方括号的前半部分用于锁定二维数组的行索引,后半部分用于锁定数组的列索引;
3)如果需要获取二维数组的所有行或列元素,那么,对应的行索引或列索引需要用英文状态的冒号表示;
In [7]: arr1 = np.array([3,10,8,7,34,11,28,72])
...:
In [8]: arr1
Out[8]: array([ 3, 10, 8, 7, 34, 11, 28, 72])
In [9]: arr1[[2,3,5,7]]
Out[9]: array([ 8, 7, 11, 72])
In [10]: arr2[1,2]
Out[10]: 5.4
In [11]: arr2[2,:]
Out[11]: array([3.2, 3. , 3.8, 3. , 3. ])
In [12]: arr2[:,1]
Out[12]: array([ 6. , 3. , 3. , 13.4])
In [13]: arr2[1:4,1:5]
Out[13]:
array([[ 3. , 5.4, 7.3, 9. ],
[ 3. , 3.8, 3. , 3. ],
[13.4, 15.6, 17.8, 19. ]])
数组的常用属性
ndim
:返回数组的维数(返回1,表示1维数组;返回2,表示二维数组)shape
:返回数组的行列数(返回结果为元组结构)dtype
:返回数组元素的数据类型size
:返回数组元素的个数reshape
:用于转换数组的形状,如原本3×4的数组转换成6×2的数组resize
:与reshape
功能类似,区别在于reshape
无法原地修改数组的形状,而resize
可以ravel
:将多维数组转换为一维数组的方法flatten
:与ravel
功能类似
In [16]: arr3 = np.array([[1,5,7],[3,6,1],[2,4,8],[5,8,9],[1,5,9],[8,5,2]])
...:
In [17]: arr3
Out[17]:
array([[1, 5, 7],
[3, 6, 1],
[2, 4, 8],
[5, 8, 9],
[1, 5, 9],
[8, 5, 2]])
In [18]: arr3.shape
Out[18]: (6, 3)
In [19]: arr3.reshape(2,9)
Out[19]:
array([[1, 5, 7, 3, 6, 1, 2, 4, 8],
[5, 8, 9, 1, 5, 9, 8, 5, 2]])
In [20]: arr3.shape
Out[20]: (6, 3)
In [21]: arr3.resize(2,9)
In [22]: arr3.shape
Out[22]: (2, 9)
数组降维
In [24]: arr4
Out[24]:
array([[ 1, 10, 100],
[ 2, 20, 200],
[ 3, 30, 300]])
In [25]: arr4.ravel()
Out[25]: array([ 1, 10, 100, 2, 20, 200, 3, 30, 300])
In [26]: arr4.flatten()
Out[26]: array([ 1, 10, 100, 2, 20, 200, 3, 30, 300])
In [27]: arr4.reshape(-1)
Out[27]: array([ 1, 10, 100, 2, 20, 200, 3, 30, 300])
In [28]: arr4.ravel(order = 'F')
Out[28]: array([ 1, 2, 3, 10, 20, 30, 100, 200, 300])
In [29]: arr4.flatten(order = 'F')
Out[29]: array([ 1, 2, 3, 10, 20, 30, 100, 200, 300])
In [30]: arr4.reshape(-1, order = 'F')
Out[30]: array([ 1, 2, 3, 10, 20, 30, 100, 200, 300])
数组的堆叠
-
row_stack
:用于垂直方向(纵向)的数组堆叠 -
colum_stack
:用于水平方向(横向)的数组合并 -
vstack
:其功能与row_stack
函数一致 -
hstack
:其功能与colum_stack
函数一致
In [31]: arr5 = np.array([1,2,3])
...:
In [32]: arr5
Out[32]: array([1, 2, 3])
In [33]: np.vstack([arr4,arr5])
Out[33]:
array([[ 1, 10, 100],
[ 2, 20, 200],
[ 3, 30, 300],
[ 1, 2, 3]])
In [34]: np.row_stack([arr4,arr5])
Out[34]:
array([[ 1, 10, 100],
[ 2, 20, 200],
[ 3, 30, 300],
[ 1, 2, 3]])
In [35]: arr6 = np.array([[5],[15],[25]])
In [36]: arr6
Out[36]:
array([[ 5],
[15],
[25]])
In [37]: np.hstack([arr4,arr6])
Out[37]:
array([[ 1, 10, 100, 5],
[ 2, 20, 200, 15],
[ 3, 30, 300, 25]])
In [38]: np.column_stack([arr4,arr6])
Out[38]:
array([[ 1, 10, 100, 5],
[ 2, 20, 200, 15],
[ 3, 30, 300, 25]])
数学运算符
运算符 | 含义 | 运算符 | 含义 |
---|---|---|---|
+ | 数组对应元素的加和 | - | 数组对应元素的差 |
* | 数组对应元素的乘积 | / | 数组对应元素的商 |
% | 数组对应元素商的余数 | // | 数组对应元素商的整除数 |
** | 数组对应元素的幂指数 |
比较运算符
符号 | 函数 | 含义 |
---|---|---|
> | np.greater(arr1,arr2) | 判断arr1的元素是否大于arr2的元素 |
>= | np.greater_equal(arr1,arr2) | 判断arr1的元素是否大于等于arr2的元素 |
< | np.less(arr1,arr2) | 判断arr1的元素是否小于arr2的元素 |
<= | np.less_equal(arr1,arr2) | 判断arr1的元素是否小于等于arr2的元素 |
== | np.equal(arr1,arr2) | 判断arr1的元素是否等于arr2的元素 |
!= | np.not_equal(arr1,arr2) | 判断arr1的元素是否不等于arr2的元素 |
常用的数学函数
函数 | 函数说明 |
---|---|
np.pi | 常数p |
np.e | 常数e |
np.fabs(arr) | 计算各元素的浮点型绝对值 |
np.ceil(arr) | 对各元素向上取整 |
np.floor(arr) | 对各元素向下取整 |
np.round(arr) | 对各元素四舍五入 |
np.fmod(arr1,arr2) | 计算arr1/arr2的余数 |
函数 | 函数说明 |
---|---|
np.modf(arr) | 返回数组元素的小数部分和整数部分 |
np.sqrt(arr) | 计算各元素的算术平方根 |
np.square(arr) | 计算各元素的平方值 |
np.exp(arr) | 计算以e为底的指数 |
np.power(arr, α) | 计算各元素的指数 |
np.log2(arr) | 计算以2为底各元素的对数 |
np.log10(arr) | 计算以10为底各元素的对数 |
np.log(arr) | 计算以e为底各元素的对数 |
常用的统计函数
函数 | 函数说明 |
---|---|
np.min(arr,axis) | 按照轴的方向计算最小值 |
np.max(arr,axis) | 按照轴的方向计算最大值 |
np.mean(arr,axis) | 按照轴的方向计算平均值 |
np.median(arr,axis) | 按照轴的方向计算中位数 |
np.sum(arr,axis) | 按照轴的方向计算和 |
np.std(arr,axis) | 按照轴的方向计算标准差 |
np.var(arr,axis) | 按照轴的方向计算方差 |
函数 | 函数说明 |
---|---|
np.cumsum(arr,axis) | 按照轴的方向计算累计和 |
np.cumprod(arr,axis) | 按照轴的方向计算累计乘积 |
np.argmin(arr,axis) | 按照轴的方向返回最小值所在的位置 |
np.argmax(arr,axis) | 按照轴的方向返回最大值所在的位置 |
np.corrcoef(arr) | 计算皮尔逊相关系数 |
np.cov(arr) | 计算协方差矩阵 |
注意:axis=0时,计算数组各列的统计值;
axis=1时,计算数组各行的统计值
In [39]: arr4
Out[39]:
array([[ 1, 10, 100],
[ 2, 20, 200],
[ 3, 30, 300]])
In [40]: np.sum(arr4,axis = 0)
Out[40]: array([ 6, 60, 600])
In [41]: np.sum(arr4,axis = 1)
Out[41]: array([111, 222, 333])
常用的线代函数(了解)
函数 | 说明 | 函数 | 说明 |
---|---|---|---|
np.zeros | 生成零矩阵 | np.ones | 生成所有元素为1的矩阵 |
np.eye | 生成单位矩阵 | np.transpose | 矩阵转置 |
np.dot | 计算两个数组的点积 | np.inner | 计算两个数组的内积 |
np.diag | 矩阵主对角线与一维数组间的转换 | np.trace | 矩阵主对角线元素的和 |
np.linalg.det | 计算矩阵行列式 | np.linalg.eig | 计算矩阵特征根与特征向量 |
np.linalg.eigvals | 计算方阵特征根 | np.linalg.inv | 计算方阵的逆 |
np.linalg.pinv | 计算方阵的Moore-Penrose伪逆 | np.linalg.solve | 计算Ax=b的线性方程组的解 |
np.linalg.lstsq | 计算Ax=b的最小二乘解 | np.linalg.qr | 计算QR分解 |
np.linalg.svd | 计算奇异值分解 | np.linalg.norm | 计算向量或矩阵的范数 |
In [43]: arr16
Out[43]:
array([[1, 2, 5],
[3, 6, 8],
[4, 7, 9]])
In [44]: print('计算3×3方阵的特征根和特征向量:\n',arr16)
计算3×3方阵的特征根和特征向量:
[[1 2 5]
[3 6 8]
[4 7 9]]
In [45]: print('求解结果为:\n',np.linalg.eig(arr16))
求解结果为:
(array([16.75112093, -1.12317544, 0.37205451]), array([[-0.30758888, -0.90292521, 0.76324346],
[-0.62178217, -0.09138877, -0.62723398],
[-0.72026108, 0.41996923, 0.15503853]]))
In [46]: A = np.array([[3,2,1],[2,3,1],[1,2,3]])
...: b = np.array([39,34,26])
...: X = np.linalg.solve(A,b)
...: print('三元一次方程组的解:\n',X)
三元一次方程组的解:
[9.25 4.25 2.75]
常用的随机分布函数(了解)
函数 | 说明 |
---|---|
seed(n) | 设置随机种子 |
beta(a, b, size=None) | 生成贝塔分布随机数 |
chisquare(df, size=None) | 生成卡方分布随机数 |
choice(a, size=None, replace=True, p=None) | 从a中有放回地随机挑选指定数量的样本 |
exponential(scale=1.0, size=None) | 生成指数分布随机数 |
f(dfnum, dfden, size=None) | 生成F分布随机数 |
gamma(shape, scale=1.0, size=None) | 生成伽马分布随机数 |
geometric(p, size=None) | 生成几何分布随机数 |
hypergeometric(ngood, nbad, nsample, size=None) | 生成超几何分布随机数 |
laplace(loc=0.0, scale=1.0, size=None) | 生成拉普拉斯分布随机数 |
logistic(loc=0.0, scale=1.0, size=None) | 生成Logistic分布随机数 |
lognormal(mean=0.0, sigma=1.0, size=None) | 生成对数正态分布随机数 |
函数 | 说明 |
---|---|
negative_binomial****(n, p, size=None) | 生成负二项分布随机数 |
multinomial(n, pvals, size=None) | 生成多项分布随机数 |
multivariate_normal(mean, cov[, size]) | 生成多元正态分布随机数 |
normal(loc=0.0, scale=1.0, size=None) | 生成正态分布随机数 |
pareto(a, size=None) | 生成帕累托分布随机数 |
poisson(lam=1.0, size=None) | 生成泊松分布随机数 |
rand(d0, d1, ..., dn) | 生成n维的均匀分布随机数 |
randn(d0, d1, ..., dn) | 生成n维的标准正态分布随机数 |
randint(low, high=None, size=None, dtype='l') | 生成指定范围的随机整数 |
random_sample(size=None) | 生成[0,1)的随机数 |
standard_t(df, size=None) | 生成标准的t分布随机数 |
uniform(low=0.0, high=1.0, size=None) | 生成指定范围的均匀分布随机数 |
wald(mean, scale, size=None) | 生成Wald分布随机数 |
weibull(a, size=None) | 生成Weibull分布随机数 |
# 导入第三方模块
import seaborn as sns
import matplotlib.pyplot as plt
from scipy import stats
# 生成各种正态分布随机数
np.random.seed(1234)
rn1 = np.random.normal(loc = 0, scale = 1, size = 1000)
rn2 = np.random.normal(loc = 0, scale = 2, size = 1000)
rn3 = np.random.normal(loc = 2, scale = 3, size = 1000)
rn4 = np.random.normal(loc = 5, scale = 3, size = 1000)
# 绘图
plt.style.use('ggplot')
sns.distplot(rn1, hist = False, kde = False, fit = stats.norm,
fit_kws = {'color':'black','label':'u=0,s=1','linestyle':'-'})
# 续上一页的代码
sns.distplot(rn2, hist = False, kde = False, fit = stats.norm,
fit_kws = {'color':'red','label':'u=0,s=2','linestyle':'--'})
sns.distplot(rn3, hist = False, kde = False, fit = stats.norm,
fit_kws = {'color':'blue','label':'u=2,s=3','linestyle':':'})
sns.distplot(rn4, hist = False, kde = False, fit = stats.norm,
fit_kws = {'color':'purple','label':'u=5,s=3','linestyle':'-.'})
# 呈现图例
plt.legend()
# 呈现图形
plt.show()
In [53]: # 生成各种指数分布随机数
...: np.random.seed(1234)
...: re1 = np.random.exponential(scale = 0.5, size = 1000)
...: re2 = np.random.exponential(scale = 1, size = 1000)
...: re3 = np.random.exponential(scale = 1.5, size = 1000)
...: # 绘图
...: sns.distplot(re1, hist = False, kde = False, fit = stats.expon,
...: fit_kws = {'color':'black','label':'lambda=0.5','linestyle
...: ':'-'})
...: sns.distplot(re2, hist = False, kde = False, fit = stats.expon,
...: fit_kws = {'color':'red','label':'lambda=1','linestyle':'-
...: -'})
...: sns.distplot(re3, hist = False, kde = False, fit = stats.expon,
...: fit_kws = {'color':'blue','label':'lambda=1.5','linestyle'
...: :':'})
...: # 呈现图例
...: plt.legend()
...: # 呈现图形
...: plt.show()
...: