數據分析五步驟

本文主要內容

  • 用numpy與pandas分別表示一維數組與多維數組,你會發現用pandas表示的數組更適合現實生活中的數據分析。
  • 通過分析銷售數據集來展示數據分析的五個過程:
    • 1.提出問題
    • 2.理解數據
    • 3.數據清理
    • 4.建立模型
    • 5.數據可視化

幕布格式轉知乎格式的修改:

  • 正文內容:加分割線與改變一些標題、加句號、圖片標註來源及標題、去除沒必要的空行與黑點;
  • 補充未解決問題;
  • 最後補上參考資料。

用numpy、pandas分析一維與多維數組

  • 維是什麼?
    • 數組的維=機器學習里的維:指特徵,是列,是變數。
  • numpy、pandas的一維與多維表達形式是否一樣?
    • numpy一維數組與多維數組表達是一樣的
      • np.array([第0行],[第1行],[第2行])

#numpy一維a1=np.array([2,3,4,5])a1#結果:array([2, 3, 4, 5])#numpy多維an=np.array([ [1,2,3,4], [5,6,7,8], [9,10,11,12]])#結果:array([[ 1, 2, 3, 4], [ 5, 6, 7, 8], [ 9, 10, 11, 12]])

    • pandas一維數組與多維數組表達不一樣
      • pandas一維:
        • 常見:pd.series([特徵值])
        • 比較少見:pd.series([特徵值],index=[特徵名])
        • series沒有type代碼判斷:AttributeError: Series object has no attribute type
      • pandas多維:
        • 按行表示:list形式,pd.DataFrame([list形式])
        • 按列表示:字典dic形式,pd.DataFrame({dict})

#pandas一維p1=pd.Series([54.74,190.9,173.14,1050.3,181.86,1139.49], index=[騰訊, 阿里巴巴, 蘋果, 谷歌, Facebook, 亞馬遜])#pandas多維:按列以字典dic形式pn=pd.DataFrame({ 購葯時間:[2018-01-01 星期五,2018-01-02 星期六,2018-01-06 星期三], 社保卡號:[001616528,001616528,0012602828], 商品編碼:[236701,236701,236701], 商品名稱:[強力VC銀翹片,清熱解毒口服液,感康], 銷售數量:[6,1,2], 應收金額:[82.8,28,16.8], 實收金額:[69,24.64,15]})#pandas多維:按行表示,這種方法是否比較低效df2 = pd.DataFrame([[1, San Diego, 100],[2, Los Angeles, 120],[3, San Francisco, 90],[4, Sacramento, 115]],columns = [Store ID, Location, Number of Employees ])

代碼結果

    • numpy與pandas比較
      • numpy更適合數學計算(np.array()沒有特徵名),pandas更適合表格(pd更強調header、index_col、index=[])
      • 描述性統計與數據預處理多用pandas
      • 抽取隨機data多用numpy:參考鏈接。

https://docs.scipy.org/doc/numpy-1.14.0/reference/routines.random.html?

docs.scipy.org


切片=篩選(兩種切片)

  • 特徵位置名篩選
    • df.loc[:,["特徵名1","特徵名2"]]
  • 特徵位置數篩選
    • df.iloc[:,2:4]
  • 多條件篩選
    • df.loc[df.特徵名1>35]
    • df.loc[(df.特徵名1>35)&(df.特徵名1=="北京")]
    • 參考:

小匿:用Python實現excel 14個常用操作?

zhuanlan.zhihu.com圖標

#切片(最外面是中括弧)#按照特徵名切片pn.loc[:,["商品名稱"]]#按照特徵的位置切片pn.iloc[:2,3:5]#多條件切片pn.loc[pn.實收金額>17]pn.loc[(pn.實收金額>17)&(pn.銷售數量>2)]

切片代碼及結果


數據分析的五個步驟

1.提出問題

