Завдання з очищення даних від GreenData Solution

HealthCare Dataset: Очищення даних за допомогою MySQL та PowerBI

pic

1.0 Вступ

У сучасному світі, орієнтованому на дані, індустрія охорони здоров'я знаходиться на передовій лінії використання інсайтів для покращення догляду за пацієнтами та підвищення ефективності роботи. Однак реальні дані часто мають багато невідповідностей, відсутніх значень і помилок форматування — проблем, які можуть затруднити повне використання потенціалу прийняття рішень на основі даних.

Як консультант з аналітики даних, я розпочав трансформаційний процес для розв’язання складнощів з навмисно "забрудненим" набором даних охорони здоров'я. Цей проєкт — це не лише технічна вправа, а й місія для розвитку критичного мислення, уваги до деталей та навичок вирішення проблем при роботі з реальними медичними даними.

Завдання полягає в систематичному підході до дослідження, очищення та підготовки медичних записів пацієнтів для значущого аналізу. Під час усунення аномалій, стандартизації форматів і документування кожного кроку, мета — перетворити цей набір даних на надійну основу для майбутніх інсайтів.

Цей пост на Medium проведе вас через процес від виявлення прихованих історій у даних до створення більш чистого та зручного набору даних, готового до важливого аналізу.

Деталі завдання

Цей набір даних спеціально створений з помилками і містить різні невідповідності.

Ваше завдання:
1. Завантажити набір даних, що додається до цього листа.
2. Виконати дослідницький аналіз даних (EDA), щоб зрозуміти структуру набору даних, виявити аномалії та отримати попередні висновки.
3. Очисити та підготувати дані для подальшого аналізу, забезпечивши їхню узгодженість, точність та готовність до використання.
4. Документувати процес очищення, детально описавши:
• Кроки, які були здійснені.
• Логіку кожного рішення.
• Будь-які припущення, зроблені під час процесу очищення.

Результати:
1. Очищений набір даних: Подати очищену версію набору даних, готову до аналізу.
2. Звіт про процес очищення: Надати детальний звіт, що включає:
• Опис кроків процесу очищення.
• Прийняті рішення та логіка їх обґрунтування.
• Будь-які обмеження очищених даних.
2a. Визначити міста чи демографічні групи з більшими потребами в охороні здоров'я на основі стану здоров'я та дат госпіталізації.

Підхід до проєкту

Я отримав набір даних по електронній пошті від GreenData Solutions. Ви можете отримати доступ до нього за цим посиланням HealthCare Data. Набір даних стосується охорони здоров'я і складається з 12 стовпців: ID, Name, Age, Gender, City, Blood Type, Education, Employment Status, Salary, Health Condition, Credit Score, і Date of Admission.
Він містить 1599 записів. Для очищення даних використовувались MySQL та Power Query, для видалення невідповідностей і непотрібних даних. Після цього було використано PowerBI для візуалізації.

pic

Брудна таблиця охорони здоров'я

2.0 Очищення даних
Очищення даних — це критичний етап у процесі управління даними, що гарантує точність, узгодженість і надійність даних.
Очищення даних медичного набору за допомогою MySQL та PowerBI

pic

1.0 Вступ

У сьогоднішньому світі, орієнтованому на дані, індустрія охорони здоров'я знаходиться на передовій лінії використання інсайтів для покращення догляду за пацієнтами та підвищення ефективності роботи. Однак реальні дані часто містять невідповідності, відсутні значення та помилки форматування — проблеми, які можуть ускладнити повне використання потенціалу прийняття рішень на основі даних.

Як консультант з аналітики даних, я розпочав трансформаційний процес для розв’язання складнощів з навмисно "забрудненим" набором даних охорони здоров'я. Цей проєкт — це не лише технічна вправа, а й місія для розвитку критичного мислення, уваги до деталей та навичок вирішення проблем при роботі з реальними медичними даними.

Завдання полягає в систематичному підході до дослідження, очищення та підготовки медичних записів пацієнтів для значущого аналізу. Під час усунення аномалій, стандартизації форматів і документування кожного кроку, мета — перетворити цей набір даних на надійну основу для майбутніх інсайтів.

Цей пост на Medium проведе вас через процес від виявлення прихованих історій у даних до створення більш чистого та зручного набору даних, готового до важливого аналізу.

Деталі завдання

Цей набір даних спеціально створений з помилками і містить різні невідповідності.

