第1章 python数据分析的概述 
  由于数据量比较大,已经远远超过了人力所能处理的范畴。那么管理和使用这些数据,就成为一个全新的研究课题
  1.1 认识数据分析
      数据分析技能,成为数据从业人员需要具备的技能之一。
      明确数据分析概念、分析流程、和分析方法等相关知识,成为迈出数据分析的第1步
     1.1.1  数据分析的概念
    数据分析:就是用适当的方法,对收集来的数据进行分析,提取有用的信息和形成结论。以此帮助企业管理层做出决策
    广义的数据分析:狭义数据分析和数据挖掘
    1.狭义数据分析:指根据分析目的,采用对比分析、分组分析、交叉分析和回归分析等分析方法,对收集的数据进行处理和分析,提取有价值的信息,发挥数据的作用
    2.数据挖掘:是从大量的,不完全的,有噪声的,模糊的,随机的实际应用数据中,通过应用聚类模型,分类模型,回归或关联规则等技术,挖掘潜在的价值的过程。

    因此:狭义数据分析后得到的结论是‘指标统计量’
          数据挖掘得到的结论是‘模型或规则’
     1.1.2  数据分析的流程
    需求分析--数据获取--数据预处理--分析与建模--模型评价与优化--部署

        1.需求分析:决定了产品的方向
          根据业务、生产和财务等部分的需要,结合现有的数据情况,提出数据分析需求的整体分析方向、内容,最终和需求方达成一致意见
    2.数据获取:是数据分析的基础
        方式:本地数据和网络数据

    3.数据预处理:是对数据进行数据合并、清晰、标准化和数据变换的过程
        合并:多个表合成一个表
        清洗:去掉重复,缺失,异常,不一致的数据
        标准化:去掉特征间的量纲差异
        数据变换:通过离散化,哑变量等技术满足后期分析和建模的数据需求
    4.分析和建模:通过对比/分组/交叉/回归等,以及聚类/分类/关联等方法,发现数据中有价值的信息,并得出结论
        分类:如果分析目标是描述客户行为模式,可以采用描述型分析方法,同时还可以考虑关联规则,序列规则,聚类模型
        如果分析目标是量化未来一段时间内某个事件发生的概率,则可以使用两大预测分析模型:分类预测模型和回归预测模型
        分类预测模型的目标特征都是二元数据
        回归预测模型的目标特征是连续型的数据

    5.模型评价与优化
        不同的模型有不同的指标评价其性能的优劣
        聚类模型的评价指标
        分类模型的评价指标
        回归模型的评价指标:
        模型优化是在模型评价后,如果进入实际生产环境应用后,模型的性能不理想的话,进而对模型进行重构和优化的过程
    6.部署
        是将数据分析结果与结论应用到实际生产系统的过程
        具体内容:
        可以是一份整改措施的报告
        也可以是将模型部署到整个生产系统的解决方案
        
      1.1.3 数据分析应用场景
          客户分析:界定目标客户--了解客户的采购过程--客户特征分析,忠诚度分析,注意力分析,收益分析,营销分析
           目的:将客户细分,使得运营策略达到最优
    
        营销分析:产品分析--价格分析--渠道分析--广告与促销分析
        社交媒体分析:用户分析--访问分析--互动分析
        
        网络安全:
        设备管理:
        交通物流分析:
        欺诈行为分析:


    1.2 熟悉python数据分析的工具
    是数据分析的首选语言
    1.2.1  数据分析的常用工具:python、R、MATLAB
      python:有强大的库
      R:用于统计分析,绘图的语言
      MATLAB:矩阵运算,回执函数与数据、实现算法
    1.2.2  python数据分析的优势
      语法简单--又很多库--功能强大--模型构建--胶水语言
    1.2.3  python数据分析常用类库
      Ipython:是py科学计算标准工具集的组成部分
      NumPy:科学计算基础包
         1.多维数据对象ndarray
        2.数组元素级计算
        3.读写硬盘上基于数组的工具
        4.随机数生成功能
        5.作为算法之间传递数据的容器    
     ScriPy:解决科学计算中各种标准问题域的模块的集合
     pandas:数据分析核心库
        1.为时间序列分析提供了很好的支持
     Matplotlib:用于绘制图表的库
     scikit-learn:数据挖掘和数据分析工具,对一些常用的算法进行了封装。基本模块包括(数据预处理,模型选择,分类,聚类,数据降维,回归)

    Spyder:是交互式的Python语言开发环境
    
    1.3 安装python的Anaconda发行版
    https://www.anoconda/download
    特点:开源免费--全平台支持--包含了众多库
    1.4  jupyter notebook常用
    代码功能和Markdown功能

