当前位置:   article > 正文

python大数据分析电影评分与时长等等_pythonpython电影数据分析模型

pythonpython电影数据分析模型

准备好相关数据

链接:https://pan.baidu.com/s/1EvuEnVhSAUghEkF5rckMoA?pwd=2222 
提取码:2222

一.利用Kmeans分析时长与评分的关系

 导入相关库

  1. import pandas as pd
  2. import numpy as np
  3. import matplotlib.pyplot as plt
  4. from sklearn.cluster import KMeans
  5. from datetime import datetime
  6. from sklearn.model_selection import train_test_split #划分测试集与训练集
  7. from sklearn.linear_model import LinearRegression as LR #回归模块
  8. from sklearn.metrics import mean_squared_error #MSE
  9. from sklearn.metrics import mean_absolute_error #MAE
  10. from sklearn.metrics import r2_score #R2
  11. plt.rcParams['font.sans-serif']=['SimHei']
  12. data = pd.read_csv('C:\\Users\\wt\\Desktop\\data1.csv')
  13. mold = data.iloc[:, 1]
  14. avg_rating_num = np.mean(data.iloc[:, [2]], axis=0)
  15. X = data.iloc[:, [0, 2]]
  16. X = X.values.astype('float32')

记录相关电影类型数目

  1. label = {}
  2. def fetch(s):
  3. if s in label:
  4. label[s] += 1
  5. else:
  6. label[s] = 1
  7. for i in mold:
  8. print(i)
  9. if len(i) == 2:
  10. fetch(i[0:2])
  11. elif len(i) == 3:
  12. fetch(i[0:3])
  13. elif len(i) == 5:
  14. fetch(i[0:2])
  15. fetch(i[3:5])
  16. elif len(i) == 8:
  17. fetch(i[0:2])
  18. fetch(i[3:5])
  19. fetch(i[6:8])
  20. elif len(i) == 11:
  21. fetch(i[0:2])
  22. fetch(i[3:5])
  23. fetch(i[6:8])
  24. fetch(i[9:11])
  25. elif len(i) == 14:
  26. fetch(i[0:2])
  27. fetch(i[3:5])
  28. fetch(i[6:8])
  29. fetch(i[9:11])
  30. fetch(i[12:14])

5c6863c3fb20481e9cd7d766c64b27fa.png

 打印相关系数

  1. print(np.corrcoef(X[:, 0], X[:, 1]))
  2. clf = KMeans(n_clusters=4)
  3. y_pred = clf.fit_predict(X)

8e4997992e2c4239813c9b21baedea3e.png

 

  1. patches, text = plt.pie(label.values(), labels=label.keys(), radius=1)
  2. text[-1].set_text('')
  3. text[-2].set_text('')
  4. text[-3].set_text('')
  5. text[-5].set_text('')
  6. text[-6].set_text('')
  7. text[-7].set_text('')
  8. text[-8].set_text('')
  9. text[-9].set_text('')
  10. text[13].set_text('')
  11. for t in text:
  12. t.set_size(10)
  13. plt.title("高质量电影类型成分分析")

画图分析电影类型占比情况

175342973d094d5d9a6a53b31c82a7a0.png

  1. x = [n[0] for n in X]
  2. y = [n[1] for n in X]
  3. plt.title("Kmeans分析时长与评分")
  4. plt.scatter(x, y, c=y_pred, marker='x')
  5. plt.xlabel("时长")
  6. plt.ylabel("评分")
  7. plt.show()

 利用kmeans时长与分布情况

43ea7506f94849d885b79de724b3aef8.png

  二.多元回归模型分析播放量

