基于Python的大数据分析基础(九)--- 数据分析

8 数据分析

   8.1 基本统计分析(描述性统计分析)

     一般统计某个变量的最小值,第一个四分位值,中值,第三个四分位值,以及最大值

    均值(Mean),中位数(Median)和众数(Mode)

     其中均值和中位数用于定量的数据,众数用于定性的数据

     对于定 量数据( Data )来说,均值是总和除以总量 N,中位数是数值大小位于中间(奇偶总量处理不同)的值,均值相对中位位数来说,包含的信息量更大,但是容易受异常的影响。

      描述性统计分析函数为 describe 。该函数返回值有均值、标准差、最大 值、最小值、分位数等。括号中可以带一些参数,

      size计数(此函数不需要括号),sum()求和,mean()平均值, var()方差,std()标准差,median()中位数,mode()众数

# -*- coding: UTF-8 -*-
'''
@Author :Jason
数据分析中的一些特殊值,比如平均值,最大值,方差,标准差等等
'''
def BasicInfo():
    import pandas as pd
    df = pd.read_excel(r"./files/i_nuc.xls",sheet_name=6)
    #sheet_name可以写具体sheet名字符串,也可以写第几个,注意从0开始
    # print(df.head())
    # print(df["英语"].describe())
    '''
    count    20.000
    mean     72.550
    std       7.178
    min      60.000
    25%      66.000
    50%      73.500
    75%      76.250
    max      85.000
    Name: 英语, dtype: float64
    '''
    # print(df.describe()) #DF的各列相应的数据
    '''
           Unnamed: 0            学号            班级  ...         数分         高代         解几
        count    20.00000  2.000000e+01  2.000000e+01  ...  20.000000  20.000000  20.000000
        mean      9.50000  2.308024e+09  2.308024e+07  ...  62.850000  62.150000  69.650000
        std       5.91608  8.399160e+01  8.522416e-01  ...   9.582193  15.142394  10.643876
        min       0.00000  2.308024e+09  2.308024e+07  ...  40.000000  23.000000  44.000000
        25%       4.75000  2.308024e+09  2.308024e+07  ...  60.750000  56.750000  66.750000
        50%       9.50000  2.308024e+09  2.308024e+07  ...  63.500000  65.500000  71.000000
        75%      14.25000  2.308024e+09  2.308024e+07  ...  69.250000  71.250000  77.000000
        max      19.00000  2.308024e+09  2.308024e+07  ...  78.000000  90.000000  83.000000
    [8 rows x 9 columns]
    '''
    # print(df["解几"].size)   #这里的size 没有括号()
    # #20
    # print(df["解几"].var()) #最大值max(),最小值min(),和sum(),平均值mean(),var()方差,std()标准差

    #这里处理用mean()来算样本均值
    import numpy as np
    print(np.mean(df["数分"]),np.average(df["数分"]),df["数分"].mean()) #62.85 62.85 62.85

if __name__ == "__main__":
    BasicInfo()

8.2 分组分析

    根据字段将分析对象分成不同的部分,以对比分析各组之间差异性的一种方法
    常用的统计指标: 计数,求和,平均值
    命令:
        df.groupby(by=["分类1","分类2",...])["被统计的列"].agg({列别名1:统计函数1,列别名:统计函数2,...})

        其中agg最后不好写成字典格式 FutureWarning: using a dict with renaming is deprecated and will be removed

