Python-创建具有相关数值变量的数据集

Python-创建具有相关数值变量的数据集,python,random,Python,Random,我想创建一个数据集,其中我有1到10年的工作经验,工资从3万到10万。我希望这些工资是随机的,并遵循多年的经验。有时,经验丰富的人可能比经验较少的人赚得少 例如: years of experience | Salary 1 | 30050 2 | 28500 3 | 36000 ... 10 | 100,500 以下是我迄今为止所做的工作: impor

我想创建一个数据集,其中我有1到10年的工作经验,工资从3万到10万。我希望这些工资是随机的,并遵循多年的经验。有时,经验丰富的人可能比经验较少的人赚得少

例如:

years of experience | Salary
1                   | 30050
2                   | 28500
3                   | 36000
...
10                  | 100,500
以下是我迄今为止所做的工作:

import numpy as np
import random
import pandas as pd
years = np.linspace(1.0, 10.0, num=10)
salary = np.linspace(30000.0, 100000.0, num=10) + random.uniform(-1,1)*5000#plus/minus 5k
data = pd.DataFrame({'experience' : years, 'salary': salary})
print (data)
这给了我:

   experience         salary
0         1.0   31060.903965
1         2.0   38838.681742
2         3.0   46616.459520
3         4.0   54394.237298
4         5.0   62172.015076
5         6.0   69949.792853
6         7.0   77727.570631
7         8.0   85505.348409
8         9.0   93283.126187
9        10.0  101060.903965
我们可以看到,我们没有得到一些记录,其中一个具有较高经验的人比一个具有较低经验的人赚得少。我怎样才能解决这个问题?当然,我想按比例给我1000行随机的。统一(-1,1)*5000意味着你的工资值将在-5k到+5k之间变化,但由于统一在其输出中是连续的,工资很可能会发生非常小的变化。 看看没有随机因素的工资是如何变化的7777.77。。。经验的每一步提升,都不太可能获得更高经验的低工资。我建议你增加随机元素背后的因子。
例如,尝试
random.uniform(-1,1)*10000
。随机性的程度取决于你自己,这取决于一个没有经验的人获得高薪的可能性有多大。

scikit learn提供了一些有用的函数来生成相关数据,例如

例如,您可以执行以下操作:

import numpy as np
import pandas as pd
from sklearn.datasets import make_regression

np.random.seed(0)
n_samples = 1000

X, y = make_regression(n_samples=n_samples, n_features=1, n_informative=1, 
noise=80, random_state=0)

# Scale X (years of experience) to 0..10 range
X = np.interp(X, (X.min(), X.max()), (0, 10))

# Scale y (salary) to 30000..100000 range
y = np.interp(y, (y.min(), y.max()), (30000, 100000))

# To dataframe
df = pd.DataFrame({'experience': X.flatten(), 'salary': y}
print(df.head(10))
从您描述的情况来看,似乎您希望在响应中添加一些差异。这可以通过调整
noise
参数来实现。让我们把它画出来,让它更明显:

from matplotlib import pyplot as plt

plt.scatter(X, y, color='blue', marker='.', label='Salary')
plt.xlabel("Years of Experience")
plt.ylabel("Salary")
plt.show()
例如,使用
noise=80

或者使用
噪音=250


作为旁注:这会为“多年经验”产生持续的价值。如果您希望将它们四舍五入为整数,可以使用
X=np.rint(X)

在这种情况下,我将更改行:

salary = np.linspace(30000.0, 100000.0, num=10) + random.uniform(-1,1)*5000#plus/minus 5k
我认为最好将随机部分分开,这样您就可以轻松地更改它,并根据您想要达到的值进行所有修改

以下是我做的一些事情:

import numpy as np
import random
import pandas as pd
years = np.linspace(1.0, 10.0, num=10)
random_list = [random.random()*1000*_*5 for _ in range(10)]
print(random_list)
salary = np.linspace(30000.0, 100000.0, num=10)- random_list
data = pd.DataFrame({'experience' : years, 'salary': salary})
print (data)

当薪资增长时,随机成分的方差更大。

您可以将薪资定义为年数乘以某个系数,再加上某个常量值,再加上某个随机值

import numpy as np
import random
import pandas as pd
N = 1000
intercept = 30000
coeff = 7000
years = np.random.uniform(low=1, high=10, size=N)
salary = intercept + years*coeff + np.random.normal(loc=0, scale=10000, size=N)
data = pd.DataFrame({'experience' : years, 'salary': salary})
data.plot.scatter(x='experience', y='salary', alpha=0.3)

您可以将正负5k增加到一个更大的值(可能是15k),并使用random.normal而不是uniform,这样大多数人最终还是会得到更多的钱和更多的经验,但有些人不会。您只需使用random.randint函数即可。我希望它对你有用这不适用于制作相关数据。它给了我30k到100k之间的随机数。例如,在你的例子中,一个有1年工作经验的人可以挣10万英镑,一个有10年工作经验的人可以挣3万英镑。工资一般应该随着经验的增加而增加
import numpy as np
import random
import pandas as pd
years = np.linspace(1.0, 10.0, num=10)
salary = np.random.randint(30000.0, 100000.0, 10)
data = pd.DataFrame({'experience' : years, 'salary': salary})
print (data)