2.理解數據(常用pandas)

  • 先導入包,再讀取數據集;
  • 行列數、缺失值、數據類型判斷(df.info()包括df.shape內容與df.dtypes內容與df.isnull(.value_counts());
  • 查看前五行或者後五行數據;
  • 描述性統計:df.describe()

#導入需要的包import pandas as pdimport matplotlib.pyplot as plt#讀取數據df=pd.read_excel("朝陽醫院2018年銷售數據.xlsx")#行列數、缺失值、數據類型判斷(df.info()包括df.shape內容)#print("行列數:",df.shape)df.info()#共6578行,7列里存在缺失值#數據類型幾乎都合理(該數值型是數值型,)

df。info代碼結果

#查看前五行或者後五行數據df.head()#df.tail(),括弧里可以加數字

df.head()代碼結果

#描述性統計df.describe()#很奇怪:銷售數量、應收金額、實收金額存在負數

描述性統計代碼結果

  • 3.數據清洗(數據預處理,常用pandas)
    • 1.選擇需要的數據(子集)。
    • 2.列名重命名(特徵重命名)。

df.rename(columns={"舊名":"新明"},inplace=True)

# 1.選擇需要的數據(子集,即選擇需要的列)#這裡的列只有7個,少,沒必要刪除# 2.列名重命名(特徵重命名):df.rename["舊名",「新名]df.rename(columns={"購葯時間":"銷售時間"},inplace=True)df.head()inplace=False,數據框本身不會變,而會創建一個改動後新的數據框,默認的inplace是Falseinplace=True,數據框本身會改動

    • 3.排序-兩個方法+把默認的升序改為降序
      • 排序1:在讀取數據時排序df.read_csv("文件名",index_col="某特徵")
      • 排序2:修改排序列
      • 排序3:後期調整排序
        • pd默認升序,若默認升序改成降序加asending=False,
        • 把默認最後的空值改成排在前列的空值加na.posion="first"

df=df.sort_values(by=銷售時間,ascending=False,na_position="first")

        • 參考 pandas.pydata.org/panda

# 3.排序#按銷售日期進行升序排列,#默認升序,若默認升序改成降序加asending=False,# 把默認最後的空值改成排在前列的空值加na.posion="first"#參考 https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.sort_values.htmldf=df.sort_values(by=銷售時間,ascending=False,na_position="first")df.head(20)

排序及前排空值

    • 4.缺失值判斷與處理(刪除、用某值替代)
      • what:什麼是缺失值
        • 缺失值是空值;
        • pandas是na表示;
        • numpy是nan表示。
      • 缺失值判斷
        • #判斷是否有空值笨方法:只適合小數據集df.isna()。
        • #判斷是否存在空值方法:df.info里每列的非空數與數據集的shape[0]比較。
        • 空值數量判斷 df.isnull(.value_counts()
      • 缺失值處理
        • 刪除缺失值:df.dropna(),這裡默認刪axis=0(刪行),how=「any」。
        • 用某值取代(比如0):df.fillna(0)
        • dropna參考:pandas.pydata.org/panda
        • fillna參考:pandas.pydata.org/panda
      • 常見實際操作
        • df=df.dropna()
        • df.shape,直接通過判斷shape來確定空值是否刪除。

# 空值處理:刪除與用0填充#空值刪除,dropna默認0=行,默認存在一個空值就刪除#參考https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.dropna.htmldf=df.dropna()df.shape #判斷是否有空值笨方法:只適合小數據集df.isna() #判斷是否存在空值方法:df.info里每列的非空數與數據集的shape[0]比較 #dropna參考:https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.dropna.html #fillna參考:https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.fillna.html

    • 5.數據類型轉換:
      • 需要的數值型數據把字元型str轉為數值型float或int:df.A=df.A.astype("float")
      • 日期數據把字元串轉換為日期數據類型
        • 第一步,日期分離並保留前一部分:2018-01-01 星期五
          • 先去除空值:如果不先去除空值,經常報錯AttributeError: float object has no attribute split
          • 接著測試如何抽取日期字元串
          • 再編寫需要的日期函數
          • 然後把原始日期導入編寫的日期函數
          • 最後把數據集導入df里(取代原列或者新增一列)
        • 第二步,日期個數由字元串object的str轉為datetime格式
        • 參考:

pandas.to_datetime - pandas 0.22.0 documentation?

pandas.pydata.org

測試如何分離與抽取單個日期的字元

#5。數據類型轉換:#5.1 需要的數值型數據把字元型str轉為數值型,比如df.A=df.A.astype("float")#這裡都ok#3.2 日期轉換:先分離日期,再把日期數據object(str)轉換為datetime類型#因為日期是2018-01-01 星期五#需要先編寫一個分割日期的函數def split_time(multiple_date): a=[] for value in multiple_date: needtime=value.split(" ")[0]#用空格split並抽取2018-01-01 a.append(needtime) #將列錶轉行為一維數據Series類型 a=pd.Series(a) return a #把銷售時間抽取並導入自編的日期分割函數里time0=df.銷售時間time=split_time(time0)#a1=split_time(time0)注意:如果運行後報錯:AttributeError: float object has no attribute split是因為Excel中的空的cell讀入pandas中是空值(NaN),這個NaN是個浮點類型,一般當作空值處理。所以要先去除NaN在進行分隔字元串#把修改好的time導入df里(df["銷售時間"]=time)或者df加一列(df[date]=time)df["銷售時間"]=time#日期數據object(str)轉換為datetime類型#df["銷售時間"]=pd.to_datetime(df["銷售時間"],format=%Y-%m-%d)#pd.to_datetime(13000101, format=%Y%m%d, errors=coerce)#參考https://pandas.pydata.org/pandas-docs/stable/generated/pandas.to_datetime.htmldf["銷售時間"]=pd.to_datetime(df["銷售時間"],format=%Y-%m-%d,errors=coerce)df.dtypes

df.dtypes代碼結果

    • 6.重複值處理/異常值處理
      • 先判斷重複值,即統計重複值個數。
        • df["訂單明細號"].duplicated().value_counts()
      • 再刪除重複值
        • 常用的:df=df.drop_duplicates()
        • 用的比較少:df=df.drop_duplicates("某特徵")#刪除某列的重複值

重複值判斷與處理代碼

4.建模與5.數據可視化

  • 業務指標1:月均消費次數=總消費次數 / 月份數
  • 指標2:月均消費金額 = 總消費金額 / 月份數
  • 指標3:客單價=總消費金額 / 總消費次數
  • 指標4:消費趨勢,畫圖:折線圖
    • 客單價(per customer transaction)是指商場(超市)每一個顧客平均購買商品的金額,客單價也即是平均交易金額。

#業務指標1:月均消費次數=總消費次數 / 月份數#總消費次數=行數consumer_counts=df.shape[0]print("總消費次數:",consumer_counts)#月份數=(最後一次日期-第一次日期)//30的取整#需要先排序df=df.sort_values(by="銷售時間")first_time=df.iloc[0,0]print("第一次日期:",first_time)df0=df.sort_values(by="銷售時間",ascending=False)last_time=df0.iloc[0,0]print("最後一次日期:",last_time)#計算總天數days=(last_time-first_time).daysprint("總天數:",days)#求月份months=days//30print("取整月份:",months)#月均消費次數=總消費次數 / 月份數ave_month_counts=consumer_counts/monthsprint("月均消費次數:",ave_month_counts)

#指標2:月均消費金額 = 總消費金額 / 月份數=總實收金額/月份數sum_money=df["實收金額"].sum()ave_money=sum_money/monthsprint(ave_money)

#指標3:客單價(per customer transaction)=總消費金額 / 總消費次數=總實收金額/總消費次數per_customer_transaction=sum_money/consumer_countsprint(per_customer_transaction)

前三個指標的代碼結果

#指標4:消費趨勢,畫圖:折線圖#按月分組(日期單獨設置index)並繪圖#平時分組都是df.groupby([A, B]).sum()df.index=df[銷售時間]df_month=df.groupby(df.index.month).sum()df_monthimport matplotlib.pyplot as pltfrom pylab import mplplt.plot(df_month.應收金額)plt.title("monthly comsumption trend ")plt.grid(True)

可視化


我的成長

以前學python,看不懂英文documention,只看國內的文章;

現在熟練部分python後,能看懂這些英文documentation,也能自編def函數。

未解決問題

  • 日期格式互相轉換需要多練習
  • numpy在哪些比pandas比較常用

參考資料

  • 知乎live:從零學會數據分析:數據分析的基本過程

小匿:用Python實現excel 14個常用操作?

zhuanlan.zhihu.com圖標

  • pandas documentation

Random sampling (?

docs.scipy.org

pandas.to_datetime - pandas 0.22.0 documentation?

pandas.pydata.org

pandas.DataFrame.dropna - pandas 0.22.0 documentation?

pandas.pydata.org

pandas.DataFrame.fillna - pandas 0.22.0 documentation?

pandas.pydata.org

  • numpy documentation

Random sampling (?

docs.scipy.org


推薦閱讀:

數據分析師需要學習什麼軟體
成為一名數據分析師,應該掌握怎樣的技術棧?
數據分析師職業生涯規劃與等級
15款免費預測分析軟體!收藏好,別丟了!

TAG:數據分析 | 數據挖掘 | 數據分析師 |