From 14f7b483f9b27d597d4f37a8a3ff7cae5acf7ea7 Mon Sep 17 00:00:00 2001 From: dev weycloud Date: Sat, 22 Jan 2022 17:08:15 +0100 Subject: [PATCH] Code fuer Hausarbeit a-c,e --- ...stellung Hausarbeit_mobile_device_data.pdf | Bin 0 -> 42994 bytes Hausarbeit/Beispielcode von mir.md | 84 +++++++ Hausarbeit/UnivariateAnalyse.csv | 9 + .../mobile_device_data.cpython-37.pyc | Bin 0 -> 196 bytes Hausarbeit/mobile_device_data.csv | 211 ++++++++++++++++++ Hausarbeit/mobile_device_data.py | 107 +++++++++ Sonstiges/TENTW/auswertung.py | 7 +- 7 files changed, 416 insertions(+), 2 deletions(-) create mode 100644 Hausarbeit/Aufgabenstellung Hausarbeit_mobile_device_data.pdf create mode 100644 Hausarbeit/Beispielcode von mir.md create mode 100644 Hausarbeit/UnivariateAnalyse.csv create mode 100644 Hausarbeit/__pycache__/mobile_device_data.cpython-37.pyc create mode 100644 Hausarbeit/mobile_device_data.csv create mode 100644 Hausarbeit/mobile_device_data.py diff --git a/Hausarbeit/Aufgabenstellung Hausarbeit_mobile_device_data.pdf b/Hausarbeit/Aufgabenstellung Hausarbeit_mobile_device_data.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d86988780f85a373fcc2fe5063d5d3832e199540 GIT binary patch literal 42994 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 literal 0 HcmV?d00001 diff --git a/Hausarbeit/Beispielcode von mir.md b/Hausarbeit/Beispielcode von mir.md new file mode 100644 index 0000000..206cdf8 --- /dev/null +++ b/Hausarbeit/Beispielcode von mir.md @@ -0,0 +1,84 @@ +``` +# https://towardsdatascience.com/five-regression-python-modules-that-every-data-scientist-must-know-a4e03a886853 +# based on: https://machinelearningmastery.com/how-to-use-correlation-to-understand-the-relationship-between-variables/ + +# pip3 install openpyxl +import os +import pandas as pd # To read data +import math as m +import numpy as np +import scipy as sp + +from scipy import stats +import matplotlib.pyplot as plt # To visualize + +# location will help to open files in the same directory as the py-script +__location__ = os.path.realpath( + os.path.join(os.getcwd(), os.path.dirname(__file__))) + +df = pd.read_excel(os.path.join(__location__,'Daten_Umfrage_SPSS_20211113.xlsx')) + +df = df.apply(pd.to_numeric, errors='coerce') # convert non-numeric values to NaN, e.g. Header "row 1" "CodeXYZ" -> "row 1" "NaN" +print("Dataframe (Zeilen, Spalten, ...) inkl. NaN:", df.shape) +print(df.head(10)) +# Code SE01_01 SE01_02 SE02_01 SE02_02 SE03_01 +# 0 NaN NaN NaN NaN NaN NaN +# 1 NaN 6.0 4.0 7.0 4.0 5.0 +# ... +#df = df.dropna() # CAUTION: drops every row that even contains single NaN ! + +print(df.tail(10)) +# Code SE01_01 SE01_02 SE02_01 SE02_02 SE03_01 +# 155 NaN 4.0 4.0 3.0 5.0 1.0 +# 156 NaN NaN NaN NaN NaN NaN +# (End of File) + +#print(df["HO_Score_Bewerbung_Gewichtet"][105:110]) +#for col in df.columns: + #print(col) + +# Calculate Mean, gew, inv +mwHO01_Diff = df["HO01_Diff"][1:156] # Limit to Column and row Amount +mwHO01_Diff = mwHO01_Diff.mean(skipna=True) # Columns arithm. mean, skipna to ignore NaN rows +mwHO01_Diff = round(mwHO01_Diff, 2) +normHO01_Diff = m.sqrt((mwHO01_Diff / 6)**2) # Norm +invHO01_Diff = 1 - normHO01_Diff # invert +# usw +print("HO01_Diff Mittelwert:", mwHO01_Diff) +print("HO01_Diff Normiert:", normHO01_Diff) +print("HO01_Diff Invertiert:", invHO01_Diff) +# usw + +# Choose Dataframe Columns and row Amount +dfColumnX = df["SS_Score"][1:156] +dfColumnY = df["HO_Score_Bewerbung_Gewichtet"][1:156] + +# Convert Dataframe Columns to Array containing the X- and Y- Values +arrX = np.asarray(dfColumnX) # convert that dataframe column to numpy array +arrY = np.asarray(dfColumnY) + +# Prepare Plot Image +plt.xlabel('SS_Score', color='black') +plt.ylabel('HO_Score_Bewerbung_Gewichtet', color='black') +plt.xlim([0,50]) # set x-Axis View Range,[from,to] +plt.scatter(arrX, arrY) + +arrX, arrY = zip(*sorted(zip(arrX,arrY))) # sort 2 arrays in sync + +# Convert again, as sorting seemed to break the numpy array data format +arrX = np.asarray(arrX) # before: "1 16.0" after: "[16. 18. 21. ...]" +arrY = np.asarray(arrY) + +# Use least Square Linear Regression from SciPy Stats +regr_results = sp.stats.linregress(arrX, arrY) + +steigung = regr_results.slope +yAchsAbschn = regr_results.intercept +arrYpredicted = steigung * arrX + yAchsAbschn # using y = m*x + n, calculate every single Y-Value fitting the regression Lines X-Values + +print("y =", steigung, "* x +", yAchsAbschn) + +# Plot Linear Regression Line +plt.plot(arrX, arrYpredicted, label='Lin Regr', color='red', linestyle='solid') # https://scriptverse.academy/tutorials/python-matplotlib-plot-straight-line.html +plt.show() +``` \ No newline at end of file diff --git a/Hausarbeit/UnivariateAnalyse.csv b/Hausarbeit/UnivariateAnalyse.csv new file mode 100644 index 0000000..a6ab8e9 --- /dev/null +++ b/Hausarbeit/UnivariateAnalyse.csv @@ -0,0 +1,9 @@ +,battery_power,int_memory,ram +count,200.0,200.0,200.0 +mean,1264.56,33.485,2153.125 +std,441.5502229610862,17.79559470640905,1140.4263724281582 +min,504.0,2.0,263.0 +20%,857.6,16.0,870.8000000000001 +50%,1249.5,33.0,2172.5 +80%,1721.4000000000003,51.0,3317.600000000001 +max,1999.0,64.0,3976.0 diff --git a/Hausarbeit/__pycache__/mobile_device_data.cpython-37.pyc b/Hausarbeit/__pycache__/mobile_device_data.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1b6bad8646510136b1fa3a53622e818941bbef17 GIT binary patch literal 196 zcmZ?b<>g`kf_JQM64QY6V-N=hn1KujATE{z5-AKRj5!QZjH!$Zm{OP)GDb0{vZOLM zGcp3jgBdiLUjo%I_*IGK<|k$5q{gSDmSrXbsl<{*y@EtOZ4xc_k|uia_>(iC@@Fxy50Vo1apelWNBZR9VadBsf^Om;iMA BFp~fP literal 0 HcmV?d00001 diff --git a/Hausarbeit/mobile_device_data.csv b/Hausarbeit/mobile_device_data.csv new file mode 100644 index 0000000..68458ca --- /dev/null +++ b/Hausarbeit/mobile_device_data.csv @@ -0,0 +1,211 @@ +id,battery_power,bluetooth,dual_sim,4G,int_memory,ram +1,1043,1,1,0,5,3476 +2,841,1,1,1,61,3895 +3,1807,1,0,0,27,2396 +4,1546,0,1,1,25,3893 +5,1434,0,0,1,49,1773 +6,1464,1,1,1,50,3506 +7,1718,0,0,0,47,3873 +8,833,0,1,0,62,1495 +9,1111,1,1,1,25,3485 +10,1520,0,0,0,25,651 +11,1500,0,0,0,55,3866 +12,1343,0,0,1,34,3911 +13,900,1,1,0,30,439 +14,1190,1,1,0,19,992 +15,630,0,0,1,51,2751 +16,1846,1,0,1,53,563 +17,1985,0,1,1,26,2083 +18,1042,0,0,1,48,2187 +19,1231,1,1,1,37,3902 +20,1488,0,0,0,37,2524 +21,968,0,0,1,7,1357 +22,529,0,1,0,60,3456 +23,1558,0,1,0,50,1641 +24,533,1,1,0,58,2322 +25,1037,0,1,0,5,3862 +26,1025,0,1,1,43,557 +27,1858,0,1,0,17,2427 +28,980,0,0,0,8,625 +29,644,1,1,0,15,3836 +30,1024,1,1,1,38,854 +31,1981,0,1,1,11,2383 +32,1380,0,1,1,56,926 +33,1557,1,1,0,32,3048 +34,1201,1,1,0,49,824 +35,1074,1,0,0,45,874 +36,1175,1,0,0,33,1617 +37,1280,0,1,1,8,3309 +38,1715,0,1,1,28,1786 +39,1165,0,0,0,40,3128 +40,567,0,0,0,2,2243 +41,1952,1,0,0,47,994 +42,822,1,1,0,43,2749 +43,685,1,1,0,12,793 +44,1388,1,1,1,17,324 +45,1972,0,0,0,48,366 +46,1411,1,0,1,57,1228 +47,1094,0,1,0,20,1413 +48,1653,0,1,1,13,2617 +49,916,0,1,0,33,1798 +50,1712,0,0,0,29,2693 +51,882,1,1,0,32,2437 +52,632,0,0,1,33,837 +53,1442,1,1,0,56,2815 +54,900,0,0,0,47,1440 +55,1630,1,1,0,20,3470 +56,1596,1,1,0,24,1251 +57,1272,1,0,1,54,3181 +58,1640,0,1,0,7,1361 +59,1111,0,1,0,15,1630 +60,1889,1,0,0,25,3689 +61,1907,1,1,0,22,3586 +62,529,0,1,0,56,3942 +63,578,0,0,1,38,1431 +64,1634,1,1,1,39,2167 +65,1533,1,1,1,22,1248 +66,660,0,0,1,47,1986 +67,1847,1,0,1,28,1378 +68,1206,1,1,0,10,2959 +69,549,1,0,1,53,1893 +70,1705,1,0,1,23,1676 +71,1366,0,1,0,36,1912 +72,1991,0,0,0,58,1947 +73,1102,1,0,1,40,2734 +74,1452,0,0,1,32,3617 +75,1810,1,1,0,63,3414 +76,1166,1,1,1,41,482 +77,881,1,1,0,6,2813 +78,1134,1,1,1,64,661 +79,1031,1,1,1,20,2546 +80,1376,1,1,1,34,3922 +81,1391,0,1,1,56,1199 +82,979,0,0,0,24,3779 +83,1075,1,0,0,36,3870 +84,968,0,1,1,61,858 +85,1999,0,1,1,15,3840 +86,1626,0,0,0,20,454 +87,942,0,1,0,28,3953 +88,1182,0,0,1,42,1633 +89,1982,1,1,0,48,3035 +90,1373,0,1,0,27,966 +91,1151,0,1,0,44,1761 +92,1650,1,1,0,51,1938 +93,1663,1,1,0,17,2820 +94,1965,1,0,1,3,305 +95,679,0,1,0,41,2838 +96,1465,0,0,0,3,2042 +97,1809,1,1,0,27,700 +98,757,1,1,1,26,2593 +99,1034,1,0,1,47,1835 +100,1119,1,0,0,23,3121 +101,559,1,1,1,24,2023 +102,1204,1,0,0,19,737 +103,1008,0,1,1,15,450 +104,1397,1,1,0,19,2928 +105,697,0,1,1,34,1694 +106,1939,1,0,0,58,2593 +107,1039,0,1,0,15,745 +108,1605,1,0,1,51,1310 +109,1094,0,1,0,34,2743 +110,769,1,1,1,30,3976 +111,861,1,1,0,40,3931 +112,504,0,1,0,63,3455 +113,1930,1,1,1,64,1533 +114,1795,1,1,0,52,3876 +115,1363,0,1,1,2,3239 +116,1376,1,0,1,38,3628 +117,1981,1,0,0,19,3663 +118,1901,0,0,0,62,1786 +119,1319,0,1,0,5,3502 +120,859,1,0,0,58,815 +121,1664,1,0,0,25,275 +122,955,0,1,0,62,3758 +123,517,0,1,0,38,2747 +124,1806,0,0,1,64,1809 +125,1348,0,0,1,50,2086 +126,1455,0,0,0,16,444 +127,1611,0,1,NaN,25,3467 +128,1573,1,1,1,24,2776 +129,557,0,0,1,23,3170 +130,1599,1,0,0,31,1234 +131,1051,1,1,0,16,305 +132,1857,1,1,0,14,1745 +133,1986,0,0,0,24,1707 +134,591,1,0,0,21,2220 +135,1140,0,1,1,56,3130 +136,923,1,0,1,10,1500 +137,1582,NaN,0,0,33,2145 +138,723,0,0,0,63,488 +139,1251,1,1,1,54,3863 +140,574,1,1,1,60,2913 +141,948,1,1,1,60,2094 +142,1571,0,1,0,44,3141 +143,564,1,0,0,33,2573 +144,1466,0,1,1,57, +145,597,1,1,0,16,3788 +146,895,1,1,1,9,3445 +147,1535,0,1,1,37,3241 +148,1832,1,0,0,44,2976 +149,1045,1,0,1,58,2241 +150,1483,1,0,1,61,3843 +151,976,0,0,1, ,3261 +152,1840,1,1,0,46,3264 +153,1807,0,1,0,8,826 +154,624,1,1,0,30,1314 +155,1963,0,0,1,38,2699 +156,1307,1,0,1,4,2565 +157,1933,1,1, ,23,3973 +158,1496,1,1,0,42,3537 +159,1532,1,0,0,7,3449 +160,1004,0,1,1,8,3895 +161,1483,1,1,1,38,2777 +162,945,0,0,0,47,2904 +163,1081,NaN,0,1,17,3774 +164,1012,0,1,1,32,3034 +165,1762,0,0,0,50,2940 +166,796,1,1,1,36, +167,1547,0,0,1,50,1168 +168,988,0,0,1,12,376 +169,1180,1,0,1,43,3510 +170,852,1,0,1,3,542 +171,607,1,0,1,18,550 +172,1765,0,0,0,24,791 +173,1250,0,0,0,63,1895 +174,1577,0,1,0,55,609 +175,1153,1,1,0,14,263 +176,651,1,0,0, ,2141 +177,1186,1,1,0,25,1270 +178,1429,1,0,0,33,403 +179,556,0,0,1,10,2040 +180,1735,1,0,1,21,2597 +181,1859,0,0,1,42,714 +182,915,0,0,0,10,423 +183,890,NaN,0,0,9,1238 +184,758,0,0,0,48,926 +185,541,0,0,1,28,2704 +186,586,0,1,1,33,2817 +187,762,1,1,1,39,2271 +188,683,0,1,1,9,1513 +189,1526,0,1,0,39,339 +190,1771,1,0,0,39,794 +191,639,0,0,0,28,391 +192,1783,1,0,1,23,541 +193,1933,0,0,1,55,648 +194,1384,,1,1,62,3386 +195,1770,0,0,0,26,1651 +196,1202,0,0,0,49,1177 +197,885,0,1,0,3,2887 +198,1629,1,0,1,2,2178 +199,1072,1,1,1,4,2878 +200,1863,1,1,0,64,3201 +201,1739,0,1,0,51,1490 +202,895,1,0,0,23,2724 +203,1278,1,1,0,56,3032 +204,562,1,1,1,43,3352 +205,1249,1,1,0,38,3195 +206,1811,0,0,1,25,1677 +207,560,1,1,1,12,2620 +208,1773,1,0,1,61,1061 +209,1715,1,0,0,11,1018 +210,725,0,1,1,26,1370 diff --git a/Hausarbeit/mobile_device_data.py b/Hausarbeit/mobile_device_data.py new file mode 100644 index 0000000..b847d51 --- /dev/null +++ b/Hausarbeit/mobile_device_data.py @@ -0,0 +1,107 @@ +import numpy as np # pip3 install numpy +import pandas as pd # pip3 install pandas +import matplotlib.pyplot as plt +import scipy as sp +from scipy import stats + +### a) Einlesen der Quelldaten +# Pandas-Methode read_csv() zum Einlesen nutzen, wobei die Spalte namens "id" ausgelassen wird +gewuenschteSpalten = ["battery_power", "bluetooth", "dual_sim", "4G", "int_memory", "ram"] +df = pd.read_csv('mobile_device_data.csv', usecols=gewuenschteSpalten) + +# Print inkl. Dataframe-Methode head() aufrufen +# Parameter n: Ausgabe der ersten 12 Zeilen (Zeile 0 bis 11 = 12 Zeilen) +print(df.head(n=12)) +# Ausgabe: +# battery_power bluetooth dual_sim 4G int_memory ram +# 0 1043 1.0 1 0 5 3476 +# ... ... ... ... ... ... ... +# 11 1343 0.0 0 1 34 3911 + +### b) Bereinigen +# Dataframe enthält verschiedene Arten nicht auswertbarer Zellen: +# 1. Zellen in denen vorher schon NaN (NotANumber) steht +# 2. Zellen, in denen ein leerer String steht (' ') +# -> umwandeln von (' ') in "NaN", per DataFrame-Methode replace() +df.replace(to_replace=' ', value=np.nan, inplace=True) + +# 1. und 2. lassen sich jetzt auf die gleiche Weise wie folgt ausgeben, +# und es werden 4 Zeilen gefunden, in denen das Bluetooth Feld "NaN" ist, +# und insgesamt 6 Zeilen, in denen das 4G, int_memory und ram Feld "NaN" sind: +# print(df.isna().sum()) +# Ausgabe: +# battery_power 0 +# bluetooth 4 +# dual_sim 0 +# 4G 2 +# int_memory 2 +# ram 2 + +# Dataframe-Methode "dropna" aufrufen, um solche Einträge zu löschen: +# Parameter axis=0 : Zeile wird gelöscht +# Parameter how='any' : Zum Löschen genügt eine einzelne leere Zelle +# Parameter inplace=True : Die Operation wird direkt auf das DataFrame angewendet +df.dropna(axis=0, how='any', inplace=True) + +# Nach dieser Änderung sind nur noch 200 Zeilen im DataFrame +print(len(df.index)) +# Ausgabe: +# 200 + +### c) Univariate Analyse +# Die Datentypen der gewünschten Merkmale werden nicht von vornherein alle als Ganzzahlen (Integer) +# interpretiert (vgl. print(df.info()) ), daher erst in solche umwandeln. +# Wenn man das nicht macht, kann .describe() nicht ordentlich mit gemischten Spaltentypen umgehen. +# Die Beispielausgabe wäre sonst: "mean 1264.560000 NaN NaN" +dfMetrischeMerkmale = df[["battery_power", "int_memory", "ram"]].astype(int) +dfUnivariateAnalyse = dfMetrischeMerkmale[["battery_power", "int_memory", "ram"]].describe(include='all', percentiles=[0.2, 0.5, 0.8]) +dfUnivariateAnalyse.to_csv('UnivariateAnalyse.csv') +# Ausgabe: +# battery_power int_memory ram +# count 200.000000 200.000000 200.000000 +# mean 1264.560000 33.485000 2153.125000 +# std 441.550223 17.795595 1140.426372 +# min 504.000000 2.000000 263.000000 +# 20% 857.600000 16.000000 870.800000 +# 50% 1249.500000 33.000000 2172.500000 +# 80% 1721.400000 51.000000 3317.600000 +# max 1999.000000 64.000000 3976.000000 + + +### d) Balkendiagramme +dfNominaleMerkmale = df[["bluetooth", "dual_sim", "4G"]].astype(int) +#dfNominaleSummen = dfNominaleMerkmale["bluetooth", "dual_sim", "4G"].sum() +#print(dfNominaleMerkmale) +#dfNominaleMerkmale.plot(kind="hist") +#plt.show() + + + +### e) Korrellationen nach Pearson und Lineare Regression zweier Merkmale +print(dfMetrischeMerkmale.corr(method="pearson")) +# Ausgabe: +# battery_power int_memory ram +# battery_power 1.000000 0.050449 -0.069141 +# int_memory 0.050449 1.000000 0.047475 +# ram -0.069141 0.047475 1.000000 +# -> ram und battery_power korrelieren am Stärksten, wenn auch negativ: + +# Per Modul SciPy Stats: Methode der kleinsten Quadrate für die Lineare Regression nutzen +werteListeX = dfMetrischeMerkmale["ram"] +werteListeY = dfMetrischeMerkmale["battery_power"] +regrErgebnisse = sp.stats.linregress(werteListeX, werteListeY) +steigung = round(regrErgebnisse.slope, 4) +yAchsAbschn = round(regrErgebnisse.intercept, 4) +arrYpredicted = steigung * werteListeX + yAchsAbschn # using y = m*x + n, calculate every single Y-Value fitting the regression Lines X-Values +print("Regressionsgleichung:", "y =", steigung, "* x +", yAchsAbschn) + +# Plot Linear Regression Line +plt.plot(werteListeX, arrYpredicted, label='Lin Regression', color='red', linestyle='solid') # https://scriptverse.academy/tutorials/python-matplotlib-plot-straight-line.html +# Show Plot Image +plt.xlabel('ram', color='black') +plt.ylabel('battery_power', color='black') +#plt.xlim([0,50]) # set x-Axis View Range,[from,to] +plt.scatter(werteListeX, werteListeY) +plt.show() + + diff --git a/Sonstiges/TENTW/auswertung.py b/Sonstiges/TENTW/auswertung.py index b219e42..3aff776 100644 --- a/Sonstiges/TENTW/auswertung.py +++ b/Sonstiges/TENTW/auswertung.py @@ -91,18 +91,21 @@ df["HO_Score_erklaert"] = yAchsAbschn + df["SS_Score"] * steigung # Vorlesung 6 df["Diff_roh_erklaert"] = df["HO_Score_Bewerbung_Roh"] - df["HO_Score_erklaert"] +print("Diff_roh_erklaert_Mean", df["Diff_roh_erklaert"].mean()) df.loc[df.Diff_roh_erklaert < 0, "Diff_roh_erklaert"] = 0 # Differenz soll minimal 0 sein dürfen df["H0_Final"] = df["HO_Score_Bewerbung_Gewichtet"] + df["Diff_roh_erklaert"] df["H0_Wert_Z_Wert"] = (df["H0_Final"] - df["H0_Final"].mean()) / df["H0_Final"].std() +print("HO_Final mean", df["H0_Final"].mean(), "HO_Final std:", df["H0_Final"].std()) +print("SS_Mean", df["SS_Score"].mean()) df["H0_Wert_7er_Skala"] = (df["H0_Wert_Z_Wert"] * 1.5) + 4 df["H0_Wert_7er_Skala"] = round(df["H0_Wert_7er_Skala"], 2) df.loc[df.H0_Wert_7er_Skala < 1, "H0_Wert_7er_Skala"] = 1 # ausreisser festlegen auf Min 1 df.loc[df.H0_Wert_7er_Skala > 7, "H0_Wert_7er_Skala"] = 7 # ausreisser festelegen auf Max 7 -#df.to_csv(__location__ + '/tmpViewFile.csv', sep=";") +df.to_csv(__location__ + '/tmpViewFile.csv', sep=";") # Open Dataframe in Webbrowser: def showDf(df): @@ -112,4 +115,4 @@ def showDf(df): dfHtml = df.to_html() + style f.write(dfHtml) webbrowser.open(__location__ + "/tmpViewFile.html") -showDf(df) \ No newline at end of file +showDf(df)