24.9.30 案例练习

138 阅读2分钟

NBA 球员数据分析

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from IPython.core.pylabtools import figsize

data = pd.read_csv('./nba_2017_nba_players_with_salary.csv')
print(data) # 图1
shape_num = data.shape # (342, 38)
print(shape_num) # (342, 38)
describe_data = data.describe()
print(describe_data) # 图2

# 数据分析
# 数据相关性分析
data_cor = data.loc[:, ['RPM', 'AGE', 'SALARY_MILLIONS', 'ORB', 'TRB', 'AST', 'STL', 'BLK', 'TOV', 'PF', 'POINTS', 'GP', 'MPG', 'ORPM', 'DRPM']]
print(data_cor) # 图3
# 获取两列数据之间的相关性
corr = data_cor.corr()
plt.figure(figsize(20, 8), dpi=100)
sns.heatmap(corr, square=True, linewidths=0.1, annot=True) # linewidths=0.1 方块之间的分隔线,annot=True 方框中的数据
plt.show() # 图4

group_and_sort = data.loc[:, ["PLAYER", "RPM", "AGE", "SALARY_MILLIONS"]].sort_values(by="SALARY_MILLIONS", ascending=False)
print(group_and_sort) # 图5


# seaborn 常用的三个数据可视化方法
# 单变量
# 利用seaborn中的distplot绘图来分别看一下球员薪水、效率值、年龄这三个信息的分布情况
sns.set_style("darkgrid")


plt.figure(figsize=(10, 10))

plt.subplot(3, 1, 1)
sns.displot(data["SALARY_MILLIONS"]) # 图6
plt.ylabel("RPM")

plt.subplot(3, 1, 3)
sns.displot(data["AGE"]) # 图7
plt.ylabel("AGE")

# 使用joinplot查看年龄和薪水之间的关系
dat1 = data.loc[:, ['RPM', 'SALARY_MILLIONS', 'AGE', 'POINTS']]
sns.jointplot(x=dat1.SALARY_MILLIONS, y=dat1.AGE, kind='kde', height=8)
plt.show() # 图8

# 双变量
sns.jointplot(x=data.AGE, y=data.SALARY_MILLIONS, kind="hex")
plt.show() # 图9

# 多变量
multi_data = data.loc[:, ['RPM', 'SALARY_MILLIONS', 'AGE', 'POINTS']]
print(multi_data) # 图10
sns.pairplot(multi_data)
plt.show() # 图11

图1

image.png

图2

image.png

图3

image.png

图4 image.png

图5

image.png

图6

image.png

图7

image.png

图8

image.png

图9

image.png

图10

image.png

图11

image.png

衍生变量的一些可视化实践-以年龄为例

def age_cut(df):
    if df.AGE<=24:
        return "young"
    elif df.AGE>=30:
        return "old"
    else:
        return "best"


# 使用apply对年龄进行划分
data["age_cut"] = data.apply(lambda x:age_cut(x), axis=1)
print(data) # 图12

data["cut"] = 1
print(data) # 图13

# 基于年龄段对球员薪水和效率值进行分析
sns.set_style("darkgrid")
plt.figure(figsize=(10, 10),dpi=100)
plt.title("RPM and Salary")

x1 = data.loc[data.age_cut == "old"].SALARY_MILLIONS
y1 = data.loc[data.age_cut == "old"].RPM
plt.plot(x1, y1, "^")
x2 = data.loc[data.age_cut == "young"].SALARY_MILLIONS
y2 = data.loc[data.age_cut == "young"
plt.plot(x2, y2, "^")
plt.show() # 图14

multi_data2 = data.loc[:,['RPM', 'POINTS', 'TRB', 'AST', 'STL', 'BLK', 'age_cut']]
sns.pairplot(multi_data2,hue="age_cut")
plt.show() # 图15

图12 image.png

图13

image.png

图14

image.png 图15 image.png