知識(shí)不僅能改變自己的命運(yùn),還能改變后代的命運(yùn)。
看了今天的數(shù)據(jù)分析,我相信你會(huì)更加清晰的明確這點(diǎn)。
所以說(shuō),國(guó)家在貧困地區(qū)優(yōu)先發(fā)展教育的政策是有非常有戰(zhàn)略意義的。教育脫貧,才能實(shí)現(xiàn)一個(gè)家族、一個(gè)地區(qū)的真正脫貧。
這份數(shù)據(jù)比較簡(jiǎn)單,它來(lái)源于美國(guó)一份學(xué)生成績(jī)單,包括性別、家長(zhǎng)學(xué)歷、是否備考、午餐計(jì)劃、分?jǐn)?shù)等,意在通過(guò)這些記錄這些因素對(duì)學(xué)生成績(jī)的影響。
今天的數(shù)據(jù)分析的工具依然是Python。
1、數(shù)據(jù)概覽
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from pyecharts import Bar,WordCloud,Pie,Line
df=pd.read_csv(r'C:\Users\Administrator\Desktop\StudentsPerformance.csv')
df.head()
這個(gè)是數(shù)據(jù)的字段,前面我已經(jīng)說(shuō)過(guò)了,很簡(jiǎn)單。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from pyecharts import Bar,WordCloud,Pie,Line
df=pd.read_csv(r'C:\Users\Administrator\Desktop\StudentsPerformance.csv')
df.info()
數(shù)據(jù)類(lèi)型也不多,就兩個(gè),從圖上可以看到,這份數(shù)據(jù)很干凈,不需要進(jìn)行數(shù)據(jù)清洗。那我們就直接開(kāi)始分析吧。
1、各科學(xué)生成績(jī)分布箱式圖
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from pyecharts import Bar,WordCloud,Pie,Line
df=pd.read_csv(r'C:\Users\Administrator\Desktop\StudentsPerformance.csv')
plt.rcParams['font.sans-serif']=['SimHei']
y1=df['math score']
y2=df['reading score']
y3=df['writing score']
x=[y1,y2,y3]
plt.figure(figsize=(10,5))
labels=['math score','reading score','writing score']
plt.boxplot(x,labels=labels,vert=True)
plt.title('各科目成績(jī)分布箱式圖',loc='left',size=15)
plt.xlabel('科目',size=15)
plt.ylabel('分?jǐn)?shù)',size=15)
plt.xticks(size=15)
plt.yticks(size=15)#plt.yticks([]) 可以去掉y軸
plt.grid(False)
sns.despine(left=False )#去掉上面和右邊邊框
plt.show();
在數(shù)據(jù)分析中,箱式圖是用的比較多的,特別是看分布的時(shí)候,非常實(shí)用,中間的矩形就是上四分位和下四分位,代表大部分?jǐn)?shù)據(jù)集中在這里,下面超過(guò)箱式圖的代表是異常值,也就是特別低的數(shù)據(jù)。
從圖片看出,各科成績(jī)的集中分?jǐn)?shù)段都是差不多的,都在60到80之間,但是數(shù)學(xué)成績(jī)的異常值更多,說(shuō)明數(shù)學(xué)是最難的。
2、學(xué)生整體成績(jī)分組情況
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from pyecharts import Bar,WordCloud,Pie,Line
%matplotlib inline
%config InlineBackend.figure_format = 'svg'
df=pd.read_csv(r'C:\Users\Administrator\Desktop\StudentsPerformance.csv')
y1=df['math score']
y2=df['reading score']
y3=df['writing score']
df['總分']= y1 + y2 + y3
def GetGrade(總分):
if ( 總分 >=270 ):
return '優(yōu)秀'
if ( 總分 >=240):
return '良好'
if ( 總分 >=180):
return '及格'
else:
return '不及格'
df['等級(jí)'] = df.apply(lambda x :GetGrade(x['總分']), axis=1)
plt.rcParams['font.sans-serif']=['SimHei']
plt.figure(figsize=(10,5))
sns.countplot(x="等級(jí)",data=df, order=['優(yōu)秀','良好','及格','不及格'],palette="muted")
plt.title('學(xué)生成績(jī)分組情況分析',loc='left',size=15)
plt.xlabel('成績(jī)分組情況',size=15)
plt.ylabel('人數(shù)',size=15)
plt.grid(False)
sns.despine(left=False )#去掉上面和右邊邊框
plt.show()
這份圖是學(xué)生三科匯總分?jǐn)?shù)的分層情況,我把總分在270分以上的,歸為優(yōu)秀;240以上的,歸為良好;180以上的歸為及格;其余則為不及格。分組的代碼已經(jīng)在上面的代碼塊中寫(xiě)出來(lái)了。
但是上面這兩個(gè)圖還只是學(xué)生的成績(jī)情況,并不能看出成績(jī)的影響因素。
下面開(kāi)始,我將特意從家長(zhǎng)學(xué)歷的角度分析對(duì)孩子成績(jī)的影響。
3、父母學(xué)歷對(duì)子女成績(jī)影響1--考試分?jǐn)?shù)
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from pyecharts import Bar,WordCloud,Pie,Line
%matplotlib inline
%config InlineBackend.figure_format = 'svg'
df=pd.read_csv(r'C:\Users\Administrator\Desktop\StudentsPerformance.csv')
y1=df['math score']
y2=df['reading score']
y3=df['writing score']
df['總分']= y1 + y2 + y3
plt.figure(figsize=(10,5))
sns.violinplot(x="parental level of education",y="總分",data=df,palette="Set3");
plt.title('父母學(xué)歷對(duì)子女成績(jī)影響1--考試分?jǐn)?shù)',loc='left',size=15)
plt.xlabel('父母學(xué)歷',size=15)
plt.ylabel('分?jǐn)?shù)',size=15)
plt.xticks(size=12)
plt.yticks(size=12)#plt.yticks([]) 可以去掉y軸
plt.grid(False)
sns.despine(left=False )#去掉上面和右邊邊框
plt.show();
這個(gè)圖是小提琴圖,類(lèi)似于箱式圖,看法也差不多,尾巴越長(zhǎng),說(shuō)明低分越多。
從圖可以看出,高中未畢業(yè)(some high school)的家長(zhǎng)子女低分最多;其次是高中家長(zhǎng)(high school);然后是大學(xué)未畢業(yè)家長(zhǎng)(some college);然后是大專(zhuān)家長(zhǎng)(associate's degree);接下來(lái)是大學(xué)生家長(zhǎng)(bachelor's degree);低分最少的家長(zhǎng)是碩士家長(zhǎng)(master's degree)。
4、父母學(xué)歷對(duì)子女成績(jī)影響2--合格人數(shù)
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from pyecharts import Bar,WordCloud,Pie,Line
%matplotlib inline
%config InlineBackend.figure_format = 'svg'
df=pd.read_csv(r'C:\Users\Administrator\Desktop\StudentsPerformance.csv')
#算總分
y1=df['math score']
y2=df['reading score']
y3=df['writing score']
df['總分']= y1 + y2 + y3
#計(jì)算合格或者不合格情況
passmark =180
df['考試合格'] = np.where(df['總分']<passmark, 'N', 'Y')
df['考試合格'].value_counts()
plt.figure(figsize=(12,6))
p= sns.countplot(x='parental level of education', data = df, hue='考試合格', palette='bright')
_ = plt.setp(p.get_xticklabels(), rotation=0)
plt.title('父母學(xué)歷對(duì)子女成績(jī)影響2--合格人數(shù)',loc='left',size=15)
plt.xlabel('父母學(xué)歷',size=15)
plt.ylabel('考試合格或不合格人數(shù)',size=15)
plt.xticks(size=12)
plt.yticks(size=12)#plt.yticks([]) 可以去掉y軸
plt.grid(False)
sns.despine(left=False )#去掉上面和右邊邊框
plt.show();
這個(gè)圖知道做出來(lái)后,我才發(fā)現(xiàn)其實(shí)不太容易看出父母學(xué)歷對(duì)子女成績(jī)的影響,但既然做出來(lái)了,也就先放到這,當(dāng)做練手了。
由圖可知,無(wú)論國(guó)內(nèi)還是國(guó)外,其實(shí)高學(xué)歷人群還是少數(shù),你看美國(guó),家長(zhǎng)是碩士學(xué)位的也是最少的。
5、父母學(xué)歷對(duì)子女成績(jī)影響3--及格率
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from pyecharts import Bar,WordCloud,Pie,Line
%matplotlib inline
%config InlineBackend.figure_format = 'svg'
df=pd.read_csv(r'C:\Users\Administrator\Desktop\StudentsPerformance.csv')
y1=df['math score']
y2=df['reading score']
y3=df['writing score']
df['總分']= y1 + y2 + y3
passmark =180
df['考試合格'] = np.where(df['總分']<passmark, 'N', 'Y')
df1=df.pivot_table('考試合格',index='parental level of education',aggfunc='count').reset_index()
df2=df[df['考試合格']=='Y']
df2=df2.pivot_table('考試合格',index='parental level of education',aggfunc='count').reset_index()
df3=pd.merge(df1,df2,on='parental level of education')
df3['合格率']=df3['考試合格_y']/df3['考試合格_x']
plt.rcParams['font.sans-serif']=['SimHei']
x=df3['parental level of education']
y=round(df3['合格率'],2)
plt.figure(figsize=(12,6))
plt.bar(x,y,width=0.5,align='center')
plt.title('父母學(xué)歷對(duì)子女成績(jī)影響3--合格率',loc='left',size=15)
for a,b in zip(x,y):
plt.text(a,b,b,ha='center',va='bottom',fontsize=12)#顯示額度標(biāo)簽
plt.xlabel('父母學(xué)歷',size=15)
plt.ylabel('合格率',size=15)
plt.xticks(x,size=12)
plt.yticks(size=15)#plt.yticks([]) 可以去掉y軸
plt.grid(False)
sns.despine(left=False )#去掉上面和右邊邊框
plt.show()
這個(gè)是不同學(xué)歷家長(zhǎng)的子女成績(jī)合格率情況,一目了然就能看出來(lái),學(xué)歷越高的家長(zhǎng),子女成績(jī)合格率越高。
雖然圖是做出來(lái)了,但是代碼略顯繁瑣,大家可以批判閱讀,先通過(guò)這種方法做出來(lái),再想其他更簡(jiǎn)單的方法。
有心的朋友應(yīng)該看出,今天的數(shù)據(jù)分析并不難,但是代碼中還是有不少新東西可以一起操作的。
其中包括小提琴圖的畫(huà)法,簡(jiǎn)單自定義函數(shù)的用法,還是對(duì)數(shù)據(jù)進(jìn)行判斷貼標(biāo)簽的方法。這些東西只要學(xué)會(huì)了,就放之四海而皆準(zhǔn),以后碰到類(lèi)似情況都可以用起來(lái)。
數(shù)據(jù)分析就是這樣的,自己要多練習(xí),也要多看看別人的東西,看人家是怎么實(shí)現(xiàn)的,這樣可以多一些分析思路解決問(wèn)題。
好了,今天的數(shù)據(jù)分析分享就到這里,我們下周可能繼續(xù)。
因?yàn)檫@是我連續(xù)第10周分享了,Python的基本分析方法、分析工具差不多都有涉及了,更深入的東西需要花的時(shí)間比較多,一周的業(yè)務(wù)時(shí)間估計(jì)不夠。
再加上自己目前剛接手?jǐn)?shù)據(jù)分析的工作不久,工作量也比較大,需要花更多時(shí)間放工作上,也不敢熬太多夜,所以數(shù)據(jù)分析分享可能不會(huì)這么頻繁了。
么么噠。
聯(lián)系客服