文章目錄
- 一、職位數據分析
- 1. 一級分類職位數量統計分析
- 2. 職位二級分類分布分析
- 3. 職位分布分析
- 4. 工作經驗需求分布分析
- 5. 學歷要求職位分布分析
- 6. 企業職位供給前50
- 7. 不同規模公司的職位數量統計
- 8. 區域職位分布分析
- 9. 各區域平均薪資范圍分布分析
- 10. 不同工作經驗平均薪資范圍分布分析
- 11. 不同學歷平均薪資范圍分布分析
- 12. 不同企業規模平均薪資范圍分布分析
- 13. 各行業職位分布分析
- 14. 不同融資階段職位統計分析
- 15. 不同融資階段平均薪資范圍分布分析
- 16. 技能詞頻統計
- 二、完整代碼
一、職位數據分析
1. 一級分類職位數量統計分析
對職位一級分類(category_1)字段進行頻次統計,計算每個一級分類下的職位數量,輸出包含分類名稱和對應數量的結構化數據并保存。通過該分析可快速掌握各大門類職位的整體分布格局,識別核心招聘領域。
# 1. 一級分類職位數量統計分析
def category_1_job_counts(data, dir_name, file_name):category_1_counts = data['category_1'].value_counts()category_1_counts = category_1_counts.reset_index()category_1_counts.columns = ['category_1', 'counts']save_to_csv(category_1_counts, f'{dir_name}/{file_name}')
分析結果如下圖所示:
2. 職位二級分類分布分析
針對職位二級分類(category_2)字段進行數量統計,細化呈現更具體分類下的職位分布情況。相比一級分類,該分析能揭示更細分領域的招聘熱度,為崗位細分研究提供數據支持。
# 2. 職位二級分類分布分析
def category_2_job_counts(data, dir_name, file_name):category_2_counts = data['category_2'].value_counts()category_2_counts = category_2_counts.reset_index()category_2_counts.columns = ['category_2', 'counts']save_to_csv(category_2_counts, f'{dir_name}/{file_name}')# save_to_mysql(category_2_counts, 'category_2_job_counts')
分析結果如下圖所示:
3. 職位分布分析
統計具體職位名稱(position)的出現頻次,直接反映各崗位的招聘需求熱度。通過該分析可明確市場上需求量大的具體職位,為求職者和企業提供崗位供需的直觀參考。
# 3. 職位分布分析
def position_counts_analysis(data, dir_name, file_name):job_counts = data['position'].value_counts()job_counts = job_counts.reset_index()job_counts.columns = ['position', 'counts']save_to_csv(job_counts, f'{dir_name}/{file_name}')# save_to_mysql(job_counts, 'position_counts_analysis')
分析結果如下圖所示:
4. 工作經驗需求分布分析
統計不同工作經驗要求(experience)對應的職位數量,并按經驗遞進邏輯(如在校 / 應屆→經驗不限→具體時長)排序。該分析可清晰呈現市場對崗位經驗的需求分布,幫助理解不同經驗層級的崗位供給情況。
# 4. 工作經驗需求分布分析
def experience_job_counts(data, dir_name, file_name):experience_counts = data['experience'].value_counts()experience_counts = experience_counts.reset_index()experience_counts.columns = ['experience', 'counts']order_dict = {'在校/應屆': 1, '經驗不限': 2, '1個月': 3, '2個月': 4, '3個月': 5, '4個月': 6, '5個月': 7, '6個月': 8,'7個月': 9, '8個月': 10, '9個月': 11, '10個月': 12, '11個月': 13, '12個月': 14, '1年以內': 15,'1-3年': 16, '3-5年': 17, '5-10年': 18, '10年以上': 19}experience_counts.sort_values(by='experience', key=lambda x: x.map(order_dict), inplace=True)save_to_csv(experience_counts, f'{dir_name}/{file_name}')# save_to_mysql(experience_counts, 'experience_job_counts')
分析結果如下圖所示:
5. 學歷要求職位分布分析
統計不同學歷要求(education)對應的職位數量,并按學歷層次(如學歷不限→初中及以下→博士)排序。該分析可直觀展示市場對崗位學歷的需求門檻分布,為教育與就業的關聯研究提供基礎數據。
# 5. 學歷要求職位分布分析
def education_job_counts(data, dir_name, file_name):education_counts = data['education'].value_counts()education_counts = education_counts.reset_index()education_counts.columns = ['education', 'counts']order_dict = {'學歷不限': 1, '初中及以下': 2, '高中': 3, '中專/中技': 4, '大專': 5, '本科': 6, '碩士': 7, '博士': 8}education_counts.sort_values(by='education', key=lambda x: x.map(order_dict), inplace=True)save_to_csv(education_counts, f'{dir_name}/{file_name}')# save_to_mysql(education_counts, 'education_job_counts')
分析結果如下圖所示:
6. 企業職位供給前50
統計各企業(company_name)發布的職位數量,按職位數量降序排序后取前 50 名企業。該分析可識別招聘規模最大的頭部企業,反映企業的人才需求活躍度和市場擴張態勢。
# 6. 企業職位供給前50
def company_job_counts(data, dir_name, file_name):company_counts = data['company_name'].value_counts()company_counts = company_counts.reset_index()company_counts.columns = ['company_name', 'counts']company_counts = company_counts.sort_values(by='counts', ascending=False)company_counts = company_counts.head(50)save_to_csv(company_counts, f'{dir_name}/{file_name}')# save_to_mysql(company_counts, 'company_job_counts')
分析結果如下圖所示:
7. 不同規模公司的職位數量統計
按公司規模(company_size)統計對應職位數量,并按規模從小到大(0-20 人至 10000 人以上)排序。該分析可揭示不同規模企業的招聘需求差異,反映中小企業與大型企業的崗位供給格局。
# 7. 不同規模公司的職位數量統計
def company_size_job_counts(data, dir_name, file_name):company_size_counts = data['company_size'].value_counts()company_size_counts = company_size_counts.reset_index()company_size_counts.columns = ['company_size', 'counts']order_dict = {'0-20人': 1, '20-99人': 2, '100-499人': 3, '500-999人': 4, '1000-9999人': 5, '10000人以上': 6}company_size_counts.sort_values(by='company_size', key=lambda x: x.map(order_dict), inplace=True)save_to_csv(company_size_counts, f'{dir_name}/{file_name}')# save_to_mysql(company_size_counts, 'company_size_job_counts')
分析結果如下圖所示:
8. 區域職位分布分析
按省(province)、市(city)、區(district)三級地理維度分組統計職位數量,呈現職位在不同行政區域的分布情況。該分析可細化到區域層級,為人才流動、區域就業市場差異研究提供數據支撐。
# 8. 區域職位分布分析
def district_job_counts(data, dir_name, file_name):district_counts = data.groupby(by=['province', 'city', 'district'])[['province', 'city', 'district']]district_counts = district_counts.value_counts()district_counts = district_counts.reset_index()district_counts.columns = ['province', 'city', 'district', 'counts']save_to_csv(district_counts, f'{dir_name}/{file_name}')# save_to_mysql(district_counts, 'district_job_counts')
分析結果如下圖所示:
9. 各區域平均薪資范圍分布分析
按區域(district)分組計算平均薪資下限(salary_lower)和平均薪資上限(salary_upper),整合為區域薪資范圍數據。該分析可直觀對比不同區域的薪資水平差異,反映地域間的薪酬競爭力。
# 9. 各區域平均薪資范圍分布分析
def district_avg_salary_lower_upper(data, dir_name, file_name):salary_avg_lower = data.groupby('district')['salary_lower'].mean().round(0)salary_avg_upper = data.groupby('district')['salary_upper'].mean().round(0)salary_avg_lower_upper = pd.concat([salary_avg_lower, salary_avg_upper], axis=1)salary_avg_lower_upper = salary_avg_lower_upper.reset_index()salary_avg_lower_upper.columns = ['district', 'avg_salary_lower', 'avg_salary_upper']save_to_csv(salary_avg_lower_upper, f'{dir_name}/{file_name}')# save_to_mysql(salary_avg_lower_upper, 'district_avg_salary_lower_upper')
分析結果如下圖所示:
10. 不同工作經驗平均薪資范圍分布分析
按工作經驗(experience)分組計算平均薪資下限和上限,并按經驗遞進邏輯排序。該分析可清晰呈現薪資水平與工作經驗的關聯趨勢,為不同經驗層級的薪酬定位提供參考。
# 10. 不同工作經驗平均薪資范圍分布分析
def experience_salary_lower_upper(data, dir_name, file_name):salary_avg_lower = data.groupby('experience')['salary_lower'].mean().round(0)salary_avg_upper = data.groupby('experience')['salary_upper'].mean().round(0)salary_avg_lower_upper = pd.concat([salary_avg_lower, salary_avg_upper], axis=1)salary_avg_lower_upper = salary_avg_lower_upper.reset_index()salary_avg_lower_upper.columns = ['experience', 'avg_salary_lower', 'avg_salary_upper']order_dict = {'在校/應屆': 1, '經驗不限': 2, '1個月': 3, '2個月': 4, '3個月': 5, '4個月': 6, '5個月': 7, '6個月': 8,'7個月': 9, '8個月': 10, '9個月': 11, '10個月': 12, '11個月': 13, '12個月': 14, '1年以內': 15,'1-3年': 16, '3-5年': 17, '5-10年': 18, '10年以上': 19}salary_avg_lower_upper.sort_values(by='experience', key=lambda x: x.map(order_dict), inplace=True)save_to_csv(salary_avg_lower_upper, f'{dir_name}/{file_name}')# save_to_mysql(salary_avg_lower_upper, 'experience_salary_lower_upper')
分析結果如下圖所示:
11. 不同學歷平均薪資范圍分布分析
按學歷(education)分組計算平均薪資下限和上限,并按學歷層次由低到高排序。該分析可揭示學歷與薪資水平的關聯規律,為不同學歷背景的薪酬預期提供參考依據。
# 11. 不同學歷平均薪資范圍分布分析
def education_salary_lower_upper(data, dir_name, file_name):salary_avg_lower = data.groupby('education')['salary_lower'].mean().round(0)salary_avg_upper = data.groupby('education')['salary_upper'].mean().round(0)salary_avg_lower_upper = pd.concat([salary_avg_lower, salary_avg_upper], axis=1)salary_avg_lower_upper = salary_avg_lower_upper.reset_index()salary_avg_lower_upper.columns = ['education', 'avg_salary_lower', 'avg_salary_upper']order_dict = {'學歷不限': 1, '初中及以下': 2, '高中': 3, '中專/中技': 4, '大專': 5, '本科': 6, '碩士': 7, '博士': 8}salary_avg_lower_upper.sort_values(by='education', key=lambda x: x.map(order_dict), inplace=True)save_to_csv(salary_avg_lower_upper, f'{dir_name}/{file_name}')# save_to_mysql(salary_avg_lower_upper, 'education_salary_lower_upper')
分析結果如下圖所示:
12. 不同企業規模平均薪資范圍分布分析
按企業規模(company_size)分組計算平均薪資下限和上限,并按規模從小到大排序。該分析可對比不同規模企業的薪酬競爭力差異,反映企業規模與薪資水平的潛在關聯。
# 12. 不同企業規模平均薪資范圍分布分析
def company_size_salary_lower_upper(data, dir_name, file_name):salary_avg_lower = data.groupby('company_size')['salary_lower'].mean().round(0)salary_avg_upper = data.groupby('company_size')['salary_upper'].mean().round(0)salary_avg_lower_upper = pd.concat([salary_avg_lower, salary_avg_upper], axis=1)salary_avg_lower_upper = salary_avg_lower_upper.reset_index()salary_avg_lower_upper.columns = ['company_size', 'avg_salary_lower', 'avg_salary_upper']order_dict = {'0-20人': 1, '20-99人': 2, '100-499人': 3, '500-999人': 4, '1000-9999人': 5, '10000人以上': 6}salary_avg_lower_upper.sort_values(by='company_size', key=lambda x: x.map(order_dict), inplace=True)save_to_csv(salary_avg_lower_upper, f'{dir_name}/{file_name}')# save_to_mysql(salary_avg_lower_upper, 'company_size_salary_lower_upper')
分析結果如下圖所示:
13. 各行業職位分布分析
統計各行業(company_industry)的職位數量,呈現不同行業的招聘需求熱度。該分析可直觀反映行業人才需求差異,為產業就業市場研究提供基礎數據。
# 13. 各行業職位分布分析
def company_industry_job_counts(data, dir_name, file_name):industry_counts = data['company_industry'].value_counts()industry_counts = industry_counts.reset_index()industry_counts.columns = ['company_industry', 'counts']save_to_csv(industry_counts, f'{dir_name}/{file_name}')# save_to_mysql(industry_counts, 'company_industry_job_counts')
分析結果如下圖所示:
14. 不同融資階段職位統計分析
按企業融資階段(financing_status)統計職位數量,并按融資進程(未融資→已上市等)排序。該分析可展示不同發展階段企業的招聘活躍度,反映企業生命周期與人才需求的關聯。
# 14. 不同融資階段職位統計分析
def financing_status_job_counts(data, dir_name, file_name):financing_counts = data['financing_status'].value_counts()financing_counts = financing_counts.reset_index()financing_counts.columns = ['financing_status', 'counts']order_dict = {'未融資': 1, '天使輪': 2, 'A輪': 3, 'B輪': 4, 'C輪': 5, 'D輪及以上': 6, '已上市': 7, '不需要融資': 8,'未知': 8}financing_counts.sort_values(by='financing_status', key=lambda x: x.map(order_dict), inplace=True)save_to_csv(financing_counts, f'{dir_name}/{file_name}')# save_to_mysql(financing_counts, 'financing_status_job_counts')
分析結果如下圖所示:
15. 不同融資階段平均薪資范圍分布分析
按企業融資階段分組計算平均薪資下限和上限,并按融資進程排序。該分析可揭示企業不同發展階段的薪酬策略差異,為求職者選擇企業提供薪資參考。
# 15. 不同融資階段平均薪資范圍分布分析
def financing_status_salary_lower_upper(data, dir_name, file_name):salary_avg_lower = data.groupby('financing_status')['salary_lower'].mean().round(0)salary_avg_upper = data.groupby('financing_status')['salary_upper'].mean().round(0)salary_avg_lower_upper = pd.concat([salary_avg_lower, salary_avg_upper], axis=1)salary_avg_lower_upper = salary_avg_lower_upper.reset_index()salary_avg_lower_upper.columns = ['financing_status', 'avg_salary_lower', 'avg_salary_upper']order_dict = {'未融資': 1, '天使輪': 2, 'A輪': 3, 'B輪': 4, 'C輪': 5, 'D輪及以上': 6, '已上市': 7, '不需要融資': 8,'未知': 8}salary_avg_lower_upper.sort_values(by='financing_status', key=lambda x: x.map(order_dict), inplace=True)save_to_csv(salary_avg_lower_upper, f'{dir_name}/{file_name}')
分析結果如下圖所示:
16. 技能詞頻統計
對職位要求的技能(skill)進行拆分、去重后統計詞頻,取出現次數最多的前 50 項技能。該分析可識別市場熱門技能需求,為求職者提升職業技能和企業制定招聘標準提供方向參考。
# 16. 技能詞頻統計
def skill_word_frequency(data, dir_name, file_name):# 對技能列進行拆分、展開和去除首尾空格all_skills = data['skill'].str.split(',').explode().str.strip()skill_freq = all_skills.value_counts()skill_freq = skill_freq.reset_index()skill_freq.columns = ['skill', 'counts']skill_freq = skill_freq.sort_values(by='counts', ascending=False)skill_freq = skill_freq.head(50)save_to_csv(skill_freq, f'{dir_name}/{file_name}')# save_to_mysql(skill_freq, 'skill_word_frequency')
分析結果如下圖所示:
二、完整代碼
from pathlib import Pathimport pandas as pd
from sqlalchemy import create_enginedef load_data(csv_file_path):try:data = pd.read_csv(csv_file_path)return dataexcept FileNotFoundError:print("未找到指定的 CSV 文件,請檢查文件路徑和文件名。")except Exception as e:print(f"加載數據時出現錯誤: {e}")# 保存清洗后的數據為csv文件
def save_to_csv(data, csv_file_path):# 使用 pathlib 處理文件路徑path = Path(csv_file_path)# 檢查文件所在目錄是否存在,如果不存在則創建path.parent.mkdir(parents=True, exist_ok=True)data.to_csv(csv_file_path, index=False, encoding='utf-8-sig', mode='w', header=True)print(f'清洗后的數據已保存到 {csv_file_path} 文件')# 讀取MySQL中的數據
def load_from_mysql(table_name):# 創建數據庫引擎實例engine = create_engine(f'mysql+mysqlconnector://root:zxcvbq@127.0.0.1:3306/position')data = pd.read_sql_table(table_name, engine)return data# 保存清洗后的數據到MySQL數據庫
def save_to_mysql(data, table_name):# 創建一個 SQLAlchemy 引擎,用于連接 MySQL 數據庫# 使用 mysqlconnector 作為 MySQL 的驅動程序# 數據庫連接信息包括用戶名 root、密碼 zxcvbq、主機地址 127.0.0.1、端口 3306 以及數據庫名 positionengine = create_engine(f'mysql+mysqlconnector://root:zxcvbq@127.0.0.1:3306/position')# 將 DataFrame 中的數據寫入到 MySQL 數據庫中# table_name 是要寫入的表名# con 參數指定了數據庫連接引擎# index=False 表示不將 DataFrame 的索引寫入數據庫# if_exists='replace' 表示如果表已經存在,則先刪除原表,再創建新表并寫入數據data.to_sql(table_name, con=engine, index=False, if_exists='replace')print(f'清洗后的數據已保存到 {table_name} 表')# 1. 一級分類職位數量統計分析
def category_1_job_counts(data, dir_name, file_name):category_1_counts = data['category_1'].value_counts()category_1_counts = category_1_counts.reset_index()category_1_counts.columns = ['category_1', 'counts']save_to_csv(category_1_counts, f'{dir_name}/{file_name}')# 2. 職位二級分類分布分析
def category_2_job_counts(data, dir_name, file_name):category_2_counts = data['category_2'].value_counts()category_2_counts = category_2_counts.reset_index()category_2_counts.columns = ['category_2', 'counts']save_to_csv(category_2_counts, f'{dir_name}/{file_name}')# save_to_mysql(category_2_counts, 'category_2_job_counts')# 3. 職位分布分析
def position_counts_analysis(data, dir_name, file_name):job_counts = data['position'].value_counts()job_counts = job_counts.reset_index()job_counts.columns = ['position', 'counts']save_to_csv(job_counts, f'{dir_name}/{file_name}')# save_to_mysql(job_counts, 'position_counts_analysis')# 4. 工作經驗需求分布分析
def experience_job_counts(data, dir_name, file_name):experience_counts = data['experience'].value_counts()experience_counts = experience_counts.reset_index()experience_counts.columns = ['experience', 'counts']order_dict = {'在校/應屆': 1, '經驗不限': 2, '1個月': 3, '2個月': 4, '3個月': 5, '4個月': 6, '5個月': 7, '6個月': 8,'7個月': 9, '8個月': 10, '9個月': 11, '10個月': 12, '11個月': 13, '12個月': 14, '1年以內': 15,'1-3年': 16, '3-5年': 17, '5-10年': 18, '10年以上': 19}experience_counts.sort_values(by='experience', key=lambda x: x.map(order_dict), inplace=True)save_to_csv(experience_counts, f'{dir_name}/{file_name}')# save_to_mysql(experience_counts, 'experience_job_counts')# 5. 學歷要求職位分布分析
def education_job_counts(data, dir_name, file_name):education_counts = data['education'].value_counts()education_counts = education_counts.reset_index()education_counts.columns = ['education', 'counts']order_dict = {'學歷不限': 1, '初中及以下': 2, '高中': 3, '中專/中技': 4, '大專': 5, '本科': 6, '碩士': 7, '博士': 8}education_counts.sort_values(by='education', key=lambda x: x.map(order_dict), inplace=True)save_to_csv(education_counts, f'{dir_name}/{file_name}')# save_to_mysql(education_counts, 'education_job_counts')# 6. 企業職位供給前50
def company_job_counts(data, dir_name, file_name):company_counts = data['company_name'].value_counts()company_counts = company_counts.reset_index()company_counts.columns = ['company_name', 'counts']company_counts = company_counts.sort_values(by='counts', ascending=False)company_counts = company_counts.head(50)save_to_csv(company_counts, f'{dir_name}/{file_name}')# save_to_mysql(company_counts, 'company_job_counts')# 7. 不同規模公司的職位數量統計
def company_size_job_counts(data, dir_name, file_name):company_size_counts = data['company_size'].value_counts()company_size_counts = company_size_counts.reset_index()company_size_counts.columns = ['company_size', 'counts']order_dict = {'0-20人': 1, '20-99人': 2, '100-499人': 3, '500-999人': 4, '1000-9999人': 5, '10000人以上': 6}company_size_counts.sort_values(by='company_size', key=lambda x: x.map(order_dict), inplace=True)save_to_csv(company_size_counts, f'{dir_name}/{file_name}')# save_to_mysql(company_size_counts, 'company_size_job_counts')# 8. 區域職位分布分析
def district_job_counts(data, dir_name, file_name):district_counts = data.groupby(by=['province', 'city', 'district'])[['province', 'city', 'district']]district_counts = district_counts.value_counts()district_counts = district_counts.reset_index()district_counts.columns = ['province', 'city', 'district', 'counts']save_to_csv(district_counts, f'{dir_name}/{file_name}')# save_to_mysql(district_counts, 'district_job_counts')# 9. 各區域平均薪資范圍分布分析
def district_avg_salary_lower_upper(data, dir_name, file_name):salary_avg_lower = data.groupby('district')['salary_lower'].mean().round(0)salary_avg_upper = data.groupby('district')['salary_upper'].mean().round(0)salary_avg_lower_upper = pd.concat([salary_avg_lower, salary_avg_upper], axis=1)salary_avg_lower_upper = salary_avg_lower_upper.reset_index()salary_avg_lower_upper.columns = ['district', 'avg_salary_lower', 'avg_salary_upper']save_to_csv(salary_avg_lower_upper, f'{dir_name}/{file_name}')# save_to_mysql(salary_avg_lower_upper, 'district_avg_salary_lower_upper')# 10. 不同工作經驗平均薪資范圍分布分析
def experience_salary_lower_upper(data, dir_name, file_name):salary_avg_lower = data.groupby('experience')['salary_lower'].mean().round(0)salary_avg_upper = data.groupby('experience')['salary_upper'].mean().round(0)salary_avg_lower_upper = pd.concat([salary_avg_lower, salary_avg_upper], axis=1)salary_avg_lower_upper = salary_avg_lower_upper.reset_index()salary_avg_lower_upper.columns = ['experience', 'avg_salary_lower', 'avg_salary_upper']order_dict = {'在校/應屆': 1, '經驗不限': 2, '1個月': 3, '2個月': 4, '3個月': 5, '4個月': 6, '5個月': 7, '6個月': 8,'7個月': 9, '8個月': 10, '9個月': 11, '10個月': 12, '11個月': 13, '12個月': 14, '1年以內': 15,'1-3年': 16, '3-5年': 17, '5-10年': 18, '10年以上': 19}salary_avg_lower_upper.sort_values(by='experience', key=lambda x: x.map(order_dict), inplace=True)save_to_csv(salary_avg_lower_upper, f'{dir_name}/{file_name}')# save_to_mysql(salary_avg_lower_upper, 'experience_salary_lower_upper')# 11. 不同學歷平均薪資范圍分布分析
def education_salary_lower_upper(data, dir_name, file_name):salary_avg_lower = data.groupby('education')['salary_lower'].mean().round(0)salary_avg_upper = data.groupby('education')['salary_upper'].mean().round(0)salary_avg_lower_upper = pd.concat([salary_avg_lower, salary_avg_upper], axis=1)salary_avg_lower_upper = salary_avg_lower_upper.reset_index()salary_avg_lower_upper.columns = ['education', 'avg_salary_lower', 'avg_salary_upper']order_dict = {'學歷不限': 1, '初中及以下': 2, '高中': 3, '中專/中技': 4, '大專': 5, '本科': 6, '碩士': 7, '博士': 8}salary_avg_lower_upper.sort_values(by='education', key=lambda x: x.map(order_dict), inplace=True)save_to_csv(salary_avg_lower_upper, f'{dir_name}/{file_name}')# save_to_mysql(salary_avg_lower_upper, 'education_salary_lower_upper')# 12. 不同企業規模平均薪資范圍分布分析
def company_size_salary_lower_upper(data, dir_name, file_name):salary_avg_lower = data.groupby('company_size')['salary_lower'].mean().round(0)salary_avg_upper = data.groupby('company_size')['salary_upper'].mean().round(0)salary_avg_lower_upper = pd.concat([salary_avg_lower, salary_avg_upper], axis=1)salary_avg_lower_upper = salary_avg_lower_upper.reset_index()salary_avg_lower_upper.columns = ['company_size', 'avg_salary_lower', 'avg_salary_upper']order_dict = {'0-20人': 1, '20-99人': 2, '100-499人': 3, '500-999人': 4, '1000-9999人': 5, '10000人以上': 6}salary_avg_lower_upper.sort_values(by='company_size', key=lambda x: x.map(order_dict), inplace=True)save_to_csv(salary_avg_lower_upper, f'{dir_name}/{file_name}')# save_to_mysql(salary_avg_lower_upper, 'company_size_salary_lower_upper')# 13. 各行業職位分布分析
def company_industry_job_counts(data, dir_name, file_name):industry_counts = data['company_industry'].value_counts()industry_counts = industry_counts.reset_index()industry_counts.columns = ['company_industry', 'counts']save_to_csv(industry_counts, f'{dir_name}/{file_name}')# save_to_mysql(industry_counts, 'company_industry_job_counts')# 14. 不同融資階段職位統計分析
def financing_status_job_counts(data, dir_name, file_name):financing_counts = data['financing_status'].value_counts()financing_counts = financing_counts.reset_index()financing_counts.columns = ['financing_status', 'counts']order_dict = {'未融資': 1, '天使輪': 2, 'A輪': 3, 'B輪': 4, 'C輪': 5, 'D輪及以上': 6, '已上市': 7, '不需要融資': 8,'未知': 8}financing_counts.sort_values(by='financing_status', key=lambda x: x.map(order_dict), inplace=True)save_to_csv(financing_counts, f'{dir_name}/{file_name}')# save_to_mysql(financing_counts, 'financing_status_job_counts')# 15. 不同融資階段平均薪資范圍分布分析
def financing_status_salary_lower_upper(data, dir_name, file_name):salary_avg_lower = data.groupby('financing_status')['salary_lower'].mean().round(0)salary_avg_upper = data.groupby('financing_status')['salary_upper'].mean().round(0)salary_avg_lower_upper = pd.concat([salary_avg_lower, salary_avg_upper], axis=1)salary_avg_lower_upper = salary_avg_lower_upper.reset_index()salary_avg_lower_upper.columns = ['financing_status', 'avg_salary_lower', 'avg_salary_upper']order_dict = {'未融資': 1, '天使輪': 2, 'A輪': 3, 'B輪': 4, 'C輪': 5, 'D輪及以上': 6, '已上市': 7, '不需要融資': 8,'未知': 8}salary_avg_lower_upper.sort_values(by='financing_status', key=lambda x: x.map(order_dict), inplace=True)save_to_csv(salary_avg_lower_upper, f'{dir_name}/{file_name}')# 16. 技能詞頻統計
def skill_word_frequency(data, dir_name, file_name):# 對技能列進行拆分、展開和去除首尾空格all_skills = data['skill'].str.split(',').explode().str.strip()skill_freq = all_skills.value_counts()skill_freq = skill_freq.reset_index()skill_freq.columns = ['skill', 'counts']skill_freq = skill_freq.sort_values(by='counts', ascending=False)skill_freq = skill_freq.head(50)save_to_csv(skill_freq, f'{dir_name}/{file_name}')# save_to_mysql(skill_freq, 'skill_word_frequency')if __name__ == '__main__':dir_path = '../data/data_analysis_result'df = load_data('../data/data_cleaning_result/cleaned_position_dataset.csv')category_1_job_counts(df, dir_path, 'category_1_job_counts.csv')category_2_job_counts(df, dir_path, 'category_2_job_counts.csv')position_counts_analysis(df, dir_path, 'position_counts_analysis.csv')experience_job_counts(df, dir_path, 'experience_job_counts.csv')education_job_counts(df, dir_path, 'education_job_counts.csv')company_job_counts(df, dir_path, 'company_job_counts.csv')company_size_job_counts(df, dir_path, 'company_size_job_counts.csv')district_job_counts(df, dir_path, 'district_job_counts.csv')district_avg_salary_lower_upper(df, dir_path, 'district_avg_salary_lower_upper.csv')experience_salary_lower_upper(df, dir_path, 'experience_salary_lower_upper.csv')education_salary_lower_upper(df, dir_path, 'education_salary_lower_upper.csv')company_size_salary_lower_upper(df, dir_path, 'company_size_salary_lower_upper.csv')company_industry_job_counts(df, dir_path, 'company_industry_job_counts.csv')financing_status_job_counts(df, dir_path, 'financing_status_job_counts.csv')financing_status_salary_lower_upper(df, dir_path, 'financing_status_salary_lower_upper.csv')skill_word_frequency(df, dir_path, 'skill_word_frequency.csv')