# -*- coding: UTF-8 -*-
'''
@Author :Jason
df.groupby(by=["分类1","分类2",...])["被统计的列"].agg({列别名1:统计函数1,列别名:统计函数2,...})
    by 表示用于分组的列
    [] 表示用于统计的列
    .agg 表示统计别名显示统计值的名称,统计函数用于统计数据。常用size,sum,mean
    提示,agg好像会逐渐取消,所以还是一个个算比较好
'''
import pandas as pd
import numpy as np
class Groupby:
    def __init__(self):
        self.df = pd.read_excel(r'./files/i_nuc.xls',sheet_name=6)

    def printp(self):
        afterGbInfo1 = self.df.groupby(by="班级")["军训","英语","体育","性别"].mean()
        # print(afterGbInfo1)
        '''
                      军训        英语        体育
            班级                                       
            23080242  81.333333  70.833333  73.000000
            23080243  85.500000  71.000000  60.666667
            23080244  64.375000  75.000000  75.375000
        结合实例理解: 先根据班级分组,再算出指定科目的平均分
        '''
        afterGbInfo2 = self.df.groupby(by=["班级", "性别"])["军训", "英语", "体育"].mean()
        # print(afterGbInfo2)
        '''
                            军训         英语         体育
            班级      性别                                 
            23080242 女   83.500000  69.500000  89.500000
                     男   80.250000  71.500000  64.750000
            23080243 女   86.000000  69.333333  42.666667
                     男   85.000000  72.666667  78.666667
            23080244 女   46.500000  74.500000  77.000000
                     男   70.333333  75.166667  74.833333
        结合实例理解:先按班级分组,再按性别分组,再算指定列的平均值
        '''
        afterGbInfo3 = self.df.groupby(["班级", "性别"])["军训"].agg({"总分":np.sum,"人数":np.size})
        print(afterGbInfo3)
        '''
                      总分  人数
        班级       性别         
        23080242 女   167   2
                 男   321   4
        23080243 女   258   3
                 男   255   3
        23080244 女    93   2
                 男   422   6
        '''

        afterGbInfo4 = self.df.groupby(["班级", "性别"])["军训", "英语", "体育", "性别"].agg({"总分": np.sum, "人数": np.size})
        # print(afterGbInfo4)
        '''
                          总分           人数      
                  军训   英语   体育 体育 军训 英语
        班级       性别                        
        23080242 女   167  139  179  2  2  2
                 男   321  286  259  4  4  4
        23080243 女   258  208  128  3  3  3
                 男   255  218  236  3  3  3
        23080244 女    93  149  154  2  2  2
                 男   422  451  449  6  6  6
        数组这样太多反而更复杂了,
        '''



if __name__ == "__main__":
    GB = Groupby()
    GB.printp()

8.3 分布分析  cut==>分组最好理解
   将数据(定量数据)进行等距 或 不等距的分组,研究各组分布规律的一种分析方法

# -*- coding: UTF-8 -*-
'''
@Author :Jason
@Date   :2019/11/17 16:56
@Desc   :Crate By Jason
'''
import pandas as pd
import numpy

def Cut():
    df = pd.read_excel("./files/i_nuc.xls",sheet_name=6)
    df["total"] = df["英语"] + df["体育"] + df["军训"] + df["数分"] + df["高代"] + df["解几"]
    # print(df["total"].head())
    '''
        0     354
        1     370
        2     391
        3     400
        4     407
        Name: total, dtype: int64
    '''
    # print(df["total"].describe())
    '''
    count     20.000000
    mean     413.250000
    std       36.230076
    min      354.000000
    25%      386.000000
    50%      416.500000
    75%      446.250000
    max      457.000000
    Name: total, dtype: float64
    '''
    bins = [df["total"].min()-1,400,450,df["total"].max()+1]
    labels = ["及格","良好","优秀"]
    newDf = pd.cut(df["total"],bins=bins,labels = labels)
    df["等级"] = newDf
    # print(df.head())
    '''
   Unnamed: 0          学号        班级  姓名 性别  英语  体育  军训  数分  高代  解几  total  等级
    0           0  2308024241  23080242  成龙  男  76  78  77  40  23  60    354  及格
    1           1  2308024244  23080242  周怡  女  66  91  75  47  47  44    370  及格
    2           2  2308024251  23080242  张波  男  85  81  75  45  45  60    391  及格
    3           3  2308024249  23080242  朱浩  男  65  50  80  72  62  71    400  及格
    4           4  2308024219  23080242  封印  女  73  88  92  61  47  46    407  良好
    '''
    print(df.groupby(by = ["等级"])["total"].agg(numpy.size))
    '''
    等级
    及格    7
    良好    9
    优秀    4
    Name: total, dtype: int64
    '''
if __name__ == "__main__":
    Cut()

8.4 交叉分析
    分析两个或者两个以上分组变量之间的关系,以交叉表形式进行变量间关系的对比分析,一般分为定量、定量分组交叉;
    定量、定性分组分析;定性、定性分组交叉

# -*- coding: UTF-8 -*-
'''
@Author :Jason
交叉分析
 分析两个或者两个以上分组变量之间的关系,以交叉表形式进行变量间关系的对比分析,一般分为定量、定量分组交叉;
        定量、定性分组分析;定性、定性分组交叉
pivot_table(values,index,colnums,aggfunc,fill_value)
    values 数据透视表中的值
    index 数据透视中的行
    colnums 数据透视表的列
    aggfunc 表示统计函数
    fill_value 表示NA缺失值的同一替换
  返回值:数据透视表的结果
注意:默认对所有的数据列进行透视,非数据列会自动删除,例如:性别
'''
from pandas import read_excel
from pandas import pivot_table
import numpy
import pandas as pd

