精华内容
下载资源
问答
  • python描述性统计分析

    千次阅读 2018-10-10 19:19:20
    1、 数值分析 from numpy import array from numpy.random import normal, randint list_data = [1, 2, 3] #使用List来创造一组数据 array_data = array([1, 2, 3]) #使用array来创造一组数据 normal_data = ...

    1、 数值分析

    from numpy import array
    from numpy.random import normal, randint
    
    list_data = [1, 2, 3]   #使用List来创造一组数据
    array_data = array([1, 2, 3])   #使用array来创造一组数据
    normal_data = normal(0, 10, size=100)    #创造一组服从正态分布的定量数据
    randint_data = randint(0, 10, size=100)  #创造一组服从均匀分布的定性数据
    
    #定量:均值、中位数  定性:众数   借由数据的中心位置,我们可以知道数据的一个平均情况
    from numpy import mean, median
    from scipy.stats import mode
    
    list_data_mean = mean(list_data)
    list_data_median = median(list_data)
    list_data_mode = mode(list_data)
    randint_data_mean = mean(randint_data)  #均值相对于中位数来说,包含的信息量更大,但是更容易受异常影响
    randint_data_median = median(randint_data)
    randint_data_mode = mode(randint_data)  #众数是出现次数最多的值
    
    #对数据的中心位置有所了解以后,一般我们会想要知道数据以中心位置为标准有多发散
    #如果以中心位置来预测新数据,那么发散程度决定了预测的准确性,数据的发散成都可用极差、方差、标准差、变异系数来衡量
    #极差是只考虑了最大值和最小值的发散程度指标,相对来说,方差包含了更多的信息,标准差基于方差但是与原始数据同量级
    #变异系数基于标准差但是进行了无量纲处理
    from numpy import ptp, var, std
    
    list_data_ptp = ptp(list_data)  #极差
    list_data_var = var(list_data)  #方差
    list_data_std = std(list_data)  #标准差
    list_data_mean_std = mean(list_data) / std(list_data)
    normal_data_ptp = ptp(normal_data)
    normal_data_var = var(normal_data)
    normal_data_std = std(normal_data)
    normal_data_mean_std = mean(normal_data) / std(normal_data)
    
    #之前提到均值容易受异常值影响,那么如何衡量偏差,偏差到多少算异常是两个必须要解决的问题
    #定义z-score为测量值距均值相差的标准差数目,当标准差不为0且不接近于0的数时,z-分数是有意义的
    list_data_zscore = []
    randint_data_zscore = []
    for i in range(0, len(list_data), 1):
        # 通常来说z分数的绝对值大于3将视为异常
        list_data_i_zscore = (list_data[i] - mean(list_data)) / std(list_data)
        list_data_zscore.append(list_data_i_zscore)
    for j in range(0, len(randint_data), 1):
        randint_data_i_zscore = (randint_data[i] - mean(randint_data)) / std(randint_data)
        randint_data_zscore.append(randint_data_i_zscore)
    
    #有两组数据时,我们关心这两组数据是否相关,相关程度有多少。用协方差(COV)和相关系数(CORRCOEF)来衡量相关程度
    #协方差的绝对值越大表示相关程度越大,协方差为正值表示正相关,负值为负相关,0为不相关
    #相关系数是基于协方差但进行了无量纲处理
    from numpy import cov, corrcoef
    
    data1 = [1, 2, 3, 4, 0 ,4, 5, 7, 9, 1]
    data2 = [0, 2, 3, 2, 0, 4, 5, 7, 9, 0]
    data = array([data1, data2])
    #计算两组数的协方差,参数bias=1表示结果需要除以N,否则只计算了分子部分
    #返回结果为矩阵,第i行第j列的数据表示第i组数与第j组数的协方差,对角线为方差
    data_cov = cov(data, bias=1)    #cov=(i到n求和)(data1[i]-mean1)*(data2[i]-mean2)/N
    
    #计算两组数的相关系数,返回结果为矩阵,第i行第j列的数据表示第i组数与第j组数的相关系数,对角线为1
    data_corrcoef = corrcoef(data)  #corrcoef=cov/std1*std2
    print (data)
    print (data_cov)
    print (data_corrcoef)
    
    
    
    2、 图形分析
    
    
    #使用图分析可以更加直观地展示数据的分布(频数分析)和关系(关系分析)
    #柱状图和饼状图是对定性数据进行频数分析的常用工具,使用前需将每一类的频数计算出来
    #直方图和累积曲线是对定量数据进行频数分析的常用工具,直方图对应密度函数而累积曲线对应分布函数
    #散点图可用来对两组数据的关系进行描述
    #在没有分析目标时,需要对数据进行探索性分析,箱形图可以完成这一任务
    from gen_data import Gen_data
    from matplotlib import pyplot
    
    #绘制柱状图
    def drawBar(grades):
        xticks = ['A', 'B', 'C', 'D', 'E']
        gradeGroup = {}
        #对每一类成绩进行频数统计
        for grade in grades:
            gradeGroup[grade] = gradeGroup.get(grade, 0) + 1
        print (gradeGroup)
        #创建柱状图
        #第一个参数为柱的横坐标
        #第二个参数为柱的高度
        #参数align为柱的对齐方式,以第一个参数为参考标准
        pyplot.bar(range(5), [gradeGroup.get(xtick, 0) for xtick in xticks], align='center')
    
        #设置柱的文字说明
        #第一个参数为文字说明的横坐标
        #第二个参数为文字说明的内容
        pyplot.xticks(range(5), xticks)
    
        #设置横坐标的文字说明
        pyplot.xlabel('Grade')
        #设置纵坐标的文字说明
        pyplot.ylabel('Frequency')
        #设置标题
        pyplot.title('Grades Of Male Students')
        #绘图
        pyplot.show()
    
    #绘制饼形图
    def drawPie(grades):
        labels = ['A', 'B', 'C', 'D', 'E']
        gradeGroup = {}
        for grade in grades:
            gradeGroup[grade] = gradeGroup.get(grade, 0) + 1
        print(gradeGroup)
        #创建饼形图
        #第一个参数为扇形的面积
        #labels参数为扇形的说明文字
        #autopct参数为扇形占比的显示格式
        pyplot.pie([gradeGroup.get(label, 0) for label in labels], labels=labels, autopct='%1.1f%%')
        pyplot.title('Grades Of Male Students')
        pyplot.show()
    
    #绘制直方图
    def drawHist(heights):
        #创建直方图
        #第一个参数为待绘制的定量数据,不同于定性数据,这里并没有事先进行频数统计
        #第二个参数为划分的区间个数
        pyplot.hist(heights, 100)
        pyplot.xlabel('Heights')
        pyplot.ylabel('Frequency')
        pyplot.title('Heights Of Male Students')
        pyplot.show()
    
    #绘制累积曲线
    def drawCumulativeHist(heights):
        #创建累积曲线
        #第一个参数为待绘制的定量数据
        #第二个参数为划分的区间个数
        #normed参数为是否无量纲化
        #histtype参数为'step',绘制阶梯状的曲线
        #cumulative参数为是否累积
        pyplot.hist(heights, 20, normed=True, histtype='step', cumulative=True)
        pyplot.xlabel('Heights')
        pyplot.ylabel('Frequency')
        pyplot.title('Heights Of Male Students')
        pyplot.show()
    
    #绘制散点图
    def drawScatter(heights, weights):
        #创建散点图
        #第一个参数为点的横坐标
        #第二个参数为点的纵坐标
        pyplot.scatter(heights, weights)
        pyplot.xlabel('Heights')
        pyplot.ylabel('Weights')
        pyplot.title('Heights & Weights Of Male Students')
        pyplot.show()
    
    #绘制箱形图
    def drawBox(heights):
        #创建箱形图
        #第一个参数为待绘制的定量数据
        #第二个参数为数据的文字说明
        pyplot.boxplot([heights], labels=['Heights'])
        pyplot.title('Heights Of Male Students')
        pyplot.show()
    
    #绘制箱形图
    def drawBox(heights):
        #创建箱形图
        #第一个参数为待绘制的定量数据
        #第二个参数为数据的文字说明
        pyplot.boxplot([heights], labels=['Heights'])
        pyplot.title('Heights Of Male Students')
        pyplot.show()
    
    if __name__ == '__main__':
        gen_data = Gen_data.genData(Gen_data)
        #频数分析——性分析——柱状图
        #drawBar(gen_data.grades)
        #频数分析——定性分析——饼状图
        #drawPie(gen_data.grades)
        #频数分析——定量分析——直方图
        #drawHist(gen_data.heights)
        #频数分析——定量分析——累积曲线
        #drawCumulativeHist(gen_data.heights)
        #关系分析——散点图
        #drawScatter(gen_data.heights, gen_data.weights)
        #探索分析——箱形图
        drawBox(gen_data.heights)

    Gen_data类

    from numpy import array
    from numpy.random import normal
    
    class Gen_data:
        heights = array([])
        weights = array([])
        grades = array([])
        N = 1000
    
        def __init__(self):
            pass
    
        def init(self, heights, weights, grades):
            self.heights = heights
            self.weights = weights
            self.grades = grades
    
        def genData(self):
            heights = []
            weights = []
            grades = []
            for i in range(self.N):
                # 身高服从均值172,标准差为6的正态分布
                while True:
                    height = normal(172, 6)
                    if 0 < height:
                        break
                # 体重由身高作为自变量的线性回归模型产生,误差服从标准正态分布
                while True:
                    weight = (height - 80) * 0.7 + normal(0, 1)
                    if 0 < weight:
                        break
                # 分数服从均值为70,标准差为15的正态分布
                while True:
                    score = normal(70,15)
                    if 0 <= score and score <=100:
                        grade = 'E' if score < 60 else ('D' if score < 70 else ('C' if score < 80 else ('B' if score < 90 else 'A')))
                        break
    
                heights.append(height)
                weights.append(weight)
                grades.append(grade)
    
            self.init(self, array(heights), array(weights), array(grades))
            return self
    展开全文
  • Python描述性统计示例

    2019-10-21 14:09:40
    Python描述性统计示例 1 声明 本文的数据来自网络,部分代码也有所参照,这里做了注释和延伸,旨在技术交流,如有冒犯之处请联系博主及时处理。 2 描述性统计分析简介 描述性统计分析是指运用制表和分类,图形...

                                      Python描述性统计示例

    1 声明

    本文的数据来自网络,部分代码也有所参照,这里做了注释和延伸,旨在技术交流,如有冒犯之处请联系博主及时处理。

    2 描述性统计分析简介

    描述性统计分析是指运用制表和分类,图形以及计算概括性数据来描述数据特征的一种分析活动。因为本文采用的是Python语言,所以这里采用dataframe、pyplot里的方法来实现数据的描述性统计分析。

    3 描述下二手房数据

     

    import pandas as pd
    import warnings # current version of seaborn generates a bunch of warnings that we'll ignore
    warnings.filterwarnings("ignore")
    import seaborn as sns
    import matplotlib.pyplot as plt
    sns.set(style="white", color_codes=True)
    
    def sndhsVisual():
        ##该数据集有区域、房间数、大厅数、面积数、楼层、有无地铁、有无学区、价格等字段
        hsdata = pd.read_csv('input/sndHsPr.csv')
        #print(hsdata.head())
        ##print(hsdata.price.quantile([0.25,0.5,0.75,0.4,0.5,0.6,0.7,0.8,0.9,1.0]))
        ##打印各个段的中位数
        ##print(hsdata.price.quantile([0.25,0.5,0.75,1.0]))
        #定义区映射字段,方便图标展示
        dictDist = {
            u'chaoyang':"朝阳",
            u'dongcheng':"东城",
            u'fengtai':"丰台",
            u'haidian':"海淀",
            u'shijingshan':"石景山",
            u'xicheng':"西城"
        }
        #对dist(地区)字段应用APPLY方法替换
        hsdata.dist = hsdata.dist.apply(lambda x: dictDist[x])
    
        from scipy import stats
        import numpy as np
        ###print(type(stats.mode(hsdata.price)[0][0]))
    
        ##获取均值、中位数、标准差
        print(hsdata.price.agg(['mean','median','std']))
        #方法一通过stats.mode获取众数
        mode = np.array(stats.mode(hsdata.price)[0][0].tolist())
        mean_median=hsdata.price.agg(['mean', 'median', 'std']).as_matrix()
        merger = np.hstack((mode, mean_median))
        ###print(type(merger))  ##类型为ndarray
        ##获取众数、均值、中位数、标准差
        print(pd.Series(merger,index=['mode','mean', 'median', 'std']))
        print('###############')
        ##方法二通过value_counts下的index.get_level_values获取众数
        mode_n = hsdata['price'].value_counts(ascending=False).index.get_level_values(0).values[0]
        print(pd.Series([mode_n],index=['mode']).append(hsdata.price.agg(['mean','median','std'])))
        print('###############')
        ##大于0的,右偏数据
        print("偏度"+str(hsdata['price'].skew())) # 大于0的,右偏数据
        ##小于0的,分散的
        print("峰度"+str(hsdata['price'].kurtosis())) #小于0的,分散的
        ##print(hsdata.head(n=10)) # 这里可以指定n
        ##print(hsdata.info()) # 打印数据的信息(列名、数据行、为空记录数、数据类型)
        ##pd.set_option('display.width', 10)  # 150,设置打印宽度
        ##pd.set_option('display.max_colwidth', 2)
        hsdata.price = hsdata.price / 10000 # 以万为单位
        pd.set_option('display.float_format', lambda x: '%.2f' % x) #指定数据显示为保留小数点后2位
        #print(hsdata.describe(include =[np.number]))  ## 这里对所有数字类型的查看数据描述,这里分不出连续变量、离散变量
    
        ## 通过describe方法查看变量的统计信息,变量分析-连续性型
        print(hsdata[['area', 'price']].describe(include=[np.number])) ## 这里看连续型的更有意义
    
        ## 1 变量分析-离散型
        #print(hsdata.columns.values)
        for i in range(hsdata.columns.size):
            if hsdata.columns.values[i] not in ('area','price'):
                print("变量"+hsdata.columns.values[i]+"频次统计:")
                '''  
                df1 = pd.DataFrame(hsdata[hsdata.columns.values[i]].value_counts()).T
                df1.index=['value_cnt']
                print(df1)
                '''
                df = hsdata[hsdata.columns.values[i]].agg(['value_counts']) #注意这里的[],是Series到DataFrame的过程
                print(df.T)
                print('\n')
            else:
                continue
    
        ## 2 变量分析-连续型
        plt.rcParams['font.sans-serif']=['SimHei']
        sns.distplot(hsdata.price,color='green',bins=20,kde=True,rug = False) #kde表示是否画出一条高斯核密度估计线,这里的密度对应频次,rug=True表示rug表示在x轴上每个观测上生成的小细条
        plt.xlabel('房子单价 单位万/平米')
        plt.ylabel('密度')
        #plt.show()
        '''
        plt.hist(hsdata.price,bins=20)
        plt.show()'''
    
        ##按照地区的中位数排名并记录为新的DataFrame
        df_dist_price=pd.DataFrame(hsdata.groupby('dist').median().price.sort_values(ascending=True))
        ## 打印按照地区中位数升序的排名的索引值
        print('按照地区中位数升序的排名:'+str(df_dist_price.index.values))
    
    
        '''
        # 方法1,借助dataframe的category类型对指定的list排序
        data_tmp = hsdata[['dist', 'price']]
        data_tmp.dist = data_tmp.dist.astype("category")
        data_tmp.dist.cat.set_categories(["石景山", "丰台", "朝阳", "海淀", "东城", "西城"], inplace=True)
        ##dat1.dist.cat.set_categories(df_dist_price.index.values, inplace=True) 或者用这种方式替换
        sns.boxplot(x='dist', y='price', data=data_tmp)
        ##data_tmp.boxplot(column='price',by='dist') 或者调用DataFrame的boxplot方法
        plt.ylabel("房价单价(万元/平方米)")
        plt.xlabel("城区")
        plt.title("城区对房价的分组箱线图")
        plt.show()
        '''
    
        ## 方法2,借助sns.boxplot的order属性,这里的有两个分类变量加一个连续变量时X是其中一个,hue是另外个.
        data_dist = hsdata[['dist', 'price']]
        sns.boxplot(x='dist', y='price', data=data_dist, order=df_dist_price.index.values,hue=None)
        plt.ylabel("单位面积房价(万元/平方米)")
        plt.xlabel("城区")
        plt.title("城区对房价的分组箱线图")
        plt.show()
    
        #房间数量与价格的描述性统计
        data_rownum = hsdata[['roomnum','price']]
        df_rownum_price_sort = pd.DataFrame(data_rownum.groupby('roomnum').median().price.sort_values(ascending=True))
        sns.boxplot(x='roomnum',y='price',data=data_rownum,order=df_rownum_price_sort.index.values,hue=None)
        plt.ylabel("单位面积房价(万元/平方米)");
        plt.xlabel("房子室数")
        plt.title("房子室数对房价的分组箱线图")
        plt.show()
    
        # 厅数与价格的描述性统计
        ##print(hsdata.groupby('halls').halls.agg(['count']))
        #print(hsdata['halls'].value_counts())
        #print("厅最大值:"+str(hsdata['halls'].max()))
    
        data_halls = hsdata[['halls', 'price']]
    
    
        data_halls = hsdata[['halls', 'price']]
        df_halls_price_sort = pd.DataFrame(data_halls.groupby('halls').median().price.sort_values(ascending=True))
        sns.boxplot(x='halls', y='price', data=data_halls, order=df_halls_price_sort.index.values, hue=None)
        plt.ylabel("单位面积房价(万元/平方米)");
        plt.xlabel("房子厅数")
        plt.title("房子厅数对房价的分组箱线图")
        plt.show()
    
        '''
        print(data_halls.groupby('halls').median().price.sort_index(ascending=False))
        data_halls.halls = data_halls.halls.astype('category')
        data_halls.halls.cat.set_categories([0, 1, 2, 3], inplace=True)
        data_halls.boxplot(column='price', by='halls')
        plt.show()
        '''
    
        '''hsdata[['area', 'price']].plot.scatter(x='price',y='area')
        plt.show()'''
    
        data_floor = hsdata[['floor', 'price']]
        df_floor_price_sort = pd.DataFrame(data_floor.groupby('floor').median().price.sort_values(ascending=True))
        sns.boxplot(x='floor', y='price', data=data_floor, order=df_floor_price_sort.index.values, hue=None)
        plt.ylabel("单位面积房价(万元/平方米)");
        plt.xlabel("楼层")
        plt.title("楼层对房价的分组箱线图")
        plt.show()
    
    
        data_subway = hsdata[['subway', 'price']]
        df_subway_price_sort = pd.DataFrame(data_subway.groupby('subway').median().price.sort_values(ascending=True))
        sns.boxplot(x='subway', y='price', data=data_subway, order=df_subway_price_sort.index.values, hue=None)
        plt.ylabel("单位面积房价(万元/平方米)");
        plt.xlabel("地铁")
        plt.title("地铁对房价的分组箱线图")
        plt.show()
    
        data_school = hsdata[['school', 'price']]
        df_school_price_sort = pd.DataFrame(data_school.groupby('school').median().price.sort_values(ascending=True))
        sns.boxplot(x='school', y='price', data=data_school, order=df_school_price_sort.index.values, hue=None)
        plt.ylabel("单位面积房价(万元/平方米)");
        plt.xlabel("学校")
        plt.title("学校对房价的分组箱线图")
        plt.show()
    
        ##地区与学区中位数统计
        print(hsdata.groupby(['dist', 'school']).median().price.sort_index(ascending=False).unstack())
        hsdata.boxplot(column='price', by=['dist', 'school'], figsize=(12, 6))
        plt.show()
    
    
    
    if __name__ == '__main__':
        sndhsVisual()

     

    4 执行结果

    "D:\Program Files\Python37\python.exe" E:/dataVisual/Iris.py
    mean      61151.810919
    median    57473.000000
    std       22293.358147
    Name: price, dtype: float64
    mode      50000.000000
    mean      61151.810919
    median    57473.000000
    std       22293.358147
    dtype: float64
    ###############
    mode      50000.000000
    mean      61151.810919
    median    57473.000000
    std       22293.358147
    dtype: float64
    ###############
    偏度0.6794935869486859
    峰度-0.019305888544372873
              area    price
    count 16210.00 16210.00
    mean     91.75     6.12
    std      44.00     2.23
    min      30.06     1.83
    25%      60.00     4.28
    50%      78.83     5.75
    75%     110.52     7.61
    max     299.00    14.99
    变量dist频次统计:
                    丰台    海淀    朝阳    东城    西城   石景山
    value_counts  2947  2919  2864  2783  2750  1947


    变量roomnum频次统计:
                     2     3     1    4    5
    value_counts  7971  4250  3212  675  102


    变量halls频次统计:
                      1     2    0   3
    value_counts  11082  4231  812  85


    变量floor频次统计:
                  middle  high   low
    value_counts    5580  5552  5078


    变量subway频次统计:
                      1     0
    value_counts  13419  2791


    变量school频次统计:
                      0     1
    value_counts  11297  4913


    按照地区中位数升序的排名:['石景山' '丰台' '朝阳' '海淀' '东城' '西城']
    school    0    1
    dist            
    东城     6.71 7.75
    丰台     4.16 4.90
    朝阳     4.96 5.67
    海淀     6.02 7.56
    石景山    3.77 3.28
    西城     7.26 9.32

    Process finished with exit code 0
     

    结论:通过分析得到地区、有无地铁、是否学区房跟价格关联性较大。

    例子中的图标:

    城区房价箱线图

    室数房价箱线图

    厅数房价箱线图:

    楼层房价箱线图:

    地铁房价箱线图: 

    学校房价箱线图: 

     地区与学箱线图:

    展开全文
  • Python描述性统计

    2018-03-12 21:27:00
    1 描述性统计是什么?2 使用NumPy和SciPy进行数值分析 2.1 基本概念 2.2 中心位置(均值、中位数、众数) 2.3 发散程度(极差,方差、标准差、变异系数) 2.4 偏差程度(z-分数) 2.5 相关程度(协方差,相关...

    目录

    1 描述性统计是什么?
    2 使用NumPy和SciPy进行数值分析
      2.1 基本概念
      2.2 中心位置(均值、中位数、众数)
      2.3 发散程度(极差,方差、标准差、变异系数)
      2.4 偏差程度(z-分数)
      2.5 相关程度(协方差,相关系数)
      2.6 回顾
    3 使用Matplotlib进行图分析
      3.1 基本概念
      3.2 频数分析
        3.2.1 定性分析(柱状图、饼形图)
        3.2.2 定量分析(直方图、累积曲线)
      3.3 关系分析(散点图)
      3.4 探索分析(箱形图)
      3.5 回顾
    4 总结
    5 参考资料


    1 描述性统计是什么?

      描述性统计是借助图表或者总结性的数值来描述数据的统计手段。数据挖掘工作的数据分析阶段,我们可借助描述性统计来描绘或总结数据的基本情况,一来可以梳理自己的思维,二来可以更好地向他人展示数据分析结果。数值分析的过程中,我们往往要计算出数据的统计特征,用来做科学计算的NumPy和SciPy工具可以满足我们的需求。Matpotlob工具可用来绘制图,满足图分析的需求。


    2 使用NumPy和SciPy进行数值分析

    2.1 基本概念

      与Python中原生的List类型不同,Numpy中用ndarray类型来描述一组数据:

      from numpy import array
      from numpy.random import normal, randint
      #使用List来创造一组数据
      data = [1, 2, 3]
      #使用ndarray来创造一组数据
      data = array([1, 2, 3])
      #创造一组服从正态分布的定量数据
      data = normal(0, 10, size=10)
      #创造一组服从均匀分布的定性数据
      data = randint(0, 10, size=10)

    2.2 中心位置(均值、中位数、众数)

      数据的中心位置是我们最容易想到的数据特征。借由中心位置,我们可以知道数据的一个平均情况,如果要对新数据进行预测,那么平均情况是非常直观地选择。数据的中心位置可分为均值(Mean),中位数(Median),众数(Mode)。其中均值和中位数用于定量的数据,众数用于定性的数据。

      对于定量数据(Data)来说,均值是总和除以总量(N),中位数是数值大小位于中间(奇偶总量处理不同)的值:

      均值相对中位数来说,包含的信息量更大,但是容易受异常的影响。使用NumPy计算均值与中位数:

     from numpy import mean, median
     
     #计算均值
     mean(data)
     #计算中位数
     median(data)

     

      对于定性数据来说,众数是出现次数最多的值,使用SciPy计算众数:

     from scipy.stats import mode

    #计算众数 mode(data)

    2.3 发散程度(极差、方差、标准差、变异系数)

      对数据的中心位置有所了解以后,一般我们会想要知道数据以中心位置为标准有多发散。如果以中心位置来预测新数据,那么发散程度决定了预测的准确性。数据的发散程度可用极差(PTP)、方差(Variance)、标准差(STD)、变异系数(CV)来衡量,它们的计算方法如下:

      极差是只考虑了最大值和最小值的发散程度指标,相对来说,方差包含了更多的信息,标准差基于方差但是与原始数据同量级,变异系数基于标准差但是进行了无量纲处理。使用NumPy计算极差、方差、标准差和变异系数:

      from numpy import mean, ptp, var, std
      
      #极差
      ptp(data)
      #方差
      var(data)
      #标准差
      std(data)
      #变异系数
      mean(data) / std(data)

    2.4 偏差程度(z-分数)

      之前提到均值容易受异常值影响,那么如何衡量偏差,偏差到多少算异常是两个必须要解决的问题。定义z-分数(Z-Score)为测量值距均值相差的标准差数目:

      当标准差不为0且不为较接近于0的数时,z-分数是有意义的,使用NumPy计算z-分数:

     from numpy import mean, std
     
     #计算第一个值的z-分数
     (data[0]-mean(data)) / std(data)

      通常来说,z-分数的绝对值大于3将视为异常。

    2.5 相关程度

      有两组数据时,我们关心这两组数据是否相关,相关程度有多少。用协方差(COV)和相关系数(CORRCOEF)来衡量相关程度:

      协方差的绝对值越大表示相关程度越大,协方差为正值表示正相关,负值为负相关,0为不相关。相关系数是基于协方差但进行了无量纲处理。使用NumPy计算协方差和相关系数:

      from numpy import array, cov, corrcoef
      
      data = array([data1, data2])
      
      #计算两组数的协方差
      #参数bias=1表示结果需要除以N,否则只计算了分子部分
      #返回结果为矩阵,第i行第j列的数据表示第i组数与第j组数的协方差。对角线为方差
      cov(data, bias=1)
      
      #计算两组数的相关系数
      #返回结果为矩阵,第i行第j列的数据表示第i组数与第j组数的相关系数。对角线为1
      corrcoef(data)

    复制代码

    2.6 回顾

    方法 说明
    numpy array 创造一组数
    numpy.random normal 创造一组服从正态分布的定量数
    numpy.random randint 创造一组服从均匀分布的定性数
    numpy mean 计算均值
    numpy median 计算中位数
    scipy.stats mode 计算众数
    numpy ptp 计算极差
    numpy var 计算方差
    numpy std 计算标准差
    numpy cov 计算协方差
    numpy corrcoef 计算相关系数

     


    3 使用Matplotlib进行图分析

    3.1 基本概念

      使用图分析可以更加直观地展示数据的分布(频数分析)和关系(关系分析)。柱状图和饼形图是对定性数据进行频数分析的常用工具,使用前需将每一类的频数计算出来。直方图和累积曲线是对定量数据进行频数分析的常用工具,直方图对应密度函数而累积曲线对应分布函数。散点图可用来对两组数据的关系进行描述。在没有分析目标时,需要对数据进行探索性的分析,箱形图将帮助我们完成这一任务。

    3.2 频数分析

    3.2.1 定性分析(柱状图、饼形图)

      柱状图是以柱的高度来指代某种类型的频数,使用Matplotlib对成绩这一定性变量绘制柱状图的代码如下:

      from matplotlib import pyplot
      
      #绘制柱状图
      def drawBar(grades):
          xticks = ['A', 'B', 'C', 'D', 'E']
          gradeGroup = {}
          #对每一类成绩进行频数统计
          for grade in grades:
              gradeGroup[grade] = gradeGroup.get(grade, 0) + 1
          #创建柱状图
          #第一个参数为柱的横坐标
          #第二个参数为柱的高度
          #参数align为柱的对齐方式,以第一个参数为参考标准
          pyplot.bar(range(5), [gradeGroup.get(xtick, 0) for xtick in xticks], align='center')
     
          #设置柱的文字说明
          #第一个参数为文字说明的横坐标
          #第二个参数为文字说明的内容
          pyplot.xticks(range(5), xticks)
     
          #设置横坐标的文字说明
          pyplot.xlabel('Grade')
          #设置纵坐标的文字说明
          pyplot.ylabel('Frequency')
          #设置标题
          pyplot.title('Grades Of Male Students')
          #绘图
          pyplot.show()
     
      drawBar(grades)

      绘制出来的柱状图的效果如下:

      而饼形图是以扇形的面积来指代某种类型的频率,使用Matplotlib对成绩这一定性变量绘制饼形图的代码如下

     from matplotlib import pyplot
     
      #绘制饼形图
      def drawPie(grades):
          labels = ['A', 'B', 'C', 'D', 'E']
          gradeGroup = {}
          for grade in grades:
              gradeGroup[grade] = gradeGroup.get(grade, 0) + 1
         #创建饼形图
         #第一个参数为扇形的面积
         #labels参数为扇形的说明文字
         #autopct参数为扇形占比的显示格式
          pyplot.pie([gradeGroup.get(label, 0) for label in labels], labels=labels, autopct='%1.1f%%')
          pyplot.title('Grades Of Male Students')
          pyplot.show()
     
     drawPie(grades)

      绘制出来的饼形图效果如下:

    3.2.2 定量分析(直方图、累积曲线)

      直方图类似于柱状图,是用柱的高度来指代频数,不同的是其将定量数据划分为若干连续的区间,在这些连续的区间上绘制柱。使用Matplotlib对身高这一定量变量绘制直方图的代码如下:

      from matplotlib import pyplot
      
      #绘制直方图
      def drawHist(heights):
          #创建直方图
          #第一个参数为待绘制的定量数据,不同于定性数据,这里并没有事先进行频数统计
          #第二个参数为划分的区间个数
          pyplot.hist(heights, 100)
          pyplot.xlabel('Heights')
          pyplot.ylabel('Frequency')
          pyplot.title('Heights Of Male Students')
          pyplot.show()
     
      drawHist(heights)

      直方图对应数据的密度函数,由于身高变量是属于服从正态分布的,从绘制出来的直方图上也可以直观地看出来:

      使用Matplotlib对身高这一定量变量绘制累积曲线的代码如下:

     from matplotlib import pyplot
      
      #绘制累积曲线
      def drawCumulativeHist(heights):
         #创建累积曲线
         #第一个参数为待绘制的定量数据
         #第二个参数为划分的区间个数
         #normed参数为是否无量纲化
         #histtype参数为'step',绘制阶梯状的曲线
         #cumulative参数为是否累积
         pyplot.hist(heights, 20, normed=True, histtype='step', cumulative=True)
         pyplot.xlabel('Heights')
         pyplot.ylabel('Frequency')
         pyplot.title('Heights Of Male Students')
         pyplot.show()
     
     drawCumulativeHist(heights)

      累积曲线对应数据的分布函数,由于身高变量是属于服从正态分布的,从绘制出来的累积曲线图上也可以直观地看出来:

    3.3 关系分析(散点图)

      在散点图中,分别以自变量和因变量作为横纵坐标。当自变量与因变量线性相关时,在散点图中,点近似分布在一条直线上。我们以身高作为自变量,体重作为因变量,讨论身高对体重的影响。使用Matplotlib绘制散点图的代码如下:

    复制代码
    from matplotlib import pyplot
    
    #绘制散点图
    def drawScatter(heights, weights):
        #创建散点图
        #第一个参数为点的横坐标
        #第二个参数为点的纵坐标
        pyplot.scatter(heights, weights)
        pyplot.xlabel('Heights')
        pyplot.ylabel('Weights')
        pyplot.title('Heights & Weights Of Male Students')
        pyplot.show()
    
    drawScatter(heights, weights)
    复制代码

      我们在创建数据时,体重这一变量的确是由身高变量通过线性回归产生,绘制出来的散点图如下:

    3.4 探索分析(箱形图)

      在不明确数据分析的目标时,我们对数据进行一些探索性的分析,通过我们可以知道数据的中心位置,发散程度以及偏差程度。使用Matplotlib绘制关于身高的箱形图的代码如下:

     from matplotlib import pyplot
      
      #绘制箱形图
      def drawBox(heights):
          #创建箱形图
          #第一个参数为待绘制的定量数据
          #第二个参数为数据的文字说明
          pyplot.boxplot([heights], labels=['Heights'])
          pyplot.title('Heights Of Male Students')
         pyplot.show()
     
     drawBox(heights)

      绘制出来的箱形图中,包含3种信息:

    1. Q2所指的红线为中位数
    2. Q1所指的蓝框下侧为下四分位数,Q3所指的蓝框上侧为上四分位数,Q3-Q1为四分为差。四分位差也是衡量数据的发散程度的指标之一。
    3. 上界线和下界线是距离中位数1.5倍四分位差的线,高于上界线或者低于下界线的数据为异常值。

    3.5 回顾

    方法 说明
    bar 柱状图
    pie 饼形图
    hist 直方图&累积曲线
    scatter 散点图
    boxplot 箱形图
    xticks 设置柱的文字说明
    xlabel 横坐标的文字说明
    ylabel 纵坐标的文字说明
    title 标题
    show 绘图

    4 总结

      描述性统计是容易操作,直观简洁的数据分析手段。但是由于简单,对多元变量的关系难以描述。现实生活中,自变量通常是多元的:决定体重不仅有身高,还有饮食习惯,肥胖基因等等因素。通过一些高级的数据处理手段,我们可以对多元变量进行处理,例如特征工程中,可以使用互信息方法来选择多个对因变量有较强相关性的自变量作为特征,还可以使用主成分分析法来消除一些冗余的自变量来降低运算复杂度。


    5 参考资料

    1. 描述性统计
    2. 使用NumPy进行科学计算

     

    分类: 数据分析

    转载于:https://www.cnblogs.com/seven-M/p/8552074.html

    展开全文
  • 前言 本文的文字及图片来源于网络...描述性统计分析要对调查总体所有变量的有关数据做统计性描述,主要包括数据的频数分析、数据的集中趋势分析、数据离散程度分析、数据的分布以及一些基本的统计图形。 本文以数据集

    前言

    本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。

    PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取


    python免费学习资料以及群交流解答点击即可加入


    导读

    在进行数据分析时,一般要先对数据进行描述性统计分析,以发现其内在的规律,再选择进一步分析的方法。描述性统计分析要对调查总体所有变量的有关数据做统计性描述,主要包括数据的频数分析、数据的集中趋势分析、数据离散程度分析、数据的分布以及一些基本的统计图形。

    本文以数据集classdata为案例来说明如何计算数据探索过程中的各种数据指标,此数据集为某个班级的学生信息数据,包含姓名、性别、身高和体重,首先我们创建数据帧,代码如下:

    import pandas as pd
    import numpy as np
    classdata=pd.read_csv("D:/Pythondata/data/class.csv")
    classdata.head()
    

    运行上述程序,结果如图1所示,展示了数据集classdata的前5个观测样本。

     

    图1 数据集classdata的前5个观测

    图1 数据集classdata的前5个观测

    一、集中趋势

    1.算术平均值

    Pandas中计算变量均值的方法主要有2种,一是直接使用describle函数,一个是调用mean函数,代码如下所示:

    classdata.mean()
    

    运行程序,结果如下所示,可知年龄Age的均值为13.3,身高62.34,体重100。

    Age        13.315789
    Height     62.336842
    Weight    100.026316
    dtype: float64
    

    同样,我们调用describe,代码如下所示:

    classdata.describe()
    

    运行程序,结果如下图2所示,与调用mean函数的计算结果一致。

     

    图2 变量的均值

    图2 变量的均值

    2.几何平均数

    计算变量的几何平均值,需要调用Python库scipy,比如我们计算数据集classdata的变量Heigth的几何平均值,代码如下所示:

    from scipy import stats
    stats.gmean(classdata['Height'])
    

    运行程序,结果如下所示:

    62.133135310943146
    

    3.众数

    在Pandas中,我们可以直接调用mode函数来计算变量的众数,比如,我们计算变量Age的众数,代码如下所示:

    classdata['Age'].mode()
    

    运行程序后,结果如下所示

    12
    

    二、离散程度

    1.极差与四分位差

    极差也叫全距,是一组数据的最大值与最小值之差;四分位差是指第三分位数与第一分位数之差,也称为内距或四分间距。利用describe函数计算最大值、最小值以及分位数,即可计算极差和四分位差.

    stat = classdata.describe() #保存基本统计量
    stat.loc['range'] = stat.loc['max']-stat.loc['min'] #极差
    stat.loc['dis'] = stat.loc['75%']-stat.loc['25%'] #四分位数间距
    print(stat)
    

    运行上述程序,结果如下图3所示,变量Age的极差为5,四分位差为2.5,变量Heigth的极差为20.7,四分位差为7.65,变量Weight的极差为99.5,四分位差为28。

     

    图3 极差计算结果

    图3 极差计算结果

    2.平均离差

    平均离差是各变量值与其平均数之差的绝对值之和的平均数。Pandas中计算平均差的为mad函数,直接调用即可,比如我们计算各个变量的平均差,则代码如下所示:

    classdata.mad()
    

    运行程序后,其结果如下所示:

    Age    1.279778
    Height   4.069252
    Weight  17.343490
    dtype: float64
    

    3.标准差

    Pandas中计算标准差的方式有多种,其中函数describe和std均可计算,我们在前文中已经展示了describe函数的用法,在此不再累述,我们直接调用std函数即可,代码如下:

    classdata.std()
    

    运行上述程序,结果如下所示:

    Age    1.492672
    Height   5.127075
    Weight  22.773933
    dtype: float64
    

    4.离散系数

    离散系数通常是就标准差来计算的,因此,也称为标准差系数,它是一组数据的标准差与其对应的平均数之比,是衡量数据离散程度的相对指标。
    我们可以通过如下程序计算标准差系数,代码如下:

    stat2 = classdata.describe()
    stat2.loc['var'] = stat2.loc['std']/stat2.loc['mean'] 
    stat2
    

    运行上述程序,结果如下图4所示:

     

    图4 离散系数结果

    图4 离散系数结果

    三、分布状态

    1.偏态

    偏态是对分布偏斜方向和程度的测度,Pandas中可以直接调用skew函数计算变量的偏态系数,代码如下所示:

    classdata.skew()
    

    运行上述程序,结果如下所示,其中变量Age、Height和Weight的偏态系数分别为0.06、-0.26和0.18。

    Age    0.063612
    Height  -0.259670
    Weight  0.183351
    dtype: float64
    

    2.峰度

    峰度是分布集中趋势高峰的形状,Pandas中可以直接调用kurt函数计算变量的偏态系数,代码如下所示:

    classdata.kurt()
    

    运行上述程序,结果如下所示,其中变量Age、Height和Weight的偏态系数分别为-1.11、-0.14和0.68。

    Age   -1.110926
    Height  -0.138969
    Weight  0.683365
    dtype: float64
    

    四、相关分析

    1.散点图

    制散点图的方法很多,可以直接调用Pandas库的plot.scatter函数进行绘制,比如如下绘制散点图的程序。

    classdata.plot.scatter(x='Age', y='Height')
    

    运行上述程序,结果如图5所示,从散点图的数据分布可以看出,变量Height和Age呈现很强的相关关系。

     

    图5 变量Age和Height的散点图

    图5 变量Age和Height的散点图

     

    同样,我们也可以调用matplotlib库的pyplot函数进行散点图的绘制,代码如下所示:

    import matplotlib.pyplot as plt
    plt.scatter(classdata['Height'],classdata['Weight'] )
    plt.xlabel("Height")
    plt.ylabel("Weight")
    plt.show()
    

    运行上述程序,结果如下图6所示,从散点图的数据分布可以看出,变量Height和Weight同样呈现很强的相关关系。

     

    图6 变量Height和Weight的散点图

    图6 变量Height和Weight的散点图

    2.相关系数

    在Pandas中可以直接调用corr函数来计算变量之间的相关系数,如下程序:

    classdata.corr()
    

    运行程序后,结果如图7所示:

     

    图7 变量之间的相关系数

    图7 变量之间的相关系数

     

    除了计算相关系数矩阵之外,我们还可以绘制相关系数矩阵图,此处需调用seaborn库进行绘制,代码如下所示:

    import seaborn as sns
    %matplotlib inline
    # calculate the correlation matrix
    corr = classdata.corr()
    # plot the heatmap
    sns.heatmap(corr,xticklabels=corr.columns,yticklabels=corr.columns)
    

    运行上述程序之后,结果如图8所示:

     

    图8 相关系数矩阵图

    图8 相关系数矩阵图

    展开全文
  • 描述性统计分析

    2021-04-03 19:17:50
    描述性统计分析是数据分析的第一步,有人称为探索性数据分析。在一个数据模型开发的过程中,探索数据贯穿始终,通常占用整个模型开发的40%。本篇文章将系统介绍Python描述性统计分析以及绘图的相关技巧。
  • 描述性统计分析一,简介二,输入三,处理输出(一)集中趋势分析1.众数2.中位数3.均值 一,简介 描述性统计分析,是统计学当中的一种分析方法,它是对原始数据进行概括和观察后的一种描述,一般分为集中趋势分析和...
  • 描述性统计分析是关于数据的描述和汇总。它使用两种主要方法: 定量方法以数值方式描述和汇总数据。 可视化方法通过图表,曲线图,直方图和其他图形来说明数据。 一般在数据分析的过程中,拿到数据不会去直接去...
  • 描述性统计分析(Description Statistics)是通过图表或数学方法,对数据...提到用python来进行描述性统计分析,第一反应就是用:dataframe.describe(), 我们不妨用一组数据来展示: 读取数据 df = pd.read_csv(...
  • 描述性统计分析与可视化1 变量的度量类型2 针对变量类型逐个击破2.1 名义变量2.2 连续变量2.2.1 连续数据的位置2.2.2 数据的分散程度2.2.3 偏态与峰度3 描述统计总结与实践3.1 描述统计总结3.2 python实现3.2.1 加载...
  • Python实现数据的描述性统计分析

    千次阅读 2019-07-27 14:07:12
    python代码: import numpy as np from scipy import stats import pandas as pd df=pd.DataFrame(np.random.randn(5,6),index=[1,2,3,4,5],columns=["a","b","c","d","e","f"]) print("最大值:",np.max(df)) print...
  • 2 使用NumPy和SciPy进行数值分析2.1 基本概念1 from numpy importarray2 from numpy.random importnormal, randint3 #使用List来创造一组数据4 data = [1, 2, 3]5 #使用ndarray来创造一组数据6 data = array([1, 2, ...
  • 使用Python进行描述性统计 目录 1 描述性统计是什么? 2 使用NumPy和SciPy进行数值分析  2.1 基本概念  2.2 中心位置(均值、中位数、众数)  2.3 发散程度(极差,方差、标准差、变异系数)  2.4 偏差程度(z...
  • 利用Python进行描述性统计

    万次阅读 2018-01-22 12:44:50
    统计学分为描述统计学和推断统计学,描述统计学是使用特定的数字或图表来体现数据的集中程度或离散程度,如平均数、中位数、众数、方差、标准差... 利用Python进行描述性统计分析,需要用到numpy库和scipy库: fro
  • 描述性统计是数学统计分析里的一种方法,通过这种统计方法,能分析出数据整体状况以及数据间的关联。在这部分里,将用股票数据为样本,以matplotlib类为可视化工具,讲述描述性统计里常用指标的计算方法和含义。 1 ...
  • 文章目录 1、加载相关库和数据集 2、数据集数据概览 2.1 数据总体概览 2.2 使用主要信息构造DataFrame 2.3 构造后的数据概览 3、使用相关函数进行描述性统计分析 3.1 频率和频数分析 3.2 数据的集中趋势分析 3.3 ...
  • 目录1 描述性统计是什么?2 使用NumPy和SciPy进行数值分析2.1 基本概念2.2 中心位置(均值、中位数、众数)2.3 发散程度(极差,方差、标准差、变异系数)2.4 偏差程度(z-分数)2.5 相关程度(协方差,相关系数)...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 426
精华内容 170
关键字:

python描述性统计分析

python 订阅