0% found this document useful (0 votes)
0 views20 pages

HR Data Analysis Using Python

The HR Data Analysis Project involves analyzing a dataset of 311 employees with various attributes such as salary, position, and demographics. Key findings include a total salary expenditure of ₹21,465,433, an average salary of ₹69,020.68, and a breakdown of employees by gender, marital status, and employment status. The analysis also reveals that there are 207 active employees and 104 terminated employees, with significant insights into termination by department.

Uploaded by

rajkapure986
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
0 views20 pages

HR Data Analysis Using Python

The HR Data Analysis Project involves analyzing a dataset of 311 employees with various attributes such as salary, position, and demographics. Key findings include a total salary expenditure of ₹21,465,433, an average salary of ₹69,020.68, and a breakdown of employees by gender, marital status, and employment status. The analysis also reveals that there are 207 active employees and 104 terminated employees, with significant insights into termination by department.

Uploaded by

rajkapure986
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 20

6/16/25, 3:57 AM HR_Analysis

HR DATA ANALYSIS PROJECT


In [1]: import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

#plot style
sns.set(style= 'whitegrid', palette= 'muted')
%matplotlib inline

In [2]: #loading the dataset


df = pd.read_excel(r"C:\Users\KRITIKA\Downloads\New HR.xlsx")

In [3]: df.head()

Out[3]: Employee_Name EmpID Salary PositionID Position State Zip DOB Sex M

Production
1983-
0 Adinolfi, Wilson K 10026 62506 19 Technician MA 1960 M
07-10
I

Ait Sidi, 1975-


1 10084 104437 27 Sr. DBA MA 2148 M
Karthikeyan 05-05

Production
1988-
2 Akinkuolie, Sarah 10196 64955 20 Technician MA 1810 F
09-19
II

Production
1988-
3 Alagbe,Trina 10088 64991 19 Technician MA 1886 F
09-27
I

Production
1989-
4 Anderson, Carol 10069 50825 19 Technician MA 2169 F
09-08
I

5 rows × 28 columns

 

In [4]: #Understand the Dataset Structure


df.info()

