分布分析
分布分析用來解釋數(shù)據(jù)的分布特征和分布類型,顯示其分布情況。分布分析主要分為兩種:對定量數(shù)據(jù)的分布分析和對定性數(shù)據(jù)的分布分析。 對定量數(shù)據(jù)的分布分析按照以下步驟執(zhí)行: 1:求極差 2:決定組距與組數(shù)。 3:決定分點(diǎn)。 4:得到頻率分布表。 5:繪制頻率分布直方圖 遵循的原則有: 1:所有分組必須將所有數(shù)據(jù)包含在內(nèi)。 2:各組的組寬最好相等。 3:各組相斥。 對定性數(shù)據(jù)的分布分析: 對定性數(shù)據(jù)的分布分析根據(jù)變量的分類類型來確定分組,然后使用圖形對信息進(jìn)行顯示。
''' 【課程1.2】 分布分析 分布分析 → 研究數(shù)據(jù)的分布特征和分布類型,分定量數(shù)據(jù)、定性數(shù)據(jù)區(qū)分基本統(tǒng)計(jì)量 極差 / 頻率分布情況 / 分組組距及組數(shù) '''
import numpy as np import pandas as pd import matplotlib.pyplot as plt % matplotlib inline
# 數(shù)據(jù)讀取
data = pd.read_csv('C:/Users/Hjx/Desktop/深圳羅湖二手房信息.csv',engine = 'python')
plt.scatter(data['經(jīng)度'],data['緯度'], # 按照經(jīng)緯度顯示
s = data['房屋單價(jià)']/500, # 按照單價(jià)顯示大小
c = data['參考總價(jià)'], # 按照總價(jià)顯示顏色
alpha = 0.4, cmap = 'Reds')
plt.grid()
print(data.dtypes)
print('-------
數(shù)據(jù)長度為%i條' % len(data))
data.head()
# 通過數(shù)據(jù)可見,一共8個(gè)字段
# 定量字段:房屋單價(jià),參考首付,參考總價(jià),*經(jīng)度,*緯度,*房屋編碼
# 定性字段:小區(qū),朝向
輸出:
房屋編碼 int64 小區(qū) object 朝向 object 房屋單價(jià) int64 參考首付 float64 參考總價(jià) float64 經(jīng)度 float64 緯度 float64 dtype: object ------- 數(shù)據(jù)長度為75條
# 極差:max-min
# 只針對定量字段
def d_range(df,*cols):
krange = []
for col in cols:
crange = df[col].max() - df[col].min()
krange.append(crange)
return(krange)
# 創(chuàng)建函數(shù)求極差
key1 = '參考首付'
key2 = '參考總價(jià)'
dr = d_range(data,key1,key2)
print('%s極差為 %f
%s極差為 %f' % (key1, dr[0], key2, dr[1]))
# 求出數(shù)據(jù)對應(yīng)列的極差
輸出:
參考首付極差為 52.500000 參考總價(jià)極差為 175.000000
# 頻率分布情況 - 定量字段 # ① 通過直方圖直接判斷分組組數(shù) data[key2].hist(bins=10) # 簡單查看數(shù)據(jù)分布,確定分布組數(shù) → 一般8-16即可 # 這里以10組為參考
輸出:
# 頻率分布情況 - 定量字段 # ② 求出分組區(qū)間 gcut = pd.cut(data[key2],10,right=False) gcut_count = gcut.value_counts(sort=False) # 不排序 data['%s分組區(qū)間' % key2] = gcut.values print(gcut.head(),' ------') print(gcut_count) data.head() # pd.cut(x, bins, right):按照組數(shù)對x分組,且返回一個(gè)和x同樣長度的分組dataframe,right → 是否右邊包含,默認(rèn)True # 通過groupby查看不同組的數(shù)據(jù)頻率分布 # 給源數(shù)據(jù)data添加“分組區(qū)間”列
輸出:
0 [42.5, 60) 1 [25, 42.5) 2 [42.5, 60) 3 [25, 42.5) 4 [165, 182.5) Name: 參考總價(jià), dtype: category Categories (10, object): [[25, 42.5) < [42.5, 60) < [60, 77.5) < [77.5, 95) ... [130, 147.5) < [147.5, 165) < [165, 182.5) < [182.5, 200.175)] ------ [25, 42.5) 14 [42.5, 60) 17 [60, 77.5) 1 [77.5, 95) 2 [95, 112.5) 4 [112.5, 130) 2 [130, 147.5) 3 [147.5, 165) 4 [165, 182.5) 8 [182.5, 200.175) 20 Name: 參考總價(jià), dtype: int64
房屋編碼 小區(qū) 朝向 房屋單價(jià) 參考首付 參考總價(jià) 經(jīng)度 緯度 參考總價(jià)分組區(qū)間 0 605093949 大望新平村 南北 5434 15.0 50.0 114.180964 22.603698 [42.5, 60) 1 605768856 通寶樓 南北 3472 7.5 25.0 114.179298 22.566910 [25, 42.5) 2 606815561 羅湖區(qū)羅芳村 南北 5842 15.6 52.0 114.158869 22.547223 [42.5, 60) 3 605147285 興華苑 南北 3829 10.8 36.0 114.158040 22.554343 [25, 42.5) 4 606030866 京基東方都會 西南 47222 51.0 170.0 114.149243 22.554370 [165, 182.5)
# 頻率分布情況 - 定量字段
# ③ 求出目標(biāo)字段下頻率分布的其他統(tǒng)計(jì)量 → 頻數(shù),頻率,累計(jì)頻率
r_zj = pd.DataFrame(gcut_count)
r_zj.rename(columns ={gcut_count.name:'頻數(shù)'}, inplace = True) # 修改頻數(shù)字段名
r_zj['頻率'] = r_zj / r_zj['頻數(shù)'].sum() # 計(jì)算頻率
r_zj['累計(jì)頻率'] = r_zj['頻率'].cumsum() # 計(jì)算累計(jì)頻率
r_zj['頻率%'] = r_zj['頻率'].apply(lambda x: "%.2f%%" % (x*100)) # 以百分比顯示頻率
r_zj['累計(jì)頻率%'] = r_zj['累計(jì)頻率'].apply(lambda x: "%.2f%%" % (x*100)) # 以百分比顯示累計(jì)頻率
r_zj.style.bar(subset=['頻率','累計(jì)頻率'], color='green',width=100)
# 可視化顯示
輸出:
# 頻率分布情況 - 定量字段
# ④ 繪制頻率直方圖
r_zj['頻率'].plot(kind = 'bar',
width = 0.8,
figsize = (12,2),
rot = 0,
color = 'k',
grid = True,
alpha = 0.5)
plt.title('參考總價(jià)分布頻率直方圖')
# 繪制直方圖
x = len(r_zj)
y = r_zj['頻率']
m = r_zj['頻數(shù)']
for i,j,k in zip(range(x),y,m):
plt.text(i-0.1,j+0.01,'%i' % k, color = 'k')
# 添加頻數(shù)標(biāo)簽
輸出:
# 頻率分布情況 - 定性字段
# ① 通過計(jì)數(shù)統(tǒng)計(jì)判斷不同類別的頻率
cx_g = data['朝向'].value_counts(sort=True)
print(cx_g)
# 統(tǒng)計(jì)頻率
r_cx = pd.DataFrame(cx_g)
r_cx.rename(columns ={cx_g.name:'頻數(shù)'}, inplace = True) # 修改頻數(shù)字段名
r_cx['頻率'] = r_cx / r_cx['頻數(shù)'].sum() # 計(jì)算頻率
r_cx['累計(jì)頻率'] = r_cx['頻率'].cumsum() # 計(jì)算累計(jì)頻率
r_cx['頻率%'] = r_cx['頻率'].apply(lambda x: "%.2f%%" % (x*100)) # 以百分比顯示頻率
r_cx['累計(jì)頻率%'] = r_cx['累計(jì)頻率'].apply(lambda x: "%.2f%%" % (x*100)) # 以百分比顯示累計(jì)頻率
r_cx.style.bar(subset=['頻率','累計(jì)頻率'], color='#d65f5f',width=100)
# 可視化顯示
輸出:
南北 29 南 20 東 8 東南 5 北 4 西南 4 西北 3 東北 1 東西 1 Name: 朝向, dtype: int64
# 頻率分布情況 - 定量字段
# ② 繪制頻率直方圖、餅圖
plt.figure(num = 1,figsize = (12,2))
r_cx['頻率'].plot(kind = 'bar',
width = 0.8,
rot = 0,
color = 'k',
grid = True,
alpha = 0.5)
plt.title('參考總價(jià)分布頻率直方圖')
# 繪制直方圖
plt.figure(num = 2)
plt.pie(r_cx['頻數(shù)'],
labels = r_cx.index,
autopct='%.2f%%',
shadow = True)
plt.axis('equal')
# 繪制餅圖
輸出:
總結(jié):
用到的方法:
pd.cut()
s.value_counts()
思路:
s = df['']
s_cut = pd.cut(s,bins=20)
s_count = s_cut.value_counts() --> intervals 為 索引,intervals段內(nèi)的數(shù)字,為value值。
df1 = pd.DataFrame(s_count) --> 將上面的 Series 轉(zhuǎn)變成 DataFrame。之后的添加 ‘頻率’,‘累計(jì)頻率’,‘頻率%’,‘累計(jì)頻率%’。
總結(jié)
- 上一篇: ECharts绘制中国地图、广西地图
- 下一篇: laravel如何执行超长时间代码