python數據分析之數據探索

#導入本節須要的包
import pandas as pd
import numpy as np
import random as rnd
import seaborn as sns
import matplotlib.pyplot as plt
import random
%matplotlib inline

import warnings
warnings.filterwarnings('ignore')
import matplotlib.pyplot as plt  
plt.rcParams['font.sans-serif'] = [u'SimHei']
plt.rcParams['axes.unicode_minus'] = False

數據質量分析

  • 數據質量分析:其主要任務是檢查原始數據中是否存在髒數據。
  • 髒數據:不符合要求,以及不能直接進行相應分析的數據。在常見的數據挖掘工做中,髒數據包括以下內容。python

    • 缺失值。
    • 異常值。
    • 不一致的值。
    • 重複數據及含有特殊符號(如#、¥、*)的數據。

缺失值分析

  • 缺失值產生的緣由app

    1. 有些信息暫時沒法獲取,或者獲取信息的代價太大。
    2. 有些信息是被遺漏的。多是由於輸人時認爲不重要、忘記填寫或對數據理解錯誤等一些人爲因素而遺漏,也多是因爲數據採集設備的故障、存儲介質的故障、傳輸媒體的故障等非,人爲緣由而丟失。
    3. 屬性值不存在。在某些狀況下,缺失值並不意味着數據有錯誤。對一些對象來講某些屬性值是不存在的,如一個未婚者的配偶姓名、一個兒童的固定收入等。
  • 缺失值的影響dom

    1. 數據挖掘建模將丟失大量的有用信息。
    2. 數據挖掘模型所表現出的不肯定性更加顯著,模型中蘊涵的規律更難把握。
    3. 包含空值的數據會使建模過程陷人混亂,致使不可靠的輸出。
  • 缺失值的分析

  使用簡單的統計分析,能夠獲得含有缺失值的屬性的個數,以及每一個屬性的未缺失數、缺失數與缺失率等。函數

  從整體上來講,缺失值的處理分爲刪除存在缺失值的記錄、對可能值進行插補和不處理3種狀況。編碼

異常值分析

  異常值分析是檢驗數據是否有錄入錯誤以及含有不合常理的數據。異常值是指樣本中的個別值,其數值明顯偏離其他的觀測值。異常值也稱爲離羣點,異常值的分析也稱爲離羣點分析。如下是異常值分析的經常使用方法:spa

簡單統計量分析

  能夠先對變量作一個描述性統計,進而查看哪些數據是不合理的。最經常使用的統計量是最大值和最小值,用來判斷這個變量的取值是否超出了合理的範圍。如客戶年齡的最大值爲199歲,則該變量的取值存在異常。3d

$3\sigma$原則

  若是數據服從正態分佈,在$3\sigma$原則下,異常值被定義爲一組測定值中與平均值的誤差超過3倍標準差的值。在正態分佈的假設下,距離平均值$3\sigma$以外的值出現的機率爲$P(|x-\mu|>3\sigma)≤0.003$,屬於極個別的小几率事件。3excel

箱型圖分析

  箱型圖提供了識別異常值的一個標準:異常值一般被定義爲小於$Q_L-1.5IQR$或大於$Q_U+1.5IQR$的值。code

  • $Q_L$:下四分位數,表示所有觀察值中有四分之一的數據取值比它小;
  • $Q_U$:上四分位數,表示所有觀察值中有四分之--的數據取值比它大;
  • $IQR$:四分位數間距,是上四分位數$Q_U$與下四分位數$Q_L$之差,其間包含了所有觀察值的一半。

下載 (1).png

箱線圖法特色

  • 對數據分佈無要求
  • 魯棒性強:多達25%的數據能夠變得任意遠而不會很大地擾動四分位數。

箱線圖法實例

data = pd.read_excel('Python數據分析與挖掘實戰/chapter3/demo/data/catering_sale.xls',encoding='utf-8')

data.head(3)
日期 銷量
0 2015-03-01 51.0
1 2015-02-28 2618.2
2 2015-02-27 2608.4

  從下面能夠看出,數據共201行,但count只有200,說明有一行缺失。orm

data.shape

(201, 2)

data.describe().T
count mean std min 25% 50% 75% max
銷量 200.0 2755.2147 751.029772 22.0 2451.975 2655.85 3026.125 9106.44

  如下是使用箱線圖檢測異常值的代碼:

plt.figure(figsize=(8,8),dpi=80)
p = data.boxplot(return_type='dict')
x = p['fliers'][0].get_xdata()
y = p['fliers'][0].get_ydata()
y.sort()
for i in range(len(y)):
    plt.annotate(y[i],xy=(x[i],y[i]),xytext=(x[i]+0.05 -1.4/(y[i]-y[i-1]),y[i]+100))

output_19_0.png

  • $plt.annotate(s,xy=(x,y),xytext=(a,b))$用於給圖片上的點添加註釋

    $s$:註釋的內容

    $xy$:被註釋點的座標

    $xytext$:註釋文本的座標

  箱型圖中的超過上下界的8個銷售額數據可能爲異常值。結合具體業務能夠把86五、4060.三、4065.2歸爲正常值,將2二、51.60、6607.四、9106.44歸爲異常值。最後肯定過濾規則爲:日銷量在400如下5000以上則屬於異常數據,編寫過濾程序,進行後續處理。

一致性分析

  • 數據不一致性:指數據的矛盾性、不相容性。

  直接對不一致的數據進行挖掘,可能會產生與實際相違背的挖掘結果。在數據挖掘過程當中,不--致數據的產生主要發生在數據集成的過程當中,這多是因爲被挖掘數據是來自於不一樣的數據源、對於重複存放的數據未能進行一致性更新形成的。例如,兩張表中都存儲了用戶的電話號碼,但在用戶的電話號碼發生改變時只更新了一張表中的數據,那麼這兩張表中就有了不一致的數據。

數據特徵分析

  對數據進行質量分析之後,接下來可經過繪製圖表、計算某些特徵量等手段進行數據的特徵分析。

分佈分析

  • 分佈分析:揭示數據分佈類型及特色。

數值型變量的分佈分析

  一般狀況下,使用頻率分佈直方圖來描述定量數據的分佈。

data = pd.read_excel('Python數據分析與挖掘實戰/chapter3/demo/data/catering_fish_congee.xls',names=['日期','銷售額'])
data.head(3)
日期 銷售額
0 2014-04-02 900
1 2014-04-03 1290
2 2014-04-04 420
sns.distplot(data['銷售額'])
plt.xlim(0,4500)

output_31_1.png

分類型變量的分佈分析

data = pd.read_excel('Python數據分析與挖掘實戰/chapter3/demo/data/catering_dish_profit.xls')
data.head()
菜品ID 菜品名 盈利
0 17148 A1 9173
1 17154 A2 5729
2 109 A3 4811
3 117 A4 3594
4 17151 A5 3195
f,axes = plt.subplots(1,2,figsize=(12,5))
axes[0].pie(data['盈利'],labels=data['菜品名'],autopct=lambda x:str(round(x,2))+'%',)
sns.barplot(data['菜品名'],data['盈利'])

output_34_1.png

對比分析

  • 對比分析:把兩個相互聯繫的指標進行比較,從數量上展現和說明研究對象規模的大小,水平的高低,速度的快慢,以及各類關係是否協調。

  對比分析特別適用於指標間的橫縱向比較、時間序列的比較分析。在對比分析中,選擇合適的對比標準是十分關鍵的步驟,只有選擇合適,才能作出客觀的評價,選擇不合適,評價可能得出錯誤的結論。對比分析主要有絕對數對比、相對數對比兩種對比方式。

  • 絕對數對比

對比的對象爲絕對數。

  • 相對數對比

對比對象爲相對數,有如下幾種:

  1.結構相對數:將同一整體內的部分數值與所有數值對比求得比重,用以說明事物的性質、結構或質量。如居民食品支出額佔消費支出總額比重、產品合格率等。
  2.比例相對數:將同一整體內不一樣部分的數值進行對比,代表整體內各部分的比例關係。如人口性別比例、投資與消費比例等。
  3.比較相對數:將同--時期兩個性質相同的指標數值進行對比,說明同類現象在不一樣空間條件下的數量對比關係。如不一樣地區商品價格對比,不一樣行業、不一樣企業間某項指標對比等。
  4.強度相對數:將兩個性質不一樣但有--定聯繫的總量指標進行對比,用以說明現象的強度、密度和廣泛程度。如人均國內生產總值用「元/人」表示,人口密度用「人/平方千米」表示。
  5.計劃完成程度相對數:是某一時期實際完成數與計劃數的對比,用以說明計劃完成程度。
  6.動態相對數:將同一現象在不一樣時期的指標數值進行對比,用以說明發展方向和變化的速度。如發展速度、增加速度等。

  就各菜品的銷售數據來看,從時間的維度上分析,能夠看到甜品部A、海鮮部B、素菜部C三個部門之間的銷售金額隨時間的變化趨勢,能夠了解在此期間哪一個部門的銷售金額較高,趨勢比較平穩,如圖所示:

data = pd.read_excel('Python數據分析與挖掘實戰/chapter3/demo/data/dish_sale.xls')
data.T
0 1 2 3 4 5 6 7 8 9 10 11
月份 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
A部門 8 6 6.89 6.1 6.05 6.01 6.6 6.4 5.8 6.7 6.6 5.3
B部門 7.7 6.5 7.9 7.5 8 7.4 7.5 7 7.2 6.6 6.65 5.4
C部門 5.3 5.2 5.8 6.2 5.9 5.5 6.1 5.7 5.4 5.5 5.6 5.2
plt.figure(figsize=(8,4),dpi=100)
plt.plot(data['月份'],data['A部門'],label='A部門')
plt.plot(data['月份'],data['B部門'],label='B部門')
plt.plot(data['月份'],data['C部門'],label='C部門')
plt.legend()
plt.ylim(2,10)
label = plt.ylabel('銷售額(萬元)')
title = plt.title('三部門銷售額對比')

output_41_0.png

  能夠看出,三部門的銷售額呈遞減趨勢,其中B部門連續遞減的趨勢最爲明顯,多是原材料不足致使的。

  對B部門銷售額作進一步分析,對比其三年的銷售額,以下所示,能夠看出13年14年銷售額相似且明顯大於12年,且三年銷售額均在春夏季增加,秋冬季降低,具備明顯的季節性。

data = pd.read_excel('Python數據分析與挖掘實戰/chapter3/demo/data/dish_sale_b.xls')
data.T
0 1 2 3 4 5 6 7 8 9 10 11
月份 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2014年 7.9 6 6.89 7.3 7.6 7.2 7.4 7.8 7 6.7 6.6 6.3
2013年 7.7 6.5 7.9 7.5 8 7.4 7.5 7 7.2 6.6 6.65 6.4
2012年 5.3 5.2 5.8 6.2 5.9 5.5 6.1 5.7 5.4 5.5 5.6 5.2
plt.figure(figsize=(8,4),dpi=100)
plt.plot(data['月份'],data['2012年'],label='2012年')
plt.plot(data['月份'],data['2013年'],label='2013年')
plt.plot(data['月份'],data['2014年'],label='2014年')
plt.legend()
plt.ylim(2,10)
label = plt.ylabel('銷售額(萬元)')
title = plt.title('B部門三年銷售額對比')

output_45_0.png

統計量分析

  • 集中趨勢:均值、中位數、衆數
  • 離散趨勢:極差、方差、變異係數、四分位數間距

週期分析

  週期性分析是探索某個變量是否隨着時間變化而呈現出某種週期變化趨勢。時間尺度相對較長的週期性趨勢有年度週期性趨勢、季節性週期趨勢,相對較短的有月度週期性趨勢、周度週期性趨勢,其至更短的天、小時週期性趨勢。

  以下所示是竊電用戶與正經常使用戶用電量的週期變化趨勢,能夠看出,用電量週期性波谷是週末休息致使的。

data_normal = pd.read_csv('Python數據分析與挖掘實戰/chapter3/demo/data/user.csv')
data_steal = pd.read_csv('Python數據分析與挖掘實戰/chapter3/demo/data/Steal user.csv')
plt.figure(figsize=(8,4),dpi=100)
plt.plot(data_normal['Date'],data_normal['Eletricity'],label='正經常使用戶')
plt.plot(data_steal['Date'],data_steal['Eletricity'],label='竊電用戶')
x_major_locator = plt.MultipleLocator(7)
ax = plt.gca()
ax.xaxis.set_major_locator(x_major_locator)
plt.legend()
x_tick = plt.xticks(rotation=45)

output_51_0.png

貢獻度分析

  貢獻度分析又稱帕累託分析,它的原理是帕累托法則,又稱20/80定律。一樣的投入放在不一樣的地方會產生不一樣的效益。例如,對一個公司來說,80%的利潤經常來自於20%最暢銷的產品,而其餘80%的產品只產生了20%的利潤。

data = pd.read_excel('Python數據分析與挖掘實戰/chapter3/demo/data/商品銷售數據.xlsx')
data.head()
日期(年月日) 城市 門店名稱 省份 單據編碼 商品類別 商品名稱 銷售額
0 2018-01-01 白山市 白山店 吉林省 SMDBJ18000010 日用品 微爽日用245mm 1,076.92
1 2018-01-01 鶴崗市 鶴崗店 黑龍江省 SMDBJ18000014 零食 三全960g奶香饅頭 2,461.54
2 2018-01-01 鶴崗市 鶴崗店 黑龍江省 SMDBJ18000014 零食 嘉士利115g威化餅 3,119.66
3 2018-01-01 遼源市 遼源店 吉林省 SMDBJ18000015 零食 三全960g奶香饅頭 4,102.56
4 2018-01-01 遼源市 遼源店 吉林省 SMDBJ18000015 零食 麗芝士散裝系列 2,948.72
#data['銷售額'] = pd.to_numeric(data['銷售額'].apply(lambda x:x.replace(',','')))
grouped = data[['商品名稱','銷售額']].groupby('商品名稱',as_index=False).sum().sort_values('銷售額',ascending=False).reset_index(drop=True)
fig,axes = plt.subplots(figsize=(12,6),dpi=100)

p = grouped['銷售額'].cumsum()/grouped['銷售額'].sum()
sns.barplot(grouped['商品名稱'],grouped['銷售額'],ax=axes)
ax2 = axes.twinx()
ax2.plot(grouped['商品名稱'],p,color='m',marker='o')
plt.annotate('80%',(grouped['商品名稱'][10],p[10]),xytext=(grouped['商品名稱'][10],0.9),arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2"))
for xtick in axes.get_xticklabels():
    xtick.set_rotation(80)

output_55_0.png

  如上圖所示,前11種商品佔到了銷售額的80%,應當增長這幾類商品的投入以得到更高營業額。

相關性分析

繪製散點圖

下載 (2).png

繪製散點圖矩陣

  須要同時考察多個變量間的相關關係時,一一繪製它們間的簡單散點圖是十分麻煩的。此時可利用散點圖矩陣同時繪製各變量間的散點圖,從而快速發現多個變量間的主要相關性,這在進行多元線性迴歸時顯得尤其重要。

df = pd.read_csv('Python數據分析與挖掘實戰/chapter3/demo/data/iris.data',names = ['sepal length','sepal width',
                                                                         'petal length', 'petal width','Class'])
df.head()
sepal length sepal width petal length petal width Class
0 5.1 3.5 1.4 0.2 Iris-setosa
1 4.9 3.0 1.4 0.2 Iris-setosa
2 4.7 3.2 1.3 0.2 Iris-setosa
3 4.6 3.1 1.5 0.2 Iris-setosa
4 5.0 3.6 1.4 0.2 Iris-setosa
p=sns.pairplot(df)

output_63_0.png

相關係數的計算

  • 皮爾遜相關係數:描述兩統計量之間的線性相關關係。

$$\rho=\frac{cov(X,Y)}{\sqrt{DXDY}}$$

  • Spearman秩相關係數

$$r_s=1-\frac{6\sum(R_i-Q_i)^2}{n(n^2-1)}$$

$R_i,Q_i$分別爲兩變量對應值從小到大排序的序數。

  • 可決係數

$$R^2=1-\frac{\sum(y_i-\hat y_i)^2}{\sum(y_i-\bar y)^2}$$

  可決係數描述的是迴歸方程對因變量的解釋程度,分母爲總誤差分子爲隨機誤差。

data = pd.read_excel('Python數據分析與挖掘實戰/chapter3/demo/data/catering_sale_all.xls')
data.head()
日期 百合醬蒸鳳爪 翡翠蒸香茜餃 金銀蒜汁蒸排骨 樂膳真味雞 蜜汁焗餐包 生炒菜心 鐵板酸菜豆腐 香煎韭菜餃 香煎羅卜糕 原汁原味菜心
0 2015-01-01 17 6 8 24 13.0 13 18 10 10 27
1 2015-01-02 11 15 14 13 9.0 10 19 13 14 13
2 2015-01-03 10 8 12 13 8.0 3 7 11 10 9
3 2015-01-04 9 6 6 3 10.0 9 9 13 14 13
4 2015-01-05 4 10 13 8 12.0 10 17 11 13 14
data.corr()
百合醬蒸鳳爪 翡翠蒸香茜餃 金銀蒜汁蒸排骨 樂膳真味雞 蜜汁焗餐包 生炒菜心 鐵板酸菜豆腐 香煎韭菜餃 香煎羅卜糕 原汁原味菜心
百合醬蒸鳳爪 1.000000 0.009206 0.016799 0.455638 0.098085 0.308496 0.204898 0.127448 -0.090276 0.428316
翡翠蒸香茜餃 0.009206 1.000000 0.304434 -0.012279 0.058745 -0.180446 -0.026908 0.062344 0.270276 0.020462
金銀蒜汁蒸排骨 0.016799 0.304434 1.000000 0.035135 0.096218 -0.184290 0.187272 0.121543 0.077808 0.029074
樂膳真味雞 0.455638 -0.012279 0.035135 1.000000 0.016006 0.325462 0.297692 -0.068866 -0.030222 0.421878
蜜汁焗餐包 0.098085 0.058745 0.096218 0.016006 1.000000 0.308454 0.502025 0.155428 0.171005 0.527844
生炒菜心 0.308496 -0.180446 -0.184290 0.325462 0.308454 1.000000 0.369787 0.038233 0.049898 0.122988
鐵板酸菜豆腐 0.204898 -0.026908 0.187272 0.297692 0.502025 0.369787 1.000000 0.095543 0.157958 0.567332
香煎韭菜餃 0.127448 0.062344 0.121543 -0.068866 0.155428 0.038233 0.095543 1.000000 0.178336 0.049689
香煎羅卜糕 -0.090276 0.270276 0.077808 -0.030222 0.171005 0.049898 0.157958 0.178336 1.000000 0.088980
原汁原味菜心 0.428316 0.020462 0.029074 0.421878 0.527844 0.122988 0.567332 0.049689 0.088980 1.000000
plt.figure(figsize=(7,6),dpi=100)
p = sns.heatmap(data.corr(),annot=True)

output_75_0.png

  能夠看出「鐵板酸菜豆腐」與「蜜汁焗餐包 」、「原汁原味菜心」相關度較高。

Python主要數據探索函數

基本統計特徵函數

$df:dataframe,D:dataframe或series,s:series$

$D.sum()$:求和

$D.mean()$:求均值

$D.var()$:求方差

$D.std()$:求標準差

$D.corr(method='spearman'),s_1.corr(s_2)$:求相關係數

$D.cov(),s_1.cov(s_2)$:求協方差

$D.skew()$:計算偏度

$D.kurt()$:計算峯度

$D.describe()$:直接給出均值、標準差、最大值、最小值、分位數等

拓展統計特徵數

$D.cumsum()$:依此給出前1,2,...n個數據的和。

$D.cumprod()$:依此給出前1,2,...n個數據的積。

$D.cummax()$:依此給出前1,2,...n個數據的最大值。

$D.cummin()$:依此給出前1,2,...n個數據的最小值。

統計做圖函數

$plt.plot(x,y)$:繪製線性二維圖、折線圖。

$D.plot(kind='box')$:這裏使用的是DataFrame或Series對象內置的方法做圖,默認以Index爲橫座標,每列數據爲縱座標自動做圖,經過kind參數指定做圖類型,支持line(線)、bar(條形)、barh、hist(直方圖)、box(箱線圖)、kde(密度圖)和area、pie(餅圖)等,同時也可以接受plt.plot)中接受的參數。

$plt.pie(data)$:繪製餅圖,$data$爲series。

$plt.hist(s)$:繪製直方圖,$s$爲series。

$D.boxplot(),plt.plot(kind='box')$:繪製箱線圖。

$D.plot(logx=True)$:x軸使用對數座標軸。

y = pd.Series(np.exp(np.arange(20)))
fig = plt.figure(figsize=(10,4))
ax1 = fig.add_subplot(1,2,1)
p1 = y.plot(label ='原始數據圖',legend=True)
ax2 = fig.add_subplot(1,2,2)
p2 = y.plot(label='對數數據圖',logy=True,legend=True)

output_85_0.png

$D.plot(yerr=error)$:繪製偏差條形圖。D爲Pandas的DataFrame或Series,表明着均值數據列,而error則是偏差列,此命令在y軸方向畫出偏差棒圖;相似地,若是設置參數xerr= error, 則在x軸方向畫出偏差棒圖。

error = np.random.randn(10)
y = pd.Series(np.sin(np.arange(10)))
p = y.plot(yerr=error)

output_87_0.png

相關文章
相關標籤/搜索