第2章  NumPy数值计算基础
    特点:1.科学计算   2.多维数据的容器    3.存储/处理大型矩阵
     3.容器可以保存任意类型的数据

    2.1 NumPy的数组对象ndarray
    任务描述:python中有一个array模块,但不支持多维,也没有函数,因此要使用
    NumPy中的ndarray

    2.1.1  创建数组对象
       说明:NumPy提供了两种基本的对象:ndarray(N-dimensional Array Object)多维数组
        ufunc(Universal Function Object)  通用函数
        ndarray特点:存储单一数据类型的多维数组
        ufunc特点:能够对数组进行处理的函数
        1.数组属性
        ndim       维度
        shape    尺寸,形状(几行几列)
        size    元素总数
        dtype    元素类型
        itemsize    每一个元素的大小
        2.数据创建
        方法1:numpy.array(数组名)
            可以建立一维数组,可以建立二维数组,还可以改变维度
        
            2.1改变维度:数组名.shape = (m,n)
           特点:先创建一个python序列,然后再将其转换为数组,效率低

        方法2:用arange函数创建
           np.arange(开始,结束,步长)
              特点:不包含结束值
            例如:np.arange(1,10,1)


           np.linspace(开始,结束,元素个数)
              特点:包含结束值
            例如:np.linspace(1,10,5)

           np.logspace(开始幂,结束幂,元素个数)
            例如:np.logspace(0,5,5)

           np.zeros((m,n))  全为0的数组(m行n列)
           np.eye(m,n)      单位矩阵 (m行n列)
           np.diag([1,2,3,4])  对角线的值为1,2,3,4
           np.ones((m,n))   全为1的矩阵(m行n列)

        3.数据数据类型
        特点:所有数组的数据类型是一样的。
        类型列表:bool,inti,int8,int16,int32,int64,
            uint8,uint16,uint32,uint64,
            float16,float32
            complex
        数组类型转换函数:
            float,int,bool
            

        修改数组的数据类型:
            数组名.dtype = np.类型名

        创建数据类型:
           df = np.dtype([('name',np.str_,40),('numitems',np.int64),('price',np.float64)])
           用以上创建的类型创建数组
           np.array([('曹操',20,34.5),('刘备',20,34.5)],dtype = df)
         


    2.1.2  生成随机数
        np.random.random(100)    --100个0-1之间的数
        np.random.rand(10,5)     --10行5列均匀分布的数
        np.random.randn(10,5)    --10行5列正态分布的数
        np.random.randint(最小值,最大值,size = (10,5)) --10行5列的数

        
        np.random.Shuffle(arr1)         --对数组进行随机排序,并返回排序的结果,(打乱顺序)


    2.1.3  通过索引访问数组
        1.一维数组的索引
        类似于python的list的索引


        2.多维数组的索引
        arr2[2,3]


    2.1.4  变换数组的形态
        1.改变形态
        数组名.reshape(m,n)        --不改变原始数组的形态
        2.数据展平
        数组名.ravel()        --数组横向展平
        数组名.flatten()        --数据横向展平
        数组名.flatten('f')     --数据纵向展平
        
        3.数据组合
        np.hstack((数组1,数组2))
        np.vstack((数组1,数组2))
        
        np.concatenate((数组1,数组2),axis = 1/0)
        说明:axis为1表示横向组合
              axis为0表示纵向组合

        4.数组分割
        np.hsplit(数组,n)  横向分割
        np.vsplit(数组,n)  纵向分割
        np.split(数组,n,axis=1/0)

    2.2 掌握NumPy矩阵与通用函数
    数组和矩阵的区别:
        数组包含:n维数组对象和通用函数对象
        矩阵:是继承自二维数组对象,要单独用命令创建
        
       矩阵计算方便:矩阵相乘  *
            数组相乘  .dot
    
    2.2.1  创建NumPy矩阵
        np.mat("1,2,3;4,5,6")
        np.mat([(1,2,3),(4,5,6)])
        np.matrix("1,2,3;4,5,6")
        np.matrix([(1,2,3),(4,5,6)])


        np.bmat('arr1,arr2;arr1,arr2')  --小矩阵组合成大矩阵
        matr2 = matr1*3
        matr2 = matr1-3
        matr2 = matr1+3
        matr2 * matr1   --矩阵点乘
        
        T  --返回自身的转置
        H  --返回自身的共轭转置
        I  --逆矩阵
        A  --返回视图
    2.2.2  掌握ufunc函数
        说明:是一种对数组中的所有元素进行操作的函数
        1.常用的ufunc函数运算
        四则运算是对数组中的每个元素进行计算,因此四则运算的两个数组的形状必须相同
        +  -  *  /
        <  >  ==  <=  !=  
        np.all(x == y)
        np.any(x == y)


        2.ufunc函数的广播机制
        特点:输入数组向其中shape最长的数组看齐,不足的部分在前面加1补齐
              输出数组的shape是输入数组各个轴上的最大值
              
        一维数组和二维数组的广播机制为例.

    2.3 利用NumPy进行统计分析
    2.3.1  读/写文件
       学会读写文件是利用Numpy进行数据处理的基础
        1.也可以把结果存储到二进制或文本文件中。
        2.提供了从文件读取数据并将其转换为数组的方法
       1.save函数以二进制的格式保存数据
        命令1:np.save(文件路径,数组)
           说明:文件扩展名为.npy
        import numpy as np
        arr = np.arange(100).reshape(10,10)
        np.save('C:/Users/peter/Desktop/数据分析/bit1',arr)

        命令2:np.savez(文件路径,数组列表)
           说明:多个数组保存到1个文件中,扩展名为Npz
        

       2.load函数从二进制的文件中读取数据
        load_data = np.load(文件名)
        读取有一个数组的文件时,直接访问即可
        读取有多个数组的文件时,需要用关键字访问
        load_data['arr_0']   load_data['arr_1']等

       3.在实际的数据分析中,我们更多的是将数据存储到txt或csv格式的文件中
        np.savetxt('C:/Users/peter/Desktop/数据分析/text1.txt',arr,fmt = '%d',delimiter = ',')
        说明:保存到text文件中,保存的格式是整数,分隔符是逗号
        方法1:
          load_arr2 = np.loadtxt('C:/Users/peter/Desktop/数据分析/text2.txt',delimiter = ',',dtype=str)

        方法2:
          注意:1.要导入的文本文档中,是汉字字符时,使用dtype格式限定
            2.如果导入的数据的类型不同,就先定义类型
          例如:
          df = np.dtype([('name',np.str_,40),('sex',np.str_,4),('age',np.int32),('class',np.str_,40)])   --定义类型

           load_arr4 = np.genfromtxt('C:/Users/peter/Desktop/数据分析/text2.txt',delimiter = ',',dtype=df)  --导入文本文档,以df的格式

    2.3.2  使用函数进行简单的统计分析
        1.排序
        分类:直接排序和间接排序
        直接排序:就是把数值直接排序即可
        间接排序:就是指定一个或多个键来进行排序
          1.直接排序的名(sort)
          例如:
             np.random.seed(42)
             arr1 = np.random.randint(1,10,size=10)
             arr1.sort()
             arr2 = np.random.randint(1,10,size=(3,3))
             arr2.sort(axis=1)
             arr2.sort(axis=0)
          2.指定一个或多个键进行排序(argsort和lexsort)
             arr2 = np.random.randint(1,10,size=10)
             arr2.argsort()    --返回的值是重新排序值的下标
             
             a = np.array([3,2,6,4,5])
             b = np.array([5,3,4,1,2])
             c = np.array([4,3,6,1,1])
             d = np.lexsort((a,b,c))

             print(d)    --排序后下标的顺序

             print(list(zip(a[d],b[d],c[d])))   --zip解压后,排序的值的顺序

        2.去重与重复数据
        重复数据就是脏数据之一,去掉重复值numpy中用unique
        arr1= np.array([1,2,2,2,3,4,5,5,1,1,5])
        去重方法1:
          np.unique(arr1)  --去掉重复值,并返回排序后的结果
        
          等价于sorted(set(arr1))
        
          二维数组,怎么用这两种方法完成?
        
        重复数据方法:
          1.np.tile(数组,重复次数)   --对数组进行操作
           2.数组名.repeat(重复次数,axis=1/0)  --对数组中的元素操作

        3.常用的统计函数
        聚合函数:sum,mean,std,var,min,max
        聚合函数就是,直接产出一个最后结果
        注意:一定要注意轴的概念,否则默认的是一个总值
        axis = 0  --纵轴
        axis = 1  --横轴
        默认的是计算一个总值

        argmin()   --最小元素的索引
        argmax()   --最大元素的索引
        
            np.sum(arr4)
            np.mean(arr4)
            np.std(arr4)
            np.var(arr4)
        不聚合函数:cumsum  cumprod
        


    2.3.3  
        作业一:1.导入数据iris_seqal_length.csv中的数据到数组arr1中
              2.去重并排序,将结果放入arr2中
              3.计算数组arr1的累计和
              4.计算数组arr1的和,均值,标准差,方差,最小值,最大值
        作业二:生成一个国际象棋的棋盘
            1.创建一个8*8的矩阵
            2.1,3,5,7行为1;2,4,6为0
        作业三:创建一个数值范围为0-1,间隔为0.01的数组
            创建100个服从正态分布的随机数
            对随机数数组进行简单的统计分析
            对两个数组进行四则运算
        作业四:生成两个2*2的矩阵,并计算矩阵的乘积
                生成1个0-1之间,服从均匀分布的数组


            
