휴대 전화 회귀 트리에 대한 예측 가격을 기준으로 Jingdong 판매 데이터

오늘은 데이터 분석 및 실제 프로젝트 사례 연구의 광산 추천하기 "를 기반으로 회귀 나무와 가격 데이터를 예측 Jingdong 휴대 전화 판매를." 이 프로젝트는 분석을 기반으로 Jingdong 휴대 전화 판매 데이터, 휴대 전화 사용의 회귀 트리의 외부 특성에 따라에만 가격 예측의 시리즈를 확인합니다.

이 프로젝트는 실험실 건물에서 온다 "하우스 + 데이터 분석 및 광업 진짜" 다섯 번째 학생 : Ted_Wei.

데이터 수집

휴대폰의 가격과 코멘트 수가 단순히 모듈이 보이지 요청 크롤링을 통해 갈 동적 자바 스크립트 렌더링 정보입니다. 내 솔루션은 웹 브라우저 모듈 셀레늄 처음 사용하는 것입니다 각 코멘트 Jingdong, 가격, 및 번호에 휴대폰 ID를 내부 크롤링 크롬 브라우저를 사용합니다. 그리고 각 전화 판매 페이지는 각 단말기에 대한 주요 매개 변수를 크롤링, 이드 기어있어서 찾을 수 있습니다.

파충류 코드 parsing_code.py이 페이지를 통해 : https://www.kaggle.com/ted0001/dm05-998494/data 가져옵니다.

데이터 청소

수집 된 데이터를 각 컬럼 전화 파라미터 (예 등 가격, 메모리 크기, 픽셀, 등)을 포함, 각 행은 판매되는 휴대 전화를 나타내고, 행 1199, 21을 포함한다. 매우 비우호적의 분석을위한 자연 언어, 숫자가 아닌 정보로 수집 된 데이터의 대부분. 따라서, 데이터 분석의 초점이 실제로 누락 정보를 찾을 수있다 (예를 들어, "아니오"등 '공식 데이터를 참조'는 데이터 NaN3를 누락하는 것으로 간주 될 수있다)을 다시 모듈을 사용하기위한 것은, 상기 값이 유용한 정보를 추출하기 위해 자연 언어를 파싱한다.

데이터 세척 단계는 코드가 너무 많은 공간을 차지하게됩니다 게재하는 경우, 실제로는 매우 복잡하기 때문에 데이터 정리 코드 data_clean.py이 페이지를 통해 : https://www.kaggle.com/ted0001/dm05-998494/data 가져옵니다.

데이터 분석

주로 휴대 전화 사용 기계 학습 방법의 가격을 예측하기 위해 노력하고, 휴대 전화의 가격을 결정하는 요인을 탐구하는 브랜드 휴대 전화 매출 추정 및 비교 분석을 완료하기 위해, 질문에 직접 다음과 같습니다.

먼저 호출 모듈이 필요합니다

import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)

import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeRegressor
from sklearn.metrics import mean_absolute_error as mae

정리 된 데이터를 읽고, 데이터가 될 수있다 https://www.kaggle.com/ted0001/dm05-998494/data을 취득합니다.

data=pd.read_csv('../input/data-acquisitioncleaning/cleaned_data.csv')
data=data.set_index(['Unnamed: 0']) #DataFrame在存储为csv file以后原来的index会变为一个列,因此要重新设置index
data.shape

출력 :

(1199,21)

브랜드 휴대 전화 매출 추정 및 비교 분석

첫 번째는 비교 될 것입니다 휴대폰의 다양한 브랜드의 판매, 즉, 데이터를 청소 한 후 좋은 아이디어를 얻을 수 있습니다. Jingdong 오히려 특정 판매 각 전화보다는 의견의 수를 표시하기 때문에, 우리는 의견을 검토했다 기본 번호는 모든 휴대 전화 브랜드 매출의 비율을 추정 매출액에 비례한다

pie_plt=data.groupby(['brand']).sum()['comments'].sort_values(ascending=False)#统计每个品牌评论总数,以此作为我们对销量的估计
pie_plt

출력 :

