Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
2108 views

Визуализация данных средствами Sage

# Данные хранятся в файле .txt, который необходимо преобразовать к удобному для чтения виду f1 = open('planets.txt', 'r') f2 = open('planets.csv', 'w') for line in f1 : while ' ' in line : # убираем лишние пробелы line = line.replace(' ', ' ') line = line.replace('"','') # убираем кавычки line = line.replace('?', 'NA') # пропущенные данные лучше заменить на строку 'NA' f2.write(','.join(line.split(' '))) f1.close() f2.close()

Следующий вопрос: нужно ли стандартизировать данные?

Если признаки имеют различные масштабы и/или единицы измерения, то да, нужно.

# Построим массив графиков типа scatter_plot для нестандартизированных данных f = open('planets.csv', 'r') head = f.readline()[:-1].split(',') # заголовок таблицы planets = [head] for line in f : planets.append(line[:-1].split(',')) f.close() ga = [] for i in range(1, len(head)-1) : # len(head), по сути, означает количество столбцов for j in range(i+1, len(head)) : # строим диаграмму рассеяния (scatter plot) для признаков [i], [j] x = [float(row[i]) for row in planets[1:]] y = [float(row[j]) for row in planets[1:]] ga.append(scatter_plot(zip(x, y), axes_labels=[head[i], head[j]])) graphics_array(ga, nrows=2, ncols=3)
# Теперь проделаем то же самое для стандартизированных данных def scale_data(data, start_row=1, start_col=1) : ''' Стандартизация (масштабирование) данных. Аргументы: data - матрица (список списков) исходных данных start_row - строка, с которой начинаются ЧИСЛОВЫЕ данные (по умолчанию: 2-я) start_col - столбец, с которого начинаются ЧИСЛОВЫЕ данные (по умолчанию: 2-й) Результат: матрица (список списков) стандартизированных значений ''' num_data = [] # выделяем только числовые значения из data for i in range(start_row, len(data)) : num_data.append([float(x) for x in data[i][start_col:]]) num_data = matrix(num_data) # для удобства преобразуем в Sage-матрицу # Процедура стандартизации means = [mean(x) for x in num_data.columns()] stds = [std(list(x)) for x in num_data.columns()] for i in range(num_data.nrows()) : for j in range(num_data.ncols()) : num_data[i,j] = (num_data[i,j]-means[j])/stds[j] # Строим матрицу-результат, сохраняя все заголовки data_scaled = data[:start_row] # эта часть матрицы не изменилась for i in range(start_row, len(data)) : new_row = data[i][:start_col] + list(num_data.row(i-start_row)) data_scaled.append(new_row) return data_scaled
# Проверим, что получилось для планет planets_scaled = scale_data(planets) for row in planets_scaled : show(row)
[Name, Distance, Diameter, Period, Mass]
[Mercury, 0.794766516527\displaystyle -0.794766516527, 0.754826546633\displaystyle -0.754826546633, 0.71803204524\displaystyle -0.71803204524, 0.475055000305\displaystyle -0.475055000305]
[Venus, 0.771570371374\displaystyle -0.771570371374, 0.613954355503\displaystyle -0.613954355503, 0.714130146724\displaystyle -0.714130146724, 0.467837334642\displaystyle -0.467837334642]
[Earth, 0.752466789775\displaystyle -0.752466789775, 0.607002619115\displaystyle -0.607002619115, 0.710118838069\displaystyle -0.710118838069, 0.466023371049\displaystyle -0.466023371049]
[Mars, 0.716369042275\displaystyle -0.716369042275, 0.721445962213\displaystyle -0.721445962213, 0.700935521903\displaystyle -0.700935521903, 0.474520358404\displaystyle -0.474520358404]
[Jupiter, 0.462570681765\displaystyle -0.462570681765, 1.8647837206\displaystyle 1.8647837206, 0.596968538067\displaystyle -0.596968538067, 2.55031166807\displaystyle 2.55031166807]
[Saturn, 0.163390173678\displaystyle -0.163390173678, 1.41950509907\displaystyle 1.41950509907, 0.413220157144\displaystyle -0.413220157144, 0.433320683788\displaystyle 0.433320683788]
[Uranus, 0.502115623854\displaystyle 0.502115623854, 0.130218306337\displaystyle 0.130218306337, 0.998384689104\displaystyle 0.998384689104, 0.311359106842\displaystyle -0.311359106842]
[Neptune, 1.25458654003\displaystyle 1.25458654003, 0.0873135368213\displaystyle 0.0873135368213, 0.991962789687\displaystyle 0.991962789687, 0.313268542202\displaystyle -0.313268542202]
[Pluto, 1.90443141151\displaystyle 1.90443141151, 0.804591179369\displaystyle -0.804591179369, 1.86305776836\displaystyle 1.86305776836, 0.475568638417\displaystyle -0.475568638417]
# А теперь изобразим head = planets_scaled[0] ga = [] for i in range(1, len(head)-1) : # len(head), по сути, означает количество столбцов for j in range(i+1, len(head)) : # строим диаграмму рассеяния (scatter plot) для признаков [i], [j] x = [float(row[i]) for row in planets_scaled[1:]] y = [float(row[j]) for row in planets_scaled[1:]] # ga.append(scatter_plot(zip(x, y), axes_labels=[head[i], head[j]])) sp = scatter_plot(zip(x, y)) sp.show(axes_labels=[head[i], head[j]]) # graphics_array(ga, nrows=2, ncols=3)

