
畢業設計準備做就業數據分析簡歷里想放一個可視化項目很多同學都會想到用 Python 配合 MySQL。這類項目最適合的落地方式不是只在 Jupyter Notebook 里跑一段代碼而是把數據集、數據庫、分析腳本、圖表輸出整理成一條完整鏈路先用 Python 清洗數據再把干凈數據導入 MySQL接著用 SQL 和 pandas 做統計最后用 pyecharts 生成可視化頁面。下面按這個順序把項目拆開講每一步都會解釋為什么這樣做也會把常見報錯和排查方式放在一起。這個項目對秋招簡歷和課設答辯最大的價值在于它覆蓋了數據分析方向最常見的工程動作數據格式處理、數據庫表設計、SQL 聚合統計、Python 分析調用、圖表結果導出。你不需要追求平臺前端那種華麗大屏先把“數據清洗到入庫、入庫到出圖”這條閉環跑通比堆砌圖表更重要。1. 先理解這個項目到底在分析什么1.1 項目鏈路從原始數據到可視化頁面招聘數據分析可視化拆開看只有三個環節數據存哪里、數據怎么算、結果怎么展示。數據存哪里使用 MySQL。招聘崗位數據是結構化數據適合用關系型數據庫存儲。數據怎么算使用 SQL 做分組統計再用 pandas 做結果加工。SQL 負責聚合Python 負責補足復雜邏輯和繪圖前的數據準備。結果怎么展示使用 pyecharts 生成 HTML 圖表頁面。圖表文件可以直接在瀏覽器打開也可以放進課設報告或者后續用 Web 框架包裝成部署頁面。常見完整目錄結構是這樣recruit_analysis/ ├── data/ │ ├── raw_recruit.csv │ └── clean_recruit.csv ├── sql/ │ ├── create_table.sql │ └── analysis_queries.sql ├── scripts/ │ ├── clean_data.py │ ├── load_to_mysql.py │ ├── analysis.py │ └── charts.py ├── output/ │ ├── city_top10.html │ └── edu_pie.html ├── README.md └── requirements.txt這樣組織的好處是輸入數據、建表邏輯、運行腳本、結果輸出互不混在一起。后續排錯時只要確認問題發生在哪一層就能縮小檢查范圍。1.2 為什么選 Python MySQL而不是只靠 ExcelExcel 確實可以完成篩選、透視表、簡單圖表但它很難形成可復現的工程化流程。真實招聘數據可能不斷追加新字段Excel 手工操作容易出錯也無法方便地應對上千上萬行數據。Python MySQL 的典型收益如下表。對比項Excel 手工操作Python MySQL清洗過程操作步驟依賴人工記憶清洗邏輯寫成腳本可重復運行數據規模幾萬行會比較吃力可以擴展到百萬行級項目聚合分析透視表直觀但難以批量執行SQL 分組統計穩定可控圖表展示依賴 Excel 環境pyecharts 輸出 HTML可分享可嵌入簡歷表達展示價值有限能體現工程鏈路適合面試講解不是說 Excel 不能分析而是寫項目時需要更完整的技術鏈路方便你講清楚“數據從哪來、如何存儲、如何計算、如何展示”。1.3 數據集字段與合規邊界很多同學第一反應是“能不能直接寫爬蟲抓招聘平臺數據”。這里建議明確項目邊界招聘數據分析項目的重點是分析與可視化不是采集。網站用戶協議、訪問頻率、登錄限制、反爬機制都可能讓爬蟲方案不符合合規要求。更穩妥的做法是使用課程自帶樣例數據集、公開競賽數據或者自己根據公開職位信息整理模擬數據。整理后的 CSV 結構可以參考如下字段字段名含義分析用途示例值job_name崗位名稱篩選目標崗位、統計崗位類型數據分析師company_name公司名稱公司主體標識示例科技有限公司city工作城市地域需求分析上海salary_min月薪下限單位 K薪資區間分析15salary_max月薪上限單位 K薪資區間分析25exp_req經驗要求經驗門檻分布3-5年edu_req學歷要求學歷門檻分布本科company_type公司類型公司行業屬性互聯網company_size公司規模公司規模分布100-499人skill_tags技能標簽技能關鍵詞統計SQL,Pythonpublish_date發布日期崗位發布時間趨勢2025-01-15如果你手上的原始數據字段不同先不要急著建表而是寫一個字段映射腳本做統一避免后面查詢時到處是別名混亂。2. 環境準備Python 與 MySQL 的最小可運行狀態2.1 版本組合和依賴安裝這個項目對版本要求并不苛刻。推薦使用 Python 3.9 及以上版本MySQL 使用 8.0 或 5.7 都可以。下方是建議環境。環境版本建議說明Python3.9 及以上兼容 pandas、pyecharts 新版本MySQL8.0 / 5.7課程和畢設項目都能滿足pandas最新穩定版數據清洗和分析SQLAlchemy2.x統一連接 MySQL支持 read_sql、to_sqlPyMySQL1.0 及以上Python 連接 MySQL 的驅動pyecharts2.x生成 HTML 圖表環境安裝后先執行基礎檢查python --version pip --version mysql --version如果 MySQL 還沒有安裝可以按操作系統選擇安裝方式。Ubuntu/Debian 環境通常使用 apt 安裝CentOS/RHEL 環境使用 yumWindows 和 macOS 可以下載安裝包。無論哪種方式安裝后都需要確認 MySQL 服務處于啟動狀態。項目依賴可以用一條命令安裝pip install pandas pymysql sqlalchemy pyecharts這里不推薦把 matplotlib 當作主力雖然它可以畫靜態折線圖和柱狀圖但招聘數據分析項目如果要輸出給課設答辯或放進簡歷展示pyecharts 生成的交互式 HTML 更直觀也更貼近“可視化”這個關鍵詞。2.2 使用 SQLAlchemy 連接本地 MySQL許多教程會直接使用 PyMySQL 的connect()方法但后續調用 pandas 的read_sql和to_sql時更穩定的方式是使用 SQLAlchemy 連接引擎。下面是一個連接本地數據庫的最小示例from sqlalchemy import create_engine # 把 your_password 換成你的 MySQL root 密碼 engine create_engine( mysqlpymysql://root:your_passwordlocalhost:3306/recruit?charsetutf8mb4 ) with engine.connect() as conn: print(連接成功)這段代碼里的數據庫名是recruit。如果還沒有創建這個庫連接會報Unknown database所以可以先到 MySQL 命令行創建CREATE DATABASE IF NOT EXISTS recruit DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;使用utf8mb4而不是utf8是為了避免中文和部分特殊字符存儲時報錯或亂碼。2.3 環境檢查清單每次環境搭建完成后建議按下面的順序檢查一遍。檢查項檢查命令通過標志Python 版本python --version顯示 3.xpip 版本pip --version正常輸出版本號MySQL 服務mysqladmin -u root -p status輸入密碼后顯示服務器運行中數據庫連接mysql -u root -p進入 MySQL 命令行Python 依賴python -c import pandas,pymysql,sqlalchemy;print(OK)輸出 OK如果你在本機運行優先用 root 賬號跑通項目。如果連到遠程 MySQL需要確認服務器允許遠程連接并且端口 3306 可以被訪問。學習環境最穩妥的順序是先本地跑通再考慮遠程聯調。3. 數據結構與導入從 CSV 到 MySQL 的核心步驟3.1 理解原始字段薪資不要只存一個字符串招聘數據中最容易出錯的是薪資字段。很多原始 CSV 會把薪資寫成“15-25K”這樣的字符串如果直接入庫后續想做排序、均值、區間比較都非常麻煩。正確做法是在清洗階段拆分字段salary_min存 15salary_max存 25。單位統一為 K。這樣數據庫里可以用數值計算也能畫“薪資中位數”之類的圖表。保存方式查詢示例問題字符串“15-25K”無法用 AVG 計算平均薪資字符串排序會得到錯誤結果salary_min15salary_max25AVG((salary_minsalary_max)/2.0)數值計算穩定這也解釋了為什么原始數據準備好后不要直接復制到 Excel 做人工處理而是要寫 Python 清洗腳本。腳本可以反復運行后續拿到增量數據也能復用同樣的規則。3.2 數據清洗編碼、空值、類型轉換先用 pandas 讀入 CSV并統一列名import pandas as pd df pd.read_csv(data/raw_recruit.csv, encodingutf-8-sig) print(df.shape) print(df.head())encodingutf-8-sig是處理中文 CSV 的常用寫法。Windows 下用 Excel 導出的文件可能帶有 BOM不指定utf-8-sig會讓第一列列名出現\ufeff前綴。假設原始文件列名是中文先做字段映射df df.rename(columns{ 崗位名稱: job_name, 公司名稱: company_name, 城市: city, 最低薪資: salary_min, 最高薪資: salary_max, 經驗要求: exp_req, 學歷要求: edu_req, 公司類型: company_type, 公司規模: company_size, 技能標簽: skill_tags, 發布時間: publish_date, })再做類型轉換和缺失值處理df[salary_min] df[salary_min].astype(int) df[salary_max] df[salary_max].astype(int) df[publish_date] pd.to_datetime(df[publish_date], errorscoerce).dt.date df df.dropna(subset[job_name, city, salary_min, salary_max]) df[job_name] df[job_name].str.strip() df[city] df[city].str.strip() df.to_csv(data/clean_recruit.csv, indexFalse, encodingutf-8-sig)這里有一個需要特別注意的坑不要對所有數據源套用同一套清洗代碼。例如原始字段若是“15K-25K·14薪”簡單astype(int)就會報錯。碰到這種情況要先寫一個解析函數剝掉非數字部分或者回到數據導出源頭統一格式。正規項目流程里清洗規則應當記錄在 READ