畢業(yè)設(shè)計(jì) 大數(shù)據(jù)高校校園學(xué)生卡數(shù)據(jù)分析可視化
0 項(xiàng)目簡介
今天學(xué)長向大家介紹一個(gè)數(shù)據(jù)分析項(xiàng)目
基于大數(shù)據(jù)的高校校園學(xué)生一卡通數(shù)據(jù)分析
基于國內(nèi)某高校校園一卡通系統(tǒng)一個(gè)月的運(yùn)行數(shù)據(jù),使用數(shù)據(jù)分析和建模的方法,挖掘數(shù)據(jù)中所蘊(yùn)含的信息,分析學(xué)生在校園內(nèi)的學(xué)習(xí)生活行為
畢設(shè)幫助,選題指導(dǎo),技術(shù)解答,歡迎打擾,見B站個(gè)人主頁
https://space.bilibili.com/33886978
任務(wù) 1.1 探查數(shù)據(jù)質(zhì)量并進(jìn)行缺失值和異常值處理
1.1.1數(shù)據(jù)結(jié)構(gòu)總覽查看數(shù)據(jù)集項(xiàng)數(shù),發(fā)現(xiàn)數(shù)據(jù)集data1.csv,有4341項(xiàng),5列;數(shù)據(jù)集data2.csv,有519367 項(xiàng),14列;數(shù)據(jù)集data3.csv,有43156項(xiàng),6列
1.1.2檢查重復(fù)值
通過去重操作發(fā)現(xiàn)三個(gè)數(shù)據(jù)集均無重復(fù)項(xiàng)
1.1.3數(shù)據(jù)內(nèi)容總覽
查看數(shù)據(jù)信息info(),發(fā)現(xiàn)data1和data3中均無缺失值 ,data2中termSerNo、conOperNo 存在較大量的缺失值,因?yàn)檫@兩項(xiàng)數(shù)據(jù)對后續(xù)分析無影響故直接過濾
1.1.4數(shù)據(jù)分布總覽
通過對數(shù)據(jù)Describe,查看數(shù)據(jù)的均值,最大值,最小值以及方差等數(shù)據(jù)特征,觀察到data1 和data3中的特征值均較為合理,data2中的Money、FundMoney、Surplus以及 CardCount,均存在和樣本群體偏離程度較大的數(shù)據(jù),會(huì)影響后序模型的性能
1.1.5消費(fèi)金額和消費(fèi)次數(shù)觀察消費(fèi)金額和消費(fèi)次數(shù)的散點(diǎn)圖
發(fā)現(xiàn)數(shù)據(jù)中具有一定數(shù)量的離群點(diǎn),將其過濾

1.1.6觀察 CardCount 特征的分布情況
通過 distplot 和 kdeplot 繪制柱狀圖觀察 CardCount 特征的分布情況,屬于長尾類型的分布,這說明了有很多消費(fèi)次數(shù)過多且超出正常范圍。

任務(wù)2 食堂就餐行為分析
任務(wù) 2.1 繪制各食堂就餐人次的占比餅圖,分析學(xué)生早中晚餐的就餐地點(diǎn),是否有顯著差別


根據(jù)圖 1,綜合早、午、晚三餐學(xué)生的就餐地點(diǎn)來看,34.44%的學(xué)生更偏愛去第二食堂, 26.16%的學(xué)生偏愛去第五食堂,第一、三、四食堂在學(xué)生的偏愛程度中屬于一般水平,而只有 0.46%的學(xué)生在教師食堂就餐。 根據(jù)圖 2,圖 3,圖 4 三圖分析,學(xué)生對食堂的偏愛程度前三的食堂是:早餐:第二食堂 > 第五食堂 > 第一食堂午餐:第二食堂 > 第五食堂 > 第四食堂晚餐:第二食堂 > 第五食堂 > 第四食堂而學(xué)生用餐次數(shù)少的食堂(以用餐次數(shù)是否超過 10%為分界點(diǎn))分別有:早餐:第四食堂、第三食堂、教師食堂午餐:教師食堂晚餐:教師食堂 綜上,學(xué)生午晚兩餐的用餐地點(diǎn)與綜合三餐用餐地點(diǎn)分析比較,不存在顯著差別;而學(xué)生的早餐用餐地點(diǎn),選擇第三、四食堂的占極少數(shù),與綜合三餐用餐地點(diǎn)有較為顯著的差別。
任務(wù) 2.2 食堂刷卡記錄
分別繪制工作日和非工作日食堂就餐時(shí)間曲線圖,分析食堂早中晚餐的就餐峰值

