分析目的:
查看球员身体一年内变化情况
分析思路:
数据只有球员身高,年龄,体重三个方面,因为身高,年龄在一年内不会有太大的变化,所以,只有体重会影响球员整体的身体状况。BMI指数不适用运动员,故不考虑。>
分析内容
数据:
数据清洗
观察数据,updated这组数据中,第二列下降的应该是体重,而不是身高,需要将第一列与第二列互换,代码如下:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 将列表转换为ndarray数组格式
np_baseball = np.array(baseball)
np_updated = np.array(updated)
#数据不对,降低的是体重,更换第一列与第二列,
data= np.array(np_updated[:,0] )
np_updated[:,0]=np_updated[:,1]
np_updated[:,1]=data
print(np_updated)
显示出来的结果如下,成功互换:
[[-11. 1. 1.]
[ 16. 1. 1.]
[ 5. 1. 1.]
…
[ 4. 1. 1.]
[-18. 1. 1.]
[ 8. 1. 1.]]
计算今年变化后的结果:
# 计算今年更新的结果 把原本的数据与更新数据进行相加
ans = np_baseball + np_updated
print(ans)
显示结果如下
[[ 63. 181. 23.99]
[ 90. 216. 35.69]
[ 77. 211. 31.78]
…
[ 79. 206. 26.19]
[ 57. 191. 32.01]
[ 81. 196. 28.92]]
数据分析
1.观察球员总体状况,体现在身高,体重,年龄的中位数,均值,人数
df = pd.DataFrame(ans)
df_character = df.describe()
print(df_character )
#结果如下
0 1 2
count 1015.000000 1015.000000 1015.000000
mean 73.483744 202.359606 29.708355
std 10.385066 20.823001 4.314453
min 36.000000 151.000000 21.900000
25% 67.000000 187.000000 26.405000
50% 74.000000 201.000000 28.900000
75% 80.000000 216.000000 32.190000
max 112.000000 291.000000 49.520000
观察数据的总体特征,总共1015条数据,其中身高的标准差最大,身高整体差异很大, 而年龄标准差最小,年龄分布相对比较集中,体重次之。
weights_last = np_baseball[:,0]
heights_last = np_baseball[:,1]
weights = ans[:,0]
heights = ans[:,1]
weight_l= weights.tolist()
plt.figure(figsize=(20, 8), dpi=100)
distance =1
group_num = int((max(weight_l) - min(weight_l)) / distance)
plt.hist(weight_l, bins=group_num)
plt.grid(linestyle="--", color="r", alpha=0.3)
plt.xlabel("weights range")
plt.ylabel("weights num")
plt.show()
体重分布及去年今年的变化:
球员今年体重分布情况,与上图相比,体重主要范围由去年的70-80公斤扩大到了50-100公斤。
2.计算体重的具体变化情况分为三种情况:
- 体重下降的人数为486人
- 体重上升的人数为491人
- 体重无变化的人数为38人
代码如下:
#计算体重减少的人数
updated = np.array(updated)
counts1 = np.count_nonzero(updated)
#这里找出体重变化中为负的数值,也可能包含体重没有变化的即为0
updated[updated<0]=0
counts2 = np.count_nonzero(updated)
print(counts1-counts2)
# 486人体重下降
#计算体重上升人数
df_updated = pd.DataFrame(updated,columns = ['one','two','three'])
df_updated[df_updated>0] = '上升'
print(df_updated['two'].value_counts())
#为491人体重上升
#体重无变化人数为1015-491-486=38
3.计算体重具体上升下降了多少。
df_updated = pd.DataFrame(updated,columns = ['one','two','three'])
#weight_change=(df_updated['two'].value_counts())
#print(weight_change)
#为了方便观察,将统计出来的个数及与其相对应的值保存起来:
weight_change=(df_updated['two'].value_counts()).reset_index()
df =( pd.DataFrame(weight_change)).values
print(df)
将结果进行转置后显示结果如下,第一行为体重的变化,第二行为相对应的人数:
[[ 6. 1. 2. -4. -6. -1. 0. -2. -7. 3. 5. -11. 4. 7.
-5. 11. -9. 8. -3. -8. 9. -12. 13. 10. -13. 14. -15. 12.
-10. -14. 16. 15. 18. -20. 17. -17. -16. -18. 21. -22. -19. 27.
-21. 22. 19. -23. -27. -25. 25. 20. 26. -29. -32. -35. -30. 35.
23. -26. -28.]
[ 49. 48. 42. 41. 40. 39. 38. 38. 35. 34. 33. 32. 31. 30.
30. 28. 28. 28. 27. 26. 24. 24. 23. 20. 20. 20. 18. 14.
14. 13. 12. 11. 10. 9. 9. 8. 8. 8. 7. 6. 5. 4.
4. 3. 3. 3. 2. 2. 2. 2. 2. 1. 1. 1. 1. 1.
1. 1. 1.]]
…
根据体重下降情况,绘制散点图:
x= df[:,0]
y= df[:,1]
plt.figure(figsize=(20, 8), dpi=100)
plt.scatter(x, y)
plt.show()
观察图可知,体重变化与人数之间呈现负偏态相关,即多数人的体重高于平均数。
4.具体是哪部分人的体重下降?体重下降跟年龄和身高有关系吗?
age_weights = np.vstack((np_baseball[:,2], np_updated[:,1]))
height_weights = np.vstack((np_baseball[:,1], np_updated[:,1]))
print(age_weights)
print(height_weights)
显示如下:
[[ 22.99 34.69 30.78 … 25.19 31.01 27.92]
[-11. 16. 5. … 4. -18. 8. ]]
[[180. 215. 210. … 205. 190. 195.]
[-11. 16. 5. … 4. -18. 8.]]
根据体重变化情况,绘制散点图:
观察图可知,体重与身高,年龄都无相关关系。
分析结果:
1.体重增高人数高于体重降低人数,多数人体重高于平均水平。
2.球员体重不断向两极化扩展,变化差异很大。
3.体重与年龄,身高无明显相关性。