2023國賽數學建模思路 - 復盤:校園消費行為分析

文章目錄

  • 0 賽題思路
  • 1 賽題背景
  • 2 分析目標
  • 3 數據說明
  • 4 數據預處理
  • 5 數據分析
    • 5.1 食堂就餐行為分析
    • 5.2 學生消費行為分析
  • 建模資料

0 賽題思路

(賽題出來以后第一時間在CSDN分享)

https://blog.csdn.net/dc_sinor?type=blog

1 賽題背景

校園一卡通是集身份認證、金融消費、數據共享等多項功能于一體的信息集成系統。在為師生提供優質、高效信息化服務的同時,系統自身也積累了大量的歷史記錄,其中蘊含著學生的消費行為以及學校食堂等各部門的運行狀況等信息。

很多高校基于校園一卡通系統進行“智慧校園”的相關建設,例如《揚子晚報》2016年 1月 27日的報道:《南理工給貧困生“暖心飯卡補助”》。

不用申請,不用審核,飯卡上竟然能悄悄多出幾百元……記者昨天從南京理工大學獨家了解到,南理工教育基金會正式啟動了“暖心飯卡”

項目,針對特困生的溫飽問題進行“精準援助”。

項目專門針對貧困本科生的“溫飽問題”進行援助。在學校一卡通中心,教育基金會的工作人員找來了全校一萬六千余名在校本科生 9 月中旬到 11月中旬的刷卡記錄,對所有的記錄進行了大數據分析。最終圈定了 500余名“準援助對象”。

南理工教育基金會將拿出“種子基金”100萬元作為啟動資金,根據每位貧困學生的不同情況確定具體的補助金額,然后將這些錢“悄無聲息”的打入學生的飯卡中,保證困難學生能夠吃飽飯。

——《揚子晚報》2016年 1月 27日:南理工給貧困生“暖心飯卡補助”本賽題提供國內某高校校園一卡通系統一個月的運行數據,希望參賽者使用

數據分析和建模的方法,挖掘數據中所蘊含的信息,分析學生在校園內的學習生活行為,為改進學校服務并為相關部門的決策提供信息支持。

2 分析目標

  • 1. 分析學生的消費行為和食堂的運營狀況,為食堂運營提供建議。

  • 2. 構建學生消費細分模型,為學校判定學生的經濟狀況提供參考意見。

3 數據說明

附件是某學校 2019年 4月 1 日至 4月 30日的一卡通數據

一共3個文件:data1.csv、data2.csv、data3.csv
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

4 數據預處理

將附件中的 data1.csv、data2.csv、data3.csv三份文件加載到分析環境,對照附錄一,理解字段含義。探查數據質量并進行缺失值和異常值等方面的必要處理。將處理結果保存為“task1_1_X.csv”(如果包含多張數據表,X可從 1 開始往后編號),并在報告中描述處理過程。

import numpy as np
import pandas as pd
import os
os.chdir('/home/kesci/input/2019B1631')
data1 = pd.read_csv("data1.csv", encoding="gbk")
data2 = pd.read_csv("data2.csv", encoding="gbk")
data3 = pd.read_csv("data3.csv", encoding="gbk")
data1.head(3)

在這里插入圖片描述

data1.columns = ['序號', '校園卡號', '性別', '專業名稱', '門禁卡號']
data1.dtypes

在這里插入圖片描述

data1.to_csv('/home/kesci/work/output/2019B/task1_1_1.csv', index=False, encoding='gbk')
data2.head(3)

在這里插入圖片描述
將 data1.csv中的學生個人信息與 data2.csv中的消費記錄建立關聯,處理結果保存為“task1_2_1.csv”;將 data1.csv 中的學生個人信息與data3.csv 中的門禁進出記錄建立關聯,處理結果保存為“task1_2_2.csv”。

data1 = pd.read_csv("/home/kesci/work/output/2019B/task1_1_1.csv", encoding="gbk")
data2 = pd.read_csv("/home/kesci/work/output/2019B/task1_1_2.csv", encoding="gbk")
data3 = pd.read_csv("/home/kesci/work/output/2019B/task1_1_3.csv", encoding="gbk")
data1.head(3)

在這里插入圖片描述

5 數據分析

5.1 食堂就餐行為分析