Ваше завдання:
1. Завантажити набір даних, що додається до цього листа.
2. Виконати дослідницький аналіз даних (EDA), щоб зрозуміти структуру набору даних, виявити аномалії та отримати попередні висновки.
3. Очисити та підготувати дані для подальшого аналізу, забезпечивши їхню узгодженість, точність та готовність до використання.
4. Документувати процес очищення, детально описавши:
• Кроки, які були здійснені.
• Логіку кожного рішення.
• Будь-які припущення, зроблені під час процесу очищення.

Результати:
1. Очищений набір даних: Подати очищену версію набору даних, готову до аналізу.
2. Звіт про процес очищення: Надати детальний звіт, що включає:
• Опис кроків процесу очищення.
• Прийняті рішення та логіка їх обґрунтування.
• Будь-які обмеження очищених даних.
2a. Визначити міста чи демографічні групи з більшими потребами в охороні здоров'я на основі стану здоров'я та дат госпіталізації.

Підхід до проєкту

Я отримав набір даних по електронній пошті від GreenData Solutions. Ви можете отримати доступ до нього за цим посиланням HealthCare Data. Набір даних стосується охорони здоров'я і складається з 12 стовпців: ID, Name, Age, Gender, City, Blood Type, Education, Employment Status, Salary, Health Condition, Credit Score, і Date of Admission.
Він містить 1599 записів. Для очищення даних використовувались MySQL та Power Query, для видалення невідповідностей і непотрібних даних. Після цього було використано PowerBI для візуалізації.

pic

Брудна таблиця охорони здоров'я

2.0 Очищення даних
Очищення даних — це критичний етап у процесі управління даними, що гарантує точність, узгодженість і надійність даних.

Завантаження даних у базу даних MySQL
Я створив базу даних Datacleaning

Create Database DataCleaning;

Використання MySQL Workbench

Нижче наведено метод, який був використаний для завантаження даних у мою базу даних DataCleaning.

Якщо у вас є файл CSV або Excel, ви можете використовувати MySQL Workbench для імпорту даних:

  • Відкрийте MySQL Workbench і підключіться до вашої бази даних.
  • Виберіть базу даних: Виберіть базу даних, в яку ви хочете завантажити дані.
  • Імпортуйте дані:
  • Перейдіть до Server > Data Import.
  • Виберіть Import from Self-Contained File, якщо у вас є дамп SQL, або Import from Dump Project Folder.
  • Для файлів CSV ви можете використовувати Table Data Import Wizard, клацнувши правою кнопкою миші на цільовій таблиці та вибравши Table Data Import Wizard.
  • Слідуйте інструкціям: Виберіть ваш файл, відобразіть стовпці та заверште процес імпорту.

2.1.0 Перейменування таблиці
Я перейменував таблицю dirtyhealthcare-data на HealthCare_Data для покращення зрозумілості та зручності читання, щоб назва таблиці відповідала послідовному стилю і точно відображала чистоту та структурованість даних, які вона містить.

rename table `dirty_healthcare-data` to Health_Care_Data;

2.2.0 Перейменування стовпців
У цьому проєкті я перейменував назви стовпців Blood Type, Credit Score, Date of Admission, Health Condition і Employment Status на BloodType, CreditScore, AdmissionDate, HealthCondition і EmploymentStatus відповідно. Це було зроблено для того, щоб усунути пробіли для зручності запитів у MySQL та впровадити послідовну систему імен, покращуючи читабельність.
Ці зміни гарантують, що набір даних відповідає найкращим практикам баз даних, роблячи його більш професійним, зручним для інтеграції та готовим до ефективного аналізу.

alter table health_care_data  
rename column `Blood Type` to BloodType;  

alter table health_care_data  
rename column `Credit Score` to CreditScore;  

alter table health_care_data  
rename column `Date of Admission` to AdmissionDate;  

alter table health_care_data  
rename column `Health Condition` to HealthCondition;  

alter table health_care_data  
rename column `Employment Status` to EmploymentStatus;

2.3.0 Перевірка на дублікати
Перевірка на дублікати — це важливий крок для забезпечення точності та цілісності даних, оскільки дублікати можуть спотворювати аналіз і призводити до неправильних висновків.
Набір даних спочатку складався з 1599 записів, але після перевірки на дублікати було виявлено 3 дублікати з ID 8937, 4870 та 6223. Ці дублікати були видалені, що зменшило загальну кількість записів до 1596, забезпечивши чистоту та надійність даних для аналізу.