brand
HUAWEI        11320592.0
Apple          9797100.0
XIAOMI         7995236.0
NOKIA          1324000.0
Philips        1227100.0
OPPO           1205300.0
vivo           1101330.0
K-Touch         793300.0
MEIZU           574900.0
SAMSUNG         539800.0
smartisan       364000.0
lenovo          275500.0
realme          157000.0
Meitu           109200.0
nubia            86000.0
chilli           58000.0
360              31000.0
ZTE              17000.0
Coolpad          12000.0
BlackBerry       10000.0
WE                  90.0
Name: comments, dtype: float64

우리는 위의 데이터에 더 잘 보여주기 위해 파이 차트를 사용할 수 있습니다

#绘制各个手机品牌估计销量的占比扇形图
fig,axes=plt.subplots(figsize=(12,12))
comment_sum=pie_plt.values.sum()
percen=[np.round(each/comment_sum*100,2) for each in pie_plt.values]
axes.pie(pie_plt.values,labels=pie_plt.index,labeldistance=1.2,autopct = '%3.1f%%')
axes.legend([pie_plt.index[i]+': '+str(percen[i])+"%" for i in range(len(percen))],loc='upper right',bbox_to_anchor=(1, 0, 1, 1))
axes.set_title('Estimated Handphone Market Share in China')
plt.show()

출력 :

위의 파이 차트에서, 우리는 중국에서 판매 화웨이, 애플, 기장은 각각 전체 매출의 30.6 %, 26.5 %, 21.6 %를 차지 상위 세 휴대 전화 브랜드 및 브랜드 판매의 나머지는 판매보다 훨씬 적은 것으로 추정 할 수있다 처음 세 브랜드. 위의 견적의 정확성을 확인하기 위해, 나는 2019 년 중국 휴대폰 시장의 각 브랜드의 점유율이 관련 정보를 보였다. 그것은 화웨이, 애플, 기장 화웨이, 기장과 애플의 시장 점유율은 데이터에 더 액세스 할뿐만 아니라, 각각 34 %, 9 %, 12 %를 차지 것을 발견했다. 원래 데이터 갭도 크다와 생체 OPPO의 점유율은 각각 19 % 및 18 %이다. 댓글 Jingdong 번호가 광범위 할 전화 회선의 판매를 반영 할 수있는 경우에, 나는 중국 시장의 온라인 판매를 고려하지 않고 거짓말 수 있습니다 그런 중대한 원인 데이터 불일치 이유가 있다고 생각합니다. 삶의 일반적인 경험, 그리고 (특히 작은 도시) 애플 기장 선 아래 매장의 수에 따라 생체 내 점포 수는 OPPO보다 훨씬 적습니다. 내가 판매 데이터를 오프라인으로 포함하지 않았다 아마 때문에, 온라인과 오프라인 시장의 시장, 그러나 나에게 신뢰할 수있는 데이터가 통계적으로 유의 한 차이와 데이터의 원인을 모두 포함한 전체 휴대 전화 시장. 오프라인 판매 데이터를 얻을 수 있다면, 그것은 더 이상 이유를 확인할 수 있습니다.

노키아, 필립스 휴대폰에 대한 회계 추정 매출은 실제로 (생체보다 더, OPPO) 3 % 이상, 그래서 그가 어떤 두 브랜드의 휴대 전화 판매 가격을 각각보고 싶어한다는 놀랍게도 또 다른 점,

data[(data['brand']=='NOKIA')|(data['brand']=='Philips')]['price'].median()#诺基亚和飞利浦手机价格中位数

출력 :

208.5
data[(data['brand']=='NOKIA')|(data['brand']=='Philips')]['price'].mean()#诺基亚和飞利浦手机价格平均数

출력 :

336.1190476190476

그것은 200-300 위안 가격보다 그 노키아, 필립스 휴대 전화를 더 많이 나타납니다, 다음 항목의 ID로 Jingdong 사이트를 방문하여 충분히 있는지 발견, 대부분 기능 기계를 판매 이들 두 브랜드. 이 스마트 폰에서 (일부 노키아 스마트 폰)이 보편적 인 시대를 가지고, 여전히 토지의 세 번째 에이커를 가지고, 그리고 완전히 시장 (특히 온라인 판매 채널) 중 기능 기계의 생각합니다. 아직도 익숙해 인구의, 벨소리 볼륨 큰 부분을 기계 기능을 사용하고, 기능 기계 긴 대기 시간에 어떤 노인이 특정 요구를 충족하기 때문일 수 있습니다.