记录电影种类

  1. item=['剧情','犯罪']
  2. def finds(iss):
  3. global item
  4. iss=iss.split("/")
  5. i=0
  6. while(1):
  7. if i==len(item):
  8. break
  9. for y in range(len(iss)):
  10. if iss[y]== item[i]:
  11. iss.remove(iss[y])
  12. break
  13. i+=1
  14. return iss
  1. for i in range(len(data.mold)):
  2. iss=finds(data.mold[i])
  3. item=item+list(iss)

 自定义独热编码

  1. def my_get_dummies(ser):
  2. data=[]
  3. data=list(data)
  4. base_data=np.zeros((len(ser),),dtype=np.int)
  5. for i in range(len(item)):
  6. data.append(base_data)
  7. array = np.array(data, dtype = int)
  8. array=array.reshape(250,27)
  9. df=pd.DataFrame(array,columns=item,index=ser.index)
  10. for irec in ser.index:
  11. rec=ser[irec].split(',')
  12. for dirt in rec:
  13. if dirt not in item:
  14. print(dirt)
  15. else:
  16. df[dirt][irec]=1
  17. return df
  1. data=data.join(my_get_dummies(data.mold))
  2. data

a51920ef3103440a8d2cd69618bfa717.png

 

 建立模型

  1. #二分原则为80%为样例数据作为模型训练集20%为样本数据作为测试集检查估计能力
  2. from sklearn.model_selection import train_test_split #划分测试集与训练集
  3. from sklearn.linear_model import LinearRegression as LR #回归模块
  4. ##在ipy中显示图像
  5. %matplotlib inline
  6. #设置绘图显示中文字体
  7. pd.set_option('display.max_columns', None)
  8. #特征提取
  9. film_type=data[item]
  10. film_type
  11. # total_layer=data.总楼层
  12. # 选择自变量与因变量
  13. X = pd.concat([film_type,data.duration,data.Wtsee_people,data.Rating_people,data.Comments_people,data.year,data.rating_num],axis=1)
  14. Y = data.Watching_people
  15. print(type(X))
  16. X = X.fillna(0)
  17. #划分测试集与训练集
  18. Xtrain,Xtest,Ytrain,Ytest=train_test_split(X,Y,test_size=0.2,random_state=420)
  1. reg=LR().fit(Xtrain,Ytrain)
  2. #预测
  3. Yhat=reg.predict(Xtest)
  4. #查看回归系数
  5. print(list(zip(X.columns,reg.coef_)))
  6. #查看截距
  7. print(reg.intercept_)

5c5a23e1a5124f05b75ef7ebb8b42764.png

 

  1. from sklearn.metrics import mean_squared_error #MSE
  2. from sklearn.metrics import mean_absolute_error #MAE
  3. from sklearn.metrics import r2_score #R2
  4. mse= mean_squared_error(Ytest,Yhat)
  5. mae= mean_absolute_error(Ytest,Yhat)
  6. r2=r2_score(Ytest,Yhat)
  7. #调整R2
  8. n=Xtest.shape[0]
  9. k=Xtest.shape[1]
  10. adj_r2=1-(1-r2)*((n-1)/(n-k-1))
  11. print('MSE:'+str(mse))
  12. print('MAE:'+str(mae))
  13. print('R2:'+str(r2))
  14. print('调整后R2:'+str(adj_r2))

评估模型

68aefbacf5f24d1eaa7577c4546ae4be.png

 绘制图表评测结果

  1. #绘制前50条记录
  2. n=50
  3. #绘制模型预测值
  4. plt.plot(range(len(Yhat[:n])),Yhat[:n])
  5. #绘制模型真实值
  6. plt.plot(range(len(Ytrain[:n])),Ytrain[:n])
  7. #图形设置
  8. plt.xlabel('个例')
  9. plt.ylabel('播放量')
  10. plt.title('线性回归预测结果')
  11. plt.legend(["预估","实际"])

7db74c0d305a48d99c925a9eb5b41800.png

 将测试集真实值与模型预测值用折线图的形式表现出来

 

 

  1. #绘制前50条记录
  2. n=50
  3. #绘制模型预测值
  4. plt.plot(range(len(Yhat[:n])),Yhat[:n])
  5. #绘制模型测试真实值
  6. plt.plot(range(len(Ytest[:n])),Ytest[:n])
  7. #图形设置
  8. plt.xlabel('个例')
  9. plt.ylabel('播放量')
  10. plt.title('线性回归预测结果')
  11. plt.legend(["预估","实际"])

51dfbb087c784b4e89c016edfc7c11e1.png

三.决策树预测评分

