1. 案例概述
1.1 案例場(chǎng)景
每個(gè)銷(xiāo)售型公司都有一定的促銷(xiāo)費(fèi)用,促銷(xiāo)費(fèi)用可以帶來(lái)銷(xiāo)售量的顯著提升;
當(dāng)給出一定的促銷(xiāo)費(fèi)用時(shí),預(yù)計(jì)會(huì)帶來(lái)多大的銷(xiāo)售量?
1.2 數(shù)據(jù)概況
- 來(lái)源:生成的模擬數(shù)據(jù),非真實(shí)數(shù)據(jù)
- 維度數(shù)量:1
- 記錄數(shù):100
- 字段變量:第一列是促銷(xiāo)費(fèi)用,第二列是商品銷(xiāo)售量
- 數(shù)據(jù)類(lèi)型:浮點(diǎn)數(shù)值型
- 是否有缺失值:否
-
數(shù)據(jù):
image.png
1.3 案例過(guò)程
會(huì)使用的4個(gè)庫(kù)
- Re:正則表達(dá)式,程序中通過(guò)該庫(kù)來(lái)實(shí)現(xiàn)字符串分割
- Numpy:數(shù)組操作和處理庫(kù),程序中用來(lái)做格式轉(zhuǎn)換和預(yù)處理
- Sklearn:算法模型庫(kù),程序中使用了線性回歸方法linear-model
- Matplotlib:圖形展示庫(kù),用來(lái)在建模前做多個(gè)字段關(guān)系分析
2. 代碼詳解
# 導(dǎo)入庫(kù)
import re
import numpy
from sklearn import linear_model
from matplotlib import pyplot as plt
# 導(dǎo)入數(shù)據(jù)
fn = open('data.txt', 'r') # 打開(kāi)名為“data.txt”的文件,文件模式是只讀,并創(chuàng)建一個(gè)名為fn的文件對(duì)象
all_data = fn.readlines() # 從fn中讀取的行記錄,并保存到一個(gè)名為all_data的列表中
#print(all_data[0]) # 查看該列表的第一個(gè)數(shù)據(jù) 輸出:28192.0 68980.0
fn.close() # 關(guān)閉文件對(duì)象的占用
# 數(shù)據(jù)預(yù)處理
x = []
y = [] # 創(chuàng)建兩個(gè)空列表
for single_data in all_data: # 通過(guò)一個(gè)for循環(huán)每次從列表all_data中讀取一條數(shù)據(jù),并賦值給single_data
tmp_data = re.split('\t|\n', single_data) # 分別使用\t 和\n 作為分隔符,對(duì)single_data進(jìn)行數(shù)據(jù)分割,分割結(jié)果賦值為tmp_data
x.append(float(tmp_data[0]))
y.append(float(tmp_data[1])) # 將tmp_data的第一個(gè)值和第二個(gè)值分別追加到列表x和y中。追加前,先將每個(gè)數(shù)據(jù)通過(guò)float方法設(shè)為浮點(diǎn)型(數(shù)值型)
x = numpy.array(x).reshape([100, 1])
y = numpy.array(y).reshape([100, 1]) # 將x和y由列表類(lèi)型轉(zhuǎn)換為數(shù)組類(lèi)型,同時(shí)數(shù)組的形狀是100行1列
# 數(shù)據(jù)分析展示
plt.scatter(x, y) # 用散點(diǎn)圖展示x和y
plt.show() # 展示圖形
散點(diǎn)圖
通過(guò)散點(diǎn)圖發(fā)現(xiàn),x和y的關(guān)系呈現(xiàn)明顯的線性關(guān)系:
x增大時(shí),y增大;x減小時(shí),y減小。
初步判斷可以選擇線性回歸進(jìn)行模型擬合。
# 數(shù)據(jù)建模
model = linear_model.LinearRegression() # 創(chuàng)建一個(gè)模型對(duì)象
model.fit(x, y) # 將x和y分別作為自變量和因變量輸入模型進(jìn)行訓(xùn)練
# 模型評(píng)估
model_coef = model.coef_ # 獲取模型的自變量系數(shù)并賦值為 model_coef
model_intercept = model.intercept_ # 獲取模型的截距并賦值為 model_intercept
r2 = model.score(x, y) # 獲取模型的決定系數(shù)R的平方
# print(model_coef,model_intercept,r2) # 輸出:(array([[2.09463661]]), array([13175.36904199]), 0.7876414684758954)
即 y = 2.09463661 * x + 13175.36904199
決定系數(shù)為 0.7876414684758954,整體擬合效果不錯(cuò)。
# 銷(xiāo)售預(yù)測(cè)
new_x = 84610 # 創(chuàng)建促銷(xiāo)費(fèi)用常量
pre_y = model.predict( numpy.array(new_x).reshape(-1, 1)) # 對(duì)促銷(xiāo)費(fèi)用常量new_x輸入模型進(jìn)行預(yù)測(cè)
print (pre_y) # 輸出:[[190402.57234225]]
print (round (pre_y)) # 四舍五入,輸出:190403.0
3. 總結(jié)
本文實(shí)現(xiàn)了導(dǎo)入庫(kù)、獲取數(shù)據(jù)、數(shù)據(jù)預(yù)處理、數(shù)據(jù)展示分析、數(shù)據(jù)建模、模型評(píng)估、銷(xiāo)售預(yù)測(cè) 7個(gè)步驟。
用到的知識(shí):
- Python文件讀取
- Python基本操作(新建、追加)、for循環(huán)、變量賦值、字符串分割、數(shù)值轉(zhuǎn)換
- Numpy數(shù)組操作:列表轉(zhuǎn)數(shù)組、重新設(shè)置數(shù)組形狀
- 使用Matplotlib進(jìn)行散點(diǎn)圖展示
- 使用Sklearn進(jìn)行線性回歸的訓(xùn)練和預(yù)測(cè)
- 用print輸出指定數(shù)據(jù)
內(nèi)容來(lái)自:《Python數(shù)據(jù)分析與數(shù)據(jù)化運(yùn)營(yíng)》——宋天龍