繪制各食堂就餐人次的占比餅圖,分析學生早中晚餐的就餐地點是否有顯著差別,并在報告中進行描述。(提示:時間間隔非常接近的多次刷卡記錄可能為一次就餐行為)

data = pd.read_csv('/home/kesci/work/output/2019B/task1_2_1.csv', encoding='gbk')
data.head()

在這里插入圖片描述

import matplotlib as mpl
import matplotlib.pyplot as plt
# notebook嵌入圖片
%matplotlib inline
# 提高分辨率
%config InlineBackend.figure_format='retina'
from matplotlib.font_manager import FontProperties
font = FontProperties(fname="/home/kesci/work/SimHei.ttf")
import warnings
warnings.filterwarnings('ignore')
canteen1 = data['消費地點'].apply(str).str.contains('第一食堂').sum()
canteen2 = data['消費地點'].apply(str).str.contains('第二食堂').sum()
canteen3 = data['消費地點'].apply(str).str.contains('第三食堂').sum()
canteen4 = data['消費地點'].apply(str).str.contains('第四食堂').sum()
canteen5 = data['消費地點'].apply(str).str.contains('第五食堂').sum()
# 繪制餅圖
canteen_name = ['食堂1', '食堂2', '食堂3', '食堂4', '食堂5']
man_count = [canteen1,canteen2,canteen3,canteen4,canteen5]
# 創建畫布
plt.figure(figsize=(10, 6), dpi=50)
# 繪制餅圖
plt.pie(man_count, labels=canteen_name, autopct='%1.2f%%', shadow=False, startangle=90, textprops={'fontproperties':font})
# 顯示圖例
plt.legend(prop=font)
# 添加標題
plt.title("食堂就餐人次占比餅圖", fontproperties=font)
# 餅圖保持圓形
plt.axis('equal')
# 顯示圖像
plt.show()

在這里插入圖片描述
通過食堂刷卡記錄,分別繪制工作日和非工作日食堂就餐時間曲線圖,分析食堂早中晚餐的就餐峰值,并在報告中進行描述。

在這里插入圖片描述

# 對data中消費時間數據進行時間格式轉換,轉換后可作運算,coerce將無效解析設置為NaT
data.loc[:,'消費時間'] = pd.to_datetime(data.loc[:,'消費時間'],format='%Y-%m-%d %H:%M',errors='coerce')
data.dtypes
# 創建一個消費星期列,根據消費時間計算出消費時間是星期幾,Monday=1, Sunday=7
data['消費星期'] = data['消費時間'].dt.dayofweek + 1
data.head(3)
# 以周一至周五作為工作日,周六日作為非工作日,拆分為兩組數據
work_day_query = data.loc[:,'消費星期'] <= 5
unwork_day_query = data.loc[:,'消費星期'] > 5work_day_data = data.loc[work_day_query,:]
unwork_day_data = data.loc[unwork_day_query,:]
# 計算工作日消費時間對應的各時間的消費次數
work_day_times = []
for i in range(24):work_day_times.append(work_day_data['消費時間'].apply(str).str.contains(' {:02d}:'.format(i)).sum())# 以時間段作為x軸,同一時間段出現的次數和作為y軸,作曲線圖
x = []
for i in range(24):x.append('{:02d}:00'.format(i))
# 繪圖
plt.plot(x, work_day_times, label='工作日')
# x,y軸標簽
plt.xlabel('時間', fontproperties=font);
plt.ylabel('次數', fontproperties=font)
# 標題
plt.title('工作日消費曲線圖', fontproperties=font)
# x軸傾斜60度
plt.xticks(rotation=60)
# 顯示label
plt.legend(prop=font)
# 加網格
plt.grid()

在這里插入圖片描述

# 計算飛工作日消費時間對應的各時間的消費次數
unwork_day_times = []
for i in range(24):unwork_day_times.append(unwork_day_data['消費時間'].apply(str).str.contains(' {:02d}:'.format(i)).sum())# 以時間段作為x軸,同一時間段出現的次數和作為y軸,作曲線圖
x = []
for i in range(24): x.append('{:02d}:00'.format(i))
plt.plot(x, unwork_day_times, label='非工作日')
plt.xlabel('時間', fontproperties=font);
plt.ylabel('次數', fontproperties=font)
plt.title('非工作日消費曲線圖', fontproperties=font)
plt.xticks(rotation=60)
plt.legend(prop=font)
plt.grid()

