#導入本節須要的包 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
缺失值的影響dom
使用簡單的統計分析,能夠獲得含有缺失值的屬性的個數,以及每一個屬性的未缺失數、缺失數與缺失率等。函數
從整體上來講,缺失值的處理分爲刪除存在缺失值的記錄、對可能值進行插補和不處理3種狀況。編碼
異常值分析是檢驗數據是否有錄入錯誤以及含有不合常理的數據。異常值是指樣本中的個別值,其數值明顯偏離其他的觀測值。異常值也稱爲離羣點,異常值的分析也稱爲離羣點分析。如下是異常值分析的經常使用方法:spa
能夠先對變量作一個描述性統計,進而查看哪些數據是不合理的。最經常使用的統計量是最大值和最小值,用來判斷這個變量的取值是否超出了合理的範圍。如客戶年齡的最大值爲199歲,則該變量的取值存在異常。3d
若是數據服從正態分佈,在$3\sigma$原則下,異常值被定義爲一組測定值中與平均值的誤差超過3倍標準差的值。在正態分佈的假設下,距離平均值$3\sigma$以外的值出現的機率爲$P(|x-\mu|>3\sigma)≤0.003$,屬於極個別的小几率事件。3excel
箱型圖提供了識別異常值的一個標準:異常值一般被定義爲小於$Q_L-1.5IQR$或大於$Q_U+1.5IQR$的值。code
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))
$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)
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['盈利'])
對比分析特別適用於指標間的橫縱向比較、時間序列的比較分析。在對比分析中,選擇合適的對比標準是十分關鍵的步驟,只有選擇合適,才能作出客觀的評價,選擇不合適,評價可能得出錯誤的結論。對比分析主要有絕對數對比、相對數對比兩種對比方式。
對比的對象爲絕對數。
對比對象爲相對數,有如下幾種:
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('三部門銷售額對比')
能夠看出,三部門的銷售額呈遞減趨勢,其中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部門三年銷售額對比')
週期性分析是探索某個變量是否隨着時間變化而呈現出某種週期變化趨勢。時間尺度相對較長的週期性趨勢有年度週期性趨勢、季節性週期趨勢,相對較短的有月度週期性趨勢、周度週期性趨勢,其至更短的天、小時週期性趨勢。
以下所示是竊電用戶與正經常使用戶用電量的週期變化趨勢,能夠看出,用電量週期性波谷是週末休息致使的。
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)
貢獻度分析又稱帕累託分析,它的原理是帕累托法則,又稱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)
如上圖所示,前11種商品佔到了銷售額的80%,應當增長這幾類商品的投入以得到更高營業額。
須要同時考察多個變量間的相關關係時,一一繪製它們間的簡單散點圖是十分麻煩的。此時可利用散點圖矩陣同時繪製各變量間的散點圖,從而快速發現多個變量間的主要相關性,這在進行多元線性迴歸時顯得尤其重要。
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)
$$\rho=\frac{cov(X,Y)}{\sqrt{DXDY}}$$
$$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)
能夠看出「鐵板酸菜豆腐」與「蜜汁焗餐包 」、「原汁原味菜心」相關度較高。
$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)
$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)