第一章 資料特徵分析
一、幾個基礎分析思路
- 分佈分析:研究資料的分佈特徵、分佈型別,按定量、定性資料區分基本統計量
- 對比分析:兩個互相聯絡的指標進行比較
- 統計分析:對定量資料進行統計分析,常從集中趨勢和離中趨勢兩個方面分析
- 帕累託分析:貢獻度分析,帕累託原則:20/80定律
- 正太性檢測:利用觀測資料判斷總體是否服從正態分佈的檢驗,是統計判決中重要的一種特殊的擬合優度假設檢驗
- 相關性分析:分析連續變數之間的線性相關程度的強弱
二、分佈分析 1.極差:max-min
def d_range(df,*cols): krange = [] for col in cols: crange = df[col].max() - df[col].min() krange.append(crange) return(krange) # 建立函式求極差
2.頻率分佈情況 - 定量欄位 ① 通過直方圖直接判斷分組組數
data[key2].hist(bins=10)
② 求出分組區間
gcut = pd.cut(data[key2],10,right=False)
# pd.cut(x, bins, right):按照組數對x分組,且返回一個和x同樣長度的分組dataframe,right → 是否右邊包含,預設True
③ 求出目標欄位下頻率分佈的其他統計量 → 頻數,頻率,累計頻率
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() # 計算累計頻率
④ 繪製頻率直方圖
3.頻率分佈情況 - 定性欄位 ① 通過計數統計判斷不同類別的頻率 ② 繪製頻率直方圖、餅圖
三、對比分析 1.絕對數比較 → 相減 ① 折線圖比較
data = pd.DataFrame()
data.plot(kind='line',...,title = 'AB產品銷量對比-折線圖')
② 多系列柱狀圖比較
data.plot(kind = 'bar',...,title = 'AB產品銷量對比-柱狀圖')
③ 柱狀圖堆疊圖+差值折線圖比較
plt.bar(x,y1,width = 1,facecolor = 'yellowgreen') plt.bar(x,y2,width = 1,facecolor = 'lightskyblue') plt.title('AB產品銷量對比-堆疊圖')
plt.plot(x,y3,'--go')
plt.axhline(0,hold=None,color='r',linestyle="--",alpha=0.8) # 新增y軸參考線
plt.title('AB產品銷量對比-差值折線')
2.相對數比較 → 相除 ① 結構分析 在分組基礎上,各組總量指標與總體的總量指標對比,計算出各組數量在總量中所佔比重,反映總體的內部結構
data['A_per'] = data['A_sale'] / data['A_sale'].sum() # 計算出每天的營收佔比
data['A_per%'] = data['A_per'].apply(lambda x: '%.2f%%' % (x*100)) # 轉換為百分數
data[['A_sale','B_sale']].plot(kind='line',style = '--.',alpha = 0.8,ax=axes[0])
data[['A_per','B_per']].plot(kind='line',style = '--.',alpha = 0.8,ax=axes[1])
# 絕對值對比較難看出結構性變化,通過看銷售額佔比來看售賣情況的對比
# 同時可以反應“強度” → 兩個性質不同但有一定聯絡的總量指標對比,用來說明“強度”、“密度”、“普遍程度”
② 比例分析 在分組的基礎上,將總體不同部分的指標數值進行對比,其相對指標一般稱為“比例相對數” 比例相對數 = 總體中某一部分數值 / 總體中另一部分數值
data['c_s'] = data['consumption'] / data['salary']# 比例相對數 → 消費收入比
data['c_s'].plot.area(color = 'green',alpha = 0.5,ylim = [0.3,0.6],figsize=(8,3),grid=True)# 建立面積圖表達
③ 空間比較分析(橫向對比分析) 同類現象在同一時間不同空間的指標數值進行對比,反應同類現象在不同空間上的差異程度和現象發展不平衡的狀況 空間比較相對數 = 甲空間某一現象的數值 / 乙空間同類現象的數值
data.sum().plot(kind = 'bar',color = ['r','g','b','k'], alpha = 0.8, grid = True) # 通過柱狀圖做橫向比較 → 4個產品的銷售額總量
data[:10].plot(kind = 'bar',color = ['r','g','b','k'], alpha = 0.8, grid = True, figsize = (12,4),width = 0.8) # 多系列柱狀圖,橫向比較前十天4個產品的銷售額
# 同比 → 產品A在2015.3和2016.3的比較(相鄰時間段的同一時間點)
# 環比 → 產品A在2015.3和2015.4的比較(相鄰時間段的比較)
④ 動態對比分析(縱向對比分析) 同一現象在不同時間上的指標數值進行對比,反應現象的數量隨著時間推移而發展變動的程度及趨勢,最基本方法:計算動態相對數 → 發展速度 動態相對數(發展速度) = 某一現象的報告期數值 / 同一現象的基期數值 基期:用來比較的基礎時期 報告期:所要研究的時期,又稱計算期
data['base'] = 1000 # 假設基期銷售額為1000,後面每一天都為計算期
data['l_growth'] = data['A'] - data['base'] # 累計增長量 = 報告期水平 - 固定基期水平
data['z_growth'] = data['A'] - data.shift(1)['A'] # 逐期增長量 = 報告期水平 - 報告期前一期水平
data[['l_growth','z_growth']].plot(...)
data['lspeed'] = data['l_growth'] / 1000 # 定基增長速度
data['zspeed'] = data['z_growth'] / data.shift(1)['A'] # 環比增長速度
data[['lspeed','zspeed']].plot(...)
# 通過折線圖檢視發展速度
四、統計分析 1.集中趨勢度量 指一組資料向某一中心靠攏的傾向,核心在於尋找資料的代表值或中心值 —— 統計平均數 ① 算術平均數
data['f'] = data['f'] / data['f'].sum() # f為權重,這裡將f列設定成總和為1的權重佔比
mean = data['value'].mean() # 簡單算數平均值 = 總和 / 樣本數量 (不涉及權重)
mean_w = (data['value'] * data['f']).sum() / data['f'].sum() # 加權算數平均值 = (x1f1 + x2f2 + ... + xnfn) / (f1 + f2 + ... + fn)
② 位置平均數
m = data['value'].mode() # 眾數是一組資料中出現次數最多的數,這裡可能返回多個值
med = data['value'].median() # 中位數指將總體各單位標誌按照大小順序排列後,中間位置的數字
data['value'].plot(kind = 'kde',style = '--k',grid = True) # 密度曲線
2.離中趨勢度量 ① 極差、分位差
# 極差,沒有考慮中間變數的變動,測定離中趨勢不穩定
sta = data['A_sale'].describe()
a_iqr = sta.loc['75%'] - sta.loc['25%'] # 分位差
color = dict(boxes='DarkGreen', whiskers='DarkOrange', medians='DarkBlue', caps='Gray')
data.plot.box(vert=False,grid = True,color = color,figsize = (10,3)) # 箱型圖
② 方差與標準差
sta = data['A_sale'].describe()
a_std = sta.loc['std'] # 方差 → 各組中數值與算數平均數離差平方的算術平均數
a_var = data['A_sale'].var() 標準差 → 方差的平方根
# 標準差是最常用的離中趨勢指標 → 標準差越大,離中趨勢越明顯
五、帕累託分析
data.sort_values(ascending=False, inplace= True) # 由大到小排列
plt.figure(figsize = (10,4))
data.plot(kind = 'bar', color = 'g', alpha = 0.5, width = 0.7)
plt.ylabel('營收_元') # 建立營收柱狀圖
p = data.cumsum()/data.sum() # 建立累計佔比,Series
key = p[p>0.8].index[0] # 找到累計佔比超過80%時候的index
key_num = data.index.tolist().index(key) # 找到key所對應的索引位置
print('超過80%累計佔比的節點值索引為:' ,key)
print('超過80%累計佔比的節點值索引位置為:' ,key_num)
p.plot(style = '--ko', secondary_y=True) # secondary_y → y副座標軸
plt.axvline(key_num,hold=None,color='r',linestyle="--",alpha=0.8)
plt.text(key_num+0.2,p[key],'累計佔比為:%.3f%%' % (p[key]*100), color = 'r') # 累計佔比超過80%的節點
plt.ylabel('營收_比例') # 繪製營收累計佔比曲線
key_product = data.loc[:key]
print('核心產品為:',key_product) # 輸出決定性因素產品
六、正太性檢測 1.直方圖初判
s.hist(bins=30,alpha = 0.5,ax = ax2) # 繪製直方圖
s.plot(kind = 'kde', secondary_y=True,ax = ax2)
plt.grid()
# 呈現較明顯的正太性
2.QQ圖判斷 QQ圖通過把測試樣本資料的分位數與已知分佈相比較,從而來檢驗資料的分佈情況 QQ圖是一種散點圖,對應於正態分佈的QQ圖,就是由標準正態分佈的分位數為縱座標,樣本值為橫座標的散點圖 參考直線:四分之一分位點和四分之三分位點這兩點確定,看散點是否落在這條線的附近
# 繪製思路
# ① 在做好資料清洗後,對資料進行排序(次序統計量:x(1)<x(2)<....<x(n))
# ② 排序後,計算出每個資料對應的百分位p{i},即第i個數據x(i)為p(i)分位數,其中p(i)=(i-0.5)/n (pi有多重演算法,這裡以最常用方法為主)
# ③ 繪製直方圖 + qq圖,直方圖作為參考
st = s['value'].describe()
x1 ,y1 = 0.25, st['25%']
x2 ,y2 = 0.75, st['75%'] # 計算四分之一位數、四分之三位數
ax3 = fig.add_subplot(3,1,3) # 建立子圖3
ax3.plot(s_r['p'],s_r['value'],'k.',alpha = 0.1)
ax3.plot([x1,x2],[y1,y2],'-r') # 繪製QQ圖,直線為四分之一位數、四分之三位數的連線,基本符合正態分佈
3.K-S檢驗 K-S檢驗是比較一個頻率分佈f(x)和理論分佈g(x)或者兩個觀測值分佈的檢驗方法,若兩者差距小,則推論樣本分佈取自某特定分佈。 ① KS檢驗,理論推導
s = df['value'].value_counts().sort_index()
df_s['累計頻率'] = df_s['累計次數'] / len(data)
df_s['理論分佈'] =[0.0244,0.0968,0.2148,0.2643,0.3228,0.3859,0.5160,0.5832,0.7611,0.8531,0.8888,0.9803] # 通過查閱正太分佈表
df_s['D'] = np.abs(df_s['累計頻率'] - df_s['理論分佈']) # D值序列計算結果表格
# df_s['累計頻率']、df_s['理論分佈']用密度圖表示
② 直接用演算法做KS檢驗
from scipy import stats # scipy包是一個高階的科學計算庫,它和Numpy聯絡很密切,Scipy一般都是操控Numpy陣列來進行科學計算
u = df['value'].mean() # 計算均值
std = df['value'].std() # 計算標準差
stats.kstest(df['value'], 'norm', (u, std))
# .kstest方法:KS檢驗,引數分別是:待檢驗的資料,檢驗方法(這裡設定成norm正態分佈),均值與標準差
# 結果返回兩個值:statistic → D值,pvalue → P值
# p值大於0.05,為正態分佈
七、相關性分析 1.圖示初判 ① 變數之間的線性相關性 正線性相關、負線性相關 ② 散點圖矩陣初判多變數間關係
2.Pearson相關係數(皮爾遜相關係數) 前提條件→滿足正態分佈
u1,u2 = data['value1'].mean(),data['value2'].mean() # 計算均值
std1,std2 = data['value1'].std(),data['value2'].std() # 計算標準差
print('value1正態性檢驗:\n',stats.kstest(data['value1'], 'norm', (u1, std1))) # 正態性檢驗 → pvalue >0.05
r = data['(x-u1)*(y-u2)'].sum() / (np.sqrt(data['(x-u1)**2'].sum() * data['(y-u2)**2'].sum())) # |r| > 0.8 → 高度線性相關
data.corr() # pandas相關性方法:data.corr(method='pearson', min_periods=1) → 直接給出資料欄位的相關係數矩陣
# method預設pearson
3.Sperman秩相關係數(斯皮爾曼相關係數)
ata['d'] = data['range1'] - data['range2'] #秩次index差
data['d2'] = data['d']**2
n = len(data)
rs = 1 - 6 * (data['d2'].sum()) / (n * (n**2 - 1)) 求出rsPearson相關係數
data.corr(method='spearman')
# pandas相關性方法:data.corr(method='pearson', min_periods=1) → 直接給出資料欄位的相關係數矩陣
# method預設pearson