一、数据分析介绍
1.什么是数据分析与挖掘技术
①数据分析:即对已知的数据进行分析,然后提取出一些有价值的信息,比如统计出平均数,标准差等信息,数据量有时可能不会太大。
②数据挖掘:指对大量的数据进行分析与挖掘,得到一些未知的,有价值的信息等,比如从网站的用户或用户行为数据中挖掘出用户潜在需求信息,从而对网站进行改善等 。
③数据分析与数据挖掘的关系:数据分析与数据挖掘密不可分,数据挖掘是数据分析的提升。
2.数据挖掘的过程
①定义目标。
②获取数据(常用的手段有通过爬虫采集或者下载一些统计网站发布的数据)。
③数据探索。
④数据预处理(数据清晰【去掉脏数据】、数据集成【集中】、数据变换【规范化】、数据规约【精简】)。
⑤挖掘建模(分类、聚类、关联、预测) 。
⑥模型评价与发布。
3.相关模块简介
①numpy:可以高效处理数据,处理数组支持,很多模块都依赖它,比如pandas,scipy,matplotlib,所以这个模块时间基础 。
②pandas:主要用于进行数据探索和数据分析。
③matplotlib:作图模块,解决可视化问题。
④scipy:主要进行数值计算,同时支持矩阵运算,并提供了很多高等数据处理功能,如积分,傅里叶,微分方程求解。
⑤statsmodels:主要用于统计分析。
⑥Gensim:主要用于文本挖掘。
⑦sklearn、keras:前者机器学习,后者深度学习。
二、相关模块安装
1.模块安装顺序与方法
①numpy,mkl(下载安装)
②pandas(网络安装)
③matplotlib(网络安装)
④scipy(下载安装)
⑤statsmodels(网络安装)
⑥Gensim(网络安装)
其中下载安装地址:https://www.lfd.uci.edu/,网络安装直接通过pip安装即可。
2.相关模块的基本使用
①numpy数组操作
import numpy # 创建一维数组格式 # numpy.array([元素1,元素2,..., 元素n]) x = numpy.array(["a", "9", "8", "2"]) print(x) # ['a' '9' '8' '2'] print(x[2]) # 8 # 创建二维数组 # numpy.array([[元素1,元素2,..., 元素n], [元素1,元素2,..., 元素n], [元素1,元素2,..., 元素n]]) y = numpy.array([[3, 10], [4, 5], [7, 5]]) print(y) # [[ 3 10] [ 4 5] [ 7 5]] print(y[0][1]) # 10 # 排序sort() x.sort() y.sort() # 取最大值与最小值 y1 = y.max() y2 = y.min() # 切片 # 数组[start:end+1] y3 = y[1:3] # 生成随机整数 # (最小值,最大值,个数) data = numpy.random.random_integers(0, 20, 10) # 正态分布随机数 # (平均数,西格玛,个数) data2 = numpy.random.normal(5.0, 2.0, 10)
②pandas数据操作
import pandas as pda # 创建一串数字, 默认索引从0开始 a = pda.Series([8, 9, 2, 1]) # 创建一串数字, 通过index自定义索引 b = pda.Series([8, 9, 2, 1], index=[1, 2, 3, 5]) # 创建数据框, 默认索引从0开始 c = pda.DataFrame([[1, 5, 6, 2], [3, 2, 7, 8], [6, 0, 5, 1]]) # 创建数据框, 通过columns指定列索引 d = pda.DataFrame([[1, 5, 6, 2], [3, 2, 7, 8], [6, 0, 5, 1]], columns=["one", "two", "three", "four"]) # 通过字典方式创建数据框 e = pda.DataFrame({ # 当列的值个数小于其他列,会自动填充当前值 "one": 4, "two": [4, 6, 2], "three": list(str(982)), }) # 头部数据,默认前五行 print(d.head()) # 头部数据,指定行数 print(d.head(2)) # 尾部数据,默认前五行 print(d.tail()) # 尾部数据,指定行数 print(d.tail(2)) # 展示数据框基本统计信息 print(d.describe()) # count 列的元素个数 # mean 列的平均数 # std 列的标准差 # min 列的最小值 # 25% 列的前分位数 # 50% 列的中分位数 # 75% 列的后分位数 # max 列的最大值 # 转置:行列置换 print(d.T)
三、数据导入分析
1.导入csv数据
csv是一种常见的数据存储格式,基本上遇到的数据都可以转为这种存储格式,在python数据分析中,我们使用pandas模块导入csv数据。
import pandas as pda # 导入csv格式数据 data = pda.read_csv("hexun.csv") # csv数据的基本统计信息, 非数字不展示 print(data.describe()) # 按照某种顺序重新排序 print(data.sort_values(by="21"))
2.导入excel数据
excel是一种表格文件,在Python数据分析中,我们同样可以使用pandas模块导入excel表格里面的数据。
import pandas as pda # 导入excel格式文件 data = pda.read_excel("hexun.xls") # excel数据的基本统计信息, 非数字不展示 print(data.describe())
3.导入Mysql数据库里的数据
Mysql是一种很常见的数据库,在Python数据分析中,直接从Mysql中取数据。
import pandas as pda import pymysql # 连接数据库信息 conn = pymysql.connect(host="localhost", user="root", password="5201314mysql", database="test", port=3306) # 查询数据表语句 sql = "select * from user" # 获取查询结果 data = pda.read_sql(sql, conn) # 数据基本统计信息 print(data.describe())
4.导入html数据
使用pandas,可以直接从html网页中加载对于table表格中的数据,但是在使用read_html之前,需要先安装html5lib模块与beautifulsoup4模块。
import pandas as pda # 使用本地的网页 # data = pda.read_html("abc.html") # 从网页中读取表格 data = pda.read_html("https://book.douban.com/") print(data)
5.导入文本数据
有时我们希望直接导入txt文本数据,其实也是可以的。
import pandas as pda # 使用txt文本格式 data = pda.read_table("abc.txt") print(data.describe())
四、matplotlib可视化分析
1.折线图和散点图
# 折线图/散点图plot import matplotlib.pylab as pyl x = [1, 2, 4, 5, 7] y = [4, 6, 1, 8, 30] # plot(x轴数据,y轴数据, 展现形式) pyl.plot(x, y) pyl.show() # 展现为散点图 pyl.plot(x, y, 'o') pyl.show()
2.修改折线图线条的颜色
import matplotlib.pylab as pyl # 线条颜色 # 'c':青色 # 'r':红色 # 'm':品红 # 'g':绿色 # 'b':蓝色 # 'y':黄色 # 'k':黑色 # 'w':白色 pyl.plot(x, y, 'k', 'ko') pyl.plot(x, y, 'ko') pyl.show()
3.修改折线图线条样式
import matplotlib.pylab as pyl # 线条样式 # '-':直线 # '--':虚线 # '-.-.':-.-.形式 # ':':细小虚线 pyl.plot(x, y, '-.') pyl.show()
4.修改散点图样式
import matplotlib.pylab as pyl # 散点图点的样式 # 's':方形 # 'h':六角形 # 'H':六角形 # '*':星形 # '+':加号 # 'x':x形 # 'd':菱形 # 'D':菱形 # 'p':五角形 pyl.plot(x, y, 'p') pyl.show()
5.添加坐标样式
import matplotlib.pylab as pyl # 添加坐标样式 pyl.title('show') pyl.xlabel('ages') pyl.ylabel('temp') pyl.show()
6.定义x轴,y轴的范围
import matplotlib.pylab as pyl # 定义x轴,y轴的范围 pyl.xlim(0, 20) pyl.ylim(0, 50) pyl.show()
7.绘制子图
# 绘制子图 # (行,列,当前区域) pyl.subplot(2, 2, 1) x1 = [1, 2, 4, 6] y1 = [1, 3, 6, 9] pyl.plot(x1, y1) pyl.subplot(2, 2, 2) x2 = [1, 2, 4, 6] y2 = [1, 3, 6, 9] pyl.plot(x2, y2) pyl.subplot(2, 1, 2) x3 = [1, 2, 4, 6] y3 = [1, 3, 6, 9] pyl.plot(x3, y3) pyl.show()
8.直方图
import matplotlib.pylab as pyl import numpy as npy # 生成随机整数 # (最小值,最大值,个数) data3 = npy.random.random_integers(0, 20, 10) pyl.hist(data3) # 正态分布随机数 # (平均数,西格玛,个数) data4 = npy.random.normal(10.0, 2.0, 1000) pyl.hist(data4) pyl.show() # 设置直方图的范围和宽度 # (start,end,step) sty = npy.arange(2, 17, 4) # histtype隐藏轮廓 pyl.hist(data4, sty, histtype='stepfilled') pyl.show()
五、数据清洗
1.发现缺失值
import pandas as pda import pymysql from matplotlib import pylab as pyl import numpy as npy # 一般思路: # 如果发现数据不符要求,可以先将该数据设置为空,然后再设置位中位数或者平均数 conn = pymysql.connect(host="127.0.0.1", user="root", password="root", db="csdn") sql = "select * from taob" data = pda.read_sql(sql, conn) print(data.describe()) # 发现缺失值 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)
2.异常值处理
# 画散点图(横轴为价格,纵轴为评论数) # 得到价格 data2 = data.T price = data2.values[2] # 得到评论数据 comment = data.values[3] pyl.plot(price, comment, 'o') pyl.show() # 评论数异常>2000,价格异常>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]) data[i][2] = 36 if da[i][3] > 20000: print(da[i][j]) data[i][j] = 58 da2 = da.T price = da2[2] comt = da2[3] pyl.plot(price, comt, 'o') pyl.show()
3.分布分析
priceMax = da2[2].max() priceMin = da2[2].min() commentMax = da2[3].max() commentMin = da2[3].min() # 极差:最大值 - 最小值 priceErg = priceMax - priceMin commentErg = commentMax - commentMin # 组距:极差/组数 pricedst = priceErg/12 commentdst = commentErg/12 # 画价格的直方图 pricesty = npy.arange(priceMin, priceMax, pricedst) pyl.hist(da2[2], pricesty) pyl.show() # 画评论的直方图 commentsty = npy.arange(commentMin, commentMax, commentdst) pyl.hist(da[3], commentsty) pyl.show()
未完,待更新...