数据分析与挖掘

时间:2024-04-15 08:59:19

一、数据分析与挖掘

  一、数据分析与挖掘概述

  1、数据分析与挖掘定义及关系

  数据分析:对已知的数据进行分析,然后提取出一些有价值的信息。比如统计出平均数、标准差等信息,数据分析的数据量有时有时不会太大。

  数据挖掘:是指对大量的数据进行分析与挖掘,得到一些未知的、有价值的信息等。比如从网站的用户或者用户行为数据中挖掘出用户潜在需求信息,从而对网站进行改善等。

  数据分析与挖掘密不可分,数据挖掘是数据分析的提升。

  2、数据分析与挖掘的应用场景

  数据挖掘技术可以帮助我们更好的发现事物之间的规律。

  我们可以利用数据挖掘技术实现数据规律的探索,比如发现窃电用户、挖掘用户潜在需求、实现信息的个性化推送、发现疾病与症状、甚至疾病与药物之间的规律等等。

  3、数据挖掘的过程

  1. 确定目标
  2. 获取数据(自有数据、外部数据——常用的手段有通过爬虫采集或者下载一些统计网站发布的数据)
  3. 数据探索
  4. 数据预处理(数据清洗(去掉脏数据)、数据集成(集中)、数据变换(规范化)、数据规约(精简))
  5. 挖掘建模(分类、聚类、关联、预测)
  6. 模型评价与发布

   4、数据分析与挖掘的相关模块

    1、相关模块的作用
  1. numpy可以高效处理数据、提供数组支持、很多模块都依赖它。比如pandas、scipy、matplotlib都依赖它,所以这个模块时基础。
  2. pandas用的最多的一个模块,主要用于进行数据探索和数据分析。
  3. matplotlib作图模块,解决可视化问题
  4. scipy主要进行数值计算,同时支持矩阵运算,并提供了很多高等数据处理功能,比如积分、傅里叶变换、微分方程求解等。
  5. statsmodels模块主要用于统计分析
  6. Gensim模块朱涛用于文本挖掘
  7. sklearn模块用于机器学习,keras模块用于深度学习
     2、相关模块的安装与技巧

  模块安装的顺序与方式建议如下:

  安装包下载地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy 

  1. numpy、mkl(建议下载安装(包名规范:numpy-1.15.2+mkl-cp36-cp36m-win_amd64.whl))
  2. pandas(建议网络安装:pip3 install pandas)
  3. matplotlib(建议网络安装:pip3 install matplotlib)
  4. scipy(建议下载安装(包名规范:scipy-1.1.0-cp36-cp36m-win_amd64.whl))
  5. statsmodels(建议网络安装:pip3 install statsmodels)
  6. 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的使用

  pandas的使用教程:https://www.cnblogs.com/happy-king/p/9378774.html

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的使用

  https://blog.****.net/qq_34337272/article/details/79555544

  https://www.cnblogs.com/nxld/p/7435930.html

  直方图可以很方便知道数据的分部情况。

    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\')
# 展现
pyl.show()

  设置成不同的颜色

1 c-cyan--青色
2 r-red--红色
3 m-magente--品红
4 g-green--绿色
5 b-blue--蓝色
6 y-yellow--黄色
7 k-black--黑色
8 w-white--白色

  设置线条的样式

1 - 直线
2 -- 虚线
3 -. -.形式
4 : 细小虚线

  设置点的样式

1 s 方形
2 h 六角形
3 H 六角形
4 * 星形
5 + 加号
6 x x形
7 d 菱形
8 D 菱形
9 p 五角形
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) #(行, 列, 当前区域)
pyl.show()

  子域

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、数据探索的核心

  1. 数据质量分析(跟数据清洗密切联系)
  2. 数据特征分析(分布、对比、周期性、相关性、常见统计量等)

  3、数据清洗实战

  数据清洗可以按如下步骤进行:

  1. 缺失值处理(通过describe与len直接发现,通过0数据发现)
  2. 异常值处理(通过散点图发现)

  插补的方式主要有:均值插补、中位数插补、众数插补、固定值插补、最近数据插补、回归插补、拉格朗日插值、牛顿插值法、分段插值等等。

  遇到异常值,一般处理方式为视为缺失值、删除、修补(平均数、中位数等等)、不处理。

  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、数据集成技巧

  数据集成的过程

  1. 观察数据源,发现其中关系,详细查看是否有同名不同意,同意不同名的情况。
  2. 进行数据读取与整合。
  3. 去除重复数据。

  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.、数据规范化

  1. 离差标准化(最小-最大标准化)——消除量纲(单位)影响以及变异大小因素的影响  x1 = (x-min) / (max-min)  应用场景:将大值数据转换为小值数据
  2. 标准差标准化(零-均值标准化)——消除单位影响以及变量自身变异影响。x1 = (x-平均数) / 标准差
  3. 小数定标规范化——消除单位影响 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):https://blog.****.net/google19890102/article/details/27969459

  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 jieba

   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 un:未知词语

  示例代码

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)