요인은 휴대 전화의 가격을 결정 탐색하려면

또 다른 문제는 휴대폰 및 모바일 구성 매개 변수의 가격 사이의 관계를 연구 가치가있다. 우리가 전체의 이해를하기 위해서는 우리는 먼저 다양한 수치 데이터 간의 상관 관계 행렬을 그린 다음과 같은 가격에 브랜드, 스크린의 재질에 미치는 영향 등의 숫자가 아닌 데이터 (범주 형 데이터)를 모색 할 것입니다.

상관 관계 매트릭스를 그리고 분석

대부분은 우리의 데이터에서 누락 설정 아이폰의 가격 및 안드로이드, 전혀 다른 구성 및 애플 전화 구성 매개 변수, 우리는이 문제를 연구, 우리는 안드로이드 휴대폰을 생각해 보자. (가격 9999 휴대 전화는 또한 우리의 분석에서 제외되고, X9 화웨이 인해 비정상적인 가격 모델로 7 월 2019 년에 발행됩니다 영광입니다.)

correlation=data[(data['brand']!='Apple')&(data['price']!=9999)].corr()
#绘制相应correlation matrix的heatmap
fig,axes=plt.subplots(figsize=(8,8))
cax=sns.heatmap(correlation,vmin=-0.25, vmax=1,square=True,annot=True)
axes.set_xticklabels(['RAM', 'ROM', 'battery', 'comments', 'price', 'rear camera',
       'resolution', 'screen size', 'weight'])
axes.set_yticklabels(['RAM', 'ROM', 'battery', 'comments', 'price', 'rear camera',
       'resolution', 'screen size', 'weight'])
axes.set_title('Heatmap of Correlation Matrix of numerical data')
plt.show()

출력 :

우리는 그림의 가격과 최고 가격의 상관 관계도 저장 ROM 및 RAM 메모리, 각각 0.71 및 0.68에서 볼 수 있습니다. 둘째, 전지 용량 전지이고, 후방 카메라 후방 카메라의 개수는 화면 크기의 화면 크기는, 연관도가 각각 0.42이다. 그것은 더 많은 우리의 상식적인 판단과 일치이기도합니다. 우리는 또한 명확하게 열 및 행 보라색 깊이는, 다양한 의견과 수치 매개 변수의 동료 대표는 작은 보여주고 의견의 수를 평가하고, 볼 수 있습니다. (우리의 데이타 값을 누락 광고 폐기 부분에서 자세히 누락 값을 설정 한 후에, 상기 상관 행렬의 값은 변화의 어느 정도의 것)

휴대 전화 브랜드 휴대 전화 가격의 영향을 살펴보기

물론, 의사 결정의 단말기 가격이 매우 중요한 요소뿐만 아니라 일부 숫자가 아닌 데이터 (범주 형 데이터). 휴대 전화 브랜드 생각하는 가장 가능성이 높습니다.

data.groupby(['brand']).median()['price'].sort_values(ascending=False).values.std() #计算不同品牌价格中位数集合的标准差

출력 :

1409.0576123336064

상기 데이터를 막대 그래프에 의해 표시보다 직관적 일 수있다.

bar_plt=data.groupby(['brand']).median()['price']

fig,axes=plt.subplots(figsize=(20,8))
axes.bar(bar_plt.index,bar_plt.values)
axes.set_title('Median price of handphones of various brands')

출력 :

Text(0.5, 1.0, 'Median price of handphones of various brands')

image

我们可以看到,各个品牌手机中位数价格层次不齐,这也和我们的常识性判断吻合,因为不同手机品牌的定位以及消费群体均有较大差异。

不同屏幕材料对手机价格影响的探索

还有一个很关键的因素其实是手机的屏幕材料,我们也可以用同样的方法比较不同屏幕材料对价格的影响。

data.groupby(['screen material']).median()['price'].sort_values(ascending=False).values.std() #计算不同屏幕材料价格中位数集合的标准差

输出结果:

1523.0026019740856

各种屏幕材料的手机的价格中位数展示如下