在這里插入圖片描述
根據上述分析的結果,很容易為食堂的運營提供建議,比如錯開高峰等等。

5.2 學生消費行為分析

根據學生的整體校園消費數據,計算本月人均刷卡頻次和人均消費額,并選擇 3個專業,分析不同專業間不同性別學生群體的消費特點。

data = pd.read_csv('/home/kesci/work/output/2019B/task1_2_1.csv', encoding='gbk')
data.head()

在這里插入圖片描述

# 計算人均刷卡頻次(總刷卡次數/學生總人數)
cost_count = data['消費時間'].count()
student_count = data['校園卡號'].value_counts(dropna=False).count()
average_cost_count = int(round(cost_count / student_count))
average_cost_count# 計算人均消費額(總消費金額/學生總人數)
cost_sum = data['消費金額'].sum()
average_cost_money = int(round(cost_sum / student_count))
average_cost_money# 選擇消費次數最多的3個專業進行分析
data['專業名稱'].value_counts(dropna=False)

在這里插入圖片描述

# 消費次數最多的3個專業為 連鎖經營、機械制造、會計
major1 = data['專業名稱'].apply(str).str.contains('18連鎖經營')
major2 = data['專業名稱'].apply(str).str.contains('18機械制造')
major3 = data['專業名稱'].apply(str).str.contains('18會計')
major4 = data['專業名稱'].apply(str).str.contains('18機械制造(學徒)')data_new = data[(major1 | major2 | major3) ^ major4]
data_new['專業名稱'].value_counts(dropna=False)分析 每個專業,不同性別 的學生消費特點
data_male = data_new[data_new['性別'] == '男']
data_female = data_new[data_new['性別'] == '女']
data_female.head()

在這里插入圖片描述
根據學生的整體校園消費行為,選擇合適的特征,構建聚類模型,分析每一類學生群體的消費特點。

data['專業名稱'].value_counts(dropna=False).count()
# 選擇特征:性別、總消費金額、總消費次數
data_1 = data[['校園卡號','性別']].drop_duplicates().reset_index(drop=True)
data_1['性別'] = data_1['性別'].astype(str).replace(({'男': 1, '女': 0}))
data_1.set_index(['校園卡號'], inplace=True)
data_2 = data.groupby('校園卡號').sum()[['消費金額']]
data_2.columns = ['總消費金額']
data_3 = data.groupby('校園卡號').count()[['消費時間']]
data_3.columns = ['總消費次數']
data_123 =  pd.concat([data_1, data_2, data_3], axis=1)#.reset_index(drop=True)
data_123.head()# 構建聚類模型
from sklearn.cluster import KMeans
# k為聚類類別,iteration為聚類最大循環次數,data_zs為標準化后的數據
k = 3    # 分成幾類可以在此處調整
iteration = 500
data_zs = 1.0 * (data_123 - data_123.mean()) / data_123.std()
# n_jobs為并發數
model = KMeans(n_clusters=k, n_jobs=4, max_iter=iteration, random_state=1234)
model.fit(data_zs)
# r1統計各個類別的數目,r2找出聚類中心
r1 = pd.Series(model.labels_).value_counts()
r2 = pd.DataFrame(model.cluster_centers_)
r = pd.concat([r2,r1], axis=1)
r.columns = list(data_123.columns) + ['類別數目']# 選出消費總額最低的500名學生的消費信息
data_500 = data.groupby('校園卡號').sum()[['消費金額']]
data_500.sort_values(by=['消費金額'],ascending=True,inplace=True,na_position='first')
data_500 = data_500.head(500)
data_500_index = data_500.index.values
data_500 = data[data['校園卡號'].isin(data_500_index)]
data_500.head(10)

在這里插入圖片描述

# 繪制餅圖
canteen_name = list(data_max_place.index)
man_count = list(data_max_place.values)
# 創建畫布
plt.figure(figsize=(10, 6), dpi=50)
# 繪制餅圖
plt.pie(man_count, labels=canteen_name, autopct='%1.2f%%', shadow=False, startangle=90, textprops={'fontproperties':font})
# 顯示圖例
plt.legend(prop=font)
# 添加標題
plt.title("低消費學生常消費地點占比餅圖", fontproperties=font)
# 餅圖保持圓形
plt.axis('equal')
# 顯示圖像
plt.show()

在這里插入圖片描述

建模資料