從上圖可以看出,工作日的就餐峰值均高于非工作日。工作日食堂早餐的就餐峰值為 60000次,非工作日為15000次;工作日食堂午餐的就餐峰值為90000次,非工作日為30000 次;工作日食堂晚餐的就餐峰值為17000次,非工作日為41000次。
出現(xiàn)該現(xiàn)象的主要原因在于工作日學(xué)生需要外出上課,直接前往食堂就餐的可能性更高,而非工作日學(xué)生由于直接在宿舍點(diǎn)外賣或者外出游玩就餐等原因?qū)е虑巴程镁筒偷娜藬?shù)大幅減少。因此工作日食堂就餐峰值高于非工作日就餐峰值。
任務(wù) 2.3 根據(jù)上述分析的結(jié)果,為食堂的運(yùn)營提供建議。
學(xué)校方面,應(yīng)該根據(jù)學(xué)生的喜好程度合理安排食堂的場地、資金分配等資源,由2.1 可知,大部分學(xué)生偏愛去第二食堂和第五食堂,因此學(xué)校應(yīng)給予第二食堂和第五食堂資源傾斜。 食堂方面,受偏愛的第二食堂和第五食堂應(yīng)該進(jìn)行菜品創(chuàng)新,形成顧客粘性。并且因?yàn)榫筒蛯W(xué)生多,食堂更應(yīng)該合理安排食堂內(nèi)的排隊(duì)位置,提高排隊(duì)效率。而就餐學(xué)生數(shù)偏少的第一、三、四食堂應(yīng)該找出自身原因,采取例如提高食堂環(huán)境質(zhì)量、增加菜品種類或提出促銷活動(dòng)等方法吸引學(xué)生群體。 此外,每個(gè)食堂在就餐峰值(分別為7點(diǎn)、11點(diǎn)、17點(diǎn)左右)應(yīng)加大食堂人手,合理安排排隊(duì)場所,提高排隊(duì)效率,避免打飯效率低下,并且應(yīng)在這三個(gè)高峰時(shí)間段內(nèi)增加菜品供應(yīng)量,避免供不應(yīng)求。而在非高峰期,食堂可以適當(dāng)減少菜品供應(yīng)和食堂工作人員數(shù)量,從而減少食堂無用的運(yùn)營成本。
任務(wù) 3學(xué)生消費(fèi)行為分析
任務(wù) 3.1 分析不同專業(yè)間不同性別學(xué)生群體的消費(fèi)特點(diǎn)。
3.3.1 本月人均刷卡頻次和人均消費(fèi)額
根據(jù)程序計(jì)算結(jié)果得出:本月人均消費(fèi)頻次為:72.74118014361537次本月人均消費(fèi)額為:288.7773899469248元 考慮數(shù)據(jù)合理性,得出:本月人均消費(fèi)頻次越為:73次;本月人均消費(fèi)額288.8元
3.3.2 選擇 3 個(gè)專業(yè),分析不同專業(yè)間不同性別學(xué)生群體的消費(fèi)特點(diǎn)
3.3.2.1根據(jù)程序運(yùn)行結(jié)果得出學(xué)生消費(fèi)總額、消費(fèi)次數(shù)總數(shù)、校園卡中余額的數(shù)據(jù)特征圖



