一、数据分析与挖掘
一、数据分析与挖掘概述
1、数据分析与挖掘定义及关系
数据分析:对已知的数据进行分析,然后提取出一些有价值的信息。比如统计出平均数、标准差等信息,数据分析的数据量有时有时不会太大。
数据挖掘:是指对大量的数据进行分析与挖掘,得到一些未知的、有价值的信息等。比如从网站的用户或者用户行为数据中挖掘出用户潜在需求信息,从而对网站进行改善等。
数据分析与挖掘密不可分,数据挖掘是数据分析的提升。
2、数据分析与挖掘的应用场景
数据挖掘技术可以帮助我们更好的发现事物之间的规律。
我们可以利用数据挖掘技术实现数据规律的探索,比如发现窃电用户、挖掘用户潜在需求、实现信息的个性化推送、发现疾病与症状、甚至疾病与药物之间的规律等等。
3、数据挖掘的过程
- 确定目标
- 获取数据(自有数据、外部数据——常用的手段有通过爬虫采集或者下载一些统计网站发布的数据)
- 数据探索
- 数据预处理(数据清洗(去掉脏数据)、数据集成(集中)、数据变换(规范化)、数据规约(精简))
- 挖掘建模(分类、聚类、关联、预测)
- 模型评价与发布
4、数据分析与挖掘的相关模块
1、相关模块的作用
- numpy可以高效处理数据、提供数组支持、很多模块都依赖它。比如pandas、scipy、matplotlib都依赖它,所以这个模块时基础。
- pandas用的最多的一个模块,主要用于进行数据探索和数据分析。
- matplotlib作图模块,解决可视化问题
- scipy主要进行数值计算,同时支持矩阵运算,并提供了很多高等数据处理功能,比如积分、傅里叶变换、微分方程求解等。
- statsmodels模块主要用于统计分析
- Gensim模块朱涛用于文本挖掘
- sklearn模块用于机器学习,keras模块用于深度学习
2、相关模块的安装与技巧
模块安装的顺序与方式建议如下:
安装包下载地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy
- numpy、mkl(建议下载安装(包名规范:numpy-1.15.2+mkl-cp36-cp36m-win_amd64.whl))
- pandas(建议网络安装:pip3 install pandas)
- matplotlib(建议网络安装:pip3 install matplotlib)
- scipy(建议下载安装(包名规范:scipy-1.1.0-cp36-cp36m-win_amd64.whl))
- statsmodels(建议网络安装:pip3 install statsmodels)
- Gensim(建议网络安装:pip3 install Gensim)
二、数据分析与挖掘相关模块使用
1、numpy的使用
numpy的使用教程:https://www.yiibai.com/numpy/
import numpy
x = numpy.array(["a","33","4","12"])
print(x)
print(x[2])
print(x.sort())
print(x)
2、pandas的使用
import pandas as pda
import pymysql
conn = pymysql.connect(host="127.0.0.1", user="test", passwd="test", db="chaxun")
sql = "select * from chaxun"
data = pda.read_sql(sql,conn)
des = data.describe()
print(des)
i = pda.read_csv("/data/test.csv")
i.describe()
excel = pda.read_excel("/data/abc.xls")
3、matplotlib的使用
直方图可以很方便知道数据的分部情况。
1、折线图/散点图plot
散点、颜色、线条是可以叠加使用的
import matplotlib.pylab as pyl
x = [1,2,3,4,8]
y = [5,7,1,9,2]
# 绘制:plot(x轴数据,y轴数据,展现形式) 默认是最基本的折线图
pyl.plot(x,y,'o')
# 展现
设置成不同的颜色
1 c-cyan--青色
2 r-red--红色
3 m-magente--品红
4 g-green--绿色
5 b-blue--蓝色
6 y-yellow--黄色
7 k-black--黑色
8
设置线条的样式
1 - 直线
2 -- 虚线
3 -. -.形式
4
设置点的样式
1 s 方形
2 h 六角形
3 H 六角形
4 * 星形
5 + 加号
6 x x形
7 d 菱形
8 D 菱形
9
pyl.plot(x, y, '--*y')
pyl.show()
添加图表的标题,标题
pyl.plot(x, y, '--*r')
pyl.title('test')
pyl.xlabel("date")
pyl.ylabel('score')
pyl.show()
设定x与y轴的范围:在一个图中绘制多条
x1 = [4,15,9,17,20]
y1 = [2,3,7,19,21]
pyl.plot(x, y, '--*r')
pyl.plot(x1, y1, '-Hy')
pyl.title('test')
pyl.xlabel("date")
pyl.ylabel('score')
pyl.xlim(0,30)
pyl.ylim(0,25)
pyl.show()
2、直方图
随机数的生成:http://mamicode.com/info-detail-507676.html
import numpy as npy
data = npy.random.random_integers(1,20,1000) #在(最小值,最大值,个数)
# print(data)
正态分布:http://www.baike.com/wiki/%E6%AD%A3%E6%80%81%E5%88%86%E5%B8%83
西格玛:https://baike.baidu.com/item/%E8%A5%BF%E6%A0%BC%E7%8E%9B/8466948
data2 = npy.random.normal(5.0, 2.0, 20) #(均数, 西格玛, 个数)
print(data2)
直方图
import numpy as npy
data3 = npy.random.normal(10.0, 1.0, 1000)
pyl.hist(data3)
pyl.show()
设置直方图的上下限、取消轮廓
import numpy as npy
data4 = npy.random.random_integers(10,30,1000)
pyl.hist(data4)
# 设置直方图的上下限
sty = npy.arange(2, 30, 1)
# 取消轮廓
pyl.hist(data4, sty, histtype='stepfilled')
pyl.show()
#
pyl.subplot(5, 3, 2) #(行, 列, 当前区域)
子域
import numpy as npy
pyl.subplot(2, 2, 1)
x1 = [1,2,3,4,5]
y1 = [5,3,5,23,5]
pyl.plot(x1, y1)
pyl.subplot(2, 2, 2)
x2 = [5,2,3,8,6]
y2 = [7,9,12,12,3]
pyl.plot(x2, y2)
pyl.subplot(2, 1, 2)
x3 = [5,6,7,10,19,20,29]
y3 = [6,2,4,21,5,1,5]
pyl.plot(x3, y3)
pyl.show()
excel表格处理
import pandas as pda
import numpy as npy
import matplotlib.pylab as py1
data = pda.read_excel(
"E:/Data/python_project/study/Linux_study/data_analysis_and_mining/hexun.xls"
)
# 查看excel表的行列数
# print(data.shape)
# 结果:(5697, 6)
# 查看指定单元格的数据:data.values[第几行][第几列]
# print(data.values) 显示所有的数据
# print(data.values[0][1])
# 数据转置
data1 = data.T
# print(data1)
y1 = data1.values[3]
x1 = data1.values[4]
# py1.plot(x1, y1)
# py1.show()
x2 = data1.values[0]
py1.plot(x2, y1)
py1.show()
三、导入数据并分析
1、导入csv数据
csv是一种常见的数据存储格式,基本上我们遇到的数据都可以转为这种存储格式。在Python数据分析中,使用pandas模块导入csv数据。
import pandas as pda
i = pda.read_csv("/data/test.csv")
i.describe()
2、导入excel数据
excel是一种表格文件,在Python数据分析,也可以使用pandas模块导入excel表格里面的数据。
import pandas as pda
excel = pda.read_excel("/data/abc.xls")
excel.describe()
3、分析DB(MySQL)数据
import pandas as pda
import pymysql
conn = pymysql.connect(host="127.0.0.1", user="test", passwd="test", db="chaxun")
sql = "select * from chaxun"
data = pda.read_sql(sql,conn)
des = data.describe()
print(des)
4、导入html数据
使用pandas,可以直接从html网页中加载对应table表格中的数据,但是在使用read_html()之前,需要安装html5lib模块和beautifulsoup4模块。
import pandas as pda
# 只读取网页中的表格
web_table = pda.read_html("https://book.douban.com/")
print(web_table)
5、导入文本数据
可以直接导入文本数据
import pandas as pda
txt_table = pda.read_table("test.txt")
四、数据探索与数据清洗
1、数据探索与数据清洗的目的与关系
数据探索的目的:及早发现数据的一些简单规律或特征。
数据清洗的目的:留下可靠数据,避免脏数据的干扰。
这两者没有严格的先后顺序,经常在一个阶段进行。
2、数据探索的核心
- 数据质量分析(跟数据清洗密切联系)
- 数据特征分析(分布、对比、周期性、相关性、常见统计量等)
3、数据清洗实战
数据清洗可以按如下步骤进行:
- 缺失值处理(通过describe与len直接发现,通过0数据发现)
- 异常值处理(通过散点图发现)
插补的方式主要有:均值插补、中位数插补、众数插补、固定值插补、最近数据插补、回归插补、拉格朗日插值、牛顿插值法、分段插值等等。
遇到异常值,一般处理方式为视为缺失值、删除、修补(平均数、中位数等等)、不处理。
4、数据分布探索实战
探索数据的分部规律,非常有用,有时,可以直接发现数据的规律。(大小范围适当调整,可以发现出其中的规律)
5、示例代码
import pymysql
import numpy as npy
import pandas as pda
import matplotlib.pylab as pyl
#导入数据
conn = pymysql.connect(host="127.0.0.1", user="root", passwd="123456", db="taobao")
sql = "select * from taob"
data = pda.read_sql(sql, conn)
# print(data.describe())
# 数据清洗
# 发现确实值,进行处理
# 将价格为的0进行控制处理
data["price"][(data["price"] == 0)] = None
x = 0
for i in data.columns:
for j in range(len(data)):
if data[i].isnull()[j]:
data[i][j] = "36"
x += 1
# print(x) #44
# 异常值处理
# 画散点图(横轴为价格,纵轴为评论数)
# 得到价格(将数据转置一下)
data2 = data.T
price = data2.values[2]
# print(price)
# 得到评论数据
comment = data2.values[3]
# pyl.plot(price, comment, "o")
# pyl.show()
# 评论数异常>200000,价格异常>2300
line = len(data.values)
col = len(data.values[0])
da = data.values
# 将异常数据处理为平均数或者中位数
# 若数据量比较小的话,使用平均数处理异常数据,异常数据会收异常数据影响比较大
# 若数据量比较大可以使用平均数
for i in range(0,line):
for j in range(0, col):
if da[i][2] > 2300:
# print(da[i][j])
da[i][j] = 36
if da[i][3] > 20000:
# print(da[i][j])
da[i][j] = 58
# 查看一下异常处理完的数据分布情况
da2 = da.T
price = da2[2]
comment = da2[3]
# pyl.plot(price, comment, "o")
# pyl.show()
# 数据分布分析
pricemax = da2[2].max()
pricemin = da2[2].min()
commentmax = da2[3].max()
commentmin = da2[3].min()
# 数据极差值:最大值减去最小值
pricerange = pricemax - pricemin
commentrange = commentmax - commentmin
# 组距:极差/组数
price_class_interval = pricerange / 12
comment_class_interval = commentrange / 12
# 画价格的直方图
pricesty = npy.arange(pricemin, pricemax, price_class_interval)
pyl.hist(da2[2], pricesty)
pyl.show()
# 画评论的直方图
commentsty = npy.arange(commentmin, commentmax, comment_class_interval)
# pyl.hist(da2[3], commentsty)
# pyl.show()
示例代码
五、数据集成
1、数据集成概述
数据集成一般是把不同来源的数据放在一起。但是来自多个地方的数据一定要做好实体识别与冗余属性识别,避免数据整合错误及数据重复。
2、数据集成技巧
数据集成的过程
- 观察数据源,发现其中关系,详细查看是否有同名不同意,同意不同名的情况。
- 进行数据读取与整合。
- 去除重复数据。
3、示例代码
import numpy as nmp
a = nmp.array([[1,4,5],[6,7,9]])
b = nmp.array([[2,6,5],[56,8,5]])
print("a:\n", a)
print("b:\n", b)
# 数据集成
c = nmp.concatenate((a, b))
print("c:\n", c)
示例代码
六、数据变换(数据预处理)
1、简单变换
简单变换的目的是将数据转化为更方便分析的数据。
简单变换通常使用函数变换的方式进行,常见的函数变换包括:开方、平方、对数等。
2.、数据规范化
- 离差标准化(最小-最大标准化)——消除量纲(单位)影响以及变异大小因素的影响 x1 = (x-min) / (max-min) 应用场景:将大值数据转换为小值数据
- 标准差标准化(零-均值标准化)——消除单位影响以及变量自身变异影响。x1 = (x-平均数) / 标准差
- 小数定标规范化——消除单位影响 x1 = x / 10 ** (k) k = log10(x的绝对值的最大值) 解释:10^? = 2000 那么?=log10(|-2000)
3、离散化
1、连续性数据常用的离散化的方法
- 等宽离散化
- 等频率离散化
- 一维聚类离散化
4、属性构造
根据原来属性特性根据需求构造出更实用的属性。
5、示例代码
import pymysql
import pandas as pda
import numpy as npy
conn = pymysql.connect(host="127.0.0.1", user="root", passwd="123456", db="taobao")
sql = "select price,comment from taob"
data = pda.read_sql(sql, conn)
print("处理前:\n",data.describe())
# 离差标准化
data2 = (data-data.min()) / (data.max()-data.min())
print("\n离差标准化:\n", data2.describe())
# 标准差(std方法)标准化
data3 = (data-data.mean()) / data.std()
print("\n标准差标准化:\n",data3.describe())
# 小数定标规范化
# 进1取整函数 ceil
k = npy.ceil(npy.log10(data.abs().max()))
data4 = data/10**(k)
# print("\n小数定标标准化:\n", data4)
# 连续型数据离散化
data5 = data["price"].copy()
data6 = data5.T
data7 = data6.values
k = 3
c1 = pda.cut(data7, k, labels=["便宜", "适中", "贵"])
# print(c1)
# 非等宽离散化
k = [0,50,100,300,500,2000,data7.max()]
c2 = pda.cut(data7, k, labels=["非常便宜", "便宜", "适中", "有点贵", "很贵", "非常贵"])
# print(c2)
# 属性构造
import pymysql
import pandas as pda
import numpy as mpy
import imp
conn = pymysql.connect(host="127.0.0.1", user="root", passwd="123456", db="hexun")
sql = "select * from myhexun"
data8 = pda.read_sql(sql, conn)
# print(data8)
# 评点比
ch = data8["comment"]/data8["hits"]
# print(ch)
data8["评点比"] = ch
# file = "./hexun.xls"
# data8.to_excel(file, index=False)
# 主成分分析
# 若无法导入,使用pip安装一下即可
from sklearn.decomposition import PCA
import pymysql
import pandas as pda
import numpy as mpy
conn = pymysql.connect(host="127.0.0.1", user="root", passwd="123456", db="hexun")
sql = "select hits,comment from myhexun"
data9 = pda.read_sql(sql, conn)
# print(data9)
ch = data9["comment"] / data8["hits"]
data9["评点比"] = ch
# 主成分分析进行中
pcal = PCA()
pcal.fit(data9)
# 返回模型中的各个特征量
characteristic_quantity = pcal.components_
print("\n特征量:\n", characteristic_quantity)
# 各个成分中各自方差百分比,贡献率
rate = pcal.explained_variance_ratio_
print("\n贡献率:\n", rate)
# 将维处理
pca2 = PCA(2)
pca2.fit(data9)
dimensionality_reduction = pca2.transform(data9) #降维
print("\n降维处理:\n", dimensionality_reduction)
recovery = pca2.inverse_transform(dimensionality_reduction) #恢复
print("\n恢复\n", recovery)
示例代码
七、数据规约
数据规约:就是将数据精简。
数据规约包括:属性规约和数值规约。
1、属性规约之主成分分析
PCA算法
简单易学的机器学习算法——主成分分析(PCA)
2、示例代码
from sklearn.decomposition import PCA
import pymysql
import pandas as pda
import numpy as mpy
conn = pymysql.connect(host="127.0.0.1", user="root", passwd="123456", db="hexun")
sql = "select hits,comment from myhexun"
data9 = pda.read_sql(sql, conn)
# print(data9)
ch = data9["comment"] / data8["hits"]
data9["评点比"] = ch
# 主成分分析进行中
pcal = PCA()
pcal.fit(data9)
# 返回模型中的各个特征量
characteristic_quantity = pcal.components_
print("\n特征量:\n", characteristic_quantity)
# 各个成分中各自方差百分比,贡献率
rate = pcal.explained_variance_ratio_
print("\n贡献率:\n", rate)
# 将维处理
pca2 = PCA(2)
pca2.fit(data9)
dimensionality_reduction = pca2.transform(data9) #降维
print("\n降维处理:\n", dimensionality_reduction)
recovery = pca2.inverse_transform(dimensionality_reduction) #恢复
print("\n恢复\n", recovery)
示例代码
八、文本挖掘
安装相对应的库jieba分词模块(也可以安装其他的)
pip3 install
1、文本挖掘的三种模式
- 全模式:分词会有重叠
- 精准模式:每个词汇都有优先级,首先显示优先级高的词(默认是精准模式 )
- 搜索模式
示例代码
import jieba
sentence = "我喜欢上海东方明珠"
# 全模式:分词会有重叠
word1 = jieba.cut(sentence, cut_all=True) #模式
print("我是全模式:")
for item in word1:
print(item)
#精准模式:每个词汇都有优先级,首先显示优先级高的词(默认是精准模式 )
print("\n我是精准模式:")
word2 = jieba.cut(sentence, cut_all=False)
for item in word2:
print(item)
# 搜索模式
print("\n搜索模式:")
word3 = jieba.cut_for_search(sentence)
for item in word3:
print(item)
2、词性标注
1、常用的词性
1 a:形容词
2 c:连词
3 d:副词
4 e:叹词
5 f:方位词
6 i:成语
7 m:数词
8 n:名词
9 nr:人名
10 ns:地名
11 nt:机构团体
12 nz:其他专有名词
13 p:介词
14 r:代词
15 t:时间
16 u:助词
17 v:动词
18 vn:名动词
19 w:标点符号
20
示例代码
from jieba import posseg
word4 = posseg.cut(sentence)
# .flag 词性 .word词语
print("\n词性标注:")
for item in word4:
print(item.word+"------"+item.flag)
2、词典操作
# 自定义词典加载
# jieba.load_userdict("文件名")
# 更改词频
word5 = jieba.cut(sentence)
for item in word5:
print(item)
print("\n更改词频:")
jieba.suggest_freq("上海东方", True)
word6 = jieba.cut(sentence)
for item in word6:
print(item)
#提取关键词
from jieba import analyse
sentence = "我喜欢上海东方明珠"
print("\n提取关键词:")
tag = analyse.extract_tags(sentence, 3)
print(tag)
# 返回词语的位置
word7 = jieba.tokenize(sentence)
for item in word7:
print(item)
print("\n返回词语的位置:")
word8 = jieba.tokenize(sentence, mode="search")
for item in word8:
print(item)
# 分析词频实践(默认的关键词是20个)
print("\n分析血尸的词频")
data = open("E:/Data/python_project/study/Linux_study/data_handing/text_mining/xueshi", encoding="utf-8").read()
tag = jieba.analyse.extract_tags(data, 15)
print(tag)