資料分享: 最強建模資料
在這里插入圖片描述
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/39859.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/39859.shtml
英文地址,請注明出處:http://en.pswp.cn/news/39859.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

個保新標 | 《信息安全技術 敏感個人信息處理安全要求》(征求意見稿)發布

8 月 9 日&#xff0c;全國信息安全標準化技術委員會公開發布關于國家標準《信息安全技術 敏感個人信息處理安全要求》&#xff08;征求意見稿&#xff09;&#xff08;以下簡稱《標準》&#xff09;的通知&#xff0c;面向社會廣泛征求意見。 《標準》的制定背景是為支撐《個人…

《Go 語言第一課》課程學習筆記(一)

配好環境&#xff1a;選擇一種最適合你的 Go 安裝方法 選擇 Go 版本 一般情況下&#xff0c;建議采用最新版本。因為 Go 團隊發布的 Go 語言穩定版本的平均質量一直是很高的&#xff0c;少有影響使用的重大 bug。可以根據不同實際項目需要或開源社區的情況使用不同的版本。 有…

攻擊LNMP架構Web應用

環境配置(centos7) 1.php56 php56-fpm //配置epel yum install epel-release rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm//安裝php56&#xff0c;php56-fpm及其依賴 yum --enablereporemi install php56-php yum --enablereporemi install php…

常見的字符編碼有哪些?有什么區別?

目錄 面試回答 知識擴展 Unicode 和 UTF-8 有啥關系&#xff1f; 有了 UTF-8&#xff0c;為什么要出現 GBK 為什么會出現亂碼 面試回答 就像電報只能發出“滴”和“答”聲一樣&#xff0c;計算機只認為 0 和1 兩種字符&#xff0c;但是&#xff0c;人類的文字是多種多樣的&…

B樹和B+樹區別

B樹和B樹的區別 B樹 B樹被稱為平衡樹&#xff0c;在B樹中&#xff0c;一個節點可以有兩個以上的子節點。B樹的高度為log M N。在B樹中&#xff0c;數據按照特定的順序排序&#xff0c;最小值在左側&#xff0c;最大值在右側。 B樹是一種平衡的多分樹&#xff0c;通常我們說m階…

什么是網絡地址轉換 (NAT)

網絡地址轉換&#xff08;NAT&#xff09;是更改源和目標 IP 地址和端口的過程&#xff0c;地址轉換減少了對 IPv4 公共地址的需求&#xff0c;并隱藏了專用網絡地址范圍&#xff0c;該過程通常由路由器或防火墻完成。 NAT是如何工作的 NAT 允許單個設備&#xff08;如路由器…

rhel 8.7 部署 keepalived+haproxy 實現 mysql 雙主高可用場景

文章目錄 [toc]部署 mysql關閉防火墻關閉 selinux創建相關目錄創建 mysql 用戶配置 PATH 變量驗證 mysql 命令切換到 mysql 用戶在 172.72.0.116 生成配置文件在 172.72.0.137 生成配置文件mysql 初始化啟動 mysql 服務修改 mysql 的 root 用戶密碼配置主從關系172.72.0.137 配…

數字化格局下的引領者:百望云通過強制性國家標準GB18030-2022最高級別認證

8月1日,強制性國家標準GB 18030-2022《信息技術 中文編碼字符集》實施。8月15日,百望云“綠頁閱讀器”正式通過中國電子技術標準化研究院強制性國家標準GB18030-2022《信息技術 中文編碼字符集》最高級(實現級別3)認證,彰顯了百望云在數字化信息處理領域對標國家標準的卓越技術…

Android CameraX適配Android13的踩坑之路

AndroidCameraX適配Android13的踩坑之路 前言&#xff1a; 最近把AGP插件升級到8.1.0&#xff0c;新建項目的時候目標版本和編譯版本都是33&#xff0c;發現之前的demo使用Camerax拍照和錄像都失敗了&#xff0c;于是查看了一下官網和各種資料&#xff0c;找到了Android13的適…

網絡編程(12): TCP重傳、滑動窗口、流量控制、擁塞控制

1、TCP重傳機制 通過序列號和確認號確保可靠傳輸&#xff0c;當發送端發送數據給接收到&#xff0c;接收端會返回一個確認號&#xff0c;表示收到消息了 超時重傳&#xff1a;沒有在指定時間內收到ACK報文 超時重傳的兩種可能&#xff1a;數據包丟失、確認包丟失超時重傳時間RT…