select ID, Name, Age, Gender, City, BloodType, Education,  
EmploymentStatus, Salary, count(*) as Count from health_care_data  
group by ID, Name, Age, Gender, City, BloodType,   
Education,EmploymentStatus, Salary  
having count(*) >1;  

--Щоб видалити дублікати  
CREATE TABLE temp_health_care_data AS  
SELECT DISTINCT * FROM health_care_data;  


DELETE FROM health_care_data;  

INSERT INTO health_care_data SELECT * FROM temp_health_care_data;  

DROP TABLE temp_health_care_data;

2.4.0 Стандартизація стовпців:

  1. Name
    Для забезпечення узгодженості та професіоналізму в наборі даних я стандартизував стовпець Name, форматуючи його таким чином, щоб кожна літера в іменах пацієнтів була написана з великої літери. Наприклад, ім’я "Bobby jacksOn" було перетворене на "Bobby Jackson" для єдності.
    Це було досягнуто за допомогою M-Mови в Power Query
To change to lower = Table.TransformColumns(#"Changed Type",{{"Name", Text.Lower, type text}})  
To capitalize eaxh firstword = Table.TransformColumns(#"Lowercased Text",{{"Name", Text.Proper, type text}})

2.
**Стандартизація стовпців

1. Стандартизація стовпця: Стать
У стовпці Gender було п'ять різних записів: F, Female, M, Male і порожні місця. Для забезпечення узгодженості та підготовки даних до аналізу я стандартизував записи таким чином:

  • F було перейменовано в Female.
  • M було перейменовано в Male.
  • Порожні місця було замінено на Unknown, щоб врахувати відсутні значення.

Ця стандартизація забезпечує чистоту, узгодженість та готовність набору даних до значущого аналізу.

UPDATE health_care_data  
SET EmploymentStatus = CASE  
 WHEN EmploymentStatus IN ('Freelance', 'Gig Worker') THEN 'Freelance/Gig Worker'  
 WHEN EmploymentStatus IN ('Employed', 'Employed (Part-time)', 'Employed (Gig Work)', 'Employed (Contract)') THEN 'Employed'  
 WHEN EmploymentStatus IN ('Self-employed', 'Self-employed (Business Closed)') THEN 'Self-employed'  
 WHEN EmploymentStatus IN ('Student', 'Student (Part-time)', 'Student (Full-time)', 'Student (Internship)') THEN 'Student'  
 WHEN EmploymentStatus = 'Unemployed' THEN 'Unemployed'  
 WHEN EmploymentStatus IN ('Retired', 'Retired (Early)') THEN 'Retired'  
 ELSE EmploymentStatus -- Залишити інші статуси без змін  
END;

2. Місто

Стандартизація стовпця: Місто
У стовпці City було сім різних записів: Albuque, Albuquerque, Atl, Atlanta, Balti і Baltimore. Для забезпечення узгодженості та підготовки даних до аналізу я стандартизував записи таким чином:

  • Albuque було перейменовано в Albuquerque.
  • Atl було перейменовано в Atlanta.
  • Balti було перейменовано в Baltimore.

Ця стандартизація забезпечує чистоту, узгодженість та готовність набору даних до значущого аналізу.

UPDATE health_care_data  
SET city = CASE  
 WHEN city IN ('Albuquerque', 'Albuque') THEN 'Albuquerque'  
 WHEN city IN ('Atlanta', 'Atl') THEN 'Atlanta'  
 WHEN city IN ('Baltimore', 'Balti') THEN 'Baltimore'  
 ELSE city -- Залишити інші значення без змін  
END;

3. Тип крові

Стандартизація стовпця: BloodType
Я маю 8 порожніх записів.
Використання “Unknown” як замінника для порожніх записів про тип крові є розумним підходом, особливо коли потрібно зберегти цілісність даних і уникнути припущень щодо ідентичності пацієнтів.
Таким чином, я чітко вказую, що тип крові невідомий, не змінюючи наявної інформації.

UPDATE health_care_data  
SET BloodType = 'Unknown'  
WHERE BloodType = '';

4. Освіта

Стандартизація стовпця: Education
У стовпці Education було сім різних записів: Associate, Bachelor, Bachelor’s, High School, High School (GED), Master’s, PhD. Для забезпечення узгодженості та підготовки даних до аналізу я стандартизував записи таким чином:

  • Bachelor було перейменовано в Bachelor’s.
  • High School (GED) було перейменовано в High School.
  • Blank було перейменовано в Unknown.

Ця стандартизація забезпечує чистоту, узгодженість та готовність набору даних до значущого аналізу.

-- Education  

SET Education = CASE  
 WHEN Education IN ('Bachelor', "Bachelor's") THEN "Bachelor's"  
 WHEN Education = 'Associate' THEN 'Associate'  
 WHEN Education = 'PhD' THEN 'PhD'  
 WHEN Education IN ('High School', 'High School (GED)') THEN 'High School'  
 WHEN Education = 'Master\'s' THEN "Master's"  
 ELSE 'Unknown' -- Для будь-яких інших порожніх значень  
END;

5. Статус зайнятості

Стандартизація стовпця: EmploymentStatus
У стовпці EmploymentStatus було п'ятнадцять різних записів: Self-employed, Retired, Student, Freelance Student (Part-time), Retired (Early) Employed (Gig Work), Student (Full-time), Employed (Part-time), Gig Worker, Employed (Contract), Self-employed (Business Closed), Student (Internship).
Стандартизація стовпця: Статус зайнятості
У стовпці EmploymentStatus було п’ятнадцять різних записів: Self-employed, Retired, Student, Freelance Student (Part-time), Retired (Early) Employed (Gig Work), Student (Full-time), Employed (Part-time), Gig Worker, Employed (Contract), Self-employed (Business Closed), Student (Internship).

Для забезпечення узгодженості та підготовки даних до аналізу я стандартизував записи таким чином:

  • Freelance, Gig Worker було перейменовано в Freelance/Gig Worker.
  • Employed, Employed (Part-time), Employed (Gig Work), Employed (Contract) було перейменовано в Employed.
  • Self-employed, Self-employed (Business Closed) було перейменовано в Self-employed.
  • Student, Student (Part-time), Student (Full-time), Student (Internship) було перейменовано в Student
  • Unemployed було перейменовано в Unemployed.
  • Retired, Retired (Early) було перейменовано в Retired.

Ця стандартизація забезпечує чистоту, узгодженість та готовність набору даних до значущого аналізу.

UPDATE health_care_data  
SET EmploymentStatus = CASE  
 WHEN EmploymentStatus IN ('Freelance', 'Gig Worker') THEN 'Freelance/Gig Worker'  
 WHEN EmploymentStatus IN ('Employed', 'Employed (Part-time)', 'Employed (Gig Work)', 'Employed (Contract)') THEN 'Employed'  
 WHEN EmploymentStatus IN ('Self-employed', 'Self-employed (Business Closed)') THEN 'Self-employed'  
 WHEN EmploymentStatus IN ('Student', 'Student (Part-time)', 'Student (Full-time)', 'Student (Internship)') THEN 'Student'  
 WHEN EmploymentStatus = 'Unemployed' THEN 'Unemployed'  
 WHEN EmploymentStatus IN ('Retired', 'Retired (Early)') THEN 'Retired'  
 ELSE EmploymentStatus -- Залишити інші статуси без змін  
END;

6. Зарплата
Стандартизація стовпця: Salary
Крок 1: Замінити “Missing” на NULL.
Значення “Missing” не є дійсним числовим представленням і означає, що зарплата невідома. Використання NULL замість нього є найкращою практикою баз даних, оскільки NULL чітко позначає відсутні або недоступні дані, що полегшує роботу з ними під час запитів і обчислень.

UPDATE health_care_data SET salary = NULL WHERE salary = 'Missing';

Крок 2: Видалити знак долара ($)
Наявність знака долара робить стовпець нечисловим, ускладнюючи математичні операції, такі як суми або середні значення. Видалення цього символу дозволяє трактувати значення зарплати як числові типи даних, такі як FLOAT або DECIMAL.

UPDATE health_care_data SET salary = REPLACE(salary, '$', '')   
WHERE salary LIKE '$%';

Крок 3: Видалити кому (,) і обробити від'ємні значення
Коми також роблять стовпець нечисловим, тому їх видалення гарантує, що значення можна інтерпретувати як числа. Правильна обробка від'ємних значень (наприклад, ($123,456)) гарантує, що вони будуть правильно оброблені в математичних операціях.

UPDATE health_care_data   
SET salary =   
 CASE  
 WHEN salary LIKE '($%' THEN -1 * CAST(REPLACE(REPLACE(SUBSTRING(salary, 3, LENGTH(salary) - 3), ',', ''), '$', '') AS DECIMAL)  
 WHEN salary LIKE '(%' THEN -1 * CAST(REPLACE(REPLACE(SUBSTRING(salary, 1, LENGTH(salary) - LENGTH(SUBSTRING_INDEX(salary, '(', -1)) - 1), ',', ''), '$', '') AS DECIMAL)  
 ELSE CAST(REPLACE(REPLACE(SUBSTRING_INDEX(salary, ' ', 1), ',', ''), '$', '') AS DECIMAL)  
 END;

Крок 4: Встановити зарплату 0 для безробітних
Логічно припустити, що люди, позначені як “Unemployed”, не мають зарплати. Встановлення їх зарплати на 0, замість залишання NULL, забезпечує чіткість і уникає плутанини в подальших аналізах, особливо в агрегаціях або обчисленнях.

UPDATE health_care_data SET salary = 0 WHERE EmploymentStatus = 'Unemployed';

7. Стан здоров’я
Стандартизація стовпця: HealthCondition
Крок 1: Визначення унікальних значень.
Цей крок важливий для розуміння різноманіття записів, виявлення несумісностей (наприклад, “Excellent (?! )”) і визначення заходів по очищенню для стандартизації стовпця.

SELECT DISTINCT(HealthCondition) FROM health_care_data;

Крок 2: Стандартизація записів за допомогою оператора CASE
Зайві символи, такі як “(?! )”, не додають жодної цінності і можуть викликати несумісності під час аналізу або звітності. Стандартизація їх забезпечує чистоту та однорідність усіх записів.
Значення, такі як “Good”, “Average” і “Poor”, були залишені без змін.
Ці записи є дійсними, і очистка не була необхідною, тому вони залишилися такими, як є.
Будь-які значення, які не відповідають "Excellent," "Good," "Average" або "Poor", були замінені на "Unknown", щоб гарантувати, що недійсні або не визначені значення замінюються чітким заповнювачем, уникаючи неоднозначності та роблячи дані більш інтерпретованими.

UPDATE health_care_data  
SET HealthCondition = CASE  
 WHEN HealthCondition LIKE 'Excellent%' THEN 'Excellent' -- Стандартизувати 'Excellent' з будь-якими додатковими символами  
 WHEN HealthCondition = 'Good' THEN 'Good'  
 WHEN HealthCondition = 'Average' THEN 'Average'  
 WHEN HealthCondition = 'Poor' THEN 'Poor'  
 ELSE 'Unknown' -- Для будь-яких інших значень  
END;

8. Кредитний бал
Стандартизація стовпця: CreditScore
Крок 1: Видалити “(Typo)” з значень CreditScore
Фраза “(Typo)” вказує на помилку або зауваження, яке не має місця в очищеному наборі даних. Видалення цієї частини гарантує, що значення у стовпці CreditScore є узгодженими та зосередженими тільки на фактичних кредитних балах, усуваючи зайвий текст, що може заважати числовому аналізу.

UPDATE health_care_data  
SET CreditScore = REPLACE(CreditScore, ' (Typo)', '')   
WHERE CreditScore LIKE '%(Typo)%';

Крок 2: Замінити ‘N/A’ і ‘None’ на NULL
Записи, як “N/A” і “None”, позначають відсутні або недоступні дані. Заміна їх на NULL є стандартом бази даних для невідомих значень, що полегшує розрізнення між дійсними записами та відсутніми даними під час аналізу. Переконання, що інші записи перетворюються на DECIMAL, гарантує, що стовпець готовий для числових операцій.

UPDATE health_care_data  
SET CreditScore = CASE  
 WHEN CreditScore IN ('N/A', 'None') THEN NULL  
 ELSE CAST(CreditScore AS DECIMAL)  
END;

Крок 3: Імпутація відсутніх значень середнім кредитним балом
Імпутація відсутніх значень за допомогою середнього значення є широко використовуваною технікою для обробки відсутніх числових даних. Цей підхід допомагає підтримати узгодженість набору даних, заповнюючи прогалини без введення упереджень. Використання середнього значення гарантує, що імпутовані значення не спотворюють значно розподіл і зберігають цілісність даних.

WITH AvgCreditScore AS (  
 SELECT AVG(CAST(CreditScore AS DECIMAL)) AS average_score  
 FROM health_care_data  
 WHERE CreditScore IS NOT NULL  
)  
UPDATE health_care_data  
SET CreditScore = (SELECT average_score FROM AvgCreditScore)  
WHERE CreditScore IS NULL;

9. Дата госпіталізації
Стандартизація стовпця: AdmissionDate
Стовпець AdmissionDate був очищений у Power Query для усунення будь-яких несумісностей, таких як неправильні формати або некоректні дати. У SQL метою було стандартизувати формат дати, щоб він відповідав очікуваному формату бази даних (YYYY-MM-DD), що сумісний з операціями SQL і гарантує узгодженість у базі даних.

UPDATE health_care_data  
SET AdmissionDate = STR_TO_DATE(AdmissionDate, "%m/%d/%Y");
-- Зміна типу даних на Date  
Alter table health_care_data  
modify AdmissionDate Date;

2.4.0 Перевірка типів даних після стандартизації
Після стандартизації та очищення даних важливо перевірити типи даних кожного стовпця для забезпечення цілісності та узгодженості даних. Цей крок допомагає підтвердити, що:

DESCRIBE health_care_data;
  1. Стовпці правильно відформатовані для їх призначеного типу даних (наприклад, числові стовпці зберігаються як INT, FLOAT, або DECIMAL, дати у форматі DATE, а текстові стовпці — як VARCHAR або TEXT).
  2. Операції з аналізу даних можуть виконуватися без помилок через несумісні типи даних.
    3.
    Ефективність бази даних оптимізується за допомогою відповідних типів даних для зберігання та запитів.

Результати команди DESCRIBE дозволяють перевірити і підтвердити, що всі стовпці мають правильний формат, як показано на зображенні нижче.

pic

Типи даних стовпців

2.5.0 Детальний звіт по очищенню стовпця Age
1. Мінімальний вік для виходу на пенсію

Мінімальний вік для виходу на пенсію зазвичай становить 60 років в більшості країн. Будь-який запис, де вік пенсіонера менший за 60, був замінений на середній вік пенсіонерів віком 60 років і старше. Це гарантує:

  • Данні відповідають суспільним нормам.
  • У набір даних не потрапляють аномалії, як пенсіонери молодші за 60 років.
WITH AvgAge AS (  
 SELECT AVG(Age) AS average_age  
 FROM health_care_data  
 WHERE EmploymentStatus = 'Retired' AND Age >= 60  
)  
UPDATE health_care_data  
SET Age = (SELECT average_age FROM AvgAge)  
WHERE Age < 60 AND EmploymentStatus = 'Retired';

2. Мінімальний вік для працевлаштування
Згідно з законом у США, мінімальний вік для роботи становить 14 років. Будь-який запис, де вік працевлаштованої особи менший за 14, був замінений на середній вік працевлаштованих осіб віком 14 років і старше. Це гарантує:

  • Законність.
  • Уникнення нереалістичних ситуацій працевлаштування неповнолітніх молодше 14 років.
WITH AvgAge AS (  
 SELECT AVG(Age) AS average_age  
 FROM health_care_data  
 WHERE EmploymentStatus = 'Employed' AND Age >= 14  
)  
UPDATE health_care_data  
SET Age = (SELECT average_age FROM AvgAge)  
WHERE Age < 14 AND EmploymentStatus = 'Employed';

3. Мінімальний вік для студентів PhD
Зазвичай мінімальний вік для студентів PhD становить 26 років, враховуючи перехід від бакалаврату та магістратури. Будь-який запис, де студент PhD молодший за 26, був замінений на середній вік студентів PhD віком 26 років і старше. Це гарантує:

  • Реалістичні вікові дані для вищої освіти.
  • Покращення точності набору даних.
WITH AvgAge AS (  
 SELECT AVG(Age) AS average_age  
 FROM health_care_data  
 WHERE Education = 'PhD' AND Age >= 26  
)  
UPDATE health_care_data  
SET Age = (SELECT average_age FROM AvgAge)  
WHERE Age < 26 AND Education = 'PhD';

4. Мінімальний вік для студентів зі ступенем Associate
Мінімальний вік для отримання ступеня Associate зазвичай становить 18 років. Будь-який запис, де студент ступеня Associate молодший за 18, був замінений на середній вік студентів ступеня Associate віком 18 років і старше.

WITH AvgAge AS (  
 SELECT AVG(Age) AS average_age  
 FROM health_care_data  
 WHERE Education = 'Associate' AND Age >= 18  
)  
UPDATE health_care_data  
SET Age = (SELECT average_age FROM AvgAge)  
WHERE Age < 18 AND Education = 'Associate';

5. Мінімальний вік для студентів середньої школи
Типовий вік для студентів середньої школи становить 14-18 років. Будь-який запис, де вік студента середньої школи менший за 14, був замінений на середній вік студентів середньої школи віком 14 років і старше. Це гарантує:

  • Узгодженість з рівнями освіти.
  • Запобігання нереалістичним ситуаціям, коли студенти молодші 14 років знаходяться в середній школі.
WITH AvgAge AS (  
 SELECT AVG(Age) AS average_age  
 FROM health_care_data  
 WHERE Education = 'High School' AND Age >= 14  
)  
UPDATE health_care_data  
SET Age = (SELECT average_age FROM AvgAge)  
WHERE Age < 14 AND Education = 'High School';

6. Мінімальний вік для вступу на бакалаврат
Мінімальний вік для вступу на бакалаврат зазвичай становить 16 років, особливо в прискорених програмах.
Будь-який запис, де вік студента бакалаврату був менший за 16, був замінений на середній вік студентів бакалаврату віком 16 років і старше.

WITH AvgAge AS (  
 SELECT AVG(Age) AS average_age  
 FROM health_care_data  
 WHERE Education = "Bachelor's" AND Age >= 16  
)  
UPDATE health_care_data  
SET Age = (SELECT average_age FROM AvgAge)  
WHERE Age < 16 AND Education = "Bachelor's";
  1. Мінімальний вік для студентів магістратури
    Середній вік студента магістратури зазвичай становить 20 років або більше. Будь-який запис, де студент магістратури молодший за 20 років, був замінений на середній вік студентів магістратури віком 20 років і старше. Це гарантує:
  • Реалістичний віковий розподіл для вищої освіти.
  • Покращення точності даних
WITH AvgAge AS (  
 SELECT AVG(Age) AS average_age  
 FROM health_care_data  
 WHERE Education = "Master's" AND Age >= 20  
)  
UPDATE health_care_data  
SET Age = (SELECT average_age FROM AvgAge)  
WHERE Age < 20 AND Education = "Master's";

2.6.0 Додавання нових стовпців та оновлення значень
1. Додавання стовпця AgeGroup:
Стовпець AgeGroup категоризує осіб за їх віком для полегшення демографічного аналізу. Ця класифікація допомагає групувати дані у значущі сегменти для кращих інсайтів.

ALTER TABLE health_care_data  
ADD COLUMN AgeGroup VARCHAR(20);  

UPDATE health_care_data  
SET AgeGroup = CASE  
 WHEN Age < 13 THEN 'Child'  
 WHEN Age >= 13 AND Age < 20 THEN 'Teen'  
 WHEN Age >= 20 AND Age < 65 THEN 'Adult'  
 WHEN Age >= 65 THEN 'Senior'  
 ELSE 'Unknown'  
END;

2.0 Додавання стовпців DayName, MonthName і Year:
Ці стовпці витягують додаткову тимчасову інформацію з AdmissionDate, щоб аналізувати патерни, основані на днях тижня, місяцях або роках. Це особливо корисно для визначення сезонних або тимчасових тенденцій у прийомах.

ALTER TABLE health_care_data  
ADD COLUMN DayName VARCHAR(20),  
ADD COLUMN MonthName VARCHAR(20),  
ADD COLUMN Year INT;  

UPDATE health_care_data  
SET   
 DayName = DAYNAME(AdmissionDate),  
 MonthName = MONTHNAME(AdmissionDate),  
 Year = YEAR(AdmissionDate);

Після завершення процесу очищення ось посилання на очищену базу даних Cleaned HealthData.

3.0 Обмеження очищених даних:

  • Імпутація відсутніх значень:
    Замінювання відсутніх значень (наприклад, у Salary, CreditScore та Age) середніми значеннями або значеннями за замовчуванням може не повністю відображати фактичний розподіл даних, що може ввести упередження.
    Null значення в таких стовпцях, як HealthCondition, були замінені на “Unknown”, що може спростити дані і приховати значущі інсайти.
  • Узагальнення даних:
    Категоризація віків у загальні групи (наприклад, AgeGroup як Child, Teen, Adult, Senior) може призвести до втрати детальних відомостей про конкретні вікові діапазони.
    Стандартизація записів, таких як HealthCondition і EmploymentStatus, може прибрати унікальні нюанси, що впливає на інсайти щодо рідкісних або аномальних станів.
  • Припущення при очищенні:
    При очищенні були зроблені припущення щодо мінімального та середнього віку для працевлаштування, освіти та виходу на пенсію, які можуть не відповідати реальним даним у деяких випадках.
    Заповнення значень CreditScore або Age для екстремальних значень за допомогою середнього значення може не точно відображати індивідуальні записи.
  • Можливі помилки введення даних:
    Помилки, які не були явно виявлені під час очищення (наприклад, нереалістичні записи в Salary або Age), можуть залишитися і вплинути на точність аналізу.

4.0 Визначення міст або демографічних груп з більшими потребами у охороні здоров’я

  1. Ключові показники:
  • Загальна кількість прийомів: 1,596
  • Середній кредитний бал: 678.93
  • Середній вік: 39.47
  • Проаналізовані міста: 3 (Атланта, Альбукерке, Балтимор)
  • Середня заробітна плата: $42,036

pic

Ключові показники

2.
Прийоми по містах:
**Атланта
зафіксувала найбільшу кількість прийомів — 968, за нею йдуть Альбукерке з 323 та Балтимор з 305. Це вказує на те, що в Атланті спостерігається більший попит на медичні послуги порівняно з іншими містами.

pic

Загальна кількість прийомів по містах та станах здоров’я

Прийоми за роками:

2021 рік мав найбільшу кількість прийомів (309), за ним слідує 2022 рік (307). Найменша кількість прийомів була зафіксована в 2024 році — 118 випадків.

pic

Загальна кількість прийомів по роках та містах

Статус зайнятості та стан здоров’я:

Зайняті особи становили 471 прийом, безробітні — 387, самозайняті — 236, пенсіонери — 157, а фрілансери/працівники за контрактом — 145.
Поганий стан здоров’я був найбільш поширений серед безробітних пацієнтів, а серед зайнятих пацієнтів з відмінним станом здоров’я було найбільше прийомів загалом.

pic

Загальна кількість прийомів за статусом зайнятості та станом здоров’я

Прийоми за віковими групами:

Дорослі (віком від 20 до 64 років) складали більшість з 1,302 прийомів, за ними йшли пенсіонери (65+ років) з 197, підлітки (13–19 років) з 93 та діти (менше 13 років) з 4 прийомами. Дорослі показали найвищий відсоток серед всіх станів здоров’я, включаючи поганий, добрий, відмінний і середній.

pic

Загальна кількість прийомів за віковими групами та станом здоров’я

Прийоми за групою крові:

Типи крові A+ та O+ мали найвищу кількість прийомів — по 216 кожен, з невеликим відставанням йшов тип B+ з 210 прийомами.

pic

Загальна кількість прийомів за групою крові

Прийоми за місяцями:

Найбільша кількість прийомів була в січні (150), за ним йдуть серпень (148) та травень (146). Квітень мав найменшу кількість прийомів — 98 випадків.

pic

Загальна кількість прийомів за місяцем

Прийоми за рівнем освіти:

Пацієнти з докторським ступенем склали найбільшу кількість прийомів (308), за ними йшли пацієнти з бакалаврським дипломом (286), середньою освітою (282) та асоційованим дипломом (272).

pic

Загальна кількість прийомів за рівнем освіти

5.0 Висновки:

Аналіз показує, що попит на медичні послуги найбільший в Атланті, з суттєво більшою кількістю прийомів порівняно з Альбукерке та Балтимором, що вказує на необхідність збільшення медичних ресурсів в цьому місті. Безробітні з поганим станом здоров’я є критично важливою демографічною групою, яка потребує цільових заходів для покращення доступу до медичних послуг та їх якості.

Дорослі, як найбільша вікова група, постійно показують потребу в медичних послугах по всіх станах здоров’я, що підкреслює важливість фокусу на цій групі. Групи крові A+ та O+ мають найбільшу кількість прийомів, що може свідчити про кореляцію з конкретними ризиками для здоров’я, які потребують подальших досліджень.

Сезонні тренди показують, що прийоми пік у січні, серпні та травні, що свідчить про необхідність збільшення готовності медичних установ у ці місяці.
Значна представленість осіб з вищою освітою, особливо володарів докторських ступенів, підкреслює необхідність розуміти та враховувати специфічні фактори, які впливають на використання медичних послуг цією демографічною групою.

Загалом, результати дослідження акцентують на необхідності розробки спеціалізованих медичних стратегій для міст, вікових груп та категорій зайнятості, щоб забезпечити ефективний розподіл ресурсів та покращення результатів.

Дякую за те, що прочитали цю статтю.

Ось посилання на запит на GitHub: SQL Запит

Удачі!!! Щасливого читання!! Продовжуйте вчитися!!

Ви можете зв'язатися зі мною через LinkedIn

Перекладено з: GreenData Solution Data Cleaning Challenge

Leave a Reply

Your email address will not be published. Required fields are marked *