一、数据分析与挖掘
一、数据分析与挖掘概述
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、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的使用教程:
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、直方图
随机数的生成:info-detail-507676.html
import numpy as npy data = npy.random.random_integers(1,20,1000) #在(最小值,最大值,个数) # print(data)
正态分布:正态分布
西格玛: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)