Используем R

Трёхмерная диаграмма рассеяния

%r planets = read.csv('planets.csv') str(planets) library(scatterplot3d) scatterplot3d(planets$Diameter, planets$Period, planets$Mass)
'data.frame': 9 obs. of 5 variables: $ Name : Factor w/ 9 levels "Earth","Jupiter",..: 4 9 1 3 2 7 8 5 6 $ Distance: int 35950 67180 92900 141500 483200 886000 1782000 2795085 3670000 $ Diameter: int 3100 7700 7927 4190 88640 74100 32000 30599 1475 $ Period : int 2112 5393 8766 16488 103911 258420 1445400 1440000 2172480 $ Mass : num 0.054 0.81 1 0.11 316.94 ...
%r scatterplot3d(scale(planets$Diameter), scale(planets$Period), scale(planets$Mass))

Массив scatter plot'ов

%r pairs(scale(planets[,2:5]), col=as.numeric(planets$Distance))

Пиктограммы-звёзды

%r planets = read.table('planets-1.csv', header=TRUE, sep=",", row.names=1) scaled.planets <- scale(planets) stars(scaled.planets)

Лица Чернова

%r planets = read.table('planets.csv', header=TRUE, sep=",", row.names=1) library(TeachingDemos) faces(planets)
%r library(aplpack) faces(planets)
Loading required package: tcltk Warning message: “no DISPLAY variable so Tk is not available” Attaching package: ‘aplpack’ The following objects are masked from ‘package:TeachingDemos’: faces, slider
effect of variables: modified item Var "height of face " "Distance" "width of face " "Diameter" "structure of face" "Period" "height of mouth " "Mass" "width of mouth " "Distance" "smiling " "Diameter" "height of eyes " "Period" "width of eyes " "Mass" "height of hair " "Distance" "width of hair " "Diameter" "style of hair " "Period" "height of nose " "Mass" "width of nose " "Distance" "width of ear " "Diameter" "height of ear " "Period"
%r faces(planets, face.type=2)
effect of variables: modified item Var "height of face " "Distance" "width of face " "Diameter" "structure of face" "Period" "height of mouth " "Mass" "width of mouth " "Distance" "smiling " "Diameter" "height of eyes " "Period" "width of eyes " "Mass" "height of hair " "Distance" "width of hair " "Diameter" "style of hair " "Period" "height of nose " "Mass" "width of nose " "Distance" "width of ear " "Diameter" "height of ear " "Period"