Анкетното проучване е често използван метод при пазарните изследвания, чрез който се събират данни от определена група хора (респонденти) с цел да се разбере тяхното мнение по конкретна тема. След това тези данни могат да се изследват с помощта на разнообразни средства за анализ и може да се прилагат върху тях различни методи за машинно обучение (например групиране на респондентите по определени признаци, предвиждане на тяхното поведение и т.н.). Това позволява да добием представа за общите тенденции в данните, връзки между отделните променливи, прилики и различия по отношение на отделните характеристики и др.
В тази статия ще ви покажа чрез практически пример как можете да анализирате данни от анкетно проучване и да групирате респондентите по определени характеристики. Ще използваме езика за програмиране Python и някои негови популярни библиотеки за анализ на данни и машинно обучение.
С какви данни ще работим?
Извадката съдържа данни от анкетно проучване за нагласите на служители в ИТ индустрията по въпроси за психичното здраве. Имаме 1433 респонденти и 63 въпроса в анкетата.
Въпросите са свързани с:
- Социално-демографски характеристики на респондентите
- Длъжност и големина на фирмата, в която работят
- Отношението на работодателите към психичното здраве
- Бъдещи нагласи на респондентите относно психичното здраве
Повече информация за проучването можете да намерите тук.
Изследване на данните
Ще се запознаем по-добре с данните с помощта на редица визуализации, изградени с библиотеката Plotly.
Профил на респондента
Визуализациите, които ще видите по-надолу, представят данни за респондентите свързани с тяхната възраст, местожителство, длъжност и психично здраве.
- На каква възраст са респондентите?
Следната хистограма представя разпределението на характеристиката възраст (age). Средната възраст на респондентите е 34 години.
- Респондентите взели ли са мерки относно психичното си здраве?
От стълбовидната диаграма става ясно, че повече от половината респонденти са се консултирали със специалист – 839 на брой. Останалите не са предприели мерки.
- Какъв е полът на респондентите?
Има най-много респонденти от мъжки пол 1061, което е нормално за ИТ индустрията. От женски пол са 342 на брой, а хора, които се определят като различен от мъжки или женски пол са само 30 на брой.
- В кои държави са респондентите?
На картата можем да видим колко на брой респонденти има в отделните държави, като цветовете отразяват броя. По-голямата част от респондентите са в САЩ (59.33%) и Великобритания (12.77%).
- Какъв е броят на респондентите според размера, типа на фирмата и това дали са взели мерки за психичното си здраве?
От следната групирана стълбовидна диаграма става ясно, че най-голям брой респонденти са в ИТ фирми, които имат 26-100 на брой служители. Единственият случай, в който има повече респонденти от фирми, различни от ИТ, е за тези, които не са предприели мерки за психичното си здраве и фирмата им е с повече от 1000 служители.
- Какви длъжности заемат респондентите?
На визуализацията са представени 10-те длъжности, на които са назначени най-голям брой от респондентите. На първо място са back-end разработчици – 263 на брой, а на 10-то са дизайнери – 28 на брой.
Тази точкова диаграма показва процента респонденти, назначени на различни длъжности според това дали са предприели мерки за психичното си здраве. Единствено за позиция тийм лидер по-голям процент от респондентите не са се консултирали със специалист – 51.47%. За останалите позиции по-голям процент от респондентите са взели мерки.
- Колко от респондентите са предприели мерки и отишли на консултация след като им е била поставена диагноза от специалист?
Тази визуализация представя какъв процент от респондентите са предприели мерки и отишли на консултация след поставена диагноза от специалист. В 94.41% от случаите, изпитващите психични проблеми са взели мерки. 22.73% от тези, които нямат такива заболявания, въпреки това са решили да отидат на консултация. В 77.27% от случаите, респонденти, които са здрави, не са отишли на консултация, а тези, които имат проблеми, в 5.59% от случаите не са взели мерки.
Разлики между настоящ и минали работодатели
Следващите визуализации представят отношението на настоящия и миналите работодатели
към психичното здраве. Ще добием представа до каква степен приемат на сериозно
подобни проблеми, дали предлагат ресурси за запознаване с такива теми и дали
запазват анонимността на свои служители, които имат психични проблеми.
Настоящият и миналите работодатели на по-голямата част от респондентите не са предоставяли ресурси за запознаване с психични проблеми. 24.42% от респондентите са отговорили, че настоящият им работодател приема психичните проблеми също толкова сериозно колкото физическите, а 44.10% от тях са отговорили, че не е било така при миналите им работодатели. Голям процент от респондентите не знаят дали анонимността им се защитава при наличие на психични проблеми при минали и настоящи работодатели.
Следващите 2 визуализации представят до каква степен респондентите са склонни да споделят на колеги и преки ръководители за психичното си здраве. Първата се отнася за настоящия им работодател, а втората за миналите.
Голям процент от респондентите са по-склонни да споделят на ръководителите си при наличие на психичен проблем отколкото на колеги в екипа. Това се е наблюдава повече при минали работодатели отколкото при настоящия.
Със следващата визуализация ще видим случаите, в които дискутирането на психични проблеми е довело до негативни последици за респондентите при минали и настоящи работодатели.
При настоящия работодател в много редки случаи след дискусия с колеги или ръководители, се е стигнало до негативни последици. 48.22% от респондентите са споделили с пряк ръководител и е имало положителен резултат. Същото може да се каже и за миналите работодатели. В повечето случаи е нямало негативни последици.
Бъдещи нагласи
Част от въпросите в анкетата са свързани с това дали респондентите биха споделили в интервю за проблемите, с които се борят, и дали смятат, че притежаването на такива би навредило на тяхната кариера в бъдеще.
Първо ще видим нагласата на респондентите относно това дали се чувстват по-комфортно да споделят на потенциален работодател за свой физически или ментален проблем.
По-голямата част от респондентите са отговорили, че не биха дискутирали психични проблеми с потенциален работодател. По-склонни са да споделят за физически проблем. Има и такива, които не са сигурни, но отново се чувстват по-комфортно да споделят за физически проблем отколкото психичен.
Следващата визуализация представя до каква степен респондентите мислят, че притежаването на психични проблеми би навредило на кариерата им в бъдеще.
По-голямата част от респондентите са отговорили, че притежаването на психичен проблем може би ще навреди на кариерата им.
Групиране на респондентите по сходни характеристики
Разпределяне на респондентите в определени групи ни дава друг поглед върху данните и позволява по-задълбочено да ги анализираме.
Ще използваме методите за машинно обучение Principal Component Analysis (PCA) и K-means клъстеризация, които се отнасят към задачите без контролна извадка, за да открием групи от респонденти въз основа на определени критерии за подобие.
Прилагане на PCA
С PCA можем да намалим броя характеристики в извадката, запазвайки голяма част от дисперсията в данните.
# Стандартизиране на данните чрез StandartScaler()
X = np.array(df_numeric)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# Създаване на обект и използване на PCA
pca = PCA()
pca.fit(X_scaled)
PCA изисква входните данни да са числови стойности, които е необходимо също така да бъдат и мащабирани, за да не се получат подвеждащи резултати.
Следната стълбовидна диаграма представя новосъздадените променливи (компоненти). Те са 49, колкото е броят променливи в извадката и са комбинация от първоначалните характеристики. Връзката (мултиколинеарността) между компонентите е минимална и по-голямата част от дисперсията е в първите няколко.
Следващата визуализация е линейна диаграма, която представя общата дисперсия при конкретен брой компоненти.
Нека изберем броя на компонентите, така че да съдържат 85% от дисперсията. В този случай той ще бъде 29.
След като сме определили колко компонента ще използваме, можем да преминем към прилагане на метода върху мащабираните данни.
# Задаване на брой компоненти
pca.n_components = 29
# Използване на PCA за редуциране на дименсии
X_reduced = pca.transform(X_scaled)
df_X_reduced = pd.DataFrame(X_reduced, index=df.index)
5 случайно избрани реда от данните след PCA изглеждат по следния начин:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
696 | -3.02088 | 0.66525 | -0.635907 | 4.24439 | 0.192979 | 0.886942 | -1.24587 | -1.76764 | -1.08154 | 0.970746 | 0.411829 | -0.619339 | 0.147393 | 1.6365 | -0.452114 | 0.826794 | 0.432884 | -0.799267 | -1.13988 | 1.78259 | -0.0251821 | -0.248955 | 0.95877 | 0.150769 | -1.01854 | -0.447444 | 0.405814 | -0.351975 | 0.364127 |
471 | -2.45412 | 0.102723 | 2.79864 | -0.656884 | 2.33841 | 0.573274 | -2.14286 | 1.04499 | -0.616161 | -0.532225 | 0.875877 | -0.517464 | 0.547797 | 0.165167 | 0.337162 | -0.523091 | -0.402383 | -0.561683 | -0.841365 | 0.803967 | -0.264122 | 1.57233 | 0.436379 | -1.01978 | 0.47535 | -0.197473 | 0.742108 | -0.223675 | -0.392804 |
914 | -1.3388 | -0.860249 | -2.75275 | 0.746681 | 1.18833 | 0.225183 | -0.52729 | -0.620618 | 0.155795 | -0.0673015 | 1.03105 | 0.317093 | 0.398762 | 1.91868 | -0.245113 | 0.605752 | -0.426019 | -0.818156 | -0.0250206 | -0.0739131 | 0.280042 | 0.212777 | -0.885925 | -0.691041 | -0.737896 | 1.07779 | -0.32887 | -0.583825 | 0.692823 |
817 | -2.01344 | -2.26898 | 1.33983 | -0.949053 | -0.754474 | 1.83638 | 1.92311 | -2.3917 | -0.653669 | -0.871317 | -0.44348 | -0.623953 | -0.259467 | 1.02736 | 1.58645 | 1.03199 | 0.897559 | 1.54077 | 0.357973 | -0.73939 | -1.21549 | 0.257713 | 0.374884 | 0.0486526 | -0.180324 | 0.453169 | -0.87629 | 0.044204 | 0.280999 |
535 | -1.60534 | -2.59493 | 0.819649 | -0.907739 | -0.305614 | -1.15739 | -3.47492 | -0.566866 | -0.697523 | 0.032376 | 0.289265 | -0.189941 | 2.09965 | -0.883293 | -0.805537 | 0.987222 | 0.967741 | -0.946665 | -1.82987 | 1.04714 | 0.40774 | -1.08073 | -0.216556 | 0.308355 | -0.0477905 | -0.431504 | -1.02802 | 1.90052 | -0.627082 |
Клъстеризация с K-means
K-means клъстеризацията изчислява разстоянията между всеки обект до центъра на клъстера и организира данните по такъв начин, че да е голямо сходството между обектите вътре в клъстера и малко сходство между тези от съседни клъстери.
Алгоритъмът изисква предварително да зададем брой клъстери. За тази цел ще създадем линейна диаграма, която показва изменението на отдалечеността на точките вътре в клъстерите (inertia) в зависимост от броя клъстери.
Оптималният брой клъстери според визуализацията е 3, защото след това наклонът на кривата става по-плавен и при по-големите бройки клъстери разликата в стойностите за отдалечеността на точките вътре в клъстерите е по-малка.
# Прилагане на KMeans()
kmeans = KMeans(n_clusters=3, random_state=3442)
kmeans.fit(X_reduced)
kmeans_pred = kmeans.predict(X_reduced)
След прилагане на KMeans(), всеки от респондентите в извадката е разпределен в един от 3 клъстера в зависимост от неговите характеристики.
Резултати
Резултатите от клъстеризацията ще представим с помощта на 2 визуализации. Първата ще включва множество диаграми на разсейването, показващи връзката между отделните компоненти, като създадените клъстери са обозначени с различни цветове.
Survey Data Analysis – Scatter Matrix PCA
На визуализацията можем да видим, че първите 2 компонента представят най-ясно разпределението на данните.
Тази графика ни позволява по-отблизо да видим разпределението на респондентите в отделните клъстери. Размера на точките зависи от това на колко години е респондентът.
Клъстерите са следните:
- Клъстер 0 (Син клъстер) съдържа 530 на брой респонденти. Предимно работещи в малки фирми. Хората в този клъстер нямат психични проблеми. За тях би било лесно да вземат отпуск по такива причини и се чувстват достатъчно комфортно да говорят на такива теми с колеги и преки ръководители.
- Клъстер 1 (Розов клъстер) съдържа 529 на брой респонденти, предимно работещи в малки фирми. Хората в този клъстер са изпитвали психични проблеми и са отишли на консултация при специалист, за тях е лесно да вземат отпуск по такива причини и се чувстват достатъчно комфортно, за да споделят за проблемите си с колеги и преки ръководители.
- Клъстер 2 (Жълт клъстер) съдържа 374 на брой респонденти, предимно работещи в големи фирми. Тук не е от значение дали имат психични проблеми, но във фирмите им е трудно да вземат отпуск по такива причини, ако се наложи. Срещали са негативни последици от разговори на такива теми и не се чувстват комфортно да споделят с колеги и преки ръководители за проблемите си.
Като извод можем да кажем, че групирането се е получило добре. Разбира се не всички респонденти, отговарят изцяло на съответните критерии за клъстерите, но те може да са попаднали в тях заради стойностите на някои от другите променливи. Резултатите от клъстеризацията могат да бъдат подобрени като се правят множество експерименти с различни стойности на параметрите на KMeans().
Кода на визуализациите, подготовката на данните за анализ и още допълнителни неща можете да намерите в цялостния пример.
Искате да научите повече за машинното обучение?
Включете се в курса по машинно обучение и анализ на данни с Python.
Автор: Десислава Христова