Python数据可视化实战第六章:广大数据可视化项目实战代码分享
实训 各科目考试成绩可视化项目
1、训练要点
(1)掌握seaborn库进行数据可视化的方法。
(2)掌握撰写可视化分析报告的方法。
2、需求说明
3、实现步骤
(1)使用pandas库读取文件,查看原始数据的相关特征和描述信息,检查是否有空值.
import pandas as pd
# 读取数据
data = pd.read_csv('E:/data/StudentsPerformance.csv', encoding='gb18030')
data
# 检查空值
# null_counts = data.isnull().sum()
# 打印每列的空值数量
# print(null_counts)
(2)分别获取数据框中的阅读成绩、数学成绩、写作成绩3个字段,累加求和计算出每个学生的总分total_score,再除以3得到平均分percentage.
# 计算总分
data['total_score'] = data[['数学成绩', '阅读成绩', '写作成绩']].sum(axis=1)
# 计算平均分
data['percentage'] = data['total_score'] / 3
# 显示包含总分和平均分的数据框
print(data[['数学成绩', '阅读成绩', '写作成绩', 'total_score', 'percentage']])
(3)设置各门课及格线为60分,分别判断学生是否通过(Fail/Pass)每门课,合并新的数据列pass_reading,pass_math、pass_writing。
import pandas as pd
# 转换为DataFrame
data = pd.DataFrame(data)
# 设置及格线
passing_score = 60
# 判断每门课程是否通过
data['pass_reading'] = data['阅读成绩'] >= passing_score
data['pass_math'] = data['数学成绩'] >= passing_score
data['pass_writing'] = data['写作成绩'] >= passing_score
# 将布尔值转换为'fail'/'pass'
data['pass_reading'] = data['pass_reading'].map({True: 'pass', False: 'fail'})
data['pass_math'] = data['pass_math'].map({True: 'pass', False: 'fail'})
data['pass_writing'] = data['pass_writing'].map({True: 'pass', False: 'fail'})
data[[ '数学成绩', '阅读成绩', '写作成绩','pass_reading', 'pass_math', 'pass_writing']]
(4)判断每个学生的整体状态是否通过。如果3门课中有一门为Fail,则最后考核为Fail,合并新的数据列status。
# 判断学生整体状态
data['status'] = data[['pass_reading', 'pass_math', 'pass_writing']].isin(['fail']).any(axis=1).map({True: 'fail', False: 'pass'})
data[['数学成绩', '阅读成绩', '写作成绩', 'pass_reading', 'pass_math', 'pass_writing', 'status']]
(5)对于总评是Pass的数据,根据平均分设置5级制成绩,即percentage大于90分为优秀,80-90分为良好,70-79分为中等,60-69分为及格,其他为不及格。
# 根据平均分重新设定总评状态
def set_grade(percentage):
if percentage >= 90:
return '优秀'
elif 80 <= percentage < 90:
return '良好'
elif 70 <= percentage < 80:
return '中等'
elif 60 <= percentage < 70:
return '及格'
else:
return '不及格'
# 应用函数到status列
data['status'] = data['percentage'].apply(set_grade)
data[[ '数学成绩', '阅读成绩', '写作成绩','total_score', 'percentage', 'status']]
(6)绘制可视化图形,具体操作如下。
1.绘制父母受教育程度的水平柱形图。
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
# 计算每个教育程度的学生人数
education_counts = data['父母教育程度'].value_counts()
# 绘制水平柱状图
plt.figure(figsize=(12, 6))
plt.barh(education_counts.index, education_counts.values, color='skyblue')
plt.xlabel('学生人数')
plt.ylabel('教育程度')
plt.title('父母教育程度分布')
plt.tight_layout()
plt.show()
2.绘制全体学生成绩分布饼图。
import pandas as pd
import matplotlib.pyplot as plt
# 转换为DataFrame
columns = ['数学成绩', '阅读成绩', '写作成绩']
df = pd.DataFrame(data, columns=columns)
# 计算每门课程的平均成绩
percentage = df[['数学成绩', '阅读成绩', '写作成绩']].mean()
# 绘制饼图
plt.figure(figsize=(4, 4))
plt.pie(percentage, labels=percentage.index, autopct='%.1f%%')
plt.title('全体学生成绩平均分布')
plt.show()
3.绘制各科成绩分布直方图。
import pandas as pd
import matplotlib.pyplot as plt
# 转换为DataFrame
columns = ['数学成绩', '阅读成绩', '写作成绩']
df = pd.DataFrame(data, columns=columns)
# 绘制各科成绩分布直方图
plt.figure(figsize=(15, 5))
# 数学成绩
plt.subplot(1, 3, 1)
plt.hist(df['数学成绩'], bins=range(30, 101, 5), edgecolor='black')
plt.title('数学成绩分布')
plt.xlabel('分数')
plt.ylabel('学生人数')
# 阅读成绩
plt.subplot(1, 3, 2)
plt.hist(df['阅读成绩'], bins=range(30, 101, 5), edgecolor='black')
plt.title('阅读成绩分布')
plt.xlabel('分数')
plt.ylabel('学生人数')
# 写作成绩
plt.subplot(1, 3, 3)
plt.hist(df['写作成绩'], bins=range(30, 101, 5), edgecolor='black')
plt.title('写作成绩分布')
plt.xlabel('分数')
plt.ylabel('学生人数')
plt.show()
4.绘制父母受教育程度与前置课程是否完成统计分类图。
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
# 转换为DataFrame
columns = ['父母教育程度', '课程完成情况']
df = pd.DataFrame(data, columns=columns)
# 绘制父母受教育程度与前置课程是否完成的分类统计图
plt.figure(figsize=(8, 5))
sns.countplot(x='父母教育程度', hue='课程完成情况', data=df)
plt.title('父母受教育程度与课程完成情况分类统计')
plt.xlabel('父母教育程度')
plt.ylabel('学生人数')
plt.legend(title='课程完成情况')
plt.show()
5.绘制成绩评级与性别分布箱线图。
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
# 转换为DataFrame
columns = ['性别', '数学成绩', '阅读成绩', '写作成绩']
df = pd.DataFrame(data, columns=columns)
# 计算每门课程的平均成绩作为评分依据
df['percentage'] = df[['数学成绩', '阅读成绩', '写作成绩']].mean(axis=1)
# 绘制成绩评级与性别的箱线图
plt.figure(figsize=(8, 5))
sns.boxplot(x='性别', y='percentage', data=df)
plt.title('成绩评级与性别分布箱线图')
plt.xlabel('性别')
plt.ylabel('平均成绩')
plt.show()
6.绘制午餐标准与总成绩的性别分类散点图。
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
# 转换为DataFrame
columns = ['性别', '午餐', '数学成绩', '阅读成绩', '写作成绩']
df = pd.DataFrame(data, columns=columns)
# 计算每名学生的总成绩
df['total_score'] = df[['数学成绩', '阅读成绩', '写作成绩']].sum(axis=1)
# 绘制午餐标准与总成绩的性别分类散点图
plt.figure(figsize=(8, 6))
sns.scatterplot(x='午餐', y='total_score', hue='性别', data=df, palette=['red', 'blue'])
plt.title('午餐标准与总成绩的性别分类散点图')
plt.xlabel('午餐标准')
plt.ylabel('总成绩')
plt.legend(title='性别')
plt.show()
7.绘制各特征的相关热力图。
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
# 转换为DataFrame
columns = ['性别', '民族', '父母教育程度', '午餐', '课程完成情况', '数学成绩', '阅读成绩', '写作成绩']
df = pd.DataFrame(data, columns=columns)
# 将分类特征进行编码以便于计算相关性
xs = pd.get_dummies(df, columns=['性别', '民族', '父母教育程度', '午餐', '课程完成情况'])
# 计算数值型列之间的相关性
matrix = xs.select_dtypes(include='number').corr()
# 绘制热力图
plt.figure(figsize=(10, 6))
sns.heatmap(matrix, annot=True, fmt=".2f", cmap='coolwarm', square=True, cbar_kws={"shrink": .5})
plt.title('各特征之间的相关性热力图')
plt.show()
作者:徙格~