def pivot_table_Exanple():
    df = read_excel(r'./files/i_nuc.xls',sheet_name=6)
    info1 = df.pivot_table(index=["班级","姓名"]) #透视所有数据列,性别列被自动删除
    # print(info1)
    '''
                Unnamed: 0    体育  军训    学号     数分  英语  解几  高代
    班级      姓名                                                 
    23080242 周怡            1  91  75  2308024244  47  66  44  47
             封印            4  88  92  2308024219  61  73  46  47
             张波            2  81  75  2308024251  45  85  60  45
             成龙            0  78  77  2308024241  40  76  60  23
             朱浩            3  50  80  2308024249  72  65  71  62
             迟培            5  50  89  2308024201  71  60  71  76
    23080243 余皓            8  67  85  2308024326  65  66  71  61
             李上初          10  90  84  2308024342  60  76  60  66
             李华            6  61  84  2308024347  61  67  78  65
             李嘉            9   0  90  2308024320  60  62  77  67
             郭窦           11  67  84  2308024310  64  79  79  64
             陈田            7  79  86  2308024307  69  76  69  40
    23080244 周路           14  80   0  2308024446  61  76  80  74
             姜毅涛          12  71   0  2308024435  61  77  76  73
             李侧通          17  96  91  2308024428  69  64  77  60
             李大强          16  76  77  2308024433  78  79  70  70
             李晓亮          19  60  85  2308024422  72  85  83  72
             林建祥          15  72  81  2308024421  63  72  75  90
             王慧           18  74  93  2308024402  70  73  75  71
             赵宇           13  74  88  2308024432  68  74  71  70
    '''
    info2 = df.pivot_table(["军训","英语","体育"],index=["班级","姓名"])
    # print(info2)
    '''
                  体育  军训  英语
    班级       姓名             
    23080242 周怡   91  75  66
             封印   88  92  73
             张波   81  75  85
             成龙   78  77  76
             朱浩   50  80  65
             迟培   50  89  60
    23080243 余皓   67  85  66
             李上初  90  84  76
             李华   61  84  67
             李嘉    0  90  62
             郭窦   67  84  79
             陈田   79  86  76
    23080244 周路   80   0  76
             姜毅涛  71   0  77
             李侧通  96  91  64
             李大强  76  77  79
             李晓亮  60  85  85
             林建祥  72  81  72
             王慧   74  93  73
             赵宇   74  88  74
    '''
    df["total"] = df["英语"] + df["体育"] + df["军训"] + df["数分"] + df["高代"] + df["解几"]
    df["等级"] = pd.cut(df["total"],bins=[df["total"].min()-1,400,450,df["total"].max()+1],labels = ["及格","良好","优秀"])
    info3 = df.pivot_table(values=["total"],index=["等级"],columns=["性别"],aggfunc=[numpy.size,numpy.mean])
    print(info3)
    '''
            size         mean            
            total        total            
    性别     女  男   女           男
    等级                                 
    及格     3  4  365.666667  375.750000
    良好     3  6  420.000000  430.333333
    优秀     1  3  456.000000  455.666667
    '''

if __name__ == "__main__":
    pivot_table_Exanple()


8.5 结构分析
    在分组分析以及交叉分析的基础之上,计算各组成部分所占的比重,进而分析总体的内部特征的一种交叉分析方法
    这里主要指定性分组,定性分组一般看结构,它的重点在于计算个组成部分占总体的比重.

# -*- coding: UTF-8 -*-
'''
@Author :Jason
结构分析
'''
import numpy as np
import pandas as pd
from pandas import read_excel

def StructuralAnaly():
    df = read_excel(r'./files/i_nuc.xls',sheet_name="Sheet7")
    df["total"] = df["英语"] + df["体育"] + df["军训"] + df["数分"] + df["高代"] + df["解几"]
    df_pt = df.pivot_table(values=["total"],index=["班级"],columns=["性别"],aggfunc=[np.sum])
    # print(df_pt)
    '''
                sum      
                total      
    性别       女     男
    班级                  
    23080242   777  1562
    23080243  1209  1270
    23080244   827  2620
    '''
    # print(df_pt.sum())
    '''
                性别
    sum  total  女     2813
                男     5452
    dtype: int64
    '''
    # print(df_pt.sum(axis=1)) #按列统计
    '''
        班级
    23080242    2339
    23080243    2479
    23080244    3447
    dtype: int64
    '''
    # print(df_pt.div(df_pt.sum(axis=1),axis=0)) #按列占比
    '''
                   sum          
                   total          
    性别         女         男
    班级                          
    23080242  0.332193  0.667807
    23080243  0.487697  0.512303
    23080244  0.239919  0.760081
    '''
    print(df_pt.div(df_pt.sum(axis=0),axis=1)) #按行占比
    '''
                  sum          
                  total          
    性别        女         男
    班级                          
    23080242  0.276218  0.286500
    23080243  0.429790  0.232942
    23080244  0.293992  0.480558
    '''