file:///C:/Users/KRITIKA/OneDrive/HR_Analysis.html 1/20
6/16/25, 3:57 AM HR_Analysis

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 311 entries, 0 to 310
Data columns (total 28 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Employee_Name 311 non-null object
1 EmpID 311 non-null int64
2 Salary 311 non-null int64
3 PositionID 311 non-null int64
4 Position 311 non-null object
5 State 311 non-null object
6 Zip 311 non-null int64
7 DOB 311 non-null datetime64[ns]
8 Sex 311 non-null object
9 MaritalDesc 311 non-null object
10 CitizenDesc 311 non-null object
11 HispanicLatino 311 non-null object
12 RaceDesc 311 non-null object
13 DateofHire 311 non-null datetime64[ns]
14 DateofTermination 104 non-null datetime64[ns]
15 TermReason 311 non-null object
16 EmploymentStatus 311 non-null object
17 Department 311 non-null object
18 ManagerName 311 non-null object
19 ManagerID 303 non-null float64
20 RecruitmentSource 311 non-null object
21 PerformanceScore 311 non-null object
22 EngagementSurvey 311 non-null float64
23 EmpSatisfaction 311 non-null int64
24 SpecialProjectsCount 311 non-null int64
25 LastPerformanceReview_Date 311 non-null datetime64[ns]
26 DaysLateLast30 311 non-null int64
27 Absences 311 non-null int64
dtypes: datetime64[ns](4), float64(2), int64(8), object(14)
memory usage: 68.2+ KB
columns like DateofTermination and ManagerID has missing values

In [5]: #statistics
df.describe()

file:///C:/Users/KRITIKA/OneDrive/HR_Analysis.html 2/20
6/16/25, 3:57 AM HR_Analysis

Out[5]: EmpID Salary PositionID Zip DOB

count 311.000000 311.000000 311.000000 311.000000 311

1979-02-06
mean 10156.000000 69020.684887 16.845659 6555.482315
09:48:02.315112544 22:50

1951-01-02
min 10001.000000 45046.000000 1.000000 1013.000000
00:00:00

1973-12-03
25% 10078.500000 55501.500000 18.000000 1901.500000
00:00:00

1980-09-30
50% 10156.000000 62810.000000 19.000000 2132.000000
00:00:00

1986-05-29
75% 10233.500000 72036.000000 20.000000 2355.000000
12:00:00

1992-08-17
max 10311.000000 250000.000000 30.000000 98052.000000
00:00:00

std 89.922189 25156.636930 6.223419 16908.396884 NaN

 
Salary ranges from ~30Kto 110K Employees have up to 20 absences, with some having DaysLateLast30 = 0,
indicating low tardiness Engagement Survey scores range between 1 and 5

In [6]: #cheacking null values


df.isnull().sum()

Out[6]: Employee_Name 0
EmpID 0
Salary 0
PositionID 0
Position 0
State 0
Zip 0
DOB 0
Sex 0
MaritalDesc 0
CitizenDesc 0
HispanicLatino 0
RaceDesc 0
DateofHire 0
DateofTermination 207
TermReason 0
EmploymentStatus 0
Department 0
ManagerName 0
ManagerID 8
RecruitmentSource 0
PerformanceScore 0
EngagementSurvey 0
EmpSatisfaction 0
SpecialProjectsCount 0
LastPerformanceReview_Date 0
DaysLateLast30 0
Absences 0
dtype: int64

file:///C:/Users/KRITIKA/OneDrive/HR_Analysis.html 3/20
6/16/25, 3:57 AM HR_Analysis

DateofTermination: Missing in 207 records → likely still employed ManagerID: Missing in 8 records → may require
exclusion
CLEANING THE DATASET

In [7]: df.columns = df.columns.str.strip().str.lower().str.replace(' ','_').str.replace


df.columns

Out[7]: Index(['employee_name', 'empid', 'salary', 'positionid', 'position', 'state',


'zip', 'dob', 'sex', 'maritaldesc', 'citizendesc', 'hispaniclatino',
'racedesc', 'dateofhire', 'dateoftermination', 'termreason',
'employmentstatus', 'department', 'managername', 'managerid',
'recruitmentsource', 'performancescore', 'engagementsurvey',
'empsatisfaction', 'specialprojectscount', 'lastperformancereview_date',
'dayslatelast30', 'absences'],
dtype='object')
All column names are now in a clean, consistent format
CREATING DERIVED FEATURES

--Creating Column Age

In [8]: from datetime import datetime


current_year = datetime.now().year
df['Age'] = current_year - df['dob'].dt.year

--Creating Column tenure

In [9]: df['Tenure'] = (datetime.now() - df['dateofhire']).dt.days // 365

--Creating column isTerminated

In [10]: df['is_terminated'] = df['dateoftermination'].notnull().astype(int)

In [11]: df[['Age','Tenure','is_terminated']].head(10)

Out[11]: Age Tenure is_terminated

0 42 13 0

1 50 10 1

2 37 13 1

3 37 17 0

4 36 13 1

5 48 13 0

6 46 10 0

7 42 11 0

8 55 15 0

9 37 10 0

EXPLORATORY DATA ANALYSIS

--TOTAL EMPLOYEES

file:///C:/Users/KRITIKA/OneDrive/HR_Analysis.html 4/20
6/16/25, 3:57 AM HR_Analysis

In [19]: employee_count = df['empid'].value_counts().sum()


employee_count

Out[19]: np.int64(311)

--Total employees 311


--TOTAL EMPLOYEES BY GENDER

In [16]: gender_counts = df['sex'].value_counts()


#ploting
plt.figure(figsize=(3,3))
plt.pie(gender_counts, labels=gender_counts.index, autopct='%1.1f%%', startangle
plt.title('Employee Distribution by Gender')
plt.axis('equal')
plt.show()

In [ ]: --Total female = 176


--Totak male = 135

-TOTAL EMPLOYEES BY MARITAL STATUS

In [25]: marital_counts = df['maritaldesc'].value_counts()


plt.figure(figsize=(6,6))
plt.pie(marital_counts, labels=marital_counts.index, autopct='%1.1f%%', startang
plt.title('Employee Distribution by Marital Status')
plt.axis('equal')
plt.show()

file:///C:/Users/KRITIKA/OneDrive/HR_Analysis.html 5/20
6/16/25, 3:57 AM HR_Analysis

-TOTAL EMPLOYEES BY CITIZENSHIP

In [29]: citizenship_counts = df['citizendesc'].value_counts()


plt.figure(figsize=(8,5))
citizenship_counts.plot(kind='bar', color='mediumseagreen')
plt.title('Total Employees by Citizenship')
plt.xlabel('Citizenship')
plt.ylabel('Number of Employees')
plt.xticks(rotation=45)
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.tight_layout()
plt.show()

file:///C:/Users/KRITIKA/OneDrive/HR_Analysis.html 6/20
6/16/25, 3:57 AM HR_Analysis

--A large number of employees are from US citizen.


-TOTAL NUMBER OF EMPLOYEES BY EMPLOYMENT STATUS

In [34]: employment_status_counts = df['employmentstatus'].value_counts()


plt.figure(figsize=(8,5))
employment_status_counts.plot(kind='bar', color='cornflowerblue')
plt.title('Total Employees by Employment Status')
plt.xlabel('Employment Status')
plt.ylabel('Number of Employees')
plt.xticks(rotation=0)
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.tight_layout()
plt.show()

--More than 200 employees are active. --Almost 75 - 90 employees are Voluntarily Terminated. --Less than 25 are
terminated for cause

file:///C:/Users/KRITIKA/OneDrive/HR_Analysis.html 7/20
6/16/25, 3:57 AM HR_Analysis

-TOTAL NUMBER OF EMPLOYESS BY MANAGER NAME

In [35]: manager_counts = df['managername'].value_counts()


plt.figure(figsize=(10,6))
manager_counts.plot(kind='bar', color='salmon')
plt.title('Total Employees by Manager')
plt.xlabel('Manager Name')
plt.ylabel('Number of Employees')
plt.xticks(rotation=45, ha='right')
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.tight_layout()
plt.show()

-SUM AND AVERAGE OF SALARY

In [36]: total_salary = df['salary'].sum()


average_salary = df['salary'].mean()

print(f"Total Salary Paid to All Employees: ₹{total_salary:,.2f}")


print(f"Average Salary of Employees: ₹{average_salary:,.2f}")

Total Salary Paid to All Employees: ₹21,465,433.00


Average Salary of Employees: ₹69,020.68

--OVERALL TERMINATION STATUS

In [12]: termination_count = df['is_terminated'].value_counts()


termination_count

Out[12]: is_terminated
0 207
1 104
Name: count, dtype: int64

In [16]: #ploting
plt.figure(figsize=(7,5))
ax = sns.barplot(x = termination_count.index, y = termination_count.values, pale

file:///C:/Users/KRITIKA/OneDrive/HR_Analysis.html 8/20
6/16/25, 3:57 AM HR_Analysis

for bar in ax.patches:


height = bar.get_height()
plt.text(
bar.get_x() + bar.get_width()/2,
height + 1,
f'{int(height)}',
ha = 'center', va ='bottom', fontsize=12, fontweight='bold'
)

plt.xticks([0,1],['Active','Terminated'])
plt.title('Employee Termination Status')
plt.xlabel('Status')
plt.ylabel('Number of Employee')
plt.show()

C:\Users\KRITIKA\AppData\Local\Temp\ipykernel_14144\3128851600.py:3: FutureWarnin
g:

Passing `palette` without assigning `hue` is deprecated and will be removed in v


0.14.0. Assign the `x` variable to `hue` and set `legend=False` for the same effe
ct.

ax = sns.barplot(x = termination_count.index, y = termination_count.values, pal


ette = 'Set2')

--Active Employees - 207 --Terminated Employees - 104


-TERMINATION BY DEPARTMENT

In [17]: terminated = df[df['is_terminated'] ==1 ]


dept_count = terminated['department'].value_counts()

#ploting

file:///C:/Users/KRITIKA/OneDrive/HR_Analysis.html 9/20
6/16/25, 3:57 AM HR_Analysis

plt.figure(figsize=(10,6))
ax = sns.barplot(x= dept_count.index, y= dept_count.values, palette = 'pastel')
for bar in ax.patches:
height = bar.get_height()
plt.text(
bar.get_x() + bar.get_width()/2,
height + 1,
f'{int(height)}',
ha='center', va='bottom', fontsize=11, fontweight='bold'
)

plt.title('Termination By Department')
plt.xlabel('Departments')
plt.ylabel('Number of Terminations')
plt.xticks(rotation=30)
plt.tight_layout()

plt.show()

C:\Users\KRITIKA\AppData\Local\Temp\ipykernel_14144\3381452627.py:6: FutureWarnin
g:

Passing `palette` without assigning `hue` is deprecated and will be removed in v


0.14.0. Assign the `x` variable to `hue` and set `legend=False` for the same effe
ct.

ax = sns.barplot(x= dept_count.index, y= dept_count.values, palette = 'pastel')

-Production department has the highest number of terminated employees.


--TERMINATION DISTRIBUTION BY GENDER

In [18]: terminated = df[df['is_terminated'] == 1]


gender_count = terminated['sex'].value_counts()
labels = gender_count.index
colors = ['#66c2a5', '#fc8d62']

#ploting
plt.figure(figsize=(3,3))
plt.pie(

file:///C:/Users/KRITIKA/OneDrive/HR_Analysis.html 10/20
6/16/25, 3:57 AM HR_Analysis

gender_count,
labels=labels,
autopct= '%1.1f%%',
startangle = 90,
colors = colors,
textprops={'fontsize' : 12})

plt.title('Gender Distribution Among Terminated Employees')


plt.axis('equal')

plt.show()

- Total Terminated Employees: 104 - Males: 44 (42.3%) - Females: 60 (57.7%)


--AGE DISTRIBUTION OF TERMINATED EMPLOYEE

In [19]: terminated = df[df['is_terminated'] == 1]

#plot
plt.figure(figsize=(6,4))
sns.boxplot(y= terminated['Age'], color='#8da0cb')

plt.title('Age Distribution Of Terminated Employees')


plt.ylabel('Age')
plt.grid(axis='y', linestyle='--', alpha= 0.5)
plt.show

Out[19]: <function matplotlib.pyplot.show(close=None, block=None)>

file:///C:/Users/KRITIKA/OneDrive/HR_Analysis.html 11/20
6/16/25, 3:57 AM HR_Analysis

-Median age of terminated employees is around **45-47 years** - Most terminations occur between **45 to 55
years** - A few older employees also got terminated (visible as outliers)
--TENURE DISTRIBUTION OF TERMINATED EMPLOYEES

In [20]: terminated = df[df['is_terminated'] == 1]

#plot
plt.figure(figsize=(6,4))
sns.boxplot(y= terminated['Tenure'], color='#fc8d62')

plt.title('Tenure Distribution Of Terminated Employees')


plt.ylabel('Tenure in years')
plt.grid(axis = 'y', linestyle= '--', alpha = 0.5)
plt.show()

-Median tenure of terminated employees is approximately **13 - 13.5 years** - Most terminations occur between
**12 and 15 years** of service - Some employees were terminated after even **16+ years**, indicating long-term

file:///C:/Users/KRITIKA/OneDrive/HR_Analysis.html 12/20
6/16/25, 3:57 AM HR_Analysis

separations and some terminated within 10 years indicating short-term separation


--EMPLOYEE ENGAGEMENT SCORE VS TERMINATION STATUS

In [66]: sns.boxplot(x= 'is_terminated' , y= 'empsatisfaction', data=df, palette=['#8da0c


plt.title('Engagement Score Vs Termination Status')
plt.xlabel('Termination Status[ 0=Active, 1=Terminated ]')
plt.ylabel('Engagement Score')
plt.grid(axis='y', linestyle='--', alpha=0.5)
plt.show()

C:\Users\KRITIKA\AppData\Local\Temp\ipykernel_14144\4052678806.py:1: FutureWarnin
g:

Passing `palette` without assigning `hue` is deprecated and will be removed in v


0.14.0. Assign the `x` variable to `hue` and set `legend=False` for the same effe
ct.

sns.boxplot(x= 'is_terminated' , y= 'empsatisfaction', data=df, palette=['#8da0


cb', '#fc8d62'])

-Active employees shows a higher median engagement score and a wider range of score compared to Terminated
employees.
-CORELATION HEATMAP FOR KEY NUMERIC VARIABLES

In [28]: corr_features = df[['Age', 'Tenure', 'engagementsurvey', 'empsatisfaction']]


corr_matrix = corr_features.corr()

plt.figure(figsize=(8,6))
sns.heatmap(corr_matrix, annot=True, fmt= '.2f', cmap='YlGnBu', linewidths=0.5)

plt.title('Corelation Between Key HR Matrix', fontsize=14)


plt.xticks(rotation=40)

file:///C:/Users/KRITIKA/OneDrive/HR_Analysis.html 13/20
6/16/25, 3:57 AM HR_Analysis

plt.tight_layout()
plt.show()

--There is strong corelation of 0.19 between employee engagement and employee satisfaction. --There is a weak
positive correlation of 0.09 between age and tenure. --Negavtive correlation between age and tenure shows
minimal impact on employee satisfaction.
-EMPLOYEE SATISFACTION BY DEPARTMENT

In [33]: dept_satisfaction = df.groupby('department')['empsatisfaction'].mean().sort_valu

plt.figure(figsize=(8,6))
sns.barplot(y= dept_satisfaction.index, x= dept_satisfaction.values, palette='Bl

plt.title('Average Employee Satisfaction by Department')


plt.xlabel('Average Satisfaction Score')
plt.ylabel('Department')
plt.grid(axis='x', linestyle='-', alpha=0.5)
plt.tight_layout()
plt.show()

C:\Users\KRITIKA\AppData\Local\Temp\ipykernel_14144\4113021662.py:4: FutureWarnin
g:

Passing `palette` without assigning `hue` is deprecated and will be removed in v


0.14.0. Assign the `y` variable to `hue` and set `legend=False` for the same effe
ct.

sns.barplot(y= dept_satisfaction.index, x= dept_satisfaction.values, palette='B


lues_d')

file:///C:/Users/KRITIKA/OneDrive/HR_Analysis.html 14/20
6/16/25, 3:57 AM HR_Analysis

--Executive Office department have the lowest average satisfaction score while the other department have higher
scores ranging from 3.5 to more than 4.0.
-ENGAGEMENT SCORE BY DEPARTMENT

In [37]: dept_engagement = df.groupby('department')['engagementsurvey'].mean().sort_value

plt.figure(figsize=(8,6))
sns.barplot(y= dept_engagement.index, x= dept_engagement.values, palette='Reds_d

plt.title('Average Engagement Score by Department')


plt.xlabel('Average Engagement Score')
plt.ylabel('Department')
plt.grid(axis='x', linestyle='-', alpha=0.5)
plt.tight_layout()
plt.show()

C:\Users\KRITIKA\AppData\Local\Temp\ipykernel_14144\3055311766.py:4: FutureWarnin
g:

Passing `palette` without assigning `hue` is deprecated and will be removed in v


0.14.0. Assign the `y` variable to `hue` and set `legend=False` for the same effe
ct.

sns.barplot(y= dept_engagement.index, x= dept_engagement.values, palette='Reds_


d')

file:///C:/Users/KRITIKA/OneDrive/HR_Analysis.html 15/20
6/16/25, 3:57 AM HR_Analysis

- Departments like **Executive and Admin offices** have the **highest engagement** - Department such as
**Sales** show lower engagement scores
-TERMINATION BY PERFORMANCE SCORE

In [63]: terminated_df = df[df['dateoftermination'].notna()]

perf_termination = terminated_df['performancescore'].value_counts().reindex(df['

plt.figure(figsize=(8,6))
sns.barplot(x=perf_termination.index , y= perf_termination.values, palette= 'coo
plt.title('Termination By Performance Score')
plt.xlabel('Performance Score')
plt.ylabel('Number of Terminated Employee')
plt.grid(axis='y', linestyle='--', alpha=0.5)
plt.tight_layout()
plt.show()

C:\Users\KRITIKA\AppData\Local\Temp\ipykernel_14144\3651234695.py:6: FutureWarnin
g:

Passing `palette` without assigning `hue` is deprecated and will be removed in v


0.14.0. Assign the `x` variable to `hue` and set `legend=False` for the same effe
ct.

sns.barplot(x=perf_termination.index , y= perf_termination.values, palette= 'co


olwarm', legend= False)

file:///C:/Users/KRITIKA/OneDrive/HR_Analysis.html 16/20
6/16/25, 3:57 AM HR_Analysis

- Most terminations occurred among employees rated as “Fully Meets” follwed by “Needs Improvement” - Very few
terminations from “Exceeds Expectations” or “PIP” categories
-ABSENCES BY TERMINATION STATUS

In [58]: df['is_terminated'] = df['dateoftermination'].notna()

plt.figure(figsize=(8,6))
sns.boxplot(x= 'is_terminated' , y='absences' ,data=df, palette =['#8da0cb', '#f

plt.xticks([0,1],['Active','Terminated'])
plt.title('Absences By Employment Status')
plt.xlabel('Employment Status')
plt.ylabel('Number Of Absences')
plt.grid(axis='y', linestyle='--', alpha=0.5)
plt.tight_layout()
plt.show()

file:///C:/Users/KRITIKA/OneDrive/HR_Analysis.html 17/20
6/16/25, 3:57 AM HR_Analysis

--There is a slight difference between the median of the active and terminated number of absences.
-TENURE VS TERMINATION STATUS

In [57]: plt.figure(figsize=(8,6))
sns.violinplot(x= 'is_terminated', y= 'Tenure', data=df, palette=['#8da0cb', '#f
plt.xticks([0,1],['Active', 'Terminated'])
plt.title('Tenure Distribution By Employment Status')
plt.xlabel('Employment Status')
plt.ylabel('Tenure in Years')
plt.grid(axis='y', linestyle='--', alpha=0.5)
plt.tight_layout()
plt.show()

file:///C:/Users/KRITIKA/OneDrive/HR_Analysis.html 18/20
6/16/25, 3:57 AM HR_Analysis

--Large number of termination occurs after **12-14 years** --Active employees have a slightly wider distribution
extended upto 20 years.
This project focuses on analyzing employee data to uncover insights related to:

Termination trends
Employee engagement and satisfaction
Absenteeism patterns
Tenure and performance correlations

Key Insights
1. Total Employees -Total female = 176 -Totak male = 135 -Most of them are Single -
A large number of employees are from US citizen.

2. Employement Status -More than 200 employees are active. -Almost 75 - 90


employees are Voluntarily Terminated. -Less than 25 are terminated for cause

3. Termination Trends

Highest termination rate observed in the Production department.


More female employees were terminated compared to male employees.
Most terminations occur between 45 to 55 years
4. Salary details

Total Salary Paid to All Employees: ₹21,465,433.00 -Average Salary of


Employees: ₹69,020.68
5. Performance & Satisfaction

file:///C:/Users/KRITIKA/OneDrive/HR_Analysis.html 19/20
6/16/25, 3:57 AM HR_Analysis

Employees with Low performance scores had significantly higher termination


rates.
Terminated employees showed lower satisfaction and engagement scores on
average.
strong corelation of 0.19 between employee engagement and employee
satisfaction
6. Employee Satisfaction & Department -Executive Office department have the
lowest average satisfaction score while the other department have higher scores
ranging from 3.5 to more than 4.0.

Departments like Executive and Admin offices have the highest engagement
Department such as Sales show lower engagement scores
7. Absenteeism

Terminated employees had a slightly higher range of absences.


High absenteeism can be a potential early indicator of disengagement.
8. Tenure Analysis -Most terminations occur between 12 and 15 years of service

Some employees were terminated after even 16+ years


Active employees generally had longer tenures and more stable performance
scores.
There is a weak positive correlation of 0.09 between age and tenure shows
minimal impact on employee satisfaction..

Tools Used
Python Libraries: Pandas, Matplotlib, Seaborn
Jupyter Notebook: For data exploration and visualization
Next Step: This analysis will be replicated in Power BI for interactive dashboarding.

By: Kritika Naidu


In [ ]:

file:///C:/Users/KRITIKA/OneDrive/HR_Analysis.html 20/20

You might also like