3.3.2.2根據(jù)程序運(yùn)行結(jié)果得出學(xué)生消費(fèi)總額、消費(fèi)次數(shù)總數(shù)、校園卡中余額的柱狀圖



從上圖和上表可以得到不同專業(yè)的學(xué)生,計(jì)算機(jī)應(yīng)用專業(yè)學(xué)生消費(fèi)最頻繁,國際金融專業(yè)學(xué)生單次消費(fèi)金額最高,藝術(shù)設(shè)計(jì)專業(yè)學(xué)生卡內(nèi)盈余最低。而不同專業(yè)的學(xué)生卡內(nèi)盈余相差不大。出現(xiàn)該差異的可能原因在于計(jì)算機(jī)應(yīng)用專業(yè)需要運(yùn)用到電腦等電子設(shè)備,導(dǎo)致購買頻繁。國際金融專業(yè)消費(fèi)金額高可能是其運(yùn)用專業(yè)知識(shí)賺錢所需。藝術(shù)設(shè)計(jì)專業(yè)學(xué)生卡內(nèi)盈余最低可能是由于其日常在服裝等上面的開銷較大。 此外,我們可以得到不同專業(yè)間不同性別學(xué)生群體的消費(fèi)特點(diǎn)。
首先是國際金融專業(yè)的學(xué)生。該專業(yè)女生消費(fèi)頻繁,男生單次消費(fèi)金額高,卡內(nèi)盈余金額近似。其次是藝術(shù)設(shè)計(jì)專業(yè)的學(xué)生。該專業(yè)女生消費(fèi)頻繁,男生單次消費(fèi)金額高。男生卡內(nèi)盈余金額高于女生。最后是計(jì)算機(jī)應(yīng)用專業(yè)的學(xué)生。該專業(yè)男生消費(fèi)頻繁、單次消費(fèi)金額高,并且男生盈余金額高于女生。 通過分析,出現(xiàn)性別上消費(fèi)特點(diǎn)差異主要是由于男女性格原因。女生更偏好高頻低費(fèi)用的購買,享受消費(fèi)的過程,因此消費(fèi)次數(shù)多,每次都只是購買小額商品。而男生更偏好于低頻高費(fèi)用的購買,消費(fèi)目的性強(qiáng),雖不經(jīng)常消費(fèi),但每次總是會(huì)消費(fèi)較大額度。
任務(wù) 3.2 分析每一類學(xué)生群體的消費(fèi)特點(diǎn)。
3.2.1 概述
為了將學(xué)生的整體校園消費(fèi)行為進(jìn)行分類,選擇了當(dāng)月消費(fèi)總金額,消費(fèi)次數(shù),卡內(nèi)存款作為特征進(jìn)行聚類,采用的聚類算法為 k-means 算法(k-均值聚類算法)
3.2.2 k-means 算法簡介 k-means 算法(k-均值聚類算法)是一種基本的已知聚類類別數(shù)的劃分算法。它是很典型的基于距離的聚類算法,采用距離作為相似性的評價(jià)指標(biāo),即認(rèn)為兩個(gè)對象的距離越近,其相似度就越大。該算法認(rèn)為簇是由距離靠近的對象組成的,因此把得到緊湊且獨(dú)立的簇作為最終目標(biāo)。它可以處理大數(shù)據(jù)集,且高效。它的輸入自然是數(shù)據(jù)集和類別數(shù)。聚類結(jié)果是劃分為 k 類的 k 個(gè)數(shù)據(jù)集。
3.2.3 過程 將學(xué)生的整體校園消費(fèi)行為分為 4 類,因此將 k-means 算法中的 k 值取為 4,運(yùn)用公式 data = 1.0*(data - data.mean())/data.std() 進(jìn)行數(shù)據(jù)標(biāo)準(zhǔn)化,采用歐式距離作為度量,并畫出每一項(xiàng)特征對應(yīng)的數(shù)據(jù)直方圖如下