第3章 Matplotlib数据可视化基础
   说明:mat--plot--lib
    应用最多的是pyplot模块
   3.1  掌握绘图基础语法与常用参数
    说明:每一幅图的绘制都涉及为数不少的参数,我们掌握参数的设置后,才能更好的辅助绘制图形

       3.1.1  掌握pyplot基础语法
       pyplot基本绘制流程有三部分
        1.创建画布与创建子图
        作用:创建空白画布,并可以选择是否将画布划分成多个部分,方便在同一个图上绘制多个图形
        函数1:plt.figure  创建空白画布,可以指定大小和像素
        函数2:plt.add_subplot  创建并选中子图,指定子图的行/列数和选中图片的编号
        
        注意:只是绘制一幅简单的图形是,这个画布可以省略
             但要绘制子图时,画布必须有

            import numpy as np
            import matplotlib.pyplot as plt
            data = np.arange(0,1.1,0.01)
            p1 = plt.figure(figsize = (8,6),dpi=80)
            ax1 = p1.add_subplot(2,2,1)
            #plt.plot(data,data**2)
            ax2 = p1.add_subplot(2,2,2)
            #plt.plot(data,data*np.pi)

            plt.savefig('C:/Users/peter/Desktop/数据分析/a1.jpg')
            plt.show()


        2.添加画布内容
        包含:
        标题       --plt.title(字符串)
        坐标轴名称     --plt.xlabel(字符串),plt.ylabel(字符串)
        坐标轴取值范围       --plt.xlim((元组))  ,plt.ylim((元组))
        坐标轴刻度    --plt.xsticks([列表]),plt.ysticks([列表])
        绘制图形        --plt.plot(x轴,y轴)
        图例        --plt.legend()
          

        3.保存与显示图形
        plt.savefig('路径')
        plt.show()