第十三課:QtCmd 命令行終端應用程序開發

功能描述&#xff1a;開發一個類似于 Windows 命令行提示符或 Linux 命令行終端的應用程序 一、最終演示效果 QtCmd 不是因為它是 Qt 的組件&#xff0c;而是采用 Qt 開發了一個類似 Windows 命令提示符或者 Linux 命令行終端的應用程序&#xff0c;故取名為 QtCmd。 上述演示…

FreeMarker系列--list的用法(長度,遍歷,下標,嵌套,排序)

原文網址&#xff1a;FreeMarker系列--list的用法&#xff08;長度,遍歷,下標,嵌套,排序&#xff09;_IT利刃出鞘的博客-CSDN博客 簡介 本文介紹FreeMarker的list的用法。 大小 Java ArrayList<String> list new ArrayList<String>(); Freemaker ${list?s…

W5500-EVB-PICO 做UDP Server進行數據回環測試(七)

前言 前面我們用W5500-EVB-PICO 開發板在TCP Client和TCP Server模式下&#xff0c;分別進行數據回環測試&#xff0c;本章我們將用開發板在UDP Server模式下進行數據回環測試。 UDP是什么&#xff1f;什么是UDP Server&#xff1f;能干什么&#xff1f; UDP (User Dataqram P…

圖數據庫_Neo4j學習cypher語言_使用CQL命令002_刪除節點_刪除屬性_結果排序Order By---Neo4j圖數據庫工作筆記0006

然后我們再來看如何刪除節點 可以看到首先 我們這里 比如我要刪除張三 可以看到 match (n:student) where n.name = "張三" delete n 這樣就是刪除了student集合中,name是張三的節點 然后我們再來看 如何來刪除關系 match (n:student)-[r]->(m:student) where…

機器學習、cv、nlp的一些前置知識

為節省篇幅&#xff0c;不標注文章來源和文章的問題場景。大部分是我的通俗理解。 文章目錄 向量關于向量的偏導數&#xff1a;雅可比矩陣二階導數矩陣&#xff1a;海森矩陣隨機變量隨機場伽馬函數beta分布數學術語坐標上升法協方差訓練集&#xff0c;驗證集&#xff0c;測試集…

Nginx的安裝及負載均衡搭建

一.Nginx的安裝 1&#xff09;準備安裝環境 yum install -y make gcc gcc-c pcre-devel pcre zlib zlib-devel openssl openssl-develPERE PCRE(Perl Compatible Regular Expressions)是一個Perl庫&#xff0c;包括 perl 兼容的正則表達式庫。 nginx的http模塊使用pcre來解…

前端jd要求:了解一門后端開發語言優先 解決方案之Node.js

前端jd要求&#xff1a;了解一門后端開發語言優先 解決方案之Node.js 前言常見的后端開發語言一、什么是 Node.js二、學習 Node.js 的前置知識三、學習 Node.js 的步驟1、Node.js 的安裝2、Node.js 的基本語法和 API模塊導入和導出文件讀寫操作HTTP 服務器命令行參數 3、Node.j…

可能導致不可接受的信息安全事件發生的核電站事故。

立陶宛伊格納利納核電站&#xff08;1992 年&#xff09; 一名在該核電站工作的程序員將惡意代碼上傳到一個負責反應堆子系統運行的自動化系統中&#xff0c;該系統被及時發現。 但如果沒有及時發現&#xff0c;誰知道會發生什么呢&#xff1f;核電站被關閉以進行調查。有關這…

Vue-8.集成(.editorconfig、.eslintrc.js、.prettierrc)

介紹 同時使用 .editorconfig、.prettierrc 和 .eslintrc.js 是很常見的做法&#xff0c;因為它們可以在不同層面上幫助確保代碼的格式一致性和質量。這種組合可以在開發過程中提供全面的代碼維護和質量保證。然而&#xff0c;這也可能增加一些復雜性&#xff0c;需要謹慎配置…

Coreutils工具包,Windows下使用Linux命令

之前總結過兩篇有關【如何在Windows系統下使用Linux的常用命令】的文章&#xff1a; GnuWin32&#xff0c;Windows下使用Linux命令 UnxUtils工具包&#xff0c;Windows下使用Linux命令 今天再推薦一個類似的工具包Coreutils 一、簡介 GNU core utilities是GNU操作系統基本…