本文是视频Python数据分析三剑客 数学建模基础 numpy、pandas、matplotlib的学习笔记。
终于学完啦,完结撒花✿✿ヽ(°▽°)ノ✿
因为包版本更新的问题,视频里很多函数调用的写法已经过时了,但是博客里的(迄今为止)都是对的。
请阅读的小伙伴注意文章时效性。
————————————————————————————————————————————————————
目录
导入:
#防止出现错误警告
import warnings
warnings.filterwarnings('ignore')
#导入三剑客
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
#设置字体字符
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
df=pd.read_excel('movie_data3.xlsx',index_col=0)
df[:5]
不懂的小伙伴可以去复习之前的内容。
双轴图的画法
add_subplot函数解释:
Python Matplotlib add_subplot 和 subplots_adjust详解及代码详细说明 配图片说明
from scipy.stats import norm
import matplotlib.mlab as mlab #生成正态概率密度函数
fig=plt.figure(figsize=(10,8))
ax1=fig.add_subplot(111) #生成多个图
n,bins,patches=ax1.hist(df['评分'],bins=100,color='m',alpha=0.5)
ax1.set_ylabel('电影数量',fontsize=15)
ax1.set_xlabel('评分',fontsize=15)
ax1.set_title('频率分布图',fontsize=20)
#计算正态概率密度函数
#可能是因为版本更新,视频里面的写法不对了...
y=norm.pdf(bins,df['评分'].mean(),df['评分'].std())
#双轴
ax2=ax1.twinx()
ax2.plot(bins,y,'b--')
ax2.set_ylabel('概率分布',fontsize=15)
plt.show()
根据电影时长和电影评分绘制散点图
具体函数参数解释:
python画散点图以及矩阵散点图plt.scatter()和pd.scatter_matrix()详解
x=df['时长']
y=df['评分']
plt.figure(figsize=(10,8))
plt.scatter(x,y)
#plt.legend()
plt.title('电影时长与评分散点图',fontsize=20)
plt.xlabel('时长',fontsize=18)
plt.ylabel('评分',fontsize=18)
plt.show()
数据量太大,所以图太冗杂,可挑选部分点进行绘制
x=df['时长'][::150]
y=df['评分'][::150]#间隔150选择点
plt.figure(figsize=(10,5))
plt.scatter(x,y,color='r',marker='*',label='评分')
plt.legend()
plt.title('电影时长与评分散点图',fontsize=20)
plt.xlabel('时长',fontsize=18)
plt.ylabel('评分',fontsize=18)
plt.show()
这里按照视频里面的写法会报错,详细解决办法看这里
可发现大部分电影时长集中在一百左右,评分大多在7分左右
maker属性
绘制各个地区的评分箱形图
箱形图(Box-plot)又称为盒须图、盒式图或箱线图,是一种用作显示一组数据分散情况资料的统计图。因形状如箱子而得名。在各种领域也经常被使用,常见于品质管理。它主要用于反映原始数据分布的特征,还可以进行多组数据分布特征的比 较。箱线图的绘制方法是:先找出一组数据的上边缘、下边缘、中位数和两个四分位数;然后, 连接两个四分位数画出箱体;再将上边缘和下边缘与箱体相连接,中位数在箱体中间。
详细参考:Python数据可视化:箱线图
美国电影评分的箱线图
data=df[df.产地=='美国']['评分']
plt.figure(figsize=(10,5))
plt.boxplot(data,whis=2)
plt.title('美国电影评分',fontsize=20)
plt.show()
可以对异常值格式进行设定:
data=df[df.产地=='美国']['评分']
plt.figure(figsize=(10,5))
#设置异常值
plt.boxplot(data,whis=2,flierprops={'marker':'o','markerfacecolor':'r','color':'k'})
plt.title('美国电影评分',fontsize=20)
plt.show()
也可以对箱体颜色进行设定:
data=df[df.产地=='美国']['评分']
plt.figure(figsize=(10,5))
#设置箱体颜色
plt.boxplot(data,whis=2,flierprops={'marker':'o','markerfacecolor':'r','color':'k'},
patch_artist=True,boxprops={'color':'k','facecolor':'g'})
plt.title('美国电影评分',fontsize=20)
plt.show()
多组数据箱线图
data1=df[df.产地=='中国大陆']['评分']
data2=df[df.产地=='中国香港']['评分']
data3=df[df.产地=='日本']['评分']
data4=df[df.产地=='英国']['评分']
data5=df[df.产地=='法国']['评分']
plt.figure(figsize=(12,8))
plt.boxplot([data1,data2,data3,data4,data5],labels=['中国大陆','中国香港','日本','英国','法国'],
whis=2,flierprops={'marker':'o','markerfacecolor':'r','color':'k'},
patch_artist=True,boxprops={'color':'k','facecolor':'g'})
#设置背景颜色属性
ax=plt.gca()
ax.patch.set_facecolor('gray')
ax.patch.set_alpha(0.1)
plt.title('电影评分箱线图',fontsize=20)
plt.show()
使用vert函数将图旋转
data1=df[df.产地=='中国大陆']['评分']
data2=df[df.产地=='中国香港']['评分']
data3=df[df.产地=='日本']['评分']
data4=df[df.产地=='英国']['评分']
data5=df[df.产地=='法国']['评分']
plt.figure(figsize=(12,8))
plt.boxplot([data1,data2,data3,data4,data5],labels=['中国大陆','中国香港','日本','英国','法国'],
whis=2,flierprops={'marker':'o','markerfacecolor':'r','color':'k'},
patch_artist=True,boxprops={'color':'k','facecolor':'g'},vert=False)
#设置背景颜色属性
ax=plt.gca()
ax.patch.set_facecolor('gray')
ax.patch.set_alpha(0.1)
plt.title('电影评分箱线图',fontsize=20)
plt.show()
相关系数矩阵图
plotting.scatter_matrix函数
完整用法:
pd.plotting.scatter_matrix(iris_dataframe, c=y_train, figsize=(15,15), marker=‘0’, hist_kwds={‘bins’:50},s=60,alpha=.8, cmap=mglearn.cm3)
参数如下:
frame
,pandas dataframe对象
alpha
, 图像透明度,一般取(0,1]
figsize
,以英寸为单位的图像大小,一般以元组 (width, height) 形式设置 ax,可选一般为none
diagonal
,必须且只能在{‘hist’, ‘kde’}中选择1个,’hist’表示直方图(Histogram plot),’kde
’表示核密度估计(Kernel Density
Estimation);该参数是scatter_matrix函数的关键参数
marker
,Matplotlib可用的标记类型,如’.’,’,’,’o’等
density_kwds
,(other plotting keyword arguments,可选),与kde
相关的字典参数
hist_kwds
,与hist
相关的字典参数
range_padding
,(float, 可选),图像在x轴、y轴原点附近的留白(padding),该值越大,留白距离越大,图像远离坐标原点
kwds
,与scatter_matrix函数本身相关的字典参数
c
,颜色
来自:https://www.cnblogs.com/zlc364624/p/12369999.html
画电影时长,投票人数,评分的相关系数矩阵图
data=df[['投票人数','评分','时长']]
data[:5]
可以画出各个属性之间的散点图,对角线是分布图
%pylab inline
#对角线展示kde,核密度估计,hist,频率分布直方图
#这里也和视频不太一样 QAQ
result=pd.plotting.scatter_matrix(data[::100],figsize(7,7),diagonal='kde')
绘制热力图
seaborn可以创建具有统计意义的图表,可理解pandas的Dataframe类型
详细参考:一、python可视化——热力图
import seaborn as sns
#求相关系数
corr=data.corr()
#求绝对值
corr=abs(corr)
#视频上面的方法不对了 TAT
ax=plt.subplots(figsize=(10,8))
ax=sns.heatmap(corr,vmax=1,vmin=0,annot=True,annot_kws={'size':13,'weight':'bold'},linewidths=0.05)
plt.xticks(fontsize=15)
plt.yticks(fontsize=15)
plt.show()
颜色越深,相关性越少(可以通过自定义参数进行设置)
第七次课作业
(1)读取酒店数据2.xlsx,根据评分和价格信息,绘制散点图。
df=pd.read_excel('酒店数据22.xlsx',index_col=0)
df[:5]
y=df['价格'][::2]
x=df['评分'][::2]
plt.figure(figsize=(10,9))
plt.scatter(x,y)
plt.title('酒店价格与评分散点图',fontsize=20)
plt.ylabel('价格',fontsize=18)
plt.xlabel('评分',fontsize=18)
plt.show()
(2)画出油尖旺地区,评分的箱线图。
data=df[df.地区=='油尖旺']['评分']
plt.figure(figsize=(10,5))
plt.boxplot(data,whis=2)
plt.title('油尖旺地区评分箱线图',fontsize=20)
plt.show()
(3)选出平均价格前5的地区,画出这些地区的评分的箱线图。
data=df['价格'].groupby(df['地区']).mean().sort_values(ascending=False)[:5]
data1=df[df.地区=='中西区']['评分']
data2=df[df.地区=='离岛']['评分']
data3=df[df.地区=='沙田']['评分']
data4=df[df.地区=='湾仔']['评分']
data5=df[df.地区=='东区']['评分']
plt.figure(figsize=(12,8))
plt.boxplot([data1,data2,data3,data4,data5],labels=['中西区','离岛','沙田','湾仔','东区'],
whis=2,flierprops={'marker':'o','markerfacecolor':'r','color':'k'},
patch_artist=True,boxprops={'color':'k','facecolor':'g'})
#设置背景颜色属性
ax=plt.gca()
ax.patch.set_facecolor('gray')
ax.patch.set_alpha(0.1)
plt.title('平均价格前5的地区评分箱线图',fontsize=20)
plt.show()
(4)将题目2,3的图像旋转90度。
data=df[df.地区=='油尖旺']['评分']
plt.figure(figsize=(10,5))
plt.boxplot(data,whis=2,vert=False)
plt.title('油尖旺地区评分箱线图',fontsize=20)
plt.show()
data1=df[df.地区=='中西区']['评分']
data2=df[df.地区=='离岛']['评分']
data3=df[df.地区=='沙田']['评分']
data4=df[df.地区=='湾仔']['评分']
data5=df[df.地区=='东区']['评分']
plt.figure(figsize=(12,8))
plt.boxplot([data1,data2,data3,data4,data5],labels=['中西区','离岛','沙田','湾仔','东区'],
whis=2,flierprops={'marker':'o','markerfacecolor':'r','color':'k'},
patch_artist=True,boxprops={'color':'k','facecolor':'g'},vert=False)
#设置背景颜色属性
ax=plt.gca()
ax.patch.set_facecolor('gray')
ax.patch.set_alpha(0.1)
plt.title('平均价格前5的地区评分箱线图',fontsize=20)
plt.show()
(5)绘制一个评分,评分人数和价格之间的相关系数图
data=df[['评分人数','评分','价格']]
%pylab inline
result=pd.plotting.scatter_matrix(data,figsize(7,7),diagonal='kde')
import seaborn as sns
corr=data.corr()
corr=abs(corr)
ax=plt.subplots(figsize=(10,8))
ax=sns.heatmap(corr,vmax=1,vmin=0,annot=True,annot_kws={'size':13,'weight':'bold'},linewidths=0.05)
plt.xticks(fontsize=15)
plt.yticks(fontsize=15)
plt.show()