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