3.2.4 聚類結(jié)果分析
根據(jù)學(xué)生在 4 月份的消費(fèi)金額、卡內(nèi)盈余與消費(fèi)次數(shù),我們將學(xué)生分成了四類群體,分別命名為 0,1,2,3. 學(xué)生群體 0 的消費(fèi)特點(diǎn)為:該群體屬于中等消費(fèi)水平,有較高的消費(fèi)潛力,這類學(xué)生群體應(yīng)有較為良好的儲(chǔ)蓄意識(shí),屬于滯后消費(fèi)。 學(xué)生群體 1 的消費(fèi)特點(diǎn)為:該群體屬于高消費(fèi)水平,但消費(fèi)潛力較弱,這類學(xué)生群體的消費(fèi)能力較高。 學(xué)生群體 2 的消費(fèi)特點(diǎn)為:該群體屬于低消費(fèi)水平,且消費(fèi)潛力較弱,這類學(xué)生群體的消費(fèi)能力較弱。 學(xué)生群體 3 的消費(fèi)特點(diǎn)為:該群體屬于中等消費(fèi)水平,消費(fèi)潛力較弱,這類學(xué)生群體的儲(chǔ)蓄意識(shí)較于學(xué)生群體 0 更弱。
任務(wù) 3.3 助學(xué)金評定
通過對低消費(fèi)學(xué)生群體的行為進(jìn)行分析,探討是否存在某些特征,能為學(xué)校助學(xué)金評定提供參考。

根據(jù)分類所得的貧困生情況,我們首先針對貧困生的性別進(jìn)行分析。由上圖可看出,在已知的貧困生人數(shù)之中,超過半數(shù)的貧困生為女性。

根據(jù)分類所得的貧困生情況,對貧困生所在專業(yè)類別進(jìn)行分析歸納。可發(fā)現(xiàn),專業(yè)為理工科的學(xué)生中,貧困人口占比大;經(jīng)管商科的學(xué)生中,貧困人口的占比數(shù)相較于理工科的會(huì)更少。而專業(yè)為藝術(shù)設(shè)計(jì)類的學(xué)生,貧困人口數(shù)量最少。


