0 경쟁 아이디어
(경쟁 질문이 나오는 즉시 CSDN에 공유)
https://blog.csdn.net/dc_sinor?type=blog
1 주제의 배경
캠퍼스카드는 신원인증, 금융소비, 데이터 공유 등 여러 기능을 통합한 정보통합시스템이다. 교사와 학생에게 고품질의 효율적인 정보 서비스를 제공하는 한편, 시스템 자체에는 학생의 소비행태, 매점 등 각 부서의 운영현황 등의 정보가 포함된 많은 이력이 축적되어 있다.
2016년 1월 27일자 "Yangtze Evening News" 보도: "Southern Institute of Technology, 가난한 학생들에게 따뜻한 식사 제공" 카드 보조금"".
신청할 필요도없고 검토도없고 식사 카드에 조용히 수백 위안을 추가 할 수 있습니다 ... 기자는 어제 난징 공과 대학에서 독점적으로 난징 공과 대학 교육 재단이 공식적으로 "심장 - 온난화 식사 카드"
이 프로젝트는 극도로 가난한 학생들의 음식과 의복 문제에 대해 "정밀 지원"을 제공합니다.
이 프로젝트는 빈곤한 학부생의 "음식과 의복 문제"에 대해 특별히 지원을 제공합니다. 교육재단 관계자는 학교카드센터에서 9월 중순부터 11월 중순까지 교내 학부생 1만6000여명의 카드 도용 기록을 찾아내고 전 기록을 빅데이터 분석했다. 결국 500개가 넘는 '준보조물'이 선정됐다.
South Technological Education Foundation은 100만 위안의 "종자 기금"을 창업 자본으로 취하고 각 가난한 학생의 다양한 상황에 따라 특정 보조금 금액을 결정한 다음 "조용히" 돈을 학생의 식사 카드 , 어려움이 있는 학생들이 충분한 음식을 먹을 수 있도록 합니다.
——"양쯔 저녁 뉴스" 2016년 1월 27일: NIT는 가난한 학생들에게 "따뜻한 식권 보조금"을 제공합니다. 이 질문은 국내 대학의 캠퍼스 카드 시스템의 한 달간 운영 데이터를 제공합니다. 참가자는 그것을 사용할 것으로 예상됩니다.
데이터 분석 및 모델링 방법, 데이터에 포함된 정보 마이닝, 교내 학생의 학습 및 생활 행동 분석, 학교 서비스 개선 및 유관 부서의 의사 결정을 위한 정보 지원 제공.
2 분석 목적
-
1. 학생들의 소비 행태와 매점 운영 실태를 분석하고 매점 운영을 위한 제안을 한다.
-
2. 학생 소비 세분화 모델을 구축하여 학교가 학생의 경제 상태를 판단하는 데 참고할 수 있도록 합니다.
3 데이터 설명
첨부파일은 2019년 4월 1일부터 2019년 4월 30일까지 학교의 원카드 데이터입니다.
총 3개의 파일이 있습니다: data1.csv, data2.csv, data3.csv
4 데이터 전처리
첨부파일에 있는 data1.csv, data2.csv, data3.csv 세 개의 파일을 분석 환경에 로드하고 부록 1을 참조하여 필드의 의미를 파악합니다. 데이터 품질을 조사하고 누락된 값 및 이상값과 같은 항목에 대해 필요한 처리를 수행합니다. 처리 결과를 "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[:,'消费星期'] > 5
work_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 학생 소비 행태 분석
학생들의 전체 교내 소비 데이터에 따라 이번 달 1인당 카드 스와이프 횟수와 1인당 소비량을 산출하고, 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()