摘要
介绍几种数据分析中对于数据分布的常用方式,包括极差、频率以及分组的使用实例~
前言
分布分析是数据特征分析中极为常用的一种方法。在数据质量得到保证的前提下,通过绘制图表、计算某些统计量等手段对数据的分布特征和贡献度进行分析,分布分析能够揭示数据的分布特征和分布类型,对于定量数据,可以做出频率分布表、绘制频率分布直方图显示分布特征;对于定性数据,可用饼图和条形图显示分布情况。
分布分析
分布分析 → 研究数据的分布特征和分布类型,分定量数据、定性数据区分基本统计量
一般通过以下三种方式来进行分布分析:
极差 / 频率分布情况 / 分组组距及组数
下面通过一个案例对分布分析进行实操应用:
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)
|
总结
以上是数据特征分析中最基础也是最常用的分布分析方法,用于研究数据的分布特征和分布类型,有错误之处,请指正,感谢阅读~