if __name__ == "__main__":
   StructuralAnaly()

8.6 相关分析
  是否存在某种依赖关系==> 是否线性相关 ==>

两个变量 ==> 散点图.看变量之间是否符合某个变化规律

多个变量间 ==> 散点矩阵图 + 各变量间的散点图

                                     ||

相关系数:

Pearson相关系数:一般用于分析两个变量间的关系,要去连续变量的取值服从正态分布

Spearman秩相关系数和判定系数(等级相关系数):不符合Peason的

        

# -*- coding: UTF-8 -*-
'''
@Author :Jason
相关分析
DataFrame.corr()  ==  返回DataFrame
    计算每列两两之间的相似度
Series.corr(other) == 返回一个数值,大小表示相关度
    计算该序列与传入的序列之间的相关度
'''
import numpy as np
import pandas as pd

def LinerRelated():
    df = pd.read_excel(r'./files/i_nuc.xls',sheet_name="Sheet7")
    linerNum = df["高代"].corr(df["数分"]) #计算两列之间的相关度
    # print(linerNum) #0.6077408233260108 查表可知中度相关
    linerInfo = df.loc[:,["英语","体育","军训","解几","数分","高代"]].corr()
    print(linerInfo)
    '''
              英语       体育      军训        解几        数分        高代
        英语  1.000000  0.375784 -0.252970  0.027452 -0.129588 -0.125245
        体育  0.375784  1.000000 -0.127581 -0.432656 -0.184864 -0.286782
        军训 -0.252970 -0.127581  1.000000 -0.198153  0.164117 -0.189283
        解几  0.027452 -0.432656 -0.198153  1.000000  0.544394  0.613281
        数分 -0.129588 -0.184864  0.164117  0.544394  1.000000  0.607741
        高代 -0.125245 -0.286782 -0.189283  0.613281  0.607741  1.000000
    '''
if __name__ == '__main__':
    LinerRelated()

8.7 实际案例:电商数据分析

数据如图,对各产品之间的销售情况做相关分析

                        

# -*- coding: UTF-8 -*-
'''
@Author :Jason
数据分析电商案例
'''
from pandas import read_excel
import pandas as pd
import numpy as np
class ECommerce(object):
    def __init__(self):
        self.df = read_excel(r"./files/i_nuc.xls",sheet_name=0)

    def analy(self):
        df = self.df
        linerRelat = df.loc[:6].corr()
        # print(linerRelat)
        '''
                    优盘      电子表      电脑支架     插座     电池        音箱        鼠标     usb数据线     手机充电线     键盘  
        优盘       1.000000   -0.164718 -0.300081  0.823515  0.141810  0.348761  0.178440   -0.096369 -0.466076  0.537446
        电子表     -0.164718  1.000000  0.710849  0.032032 -0.072249  0.079744  0.523711   0.453210  0.178404 -0.227296  
        电脑支架   -0.300081  0.710849  1.000000  0.038194 -0.460049 -0.291185  0.190518   -0.221613 -0.236130 -0.530569  
        插座       0.823515  0.032032  0.038194  1.000000  0.345195  0.376368  0.449717   -0.227473 -0.501474  0.622129  
        电池       0.141810  -0.072249 -0.460049  0.345195  1.000000  0.672230  0.601558   0.357665  0.316784  0.845828  
        音箱       0.348761  0.079744  -0.291185  0.376368  0.672230  1.000000  0.809477   0.124411  0.147405  0.756389  
        鼠标       0.178440  0.523711   0.190518  0.449717  0.601558  0.809477  1.000000    0.160018  0.262633  0.624991  
        usb数据线  -0.096369  0.453210 -0.221613 -0.227473  0.357665  0.124411  0.160018    1.000000  0.483424  0.057932  
        手机充电线  -0.466076  0.178404 -0.236130 -0.501474  0.316784  0.147405  0.262633   0.483424  1.000000  0.174410 
        键盘       0.537446  -0.227296 -0.530569  0.622129  0.845828  0.756389  0.624991   0.057932  0.174410  1.000000
        '''

        #观察个数据之间的关系系数,寻找突破口
        #...没看出结论,案例说的是 键盘鼠标电池之间的关联比较大

if __name__ == "__main__":
    EC = ECommerce()
    EC.analy()

参照:《基于Python的大数据分析基础及实战》 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值