前言:對于一個轉(zhuǎn)行做數(shù)據(jù)分析的我來說僧著,最讓自己頭疼的是搞不清數(shù)據(jù)分析的流程叫编、方式,不知道該怎么開始一個練手項目霹抛。逛知乎搓逾、找度娘、看數(shù)據(jù)分析書籍杯拐,寫這篇文章目的是想鞏固知識霞篡,讓自己不斷復(fù)習(xí)世蔗!
數(shù)據(jù)分析流程
需求層:目標確定
數(shù)據(jù)層
分析層
輸出層
1. 需求層:目標確定,通常是你的同事或上級提出分析需求
注:如果是自己提出的需求朗兵,需要注意以下三點a.選擇感興趣的行業(yè)b.保證有準確數(shù)據(jù)供應(yīng)c.選擇細分切入
2. 數(shù)據(jù)層:數(shù)據(jù)獲取-數(shù)據(jù)清洗整理污淋,會占據(jù)數(shù)據(jù)分析的50%+時間
a.數(shù)據(jù)獲取:公開網(wǎng)站(國家統(tǒng)計局余掖、各行業(yè)網(wǎng)站等)寸爆,專門做數(shù)據(jù)整理的網(wǎng)站(淘寶),自行搜索收集(調(diào)查問卷盐欺、復(fù)制粘貼)
b.數(shù)據(jù)清洗整理:數(shù)據(jù)異常值赁豆、缺失值、重復(fù)記錄冗美、非數(shù)值型數(shù)據(jù)轉(zhuǎn)標簽數(shù)據(jù)等魔种;
(1)缺失值處理:判斷缺失值isnull/notnull,刪除.dropna(),眾數(shù)/中位數(shù)填充缺失值.fillna()/.replace(),拉格朗日插值法
s.dropna(inplace=True)
s.fillna(0,inplace=True,method = 'pad'/'bfill')
s.replace(舊粉洼,新节预,inplace=True)
#拉格朗日插值法
from scipy.interpolate import lagrange
def na_c(s,n,k=5):
y = s[list(range(n-k,n+1+k))] # 取數(shù)
y = y[y.notnull()] # 剔除空值
return(lagrange(y.index,list(y))(n))
# 創(chuàng)建函數(shù),做插值属韧,由于數(shù)據(jù)量原因安拟,以空值前后5個數(shù)據(jù)(共10個數(shù)據(jù))為例做插值
na_re = []
for i in range(len(data)):
if data.isnull()[i]:
data[i] = na_c(data,i)
print(na_c(data,i))
na_re.append(data[i])
(2)異常值處理:
3西格瑪原則:如果數(shù)據(jù)服從正態(tài)分布,異常值被定義為一組測定值中與平均值的偏差超過3倍的值 → p(|x - μ| > 3σ) ≤ 0.003
箱型圖:四分位=i(n+1)/4,如果上四分位=6.75,那么上四分位=第六個值0.65+第七個值0.25宵喂;
IQR=Q3-Q1,上限Q3+1.5IQR去扣,下限Q1-1.5IQR;
內(nèi)限:Q3+1.5IQR與剔除異常值的最大值兩者取小樊破,Q1-1.5IQR與剔除異常值的最小值兩者取大;
外限:Q3+3IQR與剔除異常值的最大值兩者取小唆铐,Q1-3IQR與剔除異常值的最小值兩者取大哲戚;
參考:https://blog.csdn.net/qq_40587575/article/details/80215776
(3)數(shù)據(jù)歸一化處理:
a.標準化:(x-min)/(max-min)
b.0-1化:(x-mean)/std
比如:八個產(chǎn)品有兩個指標AB,A權(quán)重0.6艾岂,B權(quán)重0.4顺少,判斷哪個產(chǎn)品綜合指標最好
(4)連續(xù)數(shù)據(jù)離散化:
a.等寬法:pd.cut(ages,bins)
b.等頻法:pd.qcut()
pd.cut(ages,[18,26,36,61,100],right=False)
pd.qcut(s,4)
3. 分析層:分析-洞察結(jié)論/建模分析-模型測試-迭代優(yōu)化(較難)
(1) 分布分析
a.定量數(shù)據(jù):極差=最大值-最小值,極差越大越不穩(wěn)定王浴,極差越小越穩(wěn)定脆炎;
頻率分布,包括頻數(shù)氓辣、頻率秒裕、累計頻數(shù)、累計頻率
方法:先定義區(qū)間分組钞啸,再畫直方圖几蜻,求頻率.value_counts后得到頻數(shù)喇潘,頻率=頻數(shù)/頻數(shù)的總數(shù),累計頻數(shù)/累計頻率.cumsum()
b.定性數(shù)據(jù):除去極差梭稚,直接看頻數(shù)頻率累計頻數(shù)累計頻率颖低,畫直方圖df[].plot(kind='bar'),畫餅圖plt.pie
(2)對比分析
a.絕對數(shù)比較:相減弧烤,適用于量級上差距不大忱屑。如AB產(chǎn)品的銷量,用折線圖暇昂、多元柱狀圖莺戒、正負堆疊圖、差值折線圖
b.相對數(shù)比較:相除
aa.縱向?qū)Ρ龋?strong>累計增長量 = 報告期水平 - 固定基期水平;逐期增長量 = 報告期水平 - 報告期前一期水平;定基增長速度=累計增長量/固定基期水平话浇;環(huán)比增長速度=逐期增長量/報告前一期水平脏毯;
日環(huán)比=今天/昨天-1
年同比=今天/去年今天-1
bb.橫向?qū)Ρ龋和粫r間不同空間,比如ABCD四個產(chǎn)品一周的銷售量df[].plot(kind='bar')
cc.比例比較:各項與各項比較幔崖。比如:工資與消費的比例[].plot.area食店;
dd.結(jié)構(gòu)比較:各項占總體的比重,反應(yīng)總體內(nèi)部結(jié)構(gòu)赏寇。比如:1號產(chǎn)品A銷售在一周內(nèi)的占比吉嫩;
(3)統(tǒng)計分析
a.集中趨勢:均值、眾數(shù)嗅定、中位數(shù)
b.離散趨勢:極差自娩、四分位差data.plot.box、標準差std:plt.axvline(均值-1個std)渠退、方差var
(4)帕累托分析:將樣本有大到小排序忙迁,畫柱狀圖,求累計占比找到80%那個index:data.cumsum()/data.sum()碎乃,p[p>0.8].index[0]
(5)正態(tài)性檢驗:
a.直方圖:
b.QQ圖:將值由小到大排序姊扔,x軸坐標(index-0.5)/n,y軸坐標(values-mean)/std;
再畫一條四分位和一分為的直線,看直線是否在QQ圖上梅誓;
s = pd.DataFrame(np.random.randn(1000)+10,columns = ['value'])
s.sort_values(by = 'value', inplace = True) # 重新排序
s_r = s.reset_index(drop = False) # 重新排序后恰梢,更新index
s_r['p'] = (s_r.index - 0.5) / len(s_r)
s_r['q'] = (s_r['value'] - mean) / std
st = s['value'].describe()
x1 ,y1 = 0.25, st['25%']
x2 ,y2 = 0.75, st['75%']
fig = plt.figure(figsize = (10,9))
ax3 = fig.add_subplot(3,1,3) # 創(chuàng)建子圖3
ax3.plot(s_r['p'],s_r['value'],'k.',alpha = 0.1)
ax3.plot([x1,x2],[y1,y2],'-r')
c.K_S檢驗:樣本數(shù)據(jù)累計頻數(shù)分布f(x)和理論分布g(x)(如正態(tài)分布)比較,f(x)-g(x)最大值梗掰,p值>0.05接受f(x),p<0.05拒絕f(x)接受g(x)
步驟:(1)累計頻率分布:次數(shù)嵌言、累計次數(shù)、累計頻率(2)標準化取值-把非正態(tài)分布變成正態(tài)分布:(值-均值u)/std標準差(3)查閱標準正態(tài)分布及穗,對應(yīng)出理論值(4)D=累計頻率-理論分布的最大值(5)所得出的最大值對照顯著性對照表摧茴,求出p值是否大于0.05,若大于則滿足g(x)
快速方法:
from scipy import stats
stats.kstest(df['value'], 'norm', (u, std))
# .kstest方法:KS檢驗埂陆,參數(shù)分別是:待檢驗的數(shù)據(jù)蓬蝶,檢驗方法(這里設(shè)置成norm正態(tài)分布)尘分,均值與標準差
# 結(jié)果返回兩個值:statistic → D值,pvalue → P值
# p值大于0.05丸氛,為正態(tài)分布
(6)相關(guān)性分析:
a.pearson相關(guān)系數(shù):必須滿足正態(tài)分布培愁,通過公式得到系數(shù)>0.5就相關(guān)
先通過KS檢驗,然后
data = pd.DataFrame({'智商':[106,86,100,101,99,103,97,113,112,110],
'每周看電視小時數(shù)':[7,0,27,50,28,29,20,12,6,17]})
data.corr()#默認pearson
data.corr(method='spearman')
b.sperman相關(guān)系數(shù):適用于非正態(tài)分布缓窜,通過公式得到系數(shù)>0.5就相關(guān)
4. 建模層:機器學(xué)習(xí)基于python
監(jiān)督學(xué)習(xí):已知訓(xùn)練xy預(yù)測x的y值
(1)線型回歸:
參考https://www.cnblogs.com/nxld/p/6123239.html
線型回歸輸入的是連續(xù)變量定续,輸出的也是連續(xù)變量
a.散點圖判斷變量關(guān)系
b.擬合回歸線
c.求R方檢驗>0.8誤差小
d.預(yù)測
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(xtrain[:,np.newaxis],ytrain)#****sklearn要求輸入的訓(xùn)練集為矩陣
xtest = np.linspace(0,10,1000)
ytest = model.predict(xtest[:,np.newaxis])
model.coef_#斜率
model.intercept_#截距
#誤差檢驗
r2 = model.score(xtrain[:,np.newaxis],ytrain)
#R-square非常接近于1,線性回歸模型擬合較好
#實例:計算pizza的價格
df = pd.DataFrame({'直徑':[6,8,10,14,18],
'價格':[7,9,13,17.5,18]},
index=[1,2,3,4,5])
print(df)
#畫圖
plt.scatter(df['直徑'],df['價格'])
plt.xlim(0,20)
plt.ylim(0,20)
plt.xlabel('直徑(英寸)')
plt.ylabel('價格(美元)')
plt.grid()
#構(gòu)建模型:sklearn要求x為二維數(shù)組禾锤,所以會用到xtest[:,np.newaxis]或xtest.reshape(-1,1)
from sklearn.linear_model import LinearRegression
x = df['直徑'].reshape(-1,1)
y = df['價格']
xtest = np.linspace(0,20,100)
model = LinearRegression()
model.fit(x,y)
pre = model.predict(xtest[:,np.newaxis])
plt.plot(xtest,pre,color='red')
print(model.coef_)#斜率
print(model.intercept_)#截距
#評估m(xù)odel.score
r = model.score(x,y)
print(r)#接近于1
(2)邏輯回歸:
參考https://blog.csdn.net/weixin_39910711/article/details/81607386
邏輯回歸輸入的是連續(xù)變量私股,輸出是分類離散變量
邏輯回歸是在線性回歸上套用了S函數(shù)
自我理解:(1)是S函數(shù)的內(nèi)層函數(shù)(2)是LR分類器的外層函數(shù),當有訓(xùn)練集xy時能求得S內(nèi)層函數(shù)z的值(z>0或z<0)恩掷,然后求得z>0時g(z)=1倡鲸,z<0時g(z)=0,z=0時g(z)=0.5
實際應(yīng)用:
from collections import OrderedDict#對字典中元素排序
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
#數(shù)據(jù)集
examDict={
'學(xué)習(xí)時間':[0.5,0.75,1,1.25,1.5,1.75,1.75,2,2.25,2.5,
2.75,3,3.25,3.5,4,4.25,4.5,4.75,5,5.5],
'通過考試':[0,0,0,0,0,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1]
}
examorderdict = OrderedDict(examDict)
examdf = pd.DataFrame(examorderdict)
#提取特征和標簽,把學(xué)習(xí)時間作為特征屬性黄娘,考試時間作為標簽
exam_x = examdf['學(xué)習(xí)時間']
exam_y = examdf['通過考試']
#繪制散點圖查看原始數(shù)據(jù)的分布
#plt.scatter(exam_x,exam_y)
plt.xlabel('學(xué)習(xí)時間')
plt.ylabel('是否通過考試')
#建立訓(xùn)練數(shù)據(jù)集和測試集:交叉驗證train_test_split(樣本特征峭状,樣本標簽,訓(xùn)練數(shù)據(jù)占比)
from sklearn.cross_validation import train_test_split
xtrain,xtest,ytrain,ytest = train_test_split(exam_x,exam_y,train_size=0.8)
print(xtrain,ytrain)
print(xtest,ytest)
plt.scatter(xtrain,ytrain,color='blue',label='訓(xùn)練數(shù)據(jù)')
plt.scatter(xtest,ytest,color='red',label='測試數(shù)據(jù)')
plt.xlabel('學(xué)習(xí)時間')
plt.ylabel('是否通過考試')
plt.legend()
#sklearn要求輸入的特征必須是二維數(shù)組
x_train = xtrain.values.reshape(-1,1)
x_test = xtest.values.reshape(-1,1)
from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
model.fit(x_train,ytrain)
#獲取模型的概率值
p = model.predict_proba(3)
#print(p)
pre = model.predict(0)
print(pre)
#反推回歸分析的函數(shù)
#斜率coef_ 截距intercept_
coef = model.coef_
inter = model.intercept_
x = 3
z = coef*x+inter
y = 1/(1+np.exp(-z))
print(y)#得到值是否大于0.5
交叉檢驗:建立訓(xùn)練集和測試集
from sklearn.cross_validation import train_test_split
xtrain,xtest,ytrain,ytest = train_test_split(exam_x,exam_y,train_size=0.8)
(3)KNN分類算法
如果一個樣本在特征空間中k個最鄰近的樣本中大多數(shù)屬于某一列逼争,那么該樣本也屬于那一列优床。所以,KNN算法結(jié)果取決于k的選擇誓焦;
思想:在訓(xùn)練集中數(shù)據(jù)和標簽已知情況下胆敞,輸入測試數(shù)據(jù),將測試數(shù)據(jù)的特征和訓(xùn)練集中特征比較杂伟,找到訓(xùn)練集中與之最為相似的前k個數(shù)據(jù)移层,則該測試數(shù)據(jù)對應(yīng)的類別就是k個數(shù)據(jù)中出現(xiàn)次數(shù)最多的那個分類。
#數(shù)據(jù)集赫粥,確定特征屬性和特征標簽
data = pd.DataFrame({'name':['北京遇上西雅圖','喜歡你','瘋狂動物城','戰(zhàn)狼2','力王','敢死隊'],
'fight':[3,2,1,101,99,98],
'kiss':[104,100,81,10,5,2],
'type':['Romance','Romance','Romance','Action','Action','Action']})
#畫圖
plt.scatter(data[data['type']=='Romance']['fight'],data[data['type']=='Romance']['kiss'],color='blue')
plt.scatter(data[data['type']=='Action']['fight'],data[data['type']=='Action']['kiss'],color='red')
plt.xlim(-20,120)
plt.ylim(-20,120)
plt.grid()
#預(yù)測屬性
data2 = pd.DataFrame(np.random.randn(100,2)*50,columns=['kiss','fight'])
#建立KNN模型
from sklearn import neighbors
model = neighbors.KNeighborsClassifier()
model.fit(data[['fight','kiss']],data['type'])
pre = model.predict(data2[['fight','kiss']])
data2['type'] = pre
plt.scatter(data2[data2['type']=='Romance']['fight'],data2[data2['type']=='Romance']['kiss'],color='blue',marker='x')
plt.scatter(data2[data2['type']=='Action']['fight'],data2[data2['type']=='Action']['kiss'],color='red',marker='x')
print(pre)
非監(jiān)督學(xué)習(xí):無訓(xùn)練集直接預(yù)測x的y值
(1)關(guān)聯(lián)規(guī)則Aprior
(2)關(guān)聯(lián)規(guī)則FP-growth
從樹底部開始挖掘:
在FP-tree中以I5結(jié)尾的節(jié)點鏈共有兩條观话,分別是<(I2:7),(I1:4)傅是,(I3:2),(I5:1)>和<(I2:7)蕾羊,(I1:4)喧笔,(I5:1)>。
其中龟再,第一條節(jié)點鏈表表示客戶購買的物品清單<I2书闸,I1,I3利凑,I5>在數(shù)據(jù)庫中共出現(xiàn)了1次浆劲。需要注意到是嫌术,盡管<I2,I4>在第一條節(jié)點鏈中出現(xiàn)了4次牌借,單個物品<I2>出現(xiàn)了7次度气,但是它們與I5一起出現(xiàn)只有1次,所以在條件FP-tree中將<(I2:7)膨报,(I1:4)磷籍,(I3:2),(I5:1)>記為<(I2:1)现柠,(I1:1)院领,(I3:1),(I5:1)>够吩。同理比然,第二條節(jié)點鏈表示客戶購買的物品清單<(I2:7),(I1:4)周循,(I5:1)>在數(shù)據(jù)庫中只出現(xiàn)了一次强法。我們將p的前綴節(jié)點鏈<(I2:1),(I1:1)鱼鼓,(I3:1)拟烫,(I5:1)>和<(I2:1),(I1:1)迄本,(I5:1)>稱為I5的條件模式基(conditional pattern base)從圖可以看到I5的條件FP-tree中滿足支持度閾值的剩下2個節(jié)點硕淑,所以以I5結(jié)尾的頻繁項集有(I5:2),(I1,I5 :2),(I2,I5 :2),(I1,I2,I5 :2)
總結(jié)
關(guān)聯(lián)規(guī)則就是從一些項集中找到關(guān)聯(lián)
支持度就是出現(xiàn)某一項集的次數(shù)/總數(shù)嘉赎;
置信度就是對于規(guī)則{Diaper}→{Beer}置媳,{Diaper, Beer}的支持度計數(shù)除于{Diaper}的支持度計數(shù),為這個規(guī)則的置信度公条。例如規(guī)則{Diaper}→{Beer}的置信度為3÷3=100%拇囊。說明買了Diaper的人100%也買了Beer。
置信度confidence=P(B|A)=P(AB)/P(A),指的是發(fā)生事件A的基礎(chǔ)上發(fā)生事件B的概率靶橱。
強關(guān)聯(lián)規(guī)則:大于或等于最小支持度閾值和最小置信度閾值的規(guī)則叫做強關(guān)聯(lián)規(guī)則寥袭。
區(qū)別:apriori算法多次掃描交易數(shù)據(jù)庫,每次利用候選頻繁集產(chǎn)生頻繁集关霸;而FP-growth則利用樹形結(jié)構(gòu)传黄,無需產(chǎn)生候選頻繁集而是直接得到頻繁集,大大減少掃描交易數(shù)據(jù)庫的次數(shù)队寇,從而提高了算法的效率膘掰。但是apriori的算法擴展性較好,可以用于并行計算等領(lǐng)域
(3)K-Means聚類算法
見另一篇簡書:http://www.reibang.com/p/2d4cf11e8646
結(jié)論層
包括以下六層:
報告背景
報告目的
數(shù)據(jù)來源佳遣、數(shù)據(jù)量等基本情況
分頁圖表及本頁結(jié)論
各部分小結(jié)和最終結(jié)論
下一步策略及趨勢預(yù)測
最后分享一個自己畫的腦圖: