快速了解数据分布的常用方法

Catalogue
  1. 1. 前言
  2. 2. 分布分析
    1. 2.1. 极差
    2. 2.2. 分组
    3. 2.3. 频率统计
    4. 2.4. 绘制直方图
    5. 2.5. 字段定性
    6. 2.6. 可视化
  3. 3. 总结

摘要
介绍几种数据分析中对于数据分布的常用方式,包括极差、频率以及分组的使用实例~

前言

分布分析是数据特征分析中极为常用的一种方法。在数据质量得到保证的前提下,通过绘制图表、计算某些统计量等手段对数据的分布特征和贡献度进行分析,分布分析能够揭示数据的分布特征和分布类型,对于定量数据,可以做出频率分布表、绘制频率分布直方图显示分布特征;对于定性数据,可用饼图和条形图显示分布情况。

分布分析

分布分析 → 研究数据的分布特征和分布类型,分定量数据、定性数据区分基本统计量

一般通过以下三种方式来进行分布分析:

极差 / 频率分布情况 / 分组组距及组数

下面通过一个案例对分布分析进行实操应用:

1
2
3
4
5
6
# 导入模块

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 读取数据

data = pd.read_csv('E:/深圳罗湖二手房信息.csv',engine = 'python')

# 绘制散点图

plt.figure(figsize = (12,8))
plt.scatter(data['经度'],data['纬度'],
s = data['房屋单价']/400,
c = data['参考总价'],
cmap = 'Reds',
alpha = 0.6)
plt.grid()
data.head()
房屋编码 小区 朝向 房屋单价 参考首付 参考总价 经度 纬度
0 605093949 大望新平村 南北 5434 15.0 50.0 114.180964 22.603698
1 605768856 通宝楼 南北 3472 7.5 25.0 114.179298 22.566910
2 606815561 罗湖区罗芳村 南北 5842 15.6 52.0 114.158869 22.547223
3 605147285 兴华苑 南北 3829 10.8 36.0 114.158040 22.554343
4 606030866 京基东方都会 西南 47222 51.0 170.0 114.149243 22.554370

图表解读:点越大代表房屋的单价越高,颜色越深代表总价越高

极差

本案例中,可通过极差中看到销售的稳定程度

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 极差

def d_range(df,*cols):
lst = []
for col in cols:
crange = df[col].max() - df[col].min()
lst.append(crange)
return(lst)

key1 = '参考总价'
key2 = '参考首付'

dr = d_range(data,key1,key2)
print('%s极差为:%.2f \n%s极差为:%.2f' % (key1,dr[0],key2,dr[1]))
1
2
参考总价极差为:175.00 
参考首付极差为:52.50

分组

1
2
3
4
5
6
7
8
9
10
11
# 频率分布情况

data[key1].hist(bins = 8,edgecolor = 'k')


# 分组区间

gcut = pd.cut(data[key1],10,right=False)
gcut_count = gcut.value_counts(sort = False)
data['%s分组区间' % key1] = gcut.values
data.head()

图表解读:可以看出主要集中在160万以上,60万以下。

频率分布的划分方式:直方图可以快速的看到它的排列情况,把它拆分:分组划分

房屋编码 小区 朝向 房屋单价 参考首付 参考总价 经度 纬度 参考总价分组区间
0 605093949 大望新平村 南北 5434 15.0 50.0 114.180964 22.603698 [42.5, 60.0)
1 605768856 通宝楼 南北 3472 7.5 25.0 114.179298 22.566910 [25.0, 42.5)
2 606815561 罗湖区罗芳村 南北 5842 15.6 52.0 114.158869 22.547223 [42.5, 60.0)
3 605147285 兴华苑 南北 3829 10.8 36.0 114.158040 22.554343 [25.0, 42.5)
4 606030866 京基东方都会 西南 47222 51.0 170.0 114.149243 22.554370 [165.0, 182.5)

频率统计

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 区间出现频率

r_zj = pd.DataFrame(gcut_count)
r_zj.rename(columns = {gcut_count.name:'参考总价频数'},inplace = True)


# 计算频率

r_zj['频率'] = r_zj['参考总价频数'] / r_zj['参考总价频数'].sum()


# 计算累计频率

r_zj['累计频率'] = r_zj['频率'].cumsum()


# 以百分比显示频率

r_zj['百分比'] = r_zj['频率'].apply(lambda x:'%.2f%%' % (x*100))


# 以百分比显示累计频率

r_zj['累计频率百分比'] = r_zj['累计频率'].apply(lambda x:'%.2f%%' % (x*100))

r_zj.style.bar(subset = ['频率','累计频率']) # 表格显示条形图

绘制直方图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 直方图

r_zj['频率'].plot(kind = 'bar',
figsize = (16,6),
grid = True,
color = 'k',
alpha = 0.6)

# 添加标签

x = len(r_zj)
y = r_zj['频率']
m = r_zj['参考总价频数']
for i,j,k in zip(range(x),y,m):
plt.text(i-0.1,j+0.01,'%i' % k, color = 'k')

字段定性

1
2
3
4
5
6
7
8
9
10
11
12
# 频率分布:定性字段

cx_g = data['朝向'].value_counts(sort = True)

r_cx = pd.DataFrame(cx_g)
r_cx.rename(columns = {cx_g.name:'朝向频数'},inplace = True)
r_cx['频率'] = r_cx['朝向频数'] / r_cx['朝向频数'].sum()
r_cx['累计频率'] = r_cx['频率'].cumsum()
r_cx['百分比'] = r_cx['频率'].apply(lambda x:'%.2f%%' % (x*100))
r_cx['累计频率百分比'] = r_cx['累计频率'].apply(lambda x:'%.2f%%' % (x*100))
r_cx.style.bar(subset = ['频率','累计频率'],color = '#d35f5f',width = 100)

可视化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 可视化:绘制频率直方图、饼图


plt.figure(num = 1,figsize = (16,6))
r_cx['频率'].plot(kind = 'bar',
width = 0.8,
rot = 0,
color = 'k',
grid = True,
alpha = 0.6)
plt.title('朝向分布频率直方图')

plt.figure(num = 2)
plt.pie(r_cx['朝向频数'],
labels = r_cx.index,
autopct= '%.2f%%',
shadow = True)
plt.axis('equal')
plt.rc('font',family = 'simhei',size = 15) # 标签显示

总结

以上是数据特征分析中最基础也是最常用的分布分析方法,用于研究数据的分布特征和分布类型,有错误之处,请指正,感谢阅读~