计算pearsonr系数判断相关程度

  1. from sklearn import tree#决策树模型
  2. from sklearn.model_selection import train_test_split#划分测试集合与训练集合
  3. from sklearn.model_selection import GridSearchCV#用于找到最优模型
  4. from scipy.stats import pearsonr
  5. # 通常情况下通过以下取值范围判断变量的相关强度:
  6. # 相关系数 0.8-1.0 极强相关
  7. # 0.6-0.8 强相关
  8. # 0.4-0.6 中等程度相关
  9. # 0.2-0.4 弱相关
  10. # 0.0-0.2 极弱相关或无相关
  11. # x=np.array([1,3,5])
  12. # y=np.array([1,3,4])
  13. # pc = pearsonr(x,y)
  14. # print("相关系数:",pc[0])
  15. # print("显著性水平:",pc[1])
  16. pccs = pearsonr(data['duration'],data['rating_num'])
  17. print('时长')
  18. print("相关系数:",pccs[0])
  19. print("显著性水平:",pccs[1])
  20. pccs = pearsonr(data['Watching_people'],data['rating_num'])
  21. print('评分')
  22. print("相关系数:",pccs[0])
  23. print("显著性水平:",pccs[1])
  24. pccs = pearsonr(data['year'],data['rating_num'])
  25. print('年份')
  26. print("相关系数:",pccs[0])
  27. print("显著性水平:",pccs[1])
  28. pccs = pearsonr(data['Rating_people'],data['rating_num'])
  29. print('评价人数')
  30. print("相关系数:",pccs[0])
  31. print("显著性水平:",pccs[1])
  32. pccs = pearsonr(data['Comments_people'],data['rating_num'])
  33. print('短评人数')
  34. print("相关系数:",pccs[0])
  35. print("显著性水平:",pccs[1])
  36. pccs = pearsonr(data['Wtsee_people'],data['rating_num'])
  37. print('想看人数')
  38. print("相关系数:",pccs[0])
  39. print("显著性水平:",pccs[1])

建立树模型

  1. X=pd.concat([data['Watching_people'],data['Wtsee_people'],data['Watching_people'],data['Rating_people'],data['Comments_people'],data['year']],axis=1)
  2. Y=data['rating_num']
  3. # 划分测试与训练集
  4. Xtrain,Xtest,Ytrain,Ytest=train_test_split(X,Y,test_size=0.1,random_state=420)
  5. # 选择最优参数
  6. tree_param={'criterion':['mse','friedman_mse','mae'],'max_depth':list(range(10))}
  7. # GridSearchCV网格搜索,搜索的是参数,即在指定的参数范围内,按步长依次调整参数,利用调整的参数训练学习器,从所有的参数中找到在验证集上精度最高的参数,这其实是一个训练和比较的过程。k折交叉验证将所有数据集分成k份,不重复地每次取其中一份做测试集,
  8. # 用其余k-1份做训练集训练模型,之后计算该模型在测试集上的得分,将k次的得分取平均得到最后的得分。
  9. grid=GridSearchCV(tree.DecisionTreeRegressor(),param_grid=tree_param,cv=3)#实例化对象
  10. grid.fit(Xtrain,Ytrain)#训练模型
  11. grid.best_params_,grid.best_score_#最优参数,最优分数
  12. print(grid.best_params_)
  13. print(grid.best_score_)
  14. # #建立决策树(改进的均方误差不纯度准则)
  15. dtr=tree.DecisionTreeRegressor(criterion='friedman_mse',max_depth =4)
  16. # #训练决策树
  17. #预测训练结果
  18. dtr.fit(Xtrain,Ytrain)
  19. pred=dtr.predict(Xtest)

4924cb092ad34db293ee62d018cb0c0c.png

 画图预测接下来25条真实评分与预测评分

  1. fig=plt.figure(figsize=(15.6,7.2))
  2. ax=fig.add_subplot(111)
  3. s1=ax.scatter(range(len(pred)),pred,facecolors="red",label='预测')
  4. s2=ax.scatter(range(len(Ytest)),Ytest,facecolors="blue",label='实际')
  5. plt.legend()

ba979200b1fe4f2f9f336b131dff8d30.png 可观察到有15条左右的预测评分接近真实值

误差在0.3左右

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/780270
推荐阅读
相关标签
  

闽ICP备14008679号