data.groupby(['screen material']).median()['price'].sort_values(ascending=False)

输出结果:

screen material
Dynamic AMOLED    5999.0
OLED曲面屏           5488.0
OLED              4288.0
Super AMOLED      2998.0
AMOLED曲面屏         2908.0
LCD               2399.0
AMOLED            2299.0
TFT LCD(IPS)      1999.0
LTPS              1999.0
IPS               1399.0
TFT               1199.0
Name: price, dtype: float64

用柱状图展示如下:

bar_plt2=data.groupby(['screen material']).median()['price']

fig,axes=plt.subplots(figsize=(18,8))
axes.bar(bar_plt2.index,bar_plt2.values)
axes.set_title('Median price of handphones of various screen materials')

输出结果:

Text(0.5, 1.0, 'Median price of handphones of various screen materials')

可以注意到的是,以上价格数值均在千元以上,而我们的数据集中还包含有价格很低廉的功能机,那它们的屏幕又都是什么材料呢?

data[(data['brand']=='NOKIA')|(data['brand']=='Philips')]['screen material'].value_counts()

输出结果:

TFT             27
IPS              3
TFT LCD(IPS)     1
Name: screen material, dtype: int64

可以看到,诺基亚和飞利浦的手机(大多为功能机)的屏幕材料大多为TFT和IPS。

我们又可以反过来看看又到底是哪些价位的手机在使用TFT和IPS呢?

#绘制屏幕材料为IPS或TFT手机的价格分布图
hist_plot=data[(data['screen material']=='IPS')|(data['screen material']=='TFT')]['price']#查看所有屏幕材料为IPS或TFT手机的价格
sns.distplot(hist_plot)
plt.title('Price Distribution Plot of Handphones Whose Screen Material is TFT or IPS ')

输出结果:

Text(0.5, 1.0, 'Price Distribution Plot of Handphones Whose Screen Material is TFT or IPS ')

通过观察以上分布图以及进一步在数据集data中查看屏幕材料为TFT或IPS的手机发现,IPS主要用于华为的中低端手机,价格在千元以下,或者1300元左右。其中,价格在200元以下的功能机的屏幕材料均为TFT。 出乎我意料的是,也有部分高端手机使用的是IPS或TFT材料,比如华为的荣耀V20,苹果的iphone 8,使用的是IPS材料;华为mate20和华为p20使用的均为TFT材料,这些手机的价格都在3500元以上。 通过以上的探索分析我们可以知道,高端智能机和低端功能机所使用的屏幕材料也很可能是一样的。当然我们也不排除,同样是TFT或IPS材料,它们内部也可能有区别。

尝试用机器学习方法预测手机价格

在前面的小节中,我们探索了决定手机价格的几大因素,手机存储空间ROM,内存RAM,以及品牌,屏幕材料等都是决定手机价格的关键因素。 在这一小节中,我会使用回归决策树(Regression Decision Tree)的算法仅仅根据手机的外部特征来预测手机的价格。决策数的特征值仅仅采用了手机的品牌brand、后置摄像头数量rear camera、以及手机重量weight作为我们的特征(feature),目标(target)当然则是我们的价格price 这样做的原因一来是因为ROM和RAM存在太多的缺失值。如果选取这两个值做为特征,那么我们会丢失掉太多训练数据。 二来是想尝试在不知道手机具体配置,仅仅通过观察测量手机外部特征能否较为准确地预测手机价格。 以下数据显示,如果选用ROM、RAM、和brand作为特征,那么我们只能得到原数据集31%左右的数据用作训练和测试。

data.dropna(subset=['ROM','RAM','brand','price']).shape[0]/data.shape[0]

输出结果:

0.30692243536280234

所有列缺失值数据统计:

data.isnull().sum().sort_values(ascending=False)

输出结果:

CPU freq             998
CPU cores            824
front camera         773
RAM                  720
rear camera specs    710
ROM                  667
CPU model            479
screen material      381
brand                347
rear camera          249
battery              177
resolution           134
month                115
charging port         99
screen size           85
model                 70
weight                66
SIM cards             56
year                   6
price                  3
comments               0
dtype: int64

品牌brand对价格影响非常明显,所以虽然缺失值较多,我们也必须考虑这个特征。