例如1:
#绘制测试图形
import numpy as np
import matplotlib.pyplot as plt
data = np.arange(0,10,2)
plt.figure(figsize=(6,8),dpi=80)


#绘制sin和cos
import numpy as np
import matplotlib.pyplot as plt
data = np.arange(0,np.pi*2,0.01)
plt.rcParams['font.sans-serif'] = 'SimHei'   #设置中文字体
#plt.rcParams['axes.unicode_minus'] = False  #设置正常显示符号
p1 = plt.figure(figsize=(6,8),dpi=80)
ax1 = p1.add_subplot(2,1,1)   --绘制子图
plt.title('测试图形')
plt.xlabel('x轴')
plt.ylabel('y轴')
plt.xlim((0,np.pi*2))
plt.ylim((-1,1))
plt.yticks([-1,-0.5,0,0.5,1])
plt.xticks([0,np.pi/2,np.pi,np.pi*1.5,np.pi*2])
plt.plot(data,np.sin(data))   #绘制三角函数
plt.plot(data,np.cos(data))
plt.legend(['sin','cos'])
plt.savefig('C:/Users/peter/Desktop/数据分析/a2.jpg')
plt.show()

ax2 = p1.add_subplot(2,1,2)

plt.title('测试图形')
plt.xlabel('x轴')
plt.ylabel('y轴')
plt.xlim((0,1))
plt.ylim((0,1))
plt.xticks([0,0.2,0.4,0.6,0.8,1])
plt.yticks([0,0.2,0.4,0.6,0.8,1])
plt.plot(data,data**2)
plt.plot(data,data**4)
plt.legend(['y = x^2','y=x^4'])
plt.savefig('C:/Users/peter/Desktop/数据分析/a2.jpg')
plt.show()

    3.1.2  设置pyplot的动态rc参数
       说明:所有存储在字典变量中的rc参数,被称为rcParams
        包含:窗口大小
        每英寸点数
        线条宽度      #lines.linewidth取值0-10之间  
        颜色
        线条样式          #lines.linestyle      -  --  -.  :
        线条上点的形状   #lines.marker     o  D   h  .  ,  S
        线条上点的尺寸   #lines.markersize  0-10
        坐标轴
        坐标
        网格属性
        文本
        字体
 例如2:
import numpy as np
import matplotlib.pyplot as plt
data = np.arange(0,np.pi*2,0.01)
plt.rcParams['font.sans-serif']='SimHei'   #设置显示中文字体
plt.rcParams['axes.unicode_minums'] = False   #设置正常显示符号

pl = plt.figure(figsize=(8,8),dpi=80)
#plt.title('测试图形')
plt.rcParams['lines.linestyle']='-.'     #设置线条样式
plt.rcParams['lines.linewidth']=3        #设置线条宽度
plt.plot(data,data**2,label = '$sin(x)$')
plt.show()


   3.2  分析特征间的关系
    说明:散点图(用来分析特征间的相关关系)
          折线图(用来分析自变量和因变量特征之间的趋势关系)
    3.2.1  绘制散点图
          原理:一个特征为横坐标,另一个为纵坐标,利用坐标点的分布形态,反映特征间的分布形态
        说明:值有点在图表中的位置表示,类别由图表中的标记表示,通常用来比较跨类别的数据

        语法:plt.scatter(values[:,0],values[:,2],marker='o',c='red')
例如3:
import numpy as np
import matplotlib.pyplot as plt
data = np.load('F:/曹晓龙课程/课程/数据分析/第3章/任务程序/data/国民经济核算季度数据.npz')
plt.rcParams['font.sans-serif']='SimHei'
plt.rcParams['axes.unicode_minus']=False

name = dat