描述性统计分析概述
- python原始的数据类型:字符型、逻辑型、数值型、复数型。
- 从统计方面来看,数据分为三种类型:名义型、等级型、连续型
- 名义变量:性别、民族等,没有顺序之分,名义变量不一定是字符类型
- 等级变量:有顺序之分,可以是字符也可是数值型,差值没有意义。
- 连续变量:只能是数值型,连续变量的差值是有意义的。
注:连续变量可以当作等级变量用,等级变量也可以当成连续变量,连续变量会产生很多噪音,分组换为等级变量会消除噪音。
- 在统计学中,名义变量只有两个统计量:频次和百分比
- 在统计学中,连续变量的统计量:
- 集中趋势(位置):均值、中位数、众数
- 离散程度(分散程度):方差、标准差、极差、四分位差等。
- 偏离程度:右偏函数、对称函数、左偏函数(少见)
注:离散程度即离开均值的程度,可以通过观察图像得知。 5. 分布函数 - 正态分布:对称函数,如人的身高等。 - 泊松分布:如网页点击量、队伍长度。 - 伽码分布:如灾难对我们造成的经济损失。 - 对数正态分布:是右偏最严重的函数,如收入、利润等。
- | 描述性统计 | 建模、预测 |
---|
右偏严重的函数(对数正态分布、伽马分布) | 选用中位数为统计量 | 对原始数据取对数,使其成为对数正态分布 | 右偏不严重的函数(正态分布、泊松分布) | 选用均值为统计量 | 选用正态分布函数 |
- 判断函数是否右偏:
(1)利用数据画直方图,中位数<均值则右偏 (2)计算偏度,偏度大于1的右偏严重。
示例
查看北京和上海的收入分布情况
步骤一:判断是否右偏严重。 做描述性统计分析的话,右偏函数选用中位数作为集中水平,右偏不严重的函数选用均值作为集中水平。 步骤二:看离散程度,一般是标准差。
描述统计总结
- 分类变量:(维度指标)指时间、年度等,分类变量又包括名义变量和等级变量。
- 连续变量:(度量指标)利润、收入、利润率
- | 分析 | 可视化 |
---|
一个分类变量 | value_counts() | 柱形图 | 两个分类变量 | pd.crosstab(snd.districts,snd.school) | 标准化堆叠柱形图 | 一个连续变量 | agg(['mean','std','skew']) | 直方图 | 一个分类+一个连续 | snd.price.groupby(snd.district).sum() | 柱形图、条形图、盒须图 | 两个分类+一个连续 | snd.pivot_table(values='',index='',columns=',aggfunc=np.mean) | 分类柱形图 |
一个分类变量
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import os
import matplotlib
os.chdir(r'E:\数据与脚本\4describe')
snd = pd.read_csv('SndHsPr.csv')
snd
district = {'fengtai':'丰台区','haidian':'海淀区','chaoyang':'朝阳区','dongcheng':'东城区','xicheng':'西城区','shijingshan':'石景山区'}
snd['district'] = snd.dist.map(district)
snd.district.value_counts()
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['Simhei']
mpl.rcParams['axes.unicode_minus'] = False
snd.district.value_counts().plot(kind='bar')
一个连续变量
snd.price.mean()
snd.price.median()
snd.price.std()
snd.price.skew()
snd.price.quantile([0.01,0.5,0.99])
snd.price.agg(['mean','median','sum','std','skew'])
snd.price.hist(bins=40)
两个分类变量
sub_sch = pd.crosstab(snd.district,snd.school)
sub_sch
- 堆叠柱形图:只能看出样本量,不能对比样本占比情况。
sub_sch.plot(kind='bar',stacked=True)
- 标准化堆叠柱形图:标准化堆叠柱形图可以看出占比情况,样本量的大小用柱子的胖瘦代替。
sub_sch["sum1"]=sub_sch.sum(1)
sub_sch = sub_sch.div(sub_sch.sum1,axis = 0)
from stack2dim import *
stack2dim(snd,i='district',j='school')
分类变量和连续变量
按照分类变量分组对连续变量求统计量
snd.price.groupby(snd.district),mean().plot(kind='bar')
snd.price.groupby(snd.district).mean().sort_values(ascending=True).plot(kind='barh')
- 分类盒须图:比较不同分类水平上的连续变量变化情况(比较中位数)
sns.boxplot(x = 'district', y = 'price', data = snd)
汇总表:两个分类变量+一个连续变量
snd.pivot_table(values='price', index='district', columns='school', aggfunc=np.mean)
snd.pivot_table(values='price', index='district', columns='school', aggfunc=np.mean).plot(kind = 'bar')
|