數據分析 | 零基礎入門數據分析(五):從入門到脫發?

大家好,我是不知所措撓頭娜。o(〃'▽'〃)o
今天開篇沒有廢話。如果你學了前面提到的python的幾個包,看了作業題目覺得很想自己動手試試,可以私下找我把作業需要用到的數據資料分享給你~


接著分享娜娜醬的第四個python學習小作業:某公司產品銷量分析

作業要求:
1、批量讀取數據,并輸出以下信息:數據量、數據字段名、每個文件分別有多少缺失值
① 創建獨立函數,從讀取數據到以上輸出要求
② 運行代碼調用創建函數,對數據進行批量處理
2、創建函數,批量讀取數據,用均值填充缺失值數據,并完成以下計算及圖表
(1)讀取數據并用均值填充缺失值;對“日期”字段進行時間序列處理,輸出三個Dataframe文件data1,data2,data3
(2)分別計算data1,data2,data3中A,B產品的月總銷量,并繪制多系列柱狀圖,存儲在對應的圖片文件夾路徑
(3)分別計算A、B產品在每個月中哪一天超過了月度80%的銷量,輸出日期
3、創建函數,讀取數據并合并,對兩種產品銷量作線性回歸擬合,預測
(1)讀取數據刪除缺失值;對“日期”字段進行時間序列處理,合并三個月數據,輸出data;
(2)針對A產品銷量和B產品銷量數據做回歸分析,制作散點圖并存儲,并預測當A銷量為1200時,B產品銷量值


AB產品銷量數據大概長這樣

娜娜醬的代碼(在jupyter notebook做的):
第1題:加載模塊,創建函數讀取產品銷量數據

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['axes.unicode_minus']=False
from sklearn.linear_model import LinearRegression
import datetime
import os
% matplotlib inline

#1、批量讀取數據,并輸出以下信息
#(1)數據量
#(2)數據字段columns
#(3)輸出每個文件分別有多少缺失值
#創建函數 :f()
def f():
    add = input('請指定工作目錄路徑:\n')
    while os.path.exists(add) == False:
        add = input('輸入有誤,路徑不存在,請重新指定工作目錄:\n')
    else:
        os.chdir(add)
    for i in os.walk(add):
        filename_lst = i[2]
    print('數據已加載')
# 這里用了os.walk(path) ,可以返回路徑中的信息及文件,結果為一個生成器

    for j in range(len(filename_lst)):
        data = pd.read_excel(filename_lst[j],header = 0,index_col=0)
        datasize = len(data) #數據量
        colname = data.columns.values.tolist() # 數據字段
        nan_num = len(data[data.isnull().values == True]) # 缺失值數量
        print('第%i個數據數據量為:%i' %(j+1,datasize))
        print('第%i個數據字段為:%s' %(j+1,colname))
        print('第%i個數據缺失值數量為:%i' %(j+1,nan_num))
        print('----------')

#調用函數
f()
print('-----The end of Q1-----')

上段運行后,可以得到:


第2題:(1)批量讀取數據,用均值填充缺失值數據對“日期”字段進行時間序列處理,轉換成period

#創建函數:Q2_read_and_fillna()
def Q2_read_and_fillna():
    add = r'C:\Users\my\Desktop\python_project5'
    os.chdir(add)
    for i in os.walk(add):
        filename_lst = i[2]
    
    dataset = []
    for j in range(len(filename_lst)):
        data = pd.read_excel(filename_lst[j],header = 0,index_col=0)
        
        #用均值填充缺失值
        colname = data.columns.values.tolist()
        for col in colname:
            u = data[col].mean()
            data[col].fillna(u,inplace = True)
        
        #日期轉換成時間序列   
        dataindex = data.index
        dataindex.to_period()
        
        #將data加入dataset  
        dataset.append(data)
    return(dataset)

#調用函數
data1 = Q2_read_and_fillna()[0]
data2 = Q2_read_and_fillna()[1]
data3 = Q2_read_and_fillna()[2]
print('數據已加載已處理!')
print('-----The end of Q2(1)-----')

此時data1~data3就已經處理好了:


第2題:(2)分別計算data1~data3中A、B產品的月總銷量,繪制多系列柱狀圖并存儲

#創建函數: Q2_monthly_sales(*dfs)
def Q2_monthly_sales(*dfs):
    sales_A = []
    sales_B = []
    for df in dfs:
        sales = df.sum()
        print(sales)
        sales_A.append(sales[0])
        sales_B.append(sales[1])
    
    #創建銷量dataframe
    saledf = pd.DataFrame({'產品A月銷量':sales_A,'產品B月銷量':sales_B},
                         index = pd.period_range('201801','201803',freq = 'M'))
    #return(saledf)
    
    #繪圖
    saledf.plot(kind = 'bar',grid = True,alpha = 0.5,rot = 0)
    plt.title('1-3月產品A、B總銷量柱狀圖')
    plt.savefig(r'C:\Users\my\Desktop\python_project5_圖片保存\銷量圖.png')

#調用函數
Q2_monthly_sales(data1,data2,data3)
print('銷量柱狀圖已繪制已保存!')
print('-----The end of Q2(2)-----')

運行上段代碼可得到每月產品總銷量:

一季度產品A、B總銷量柱狀圖

第2題:(3)分別計算A、B產品在每個月中哪一天超過了月度80%的銷量,輸出日期