從上圖可以看出貧困生的單次消費(fèi)金額主要在 51-100 元之間,消費(fèi)次數(shù)主要在 501-750 元之間,卡內(nèi)盈余主要在 100-200 元之間。和其他類別學(xué)生相比,我們可以看出貧困生的消費(fèi)次數(shù)、消費(fèi)金額和卡內(nèi)盈余均較低。 從上述分析我們可以看出,貧困人口有較大概率集中在性別為女,專業(yè)為理工科,日常消費(fèi)次數(shù)、消費(fèi)金額以及卡內(nèi)盈余都較低的學(xué)生當(dāng)中。因此,學(xué)校在評定獎(jiǎng)助學(xué)金的過程中,可以根據(jù)學(xué)生的性別、專業(yè)和日常消費(fèi)情況對學(xué)生的貧困背景進(jìn)行一個(gè)初步的估計(jì),為后面對學(xué)生群體貧困背景的詳細(xì)調(diào)查,提供一個(gè)簡單的基礎(chǔ)。
4 關(guān)鍵代碼
task1.py
import pandas as pd
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib as mpl
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings('ignore')
pd.set_option('display.max_columns', None)
pd.set_option('display.max_rows', None)
plt.style.use("fivethirtyeight")
sns.set_style({'font.sans-serif':['simhei','Arial']})
'''
任務(wù) 1.1 理解字段含義。探查數(shù)據(jù)質(zhì)量并進(jìn)行缺失值和異常值等
方面的必要處理。
'''
# 導(dǎo)入數(shù)據(jù)
df1 = pd.read_csv('data1.csv', encoding='gbk')
df2 = pd.read_csv('data2.csv', encoding='gbk')
df3 = pd.read_csv('data3.csv', encoding='gbk')
# 數(shù)據(jù)信息總覽
print('**************************************************')
print(df1.shape)
print('**************************************************')
print(df2.shape)
print('**************************************************')
print(df3.shape)
print('**************************************************')
print('未去重: ', df1.shape)
print('去重: ', df1.drop_duplicates().shape)
print('未去重: ', df2.shape)
print('去重: ', df2.drop_duplicates().shape)
print('未去重: ', df3.shape)
print('去重: ', df3.drop_duplicates().shape)
print('**************************************************')
print(df1.info())
print('**************************************************')
print(df2.info())
print('**************************************************')
print(df3.info())
print('**************************************************')
print('**************************************************')
print(df1.describe())
print('**************************************************')
print(df2.describe())
print('**************************************************')
print(df3.describe())
print('**************************************************')
'''
**************************************************
(4341, 5)
**************************************************
(519367, 14)
**************************************************
(43156, 6)
**************************************************
# 檢查重復(fù)值
均無重復(fù)值
df1.describe().to_csv('data1_describe.csv')
df2.describe().to_csv('data2_describe.csv')
df3.describe().to_csv('data3_describe.csv')
'''
# 重新擺放列位置
columns = ['CardNo', 'Date', 'Money', 'FundMoney', 'Surplus', 'CardCount', 'Type', 'TermNo', 'OperNo',
? ? ? ? ? 'Dept']
df2 = pd.DataFrame(df2, columns=columns)
#print(df2.head())
# 觀察消費(fèi)總額和消費(fèi)次數(shù)之間的關(guān)系
#df2.to_csv('task1_1.csv')
#df_money_amount=df2.groupby('CardNo')['Money'].sum().sort_values(ascending=False).to_frame().reset_index()
#df_money_times=df2.groupby('CardNo')['CardCount'].max().sort_values(ascending=False).to_frame().reset_index()
#sns.regplot(x='Money',y='CardCount',data=df2)
#plt.show()
sns.distplot(df2['CardCount'],bins=100,color='r')
sns.kdeplot(df2['CardCount'],shade=True)
'''
通過 distplot 和 kdeplot 繪制柱狀圖觀察 CardCount 特征的分布情況,屬于長尾類型的分布,
這說明了有很多消費(fèi)次數(shù)過多且超出正常范圍。
也可能是年級較為高的學(xué)生
'''
plt.show()
task2.py
import pandas as pd
'''
任務(wù) 1.2 將 data1.csv 中的學(xué)生個(gè)人信息與 data2.csv 中的消費(fèi)記錄建立
關(guān)聯(lián),處理結(jié)果保存為“task1_2_1.csv”;將 data1.csv 中的學(xué)生個(gè)人信息與
data3.csv 中的門禁進(jìn)出記錄建立關(guān)聯(lián),處理結(jié)果保存為“task1_2_2.csv”。
'''
pd.set_option('display.max_columns', None)
pd.set_option('display.max_rows', None)
# 導(dǎo)入數(shù)據(jù)
df1 = pd.read_csv('data1.csv', encoding='gbk')
df2 = pd.read_csv('data2.csv', encoding='gbk')
df3 = pd.read_csv('data3.csv', encoding='gbk')
data1_2=df1.merge(df2,left_on='CardNo',right_on='CardNo')
data1_2.rename(columns={"Index_x": "Stu_Index"}, inplace=True)
data1_2.rename(columns={"Index_y": "Con_Index"}, inplace=True)
#print(data1_2.head())
data1_3=df1.merge(df3,left_on='AccessCardNo',right_on='AccessCardNo')
data1_3.rename(columns={"Index_x": "Stu_Index"}, inplace=True)
data1_3.rename(columns={"Index_y": "Acc_Index"}, inplace=True)
#print(data1_3.head())
data1_2.to_csv('task1_2_1.csv')
data1_3.to_csv('task1_2_2.csv')
其他代碼,文章篇幅有限,略
最后
畢設(shè)幫助,選題指導(dǎo),技術(shù)解答,歡迎打擾,見B站個(gè)人主頁
https://space.bilibili.com/33886978