考虑到品牌brand是非数值数据,我们选取使用回归决策树算法来进行机器学习建模。

从原来的数据集提取我们需要的数据

df=data.loc[:,['price','rear camera','brand','weight']].dropna()

由于回归决策树只接受数值型数据(numerical data),我们需要对brand进行独热编码(one-hot encoding)

to_model=pd.get_dummies(df)#对非数值型数据进行独热编码

提取特征值和目标值。 (考虑到各种手机品牌的型号数量毕竟很有限,而且部分品牌数据量较少,我们在这里就没有划分训练集和测试集了)

x=to_model.iloc[:,1:].values
y=to_model.iloc[:,0].values

训练回归决策数模型

model=DecisionTreeRegressor()
model.fit(x,y)

输出结果:

DecisionTreeRegressor(criterion='mse', max_depth=None, max_features=None,
                      max_leaf_nodes=None, min_impurity_decrease=0.0,
                      min_impurity_split=None, min_samples_leaf=1,
                      min_samples_split=2, min_weight_fraction_leaf=0.0,
                      presort=False, random_state=None, splitter='best')

检验我们的模型对各个品牌的预测准确性。

error_list=[]
for each in df['brand'].value_counts().index:   
    to_fill='brand_{}'.format(each)
    x_data=to_model[to_model[to_fill]==1].iloc[:,1:].values
    y_data=to_model[to_model[to_fill]==1].iloc[:,0].values

    test_result=model.predict(x_data)
    merror=mae(y_data.reshape(len(y_data),1),test_result.flatten())
    error=(np.abs(test_result-y_data)/y_data).mean()
    print(each,end=' : ') 
    print(np.round(merror,2),end=', ')
    print(str(np.round(error*100,3))+'%')
    error_list.append([each,merror,error])

输出结果:

HUAWEI : 238.55, 15.16%
XIAOMI : 202.0, 12.277%
Apple : 663.28, 8.087%
OPPO : 177.65, 9.582%
vivo : 134.78, 8.747%
Philips : 7.01, 2.841%
MEIZU : 51.79, 3.009%
SAMSUNG : 269.2, 3.24%
K-Touch : 7.23, 4.144%
NOKIA : 12.5, 1.321%
lenovo : 33.33, 3.374%
Meitu : 120.0, 6.141%
smartisan : 0.0, 0.0%
realme : 0.0, 0.0%
nubia : 0.0, 0.0%
360 : 0.0, 0.0%
BlackBerry : 0.0, 0.0%
Coolpad : 0.0, 0.0%
ZTE : 0.0, 0.0%
chilli : 0.0, 0.0%
error_df=pd.DataFrame(error_list,columns=['brand','mean_absolute_error','mean_proportional_error'])
error_df

输出结果:

以上的 DataFrame error_df 表示该决策树模型对于每个品牌手机预测的准确性,误差都均在 15% 以内,这个模型还是相对比较准确的。 实际上这个模型最关键的是提取了手机的重量weight这一关键信息,因为每个型号的手机重量多少是有些区别的,拿一个稍微精确一点的电子秤便能量出区别,决策数只不过是记住了数据而已。造成预测结果误差的原因我想多半还是因为不同的卖家对同一型号手机的标价不同吧。

项目总结

虽然没有详细地呈现数据采集以及数据清理的过程,但是这两个步骤确是所花时间最多的步骤。虽然京东的网页对于爬虫新手已经十分友好,但是头一回爬取 javascript 渲染后的价格、评论数据还是颇有挑战性。数据清理主要难点在于数据大多以自然语言呈现,要找到实际上的缺失值,以及将自然语言转变为数值(比如评论数 comments,后置摄像头数量 rear cameras )。除去写这个 kaggle kernel,这两个步骤大概花了所有时间的70%。 对于采集到的数据进行分析也不是之前想象到的那么容易,为了发掘更深一层次的信息,对于每一次通过 pandas 函数得到的结果都需要认真地分析结果,思考为什么会有这个结果。 总之,这次项目挑战收获还是比较大,也是头一次自己完成数据的采集,清洗,以及分析的全过程。

추천

출처www.cnblogs.com/shiyanlou/p/11423682.html