#創建函數:Q2_date_when_sales_over80(*dfs)
def  Q2_date_when_sales_over80(*dfs):
    date_A = []
    date_B = []
    for df in dfs:
        df['A_cum'] = df['productA'].cumsum()
        df['B_cum'] = df['productB'].cumsum()
        df_Aover80 = df[df['A_cum']>(0.8*df['productA'].sum())]
        df_Bover80 = df[df['B_cum']>(0.8*df['productB'].sum())]
        date_A.append(str(df_Aover80.iloc[0].name))
        date_B.append(str(df_Bover80.iloc[0].name))
    return(date_A,date_B)

#調用函數
print('A、B產品各月超過80%的銷量日期分別為:\n')
print(Q2_date_when_sales_over80(data1,data2,data3))
print('-----The end of Q2(3)-----')

可知A產品各月銷量超過80%總銷量的日期為:
2018年01月26日、2018年02月23日、2018年03月25日
B產品各月銷量超過80%總銷量的日期為:
2018年01月26日、2018年02月24日、2018年03月26日
上面兩個日期非常相近,可以猜測A、B產品可能存在某種關聯,下面第3題可以證實我們的猜測。

第3題:(1)讀取一季度三個月的數據并合并,做散點圖觀察A,B產品銷量情況,并做回歸

#創建函數:Q3_read_and_combine()
def Q3_read_and_combine():
    add = r'C:/Users/my/Desktop/python_project5'
    os.chdir(add)
    for i in os.walk(add):
        filename_lst = i[2]
        #print(filename_list)
    
    dataset = []
    for j in range(len(filename_lst)):
        data = pd.read_excel(filename_lst[j],header = 0,index_col=0)
        
        #日期轉換成時間序列   
        dataindex = data.index
        dataindex.to_period()
        #刪除缺失值
        data.dropna(inplace = True)
        #將data加入dataset  
        dataset.append(data)
                
    #連接data
    data_re = pd.concat([dataset[0],dataset[1],dataset[2]])
    return(data_re)

#調用函數
data_combine = Q3_read_and_combine()
print(data_combine)
print('數據已加載已處理已合并!')
print('-----The end of Q3(1)-----')

這樣一季度的銷量就已經處理好了:


第3題:(2)針對A產品銷量和B產品銷量數據做回歸分析,制作散點圖并存儲,預測當A銷量為1200時,B產品銷量值

#創建函數:Q3_regression_analysis(df)
def Q3_regression_analysis(df):
    
    #樣本數據
    xtrain = data_combine['productA']
    ytrain = data_combine['productB']

    #線性回歸分析
    model = LinearRegression()
    model.fit(xtrain[:,np.newaxis],ytrain)
    xtest = np.linspace(0,1000,1000)
    ytest = model.predict(xtest[:,np.newaxis])
    
    #繪制散點圖、線性回歸擬合直線
    plt.scatter(xtrain,ytrain,marker = '.',color = 'k')
    plt.plot(xtest,ytest,color = 'r')
    plt.grid()
    plt.title('A-B產品銷量回歸擬合')
    plt.savefig(r'C:\Users\my\Desktop\python_project5_圖片保存\線性回歸擬合.png')

    return(model.predict(1200))
    
#調用函數    
Q3_regression_analysis(data_combine) 
print('當A銷量為1200時,B的銷量預測值為:%i'%Q3_regression_analysis(data_combine))
print('A-B產品銷量回歸擬合圖已繪制已保存!')
print('-----The end of Q3(2)-----')

果然A、B產品銷量存在某種關系~
線性回歸擬合

可能有人會覺得,這些操作有什么難的,Excel也能做出來,還比敲代碼快。確實Excel是一個非常強大的工具,可以做很多比較復雜的分析。不過,正因為它太“高大上”了,點幾下鼠標就可以分析,也就意味著它太不自由了。而且如果我們每個月都需要分析很多個產品的銷量,又或者數據量很大的時候,python的優勢就突顯出來了:這套代碼只需要寫好一次,以后每次使用前修改幾個參數,調整幾行代碼即可,極大地減少了重復動作。大量的機械的重復交給代碼就好了,多余出的時間可以用來做更有意思的事情哪!


我是娜娜醬,請繼續期待后續數據分析打怪升級小作業~前面這幾個作業比較初級,從下個作業起畫風要變得炫酷起來了!

這是零基礎入門數據分析系列的第五篇,其他內容在這里:
第一篇:零基礎小白自學數據分析:從入門到摔門?
第二篇:零基礎小白自學數據分析:從入門到絆倒?
第三篇:零基礎小白自學數據分析:從入門到住院?
第四篇:零基礎小白自學數據分析:從入門到出家?
也許你還想看看:數據分析,從入門到放棄

(-'?_?'-)謝謝您閱讀,請勿轉載。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 國家電網公司企業標準(Q/GDW)- 面向對象的用電信息數據交換協議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 11,121評論 6 13
  • 關于Mongodb的全面總結 MongoDB的內部構造《MongoDB The Definitive Guide》...
    中v中閱讀 32,010評論 2 89
  • 〇、前言 本文共108張圖,流量黨請慎重! 歷時1個半月,我把自己學習Python基礎知識的框架詳細梳理了一遍。 ...
    Raxxie閱讀 19,025評論 17 410
  • 《人生準則》 自尊贏得人尊重, 真誠打動眾人心。 頂天立地無愧色, 光明磊落無悔人。 窮富精善有底線, 不舍情義與...
    一葉知秋99閱讀 309評論 0 3
  • 現在通過內部測試、外部測試、市場數據的反饋來決定做什么的方式很省力,以至于很少去思考其背后的原因,這樣也許能贏得幾...
    呆牛閱讀 106評論 0 0